- CodeIgniter 4 framework setup with SQL Server database config - Models: Control, Test, Dept, Result, Daily/ Monthly entry models - Controllers: Dashboard, Control, Test, Dept, Entry, Report, API endpoints - Views: CRUD pages with modal dialogs, dashboard, reports - Database: Migrations for control test and daily/monthly result tables - Legacy v1 PHP application preserved in /v1 directory - Documentation: AGENTS.md, VIEWS_RULES.md for development guidelines
327 lines
8.6 KiB
PHP
327 lines
8.6 KiB
PHP
<?php
|
|
$date = $_POST['qcdate'];
|
|
$testcode = $_POST['testcode'];
|
|
include("config.php");
|
|
#$date = "2016-06";
|
|
#$testcode = "BUN";
|
|
$year = substr($date,0,4);
|
|
$month = substr($date,5,2);
|
|
$monthName1 = date('F', mktime(0, 0, 0, $month, 10));
|
|
$monthName = substr($monthName1,0,3);
|
|
$days = cal_days_in_month(CAL_GREGORIAN, $month, $year);
|
|
|
|
$sql = "select distinct controlcode from DAILY_RUNS
|
|
where TESTCODE = '$testcode' AND convert( varchar(7), RESCTRLDATETIMEASP, 126) = '$date'";
|
|
$stmt = sqlsrv_query( $conn1, $sql );
|
|
if( $stmt == false) { die( print_r( sqlsrv_errors(), true) ); }
|
|
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC) ) {
|
|
$qccode[] = $row[0];
|
|
}
|
|
|
|
foreach($qccode as $ccode) {
|
|
// getting mean,sd on each control
|
|
$sql = "select distinct REFASSAYVALUE, REFSTANDARDDEVIATION
|
|
from DAILY_RUNS
|
|
where TESTCODE = '$testcode' AND CONTROLCODE = '$ccode'
|
|
AND convert( varchar(7), RESCTRLDATETIMEASP, 126) = '$date'";
|
|
$stmt = sqlsrv_query( $conn1, $sql );
|
|
if( $stmt == false) { die( print_r( sqlsrv_errors(), true) ); }
|
|
$row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC );
|
|
$mean[$ccode] = round($row[0],2);
|
|
$sd[$ccode] = round($row[1],2);
|
|
$min[$ccode] = $mean[$ccode] - (3*$sd[$ccode]);
|
|
$max[$ccode] = $mean[$ccode] + (3*$sd[$ccode]);
|
|
|
|
$total = 0;
|
|
$total2 = 0;
|
|
$sql = "select day(RESCTRLDATETIMEASP), RESULTCTRL
|
|
from daily_runs
|
|
where TESTCODE = '$testcode' AND CONTROLCODE = '$ccode'
|
|
AND convert( varchar(7), RESCTRLDATETIMEASP, 126) = '$date'";
|
|
#AND DISPOSITION NOT IN ('3','4') AND VAL_USERID is not NULL
|
|
$stmt = sqlsrv_query( $conn1, $sql );
|
|
if( $stmt == false) { die( print_r( sqlsrv_errors(), true) ); }
|
|
$i=0;
|
|
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC) ) {
|
|
$d = $row[0];
|
|
$value = $row[1];
|
|
$val[$ccode][$d][] = $value;
|
|
$total += $value;
|
|
$total2 += $value*$value;
|
|
$i++;
|
|
}
|
|
$n[$ccode] = $i;
|
|
if($n[$ccode]>1) {
|
|
// meanMVA = total/n
|
|
$meanMVA[$ccode] = round($total/$n[$ccode],3);
|
|
// CV = sqrt ( ( E(x^2) - (total^2 / n) ) / n - 1 )
|
|
$cv[$ccode] = round(sqrt(($total2 - ($total*$total)/$n[$ccode]) / ($n[$ccode] - 1)),3);
|
|
// %CV = CV / (total/n)
|
|
$pcv[$ccode] = round( $cv[$ccode] * 100 / $n[$ccode] ,3);
|
|
} else {
|
|
// meanMVA = total/n
|
|
$meanMVA[$ccode] = 0;
|
|
// CV = sqrt ( ( E(x^2) - (total^2 / n) ) / n - 1 )
|
|
$cv[$ccode] = 0;
|
|
// %CV = CV / (total/n)
|
|
$pcv[$ccode] = 0;
|
|
}
|
|
}
|
|
?>
|
|
<script src="plotly-latest.min.js"></script>
|
|
<style>
|
|
#container {width:1100px; margin:0 auto;}
|
|
#header {text-align:center;}
|
|
#col1 {float:left;margin:20px 40px 0 0;width:300px}
|
|
#col2 {float:left;0 width:350px}
|
|
#col3 {float:right;margin : 25px 190px 0 0;width:350px}
|
|
table { border-collapse: collapse; }
|
|
th,td { padding-left: 15px; padding-right: 15px }
|
|
#graph_C7 { text-align:center; }
|
|
#html{font-size:20px;}
|
|
</style>
|
|
<div id='container'>
|
|
<div id='header'>
|
|
<b>Laporan QC - Lab RS Sumber Waras</b> <br/>
|
|
<b>TMS 24i PREMIUM </b> <br/>
|
|
<?php foreach ($qccode as $ccode) { echo "<div id='graph_$ccode' style='width:1000px;float:left;'></div> "; }?>
|
|
</div>
|
|
|
|
<div id='col1'>
|
|
<b>Periode : </b> <?php echo "$monthName1 $year";?> <br/>
|
|
<b>Test : </b> <?php echo "$testcode ";?> <br/>
|
|
<table border='1'>
|
|
<tr> <th>QC Code</th> <?php foreach($qccode as $ccode) echo "<th>$ccode</th>"; ?> </tr>
|
|
<tr> <td>Mean</td> <?php foreach($mean as $mean1) echo "<td>$mean1</td>"; ?> </tr>
|
|
<tr> <td>1SD</td> <?php foreach($sd as $sd1)echo "<td>$sd1</td>"; ?> </tr>
|
|
<tr> <td>Range</td> <?php foreach($qccode as $ccode) echo "<td>$min[$ccode] - $max[$ccode]</td>"; ?> </tr>
|
|
<tr> <td></td> </tr>
|
|
<tr> <td>Mean MVA</td> <?php foreach($qccode as $ccode) echo "<td>".$meanMVA[$ccode]."</td>"; ?> </tr>
|
|
<tr> <td>SD</td> <?php foreach($qccode as $ccode) echo "<td>".$cv[$ccode]."</td>"; ?> </tr>
|
|
<tr> <td>%CV</td> <?php foreach($qccode as $ccode) echo "<td>".$pcv[$ccode]."</td>"; ?> </tr>
|
|
</table>
|
|
</div>
|
|
<div id='col2'>
|
|
<table border='1'>
|
|
<tr> <th>No</th> <th>Datetime</th> <?php foreach($qccode as $ccode) echo "<th>$ccode</th>"; ?> </tr>
|
|
<?php
|
|
// getting value count per day
|
|
for($i=1;$i<=$days;$i++) {
|
|
foreach($qccode as $ccode) {
|
|
if(isset($val[$ccode][$i])) { $cnt[$i][$ccode] = count($val[$ccode][$i]); }
|
|
else { $cnt[$i][$ccode] = 1; }
|
|
}
|
|
$count[$i] = max($cnt[$i]);
|
|
}
|
|
|
|
//show the value on table
|
|
$k = 1;
|
|
for($i=1;$i<=16;$i++) { // 1-16
|
|
for($j=0;$j<$count[$i];$j++) { // value per day
|
|
echo "<tr> <td>$k</td> <td>$i - $monthName</td>";
|
|
foreach($qccode as $ccode){
|
|
if(isset($val[$ccode][$i][$j])) echo "<td>".$val[$ccode][$i][$j]."</td>";
|
|
else echo "<td></td>";
|
|
}
|
|
$k++;
|
|
echo "</tr>";
|
|
}
|
|
}
|
|
?>
|
|
</table>
|
|
</div>
|
|
<div id='col3'>
|
|
<table border='1'>
|
|
<?php
|
|
for($i=17;$i<=$days;$i++) { // 17-end
|
|
for($j=0;$j<$count[$i];$j++) { // value per day
|
|
echo "<tr> <td>$k</td> <td>$i - $monthName</td>";
|
|
foreach($qccode as $ccode){
|
|
if(isset($val[$ccode][$i][$j])) echo "<td>".$val[$ccode][$i][$j]."</td>";
|
|
else echo "<td></td>";
|
|
}
|
|
$k++;
|
|
echo "</tr>";
|
|
}
|
|
}
|
|
?>
|
|
</table>
|
|
</div>
|
|
|
|
</div>
|
|
<script>
|
|
<?php
|
|
foreach ($qccode as $ccode) {
|
|
echo "var val_$ccode = {
|
|
connectgaps: false,mode: 'lines+markers',
|
|
line: { color: 'rgb(0, 0, 0)', width: 1 },
|
|
x:[";
|
|
// x days
|
|
for($i=1;$i<=$days;$i++) { echo $i,","; }
|
|
echo "],
|
|
";
|
|
|
|
//y values
|
|
echo "y:[";
|
|
for($i=1;$i<=$days;$i++) {
|
|
if(isset($val[$ccode][$i])) { $count = count($val[$ccode][$i]); }
|
|
else { $count = 1; }
|
|
for($j=0;$j<$count;$j++) {
|
|
if(isset($val[$ccode][$i][$j])) {
|
|
if($j==($count-1)) {// separate multi value
|
|
echo $val[$ccode][$i][$j].",";
|
|
$val1[$ccode][$i] = $val[$ccode][$i][$j];
|
|
} else {
|
|
$mulx[$ccode][] = $i;
|
|
$muly[$ccode][] = $val[$ccode][$i][$j];
|
|
}
|
|
} else {
|
|
echo "null,";
|
|
}
|
|
}
|
|
}
|
|
echo "]};
|
|
";
|
|
|
|
//scatter for multi val on one y axis
|
|
if(isset($mulx[$ccode])) {
|
|
echo "var mul_$ccode = {
|
|
mode: 'markers', type: 'scatter',
|
|
line: { color: 'rgb(0, 0, 0)', width: 1 },
|
|
x:[";
|
|
foreach ($mulx[$ccode] as $mulx1) { echo $mulx1,","; }
|
|
echo "],
|
|
";
|
|
|
|
//y values
|
|
echo "y:[";
|
|
foreach ($muly[$ccode] as $muly1) { echo $muly1,","; }
|
|
echo "]};
|
|
";
|
|
}
|
|
//mean and sd
|
|
echo "var layout_$ccode = {
|
|
title: '$ccode',
|
|
showlegend : false,
|
|
shapes: [";
|
|
//mean
|
|
echo" {
|
|
type: 'line', x0: 0, x1: 32,
|
|
y0: $mean[$ccode], y1:$mean[$ccode],
|
|
line: { color: 'rgb(0, 0, 0)', width: 2 }
|
|
},";
|
|
//1sd
|
|
$p1sd = $mean[$ccode]+$sd[$ccode];
|
|
$p2sd = $mean[$ccode]+(2*$sd[$ccode]);
|
|
$p3sd = $mean[$ccode]+(3*$sd[$ccode]);
|
|
$p4sd = $mean[$ccode]+(4*$sd[$ccode]);
|
|
$m1sd = $mean[$ccode]-$sd[$ccode];
|
|
$m2sd = $mean[$ccode]-(2*$sd[$ccode]);
|
|
$m3sd = $mean[$ccode]-(3*$sd[$ccode]);
|
|
$m4sd = $mean[$ccode]-(4*$sd[$ccode]);
|
|
echo" {
|
|
type: 'line', x0: 0, x1: 32,
|
|
y0:$p1sd, y1:$p1sd,
|
|
line: { color: 'rgb(0,255,0)', width: 2 }
|
|
},{
|
|
type: 'line', x0: 0, x1: 32,
|
|
y0:$m1sd, y1:$m1sd,
|
|
line: { color: 'rgb(0,255,0)', width: 2 }
|
|
},";
|
|
//2sd
|
|
echo" {
|
|
type: 'line', x0: 0, x1: 32,
|
|
y0:$p2sd, y1:$p2sd,
|
|
line: { color: 'rgb(255, 255, 0)', width: 2 }
|
|
},{
|
|
type: 'line', x0: 0, x1: 32,
|
|
y0:$m2sd, y1:$m2sd,
|
|
line: { color: 'rgb(255, 255, 0)', width: 2 }
|
|
},";
|
|
//3sd
|
|
echo" {
|
|
type: 'line', x0: 0, x1: 32,
|
|
y0:$p3sd, y1:$p3sd,
|
|
line: { color: 'rgb(255, 0, 0)', width: 2 }
|
|
},{
|
|
type: 'line', x0: 0, x1: 32,
|
|
y0:$m3sd, y1:$m3sd,
|
|
line: { color: 'rgb(255, 0, 0)', width: 2 }
|
|
},";
|
|
|
|
//jumping value LOL
|
|
//2,5,9 - 3,5,6
|
|
//2,5 - 3,5 ; 5,9 - 5,6
|
|
/*
|
|
foreach($val1[$ccode] as $i => $value) {
|
|
|
|
}
|
|
|
|
//single jump
|
|
if(isset($nullx[$ccode])) {
|
|
foreach($nullx[$ccode] as $null) {
|
|
if($null != 1) {
|
|
$y0 = $val1[$ccode][$null-1];
|
|
$y1 = $val1[$ccode][$null+1];
|
|
echo "{
|
|
type: 'line', x0: $null-1, x1: $null+1,
|
|
y0:$y0, y1:$y1,
|
|
line: { color: 'rgb( 0, 0, 0)', dash:'dot' }
|
|
},";
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
$n = 0;
|
|
$i = 1;
|
|
while( $i <= $days) {
|
|
if(!isset($val1[$ccode][$i])) {
|
|
if(isset($val1[$ccode][$i-1])){
|
|
$x0 = $i-1;
|
|
$y0 = $val1[$ccode][$i-1];
|
|
$n=1;
|
|
}
|
|
} else {
|
|
if($n==1) {
|
|
$x1 = $i;
|
|
$y1 = $val1[$ccode][$i];
|
|
echo "{
|
|
type: 'line', x0: $x0, x1: $x1,
|
|
y0:$y0, y1:$y1,
|
|
line: { color: 'rgb( 0, 0, 0)', dash:'dot' }
|
|
},";
|
|
$n=0;
|
|
}
|
|
}
|
|
$i++;
|
|
}
|
|
echo "]
|
|
};
|
|
";
|
|
|
|
echo "
|
|
var txt_$ccode = {
|
|
x: [ 33, 33, 33, 33, 33, 33, 33],
|
|
y: [ $p3sd, $p2sd, $p1sd, $mean[$ccode], $m1sd, $m2sd, $m3sd],
|
|
text: [ '+3SD', '+2SD', '+1SD', 'mean', '-1SD', '-2SD', '-3SD' ],
|
|
mode: 'text'
|
|
}
|
|
";
|
|
if(isset($mulx[$ccode])) {
|
|
echo "
|
|
var data_$ccode = [val_$ccode, txt_$ccode, mul_$ccode];
|
|
";
|
|
}else {
|
|
echo "
|
|
var data_$ccode = [val_$ccode, txt_$ccode];
|
|
";
|
|
}
|
|
|
|
|
|
//end of layout
|
|
echo "
|
|
Plotly.newPlot('graph_$ccode', data_$ccode, layout_$ccode);";
|
|
}
|
|
?>
|
|
</script>
|