Add ISPDF flag endpoint and dashboard indicator

- Add POST /api/requests/{accessnumber}/pdf endpoint (no auth required)
- Add setPdfFlag() method to update CM_REQUESTS.ISPDF to 1
- Log PDF_FLAG events to AUDIT_EVENTS table
- Include ISPDF field in dashboard API response
- Add PDF icon indicator in dashboard table (after Val column)
- Icon shows green when ISPDF=1, gray when null/0
- Pass accessnumber to PDF spooler for tracking

Files modified:
- app/Config/Routes.php: Add external PDF endpoint route
- app/Controllers/RequestsController.php: Add setPdfFlag method, include ISPDF in query
- app/Controllers/ReportController.php: Pass accessnumber to spooler
- app/Libraries/PdfHelper.php: Pass accessnumber to spooler
- app/Views/shared/content_requests.php: Add PDF column with icon
This commit is contained in:
mahdahar 2026-03-05 09:59:02 +07:00
parent c2c70505e5
commit b102ba657c
5 changed files with 51 additions and 18 deletions

View File

@ -108,5 +108,8 @@ $routes->group('report', ['filter' => 'role:0,1,2,4'], function ($routes) {
$routes->get('report/status/(:any)', 'ReportController::checkPdfStatus/$1'); $routes->get('report/status/(:any)', 'ReportController::checkPdfStatus/$1');
// External PDF generator endpoint - no auth required
$routes->post('api/requests/(:any)/pdf', 'RequestsController::setPdfFlag/$1');
// Keep backward compatibility - updated filter // Keep backward compatibility - updated filter
$routes->get('print/(:num)', 'ReportController::generate/$1', ['filter' => 'role:0,1,2,3,4']); $routes->get('print/(:num)', 'ReportController::generate/$1', ['filter' => 'role:0,1,2,3,4']);

View File

@ -118,8 +118,8 @@ class ReportController extends BaseController
$filename = $accessnumber . ($eng == 1 ? '_eng' : '') . '.pdf'; $filename = $accessnumber . ($eng == 1 ? '_eng' : '') . '.pdf';
$collectionDate = $data['collectionDate'] ?? ''; $collectionDate = $data['collectionDate'] ?? '';
try { try {
$jobId = $this->postToSpooler($html, $filename, $collectionDate); $jobId = $this->postToSpooler($html, $filename, $collectionDate, $accessnumber);
$sqlCheck = "SELECT COUNT(*) as cnt FROM GDC_CMOD.dbo.AUDIT_REQUESTS $sqlCheck = "SELECT COUNT(*) as cnt FROM GDC_CMOD.dbo.AUDIT_REQUESTS
WHERE ACCESSNUMBER = ? AND STEPTYPE IN ('GEN_PDF', 'REGEN_PDF')"; WHERE ACCESSNUMBER = ? AND STEPTYPE IN ('GEN_PDF', 'REGEN_PDF')";
@ -171,7 +171,7 @@ class ReportController extends BaseController
return $this->response->setJSON($response); return $this->response->setJSON($response);
} }
private function postToSpooler($html, $filename, $collectionDate = '') private function postToSpooler($html, $filename, $collectionDate = '', $accessnumber = '')
{ {
$ch = curl_init(); $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://glenlis:3000/api/pdf/generate'); curl_setopt($ch, CURLOPT_URL, 'http://glenlis:3000/api/pdf/generate');
@ -186,6 +186,10 @@ class ReportController extends BaseController
$payload['collectionDate'] = $collectionDate; $payload['collectionDate'] = $collectionDate;
} }
if ($accessnumber) {
$payload['accessnumber'] = $accessnumber;
}
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload)); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [ curl_setopt($ch, CURLOPT_HTTPHEADER, [

View File

@ -16,13 +16,13 @@ class RequestsController extends BaseController
// Only allow Lab role (role 2) // Only allow Lab role (role 2)
if ($userroleid == 2) { if ($userroleid == 2) {
$sql = "SELECT d.*, r.REPORT_LANG from GDC_CMOD.dbo.V_DASHBOARD_DEV d $sql = "SELECT d.*, r.REPORT_LANG, r.ISPDF from GDC_CMOD.dbo.V_DASHBOARD_DEV d
LEFT JOIN GDC_CMOD.dbo.CM_REQUESTS r ON r.ACCESSNUMBER=d.SP_ACCESSNUMBER LEFT JOIN GDC_CMOD.dbo.CM_REQUESTS r ON r.ACCESSNUMBER=d.SP_ACCESSNUMBER
where d.COLLECTIONDATE between '$date1 00:00' and '$date2 23:59' where d.COLLECTIONDATE between '$date1 00:00' and '$date2 23:59'
and d.ODR_DDATE between '$date1 00:00' and '$date2 23:59' and d.ODR_DDATE between '$date1 00:00' and '$date2 23:59'
and (d.TESTS IS NOT NULL AND d.TESTS like '%[A-Za-z]%')"; and (d.TESTS IS NOT NULL AND d.TESTS like '%[A-Za-z]%')";
} else { } else {
$sql = "SELECT d.*, r.REPORT_LANG from GDC_CMOD.dbo.V_DASHBOARD_DEV d $sql = "SELECT d.*, r.REPORT_LANG, r.ISPDF from GDC_CMOD.dbo.V_DASHBOARD_DEV d
LEFT JOIN GDC_CMOD.dbo.CM_REQUESTS r ON r.ACCESSNUMBER=d.SP_ACCESSNUMBER LEFT JOIN GDC_CMOD.dbo.CM_REQUESTS r ON r.ACCESSNUMBER=d.SP_ACCESSNUMBER
where d.COLLECTIONDATE between '$date1 00:00' and '$date2 23:59' where d.COLLECTIONDATE between '$date1 00:00' and '$date2 23:59'
and d.ODR_DDATE between '$date1 00:00' and '$date2 23:59'"; and d.ODR_DDATE between '$date1 00:00' and '$date2 23:59'";
@ -176,9 +176,10 @@ class RequestsController extends BaseController
curl_setopt($ch, CURLOPT_URL, 'http://glenlis:3000/api/pdf/generate'); curl_setopt($ch, CURLOPT_URL, 'http://glenlis:3000/api/pdf/generate');
curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POST, 1);
$payload = [ $payload = [
'html' => $html, 'html' => $html,
'filename' => $filename 'filename' => $filename,
'accessnumber' => $accessnumber
]; ];
if (!empty($data['collectionDate'])) { if (!empty($data['collectionDate'])) {
@ -216,4 +217,20 @@ class RequestsController extends BaseController
'message' => 'English PDF queued for generation' 'message' => 'English PDF queued for generation'
]; ];
} }
public function setPdfFlag(string $accessnumber): \CodeIgniter\HTTP\ResponseInterface
{
$db = \Config\Database::connect();
$sql = "UPDATE GDC_CMOD.dbo.CM_REQUESTS SET ISPDF = 1 WHERE ACCESSNUMBER = ?";
$db->query($sql, [$accessnumber]);
$logAudit = "INSERT INTO GDC_CMOD.dbo.AUDIT_EVENTS (ACCESSNUMBER, EVENT_TYPE, USERID, EVENT_AT) VALUES (?, 'PDF_FLAG', 'SYSTEM', GETDATE())";
$db->query($logAudit, [$accessnumber]);
return $this->response->setJSON([
'status' => 'success',
'accessnumber' => $accessnumber
]);
}
} }

View File

@ -21,18 +21,25 @@ class PdfHelper
$html = view('report/template', $data); $html = view('report/template', $data);
$filename = $accessnumber . ($eng == 1 ? '_eng' : '') . '.pdf'; $filename = $accessnumber . ($eng == 1 ? '_eng' : '') . '.pdf';
return $this->postHtmlToSpooler($html, $filename); return $this->postHtmlToSpooler($html, $filename, $accessnumber);
} }
public function postHtmlToSpooler(string $html, string $filename): string public function postHtmlToSpooler(string $html, string $filename, string $accessnumber = ''): string
{ {
$ch = curl_init(); $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://glenlis:3000/api/pdf/generate'); curl_setopt($ch, CURLOPT_URL, 'http://glenlis:3000/api/pdf/generate');
curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
$payload = [
'html' => $html, 'html' => $html,
'filename' => $filename 'filename' => $filename
])); ];
if ($accessnumber) {
$payload['accessnumber'] = $accessnumber;
}
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [ curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json' 'Content-Type: application/json'

View File

@ -185,6 +185,7 @@
<th style='width:20%;'>Tests</th> <th style='width:20%;'>Tests</th>
<th style='width:4%;'>ResTo</th> <th style='width:4%;'>ResTo</th>
<th style='width:5%;'>Val</th> <th style='width:5%;'>Val</th>
<th style='width:3%;'>PDF</th>
<th style='width:5%;'>Result</th> <th style='width:5%;'>Result</th>
<th style='width:5%;'></th> <th style='width:5%;'></th>
</tr> </tr>
@ -206,6 +207,9 @@
<p>2: <span x-text="req.VAL2USER"></span></p> <p>2: <span x-text="req.VAL2USER"></span></p>
</div> </div>
</td> </td>
<td class="text-center">
<i class="fa fa-file-pdf" :class="req.ISPDF ? 'text-success' : 'text-base-300'"></i>
</td>
<?php <?php
$configFile = include __DIR__ . '/config.php'; $configFile = include __DIR__ . '/config.php';
$roleMap = ['superuser' => 'superuser', 'admin' => 'admin', 'lab analyst' => 'lab', 'phlebotomist' => 'phlebo', 'customer service' => 'cs']; $roleMap = ['superuser' => 'superuser', 'admin' => 'admin', 'lab analyst' => 'lab', 'phlebotomist' => 'phlebo', 'customer service' => 'cs'];
@ -311,15 +315,13 @@ $previewEnabled = $configFile[$configKey]['previewEnabled'] ?? false;
<?php endif; ?> <?php endif; ?>
</td> </td>
<td> <td>
<?php if (session('userroleid') == 3): ?>
<span class="text-xs text-base-content/40">-</span>
<?php else: ?>
<div class="dropdown dropdown-top dropdown-end dropdown-hover"> <div class="dropdown dropdown-top dropdown-end dropdown-hover">
<div tabindex="0" role="button" class="btn btn-xs btn-primary w-full"> <div tabindex="0" role="button" class="btn btn-xs btn-primary w-full">
<i class="fa fa-cog mr-1"></i> Actions <i class="fa fa-cog mr-1"></i> Actions
</div> </div>
<ul tabindex="0" <ul tabindex="0"
class="dropdown-content menu bg-base-100 rounded-box z-50 w-48 p-2 shadow-lg border border-base-300 text-xs"> class="dropdown-content menu bg-base-100 rounded-box z-50 w-48 p-2 shadow-lg border border-base-300 text-xs">
<?php if (!in_array(session('userroleid'), [3, 4])): ?>
<li x-show="req.ISVAL == 1 && req.ISPENDING != 1 && (req.VAL1USER == '<?= session('userid'); ?>' || req.VAL2USER == '<?= session('userid'); ?>')"> <li x-show="req.ISVAL == 1 && req.ISPENDING != 1 && (req.VAL1USER == '<?= session('userid'); ?>' || req.VAL2USER == '<?= session('userid'); ?>')">
<?php if (session()->get('userlevel') <= 1): ?> <?php if (session()->get('userlevel') <= 1): ?>
<a @click="openUnvalDialog(req.SP_ACCESSNUMBER)" class="text-error hover:bg-error/10"> <a @click="openUnvalDialog(req.SP_ACCESSNUMBER)" class="text-error hover:bg-error/10">
@ -327,6 +329,7 @@ $previewEnabled = $configFile[$configKey]['previewEnabled'] ?? false;
</a> </a>
<?php endif; ?> <?php endif; ?>
</li> </li>
<?php endif; ?>
<li> <li>
<a @click="openSampleDialog(req.SP_ACCESSNUMBER)"> <a @click="openSampleDialog(req.SP_ACCESSNUMBER)">
<i class="fa fa-vial mr-2 text-success"></i> View Samples <i class="fa fa-vial mr-2 text-success"></i> View Samples
@ -339,7 +342,6 @@ $previewEnabled = $configFile[$configKey]['previewEnabled'] ?? false;
</li> </li>
</ul> </ul>
</div> </div>
<?php endif; ?>
</td> </td>
</tr> </tr>
</template> </template>