From 1328fed57bfafe6c3f1ce41a91bb221f2e643d1a Mon Sep 17 00:00:00 2001 From: mikael-zakaria Date: Thu, 19 Feb 2026 08:53:25 +0700 Subject: [PATCH] Update Certificare V1 --- app/Config/Routes.php | 21 + app/Controllers/Certificates.php | 1156 +++++++++++++++++ app/Views/certificate_calibration_index.php | 655 ++++++++++ app/Views/certificate_index.php | 577 ++++++++ app/Views/certificate_maintenance_index.php | 361 +++++ app/Views/certificate_training_index.php | 361 +++++ .../certificate_bc5140_calibration.php | 403 ++++++ .../certificate_bc760r_calibration.php | 418 ++++++ .../certificate_bs430_calibration.php | 283 ++++ .../certificate_cl900i_calibration.php | 306 +++++ .../certificate_jokoh_calibration.php | 274 ++++ .../certificate_tms24i_calibration.php | 302 +++++ .../certificate_tms30i_calibration.php | 312 +++++ .../certificate_tms50i_calibration.php | 301 +++++ .../certificates/certificate_maintenance.php | 183 +++ .../certificate_maintenance_index.php | 545 ++++++++ .../certificates/certificate_training.php | 150 +++ app/Views/layouts/_sidebar.php | 15 +- .../background_certificate/maintenance.jpeg | Bin 0 -> 95661 bytes 19 files changed, 6620 insertions(+), 3 deletions(-) create mode 100644 app/Controllers/Certificates.php create mode 100644 app/Views/certificate_calibration_index.php create mode 100644 app/Views/certificate_index.php create mode 100644 app/Views/certificate_maintenance_index.php create mode 100644 app/Views/certificate_training_index.php create mode 100644 app/Views/certificates/callibrations_template/certificate_bc5140_calibration.php create mode 100644 app/Views/certificates/callibrations_template/certificate_bc760r_calibration.php create mode 100644 app/Views/certificates/callibrations_template/certificate_bs430_calibration.php create mode 100644 app/Views/certificates/callibrations_template/certificate_cl900i_calibration.php create mode 100644 app/Views/certificates/callibrations_template/certificate_jokoh_calibration.php create mode 100644 app/Views/certificates/callibrations_template/certificate_tms24i_calibration.php create mode 100644 app/Views/certificates/callibrations_template/certificate_tms30i_calibration.php create mode 100644 app/Views/certificates/callibrations_template/certificate_tms50i_calibration.php create mode 100644 app/Views/certificates/certificate_maintenance.php create mode 100644 app/Views/certificates/certificate_maintenance_index.php create mode 100644 app/Views/certificates/certificate_training.php create mode 100644 public/assets/images/background_certificate/maintenance.jpeg diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 1566b77..b0c1094 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -206,6 +206,27 @@ $routes->match(['get', 'post'], '/guidebook/edit/(:any)', 'Guidebook::edit/$1'); $routes->get('/guidebook/delete/(:num)', 'Guidebook::delete/$1'); +// Certificates +$routes->group('certificates', function($routes) { + + // Untuk Index + $routes->get('/', 'Certificates::index'); + + // Untuk Index Tiap Menu + $routes->get('training', 'Certificates::trainingIndex'); + $routes->get('calibration', 'Certificates::calibrateIndex'); + $routes->get('maintenance', 'Certificates::maintenanceIndex'); + + // Untuk View Cerificate + $routes->get('training/show/(:any)', 'Certificates::createTraining/$1'); + $routes->get('calibration/show/(:any)/(:any)', 'Certificates::createCalibrate/$1/$2'); + $routes->get('maintenance/show/(:any)', 'Certificates::createMaintenance/$1'); + + // $routes->get('view/(:any)', 'Certificates::view/$1'); + // $routes->get('get/(:any)', 'Certificates::get/$1'); +}); + + // Groups $routes->get('/mailgroups', 'Mailgroups::index'); diff --git a/app/Controllers/Certificates.php b/app/Controllers/Certificates.php new file mode 100644 index 0000000..614d665 --- /dev/null +++ b/app/Controllers/Certificates.php @@ -0,0 +1,1156 @@ + 'CERT001', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-001', + // 'type' => 'calibration', + // 'issuedate' => '2024-01-15', + // 'expirydate' => '2025-01-15', + // 'vendor' => 'Summit Calibration Lab' + // ], + // [ + // 'certid' => 'CERT002', + // 'certname' => 'CL900i Operator Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-002', + // 'type' => 'training', + // 'issuedate' => '2024-03-20', + // 'expirydate' => '2025-03-20', + // 'vendor' => 'Summit Training Center' + // ], + // [ + // 'certid' => 'CERT003', + // 'certname' => 'CL900i Maintenance Record', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-003', + // 'type' => 'maintenance', + // 'issuedate' => '2024-06-10', + // 'expirydate' => '2024-12-10', + // 'vendor' => 'Summit Service Team' + // ] + // ]; + + // // Data dummy untuk products dropdown + // // $products = [ + // // ['productid' => '1', 'productname' => 'CL900i', 'productnumber' => 'SN-2024-001'], + // // ['productid' => '2', 'productname' => 'CL900i', 'productnumber' => 'SN-2024-002'], + // // ['productid' => '3', 'productname' => 'CL900i', 'productnumber' => 'SN-2024-003'] + // // ]; + + // $data = [ + // 'certificates' => $certificates, + // // 'products' => $products + // ]; + + // return view('certificate_index', $data); + // } + // public function view($certid = null) { + // if (!$certid) { + // return $this->response->setStatusCode(400)->setJSON(['error' => 'Certificate ID is required']); + // } + + // // Get certificate data from dummy data + // $certificates = [ + // [ + // 'certid' => 'CERT001', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-001', + // 'type' => 'calibration', + // 'issuedate' => '2024-01-15', + // 'expirydate' => '2025-01-15', + // 'vendor' => 'Summit Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment. All parameters verified and within specifications.' + // ], + // [ + // 'certid' => 'CERT002', + // 'certname' => 'CL900i Operator Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-002', + // 'type' => 'training', + // 'issuedate' => '2024-03-20', + // 'expirydate' => '2025-03-20', + // 'vendor' => 'Summit Training Center', + // 'description' => 'Operator training completion certificate. Covers basic operation and safety procedures.' + // ], + // [ + // 'certid' => 'CERT003', + // 'certname' => 'CL900i Maintenance Record', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-003', + // 'type' => 'maintenance', + // 'issuedate' => '2024-06-10', + // 'expirydate' => '2024-12-10', + // 'vendor' => 'Summit Service Team', + // 'description' => 'Regular maintenance record for CL900i equipment. All components checked and serviced.' + // ], + // [ + // 'certid' => 'CERT004', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-004', + // 'type' => 'calibration', + // 'issuedate' => '2023-11-01', + // 'expirydate' => '2024-11-01', + // 'vendor' => 'External Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment. All parameters verified and within specifications.' + // ], + // [ + // 'certid' => 'CERT005', + // 'certname' => 'CL900i Advanced Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-005', + // 'type' => 'training', + // 'issuedate' => '2024-05-15', + // 'expirydate' => '2025-05-15', + // 'vendor' => 'Summit Training Center', + // 'description' => 'Advanced training completion certificate. Covers advanced operation and troubleshooting procedures.' + // ], + // [ + // 'certid' => 'CERT006', + // 'certname' => 'CL900i Annual Maintenance', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-006', + // 'type' => 'maintenance', + // 'issuedate' => '2024-01-01', + // 'expirydate' => '2025-01-01', + // 'vendor' => 'Summit Service Team', + // 'description' => 'Annual maintenance record for CL900i equipment. All components checked and serviced.' + // ], + // [ + // 'certid' => 'CERT007', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-007', + // 'type' => 'calibration', + // 'issuedate' => '2024-02-28', + // 'expirydate' => '2025-02-28', + // 'vendor' => 'Summit Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment. All parameters verified and within specifications.' + // ], + // [ + // 'certid' => 'CERT008', + // 'certname' => 'CL900i Safety Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-008', + // 'type' => 'training', + // 'issuedate' => '2024-04-10', + // 'expirydate' => '2025-04-10', + // 'vendor' => 'External Safety Institute', + // 'description' => 'Safety training completion certificate. Covers safety procedures and emergency protocols.' + // ], + // [ + // 'certid' => 'CERT009', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-009', + // 'type' => 'calibration', + // 'issuedate' => '2024-07-20', + // 'expirydate' => '2025-07-20', + // 'vendor' => 'Summit Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment. All parameters verified and within specifications.' + // ], + // [ + // 'certid' => 'CERT010', + // 'certname' => 'CL900i Technical Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-010', + // 'type' => 'training', + // 'issuedate' => '2024-08-05', + // 'expirydate' => '2025-08-05', + // 'vendor' => 'Summit Training Center', + // 'description' => 'Technical training completion certificate. Covers technical specifications and maintenance procedures.' + // ], + // [ + // 'certid' => 'CERT011', + // 'certname' => 'CL900i Maintenance Record', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-011', + // 'type' => 'maintenance', + // 'issuedate' => '2024-09-15', + // 'expirydate' => '2025-03-15', + // 'vendor' => 'Summit Service Team', + // 'description' => 'Regular maintenance record for CL900i equipment. All components checked and serviced.' + // ], + // [ + // 'certid' => 'CERT012', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-012', + // 'type' => 'calibration', + // 'issuedate' => '2024-10-01', + // 'expirydate' => '2025-10-01', + // 'vendor' => 'External Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment. All parameters verified and within specifications.' + // ], + // [ + // 'certid' => 'CERT013', + // 'certname' => 'CL900i Basic Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-013', + // 'type' => 'training', + // 'issuedate' => '2024-11-20', + // 'expirydate' => '2025-11-20', + // 'vendor' => 'Summit Training Center', + // 'description' => 'Basic training completion certificate. Covers basic operation procedures.' + // ], + // [ + // 'certid' => 'CERT014', + // 'certname' => 'CL900i Maintenance Record', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-014', + // 'type' => 'maintenance', + // 'issuedate' => '2024-12-01', + // 'expirydate' => '2025-06-01', + // 'vendor' => 'Summit Service Team', + // 'description' => 'Regular maintenance record for CL900i equipment. All components checked and serviced.' + // ], + // [ + // 'certid' => 'CERT015', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-015', + // 'type' => 'calibration', + // 'issuedate' => '2024-01-10', + // 'expirydate' => '2025-01-10', + // 'vendor' => 'Summit Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment. All parameters verified and within specifications.' + // ], + // [ + // 'certid' => 'CERT016', + // 'certname' => 'CL900i Operator Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-016', + // 'type' => 'training', + // 'issuedate' => '2024-02-15', + // 'expirydate' => '2025-02-15', + // 'vendor' => 'External Training Institute', + // 'description' => 'Operator training completion certificate. Covers basic operation and safety procedures.' + // ], + // [ + // 'certid' => 'CERT017', + // 'certname' => 'CL900i Maintenance Record', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-017', + // 'type' => 'maintenance', + // 'issuedate' => '2024-03-25', + // 'expirydate' => '2024-09-25', + // 'vendor' => 'Summit Service Team', + // 'description' => 'Regular maintenance record for CL900i equipment. All components checked and serviced.' + // ], + // [ + // 'certid' => 'CERT018', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-018', + // 'type' => 'calibration', + // 'issuedate' => '2024-04-30', + // 'expirydate' => '2025-04-30', + // 'vendor' => 'Summit Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment. All parameters verified and within specifications.' + // ], + // [ + // 'certid' => 'CERT019', + // 'certname' => 'CL900i Advanced Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-019', + // 'type' => 'training', + // 'issuedate' => '2024-05-20', + // 'expirydate' => '2025-05-20', + // 'vendor' => 'Summit Training Center', + // 'description' => 'Advanced training completion certificate. Covers advanced operation and troubleshooting procedures.' + // ], + // [ + // 'certid' => 'CERT020', + // 'certname' => 'CL900i Maintenance Record', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-020', + // 'type' => 'maintenance', + // 'issuedate' => '2024-06-15', + // 'expirydate' => '2024-12-15', + // 'vendor' => 'External Service Provider', + // 'description' => 'Regular maintenance record for CL900i equipment. All components checked and serviced.' + // ], + // [ + // 'certid' => 'CERT021', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-021', + // 'type' => 'calibration', + // 'issuedate' => '2024-07-10', + // 'expirydate' => '2025-07-10', + // 'vendor' => 'Summit Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment. All parameters verified and within specifications.' + // ], + // [ + // 'certid' => 'CERT022', + // 'certname' => 'CL900i Safety Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-022', + // 'type' => 'training', + // 'issuedate' => '2024-08-25', + // 'expirydate' => '2025-08-25', + // 'vendor' => 'External Safety Institute', + // 'description' => 'Safety training completion certificate. Covers safety procedures and emergency protocols.' + // ], + // [ + // 'certid' => 'CERT023', + // 'certname' => 'CL900i Maintenance Record', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-023', + // 'type' => 'maintenance', + // 'issuedate' => '2024-09-05', + // 'expirydate' => '2025-03-05', + // 'vendor' => 'Summit Service Team', + // 'description' => 'Regular maintenance record for CL900i equipment. All components checked and serviced.' + // ], + // [ + // 'certid' => 'CERT024', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-024', + // 'type' => 'calibration', + // 'issuedate' => '2024-10-15', + // 'expirydate' => '2025-10-15', + // 'vendor' => 'External Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment. All parameters verified and within specifications.' + // ], + // [ + // 'certid' => 'CERT025', + // 'certname' => 'CL900i Technical Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-025', + // 'type' => 'training', + // 'issuedate' => '2024-11-10', + // 'expirydate' => '2025-11-10', + // 'vendor' => 'Summit Training Center', + // 'description' => 'Technical training completion certificate. Covers technical specifications and maintenance procedures.' + // ], + // [ + // 'certid' => 'CERT026', + // 'certname' => 'CL900i Maintenance Record', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-026', + // 'type' => 'maintenance', + // 'issuedate' => '2024-12-20', + // 'expirydate' => '2025-06-20', + // 'vendor' => 'Summit Service Team', + // 'description' => 'Regular maintenance record for CL900i equipment. All components checked and serviced.' + // ], + // [ + // 'certid' => 'CERT027', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-027', + // 'type' => 'calibration', + // 'issuedate' => '2024-01-05', + // 'expirydate' => '2025-01-05', + // 'vendor' => 'Summit Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment. All parameters verified and within specifications.' + // ], + // [ + // 'certid' => 'CERT028', + // 'certname' => 'CL900i Operator Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-028', + // 'type' => 'training', + // 'issuedate' => '2024-02-20', + // 'expirydate' => '2025-02-20', + // 'vendor' => 'External Training Institute', + // 'description' => 'Operator training completion certificate. Covers basic operation and safety procedures.' + // ], + // [ + // 'certid' => 'CERT029', + // 'certname' => 'CL900i Maintenance Record', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-029', + // 'type' => 'maintenance', + // 'issuedate' => '2024-03-10', + // 'expirydate' => '2024-09-10', + // 'vendor' => 'Summit Service Team', + // 'description' => 'Regular maintenance record for CL900i equipment. All components checked and serviced.' + // ], + // [ + // 'certid' => 'CERT030', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-030', + // 'type' => 'calibration', + // 'issuedate' => '2024-04-25', + // 'expirydate' => '2025-04-25', + // 'vendor' => 'Summit Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment. All parameters verified and within specifications.' + // ] + // ]; + + // $certificate = null; + // foreach ($certificates as $cert) { + // if ($cert['certid'] === $certid) { + // $certificate = $cert; + // break; + // } + // } + + // if (!$certificate) { + // return $this->response->setStatusCode(404)->setJSON(['error' => 'Certificate not found']); + // } + + // // Generate PDF based on type + // return $this->generatePDF($certificate, $certificate['type']); + // } + // public function get($certid = null) { + // $certificates = [ + // [ + // 'certid' => 'CERT001', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-001', + // 'type' => 'calibration', + // 'issuedate' => '2024-01-15', + // 'expirydate' => '2025-01-15', + // 'vendor' => 'Summit Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT002', + // 'certname' => 'CL900i Operator Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-002', + // 'type' => 'training', + // 'issuedate' => '2024-03-20', + // 'expirydate' => '2025-03-20', + // 'vendor' => 'Summit Training Center', + // 'description' => 'Operator training completion certificate.' + // ], + // [ + // 'certid' => 'CERT003', + // 'certname' => 'CL900i Maintenance Record', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-003', + // 'type' => 'maintenance', + // 'issuedate' => '2024-06-10', + // 'expirydate' => '2024-12-10', + // 'vendor' => 'Summit Service Team', + // 'description' => 'Regular maintenance record for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT004', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-004', + // 'type' => 'calibration', + // 'issuedate' => '2023-11-01', + // 'expirydate' => '2024-11-01', + // 'vendor' => 'External Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT005', + // 'certname' => 'CL900i Advanced Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-005', + // 'type' => 'training', + // 'issuedate' => '2024-05-15', + // 'expirydate' => '2025-05-15', + // 'vendor' => 'Summit Training Center', + // 'description' => 'Advanced training completion certificate.' + // ], + // [ + // 'certid' => 'CERT006', + // 'certname' => 'CL900i Annual Maintenance', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-006', + // 'type' => 'maintenance', + // 'issuedate' => '2024-01-01', + // 'expirydate' => '2025-01-01', + // 'vendor' => 'Summit Service Team', + // 'description' => 'Annual maintenance record for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT007', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-007', + // 'type' => 'calibration', + // 'issuedate' => '2024-02-28', + // 'expirydate' => '2025-02-28', + // 'vendor' => 'Summit Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT008', + // 'certname' => 'CL900i Safety Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-008', + // 'type' => 'training', + // 'issuedate' => '2024-04-10', + // 'expirydate' => '2025-04-10', + // 'vendor' => 'External Safety Institute', + // 'description' => 'Safety training completion certificate.' + // ], + // [ + // 'certid' => 'CERT009', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-009', + // 'type' => 'calibration', + // 'issuedate' => '2024-07-20', + // 'expirydate' => '2025-07-20', + // 'vendor' => 'Summit Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT010', + // 'certname' => 'CL900i Technical Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-010', + // 'type' => 'training', + // 'issuedate' => '2024-08-05', + // 'expirydate' => '2025-08-05', + // 'vendor' => 'Summit Training Center', + // 'description' => 'Technical training completion certificate.' + // ], + // [ + // 'certid' => 'CERT011', + // 'certname' => 'CL900i Maintenance Record', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-011', + // 'type' => 'maintenance', + // 'issuedate' => '2024-09-15', + // 'expirydate' => '2025-03-15', + // 'vendor' => 'Summit Service Team', + // 'description' => 'Regular maintenance record for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT012', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-012', + // 'type' => 'calibration', + // 'issuedate' => '2024-10-01', + // 'expirydate' => '2025-10-01', + // 'vendor' => 'External Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT013', + // 'certname' => 'CL900i Basic Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-013', + // 'type' => 'training', + // 'issuedate' => '2024-11-20', + // 'expirydate' => '2025-11-20', + // 'vendor' => 'Summit Training Center', + // 'description' => 'Basic training completion certificate.' + // ], + // [ + // 'certid' => 'CERT014', + // 'certname' => 'CL900i Maintenance Record', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-014', + // 'type' => 'maintenance', + // 'issuedate' => '2024-12-01', + // 'expirydate' => '2025-06-01', + // 'vendor' => 'Summit Service Team', + // 'description' => 'Regular maintenance record for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT015', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-015', + // 'type' => 'calibration', + // 'issuedate' => '2024-01-10', + // 'expirydate' => '2025-01-10', + // 'vendor' => 'Summit Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT016', + // 'certname' => 'CL900i Operator Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-016', + // 'type' => 'training', + // 'issuedate' => '2024-02-15', + // 'expirydate' => '2025-02-15', + // 'vendor' => 'External Training Institute', + // 'description' => 'Operator training completion certificate.' + // ], + // [ + // 'certid' => 'CERT017', + // 'certname' => 'CL900i Maintenance Record', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-017', + // 'type' => 'maintenance', + // 'issuedate' => '2024-03-25', + // 'expirydate' => '2024-09-25', + // 'vendor' => 'Summit Service Team', + // 'description' => 'Regular maintenance record for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT018', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-018', + // 'type' => 'calibration', + // 'issuedate' => '2024-04-30', + // 'expirydate' => '2025-04-30', + // 'vendor' => 'Summit Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT019', + // 'certname' => 'CL900i Advanced Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-019', + // 'type' => 'training', + // 'issuedate' => '2024-05-20', + // 'expirydate' => '2025-05-20', + // 'vendor' => 'Summit Training Center', + // 'description' => 'Advanced training completion certificate.' + // ], + // [ + // 'certid' => 'CERT020', + // 'certname' => 'CL900i Maintenance Record', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-020', + // 'type' => 'maintenance', + // 'issuedate' => '2024-06-15', + // 'expirydate' => '2024-12-15', + // 'vendor' => 'External Service Provider', + // 'description' => 'Regular maintenance record for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT021', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-021', + // 'type' => 'calibration', + // 'issuedate' => '2024-07-10', + // 'expirydate' => '2025-07-10', + // 'vendor' => 'Summit Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT022', + // 'certname' => 'CL900i Safety Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-022', + // 'type' => 'training', + // 'issuedate' => '2024-08-25', + // 'expirydate' => '2025-08-25', + // 'vendor' => 'External Safety Institute', + // 'description' => 'Safety training completion certificate.' + // ], + // [ + // 'certid' => 'CERT023', + // 'certname' => 'CL900i Maintenance Record', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-023', + // 'type' => 'maintenance', + // 'issuedate' => '2024-09-05', + // 'expirydate' => '2025-03-05', + // 'vendor' => 'Summit Service Team', + // 'description' => 'Regular maintenance record for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT024', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-024', + // 'type' => 'calibration', + // 'issuedate' => '2024-10-15', + // 'expirydate' => '2025-10-15', + // 'vendor' => 'External Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT025', + // 'certname' => 'CL900i Technical Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-025', + // 'type' => 'training', + // 'issuedate' => '2024-11-10', + // 'expirydate' => '2025-11-10', + // 'vendor' => 'Summit Training Center', + // 'description' => 'Technical training completion certificate.' + // ], + // [ + // 'certid' => 'CERT026', + // 'certname' => 'CL900i Maintenance Record', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-026', + // 'type' => 'maintenance', + // 'issuedate' => '2024-12-20', + // 'expirydate' => '2025-06-20', + // 'vendor' => 'Summit Service Team', + // 'description' => 'Regular maintenance record for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT027', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-027', + // 'type' => 'calibration', + // 'issuedate' => '2024-01-05', + // 'expirydate' => '2025-01-05', + // 'vendor' => 'Summit Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT028', + // 'certname' => 'CL900i Operator Training', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-028', + // 'type' => 'training', + // 'issuedate' => '2024-02-20', + // 'expirydate' => '2025-02-20', + // 'vendor' => 'External Training Institute', + // 'description' => 'Operator training completion certificate.' + // ], + // [ + // 'certid' => 'CERT029', + // 'certname' => 'CL900i Maintenance Record', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-029', + // 'type' => 'maintenance', + // 'issuedate' => '2024-03-10', + // 'expirydate' => '2024-09-10', + // 'vendor' => 'Summit Service Team', + // 'description' => 'Regular maintenance record for CL900i equipment.' + // ], + // [ + // 'certid' => 'CERT030', + // 'certname' => 'CL900i Calibration Certificate', + // 'productname' => 'CL900i', + // 'productnumber' => 'SN-2024-030', + // 'type' => 'calibration', + // 'issuedate' => '2024-04-25', + // 'expirydate' => '2025-04-25', + // 'vendor' => 'Summit Calibration Lab', + // 'description' => 'Annual calibration certificate for CL900i equipment.' + // ] + // ]; + + // foreach ($certificates as $cert) { + // if ($cert['certid'] === $certid) { + // return $this->response->setJSON($cert); + // } + // } + + // return $this->response->setStatusCode(404)->setJSON(['error' => 'Certificate not found']); + // } + + // Untuk Tampilan List Sertifikat + public function trainingIndex() { + + $certificates = [ + [ + 'certid' => 'CERT002', + 'certname' => 'Jokoh Calibration Certificate', + 'productname' => 'Jokoh', + 'productnumber' => 'SN-2024-001', + 'issuedate' => '2024-01-15', + 'expirydate' => '2025-01-15', + 'vendor' => 'Summit Calibration Lab' + ] + ]; + $data = ['certificates' => $certificates]; + + return view('certificate_training_index', $data); + } + public function calibrateIndex() { + + $certificates = [ + [ + 'certid' => 'CERT001', + 'certname' => 'TMS50i Calibration Certificate', + 'productname' => 'tms50i', + 'productnumber' => 'SN-2024-001', + 'type' => 'calibration', + 'issuedate' => '2024-01-15', + 'expirydate' => '2025-01-15', + 'vendor' => 'Summit Calibration Lab', + 'description' => 'Annual calibration certificate for TMS50i equipment.' + ], + [ + 'certid' => 'CERT002', + 'certname' => 'TMS24i Calibration Certificate', + 'productname' => 'tms24i', + 'productnumber' => 'SN-2024-002', + 'type' => 'calibration', + 'issuedate' => '2024-01-16', + 'expirydate' => '2025-01-16', + 'vendor' => 'Summit Calibration Lab', + 'description' => 'Annual calibration certificate for tms24i equipment.' + ], + [ + 'certid' => 'CERT003', + 'certname' => 'tms30i Calibration Certificate', + 'productname' => 'tms30i', + 'productnumber' => 'SN-2024-003', + 'type' => 'calibration', + 'issuedate' => '2024-01-17', + 'expirydate' => '2025-01-17', + 'vendor' => 'Summit Calibration Lab', + 'description' => 'Annual calibration certificate for tms30i equipment.' + ], + [ + 'certid' => 'CERT004', + 'certname' => 'BS430 Calibration Certificate', + 'productname' => 'bs430', + 'productnumber' => 'SN-2024-004', + 'type' => 'calibration', + 'issuedate' => '2024-01-18', + 'expirydate' => '2025-01-18', + 'vendor' => 'Summit Calibration Lab', + 'description' => 'Annual calibration certificate for BS430 equipment.' + ], + [ + 'certid' => 'CERT005', + 'certname' => 'CL900i Calibration Certificate', + 'productname' => 'cl900i', + 'productnumber' => 'SN-2024-005', + 'type' => 'calibration', + 'issuedate' => '2024-01-19', + 'expirydate' => '2025-01-19', + 'vendor' => 'Summit Calibration Lab', + 'description' => 'Annual calibration certificate for CL900i equipment.' + ], + [ + 'certid' => 'CERT006', + 'certname' => 'Jokoh Calibration Certificate', + 'productname' => 'jokoh', + 'productnumber' => 'SN-2024-006', + 'type' => 'calibration', + 'issuedate' => '2024-01-20', + 'expirydate' => '2025-01-20', + 'vendor' => 'Summit Calibration Lab', + 'description' => 'Annual calibration certificate for Jokoh equipment.' + ], + [ + 'certid' => 'CERT007', + 'certname' => 'BC760R Calibration Certificate', + 'productname' => 'bc760r', + 'productnumber' => 'SN-2024-007', + 'type' => 'calibration', + 'issuedate' => '2024-01-21', + 'expirydate' => '2025-01-21', + 'vendor' => 'Summit Calibration Lab', + 'description' => 'Annual calibration certificate for BC760R equipment.' + ], + [ + 'certid' => 'CERT008', + 'certname' => 'BC5140 Calibration Certificate', + 'productname' => 'bc5140', + 'productnumber' => 'SN-2024-008', + 'type' => 'calibration', + 'issuedate' => '2024-01-22', + 'expirydate' => '2025-01-22', + 'vendor' => 'Summit Calibration Lab', + 'description' => 'Annual calibration certificate for BC5140 equipment.' + ], + ]; + + $data = ['certificates' => $certificates]; + return view('certificate_calibration_index', $data); + } + public function maintenanceIndex() { + + $certificates = [ + [ + 'certid' => 'CERT001', + 'certname' => 'Jokoh Calibration Certificate', + 'productname' => 'Jokoh', + 'productnumber' => 'SN-2024-001', + 'issuedate' => '2024-01-15', + 'expirydate' => '2025-01-15', + 'vendor' => 'Summit Calibration Lab' + ] + ]; + $data = ['certificates' => $certificates]; + + return view('certificate_maintenance_index', $data); + } + + public function createTraining($certid = null) { + if (!$certid) { + return $this->response->setStatusCode(400)->setJSON(['error' => 'Certificate ID is required']); + } + + // Get certificate data + $certificates = [ + [ + 'certid' => 'CERT002', + 'certname' => 'Jokoh Training Certificate', + 'productname' => 'Jokoh', + 'productnumber' => 'SN-2024-001', + 'issuedate' => '2024-01-15', + 'expirydate' => '2025-01-15', + 'vendor' => 'Summit Calibration Lab' + ] + ]; + + $certificate = null; + foreach ($certificates as $cert) { + if ($cert['certid'] === $certid) { + $certificate = $cert; + break; + } + } + + if (!$certificate) { + return $this->response->setStatusCode(404)->setJSON(['error' => 'Training certificate not found']); + } + + // Generate PDF + return $this->generatePDF($certificate, 'training'); + } + public function createCalibrate($certid = null, $productname = null) { + if (!$certid) { + return $this->response->setStatusCode(400)->setJSON(['error' => 'Certificate ID is required']); + } + + // Get certificate data + $certificates = [ + [ + 'certid' => 'CERT001', + 'certname' => 'TMS50i Calibration Certificate', + 'productname' => 'tms50i', + 'productnumber' => 'SN-2024-001', + 'type' => 'calibration', + 'issuedate' => '2024-01-15', + 'expirydate' => '2025-01-15', + 'vendor' => 'Summit Calibration Lab', + 'description' => 'Annual calibration certificate for TMS50i equipment.' + ], + [ + 'certid' => 'CERT002', + 'certname' => 'tms24i Calibration Certificate', + 'productname' => 'tms24i', + 'productnumber' => 'SN-2024-002', + 'type' => 'calibration', + 'issuedate' => '2024-01-16', + 'expirydate' => '2025-01-16', + 'vendor' => 'Summit Calibration Lab', + 'description' => 'Annual calibration certificate for tms24i equipment.' + ], + [ + 'certid' => 'CERT003', + 'certname' => 'tms30i Calibration Certificate', + 'productname' => 'tms30i', + 'productnumber' => 'SN-2024-003', + 'type' => 'calibration', + 'issuedate' => '2024-01-17', + 'expirydate' => '2025-01-17', + 'vendor' => 'Summit Calibration Lab', + 'description' => 'Annual calibration certificate for tms30i equipment.' + ], + [ + 'certid' => 'CERT004', + 'certname' => 'BS430 Calibration Certificate', + 'productname' => 'bs430', + 'productnumber' => 'SN-2024-004', + 'type' => 'calibration', + 'issuedate' => '2024-01-18', + 'expirydate' => '2025-01-18', + 'vendor' => 'Summit Calibration Lab', + 'description' => 'Annual calibration certificate for BS430 equipment.' + ], + [ + 'certid' => 'CERT005', + 'certname' => 'CL900i Calibration Certificate', + 'productname' => 'cl900i', + 'productnumber' => 'SN-2024-005', + 'type' => 'calibration', + 'issuedate' => '2024-01-19', + 'expirydate' => '2025-01-19', + 'vendor' => 'Summit Calibration Lab', + 'description' => 'Annual calibration certificate for CL900i equipment.' + ], + [ + 'certid' => 'CERT006', + 'certname' => 'Jokoh Calibration Certificate', + 'productname' => 'jokoh', + 'productnumber' => 'SN-2024-006', + 'type' => 'calibration', + 'issuedate' => '2024-01-20', + 'expirydate' => '2025-01-20', + 'vendor' => 'Summit Calibration Lab', + 'description' => 'Annual calibration certificate for Jokoh equipment.' + ], + [ + 'certid' => 'CERT007', + 'certname' => 'BC760R Calibration Certificate', + 'productname' => 'bc760r', + 'productnumber' => 'SN-2024-007', + 'type' => 'calibration', + 'issuedate' => '2024-01-21', + 'expirydate' => '2025-01-21', + 'vendor' => 'Summit Calibration Lab', + 'description' => 'Annual calibration certificate for BC760R equipment.' + ], + [ + 'certid' => 'CERT008', + 'certname' => 'BC5140 Calibration Certificate', + 'productname' => 'bc5140', + 'productnumber' => 'SN-2024-008', + 'type' => 'calibration', + 'issuedate' => '2024-01-22', + 'expirydate' => '2025-01-22', + 'vendor' => 'Summit Calibration Lab', + 'description' => 'Annual calibration certificate for BC5140 equipment.' + ], + ]; + + $certificate = null; + foreach ($certificates as $cert) { + if ($cert['certid'] === $certid) { + $certificate = $cert; + break; + } + } + + if (!$certificate) { + return $this->response->setStatusCode(404)->setJSON(['error' => 'Calibration certificate not found']); + } + + // Generate PDF + return $this->generatePDF($certificate, 'calibration', $productname); + } + public function createMaintenance($certid = null) { + if (!$certid) { + return $this->response->setStatusCode(400)->setJSON(['error' => 'Certificate ID is required']); + } + + // Get certificate data + $certificates = [ + [ + 'certid' => 'CERT001', + 'certname' => 'Jokoh Calibration Certificate', + 'productname' => 'Jokoh', + 'productnumber' => 'SN-2024-001', + 'issuedate' => '2024-01-15', + 'expirydate' => '2025-01-15', + 'vendor' => 'Summit Calibration Lab' + ] + ]; + + $certificate = null; + foreach ($certificates as $cert) { + if ($cert['certid'] === $certid) { + $certificate = $cert; + break; + } + } + + if (!$certificate) { + return $this->response->setStatusCode(404)->setJSON(['error' => 'Maintenance certificate not found']); + } + + // dd($certificate); + + // Generate PDF + return $this->generatePDF($certificate, 'maintenance'); + } + + // Digunakan Untuk Generate PDF Show + private function generatePDF($certificate, $type, $productType=null) { + // Generate PDF + $options = new Options(); + $options->set('isRemoteEnabled', true); + $options->set('isHtml5ParserEnabled', true); + // $options->set('defaultFont', 'Playfair Display'); + + $dompdf = new Dompdf($options); + + // Format dates + $issuedate = date('F d, Y', strtotime($certificate['issuedate'])); + $expirydate = date('F d, Y', strtotime($certificate['expirydate'])); + + // Get status + $today = date('Y-m-d'); + $expiryCheck = date('Y-m-d', strtotime($certificate['expirydate'])); + $daysUntilExpiry = (strtotime($expiryCheck) - strtotime($today)) / (60 * 60 * 24); + + if ($daysUntilExpiry < 0) { + $status = 'Expired'; + $statusColor = '#dc3545'; + } elseif ($daysUntilExpiry <= 30) { + $status = 'Expiring Soon'; + $statusColor = '#ffc107'; + } else { + $status = 'Active'; + $statusColor = '#28a745'; + } + + // Select template and orientation based on type + $template = 'certificate_pdf'; + $orientation = 'portrait'; + + switch($type) { + case 'training': + $template = 'certificates/certificate_training'; + $orientation = 'landscape'; + break; + case 'calibration': + if ($productType == 'tms50i') { + $template = 'certificates/callibrations_template/certificate_tms50i_calibration'; + } else if ($productType == 'tms24i') { + $template = 'certificates/callibrations_template/certificate_tms24i_calibration'; + } else if ($productType == 'tms30i') { + $template = 'certificates/callibrations_template/certificate_tms30i_calibration'; + } else if ($productType == 'bs430') { + $template = 'certificates/callibrations_template/certificate_bs430_calibration'; + } else if ($productType == 'cl900i') { + $template = 'certificates/callibrations_template/certificate_cl900i_calibration'; + } else if ($productType == 'jokoh') { + $template = 'certificates/callibrations_template/certificate_jokoh_calibration'; + } else if ($productType == 'bc760r') { + $template = 'certificates/callibrations_template/certificate_bc760r_calibration'; + } else if ($productType == 'bc5140') { + $template = 'certificates/callibrations_template/certificate_bc5140_calibration'; + } else { + return $this->response->setStatusCode(404)->setJSON(['error' => 'Not Found']); + } + $orientation = 'portrait'; + break; + case 'maintenance': + $template = 'certificates/certificate_maintenance'; + $orientation = 'landscape'; + break; + } + + $html = view($template, [ + 'certificate' => $certificate, + 'issuedate' => $issuedate, + 'expirydate' => $expirydate, + 'status' => $status, + 'statusColor' => $statusColor + ]); + + $dompdf->loadHtml($html); + // $dompdf->set_option('isRemoteEnabled', true); + $dompdf->setPaper('A4', $orientation); + $dompdf->render(); + + // Output PDF + $filename = 'Certificate_' . $certificate['certid'] . '.pdf'; + $dompdf->stream($filename, ['Attachment' => false]); + } +} \ No newline at end of file diff --git a/app/Views/certificate_calibration_index.php b/app/Views/certificate_calibration_index.php new file mode 100644 index 0000000..498acce --- /dev/null +++ b/app/Views/certificate_calibration_index.php @@ -0,0 +1,655 @@ +extend('layouts/main.php') ?> + +section('content') ?> + +
+
+
+
+

Certificates Calibration Management

+
+
+ +
+
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + Expired'; + $statusClass = 'expired'; + } elseif($daysUntilExpiry <= 30) { + $statusBadge = 'Expiring Soon'; + $statusClass = 'expiring'; + } else { + $statusBadge = 'Active'; + $statusClass = 'active'; + } + } else { + $expirydate = '-'; + $statusBadge = 'N/A'; + $statusClass = ''; + } + + // Type badge + $typeBadge = ''; + switch(strtolower($type)) { + case 'calibration': + $typeBadge = 'calibration'; + break; + case 'training': + $typeBadge = 'Training'; + break; + case 'maintenance': + $typeBadge = 'Maintenance'; + break; + default: + $typeBadge = '' . htmlspecialchars($type) . ''; + } + ?> + + + + + + + + + + + + + +
NoCertificate NameProduct/EquipmentTypeIssue DateExpiry DateStatusVendorAction
+ +
+ ID: +
+ + +
SN: + + +
+
+ +
+
+
+
+
+
+
+
+
+ + + + +endSection() ?> + +section('script') ?> + +endSection() ?> \ No newline at end of file diff --git a/app/Views/certificate_index.php b/app/Views/certificate_index.php new file mode 100644 index 0000000..12d95d0 --- /dev/null +++ b/app/Views/certificate_index.php @@ -0,0 +1,577 @@ +extend('layouts/main.php') ?> + +section('content') ?> + +
+
+
+
+

Certificates Management

+
+ +
+ +
+
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + Expired'; + $statusClass = 'expired'; + } elseif($daysUntilExpiry <= 30) { + $statusBadge = 'Expiring Soon'; + $statusClass = 'expiring'; + } else { + $statusBadge = 'Active'; + $statusClass = 'active'; + } + } else { + $expirydate = '-'; + $statusBadge = 'N/A'; + $statusClass = ''; + } + + // Type badge + $typeBadge = ''; + switch(strtolower($type)) { + case 'calibration': + $typeBadge = 'Calibration'; + break; + case 'training': + $typeBadge = 'Training'; + break; + case 'maintenance': + $typeBadge = 'Maintenance'; + break; + default: + $typeBadge = '' . htmlspecialchars($type) . ''; + } + ?> + + + + + + + + + + + + + + + +
NoCertificate NameProduct/EquipmentTypeIssue DateExpiry DateStatusVendorAction
+ +
+ ID: +
+ + +
SN: + +
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + +endSection() ?> + +section('script') ?> + +endSection() ?> diff --git a/app/Views/certificate_maintenance_index.php b/app/Views/certificate_maintenance_index.php new file mode 100644 index 0000000..50fccb3 --- /dev/null +++ b/app/Views/certificate_maintenance_index.php @@ -0,0 +1,361 @@ +extend('layouts/main.php') ?> + +section('content') ?> + +
+
+
+
+

Certificates Maintenance Management

+
+
+ +
+
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + Expired'; + $statusClass = 'expired'; + } elseif($daysUntilExpiry <= 30) { + $statusBadge = 'Expiring Soon'; + $statusClass = 'expiring'; + } else { + $statusBadge = 'Active'; + $statusClass = 'active'; + } + } else { + $expirydate = '-'; + $statusBadge = 'N/A'; + $statusClass = ''; + } + ?> + + + + + + + + + + + + +
NoCertificate NameProduct/EquipmentIssue DateExpiry DateStatusVendorAction
+ +
+ ID: +
+ + +
SN: + + +
+
+ +
+
+
+
+
+
+
+
+
+ + + + +endSection() ?> + +section('script') ?> + +endSection() ?> \ No newline at end of file diff --git a/app/Views/certificate_training_index.php b/app/Views/certificate_training_index.php new file mode 100644 index 0000000..1e731d0 --- /dev/null +++ b/app/Views/certificate_training_index.php @@ -0,0 +1,361 @@ +extend('layouts/main.php') ?> + +section('content') ?> + +
+
+
+
+

Certificates Training Management

+
+
+ +
+
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + Expired'; + $statusClass = 'expired'; + } elseif($daysUntilExpiry <= 30) { + $statusBadge = 'Expiring Soon'; + $statusClass = 'expiring'; + } else { + $statusBadge = 'Active'; + $statusClass = 'active'; + } + } else { + $expirydate = '-'; + $statusBadge = 'N/A'; + $statusClass = ''; + } + ?> + + + + + + + + + + + + +
NoCertificate NameProduct/EquipmentIssue DateExpiry DateStatusVendorAction
+ +
+ ID: +
+ + +
SN: + + +
+
+ +
+
+
+
+
+
+
+
+
+ + + + +endSection() ?> + +section('script') ?> + +endSection() ?> \ No newline at end of file diff --git a/app/Views/certificates/callibrations_template/certificate_bc5140_calibration.php b/app/Views/certificates/callibrations_template/certificate_bc5140_calibration.php new file mode 100644 index 0000000..9397af2 --- /dev/null +++ b/app/Views/certificates/callibrations_template/certificate_bc5140_calibration.php @@ -0,0 +1,403 @@ + + + + + + Certificate of Instruments TMS50i + + + + + +
+ +
+ Nomor: FO.III.12/04.00/2019 +
+ +
+

Certificate of Instrument Calibration

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Customer Data

+
+ Laboratory / Hospital + + : Trisensa Diagnostic Center +
+ Address + + : Jl. Taman AIS Yasin No.5, Embong Kaliasin, Kec. Genteng, Surabaya 60271 +
+ Instrument + + : Clinical Chemistry Analyzer TMS 50i Superior +
+ Serial Number + + : 5303150816 +
+ Date of Calibration + + : January 09, 2026 +
+ Valid Until + + : January 09, 2027 +
+ +
+ +
+ + + +

Required Material

SC Cal +

Procedure

Checking Instrument Status, Running Callibartion +

Requirement

Deviation must be ≤ 2.0% ; 3 Impedance measurement must be OK; Measurement point must be within +

Results

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParametersValueRangeUnitResult
Power +12V11.7911.00 - 14.00VPass
Power +24V24.0620.00 - 30.00VPass
Analog +12V11.7011.00 - 13.00VPass
Analog -12V-11.72-14.00 - -9.00VPass
Digital +56V56.0547.00 - 63.00VPass
HGB Blank Voltage4.213.85 - 4.85VPass
FS Blank Voltage0.290.07 - 1.00VPass
Laser Diode Current2820 - 70mAPass
Diluent Temperature2710.00 - 40.00°CPass
Reagent preheating Temperature42.239.5 - 44.0°CPass
Optical System Temperature29.415.0 - 40.0°CPass
Liquid Pressure92.070.00 - 110.0kPaPass
Vacuum-28.6-35.0 - -26.0kPaPass
WBC99.9375 - 125%Pass
RBC101.4975 - 125%Pass
HGB99.6575 - 125%Pass
MCV99.9475 - 125%Pass
PLT101.6075 - 125%Pass
+ +
+

Conclusion

+ Instrument Auto Hematology Analyzer BC-5140 has been already calibrated. The result of calibration + is good. +
+ +
+ + +
+ +
+ +
+ + + \ No newline at end of file diff --git a/app/Views/certificates/callibrations_template/certificate_bc760r_calibration.php b/app/Views/certificates/callibrations_template/certificate_bc760r_calibration.php new file mode 100644 index 0000000..7d859c7 --- /dev/null +++ b/app/Views/certificates/callibrations_template/certificate_bc760r_calibration.php @@ -0,0 +1,418 @@ + + + + + + Certificate of Instruments TMS50i + + + + + +
+ +
+ Nomor: FO.III.12/04.00/2019 +
+ +
+

Certificate of Instrument Calibration

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Customer Data

+
+ Laboratory / Hospital + + : Trisensa Diagnostic Center +
+ Address + + : Jl. Taman AIS Yasin No.5, Embong Kaliasin, Kec. Genteng, Surabaya 60271 +
+ Instrument + + : Clinical Chemistry Analyzer TMS 50i Superior +
+ Serial Number + + : 5303150816 +
+ Date of Calibration + + : January 09, 2026 +
+ Valid Until + + : January 09, 2027 +
+ +
+ +
+ + + + + + + + + + + + + + +
+

Required Material

+
SC Cal
+

Procedure

+
+ Checking Instrument Status, Running Callibartion +
+

Requirement

+
+ Deviation must be ≤ 2.0% ; 3 Impedance measurement must be OK; Measurement point must be within range +
+ +

Results

+ + + + + + + + +
+

Calibration Factor

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParametersReferenceValueResult
WBC75 - 12595.20Pass
RBC75 - 125105.38Pass
HGB75 - 125101.86Pass
MCV75 - 125104.22Pass
PCT75 - 125105.58Pass
RBC-O75 - 125--
PCT-O75 - 125--
PCT-H75 - 125--
+
+

Optical

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParametersDeviationResult
DIFF_FS0.1Pass
DIFF_SS0.8Pass
DIFF_FC0.5Pass
DIFF_PMTN/APass
RET_FS--
RET_SS--
RET_FC--
RET_PMT--
+
+ +

Impedance

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ParametersTarget123Result
MCV_G93.197.992.793.3OK
HGB4.404.754.404.40OK
+ +

ESR Measurement Point

+ + + + + + + + + + + + + +
ParametersTestedReferenceResult
Measurement Point (µL)-135 - 180-
+ + +
+

Conclusion

+

Instrument Auto Hematology Analyzer BC-760R has been already calibrated. + The result of calibration is good.

+
+ +
+ + +
+ +
+ +
+ + + \ No newline at end of file diff --git a/app/Views/certificates/callibrations_template/certificate_bs430_calibration.php b/app/Views/certificates/callibrations_template/certificate_bs430_calibration.php new file mode 100644 index 0000000..f6570dc --- /dev/null +++ b/app/Views/certificates/callibrations_template/certificate_bs430_calibration.php @@ -0,0 +1,283 @@ + + + + + + Certificate of Instruments TMS50i + + + + + +
+ +
+ Nomor: FO.III.12/04.00/2019 +
+ +
+

Certificate of Instrument Calibration

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Customer Data

+
+ Laboratory / Hospital + + : Trisensa Diagnostic Center +
+ Address + + : Jl. Taman AIS Yasin No.5, Embong Kaliasin, Kec. Genteng, Surabaya 60271 +
+ Instrument + + : Clinical Chemistry Analyzer TMS 50i Superior +
+ Serial Number + + : 5303150816 +
+ Date of Calibration + + : January 09, 2026 +
+ Valid Until + + : January 09, 2027 +
+ +
+ +
+

Required Material

+ - + +

Procedure

+ Running 60 samples (Aquadibidestilata) for 12 Wavelength + +

Requirement

+ Expected Result : (-20) - (+20) + +

Result

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParametersValueRangeUnitResult
Reaction Carousel Temperature37.036.7 - 37.3°CPass
Cuvette Cleaning Fluid Temperature44.039.0 - 49.0°CPass
Cuvette Wash Solution Temperature44.239.0 - 49.00°CPass
Cuvette CheckNo Yellow CuvetteN/APass
Photometer Check79975000-8000λPass
Bar Code Stability CheckReadRead / No ReadN/APass
+ +
+

Conclusion

+ Instrument BS-430 Chemistry Analyzer has been already calibrated. + The result of calibration is good. +
+
+ +
+ +
+ +
+ + + \ No newline at end of file diff --git a/app/Views/certificates/callibrations_template/certificate_cl900i_calibration.php b/app/Views/certificates/callibrations_template/certificate_cl900i_calibration.php new file mode 100644 index 0000000..d27a9c0 --- /dev/null +++ b/app/Views/certificates/callibrations_template/certificate_cl900i_calibration.php @@ -0,0 +1,306 @@ + + + + + + Certificate of Instruments TMS50i + + + + + +
+ +
+ Nomor: FO.III.12/04.00/2019 +
+ +
+

Certificate of Instrument Calibration

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Customer Data

+
+ Laboratory / Hospital + + : Trisensa Diagnostic Center +
+ Address + + : Jl. Taman AIS Yasin No.5, Embong Kaliasin, Kec. Genteng, Surabaya 60271 +
+ Instrument + + : Clinical Chemistry Analyzer TMS 50i Superior +
+ Serial Number + + : 5303150816 +
+ Date of Calibration + + : January 09, 2026 +
+ Valid Until + + : January 09, 2027 +
+ +
+ +
+

Required Material

+ Aquadibidestilata + +

Procedure

+ Running 60 samples (Aquadibidestilata) for 12 Wavelength +
+ (340, 380, 405, 450, 505, 546, 570, 600, 660, 700, 750 and 800 nm) + +

Requirement

+ Expected Result : (-20) - (+20) + +

Result

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParametersValueRangeUnitResult
Incubation Module37.036.7 - 37.3°CPass
Reagent Compartment5.02.0 - 8.0°CPass
Power 24V Voltage23.9420 - 30VoltPass
Power 12 V Voltage11.8711.0 - 14.0VoltPass
Vacuum Pressure Check-23.00-24.00 - -34.00KPaPass
DCF Diagnosis0.96 + < 1.5% % + Pass
Substrate Background48SD < 200 N/APass
System Repeatability0.12%CV ≤ 1.5%%Pass
Dark Current Count80.20 - 350N/APass
+ +
+

Conclusion

+ Instrument Chemiluminescence Immunoassay System Mindray CL-900i have been already calibrated. + The result of calibration is good. +
+
+ +
+ +
+ +
+ + + diff --git a/app/Views/certificates/callibrations_template/certificate_jokoh_calibration.php b/app/Views/certificates/callibrations_template/certificate_jokoh_calibration.php new file mode 100644 index 0000000..aaa7e36 --- /dev/null +++ b/app/Views/certificates/callibrations_template/certificate_jokoh_calibration.php @@ -0,0 +1,274 @@ + + + + + + Certificate of Instruments TMS50i + + + + + +
+ +
+ Nomor: FO.III.12/04.00/2019 +
+ +
+

Certificate of Instrument Calibration

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Customer Data

+
+ Laboratory / Hospital + + : Trisensa Diagnostic Center +
+ Address + + : Jl. Taman AIS Yasin No.5, Embong Kaliasin, Kec. Genteng, Surabaya 60271 +
+ Instrument + + : Clinical Chemistry Analyzer TMS 50i Superior +
+ Serial Number + + : 5303150816 +
+ Date of Calibration + + : January 09, 2026 +
+ Valid Until + + : January 09, 2027 +
+ +
+ +
+

Required Material

+ Standart Solution 1 +
+ Standart Solution 2 + +

Procedure

+ Running 60 samples (Aquadibidestilata) for 12 Wavelength + +

Requirement

+ Expected Result : +
+ Slope Na : (+40) - (+72) mV/dec +
+ Slope K : (+40) - (+67) mV/dec +
+ Slope Cl : (-25) - (-62) mV/dec + +

Result

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Type of CalibrationSlope NaStatusSlope KStatusSlope ClStatus
Auto Calibration(+46.4)PASS(+52.2)PASS(-41.0)PASS
Manual Calibration(+46.6)PASS(+51.7)PASS(-42.0)PASS
Slope Wash Calibration(+44.5)PASS(+50.9)PASS(-40.9)PASS
+ +
+

Conclusion

+ Instrument JOKOH EX-D have been already calibrated. + The Result of Calibration is good. +
+
+ +
+ +
+ +
+ + + \ No newline at end of file diff --git a/app/Views/certificates/callibrations_template/certificate_tms24i_calibration.php b/app/Views/certificates/callibrations_template/certificate_tms24i_calibration.php new file mode 100644 index 0000000..b8ba544 --- /dev/null +++ b/app/Views/certificates/callibrations_template/certificate_tms24i_calibration.php @@ -0,0 +1,302 @@ + + + + + + Certificate of Instruments TMS50i + + + + + +
+ +
+ Nomor: FO.III.12/04.00/2019 +
+ +
+

Certificate of Instrument Calibration

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Customer Data

+
+ Laboratory / Hospital + + : Trisensa Diagnostic Center +
+ Address + + : Jl. Taman AIS Yasin No.5, Embong Kaliasin, Kec. Genteng, Surabaya 60271 +
+ Instrument + + : Clinical Chemistry Analyzer TMS 50i Superior +
+ Serial Number + + : 5303150816 +
+ Date of Calibration + + : January 09, 2026 +
+ Valid Until + + : January 09, 2027 +
+ +
+ +
+

Required Material

+ Aquadibidestilata + +

Procedure

+ Running 60 samples (Aquadibidestilata) for 12 Wavelength +
+ (340, 380, 405, 450, 505, 546, 570, 600, 660, 700, 750 and 800 nm) + +

Requirement

+ Expected Result : (-20) - (+20) + +

Result

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Wave LengthNumber of RunResultStatusWave LengthNumber of RunResultStatus
340 nm60-2PASS570 nm60-1PASS
380 nm60-1PASS600 nm600PASS
405 nm600PASS660 nm60-2PASS
450 nm60-1PASS700 nm60-2PASS
505 nm60-3PASS750 nm60-1PASS
546 nm60-1PASS800 nm60-2PASS
+ +
+

Conclusion

+

Instrument TMS 24i Premium have been already calibrated. + The Result of Calibration is good.

+
+
+ +
+ +
+ +
+ + + diff --git a/app/Views/certificates/callibrations_template/certificate_tms30i_calibration.php b/app/Views/certificates/callibrations_template/certificate_tms30i_calibration.php new file mode 100644 index 0000000..de7e2bb --- /dev/null +++ b/app/Views/certificates/callibrations_template/certificate_tms30i_calibration.php @@ -0,0 +1,312 @@ + + + + + + Certificate of Instruments TMS50i + + + + + +
+ +
+ Nomor: FO.III.12/04.00/2019 +
+ +
+

Certificate of Instrument Calibration

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Customer Data

+
+ Laboratory / Hospital + + : Trisensa Diagnostic Center +
+ Address + + : Jl. Taman AIS Yasin No.5, Embong Kaliasin, Kec. Genteng, Surabaya 60271 +
+ Instrument + + : Clinical Chemistry Analyzer TMS 50i Superior +
+ Serial Number + + : 5303150816 +
+ Date of Calibration + + : January 09, 2026 +
+ Valid Until + + : January 09, 2027 +
+ +
+ +
+

Required Material

+ Aquadibidestilata + +

Procedure

+ Running 60 samples (Aquadibidestilata) for 12 Wavelength +
+ (340, 380, 405, 450, 505, 546, 570, 600, 660, 700, 750 and 800 nm) + +

Requirement

+ Expected Result : (-20) - (+20) + +

Result

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Wave LengthNumber of RunResultStatusWave LengthNumber of RunResultStatus
340 nm601PASS570 nm600PASS
380 nm601PASS600 nm600PASS
405 nm600PASS660 nm600PASS
450 nm600PASS700 nm600PASS
480 nm600PASS750 nm600PASS
505 nm600PASS800 nm600PASS
546 nm600PASS
+ +
+

Conclusion

+

Instrument TMS 30i have been already calibrated. + The Result of Calibration is good.

+
+
+ +
+ +
+ +
+ + + \ No newline at end of file diff --git a/app/Views/certificates/callibrations_template/certificate_tms50i_calibration.php b/app/Views/certificates/callibrations_template/certificate_tms50i_calibration.php new file mode 100644 index 0000000..e3d9f4e --- /dev/null +++ b/app/Views/certificates/callibrations_template/certificate_tms50i_calibration.php @@ -0,0 +1,301 @@ + + + + + + Certificate of Instruments TMS50i + + + + + +
+ +
+ Nomor: FO.III.12/04.00/2019 +
+ +
+

Certificate of Instrument Calibration

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Customer Data

+
+ +
+ Laboratory / Hospital + + : Trisensa Diagnostic Center +
+ Address + + : Jl. Taman AIS Yasin No.5, Embong Kaliasin, Kec. Genteng, Surabaya +
+ Instrument + + : Clinical Chemistry Analyzer TMS 50i Superior +
+ Serial Number + + : 5303150816 +
+ Date of Calibration + + : January 09, 2026 +
+ Valid Until + + : January 09, 2027 +
+
+ +
+

Required Material

Aquadibidestilata + +

Procedure

+ Running 60 samples (Aquadibidestilata) for 12 Wavelength (340, 380, 405, 450, 505, 546, 570, 600, 660, 700, 750 and 800 nm) + +

Requirement

+ Expected Result : (-20) - (+20) + +

Result

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Wave LengthNumber of RunResultStatusWave LengthNumber of RunResultStatus
340 nm60-2PASS570 nm601PASS
380 nm60-1PASS600 nm602PASS
405 nm600PASS660 nm603PASS
450 nm601PASS700 nm602PASS
505 nm602PASS750 nm602PASS
546 nm601PASS800 nm602PASS
+ +
+

Conclusion

+

Instrument TMS 50i Superior have been already calibrated. + The Result of Calibration is good.

+
+
+ +
+ +
+ +
+ + + diff --git a/app/Views/certificates/certificate_maintenance.php b/app/Views/certificates/certificate_maintenance.php new file mode 100644 index 0000000..fc3ee19 --- /dev/null +++ b/app/Views/certificates/certificate_maintenance.php @@ -0,0 +1,183 @@ + + + + + Maintenance Certificate - <?= $certificate['certname'] ?> + + + +
+ +
+ +
+
+

<<Nama Alat>>

+
+ +
+

at <<Nama Rumah Sakit / Laboratorium - Kota>>

+
+ +
+

Serial Number: <<Serial Number>>

+ +

has completed through a series of <<Jenis Sertifikat>>

+

and the final result:

+

PASSED

+

Date of <<Jenis Sertifikat>> and Inspection: <<Tanggal Terbit>>

+

<<Valid>> <<Tanggal Berakhir>>

+
+ + + + + + + +
+ Adhitya Pranata Putra + Technical Support Manager + + <<Nama TSO>> + <<Jabatan>> +
+ +
+

<<FO>>

+
+ +
+ +
+
+

<<Nama Alat>>

+
+ +
+

at <<Nama Rumah Sakit / Laboratorium - Kota>>

+
+ +
+

Serial Number: <<Serial Number>>

+ +

has completed through a series of <<Jenis Sertifikat>>

+

and the final result:

+

PASSED

+

Date of <<Jenis Sertifikat>> and Inspection: <<Tanggal Terbit>>

+

<<Valid>> <<Tanggal Berakhir>>

+
+ + + + + + + +
+ Adhitya Pranata Putra + Technical Support Manager + + <<Nama TSO>> + <<Jabatan>> +
+ +
+

<<FO>>

+
+ +
+ + + diff --git a/app/Views/certificates/certificate_maintenance_index.php b/app/Views/certificates/certificate_maintenance_index.php new file mode 100644 index 0000000..97de5c7 --- /dev/null +++ b/app/Views/certificates/certificate_maintenance_index.php @@ -0,0 +1,545 @@ +extend('layouts/main.php') ?> + +section('content') ?> + +
+
+
+
+

Certificates Maintenance Management

+
+
+ +
+
+ +
+
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + Expired'; + $statusClass = 'expired'; + } elseif($daysUntilExpiry <= 30) { + $statusBadge = 'Expiring Soon'; + $statusClass = 'expiring'; + } else { + $statusBadge = 'Active'; + $statusClass = 'active'; + } + } else { + $expirydate = '-'; + $statusBadge = 'N/A'; + $statusClass = ''; + } + + // Type badge + $typeBadge = ''; + switch(strtolower($type)) { + case 'calibration': + $typeBadge = 'Calibration'; + break; + case 'training': + $typeBadge = 'Training'; + break; + case 'maintenance': + $typeBadge = 'Maintenance'; + break; + default: + $typeBadge = '' . htmlspecialchars($type) . ''; + } + ?> + + + + + + + + + + + + + + + + + +
NoCertificate NameProduct/EquipmentTypeIssue DateExpiry DateStatusVendorAction
+ +
+ ID: +
+ + +
SN: + +
+
+ + + +
+
+ +

No certificates found

+ +
+
+
+
+
+
+
+
+ + + + + + + + + + +endSection() ?> + +section('script') ?> + +endSection() ?> diff --git a/app/Views/certificates/certificate_training.php b/app/Views/certificates/certificate_training.php new file mode 100644 index 0000000..e8f6d48 --- /dev/null +++ b/app/Views/certificates/certificate_training.php @@ -0,0 +1,150 @@ + + + + + Maintenance Certificate - <?= $certificate['certname'] ?> + + + +
+ +
+ +
+
+

<<Nama Analis>>

+
+ +
+

at <<Nama Rumah Sakit / Laboratorium - Kota>>

+
+ +
+

In Recording of Participation and Successful

+

Completion of Mindray Hematology Analyzer Training

+

BC5140

+

Date : February 05, 2026

+
+ + + + + + + +
+
+
+
+
+ Adhitya Pranata Putra + Technical Support Manager +
+ Trainer, +
+
+
+ <<Nama TSO>> + <<Jabatan>> +
+ +
+

<<FO>>

+
+ +
+ + + diff --git a/app/Views/layouts/_sidebar.php b/app/Views/layouts/_sidebar.php index 99e4243..0d787af 100644 --- a/app/Views/layouts/_sidebar.php +++ b/app/Views/layouts/_sidebar.php @@ -212,16 +212,25 @@
  • Transactions
  • +
  • + +
  • +
  • +
  • - + + diff --git a/public/assets/images/background_certificate/maintenance.jpeg b/public/assets/images/background_certificate/maintenance.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..35de057addd10894b499f4ad8ea2c2776b7eca5e GIT binary patch literal 95661 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 QAi`d`EgT*iWX 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 F`9CMpTRH#$ literal 0 HcmV?d00001