gdc_cmod/public/spooler_db/covidPCRnAG.php
mahdahar 31acb6bf33 feat: Implement comprehensive report generation system with role-based access control
Add native CodeIgniter 4 report generation functionality replacing legacy spooler_db system.
Provides centralized report generation with audit logging and multi-language support.

New Features:
- Report generation with Indonesian and English language support
- Role-based access control (Lab, Admin, Superuser: generate; CS: print only)
- Preview mode for validation workflow
- Print audit logging to AUDIT_REQUESTS table
- Multi-page report support with proper pagination
- Dual unit system (Conventional and International units)

Controllers:
- ReportController: Main controller for report generation, preview, and print
  - generate(): Full report with audit logging
  - preview(): Preview mode without audit logging
  - print(): Print-only access for CS role
- Home::printReport(): Route handler redirecting based on user role

Libraries:
- ReportHelper: Comprehensive report data retrieval
  - Patient information (name, MR number, demographics, referral)
  - Test results with reference ranges and unit conversions
  - Collection and reception data with timestamps
  - Validation status and validator information
  - Special handling for pending samples and Chinese translations

Routes:
- /report/(:num) - Generate report (Lab, Admin, Superuser)
- /report/(:num)/preview - Preview without audit logging
- /report/(:num)/eng - English language report
- /report/print/(:num) - Print-only access (CS role)
- /print/(:num) - Redirect based on role (all roles)

Views:
- report/template.php: Professional lab report template with Gleneagles branding
  - Header and footer images
  - Patient information table
  - Test results with dual unit columns
  - Collection and reception timestamps
  - Authorization signature area
  - Preview watermark

Role Index Views:
- Removed dialog_preview.php inclusion from all role dashboards
- Consolidated print button directly linking to new report routes

Assets:
- Report-specific CSS files (normalize.min.css, style.css, pdf.css, style_qr.css)
- Gleneagles header and footer images
- Legacy spooler_db files preserved in public/spooler_db/ for reference

Tests:
- ReportTest.php: Unit tests for report generation functionality

Database:
- Uses existing tables: REQUESTS, TESTS, DICT_TESTS, SP_REQUESTS, PATIENTS
- Inserts print audit records into AUDIT_REQUESTS table

Security:
- Parameterized queries throughout (SQL injection prevention)
- Role-based access control enforced at route level
- Proper output escaping with esc() in views
2026-02-02 16:54:22 +07:00

151 lines
4.6 KiB
PHP

<?php
if(isset($_GET['preview'])) { $preview = $_GET['preview']; } else { $preview=0; }
if(isset($_GET['eng'])) { $eng = $_GET['eng']; $lang='eng'; } else { $eng = 0; $lang = 'ind'; }
if(isset($_GET['acc'])) {
$ACCESSNUMBER = $_GET['acc'];
} else {
$file = $argv[1];
$x = explode('\\',$file);
$x = $x[1];
$x = explode('_',$x);
$ACCESSNUMBER = $x[0];
$lang = $x[1];
if($lang=='eng') {$eng=1;}
}
include("config.php");
include("_function.php");
$raw = "<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />";
$pdf = $raw + "<link rel='stylesheet' href='http://glenlis/spooler_db/normalize.min.css' />
<link rel='stylesheet' href='http://glenlis/spooler_db/pdf.css' />";
$raw.= "<link rel='stylesheet' href='/spooler_db/normalize.min.css' /> <link rel='stylesheet' href='/spooler_db/style.css' />"; }
$raw .= "</head>
<body style='-webkit-print-color-adjust:exact;'>";
$pdf .= "</head>
<body style='-webkit-print-color-adjust:exact;'>";
$HOSTNUMBER = getHost($conn, $ACCESSNUMBER);
$result = getResult($conn, $ACCESSNUMBER,$eng);
$info = getData2($conn,$ACCESSNUMBER);
$notes = getNotes($conn, $ACCESSNUMBER);
$collData = getCollData($conn, $ACCESSNUMBER);
$recvData = getRecvData($conn, $ACCESSNUMBER);
$noSample = getNoSample($conn,$ACCESSNUMBER);
if( $noSample == '' ) {
$status = getStatus($conn, $ACCESSNUMBER);
} else {
$status = "PENDING";
}
$valBy = getValBy($conn, $ACCESSNUMBER);
if(!isset($_GET['date'])) { $date = date('d-m-Y H:i'); }
else { $date = $_GET['date']; }
$npage = count($result);
$i=1;
foreach($result as $page) {
$raw .= "<div id='page'>
<div id=pagetop style='height:0.01cm'> </div>";
$pdf .= "<div id='page'>
<div id=pagetop style='height:0.01cm'> </div>
<img src='http://glenlis/spooler_db/gleneagleshdr.png' class='img'/>";
if($preview==1) { $raw.= "<div style='font-size:30px'>preview only do not print</div>" ; }
$raw .= "<div id='dinfo'>
$info
</div>
<div id='dresult'>
<table class='result'>
<colgroup>
<col style='width:26%;'></col>
<col style='width:10%;'></col>
<col style='width:15%;'></col>
<col style='width:12%;'></col>
<col style='width:10%;'></col>
<col style='width:15%;'></col>
<col style='width:12%;'></col>
</colgroup>
<tr> <th rowspan='2' style='border-right:solid 1px black; border-bottom:solid 1px black;'>TEST</th>
<th colspan='3' style='border-right:solid 1px black;'>CONVENTIONAL</th> <th colspan='3'>INTERNATIONAL</th> </tr>
<tr style='border-bottom:solid 1px black;'> <th>RESULT</th> <th>REF. RANGES</th> <th style='border-right:solid 1px black;'>UNIT</th> <th>RESULT</th> <th>REF. RANGES</th> <th>UNIT</th> </tr>
$page
";
$pdf .= "<div id='dinfo'>
$info
</div>
<div id='dresult'>
<table class='result'>
<colgroup>
<col style='width:26%;'></col>
<col style='width:10%;'></col>
<col style='width:15%;'></col>
<col style='width:12%;'></col>
<col style='width:10%;'></col>
<col style='width:15%;'></col>
<col style='width:12%;'></col>
</colgroup>
<tr> <th rowspan='2' style='border-right:solid 1px black; border-bottom:solid 1px black;'>TEST</th>
<th colspan='3' style='border-right:solid 1px black;'>CONVENTIONAL</th> <th colspan='3'>INTERNATIONAL</th> </tr>
<tr style='border-bottom:solid 1px black;'> <th>RESULT</th> <th>REF. RANGES</th> <th style='border-right:solid 1px black;'>UNIT</th> <th>RESULT</th> <th>REF. RANGES</th> <th>UNIT</th> </tr>
$page
";
// lastpage show note
if($i != $npage) {
$raw.="</table>";
$pdf.="</table>";
} else {
$raw .= "$noSample</table>
<table> <tr><td>Note :</td> <td><pre>$notes</pre></td></tr>
</table>";
$pdf .= "$noSample</table>
<table> <tr><td>Note :</td> <td><pre>$notes</pre></td></tr>
</table>";
}
$raw .= "</div>";
$raw .= "<div id='footer'>
<table class='footer'>
<tr> <td>";
if($i == $npage) { $raw .= "Status : $status"; }
$raw .= "<pre class='small'>Collected on $collData
Received on $recvData</pre>
Page $i/$npage Printed By : $valBy $date </td>";
if($pdf!=1) {
$raw .="
<td class='right'><pre>
(__________________)
Authorised Signature
</pre></td>";
} else {
$raw.="<td class='right'><pre><b>&rdquo;This result is valid without signature.&rdquo;</b></pre></td>";
}
$raw .="
</tr>
</table>
</div>
";
if($pdf==1) { $raw .="<img src='http://glenlis/spooler_db/gleneaglesftr.png' class='img'/>"; }
$raw .= "</div>";
$i+=1;
}
$raw .="</body>";
echo $raw;
if($pdf == 1) {
$file = fopen("process_pdf/$HOSTNUMBER.html","w");
fwrite($file, $raw);
fclose($file);
}
if(isset($_GET['print'])) {
$file = fopen("process_oru/$ACCESSNUMBER.oru","w+");
$date = date('Y-m-d H:i');
fwrite($file, "$ACCESSNUMBER\r\n$HOSTNUMBER\r\n$date\r\n$status\r\n$lang");
fclose($file);
}
?>