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');
|
$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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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 ?? [];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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>”This result is valid without signature.”</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>”This result is valid without signature.”</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; ?>
|
||||||
|
|
||||||
|
|||||||
@ -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;}
|
||||||
Loading…
x
Reference in New Issue
Block a user