Update Alur
This commit is contained in:
parent
9c3cac52dc
commit
b3a577eeac
@ -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();
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
@ -11,6 +11,12 @@ foreach ($file_array as $value){
|
||||
echo "<a href='".base_url()."upload/$value' target='_blank'>$value </a><br/>";
|
||||
$i++;
|
||||
}
|
||||
$i = 1;
|
||||
// foreach ($certificates as $value){
|
||||
// if($i == 1) {echo "<b>Certificates : </b><br/>";}
|
||||
// echo "<a href='".$value['file_url']."' target='_blank'>".$value['cert_name']."</a><br/>";
|
||||
// $i++;
|
||||
// }
|
||||
echo "<hr/>";
|
||||
foreach ($actsend_log as $data) {
|
||||
$logdate = $data['logdate'];
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
|
||||
<?= $this->section('content') ?>
|
||||
<?php
|
||||
// dd($reff);
|
||||
// dd($cert_types);
|
||||
$dests = array();
|
||||
$origins = array();
|
||||
foreach($invcounters as $qdata) {
|
||||
@ -30,6 +30,7 @@ $productid = '';
|
||||
$vendorid = '';
|
||||
$swversion = '';
|
||||
$acttypeid = '';
|
||||
$cert_types = [];
|
||||
$userid_owner = '';
|
||||
$activitystatus = 'O';
|
||||
$actid_ref = $actid_ref ?? 0; // Ini untuk edit dan create biasa
|
||||
@ -50,6 +51,9 @@ if(isset($activities)) { $data = $activities[0]; }
|
||||
if(isset($new_value)) { $data = $new_value; }
|
||||
if(isset($data)) {
|
||||
// dd($data);
|
||||
|
||||
$cert_types = isset($data['cert_types']) && is_array($data['cert_types']) ? $data['cert_types'] : [];
|
||||
|
||||
if(isset($data['actid'])) { $productid = $data['productid']; }
|
||||
$siteid = $data['siteid'];
|
||||
$productid = $data['productid'];
|
||||
@ -211,46 +215,52 @@ if(isset($data)) {
|
||||
<div class="form-group">
|
||||
<label class="form-label border-start border-5 border-primary ps-1">Certificate</label>
|
||||
<div class="row">
|
||||
|
||||
<div class="col-md-6 mb-2">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="calibration" id="calibration" value="1">
|
||||
<input class="form-check-input" type="checkbox" name="calibration" id="calibration" value="1" <?= in_array('CC', $cert_types) ? 'checked' : '' ?>>
|
||||
<label class="form-check-label" for="calibration">
|
||||
Calibration Certificate
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-2">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="installation" id="installation" value="1">
|
||||
<input class="form-check-input" type="checkbox" name="installation" id="installation" value="1" <?= in_array('IC', $cert_types) ? 'checked' : '' ?>>
|
||||
<label class="form-check-label" for="installation">
|
||||
Installation Certificate
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-2">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="maintenance" value="1" id="maintenance" >
|
||||
<input class="form-check-input" type="checkbox" name="maintenance" value="1" id="maintenance" <?= in_array('MC', $cert_types) ? 'checked' : '' ?>>
|
||||
<label class="form-check-label" for="maintenance">
|
||||
Maintenance Certificate
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-2">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="offreport" value="1" id="offreport" >
|
||||
<input class="form-check-input" type="checkbox" name="offreport" value="1" id="offreport" <?= (in_array('BAI', $cert_types) || in_array('BAP', $cert_types)) ? 'checked' : '' ?>>
|
||||
<label class="form-check-label" for="offreport">
|
||||
Berita Acara Instalasi
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-2">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="training" value="1" id="training" >
|
||||
<input class="form-check-input" type="checkbox" name="training" value="1" id="training" <?= in_array('UTC', $cert_types) ? 'checked' : '' ?>>
|
||||
<label class="form-check-label" for="training">
|
||||
User Training Certificate
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -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); }
|
||||
|
||||
@ -22,27 +22,28 @@
|
||||
placeholder="Search certificates by name, product, type, vendor, or dates...">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3 mb-2">
|
||||
<select id="productFilter" class="form-select form-select-sm">
|
||||
<option value="">--Product Filter--</option>
|
||||
<option value="tms">TMS</option>
|
||||
<option value="jokoh">Jokoh</option>
|
||||
<option value="mindray">Mindray</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3 mb-2">
|
||||
<select id="statusFilter" class="form-select form-select-sm">
|
||||
<option value="">--Status Filter--</option>
|
||||
<option value="active">Active</option>
|
||||
<option value="expired">Expired</option>
|
||||
<option value="expiring">Expiring Soon</option>
|
||||
<option value="not">Not Available</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3 mb-2">
|
||||
<select disabled id="validationFilter" class="form-select form-select-sm">
|
||||
<select id="validationFilter" class="form-select form-select-sm">
|
||||
<option value="">--Validation Filter--</option>
|
||||
<option value="validated">Validated</option>
|
||||
<option value="unvalidated">Unvalidated</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3 mb-2">
|
||||
<select id="typeFilter" class="form-select form-select-sm">
|
||||
<option value="">--Product Filter--</option>
|
||||
<option value="tms">TMS</option>
|
||||
<option value="jokoh">Jokoh</option>
|
||||
<option value="boeki">Tokyo Boeki</option>
|
||||
<option value="valid">Validated</option>
|
||||
<option value="unval">Unvalidated</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3 mb-2">
|
||||
@ -57,14 +58,14 @@
|
||||
<table id="certificatesTable" class="table table-striped table-hover border" style="width: 100%;">
|
||||
<thead class="table-primary">
|
||||
<tr>
|
||||
<th class="text-center" style="width: 3%">No</th>
|
||||
<th style="width: 20%">Certificate</th>
|
||||
<!-- <th class="text-center" style="width: 3%">No</th> -->
|
||||
<th style="width: 23%">Certificate</th>
|
||||
<th style="width: 28%">Act Report</th>
|
||||
<th style="width: 10%">Issue Date</th>
|
||||
<th style="width: 10%">Expiry Date</th>
|
||||
<th class="text-center" style="width: 7%">Status</th>
|
||||
<th class="text-center" style="width: 7%">Validation</th>
|
||||
<th class="text-center" style="width: 5%">Action</th>
|
||||
<th style="width: 9%">Status</th>
|
||||
<th style="width: 8%">Validation</th>
|
||||
<th class="text-center" style="width: 12%">Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@ -82,9 +83,9 @@
|
||||
<div class="modal fade" id="validateModal" tabindex="-1" aria-labelledby="validateModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog modal-xl modal-dialog-centered">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header bg-warning text-dark">
|
||||
<div class="modal-header bg-warning text-dark" id='modalHeader'>
|
||||
<h5 class="modal-title" id="validateModalLabel">
|
||||
<i class="fa-solid fa-check-double"></i> Validate Maintenance Certificate
|
||||
Validate Maintenance Certificate
|
||||
</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal"
|
||||
aria-label="Close"></button>
|
||||
@ -97,7 +98,7 @@
|
||||
<h5 id="modalCertName" class="mt-2 fw-bolder">-</h5>
|
||||
</div>
|
||||
<div class="col-md-4 text-md-end">
|
||||
<h5><span id="modalValidation" class="badge bg-warning text-dark">-</span></h5>
|
||||
<h5 id="modalValidation">-</h5>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -119,16 +120,16 @@
|
||||
<p id="modalSiteName" class="form-control-plaintext border-bottom fw-bolder">-</p>
|
||||
</div>
|
||||
<div class="col-md-4 mb-3">
|
||||
<label class="form-label text-success"><i class="fa-solid fa-calendar-check me-2"></i>Issue Date</label>
|
||||
<label class="form-label "><i class="fa-solid fa-calendar-check me-2"></i>Issue Date</label>
|
||||
<p id="modalIssueDate" class="form-control-plaintext border-bottom fw-bolder">-</p>
|
||||
</div>
|
||||
<div class="col-md-4 mb-3">
|
||||
<label class="form-label text-danger"><i class="fa-solid fa-calendar-xmark me-2"></i>Expiry Date</label>
|
||||
<label class="form-label "><i class="fa-solid fa-calendar-xmark me-2"></i>Expiry Date</label>
|
||||
<p id="modalExpiryDate" class="form-control-plaintext border-bottom fw-bolder">-</p>
|
||||
</div>
|
||||
<div class="col-md-4 mb-3">
|
||||
<label class="form-label">Expired Status</label>
|
||||
<p id="modalExpiryStatus" class="form-control-plaintext border-bottom">-</p>
|
||||
<p id="modalExpiredStatus" class="form-control-plaintext border-bottom">-</p>
|
||||
</div>
|
||||
|
||||
<div class="col-md-12 mb-4">
|
||||
@ -155,17 +156,10 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-warning border-0 shadow-sm d-flex align-items-center">
|
||||
<i class="fa-solid fa-circle-info fa-2xl me-3"></i>
|
||||
<div>
|
||||
<strong>Validation Note:</strong>
|
||||
Review data di berikut dengan teliti, setelah divalidasi maka sertifikat akan dinyatakan <strong>Valid</strong> dan <strong>sah secara sistem.</strong>
|
||||
</div>
|
||||
</div>
|
||||
<div id='modalInfo'></div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12 mb-3">
|
||||
<label class="form-label ">Certificate Preview</label>
|
||||
<div class="border rounded p-2" style="height: 500px; overflow: hidden;">
|
||||
<iframe id="certificatePreview" src="" style="width: 100%; height: 100%; border: none;"></iframe>
|
||||
</div>
|
||||
@ -195,7 +189,7 @@
|
||||
$(function () {
|
||||
|
||||
let table = $('#certificatesTable').DataTable({
|
||||
order: [[4, 'asc']],
|
||||
order: [[5, 'asc'], [4, 'asc']],
|
||||
pageLength: 25,
|
||||
dom: '<"row"<"col-md-6"l>>rtip',
|
||||
responsive: true,
|
||||
@ -245,25 +239,25 @@ $(function () {
|
||||
let expiryDate = new Date(expirydateRaw);
|
||||
let days = Math.ceil((expiryDate - today) / (1000 * 60 * 60 * 24));
|
||||
if (days < 0) {
|
||||
statusBadge = '<div class="text-center"><span class="badge bg-danger">Expired</span></div>';
|
||||
statusBadge = '<div class=""><span class="badge bg-danger">Expired</span></div>';
|
||||
} else if (days <= 30) {
|
||||
statusBadge = '<div class="text-center"><span class="badge bg-info">Expiring Soon</span></div>';
|
||||
statusBadge = '<div class=""><span class="badge bg-info">Expiring Soon</span></div>';
|
||||
} else {
|
||||
statusBadge = '<div class="text-center"><span class="badge bg-success">Active</span></div>';
|
||||
statusBadge = '<div class=""><span class="badge bg-success">Active</span></div>';
|
||||
}
|
||||
} else {
|
||||
statusBadge = '<div class="text-center"><span class="badge bg-secondary">n/a</span></div>';
|
||||
statusBadge = '<div class=""><span class="badge bg-dark">Not Available</span></div>';
|
||||
}
|
||||
|
||||
if (status == 'unvalidated') {
|
||||
|
||||
validationBadge = '<div class="text-center"><span class="badge bg-warning text-dark">unvalidated</span></div>';
|
||||
validationBadge = '<div class=""><span class="badge bg-warning text-dark">unvalidated</span></div>';
|
||||
} else {
|
||||
validationBadge = '<div class="text-center"><span class="badge bg-success">validated</span></div>';
|
||||
validationBadge = '<div class=""><span class="badge bg-success">validated</span></div>';
|
||||
}
|
||||
|
||||
return [
|
||||
index + 1,
|
||||
// index + 1,
|
||||
`<strong>${certname}</strong><br><small class="text-muted">Cert# : ${certnumber}</small>`,
|
||||
`<a href="javascript:void(0)" class="activity-report-link text-decoration-none" data-certid="${certid}" data-actid="${actid}" style="color:#d43215b0;">#${actid} - ${activity_subject} <i class="fa-solid fa-up-right-from-square"></i></strong><br><small class="text-muted">Owner : ${fullname}</small></a>`,
|
||||
issuedate,
|
||||
@ -271,8 +265,9 @@ $(function () {
|
||||
statusBadge,
|
||||
validationBadge,
|
||||
status == 'unvalidated'
|
||||
? `<div class="text-center"><button type="button" class="btn btn-warning text-dark btn-validate-modal" data-certid="${certid}"><i class="fa-solid fa-check-double"></i></button></div>`
|
||||
: `<div class="text-center"><button type="button" class="btn btn-success btn-view" data-certnumber="${certnumber}"><i class="fa-regular fa-file-pdf"></i></button></div>`
|
||||
? `<div class="text-center"><button type="button" class="btn btn-sm btn-warning text-dark btn-validate-modal" data-certid="${certid}"><i class="fa-solid fa-exclamation me-2"></i>Need Validation</button></div>`
|
||||
: `<div class="text-center mb-1"><button type="button" class="btn btn-sm btn-info btn-validate-modal" data-certid="${certid}"><i class="fa-regular fa-eye me-2"></i>Detail</button></div>
|
||||
<div class="text-center"><button type="button" class="btn btn-sm btn-success btn-view" data-certnumber="${certnumber}"><i class="fa-regular fa-file-pdf me-2"></i>Generated PDF</button></div>`
|
||||
];
|
||||
})
|
||||
});
|
||||
@ -284,26 +279,38 @@ $(function () {
|
||||
},
|
||||
columnDefs: [
|
||||
{
|
||||
// Kondisi untuk Kolom 4 (Status Masa Berlaku)
|
||||
targets: 4,
|
||||
render: function (data, type) {
|
||||
if (type === 'sort') {
|
||||
if (data.includes('need validation')) return 1;
|
||||
if (data.includes('expired')) return 2;
|
||||
if (data.includes('expiring soon')) return 3;
|
||||
if (data.includes('active')) return 4;
|
||||
return 5;
|
||||
let val = data.toLowerCase();
|
||||
if (val.includes('not available')) return 1;
|
||||
if (val.includes('expired')) return 2; // Merah - Paling kritis
|
||||
if (val.includes('expiring soon')) return 3; // Biru/Kuning
|
||||
// if (val.includes('active')) return 4; // Hijau
|
||||
return 4;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
},
|
||||
{
|
||||
targets: [5, 6],
|
||||
orderable: false
|
||||
// Kondisi untuk Kolom 5 (Validation)
|
||||
targets: 5,
|
||||
render: function (data, type) {
|
||||
if (type === 'sort') {
|
||||
let val = data.toLowerCase();
|
||||
if (val.includes('unvalidated')) return 1;
|
||||
if (val.includes('validated')) return 2;
|
||||
return 3;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
},
|
||||
{
|
||||
targets: 7,
|
||||
// Hapus angka 4 dari sini agar kolom 4 bisa di-klik untuk sorting
|
||||
targets: [6],
|
||||
orderable: false
|
||||
}
|
||||
},
|
||||
]
|
||||
});
|
||||
|
||||
@ -315,37 +322,50 @@ $(function () {
|
||||
});
|
||||
|
||||
// Type filter using DataTables column filter
|
||||
$('#typeFilter').on('change', function () {
|
||||
$('#productFilter').on('change', function () {
|
||||
let type = $(this).val();
|
||||
|
||||
// Filter by type column (index 1 - Certificate Name contains type info)
|
||||
if (type === '') {
|
||||
table.column(1).search('').draw();
|
||||
table.column(0).search('').draw();
|
||||
} else {
|
||||
// Capitalize first letter for search
|
||||
let typeText = type.charAt(0).toUpperCase() + type.slice(1);
|
||||
table.column(1).search(typeText).draw();
|
||||
table.column(0).search(typeText).draw();
|
||||
}
|
||||
});
|
||||
|
||||
$('#statusFilter').on('change', function () {
|
||||
$('#statusFilter').on('change', function () { // OK
|
||||
let status = $(this).val();
|
||||
|
||||
if (status === '') {
|
||||
table.column(5).search('').draw();
|
||||
table.column(4).search('').draw();
|
||||
} else if (status === 'active') {
|
||||
table.column(5).search('active').draw();
|
||||
table.column(4).search('active').draw();
|
||||
} else if (status === 'expired') {
|
||||
table.column(5).search('expired').draw();
|
||||
table.column(4).search('expired').draw();
|
||||
} else if (status === 'expiring') {
|
||||
table.column(5).search('expiring soon').draw();
|
||||
table.column(4).search('expiring soon').draw();
|
||||
} else if (status === 'not') {
|
||||
table.column(4).search('not available').draw();
|
||||
}
|
||||
});
|
||||
|
||||
$('#validationFilter').on('change', function () { // OK
|
||||
let validation = $(this).val();
|
||||
if (validation === '') {
|
||||
table.column(5).search('').draw();
|
||||
} else if (validation === 'unval') {
|
||||
table.column(5).search('unv').draw();
|
||||
} else if (validation === 'valid') {
|
||||
table.column(5).search('^validated$', true, false).draw();
|
||||
}
|
||||
});
|
||||
|
||||
// Reset
|
||||
window.resetFilters = function () {
|
||||
$('#searchInput, #statusFilter, #typeFilter').val('');
|
||||
table.search('').columns().search('').order([4,'asc']).draw();
|
||||
$('#searchInput, #statusFilter, #productFilter, #validationFilter').val('');
|
||||
table.search('').columns().search('').draw();
|
||||
};
|
||||
|
||||
// View PDF
|
||||
@ -389,30 +409,56 @@ $(function () {
|
||||
$('#modalExpiryDate').text(formattedDate);
|
||||
|
||||
$('#modalSiteName').text(data.sitename || '-');
|
||||
$('#modalValidation').html(`<i class="fa-solid fa-triangle-exclamation me-2"></i>${data.status || '-'}`);
|
||||
|
||||
// 1. Cek status validasi
|
||||
const isValid = data.status === 'validated';
|
||||
// 2. Siapkan variabel dinamis berdasarkan status
|
||||
const theme = isValid ? 'success' : 'warning';
|
||||
const icon = isValid ? 'fa-regular fa-circle-check' : 'fa-solid fa-triangle-exclamation';
|
||||
const note = isValid
|
||||
? 'Sertifikat Sudah Divalidasi'
|
||||
: 'Review data berikut dengan teliti, setelah divalidasi maka sertifikat akan dinyatakan <strong>Valid</strong> dan <strong>sah secara sistem.</strong>';
|
||||
// 3. Terapkan ke dalam HTML (struktur HTML ditulis satu kali saja)
|
||||
$('#modalHeader').removeClass('bg-warning bg-success').addClass(`bg-${theme} text-dark`);
|
||||
$('#modalValidation').html(
|
||||
`<span class="badge bg-${theme} text-dark py-2 px-3">
|
||||
<i class="${icon} me-2"></i>${data.status || '-'}
|
||||
</span>`
|
||||
);
|
||||
|
||||
$('#modalInfo').html(
|
||||
`<div class="alert alert-${theme} border-0 shadow-sm d-flex align-items-center">
|
||||
<i class="${icon} fs-4 me-3"></i>
|
||||
<div>
|
||||
<strong>Validation Note:</strong><br>
|
||||
${note}
|
||||
</div>
|
||||
</div>`
|
||||
);
|
||||
|
||||
let badge = '';
|
||||
const today = new Date();
|
||||
today.setHours(0, 0, 0, 0);
|
||||
const expiryDate = new Date(data.expired_date);
|
||||
expiryDate.setHours(0, 0, 0, 0);
|
||||
const diffTime = expiryDate - today;
|
||||
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
|
||||
let badge = '';
|
||||
if (diffDays < 0) {
|
||||
// Sudah melewati tanggal expired
|
||||
badge = '<span class="badge bg-danger">Expired</span>';
|
||||
} else if (diffDays <= 30) {
|
||||
// Masih aktif tapi sisa 30 hari atau kurang
|
||||
badge = '<span class="badge bg-warning">Expiring Soon</span>';
|
||||
if (data.expired_date == null) {
|
||||
badge = '<span class="badge bg-dark">Not Available</span>';
|
||||
} else {
|
||||
// Lebih dari 30 hari
|
||||
badge = '<span class="badge bg-success">Active</span>';
|
||||
const expiryDate = new Date(data.expired_date);
|
||||
expiryDate.setHours(0, 0, 0, 0);
|
||||
const diffTime = expiryDate - today;
|
||||
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
|
||||
if (diffDays < 0) {
|
||||
badge = '<span class="badge bg-danger">Expired</span>';
|
||||
}
|
||||
else if (diffDays <= 30) {
|
||||
badge = '<span class="badge bg-warning text-dark">Expiring Soon</span>';
|
||||
} else {
|
||||
badge = '<span class="badge bg-success">Active</span>';
|
||||
}
|
||||
}
|
||||
$('#modalExpiryStatus').html(badge);
|
||||
|
||||
|
||||
$('#modalExpiredStatus').html(badge);
|
||||
$('#modalActivity').text(data.actid ? `#${data.actid} - ${data.subject || '-'}` : '-');
|
||||
$('#modalActivityLink').attr('data-actid', data.actid || '');
|
||||
|
||||
$('#modalValOwner').html(data.user_validation_at ? `${data.username} - ${data.user_validation_at}<i class="fa-solid fa-circle-check text-success ms-2"></i>` : '-');
|
||||
$('#modalValSpv').html(data.spv_validation_at ? `${data.spvname} - ${data.spv_validation_at}<i class="fa-solid fa-circle-check text-success ms-2"></i>` : '-');
|
||||
$('#modalValManager').html(data.manager_validation_at ? `${data.managername} - ${data.manager_validation_at}<i class="fa-solid fa-circle-check text-success ms-2"></i>` : '-');
|
||||
|
||||
@ -73,7 +73,7 @@
|
||||
.signature-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin-bottom: 0px;
|
||||
margin-bottom: 41px;
|
||||
}
|
||||
.signature-table td {
|
||||
width: 50%; /* Membagi dua sisi sama rata */
|
||||
@ -103,34 +103,34 @@
|
||||
|
||||
<div class="container">
|
||||
<div class="instument-name">
|
||||
<h1> <<<?= $certificate['productname'] ?>>> </h1>
|
||||
<h1><?= $certificate['productname'] ?></h1>
|
||||
</div>
|
||||
|
||||
<div class="site-name">
|
||||
<h1> at <<<?= $certificate['sitename'] ?>>> </h1>
|
||||
<h1> at <?= $certificate['sitename'] ?> </h1>
|
||||
</div>
|
||||
|
||||
<div class="detail-information">
|
||||
<h4>Serial Number: <<<?= $certificate['productnumber'] ?>>></h4>
|
||||
<h4>Serial Number: <?= $certificate['productnumber'] ?></h4>
|
||||
|
||||
<h4>has completed through a series of <<<?= $certificate['certtype'] ?>>></h4>
|
||||
<h4>has completed through a series of <?= $certificate['certtype'] ?></h4>
|
||||
<h4>and the final result:</h4>
|
||||
<h2>PASSED</h2>
|
||||
<h4>Date of Instrument Maintenance and Inspection: <<<?= $certificate['issueddate'] ?>>></h4>
|
||||
<h4>Valid until <<<?= $certificate['expireddate'] ?>>></h4>
|
||||
<h4>Date of Instrument Maintenance and Inspection: <?= $certificate['issueddate'] ?></h4>
|
||||
<h4>Valid until <?= $certificate['expireddate'] ?></h4>
|
||||
</div>
|
||||
|
||||
<table class="signature-table">
|
||||
<tr>
|
||||
<td>
|
||||
<!-- <td>
|
||||
<span class="name">Adhitya Pranata Putra</span>
|
||||
<span class="position">Technical Support Manager</span>
|
||||
</td>
|
||||
</td> -->
|
||||
|
||||
<td>
|
||||
<span class="name"><<<?= $certificate['fullname'] ?>>></span>
|
||||
<span class="position"><<<?= $certificate['userposition'] ?>>></span>
|
||||
</td>
|
||||
<!-- <td>
|
||||
<span class="name"><?= $certificate['fullname'] ?></span>
|
||||
<span class="position"><?= $certificate['userposition'] ?></span>
|
||||
</td> -->
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@ -140,36 +140,38 @@
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Untuk Tanda Export PDF atau tidak -->
|
||||
<?php if (!isset($certificate['exportToPDF'])) : ?>
|
||||
<div class="container">
|
||||
<div class="instument-name">
|
||||
<h1> <<<?= $certificate['productname'] ?>>> </h1>
|
||||
<h1><?= $certificate['productname'] ?></h1>
|
||||
</div>
|
||||
|
||||
<div class="site-name">
|
||||
<h1> at <<<?= $certificate['sitename'] ?>>> </h1>
|
||||
<h1> at <?= $certificate['sitename'] ?> </h1>
|
||||
</div>
|
||||
|
||||
<div class="detail-information">
|
||||
<h4>Serial Number: <<<?= $certificate['productnumber'] ?>>></h4>
|
||||
<h4>Serial Number: <?= $certificate['productnumber'] ?></h4>
|
||||
|
||||
<h4>has completed through a series of <<<?= $certificate['certtype'] ?>>></h4>
|
||||
<h4>has completed through a series of <?= $certificate['certtype'] ?></h4>
|
||||
<h4>and the final result:</h4>
|
||||
<h2>PASSED</h2>
|
||||
<h4>Date of Instrument Maintenance and Inspection: <<<?= $certificate['issueddate'] ?>>></h4>
|
||||
<h4>Valid until <<<?= $certificate['expireddate'] ?>>></h4>
|
||||
<h4>Date of Instrument Maintenance and Inspection: <?= $certificate['issueddate'] ?></h4>
|
||||
<h4>Valid until <?= $certificate['expireddate'] ?></h4>
|
||||
</div>
|
||||
|
||||
<table class="signature-table">
|
||||
<tr>
|
||||
<td>
|
||||
<!-- <td>
|
||||
<span class="name">Adhitya Pranata Putra</span>
|
||||
<span class="position">Technical Support Manager</span>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<span class="name"><<<?= $certificate['fullname'] ?>>></span>
|
||||
<span class="position"><<<?= $certificate['userposition'] ?>>></span>
|
||||
</td>
|
||||
<span class="name"><?= $certificate['fullname'] ?></span>
|
||||
<span class="position"><?= $certificate['userposition'] ?></span>
|
||||
</td> -->
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@ -178,6 +180,6 @@
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<?php endif ?>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@ -41,10 +41,10 @@
|
||||
<li> <a class="has-arrow waves-effect waves-dark" href='javascript:void(0)' aria-expanded="false"> <i class="fa-solid fa-certificate"></i><span class='hide-menu'>Certificates</span> </a>
|
||||
<ul aria-expanded="false" class="collapse">
|
||||
<li><a href="<?=base_url();?>certificates/maintenance">Maintenance</a></li>
|
||||
<li><a href="<?=base_url();?>certificates/installation">Installation</a></li>
|
||||
<!-- <li><a href="<?=base_url();?>certificates/installation">Installation</a></li>
|
||||
<li><a href="<?=base_url();?>certificates/training">Training</a></li>
|
||||
<li><a href="<?=base_url();?>certificates/calibration">Callibration</a></li>
|
||||
<li><a href="<?=base_url();?>certificates/official-report">Official Report</a></li>
|
||||
<li><a href="<?=base_url();?>certificates/official-report">Official Report</a></li> -->
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user