gdc_cmod/app/Config/Routes.php
mahdahar 848d8d663f 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
2026-02-03 07:26:41 +07:00

105 lines
4.0 KiB
PHP

<?php
use CodeIgniter\Router\RouteCollection;
$routes->set404Override(function () {
$response = service('response');
$response->setStatusCode(404);
echo view('errors/notfound');
});
$routes->get('/unauthorized', 'ErrorPage::unauthorized');
$routes->get('/', 'Home::index');
$routes->get('/login', 'AuthController::loginPage', ['filter' => 'guest']);
$routes->post('/login', 'AuthController::login', ['filter' => 'guest']);
$routes->get('/logout', 'AuthController::logout');
$routes->patch('/setPassword', 'AuthController::setPassword');
$routes->get('label/coll/(:any)', 'LabelController::coll/$1');
$routes->get('label/dispatch/(:any)/(:any)', 'LabelController::dispatch/$1/$2');
$routes->get('label/all/(:any)', 'LabelController::print_all/$1');
$routes->get('print/(:num)', 'Home::printReport/$1', ['filter' => 'role:0,1,2,3,4']);
// --- API Group ---
$routes->group('api', function ($routes) {
// Users Management - Only Superuser (0) and Admin (1)
$routes->group('users', ['filter' => 'role:0,1'], function ($routes) {
$routes->get('', 'UsersController::index');
$routes->post('', 'UsersController::create');
$routes->patch('(:any)', 'UsersController::update/$1');
$routes->delete('(:any)', 'UsersController::delete/$1');
});
// Requests - All Roles (0,1,2,3,4)
$routes->group('requests', ['filter' => 'role:0,1,2,3,4'], function ($routes) {
$routes->get('', 'RequestsController::index');
$routes->get('(:any)/audit', 'ApiRequestsAuditController::show/$1');
$routes->post('validate/(:any)', 'RequestsController::val/$1');
$routes->delete('validate/(:any)', 'RequestsController::unval/$1');
});
// Validate API - Lab (2), Admin (1), Superuser (0)
$routes->group('validate', ['filter' => 'role:0,1,2'], function ($routes) {
$routes->get('unvalidated', 'ApiValidateController::unvalidated');
});
// Samples
$routes->group('samples', function ($routes) {
// Collect & Show - All Roles
$routes->group('', ['filter' => 'role:0,1,2,3,4'], function ($routes) {
$routes->post('collect/(:any)', 'SamplesController::collect/$1');
$routes->get('(:any)', 'SamplesController::show/$1');
});
// Unreceive - Only Superuser (0) and Admin (1)
$routes->group('', ['filter' => 'role:0,1'], function ($routes) {
$routes->delete('receive/(:any)', 'SamplesController::unreceive/$1');
});
});
});
// --- Page Routes ---
$routes->group('superuser', ['filter' => 'role:0'], function ($routes) {
$routes->get('', 'Pages\SuperuserController::index');
$routes->get('users', 'Pages\SuperuserController::users');
$routes->get('validate', 'Pages\SuperuserController::validatePage');
});
$routes->group('admin', ['filter' => 'role:1'], function ($routes) {
$routes->get('', 'Pages\AdminController::index');
$routes->get('users', 'Pages\AdminController::users');
$routes->get('validate', 'Pages\AdminController::validationPage');
});
$routes->group('lab', ['filter' => 'role:2'], function ($routes) {
$routes->get('', 'Pages\LabController::index');
$routes->get('validate', 'Pages\LabController::validationPage');
});
$routes->group('phlebo', ['filter' => 'role:3'], function ($routes) {
$routes->get('', 'Pages\PhlebotomistController::index');
});
$routes->group('cs', ['filter' => 'role:4'], function ($routes) {
$routes->get('', 'Pages\CsController::index');
});
$routes->get('/dummypage', 'Home::dummyPage');
// 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)/eng', 'ReportController::generate/$1/1');
$routes->get('(:num)/print', 'ReportController::print/$1');
$routes->get('(:num)/print/eng', 'ReportController::print/$1/1');
});
// Keep backward compatibility - updated filter
$routes->get('print/(:num)', 'ReportController::generate/$1', ['filter' => 'role:0,1,2,3,4']);