feat: Extend report access to CS role and refactor report generation

This commit expands report generation capabilities to Customer Service (CS) role
and refactors the report system for better maintainability and PDF support.

Changes Summary:

Access Control:
- Extended report access from Lab, Admin, Superuser to include CS role (filter: 0,1,2,4)
- Removed separate CS-only print routes, consolidated into unified report routes
- Routes now support /report/:num, /report/:num/eng, /report/:num/print, /report/:num/print/eng

Controller Refactoring (ReportController):
- Refactored generate() and print() methods to share common renderReport() logic
- Removed separate preview() method - preview now handled via preview parameter
- Added ispdf parameter support for PDF generation mode
- Print functionality now logs audit events to AUDIT_REQUESTS table

Database Queries (ReportHelper):
- Improved SQL queries with explicit aliases for better readability and maintainability
- Fixed date formatting issue: changed date_format() to date() with strtotime()
- Added getValData() method to retrieve validation user information (VAL1USER, VAL2USER)
- Added null coalescing operators (?? '') for safer array access

View Updates (report/template.php):
- Conditional CSS loading: uses pdf.css when ispdf=1, otherwise style.css
- Removed "PREVIEW ONLY - DO NOT PRINT" watermark
- Conditional header/footer images - only display when generating PDF
- Added validation user display: "Val1 By : {user} | Val2 By : {user}"
- Replaced signature placeholder with "This result is valid without signature" statement
- Improved footer layout spacing

Styling Adjustments (public/assets/report/style.css):
- Adjusted margins for better print layout: dinfo (2cm), dresult (17.5cm), footer (2cm)
- Increased footer width from 17cm to 18cm
- Added responsive image classes: .img and .img-footer with max-width: 100%
- Set footer image max-height to 2.5cm

Security:
- Maintained role-based access control with proper authentication checks
- All database queries use parameterized statements (no interpolation)
- Print actions still logged to AUDIT_REQUESTS for audit trail
This commit is contained in:
mahdahar 2026-02-03 07:26:41 +07:00
parent 31acb6bf33
commit 848d8d663f
5 changed files with 146 additions and 122 deletions

View File

@ -92,18 +92,12 @@ $routes->group('cs', ['filter' => 'role:4'], function ($routes) {
$routes->get('/dummypage', 'Home::dummyPage'); $routes->get('/dummypage', 'Home::dummyPage');
// Report generation - Lab, Admin, Superuser // Report generation - Lab, Admin, Superuser, CS
$routes->group('report', ['filter' => 'role:0,1,2'], function ($routes) { $routes->group('report', ['filter' => 'role:0,1,2,4'], function ($routes) {
$routes->get('(:num)', 'ReportController::generate/$1'); $routes->get('(:num)', 'ReportController::generate/$1');
$routes->get('(:num)/preview', 'ReportController::preview/$1');
$routes->get('(:num)/eng', 'ReportController::generate/$1/1'); $routes->get('(:num)/eng', 'ReportController::generate/$1/1');
$routes->get('(:num)/preview/eng', 'ReportController::preview/$1/1'); $routes->get('(:num)/print', 'ReportController::print/$1');
}); $routes->get('(:num)/print/eng', 'ReportController::print/$1/1');
// Print access for CS role only
$routes->group('report/print', ['filter' => 'role:4'], function ($routes) {
$routes->get('(:num)', 'ReportController::print/$1');
$routes->get('(:num)/eng', 'ReportController::print/$1/1');
}); });
// Keep backward compatibility - updated filter // Keep backward compatibility - updated filter

View File

@ -15,7 +15,25 @@ class ReportController extends BaseController
helper(['url', 'text']); helper(['url', 'text']);
} }
public function generate($accessnumber, $eng = 0, $preview = 0) public function generate($accessnumber, $eng = 0, $ispdf = 0)
{
if ($ispdf == 0) {
$ispdf = $this->request->getVar('ispdf') ?? 0;
}
return $this->renderReport($accessnumber, $eng, $ispdf, false);
}
public function print($accessnumber, $eng = 0, $ispdf = 0)
{
if ($ispdf == 0) {
$ispdf = $this->request->getVar('ispdf') ?? 0;
}
return $this->renderReport($accessnumber, $eng, $ispdf, true);
}
private function renderReport($accessnumber, $eng, $ispdf, $shouldLog)
{ {
$userroleid = session()->get('userroleid'); $userroleid = session()->get('userroleid');
if (!in_array($userroleid, [0, 1, 2, 4])) { if (!in_array($userroleid, [0, 1, 2, 4])) {
@ -23,31 +41,17 @@ class ReportController extends BaseController
} }
$data = $this->reportHelper->getReportData($accessnumber, $eng); $data = $this->reportHelper->getReportData($accessnumber, $eng);
$data['preview'] = $preview;
$data['eng'] = $eng; $data['eng'] = $eng;
$data['accessnumber'] = $accessnumber; $data['accessnumber'] = $accessnumber;
$data['ispdf'] = $ispdf;
if ($preview == 0) { if ($shouldLog == true) {
$this->logPrintAudit($accessnumber, $data['status']); $this->logPrintAudit($accessnumber, $data['status']);
} }
return view('report/template', $data); return view('report/template', $data);
} }
public function preview($accessnumber, $eng = 0)
{
return $this->generate($accessnumber, $eng, 1);
}
public function print($accessnumber, $eng = 0)
{
$userroleid = session()->get('userroleid');
if ($userroleid != 4) {
return $this->response->setStatusCode(403)->setJSON(['message' => 'Unauthorized']);
}
return $this->generate($accessnumber, $eng, 0);
}
private function logPrintAudit($accessnumber, $status) private function logPrintAudit($accessnumber, $status)
{ {
$sql = "INSERT INTO GDC_CMOD.dbo.AUDIT_REQUESTS(ACCESSNUMBER, STEPDATE, STEPTYPE, STEPSTATUS) $sql = "INSERT INTO GDC_CMOD.dbo.AUDIT_REQUESTS(ACCESSNUMBER, STEPDATE, STEPTYPE, STEPSTATUS)

View File

@ -31,7 +31,7 @@ class ReportHelper
} }
$valBy = $this->getValBy($accessnumber); $valBy = $this->getValBy($accessnumber);
$valData = $this->getValData($accessnumber);
return [ return [
'hostnumber' => $hostnumber, 'hostnumber' => $hostnumber,
'result' => $result, 'result' => $result,
@ -43,6 +43,8 @@ class ReportHelper
'noSample' => $noSample, 'noSample' => $noSample,
'status' => $status, 'status' => $status,
'valBy' => $valBy, 'valBy' => $valBy,
'val1User' => $valData['VAL1USER'] ?? '',
'val2User' => $valData['VAL2USER'] ?? '',
'date' => date('d-m-Y H:i') 'date' => date('d-m-Y H:i')
]; ];
} }
@ -70,22 +72,30 @@ class ReportHelper
private function getData2(string $accessnumber): string private function getData2(string $accessnumber): string
{ {
$sql = "SELECT R.EXTERNALORDERNUMBER, FORMAT(SR.COLLECTIONDATE,'dd-MM-yyyy'), P.NAME, RIGHT(P.PATNUMBER,16), $sql = "SELECT R.EXTERNALORDERNUMBER AS EXTERNALORDERNUMBER,
dmg.DMG_CADDRESS, P.TELEPHON, P.EMAIL, FORMAT(SR.COLLECTIONDATE,'dd-MM-yyyy') AS REQDATE,
P.NAME AS NAME,
RIGHT(P.PATNUMBER,16) AS PATNUM,
dmg.DMG_CADDRESS AS DMG_CADDRESS,
P.TELEPHON AS TELEPHON,
P.EMAIL AS EMAIL,
CASE CASE
WHEN P.SEX=1 THEN 'Male' WHEN P.SEX=1 THEN 'Male'
WHEN P.SEX=2 THEN 'Female' WHEN P.SEX=2 THEN 'Female'
ELSE 'Unknown' ELSE 'Unknown'
END, END AS SEX,
CASE WHEN FORMAT(P.BIRTHDATE,'MMdd')=FORMAT(R.COLLECTIONDATE,'MMdd') CASE WHEN FORMAT(P.BIRTHDATE,'MMdd')=FORMAT(R.COLLECTIONDATE,'MMdd')
THEN DATEDIFF(YEAR,P.BIRTHDATE, R.COLLECTIONDATE) THEN DATEDIFF(YEAR,P.BIRTHDATE, R.COLLECTIONDATE)
ELSE FLOOR(DATEDIFF(DAY, P.BIRTHDATE, R.COLLECTIONDATE) / 365.25) ELSE FLOOR(DATEDIFF(DAY, P.BIRTHDATE, R.COLLECTIONDATE) / 365.25)
END, END AS AGE,
CASE WHEN DATEPART(day,R.COLLECTIONDATE) >= DATEPART(day,P.BIRTHDATE) CASE WHEN DATEPART(day,R.COLLECTIONDATE) >= DATEPART(day,P.BIRTHDATE)
THEN DATEDIFF(MONTH,P.BIRTHDATE, R.COLLECTIONDATE)%12 THEN DATEDIFF(MONTH,P.BIRTHDATE, R.COLLECTIONDATE)%12
ELSE DATEDIFF(MONTH, P.BIRTHDATE, DATEADD(MONTH,-1,R.COLLECTIONDATE))%12 ELSE DATEDIFF(MONTH, P.BIRTHDATE, DATEADD(MONTH,-1,R.COLLECTIONDATE))%12
END, END AS AGEMONTHS,
RO.COMMENTTEXT, dmg.DMG_CCITY, P.BIRTHDATE, T.SHORTTEXT RO.COMMENTTEXT AS COMMENTTEXT,
dmg.DMG_CCITY AS DMG_CCITY,
P.BIRTHDATE AS BIRTHDATE,
T.SHORTTEXT AS SHORTTEXT
FROM REQUESTS R FROM REQUESTS R
LEFT JOIN SP_REQUESTS SR ON SR.SP_ACCESSNUMBER=R.ACCESSNUMBER LEFT JOIN SP_REQUESTS SR ON SR.SP_ACCESSNUMBER=R.ACCESSNUMBER
LEFT JOIN PATIENTS P ON P.PATID=R.PATID LEFT JOIN PATIENTS P ON P.PATID=R.PATID
@ -97,20 +107,20 @@ class ReportHelper
$row = $this->db->query($sql, [$accessnumber])->getRowArray(); $row = $this->db->query($sql, [$accessnumber])->getRowArray();
$regno = $row['EXTERNALORDERNUMBER'] ?? ''; $regno = $row['EXTERNALORDERNUMBER'] ?? '';
$reqdate = isset($row[1]) ? $row[1] : ''; $reqdate = $row['REQDATE'] ?? '';
$pname = $row['NAME'] ?? ''; $pname = $row['NAME'] ?? '';
$pnum = $row[2] ?? ''; $pnum = $row['PATNUM'] ?? '';
$paddress = $row['DMG_CADDRESS'] ?? ''; $paddress = $row['DMG_CADDRESS'] ?? '';
$pphone = $row['TELEPHON'] ?? ''; $pphone = $row['TELEPHON'] ?? '';
$pemail = $row['EMAIL'] ?? ''; $pemail = $row['EMAIL'] ?? '';
$psex = $row[3] ?? ''; $psex = $row['SEX'] ?? '';
$pAge = $row[4] ?? ''; $pAge = $row['AGE'] ?? '';
$pAgeM = $row[5] ?? ''; $pAgeM = $row['AGEMONTHS'] ?? '';
$rcomment = $row['COMMENTTEXT'] ?? ''; $rcomment = $row['COMMENTTEXT'] ?? '';
$pcity = $row['DMG_CCITY'] ?? ''; $pcity = $row['DMG_CCITY'] ?? '';
$pdob = ''; $pdob = '';
if (isset($row['BIRTHDATE']) && $row['BIRTHDATE'] != null) { if (isset($row['BIRTHDATE']) && $row['BIRTHDATE'] != null) {
$pdob = date_format($row['BIRTHDATE'], 'd-m-Y'); $pdob = date('d-m-Y', strtotime($row['BIRTHDATE']));
} }
$title = $row['SHORTTEXT'] ?? ''; $title = $row['SHORTTEXT'] ?? '';
if ($title != '') { if ($title != '') {
@ -202,7 +212,9 @@ class ReportHelper
$_italic = ["UTRI","ITALIC","PLSFC", "PLSOV", "PLSML", "PLSVI"]; $_italic = ["UTRI","ITALIC","PLSFC", "PLSOV", "PLSML", "PLSVI"];
$sql = "SELECT DC.FULLTEXT, DT.TESTCODE, T.VALIDATIONSTATUS, $sql = "SELECT DC.FULLTEXT AS CHAPTER,
DT.TESTCODE AS TESTCODE,
T.VALIDATIONSTATUS AS VALIDATIONSTATUS,
RESULT = CASE RESULT = CASE
WHEN T.RESTYPE=0 THEN 'Pending' WHEN T.RESTYPE=0 THEN 'Pending'
WHEN T.RESTYPE=4 AND T.RESVALUE='' AND T.RESSTATUS=1 THEN '.' WHEN T.RESTYPE=4 AND T.RESVALUE='' AND T.RESSTATUS=1 THEN '.'
@ -217,13 +229,22 @@ class ReportHelper
END END
ELSE T.RESVALUE ELSE T.RESVALUE
END, END,
T.MINIMUM, T.MAXIMUM, T.MINIMUM AS MINIMUM,
DT.FULLTEXT, T.MAXIMUM AS MAXIMUM,
DT.RESPRECISION, DT.RESPRECISION2, DT.OPERAND, DT.SOFTCONVERSION, DT.UNITS, DT.UNITS2, T.RESTYPE, VI.FULLTEXT, DT.FULLTEXT AS FULLTEXT,
DT.RESPRECISION AS PRECISION1,
DT.RESPRECISION2 AS PRECISION2,
DT.OPERAND AS OPERAND,
DT.SOFTCONVERSION AS SOFTCONVERSION,
DT.UNITS AS U1,
DT.UNITS2 AS U2,
T.RESTYPE AS RESTYPE,
VI.FULLTEXT AS I,
CASE CASE
WHEN TC.COMMENTTEXT IS NULL THEN DX2.FULLTEXT WHEN TC.COMMENTTEXT IS NULL THEN DX2.FULLTEXT
ELSE TC.COMMENTTEXT ELSE TC.COMMENTTEXT
END, T.RERUN END AS RESCOM,
T.RERUN AS RERUN
FROM TESTS T FROM TESTS T
JOIN DICT_TESTS DT ON DT.TESTID=T.TESTID JOIN DICT_TESTS DT ON DT.TESTID=T.TESTID
LEFT JOIN DICT_TEXTS DX ON DX.TEXTID=T.CODEDRESULTID LEFT JOIN DICT_TEXTS DX ON DX.TEXTID=T.CODEDRESULTID
@ -248,25 +269,25 @@ class ReportHelper
$RERUN = 1; $RERUN = 1;
foreach ($rows as $row) { foreach ($rows as $row) {
$CHAPTER = $row[0]; $CHAPTER = $row['CHAPTER'];
$TESTCODE = $row[1]; $TESTCODE = $row['TESTCODE'];
$VALIDATIONSTATUS = $row[2]; $VALIDATIONSTATUS = $row['VALIDATIONSTATUS'];
$R1 = $row[3]; $R1 = $row['RESULT'];
if ($R1 == '****') { if ($R1 == '****') {
$R1 = '-'; $R1 = '-';
} }
$L1 = $row[4]; $L1 = $row['MINIMUM'];
$H1 = $row[5]; $H1 = $row['MAXIMUM'];
$FULLTEXT = $row[6]; $FULLTEXT = $row['FULLTEXT'];
$PRECISION1 = $row[7]; $PRECISION1 = $row['PRECISION1'];
$PRECISION2 = $row[8]; $PRECISION2 = $row['PRECISION2'];
$OPERAND = $row[9]; $OPERAND = $row['OPERAND'];
$SOFTCONVERSION = $row[10]; $SOFTCONVERSION = $row['SOFTCONVERSION'];
$U1 = $row[11]; $U1 = $row['U1'];
$U2 = $row[12]; $U2 = $row['U2'];
$RESTYPE = $row[13]; $RESTYPE = $row['RESTYPE'];
$I = $row[14]; $I = $row['I'];
$RESCOM = $row[15]; $RESCOM = $row['RESCOM'];
if ($eng == 1) { if ($eng == 1) {
$ICHAPTER = substr($CHAPTER, strpos($CHAPTER, '#E') + 2, strrpos($CHAPTER, '#E') - strpos($CHAPTER, '#E') - 2); $ICHAPTER = substr($CHAPTER, strpos($CHAPTER, '#E') + 2, strrpos($CHAPTER, '#E') - strpos($CHAPTER, '#E') - 2);
@ -299,7 +320,7 @@ class ReportHelper
$raw[$i] .= $ITEXT; $raw[$i] .= $ITEXT;
} }
$RERUN = $row[16]; $RERUN = $row['RERUN'];
} else { } else {
if (substr($R1, 0, 2) == '< ' && is_numeric(substr($R1, 2, strlen($R1)))) { if (substr($R1, 0, 2) == '< ' && is_numeric(substr($R1, 2, strlen($R1)))) {
$r1 = substr($R1, 2, strlen($R1)); $r1 = substr($R1, 2, strlen($R1));
@ -512,13 +533,13 @@ class ReportHelper
if ($posR1 != $posR12) { if ($posR1 != $posR12) {
$ITEXT = $this->f_repl($ITEXT, $R1.' '.$F, $posR12); $ITEXT = $this->f_repl($ITEXT, $R1.' '.$F, $posR12);
} }
$ITEXT = $this->f_repl($ITEXT, $L1, $posL1); $ITEXT = $this->f_repl($ITEXT, $L1 ?? '', $posL1);
if ($posL1 != $posL12) { if ($posL1 != $posL12) {
$ITEXT = $this->f_repl($ITEXT, $L1, $posL12); $ITEXT = $this->f_repl($ITEXT, $L1 ?? '', $posL12);
} }
$ITEXT = $this->f_repl($ITEXT, $H1, $posH1); $ITEXT = $this->f_repl($ITEXT, $H1 ?? '', $posH1);
if ($posH1 != $posH12) { if ($posH1 != $posH12) {
$ITEXT = $this->f_repl($ITEXT, $H1, $posH12); $ITEXT = $this->f_repl($ITEXT, $H1 ?? '', $posH12);
} }
if (isset($R2)) { if (isset($R2)) {
$ITEXT = $this->f_repl($ITEXT, $R2.' '.$F, $posR2); $ITEXT = $this->f_repl($ITEXT, $R2.' '.$F, $posR2);
@ -527,16 +548,16 @@ class ReportHelper
} }
} }
if (isset($L2)) { if (isset($L2)) {
$ITEXT = $this->f_repl($ITEXT, $L2, $posL2); $ITEXT = $this->f_repl($ITEXT, $L2 ?? '', $posL2);
} }
if ($posL2 != $posL22) { if ($posL2 != $posL22) {
$ITEXT = $this->f_repl($ITEXT, $L2, $posL22); $ITEXT = $this->f_repl($ITEXT, $L2 ?? '', $posL22);
} }
if (isset($H2)) { if (isset($H2)) {
$ITEXT = $this->f_repl($ITEXT, $H2, $posH2); $ITEXT = $this->f_repl($ITEXT, $H2 ?? '', $posH2);
} }
if ($posH2 != $posH22) { if ($posH2 != $posH22) {
$ITEXT = $this->f_repl($ITEXT, $H2, $posH22); $ITEXT = $this->f_repl($ITEXT, $H2 ?? '', $posH22);
} }
if ($I == 'Negative' || $I == 'Negatif') { if ($I == 'Negative' || $I == 'Negatif') {
$I1 = "Negatif"; $I1 = "Negatif";
@ -544,16 +565,16 @@ class ReportHelper
$ITEXT = $this->f_repl($ITEXT, $I1, $posI1); $ITEXT = $this->f_repl($ITEXT, $I1, $posI1);
$ITEXT = $this->f_repl($ITEXT, $I2, $posI2); $ITEXT = $this->f_repl($ITEXT, $I2, $posI2);
} else { } else {
$ITEXT = $this->f_repl($ITEXT, $I, $posI1); $ITEXT = $this->f_repl($ITEXT, $I ?? '', $posI1);
$ITEXT = $this->f_repl($ITEXT, $I, $posI2); $ITEXT = $this->f_repl($ITEXT, $I ?? '', $posI2);
} }
$ITEXT = $this->f_repl($ITEXT, $U1, $posU1); $ITEXT = $this->f_repl($ITEXT, $U1 ?? '', $posU1);
$ITEXT = $this->f_repl($ITEXT, $U2, $posU2); $ITEXT = $this->f_repl($ITEXT, $U2 ?? '', $posU2);
} elseif (in_array($RESTYPE, [2, 0, 5])) { } elseif (in_array($RESTYPE, [2, 0, 5])) {
if (strlen($RESCOM) < 2) { if (strlen($RESCOM) < 2) {
if ($TESTCODE == 'BUCRR') { if ($TESTCODE == 'BUCRR') {
$ITEXT = $this->f_repl($ITEXT, $R1, $posR1); $ITEXT = $this->f_repl($ITEXT, $R1 ?? '', $posR1);
$ITEXT = $this->f_repl($ITEXT, $R1, $posR2); $ITEXT = $this->f_repl($ITEXT, $R1 ?? '', $posR2);
} else { } else {
$ITEXT = substr($ITEXT, 0, $posR1); $ITEXT = substr($ITEXT, 0, $posR1);
$ITEXT .= $R1."</pre></td> </tr>"; $ITEXT .= $R1."</pre></td> </tr>";
@ -618,7 +639,7 @@ class ReportHelper
private function getOthers(string $accessnumber, int $eng): string private function getOthers(string $accessnumber, int $eng): string
{ {
$sql = "SELECT DT.FULLTEXT FROM TESTS T $sql = "SELECT DT.FULLTEXT AS FULLTEXT FROM TESTS T
LEFT JOIN REQUESTS R ON R.REQUESTID=T.REQUESTID LEFT JOIN REQUESTS R ON R.REQUESTID=T.REQUESTID
LEFT JOIN DICT_TESTS DT ON DT.TESTID=T.TESTID LEFT JOIN DICT_TESTS DT ON DT.TESTID=T.TESTID
WHERE R.ACCESSNUMBER=? AND ISNUMERIC(DT.TESTCODE)=1 WHERE R.ACCESSNUMBER=? AND ISNUMERIC(DT.TESTCODE)=1
@ -629,7 +650,7 @@ class ReportHelper
$i = 1; $i = 1;
$raw = ""; $raw = "";
foreach ($rows as $row) { foreach ($rows as $row) {
$text = $row[0]; $text = $row['FULLTEXT'];
if ($eng == 1) { if ($eng == 1) {
$text = substr($text, strpos($text, '#E') + 2, strrpos($text, '#E') - strpos($text, '#E') - 2); $text = substr($text, strpos($text, '#E') + 2, strrpos($text, '#E') - strpos($text, '#E') - 2);
} else { } else {
@ -654,25 +675,25 @@ class ReportHelper
private function getCollData(string $accessnumber): string private function getCollData(string $accessnumber): string
{ {
$collData = ""; $collData = "";
$sql = "SELECT DISTINCT FORMAT(COLLECTIONDATE,'dd-MM-yyyy'), FORMAT(COLLECTIONDATE,'HH:mm'), x = STUFF( $sql = "SELECT DISTINCT FORMAT(COLLECTIONDATE,'dd-MM-yyyy') AS COLLDATE, FORMAT(COLLECTIONDATE,'HH:mm') AS COLLTIME, STUFF(
(SELECT ', ' + dst.SHORTTEXT FROM GDC_CMOD.dbo.TUBES t1 (SELECT ', ' + dst.SHORTTEXT FROM GDC_CMOD.dbo.TUBES t1
LEFT JOIN glendb.dbo.DICT_SAMPLES_TYPES dst ON t1.TUBENUMBER=dst.SAMPCODE LEFT JOIN glendb.dbo.DICT_SAMPLES_TYPES dst ON t1.TUBENUMBER=dst.SAMPCODE
WHERE t1.ACCESSNUMBER=t.ACCESSNUMBER WHERE t1.ACCESSNUMBER=t.ACCESSNUMBER
AND FORMAT(t1.COLLECTIONDATE,'dd-MM-yyyy HH:mm')=FORMAT(t.COLLECTIONDATE,'dd-MM-yyyy HH:mm') AND FORMAT(t1.COLLECTIONDATE,'dd-MM-yyyy HH:mm')=FORMAT(t.COLLECTIONDATE,'dd-MM-yyyy HH:mm')
FOR XML PATH('')), FOR XML PATH('')),
1,1, '') 1,1, '') AS SAMPLES
FROM GDC_CMOD.dbo.TUBES t WHERE t.ACCESSNUMBER=? AND STATUS=1"; FROM GDC_CMOD.dbo.TUBES t WHERE t.ACCESSNUMBER=? AND STATUS=1";
$stmt = $this->db->query($sql, [$accessnumber]); $stmt = $this->db->query($sql, [$accessnumber]);
$rows = $stmt->getResultArray(); $rows = $stmt->getResultArray();
$date1 = ''; $date1 = '';
foreach ($rows as $row) { foreach ($rows as $row) {
if ($date1 == $row[0]) { if ($date1 == $row['COLLDATE']) {
$collData .= $row[1].$row[2].'. '; $collData .= $row['COLLTIME'].$row['SAMPLES'].'. ';
} else { } else {
$collData .= $row[0].' '.$row[1].$row[2].'. '; $collData .= $row['COLLDATE'].' '.$row['COLLTIME'].$row['SAMPLES'].'. ';
} }
$date1 = $row[0]; $date1 = $row['COLLDATE'];
} }
return $collData; return $collData;
} }
@ -680,7 +701,7 @@ class ReportHelper
private function getRecvData(string $accessnumber): string private function getRecvData(string $accessnumber): string
{ {
$recvData = ""; $recvData = "";
$sql = "SELECT ds.SHORTTEXT, FORMAT(st.COLLECTIONDATE,'dd-MM-yyyy'), FORMAT(st.COLLECTIONDATE,'HH:mm') FROM SP_TUBES st $sql = "SELECT ds.SHORTTEXT AS SHORTTEXT, FORMAT(st.COLLECTIONDATE,'dd-MM-yyyy') AS RECVDATE, FORMAT(st.COLLECTIONDATE,'HH:mm') AS RECVTIME FROM SP_TUBES st
LEFT JOIN DICT_SAMPLES_TYPES ds ON ds.SAMPCODE=st.SAMPLETYPE LEFT JOIN DICT_SAMPLES_TYPES ds ON ds.SAMPCODE=st.SAMPLETYPE
WHERE st.SP_ACCESSNUMBER=? AND st.TUBESTATUS=4"; WHERE st.SP_ACCESSNUMBER=? AND st.TUBESTATUS=4";
$stmt = $this->db->query($sql, [$accessnumber]); $stmt = $this->db->query($sql, [$accessnumber]);
@ -689,9 +710,9 @@ class ReportHelper
$date1 = ''; $date1 = '';
$time1 = ''; $time1 = '';
foreach ($rows as $row) { foreach ($rows as $row) {
$x = $row[0]; $x = $row['SHORTTEXT'];
$date = $row[1]; $date = $row['RECVDATE'];
$time = $row[2]; $time = $row['RECVTIME'];
if ($date1 == $date) { if ($date1 == $date) {
if ($time1 == $time) { if ($time1 == $time) {
$recvData .= $x.'. '; $recvData .= $x.'. ';
@ -709,7 +730,7 @@ class ReportHelper
private function getNoSample(string $accessnumber): string private function getNoSample(string $accessnumber): string
{ {
$sql = "SELECT DST.SHORTTEXT FROM SP_TUBES ST $sql = "SELECT DST.SHORTTEXT AS SHORTTEXT FROM SP_TUBES ST
LEFT JOIN DICT_SAMPLES_TYPES DST ON DST.SAMPCODE=ST.TUBETYPE LEFT JOIN DICT_SAMPLES_TYPES DST ON DST.SAMPCODE=ST.TUBETYPE
WHERE ST.SP_ACCESSNUMBER=? AND ST.TUBESTATUS<>4"; WHERE ST.SP_ACCESSNUMBER=? AND ST.TUBESTATUS<>4";
$stmt = $this->db->query($sql, [$accessnumber]); $stmt = $this->db->query($sql, [$accessnumber]);
@ -717,7 +738,7 @@ class ReportHelper
$noSample = ''; $noSample = '';
foreach ($rows as $row) { foreach ($rows as $row) {
$sample = $row[0]; $sample = $row['SHORTTEXT'];
$noSample .= "<tr> <td>$sample</td> <td colspan='6'>No Sample</td> </tr>\r"; $noSample .= "<tr> <td>$sample</td> <td colspan='6'>No Sample</td> </tr>\r";
} }
return $noSample; return $noSample;
@ -756,4 +777,10 @@ class ReportHelper
} }
return $valBy; return $valBy;
} }
private function getValData(string $accessnumber): array {
$sql = "SELECT TOP 1 * FROM GDC_CMOD.dbo.CM_REQUESTS WHERE ACCESSNUMBER=?";
$row = $this->db->query($sql, [$accessnumber])->getRowArray();
return $row ?? [];
}
} }

View File

@ -5,14 +5,14 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Lab Report - <?= esc($accessnumber) ?></title> <title>Lab Report - <?= esc($accessnumber) ?></title>
<link rel='stylesheet' href='<?= base_url('assets/report/normalize.min.css') ?>'> <link rel='stylesheet' href='<?= base_url('assets/report/normalize.min.css') ?>'>
<?php if (isset($ispdf) && $ispdf == 1): ?>
<link rel='stylesheet' href='<?= base_url('assets/report/pdf.css') ?>'>
<?php else: ?>
<link rel='stylesheet' href='<?= base_url('assets/report/style.css') ?>'> <link rel='stylesheet' href='<?= base_url('assets/report/style.css') ?>'>
<?php endif; ?>
</head> </head>
<body style='-webkit-print-color-adjust:exact;'> <body style='-webkit-print-color-adjust:exact;'>
<?php if ($preview == 1): ?>
<div style='font-size:30px; text-align:center; color:red;'>PREVIEW ONLY - DO NOT PRINT</div>
<?php endif; ?>
<?php <?php
$othertitle = $eng == 1 ? "Non Laboratory Test" : "Pemeriksaan Non Laboratorium"; $othertitle = $eng == 1 ? "Non Laboratory Test" : "Pemeriksaan Non Laboratorium";
$npage = count($result); $npage = count($result);
@ -23,7 +23,9 @@ $i = 1;
<div id='page'> <div id='page'>
<div id='pagetop' style='height:0.01cm'></div> <div id='pagetop' style='height:0.01cm'></div>
<?php if (isset($ispdf) && $ispdf == 1): ?>
<img src='<?= base_url('assets/report/gleneagleshdr.png') ?>' class='img'/> <img src='<?= base_url('assets/report/gleneagleshdr.png') ?>' class='img'/>
<?php endif; ?>
<div id='dinfo'> <div id='dinfo'>
<?= $info ?> <?= $info ?>
@ -82,20 +84,19 @@ $i = 1;
<?php endif; ?> <?php endif; ?>
<pre class='small'>Collected on <?= esc($collData) ?> <pre class='small'>Collected on <?= esc($collData) ?>
Received on <?= esc($recvData) ?> Received on <?= esc($recvData) ?>
Val1 By : <?= esc($val1User) ?> | Val2 By <?= esc($val2User) ?>
Page <?= $i ?>/<?= $npage ?> Printed By : <?= esc($valBy) ?> <?= esc($date) ?></pre> Page <?= $i ?>/<?= $npage ?> Printed By : <?= esc($valBy) ?> <?= esc($date) ?></pre>
</td> </td>
<td class='right'> <td class='right'>
<pre> <pre><b>&rdquo;This result is valid without signature.&rdquo;</b></pre>
(__________________)
Authorised Signature
</pre>
</td> </td>
</tr> </tr>
</table> </table>
</div> </div>
<?php if (isset($ispdf) && $ispdf == 1): ?>
<img src='<?= base_url('assets/report/gleneaglesftr.png') ?>' class='img img-footer'/> <img src='<?= base_url('assets/report/gleneaglesftr.png') ?>' class='img img-footer'/>
<?php endif; ?>
</div> </div>
<?php <?php
$i++; $i++;
@ -106,11 +107,9 @@ endforeach;
<div id='page'> <div id='page'>
<div id='pagetop' style='height:0.01cm'></div> <div id='pagetop' style='height:0.01cm'></div>
<?php if ($preview == 1): ?> <?php if (isset($ispdf) && $ispdf == 1): ?>
<div style='font-size:30px; text-align:center; color:red;'>PREVIEW ONLY - DO NOT PRINT</div>
<?php endif; ?>
<img src='<?= base_url('assets/report/gleneagleshdr.png') ?>' class='img'/> <img src='<?= base_url('assets/report/gleneagleshdr.png') ?>' class='img'/>
<?php endif; ?>
<div id='dinfo'> <div id='dinfo'>
<?= $info ?> <?= $info ?>
@ -130,21 +129,19 @@ endforeach;
Status : <?= esc($status) ?> Status : <?= esc($status) ?>
<pre class='small'>Collected on <?= esc($collData) ?> <pre class='small'>Collected on <?= esc($collData) ?>
Received on <?= esc($recvData) ?> Received on <?= esc($recvData) ?>
Val1 By : <?= esc($val1User) ?> | Val2 By <?= esc($val2User) ?>
Page <?= $i ?>/<?= $npage ?> Printed By : <?= esc($valBy) ?> <?= esc($date) ?></pre> Page <?= $i ?>/<?= $npage ?> Printed By : <?= esc($valBy) ?> <?= esc($date) ?></pre>
</td> </td>
<td class='right'> <td class='right'>
<pre> <pre><b>&rdquo;This result is valid without signature.&rdquo;</b></pre>
(__________________)
Authorised Signature
</pre>
</td> </td>
</tr> </tr>
</table> </table>
</div> </div>
<br/> <?php if (isset($ispdf) && $ispdf == 1): ?>
<img src='<?= base_url('assets/report/gleneaglesftr.png') ?>' class='img img-footer'/> <img src='<?= base_url('assets/report/gleneaglesftr.png') ?>' class='img img-footer'/>
<?php endif; ?>
</div> </div>
<?php endif; ?> <?php endif; ?>

View File

@ -5,9 +5,9 @@ body { -webkit-print-color-adjust:exact; }
/*width: 210mm; height: 297mm;*/ /*width: 210mm; height: 297mm;*/
width: 210mm; height: 297mm; width: 210mm; height: 297mm;
} }
#dinfo { float:right; margin:4cm 0.8cm 0 0; } #dinfo { float:right; margin:2cm 0.8cm 0 0; }
#dresult { float:left; margin: 0.2cm 0.8cm 0 1.5cm; height: 16.5cm; } #dresult { float:left; margin: 0.2cm 0.8cm 0 1.5cm; height: 17.5cm; }
#footer { float:left; margin:0cm 2cm 0 1cm; height:3cm; } #footer { float:left; margin:0cm 2cm 0 1.5cm; height:2cm; }
table {border-collapse:collapse;} table {border-collapse:collapse;}
td {vertical-align:top;} td {vertical-align:top;}
@ -18,12 +18,14 @@ th,td { line-height:1.3;}
.flag { float:right; top:0; font-weight:bold; } .flag { float:right; top:0; font-weight:bold; }
.result { table-layout:fixed; border:solid 1px black; width:100%; } .result { table-layout:fixed; border:solid 1px black; width:100%; }
.textC { font-size:7pt; } .textC { font-size:7pt; }
.footer {width : 17cm; } .footer {width : 18cm; }
.footer td {vertical-align:bottom;} .footer td {vertical-align:bottom;}
td.right { text-align: right; } td.right { text-align: right; }
#notes { margin: 5mm 0 0 10mm; } #notes { margin: 5mm 0 0 10mm; }
.footer-img { visibility:hidden; } .footer-img { visibility:hidden; }
.img { max-width: 100%; height: auto; }
.img-footer { max-width: 100%; height: auto; max-height: 2.5cm; }
pre.small {font-size:6pt;} pre.small {font-size:6pt;}