Major Updates:
1. Extended Audit Trail System
- Added tube received events tracking from SP_TUBES table (TUBESTATUS=4)
- New audit tab "Receive" in dialog_audit.php to display tube reception history
- ApiRequestsAuditController now fetches and returns tube received events with:
* Sample type, tube status, collection date, and user information
- Audit events sorted chronologically combining validation, sampling, and receiving events
2. Enhanced PDF Generation Workflow
- Created new PdfHelper library with methods for PDF generation and posting to spooler
- Reports can now be generated via GET /report/{accessnumber}/pdf endpoint
- Updated PDF spooler API endpoint from port 3030 to 3000
- Added retry PDF button with spinner animation for failed generations
- Fixed PDF status check to use correct spooler endpoint
3. Validation UI Improvements
- Added toast notification showing PDF queued after second validation (val2)
- Retry PDF button appears when val1 and val2 are complete
- Toast notifications success/error states with auto-dismiss after 2 seconds
- Loading state with spinning icon during PDF retry operation
4. Report Template Fixes
- Fixed typo in Val2 By display (added missing ":")
- Consistent formatting with Val1 By : and Val2 By :
5. Documentation Updates
- TODO.md updated with:
* Auto generate PDF (in progress)
* Print Eng Result (pending)
* Add Receive to Audit (completed)
6. Cleanup
- Removed legacy Node.js spooler implementation (node_spooler directory)
- Deleted P0_log.txt (SQL setup scripts no longer needed in repo)
- Cleaned up .gitignore to remove stale node_spooler entries
Files Changed:
- app/Controllers/ApiRequestsAuditController.php (tube received audit)
- app/Controllers/ReportController.php (port update: 3030 → 3000)
- app/Libraries/PdfHelper.php (new library)
- app/Views/report/template.php (typo fix)
- app/Views/shared/content_requests.php (retry PDF button)
- app/Views/shared/dialog_audit.php (receive tab)
- app/Views/shared/script_requests.php (retry handler, tube events)
- app/Views/shared/script_validation.php (enhanced toast)
- TODO.md (pending/completed tasks)
- .gitignore (cleanup)
- Deleted: node_spooler/* (legacy implementation)
- Deleted: P0_log.txt (no longer needed)
151 lines
4.9 KiB
PHP
151 lines
4.9 KiB
PHP
<?php
|
|
namespace App\Controllers;
|
|
|
|
use App\Controllers\BaseController;
|
|
|
|
class ReportController extends BaseController
|
|
{
|
|
protected $db;
|
|
protected $reportHelper;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->db = \Config\Database::connect();
|
|
$this->reportHelper = new \App\Libraries\ReportHelper($this->db);
|
|
helper(['url', 'text']);
|
|
}
|
|
|
|
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])) {
|
|
return $this->response->setStatusCode(403)->setJSON(['message' => 'Unauthorized']);
|
|
}
|
|
|
|
$data = $this->reportHelper->getReportData($accessnumber, $eng);
|
|
$data['eng'] = $eng;
|
|
$data['accessnumber'] = $accessnumber;
|
|
$data['ispdf'] = $ispdf;
|
|
|
|
if ($shouldLog == true) {
|
|
$this->logPrintAudit($accessnumber, $data['status']);
|
|
}
|
|
|
|
return view('report/template', $data);
|
|
}
|
|
|
|
private function logPrintAudit($accessnumber, $status)
|
|
{
|
|
$sql = "INSERT INTO GDC_CMOD.dbo.AUDIT_REQUESTS(ACCESSNUMBER, STEPDATE, STEPTYPE, STEPSTATUS)
|
|
VALUES(?, GETDATE(), 'PRINT', ?)";
|
|
$this->db->query($sql, [$accessnumber, $status]);
|
|
}
|
|
|
|
public function preview($accessnumber)
|
|
{
|
|
$eng = $this->request->getVar('eng') ?? 0;
|
|
return $this->renderReport($accessnumber, $eng, 0, false);
|
|
}
|
|
|
|
public function generatePdf($accessnumber)
|
|
{
|
|
$userroleid = session()->get('userroleid');
|
|
if (!in_array($userroleid, [0, 1, 2, 4])) {
|
|
return $this->response->setStatusCode(403)->setJSON(['success' => false, 'error' => 'Unauthorized']);
|
|
}
|
|
|
|
$eng = $this->request->getVar('eng') ?? 0;
|
|
$data = $this->reportHelper->getReportData($accessnumber, $eng);
|
|
$data['eng'] = $eng;
|
|
$data['accessnumber'] = $accessnumber;
|
|
$data['ispdf'] = 1;
|
|
|
|
$html = view('report/template', $data);
|
|
$filename = $accessnumber . '.pdf';
|
|
|
|
try {
|
|
$jobId = $this->postToSpooler($html, $filename);
|
|
return $this->response->setJSON([
|
|
'success' => true,
|
|
'jobId' => $jobId,
|
|
'message' => 'PDF queued for generation',
|
|
'status' => 'queued'
|
|
]);
|
|
} catch (\Exception $e) {
|
|
log_message('error', "PDF generation failed: " . $e->getMessage());
|
|
return $this->response->setStatusCode(500)->setJSON([
|
|
'success' => false,
|
|
'error' => 'Failed to queue PDF generation'
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function checkPdfStatus($jobId)
|
|
{
|
|
$ch = curl_init();
|
|
curl_setopt($ch, CURLOPT_URL, "http://glenlis:3000/api/pdf/status/$jobId");
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
|
|
|
|
$response = curl_exec($ch);
|
|
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
curl_close($ch);
|
|
|
|
if ($httpCode !== 200) {
|
|
log_message('error', "Spooler status check returned HTTP $httpCode");
|
|
return $this->response->setStatusCode(500)->setJSON([
|
|
'success' => false,
|
|
'error' => 'Failed to check job status'
|
|
]);
|
|
}
|
|
|
|
return $this->response->setJSON($response);
|
|
}
|
|
|
|
private function postToSpooler($html, $filename)
|
|
{
|
|
$ch = curl_init();
|
|
curl_setopt($ch, CURLOPT_URL, 'http://glenlis:3000/api/pdf/generate');
|
|
curl_setopt($ch, CURLOPT_POST, 1);
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
|
|
'html' => $html,
|
|
'filename' => $filename
|
|
]));
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
|
'Content-Type: application/json'
|
|
]);
|
|
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
|
|
|
|
$response = curl_exec($ch);
|
|
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
curl_close($ch);
|
|
|
|
if ($httpCode !== 200) {
|
|
log_message('error', "Spooler API returned HTTP $httpCode");
|
|
throw new \Exception('Failed to queue PDF generation');
|
|
}
|
|
|
|
$data = json_decode($response, true);
|
|
return $data['jobId'];
|
|
}
|
|
}
|