tinyqc/v1/inc/qc.php
mahdahar ff90e0eb29 Initial commit: Add CodeIgniter 4 QC application with full MVC structure
- 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
2026-01-14 16:49:27 +07:00

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>