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:
parent
31acb6bf33
commit
848d8d663f
@ -92,18 +92,12 @@ $routes->group('cs', ['filter' => 'role:4'], function ($routes) {
|
||||
|
||||
$routes->get('/dummypage', 'Home::dummyPage');
|
||||
|
||||
// Report generation - Lab, Admin, Superuser
|
||||
$routes->group('report', ['filter' => 'role:0,1,2'], function ($routes) {
|
||||
// Report generation - Lab, Admin, Superuser, CS
|
||||
$routes->group('report', ['filter' => 'role:0,1,2,4'], function ($routes) {
|
||||
$routes->get('(:num)', 'ReportController::generate/$1');
|
||||
$routes->get('(:num)/preview', 'ReportController::preview/$1');
|
||||
$routes->get('(:num)/eng', 'ReportController::generate/$1/1');
|
||||
$routes->get('(:num)/preview/eng', 'ReportController::preview/$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');
|
||||
$routes->get('(:num)/print', 'ReportController::print/$1');
|
||||
$routes->get('(:num)/print/eng', 'ReportController::print/$1/1');
|
||||
});
|
||||
|
||||
// Keep backward compatibility - updated filter
|
||||
|
||||
@ -15,7 +15,25 @@ class ReportController extends BaseController
|
||||
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');
|
||||
if (!in_array($userroleid, [0, 1, 2, 4])) {
|
||||
@ -23,31 +41,17 @@ class ReportController extends BaseController
|
||||
}
|
||||
|
||||
$data = $this->reportHelper->getReportData($accessnumber, $eng);
|
||||
$data['preview'] = $preview;
|
||||
$data['eng'] = $eng;
|
||||
$data['accessnumber'] = $accessnumber;
|
||||
$data['ispdf'] = $ispdf;
|
||||
|
||||
if ($preview == 0) {
|
||||
if ($shouldLog == true) {
|
||||
$this->logPrintAudit($accessnumber, $data['status']);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
$sql = "INSERT INTO GDC_CMOD.dbo.AUDIT_REQUESTS(ACCESSNUMBER, STEPDATE, STEPTYPE, STEPSTATUS)
|
||||
|
||||
@ -31,7 +31,7 @@ class ReportHelper
|
||||
}
|
||||
|
||||
$valBy = $this->getValBy($accessnumber);
|
||||
|
||||
$valData = $this->getValData($accessnumber);
|
||||
return [
|
||||
'hostnumber' => $hostnumber,
|
||||
'result' => $result,
|
||||
@ -43,6 +43,8 @@ class ReportHelper
|
||||
'noSample' => $noSample,
|
||||
'status' => $status,
|
||||
'valBy' => $valBy,
|
||||
'val1User' => $valData['VAL1USER'] ?? '',
|
||||
'val2User' => $valData['VAL2USER'] ?? '',
|
||||
'date' => date('d-m-Y H:i')
|
||||
];
|
||||
}
|
||||
@ -70,22 +72,30 @@ class ReportHelper
|
||||
|
||||
private function getData2(string $accessnumber): string
|
||||
{
|
||||
$sql = "SELECT R.EXTERNALORDERNUMBER, FORMAT(SR.COLLECTIONDATE,'dd-MM-yyyy'), P.NAME, RIGHT(P.PATNUMBER,16),
|
||||
dmg.DMG_CADDRESS, P.TELEPHON, P.EMAIL,
|
||||
$sql = "SELECT R.EXTERNALORDERNUMBER AS EXTERNALORDERNUMBER,
|
||||
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
|
||||
WHEN P.SEX=1 THEN 'Male'
|
||||
WHEN P.SEX=2 THEN 'Female'
|
||||
ELSE 'Unknown'
|
||||
END,
|
||||
END AS SEX,
|
||||
CASE WHEN FORMAT(P.BIRTHDATE,'MMdd')=FORMAT(R.COLLECTIONDATE,'MMdd')
|
||||
THEN DATEDIFF(YEAR,P.BIRTHDATE, R.COLLECTIONDATE)
|
||||
ELSE FLOOR(DATEDIFF(DAY, P.BIRTHDATE, R.COLLECTIONDATE) / 365.25)
|
||||
END,
|
||||
END AS AGE,
|
||||
CASE WHEN DATEPART(day,R.COLLECTIONDATE) >= DATEPART(day,P.BIRTHDATE)
|
||||
THEN DATEDIFF(MONTH,P.BIRTHDATE, R.COLLECTIONDATE)%12
|
||||
ELSE DATEDIFF(MONTH, P.BIRTHDATE, DATEADD(MONTH,-1,R.COLLECTIONDATE))%12
|
||||
END,
|
||||
RO.COMMENTTEXT, dmg.DMG_CCITY, P.BIRTHDATE, T.SHORTTEXT
|
||||
END AS AGEMONTHS,
|
||||
RO.COMMENTTEXT AS COMMENTTEXT,
|
||||
dmg.DMG_CCITY AS DMG_CCITY,
|
||||
P.BIRTHDATE AS BIRTHDATE,
|
||||
T.SHORTTEXT AS SHORTTEXT
|
||||
FROM REQUESTS R
|
||||
LEFT JOIN SP_REQUESTS SR ON SR.SP_ACCESSNUMBER=R.ACCESSNUMBER
|
||||
LEFT JOIN PATIENTS P ON P.PATID=R.PATID
|
||||
@ -97,20 +107,20 @@ class ReportHelper
|
||||
$row = $this->db->query($sql, [$accessnumber])->getRowArray();
|
||||
|
||||
$regno = $row['EXTERNALORDERNUMBER'] ?? '';
|
||||
$reqdate = isset($row[1]) ? $row[1] : '';
|
||||
$reqdate = $row['REQDATE'] ?? '';
|
||||
$pname = $row['NAME'] ?? '';
|
||||
$pnum = $row[2] ?? '';
|
||||
$pnum = $row['PATNUM'] ?? '';
|
||||
$paddress = $row['DMG_CADDRESS'] ?? '';
|
||||
$pphone = $row['TELEPHON'] ?? '';
|
||||
$pemail = $row['EMAIL'] ?? '';
|
||||
$psex = $row[3] ?? '';
|
||||
$pAge = $row[4] ?? '';
|
||||
$pAgeM = $row[5] ?? '';
|
||||
$psex = $row['SEX'] ?? '';
|
||||
$pAge = $row['AGE'] ?? '';
|
||||
$pAgeM = $row['AGEMONTHS'] ?? '';
|
||||
$rcomment = $row['COMMENTTEXT'] ?? '';
|
||||
$pcity = $row['DMG_CCITY'] ?? '';
|
||||
$pdob = '';
|
||||
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'] ?? '';
|
||||
if ($title != '') {
|
||||
@ -202,7 +212,9 @@ class ReportHelper
|
||||
|
||||
$_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
|
||||
WHEN T.RESTYPE=0 THEN 'Pending'
|
||||
WHEN T.RESTYPE=4 AND T.RESVALUE='' AND T.RESSTATUS=1 THEN '.'
|
||||
@ -217,13 +229,22 @@ class ReportHelper
|
||||
END
|
||||
ELSE T.RESVALUE
|
||||
END,
|
||||
T.MINIMUM, T.MAXIMUM,
|
||||
DT.FULLTEXT,
|
||||
DT.RESPRECISION, DT.RESPRECISION2, DT.OPERAND, DT.SOFTCONVERSION, DT.UNITS, DT.UNITS2, T.RESTYPE, VI.FULLTEXT,
|
||||
T.MINIMUM AS MINIMUM,
|
||||
T.MAXIMUM AS MAXIMUM,
|
||||
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
|
||||
WHEN TC.COMMENTTEXT IS NULL THEN DX2.FULLTEXT
|
||||
ELSE TC.COMMENTTEXT
|
||||
END, T.RERUN
|
||||
END AS RESCOM,
|
||||
T.RERUN AS RERUN
|
||||
FROM TESTS T
|
||||
JOIN DICT_TESTS DT ON DT.TESTID=T.TESTID
|
||||
LEFT JOIN DICT_TEXTS DX ON DX.TEXTID=T.CODEDRESULTID
|
||||
@ -248,25 +269,25 @@ class ReportHelper
|
||||
$RERUN = 1;
|
||||
|
||||
foreach ($rows as $row) {
|
||||
$CHAPTER = $row[0];
|
||||
$TESTCODE = $row[1];
|
||||
$VALIDATIONSTATUS = $row[2];
|
||||
$R1 = $row[3];
|
||||
$CHAPTER = $row['CHAPTER'];
|
||||
$TESTCODE = $row['TESTCODE'];
|
||||
$VALIDATIONSTATUS = $row['VALIDATIONSTATUS'];
|
||||
$R1 = $row['RESULT'];
|
||||
if ($R1 == '****') {
|
||||
$R1 = '-';
|
||||
}
|
||||
$L1 = $row[4];
|
||||
$H1 = $row[5];
|
||||
$FULLTEXT = $row[6];
|
||||
$PRECISION1 = $row[7];
|
||||
$PRECISION2 = $row[8];
|
||||
$OPERAND = $row[9];
|
||||
$SOFTCONVERSION = $row[10];
|
||||
$U1 = $row[11];
|
||||
$U2 = $row[12];
|
||||
$RESTYPE = $row[13];
|
||||
$I = $row[14];
|
||||
$RESCOM = $row[15];
|
||||
$L1 = $row['MINIMUM'];
|
||||
$H1 = $row['MAXIMUM'];
|
||||
$FULLTEXT = $row['FULLTEXT'];
|
||||
$PRECISION1 = $row['PRECISION1'];
|
||||
$PRECISION2 = $row['PRECISION2'];
|
||||
$OPERAND = $row['OPERAND'];
|
||||
$SOFTCONVERSION = $row['SOFTCONVERSION'];
|
||||
$U1 = $row['U1'];
|
||||
$U2 = $row['U2'];
|
||||
$RESTYPE = $row['RESTYPE'];
|
||||
$I = $row['I'];
|
||||
$RESCOM = $row['RESCOM'];
|
||||
|
||||
if ($eng == 1) {
|
||||
$ICHAPTER = substr($CHAPTER, strpos($CHAPTER, '#E') + 2, strrpos($CHAPTER, '#E') - strpos($CHAPTER, '#E') - 2);
|
||||
@ -299,7 +320,7 @@ class ReportHelper
|
||||
$raw[$i] .= $ITEXT;
|
||||
}
|
||||
|
||||
$RERUN = $row[16];
|
||||
$RERUN = $row['RERUN'];
|
||||
} else {
|
||||
if (substr($R1, 0, 2) == '< ' && is_numeric(substr($R1, 2, strlen($R1)))) {
|
||||
$r1 = substr($R1, 2, strlen($R1));
|
||||
@ -512,13 +533,13 @@ class ReportHelper
|
||||
if ($posR1 != $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) {
|
||||
$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) {
|
||||
$ITEXT = $this->f_repl($ITEXT, $H1, $posH12);
|
||||
$ITEXT = $this->f_repl($ITEXT, $H1 ?? '', $posH12);
|
||||
}
|
||||
if (isset($R2)) {
|
||||
$ITEXT = $this->f_repl($ITEXT, $R2.' '.$F, $posR2);
|
||||
@ -527,16 +548,16 @@ class ReportHelper
|
||||
}
|
||||
}
|
||||
if (isset($L2)) {
|
||||
$ITEXT = $this->f_repl($ITEXT, $L2, $posL2);
|
||||
$ITEXT = $this->f_repl($ITEXT, $L2 ?? '', $posL2);
|
||||
}
|
||||
if ($posL2 != $posL22) {
|
||||
$ITEXT = $this->f_repl($ITEXT, $L2, $posL22);
|
||||
$ITEXT = $this->f_repl($ITEXT, $L2 ?? '', $posL22);
|
||||
}
|
||||
if (isset($H2)) {
|
||||
$ITEXT = $this->f_repl($ITEXT, $H2, $posH2);
|
||||
$ITEXT = $this->f_repl($ITEXT, $H2 ?? '', $posH2);
|
||||
}
|
||||
if ($posH2 != $posH22) {
|
||||
$ITEXT = $this->f_repl($ITEXT, $H2, $posH22);
|
||||
$ITEXT = $this->f_repl($ITEXT, $H2 ?? '', $posH22);
|
||||
}
|
||||
if ($I == 'Negative' || $I == 'Negatif') {
|
||||
$I1 = "Negatif";
|
||||
@ -544,16 +565,16 @@ class ReportHelper
|
||||
$ITEXT = $this->f_repl($ITEXT, $I1, $posI1);
|
||||
$ITEXT = $this->f_repl($ITEXT, $I2, $posI2);
|
||||
} else {
|
||||
$ITEXT = $this->f_repl($ITEXT, $I, $posI1);
|
||||
$ITEXT = $this->f_repl($ITEXT, $I, $posI2);
|
||||
$ITEXT = $this->f_repl($ITEXT, $I ?? '', $posI1);
|
||||
$ITEXT = $this->f_repl($ITEXT, $I ?? '', $posI2);
|
||||
}
|
||||
$ITEXT = $this->f_repl($ITEXT, $U1, $posU1);
|
||||
$ITEXT = $this->f_repl($ITEXT, $U2, $posU2);
|
||||
$ITEXT = $this->f_repl($ITEXT, $U1 ?? '', $posU1);
|
||||
$ITEXT = $this->f_repl($ITEXT, $U2 ?? '', $posU2);
|
||||
} elseif (in_array($RESTYPE, [2, 0, 5])) {
|
||||
if (strlen($RESCOM) < 2) {
|
||||
if ($TESTCODE == 'BUCRR') {
|
||||
$ITEXT = $this->f_repl($ITEXT, $R1, $posR1);
|
||||
$ITEXT = $this->f_repl($ITEXT, $R1, $posR2);
|
||||
$ITEXT = $this->f_repl($ITEXT, $R1 ?? '', $posR1);
|
||||
$ITEXT = $this->f_repl($ITEXT, $R1 ?? '', $posR2);
|
||||
} else {
|
||||
$ITEXT = substr($ITEXT, 0, $posR1);
|
||||
$ITEXT .= $R1."</pre></td> </tr>";
|
||||
@ -618,7 +639,7 @@ class ReportHelper
|
||||
|
||||
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 DICT_TESTS DT ON DT.TESTID=T.TESTID
|
||||
WHERE R.ACCESSNUMBER=? AND ISNUMERIC(DT.TESTCODE)=1
|
||||
@ -629,7 +650,7 @@ class ReportHelper
|
||||
$i = 1;
|
||||
$raw = "";
|
||||
foreach ($rows as $row) {
|
||||
$text = $row[0];
|
||||
$text = $row['FULLTEXT'];
|
||||
if ($eng == 1) {
|
||||
$text = substr($text, strpos($text, '#E') + 2, strrpos($text, '#E') - strpos($text, '#E') - 2);
|
||||
} else {
|
||||
@ -654,25 +675,25 @@ class ReportHelper
|
||||
private function getCollData(string $accessnumber): string
|
||||
{
|
||||
$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
|
||||
LEFT JOIN glendb.dbo.DICT_SAMPLES_TYPES dst ON t1.TUBENUMBER=dst.SAMPCODE
|
||||
WHERE t1.ACCESSNUMBER=t.ACCESSNUMBER
|
||||
AND FORMAT(t1.COLLECTIONDATE,'dd-MM-yyyy HH:mm')=FORMAT(t.COLLECTIONDATE,'dd-MM-yyyy HH:mm')
|
||||
FOR XML PATH('')),
|
||||
1,1, '')
|
||||
1,1, '') AS SAMPLES
|
||||
FROM GDC_CMOD.dbo.TUBES t WHERE t.ACCESSNUMBER=? AND STATUS=1";
|
||||
$stmt = $this->db->query($sql, [$accessnumber]);
|
||||
$rows = $stmt->getResultArray();
|
||||
|
||||
$date1 = '';
|
||||
foreach ($rows as $row) {
|
||||
if ($date1 == $row[0]) {
|
||||
$collData .= $row[1].$row[2].'. ';
|
||||
if ($date1 == $row['COLLDATE']) {
|
||||
$collData .= $row['COLLTIME'].$row['SAMPLES'].'. ';
|
||||
} else {
|
||||
$collData .= $row[0].' '.$row[1].$row[2].'. ';
|
||||
$collData .= $row['COLLDATE'].' '.$row['COLLTIME'].$row['SAMPLES'].'. ';
|
||||
}
|
||||
$date1 = $row[0];
|
||||
$date1 = $row['COLLDATE'];
|
||||
}
|
||||
return $collData;
|
||||
}
|
||||
@ -680,7 +701,7 @@ class ReportHelper
|
||||
private function getRecvData(string $accessnumber): string
|
||||
{
|
||||
$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
|
||||
WHERE st.SP_ACCESSNUMBER=? AND st.TUBESTATUS=4";
|
||||
$stmt = $this->db->query($sql, [$accessnumber]);
|
||||
@ -689,9 +710,9 @@ class ReportHelper
|
||||
$date1 = '';
|
||||
$time1 = '';
|
||||
foreach ($rows as $row) {
|
||||
$x = $row[0];
|
||||
$date = $row[1];
|
||||
$time = $row[2];
|
||||
$x = $row['SHORTTEXT'];
|
||||
$date = $row['RECVDATE'];
|
||||
$time = $row['RECVTIME'];
|
||||
if ($date1 == $date) {
|
||||
if ($time1 == $time) {
|
||||
$recvData .= $x.'. ';
|
||||
@ -709,7 +730,7 @@ class ReportHelper
|
||||
|
||||
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
|
||||
WHERE ST.SP_ACCESSNUMBER=? AND ST.TUBESTATUS<>4";
|
||||
$stmt = $this->db->query($sql, [$accessnumber]);
|
||||
@ -717,7 +738,7 @@ class ReportHelper
|
||||
|
||||
$noSample = '';
|
||||
foreach ($rows as $row) {
|
||||
$sample = $row[0];
|
||||
$sample = $row['SHORTTEXT'];
|
||||
$noSample .= "<tr> <td>$sample</td> <td colspan='6'>No Sample</td> </tr>\r";
|
||||
}
|
||||
return $noSample;
|
||||
@ -756,4 +777,10 @@ class ReportHelper
|
||||
}
|
||||
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 ?? [];
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,14 +5,14 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<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/style.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') ?>'>
|
||||
<?php endif; ?>
|
||||
</head>
|
||||
<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
|
||||
$othertitle = $eng == 1 ? "Non Laboratory Test" : "Pemeriksaan Non Laboratorium";
|
||||
$npage = count($result);
|
||||
@ -23,7 +23,9 @@ $i = 1;
|
||||
<div id='page'>
|
||||
<div id='pagetop' style='height:0.01cm'></div>
|
||||
|
||||
<img src='<?= base_url('assets/report/gleneagleshdr.png') ?>' class='img'/>
|
||||
<?php if (isset($ispdf) && $ispdf == 1): ?>
|
||||
<img src='<?= base_url('assets/report/gleneagleshdr.png') ?>' class='img'/>
|
||||
<?php endif; ?>
|
||||
|
||||
<div id='dinfo'>
|
||||
<?= $info ?>
|
||||
@ -77,25 +79,24 @@ $i = 1;
|
||||
<table class='footer'>
|
||||
<tr>
|
||||
<td>
|
||||
<?php if ($i == $npage): ?>
|
||||
Status : <?= esc($status) ?>
|
||||
<?php endif; ?>
|
||||
<pre class='small'>Collected on <?= esc($collData) ?>
|
||||
Received on <?= esc($recvData) ?>
|
||||
<?php if ($i == $npage): ?>
|
||||
Status : <?= esc($status) ?>
|
||||
<?php endif; ?>
|
||||
<pre class='small'>Collected on <?= esc($collData) ?>
|
||||
Received on <?= esc($recvData) ?>
|
||||
Val1 By : <?= esc($val1User) ?> | Val2 By <?= esc($val2User) ?>
|
||||
Page <?= $i ?>/<?= $npage ?> Printed By : <?= esc($valBy) ?> <?= esc($date) ?></pre>
|
||||
</td>
|
||||
<td class='right'>
|
||||
<pre>
|
||||
|
||||
(__________________)
|
||||
Authorised Signature
|
||||
</pre>
|
||||
<pre><b>”This result is valid without signature.”</b></pre>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<img src='<?= base_url('assets/report/gleneaglesftr.png') ?>' class='img img-footer'/>
|
||||
<?php if (isset($ispdf) && $ispdf == 1): ?>
|
||||
<img src='<?= base_url('assets/report/gleneaglesftr.png') ?>' class='img img-footer'/>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php
|
||||
$i++;
|
||||
@ -106,12 +107,10 @@ endforeach;
|
||||
<div id='page'>
|
||||
<div id='pagetop' style='height:0.01cm'></div>
|
||||
|
||||
<?php if ($preview == 1): ?>
|
||||
<div style='font-size:30px; text-align:center; color:red;'>PREVIEW ONLY - DO NOT PRINT</div>
|
||||
<?php if (isset($ispdf) && $ispdf == 1): ?>
|
||||
<img src='<?= base_url('assets/report/gleneagleshdr.png') ?>' class='img'/>
|
||||
<?php endif; ?>
|
||||
|
||||
<img src='<?= base_url('assets/report/gleneagleshdr.png') ?>' class='img'/>
|
||||
|
||||
<div id='dinfo'>
|
||||
<?= $info ?>
|
||||
</div>
|
||||
@ -130,21 +129,19 @@ endforeach;
|
||||
Status : <?= esc($status) ?>
|
||||
<pre class='small'>Collected on <?= esc($collData) ?>
|
||||
Received on <?= esc($recvData) ?>
|
||||
Val1 By : <?= esc($val1User) ?> | Val2 By <?= esc($val2User) ?>
|
||||
Page <?= $i ?>/<?= $npage ?> Printed By : <?= esc($valBy) ?> <?= esc($date) ?></pre>
|
||||
</td>
|
||||
<td class='right'>
|
||||
<pre>
|
||||
|
||||
(__________________)
|
||||
Authorised Signature
|
||||
</pre>
|
||||
<pre><b>”This result is valid without signature.”</b></pre>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
<img src='<?= base_url('assets/report/gleneaglesftr.png') ?>' class='img img-footer'/>
|
||||
<?php if (isset($ispdf) && $ispdf == 1): ?>
|
||||
<img src='<?= base_url('assets/report/gleneaglesftr.png') ?>' class='img img-footer'/>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
|
||||
@ -5,9 +5,9 @@ body { -webkit-print-color-adjust:exact; }
|
||||
/*width: 210mm; height: 297mm;*/
|
||||
width: 210mm; height: 297mm;
|
||||
}
|
||||
#dinfo { float:right; margin:4cm 0.8cm 0 0; }
|
||||
#dresult { float:left; margin: 0.2cm 0.8cm 0 1.5cm; height: 16.5cm; }
|
||||
#footer { float:left; margin:0cm 2cm 0 1cm; height:3cm; }
|
||||
#dinfo { float:right; margin:2cm 0.8cm 0 0; }
|
||||
#dresult { float:left; margin: 0.2cm 0.8cm 0 1.5cm; height: 17.5cm; }
|
||||
#footer { float:left; margin:0cm 2cm 0 1.5cm; height:2cm; }
|
||||
|
||||
table {border-collapse:collapse;}
|
||||
td {vertical-align:top;}
|
||||
@ -18,12 +18,14 @@ th,td { line-height:1.3;}
|
||||
.flag { float:right; top:0; font-weight:bold; }
|
||||
.result { table-layout:fixed; border:solid 1px black; width:100%; }
|
||||
.textC { font-size:7pt; }
|
||||
.footer {width : 17cm; }
|
||||
.footer {width : 18cm; }
|
||||
.footer td {vertical-align:bottom;}
|
||||
td.right { text-align: right; }
|
||||
|
||||
#notes { margin: 5mm 0 0 10mm; }
|
||||
|
||||
.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;}
|
||||
Loading…
x
Reference in New Issue
Block a user