From b3a577eeacde52b1e7643cdb940a2c2b6fce805a Mon Sep 17 00:00:00 2001 From: mikael-zakaria Date: Sun, 8 Mar 2026 22:40:36 +0700 Subject: [PATCH] Update Alur --- app/Controllers/Activities.php | 183 +++++++++++++--- app/Controllers/Certificates.php | 30 ++- app/Models/CertificateModel.php | 2 +- app/Views/activities_detail.php | 6 + app/Views/activities_editor.php | 50 ++++- app/Views/certificate_maintenance_index.php | 198 +++++++++++------- .../certificates/certificate_maintenance.php | 50 ++--- app/Views/layouts/_sidebar.php | 4 +- 8 files changed, 379 insertions(+), 144 deletions(-) diff --git a/app/Controllers/Activities.php b/app/Controllers/Activities.php index 9ffc600..809b552 100644 --- a/app/Controllers/Activities.php +++ b/app/Controllers/Activities.php @@ -294,6 +294,19 @@ class Activities extends Controller { $results = $query->getResultArray(); $data['reff'] = $results; } + + // Untuk Sertifikat + $certificatesArray = []; + $certificateModel = new CertificateModel(); + $results = $certificateModel->select('cert_type') + ->where('actid', $actid) + ->findAll(); + if (!empty($results)) { + foreach ($results as $row) { + $certificatesArray[] = $row['cert_type']; + } + $data['activities'][0]['cert_types'] = $certificatesArray; + } $sql = "select actdetailid, acttextid, textvalue from actdetail where actid=$actid order by acttextid, createdate desc"; $query = $db->query($sql); @@ -450,31 +463,13 @@ class Activities extends Controller { $query = $db->query($sql); } - // UNTUK CERTIFICATES - $sql = "SELECT prl.productaliastext as productname, pr.productnumber as snnumber, st.sitename - FROM `activities` act - LEFT JOIN sites st ON st.siteid = act.siteid - LEFT JOIN products pr ON pr.productid = act.productid - LEFT JOIN productcatalog prc ON prc.catalogid = pr.catalogid - LEFT JOIN productalias prl ON prl.productaliasid = prc.productaliasid - WHERE act.actid = $actid"; - $query = $db->query($sql); - $result = $query->getRowArray(); - if ($this->request->getVar('maintenance')) { // Maintenance - $issuedDate = $data['new_value']['closedate'] ?? null; - $expiredDate = date('Y-m-d', strtotime($issuedDate . ' + 6 months')); - $insertCert = [ - 'cert_name' => "MC_" . ($result['productname'] ?? 'UNKNOWN') . "_" . ($result['snnumber'] ?? '0') . "_" . $actid, - 'cert_type' => "MC", - 'actid' => $actid, - 'issued_date' => $issuedDate, - 'expired_date' => $expiredDate, - 'user_id' => $data['new_value']['userid_owner'] - ]; - $certificateModel = new CertificateModel(); - $certificateModel->insert($insertCert); - } + // UNTUK CERTIFICATES + if ($this->request->getVar('maintenance')) { // Jika Maintenance Dicentang + $issuedDate = $data['new_value']['closedate'] ?? null; + $userid_owner = $data['new_value']['userid_owner']; + $this->createCertificateMaintenance($actid, $issuedDate, $userid_owner); + } } else { // update edit @@ -549,6 +544,19 @@ class Activities extends Controller { $query = $db->query($sql); } } + + + // UNTUK CERTIFICATES + if ($this->request->getVar('maintenance')) { // Maintenance + // Maintenance sertifikat create or update + $issuedDate = $data['new_value']['closedate'] ?? null; + $userid_owner = $data['new_value']['userid_owner']; + $this->updateCertificateMaintenance($actid, $issuedDate, $userid_owner); + } else { + // Hapus softdelete sertifikat + $this->deleteCertificateMaintenance($actid); + } + } // act by consumables @@ -1054,7 +1062,17 @@ class Activities extends Controller { $data['content'] = $this->act_content($actid); $db = \Config\Database::connect(); - $sql = "select attachment from activities where actid='$actid'"; + + $sql = "SELECT cert_name,file_url from certificates where actid=$actid AND deleted_at IS NULL"; + $query = $db->query($sql); + $result = $query->getResultArray(); + if (!empty($result)){ + $data['certificates'] = $result; + } else { + $data['certificates'] = []; + } + + $sql = "SELECT attachment from activities where actid='$actid'"; $query = $db->query($sql); $result = $query->getResultArray(); $data['attachment'] = $result[0]; @@ -1647,4 +1665,119 @@ class Activities extends Controller { return view('invtrans_index', $data); } + + public function createCertificateMaintenance ($actid, $issuedDate, $userid_owner) { + + $db = \Config\Database::connect(); + $sql = "SELECT prl.productaliastext as productname, pr.productnumber as snnumber, st.sitename + FROM `activities` act + LEFT JOIN sites st ON st.siteid = act.siteid + LEFT JOIN products pr ON pr.productid = act.productid + LEFT JOIN productcatalog prc ON prc.catalogid = pr.catalogid + LEFT JOIN productalias prl ON prl.productaliasid = prc.productaliasid + WHERE act.actid = $actid"; + $query = $db->query($sql); + $result = $query->getRowArray(); + + $expiredDate = $issuedDate ? date('Y-m-d', strtotime($issuedDate . ' + 6 months')) : null; + $insertCert = [ + 'cert_name' => "MC_" . ($result['productname'] ?? 'UNKNOWN') . "_" . ($result['snnumber'] ?? '0') . "_" . $actid, + 'cert_type' => "MC", + 'actid' => $actid, + 'issued_date' => $issuedDate, + 'expired_date' => $expiredDate, + 'user_id' => $userid_owner + ]; + $certificateModel = new CertificateModel(); + $certificateModel->insert($insertCert); + } + public function updateCertificateMaintenance($actid, $issuedDate, $userid_owner) { + $certificateModel = new CertificateModel(); + + // 1. Cek apakah data sudah ada menggunakan findAll() + $existingCerts = $certificateModel->withDeleted() + ->select('status') + ->where('actid', $actid) + ->findAll(); + + // Variabel penanda apakah data sudah pernah ada di database + $isDataExist = !empty($existingCerts); + + if ($isDataExist) { + // Ambil semua nilai 'status' dari array hasil findAll() + $statuses = array_column($existingCerts, 'status'); + + // Jika di antara status tersebut ada yang 'validated', hentikan proses + if (in_array('validated', $statuses)) { + return; + } + } + + // 2. Definisi $db (Pastikan instance database sudah dipanggil) + $db = \Config\Database::connect(); + + // Query binding (?) untuk keamanan + $sql = "SELECT prl.productaliastext as productname, pr.productnumber as snnumber, st.sitename + FROM `activities` act + LEFT JOIN sites st ON st.siteid = act.siteid + LEFT JOIN products pr ON pr.productid = act.productid + LEFT JOIN productcatalog prc ON prc.catalogid = pr.catalogid + LEFT JOIN productalias prl ON prl.productaliasid = prc.productaliasid + WHERE act.actid = ?"; + $query = $db->query($sql, [$actid]); + $result = $query->getRowArray(); + + // 3. Setelan Tanggal + $validIssuedDate = $issuedDate; + $expiredDate = $validIssuedDate ? date('Y-m-d', strtotime($validIssuedDate . ' + 6 months')) : null; + + // Siapkan Payload + $certPayload = [ + 'cert_name' => "MC_" . ($result['productname'] ?? 'UNKNOWN') . "_" . ($result['snnumber'] ?? '0') . "_" . $actid, + 'cert_type' => "MC", + 'actid' => $actid, + 'issued_date' => $validIssuedDate, + 'expired_date' => $expiredDate, + 'user_id' => $userid_owner, + 'deleted_at' => null + ]; + + // 4. Logika Insert atau Update menggunakan penanda $isDataExist + if (!$isDataExist) { + // Jika data belum ada sama sekali (array kosong), eksekusi INSERT + $certificateModel->insert($certPayload); + } else { + // Jika data sudah ada, eksekusi UPDATE + // Catatan: Karena bisa ada lebih dari 1 data dengan actid yang sama (karena findAll), + // Update ini akan menimpa semua baris yang punya actid tersebut. + $certificateModel->withDeleted() + ->where('actid', $actid) + ->set($certPayload) + ->update(); + } + } + public function deleteCertificateMaintenance($actid) { + $certificateModel = new CertificateModel(); + + // 1. Cek apakah data sudah ada menggunakan findAll() + $existingCerts = $certificateModel->withDeleted() + ->select('status') + ->where('actid', $actid) + ->findAll(); + + // Variabel penanda apakah data sudah pernah ada di database + $isDataExist = !empty($existingCerts); + + if ($isDataExist) { + // Ambil semua nilai 'status' dari array hasil findAll() + $statuses = array_column($existingCerts, 'status'); + + // Jika di antara status tersebut ada yang 'validated', hentikan proses + if (in_array('validated', $statuses)) { + return; + } + } + + $certificateModel->where('actid', $actid)->delete(); + } } \ No newline at end of file diff --git a/app/Controllers/Certificates.php b/app/Controllers/Certificates.php index 6945779..1dc4d26 100644 --- a/app/Controllers/Certificates.php +++ b/app/Controllers/Certificates.php @@ -503,9 +503,18 @@ class Certificates extends BaseController { ->find($certid); if (!empty($checkFinal['user_validation_at']) && - !empty($checkFinal['spv_validation_at']) && - !empty($checkFinal['manager_validation_at'])) { + (!empty($checkFinal['spv_validation_at']) || + !empty($checkFinal['manager_validation_at']))) { + // Check + $checkStatus = $certificateModel->select('status')->find($certid); + if ($checkStatus['status'] == 'validated') { + return $this->response->setJSON([ + 'success' => true, + 'message' => 'Semua validasi telah dilakukan' + ]); + } + // Update Status Utama $certificateModel->update($certid, ['status' => 'validated']); @@ -514,6 +523,7 @@ class Certificates extends BaseController { certificates.cert_name, certificates.issued_date, certificates.expired_date, + certificates.status, productcatalog.productname as productname, sites.sitename as sitename, products.productnumber, @@ -539,7 +549,9 @@ class Certificates extends BaseController { ->join('productcatalog', 'productcatalog.catalogid = products.catalogid', 'left') ->where('certificates.cert_id', $certid) ->first(); + $certificate = [ + 'status' => $latestData['status'], 'certname' => $latestData['cert_name'], 'sitename' => $latestData['sitename'], 'certtype' => $latestData['cert_type'], @@ -547,17 +559,19 @@ class Certificates extends BaseController { 'userposition' => $latestData['user_position'], 'productname' => $latestData['productname'], 'productnumber' => $latestData['productnumber'], - 'issueddate' => $latestData['issued_date'], - 'expireddate' => $latestData['expired_date'] + 'issueddate' => date('d-M-Y', strtotime($latestData['issued_date'])), + 'expireddate' => date('d-M-Y', strtotime($latestData['expired_date'])), + 'exportToPDF' => true ]; try { - $pdfAfterValidation = $this->savePdf($certificate, $latestData['cert_type']); // Simpan ke PDF + + $pdfAfterValidation = $this->savePdf($certificate, $latestData['cert_type'], $latestData['cert_number']); // Simpan ke PDF $certificateModel->update($certid, [ // Update ke tabel certificates 'file_location' => $pdfAfterValidation['file_relative'], 'metadata_title' => $pdfAfterValidation['metadata_title'], - 'metadata_keywords' => $pdfAfterValidation['metadata_keywords'], + 'metadata_keywords' => $pdfAfterValidation['metadata_keywords'].";".base_url('certificates/number/'.$latestData['cert_number']), 'file_url' => base_url('certificates/number/'.$latestData['cert_number']) ]); @@ -583,7 +597,7 @@ class Certificates extends BaseController { return $this->response->setJSON(['success' => false, 'message' => 'Gagal memperbarui data.']); } - public function savePdf($certificate, $certificateType, $productType = null) { + public function savePdf($certificate, $certificateType, $cert_number, $productType = null) { $certificateType = strtolower($certificateType); switch ($certificateType) { @@ -661,7 +675,7 @@ class Certificates extends BaseController { // Metadata $dompdf->addInfo('Title', $certificate['certname']); - $dompdf->addInfo('Keywords', $certificate['certtype'] . ' Certificate'); + $dompdf->addInfo('Keywords', $certificate['certtype'] . ' Certificate;'.base_url('certificates/number/'.$cert_number)); // Folder $uploadDir = FCPATH . 'upload/documents/' . $subDir; diff --git a/app/Models/CertificateModel.php b/app/Models/CertificateModel.php index ed3b77d..8015d32 100644 --- a/app/Models/CertificateModel.php +++ b/app/Models/CertificateModel.php @@ -16,7 +16,7 @@ class CertificateModel extends Model 'cert_number', 'cert_name', 'cert_type', 'actid', 'issued_date', 'expired_date', 'user_id', 'user_validation_at', 'spv_id', 'spv_validation_at', 'manager_id', 'manager_validation_at', - 'status', 'file_location', 'file_url', 'metadata_title', 'metadata_keywords' + 'status', 'file_location', 'file_url', 'metadata_title', 'metadata_keywords', 'deleted_at' ]; // Timestamps diff --git a/app/Views/activities_detail.php b/app/Views/activities_detail.php index 8dca804..3dcc4f3 100644 --- a/app/Views/activities_detail.php +++ b/app/Views/activities_detail.php @@ -11,6 +11,12 @@ foreach ($file_array as $value){ echo "$value
"; $i++; } +$i = 1; +// foreach ($certificates as $value){ +// if($i == 1) {echo "Certificates :
";} +// echo "".$value['cert_name']."
"; +// $i++; +// } echo "
"; foreach ($actsend_log as $data) { $logdate = $data['logdate']; diff --git a/app/Views/activities_editor.php b/app/Views/activities_editor.php index e641b97..3b8e32a 100644 --- a/app/Views/activities_editor.php +++ b/app/Views/activities_editor.php @@ -3,7 +3,7 @@ section('content') ?>
+
- + >
+
- + >
+
- + >
+
- + >
+
- + >
+
@@ -786,7 +796,32 @@ $(document).ready(function() { theme: 'bootstrap-5', width: '100%' }); - + + // 2. Logika Aktif/Nonaktif Checkbox + $('#acttypeid').change(function() { + if (this.value == '5') { + $("#maintenance").prop('disabled', false); + $("#calibration").prop('disabled', true); + $("#installation").prop('disabled', true); + $("#offreport").prop('disabled', true); + $("#training").prop('disabled', true); + } + else if (this.value == '3') { + $("#maintenance").prop('disabled', true); + $("#calibration").prop('disabled', false); + $("#installation").prop('disabled', false); + $("#offreport").prop('disabled', false); + $("#training").prop('disabled', false); + } + else { + // Ini akan menjadi default jika #acttypeid kosong atau bukan 5 dan 3 + $("#maintenance").prop('disabled', true); + $("#calibration").prop('disabled', true); + $("#installation").prop('disabled', true); + $("#offreport").prop('disabled', true); + $("#training").prop('disabled', true); + } + }).trigger('change'); }); // acttext @@ -947,7 +982,6 @@ $('#status').change(function() { else { $(".closedate").prop('disabled', false); $("#opendate").prop('disabled', false);} }) -$("#maintenance").prop('disabled', true); $("#calibration").prop('disabled', true); $("#installation").prop('disabled', true); $("#offreport").prop('disabled', true); $("#training").prop('disabled', true); $('#acttypeid').change(function() { if (this.value=='5'){ $("#maintenance").prop('disabled', false); $("#calibration").prop('disabled', true); $("#installation").prop('disabled', true); $("#offreport").prop('disabled', true); $("#training").prop('disabled', true);} else if (this.value=='3'){ $("#maintenance").prop('disabled', true); $("#calibration").prop('disabled', false); $("#installation").prop('disabled', false); $("#offreport").prop('disabled', false); $("#training").prop('disabled', false); } diff --git a/app/Views/certificate_maintenance_index.php b/app/Views/certificate_maintenance_index.php index 038621a..fc9e713 100644 --- a/app/Views/certificate_maintenance_index.php +++ b/app/Views/certificate_maintenance_index.php @@ -22,27 +22,28 @@ placeholder="Search certificates by name, product, type, vendor, or dates..."> +
+ +
- - - - -
-
-
@@ -57,14 +58,14 @@ - - + + - - - + + + @@ -82,9 +83,9 @@
NoCertificateCertificate Act Report Issue Date Expiry DateStatusValidationActionStatusValidationAction
- +
+ - - <<>> - <<>> -
@@ -140,36 +140,38 @@
+ +
-

<<>>

+

-

at <<>>

+

at

-

Serial Number: <<>>

+

Serial Number:

-

has completed through a series of <<>>

+

has completed through a series of

and the final result:

PASSED

-

Date of Instrument Maintenance and Inspection: <<>>

-

Valid until <<>>

+

Date of Instrument Maintenance and Inspection:

+

Valid until

-
+
@@ -178,6 +180,6 @@
- + diff --git a/app/Views/layouts/_sidebar.php b/app/Views/layouts/_sidebar.php index 752be5b..376aadf 100644 --- a/app/Views/layouts/_sidebar.php +++ b/app/Views/layouts/_sidebar.php @@ -41,10 +41,10 @@