diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index 073f857..ea82162 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -226,6 +226,15 @@ class DashboardController extends Controller $q->whereNull('tgl_expired') ->orWhereDate('tgl_expired', '>=', now()->toDateString()); }) + ->where(function ($q) { + $q->whereNull('master_kategori_directory_id') + ->orWhere('status_turt', 'approved'); + }) + ->where(function ($q) { + $q->where('is_akre', '!=', true) + ->orWhereNull('is_akre') + ->orWhere('status_mutu', 'approved'); + }) ->where('statusenabled', true) ->where('status_action', 'approved'); @@ -1158,6 +1167,15 @@ class DashboardController extends Controller $q->whereNull('tgl_expired') ->orWhereDate('tgl_expired', '>=', now()->toDateString()); }) + ->where(function ($q) { + $q->whereNull('master_kategori_directory_id') + ->orWhere('status_turt', 'approved'); + }) + ->where(function ($q) { + $q->where('is_akre', '!=', true) + ->orWhereNull('is_akre') + ->orWhere('status_mutu', 'approved'); + }) ->when(!empty($unitIds), function ($q) use ($unitIds) { $q->whereIn('id_unit_kerja', $unitIds); }); @@ -1334,7 +1352,7 @@ class DashboardController extends Controller throw new \RuntimeException('Upload file gagal pada segment ke-' . ($index+1)); } $status = $isAtasan ? 'approved' : null; - + dd($data); $payload = [ 'id_unit_kerja' => $id_unit_kerja, 'id_sub_unit_kerja' => $id_sub_unit_kerja, @@ -1713,11 +1731,21 @@ class DashboardController extends Controller private function buildRecapData(array $unitIds, string $keyword = ''): array { $rows = FileDirectory::where('statusenabled', true) - ->where(function ($q) { - $q->whereNull('tgl_expired') - ->orWhereDate('tgl_expired', '>=', now()->toDateString()); - }) - ->whereNotNull('status_action')->where('status_action', 'approved'); + ->where(function ($q) { + $q->whereNull('tgl_expired') + ->orWhereDate('tgl_expired', '>=', now()->toDateString()); + }) + ->where(function ($q) { + $q->whereNull('master_kategori_directory_id') + ->orWhere('status_turt', 'approved'); + }) + ->where(function ($q) { + $q->where('is_akre', '!=', true) + ->orWhereNull('is_akre') + ->orWhere('status_mutu', 'approved'); + }) + ->whereNotNull('status_action')->where('status_action', 'approved'); + // if(in_array(22, $unitIds)){ // $rows = $rows->pluck('file'); // }elseif(auth()->user()->username === "admin.turt"){ @@ -2917,6 +2945,15 @@ class DashboardController extends Controller ->with(['unit:id,name']) ->where('statusenabled', true) ->where('status_action', 'approved') + ->where(function ($q) { + $q->whereNull('master_kategori_directory_id') + ->orWhere('status_turt', 'approved'); + }) + ->where(function ($q) { + $q->where('is_akre', '!=', true) + ->orWhereNull('is_akre') + ->orWhere('status_mutu', 'approved'); + }) ->where('is_akre', true); // Logic Pencarian diff --git a/public/js/pengajuanFile/index.js b/public/js/pengajuanFile/index.js index eb22d4a..9068738 100644 --- a/public/js/pengajuanFile/index.js +++ b/public/js/pengajuanFile/index.js @@ -559,6 +559,105 @@ document.addEventListener('DOMContentLoaded', () => { if (window.$ && $.fn.select2) $(selectEl).trigger('change'); } + function formatDateForInput(date) { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; + } + + function formatDateDisplay(dateValue) { + if (!dateValue) return ''; + const date = new Date(`${dateValue}T00:00:00`); + if (Number.isNaN(date.getTime())) return ''; + + const day = String(date.getDate()).padStart(2, '0'); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const year = date.getFullYear(); + return `${day}/${month}/${year}`; + } + + function addYearsToDate(dateValue, years) { + if (!dateValue || !years) return ''; + const baseDate = new Date(`${dateValue}T00:00:00`); + if (Number.isNaN(baseDate.getTime())) return ''; + + const originalDay = baseDate.getDate(); + baseDate.setFullYear(baseDate.getFullYear() + Number(years)); + if (baseDate.getDate() !== originalDay) { + baseDate.setDate(0); + } + + return formatDateForInput(baseDate); + } + + function syncMasaBerlakuField(selectEl) { + if (!selectEl) return; + const fieldWrap = document.getElementById(selectEl.dataset.dateTarget); + const input = document.getElementById(selectEl.dataset.inputTarget); + const preview = document.getElementById(selectEl.dataset.previewTarget); + const baseInput = document.getElementById(selectEl.dataset.baseTarget); + if (!fieldWrap || !input) return; + + if (selectEl.value === 'custom') { + fieldWrap.classList.remove('d-none'); + input.disabled = false; + if (preview) preview.textContent = ''; + return; + } + + fieldWrap.classList.add('d-none'); + input.disabled = true; + input.value = ''; + + if (!preview) return; + if (!selectEl.value) { + preview.textContent = ''; + return; + } + + if (!baseInput || !baseInput.value) { + preview.textContent = 'Pilih Tanggal Terbit untuk melihat hasil masa berlaku.'; + return; + } + + const expiredDate = addYearsToDate(baseInput.value, selectEl.value); + preview.textContent = expiredDate ? `Tanggal kedaluwarsa: ${formatDateDisplay(expiredDate)}` : ''; + } + + function prepareExpiryInputs(formEl) { + const selects = formEl.querySelectorAll('.masa-berlaku-select'); + for (const selectEl of selects) { + const option = selectEl.value; + const dateInput = document.getElementById(selectEl.dataset.inputTarget); + const baseInput = document.getElementById(selectEl.dataset.baseTarget); + if (!dateInput) continue; + + if (!option) { + dateInput.value = ''; + dateInput.disabled = true; + continue; + } + + if (option === 'custom') { + if (!dateInput.value) { + return 'Tanggal kedaluwarsa wajib diisi saat memilih opsi Lainnya.'; + } + dateInput.disabled = false; + continue; + } + + if (!baseInput || !baseInput.value) { + return 'Tanggal Terbit wajib diisi saat memilih masa berlaku 1, 2, atau 3 tahun.'; + } + + dateInput.value = addYearsToDate(baseInput.value, option); + dateInput.disabled = false; + } + + return null; + } + function arrayFilterEmpty(arr){ return (arr || []).filter((val) => val !== null && val !== undefined && String(val).trim() !== ''); } @@ -718,9 +817,11 @@ document.addEventListener('DOMContentLoaded', () => { setChecked(byId('edit_perm_yes'), isPublic); setChecked(byId('edit_perm_no'), !isPublic); - const hasExpired = !!item.tgl_expired; - setChecked(byId('edit_has_expired'), hasExpired); - syncEditExpiredField(); + const editMasaBerlaku = byId('edit_masa_berlaku_option'); + if (editMasaBerlaku) { + editMasaBerlaku.value = item.tgl_expired ? 'custom' : ''; + syncMasaBerlakuField(editMasaBerlaku); + } const displayName = item.fileName || (item.file ? String(item.file).split('/').pop() : ''); setTextValue(byId('edit_current_file'), displayName ? `File saat ini: ${displayName}` : ''); @@ -747,19 +848,18 @@ document.addEventListener('DOMContentLoaded', () => { $("#modalEditPengajuanFile").modal('show'); } - function syncEditExpiredField() { - const editHasExpired = document.getElementById('edit_has_expired'); - const editExpiredInput = document.getElementById('edit_tgl_expired'); - if (!editHasExpired || !editExpiredInput) return; - editExpiredInput.disabled = !editHasExpired.checked; - if (!editHasExpired.checked) { - editExpiredInput.value = ''; - } + const editMasaBerlaku = document.getElementById('edit_masa_berlaku_option'); + if (editMasaBerlaku) { + editMasaBerlaku.addEventListener('change', function() { + syncMasaBerlakuField(editMasaBerlaku); + }); } - const editHasExpired = document.getElementById('edit_has_expired'); - if (editHasExpired) { - editHasExpired.addEventListener('change', syncEditExpiredField); + const editTanggalTerbit = document.getElementById('edit_tanggal_terbit'); + if (editTanggalTerbit) { + editTanggalTerbit.addEventListener('change', function() { + if (editMasaBerlaku) syncMasaBerlakuField(editMasaBerlaku); + }); } if (editForm) { @@ -770,6 +870,11 @@ document.addEventListener('DOMContentLoaded', () => { Swal.fire({ icon: 'error', title: 'Gagal', text: 'ID dokumen tidak ditemukan.' }); return; } + const expiryError = prepareExpiryInputs(editForm); + if (expiryError) { + Swal.fire({ icon: 'warning', title: 'Validasi form', text: expiryError }); + return; + } const formData = new FormData(editForm); fetch(`/pengajuan-file/${id}/update`, { @@ -809,12 +914,15 @@ document.addEventListener('DOMContentLoaded', () => { // ===== Upload baru (seperti dataUnit) ===== document.addEventListener('change', function(e){ - if(!e.target.classList.contains('toggle-expired')) return; - const targetId = e.target.getAttribute('data-target'); - if(!targetId) return; - const fieldWrap = document.getElementById(targetId); - const input = fieldWrap?.querySelector('input'); - if (input) input.disabled = !e.target.checked; + if(!e.target.classList.contains('masa-berlaku-select')) return; + syncMasaBerlakuField(e.target); + }); + + document.addEventListener('change', function(e){ + if (!e.target.matches('input[type="date"][id^="dateActive_"]')) return; + const index = e.target.id.replace('dateActive_', ''); + const selectEl = document.querySelector(`.masa-berlaku-select[data-index="${index}"]`); + if (selectEl) syncMasaBerlakuField(selectEl); }); function resetCreateForm(){ @@ -827,6 +935,7 @@ document.addEventListener('DOMContentLoaded', () => { $(formCreate).find('input[type="file"]').val(''); $(formCreate).find('.file-name').addClass('d-none').text(''); } + document.querySelectorAll('.masa-berlaku-select').forEach(syncMasaBerlakuField); resetAkreFields(0); enableAkreFields(0); } @@ -1056,22 +1165,33 @@ document.addEventListener('DOMContentLoaded', () => { + name="data[${colCount}][date_active]" + id="dateActive_${colCount}"> -