diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index b56bac9..d0280d1 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -195,6 +195,10 @@ class DashboardController extends Controller ->when(!empty($unitFilter), function($q) use($unitFilter){ $q->whereIn('id_unit_kerja', $unitFilter); }) + ->where(function ($q) { + $q->whereNull('tgl_expired') + ->orWhereDate('tgl_expired', '>=', now()->toDateString()); + }) ->where('statusenabled', true) ->where('status_action', 'approved'); @@ -1041,6 +1045,10 @@ class DashboardController extends Controller } $baseQuery = FileDirectory::with('kategori') ->where('statusenabled', true)->where('status_action', 'approved') + ->where(function ($q) { + $q->whereNull('tgl_expired') + ->orWhereDate('tgl_expired', '>=', now()->toDateString()); + }) ->when(!empty($unitIds), function ($q) use ($unitIds) { $q->whereIn('id_unit_kerja', $unitIds); }); @@ -1336,8 +1344,8 @@ class DashboardController extends Controller $mapping = MappingUnitKerjaPegawai::where('statusenabled', true) ->where('objectpegawaifk', $user->id)->where('isprimary', true) ->first(); - - + + $payloadLog = [ 'file_directory_id' => $fileDirectoryId, 'pegawai_id_entry' => auth()->user()->dataUser->id, @@ -1560,7 +1568,6 @@ class DashboardController extends Controller ] ]); } catch (\Throwable $th) { - dd($th); return response()->json([ 'status' => false, 'message' => 'Gagal! mendapatkan data' @@ -1571,7 +1578,11 @@ class DashboardController extends Controller private function buildRecapData(array $unitIds, string $keyword = ''): array { $rows = FileDirectory::where('statusenabled', true) - ->whereNotNull('status_action')->where('status_action', 'approved'); + ->where(function ($q) { + $q->whereNull('tgl_expired') + ->orWhereDate('tgl_expired', '>=', now()->toDateString()); + }) + ->whereNotNull('status_action')->where('status_action', 'approved'); if(in_array(22, $unitIds)){ $rows = $rows->pluck('file'); }elseif(auth()->user()->username === "admin.turt"){ @@ -2455,4 +2466,249 @@ class DashboardController extends Controller ] ]); } + + public function expDokumen(){ + $katDok = MasterKategori::where('statusenabled', true)->select('master_kategori_directory_id', 'nama_kategori_directory')->get(); + $authMapping = auth()->user()?->dataUser?->mappingUnitKerjaPegawai[0]; + $authUnitKerja = $authMapping->objectunitkerjapegawaifk ?? null; + $authSubUnitKerja = $authMapping->objectsubunitkerjapegawaifk ?? null; + $data = [ + 'title' => 'Dashboard', + 'katDok' => $katDok, + 'authUnitKerja' => $authUnitKerja, + 'authSubUnitKerja' => $authSubUnitKerja, + ]; + return view('expDokumen.index', $data); + } + + public function dataUnitExp(){ + $perPage = (int) request('per_page', 10); + // $authUnitId = auth()->user()->dataUser?->mappingUnitKerjaPegawai[0]?->objectunitkerjapegawaifk; + $userId = auth()->user()->dataUser->id ?? 937; + $mapping = MappingUnitKerjaPegawai::where('statusenabled', true) + ->where('objectpegawaifk', $userId) + ->get(['objectunitkerjapegawaifk']); + $unitIds = $mapping->pluck('objectunitkerjapegawaifk') + ->filter() // buang null + ->unique() + ->values() + ->toArray(); + $keyword = request('keyword'); + $kategori = request('kategori'); + $kategoriHeader = request('kategori_header'); + $unitFilter = request('unit'); + $kategoriValues = is_array($kategori) + ? array_values(array_filter($kategori)) + : array_values(array_filter(explode(',', (string) $kategori))); + $kategoriHeaderValues = is_array($kategoriHeader) + ? array_values(array_filter($kategoriHeader)) + : array_values(array_filter(explode(',', (string) $kategoriHeader))); + $allKategoriValues = array_values(array_filter(array_merge($kategoriValues, $kategoriHeaderValues))); + $kategoriTypes = []; + $kategoriIds = []; + $kategoriHukumValues = []; + foreach ($allKategoriValues as $val) { + $lower = strtolower(trim((string) $val)); + if (str_starts_with($lower, 'hukum:')) { + $hukumVal = trim(substr((string) $val, strlen('hukum:'))); + if ($hukumVal !== '') { + $kategoriHukumValues[] = $hukumVal; + } + continue; + } + if (in_array($lower, ['akreditasi', 'akre'], true)) { + $kategoriTypes[] = 'akreditasi'; + continue; + } + if ($lower === 'hukum') { + $kategoriTypes[] = 'hukum'; + continue; + } + if ($lower === 'lainnya') { + $kategoriTypes[] = 'lainnya'; + continue; + } + $kategoriIds[] = $val; + } + $baseQuery = FileDirectory::with('kategori') + ->when(!empty($unitFilter), function($q) use($unitFilter){ + $q->whereIn('id_unit_kerja', $unitFilter); + }) + ->whereNotNull('tgl_expired') + ->whereDate('tgl_expired', '<', now()->toDateString()) + ->where('statusenabled', true) + ->where('status_action', 'approved'); + + if(in_array(22, $unitIds)){ + }elseif(auth()->user()->username === "admin.turt"){ + + }else{ + $baseQuery = $baseQuery->whereIn('id_unit_kerja', $unitIds); + } + + $query = (clone $baseQuery) + ->when(!empty($kategoriIds) || !empty($kategoriTypes) || !empty($kategoriHukumValues), function ($q) use ($kategoriIds, $kategoriTypes, $kategoriHukumValues) { + $q->where(function ($sub) use ($kategoriIds, $kategoriTypes, $kategoriHukumValues) { + $hasClause = false; + if (!empty($kategoriIds)) { + $sub->whereIn('master_kategori_directory_id', $kategoriIds); + $hasClause = true; + } + if (!empty($kategoriHukumValues)) { + $hasClause ? $sub->orWhereIn('kategori_hukum', $kategoriHukumValues) : $sub->whereIn('kategori_hukum', $kategoriHukumValues); + $hasClause = true; + } + if (in_array('akreditasi', $kategoriTypes, true)) { + $sub->where('is_akre', true); + $hasClause = true; + } + if (in_array('hukum', $kategoriTypes, true)) { + $hasClause ? $sub->orWhereNotNull('kategori_hukum') : $sub->whereNotNull('kategori_hukum'); + $hasClause = true; + } + if (in_array('lainnya', $kategoriTypes, true)) { + $hasClause ? $sub->orWhereNotNull('master_kategori_directory_id') : $sub->whereNotNull('master_kategori_directory_id'); + } + }); + }) + ->when($keyword, function ($q) use ($keyword) { + $q->where(function ($sub) use ($keyword) { + $sub->where('nama_dokumen', 'ILIKE', "%{$keyword}%") + ->orWhere('no_dokumen', 'ILIKE', "%{$keyword}%"); + }); + }); + + $data = $query->orderBy('entry_at', 'desc') + ->paginate($perPage); + + $items = collect($data->items())->map(function($item){ + $item->nama_kategori = $item->kategori->nama_kategori_directory ?? $item->kategori_hukum ?? null; + return $item; + }); + $kategoriList = (clone $baseQuery)->get()->map(function($item){ + if (!empty($item->kategori_hukum)) { + return ['id' => 'hukum:' . $item->kategori_hukum, 'label' => $item->kategori_hukum]; + } + $label = $item->kategori->nama_kategori_directory ?? $item->nama_kategori_directory ?? 'Kategori'; + $id = $item->master_kategori_directory_id ?? $label; + return ['id' => (string) $id, 'label' => $label]; + })->unique('id')->values(); + + $payload = [ + 'status' => true, + 'message' => 'Berhasil mendapatkan data', + 'data' => $items, + 'kategori_list' => $kategoriList, + 'pagination' => [ + 'current_page' => $data->currentPage(), + 'next_page' => $data->hasMorePages() ? $data->currentPage() + 1 : null, + 'has_more' => $data->hasMorePages(), + 'last_page' => $data->lastPage(), + 'per_page' => $data->perPage(), + 'total' => $data->total(), + ] + ]; + return response()->json($payload); + } + + public function recapDataExp(){ + try { + $perPage = (int) request('per_page', 10); + $page = max(1, (int) request('page', 1)); + $keyword = strtolower(request('keyword', '')); + // $authUnit = auth()->user()->masterPersetujuan->details->pluck('unit_pegawai_id')->unique()->toArray(); + $user = auth()->user()->dataUser; + $unitIds = []; + if($user){ + $mapping = MappingUnitKerjaPegawai::where('statusenabled', true) + ->where('objectpegawaifk', $user->id) + ->get(['objectunitkerjapegawaifk', 'objectsubunitkerjapegawaifk']); + $unitIds = $mapping->pluck('objectunitkerjapegawaifk') + ->filter() // buang null + ->unique() + ->values() + ->all(); + } + $result = $this->buildRecapDataExp($unitIds, $keyword); + // paginate manually + $total = count($result); + $chunks = array_chunk($result, $perPage); + $currentData = $chunks[$page-1] ?? []; + + return response()->json([ + 'status' => true, + 'data' => $currentData, + 'message' => 'Berhasil mendapatkan data', + 'pagination' => [ + 'current_page' => $page, + 'per_page' => $perPage, + 'total' => $total, + 'last_page' => max(1, ceil($total / $perPage)), + 'has_more' => $page < max(1, ceil($total / $perPage)), + ] + ]); + } catch (\Throwable $th) { + return response()->json([ + 'status' => false, + 'message' => 'Gagal! mendapatkan data' + ]); + } + } + + private function buildRecapDataExp(array $unitIds, string $keyword = ''): array + { + $rows = FileDirectory::where('statusenabled', true) + ->whereNotNull('tgl_expired') + ->whereDate('tgl_expired', '<', now()->toDateString()) + ->whereNotNull('status_action')->where('status_action', 'approved'); + if(in_array(22, $unitIds)){ + $rows = $rows->pluck('file'); + }elseif(auth()->user()->username === "admin.turt"){ + $rows = $rows->pluck('file'); + }else{ + $rows = $rows->whereIn('id_unit_kerja', $unitIds)->pluck('file'); + } + $grouped = []; + foreach ($rows as $path) { + $parts = array_values(array_filter(explode('/', $path))); + if (count($parts) < 4) { + continue; + } + $unit = $parts[0]; + $folder = $parts[2]; + + if ($keyword) { + $hit = str_contains(strtolower($unit), $keyword) || str_contains(strtolower($folder), $keyword); + if (!$hit) { + continue; + } + } + if (!isset($grouped[$unit])) { + $grouped[$unit] = []; + } + if (!isset($grouped[$unit][$folder])) { + $grouped[$unit][$folder] = 0; + } + $grouped[$unit][$folder]++; + } + + $result = []; + foreach ($grouped as $unitName => $folders) { + $data = []; + foreach ($folders as $folder => $count) { + $data[] = [ + 'folder' => $folder, + 'count' => $count, + ]; + } + usort($data, fn($a, $b) => $b['count'] <=> $a['count']); + $result[] = [ + 'unit' => $unitName, + 'data' => $data, + ]; + } + + return $result; + } + } diff --git a/resources/views/dataUmum/index.blade.php b/resources/views/dataUmum/index.blade.php index bb354df..3f96c78 100644 --- a/resources/views/dataUmum/index.blade.php +++ b/resources/views/dataUmum/index.blade.php @@ -542,7 +542,7 @@ if(pageData.length === 0){ tbody.innerHTML = ` - + Tidak ada data yang cocok diff --git a/resources/views/dataUnit/index.blade.php b/resources/views/dataUnit/index.blade.php index aa5b52d..38f60b1 100644 --- a/resources/views/dataUnit/index.blade.php +++ b/resources/views/dataUnit/index.blade.php @@ -664,7 +664,7 @@ if(pageData.length === 0){ tbody.innerHTML = ` - + Tidak ada data yang cocok diff --git a/resources/views/expDokumen/index.blade.php b/resources/views/expDokumen/index.blade.php new file mode 100644 index 0000000..0ba6883 --- /dev/null +++ b/resources/views/expDokumen/index.blade.php @@ -0,0 +1,1450 @@ +@extends('layout.main') + +@section('body_main') +
+
+
+
+
+

Dokumen Expired

+
+ + + + Download Excel + +
+ + + + + 0 dipilih + +
+
+
+
+
+ + + +
+ +
+
+ + + + + + + + + + + + + + + + +
+ + AksiNo DokumenNama Dokumen +
+ Kategori + +
+
UnitTanggal UnggahPengunggah
+
+ +
+
+ Tampilkan + + data +
+ +
+ +
+ Memuat data... +
+
+
+ +
+
+
Data Rekap
+
+ @include('expDokumen.section.recap') +
+ +
+
+
+ @include('dataUnit.modal.create') + @include('dataUnit.modal.view') + + +@endsection diff --git a/resources/views/expDokumen/section/recap.blade.php b/resources/views/expDokumen/section/recap.blade.php new file mode 100644 index 0000000..c7f30fb --- /dev/null +++ b/resources/views/expDokumen/section/recap.blade.php @@ -0,0 +1,152 @@ +@php($showRecapTitle = $showRecapTitle ?? true) +
+ @if ($showRecapTitle) +
+

Rekap Dokumen Expired

+ Ringkasan jumlah file per Unit dan Kategori +
+ @endif +
+
+ + + + +
+ + +
+
+
+ + + + + + + + + + + + + + +
#Unit / AkreditasiKategoriJumlah File
Memuat data...
+
+
+ + diff --git a/resources/views/layout/partials/sidenav.blade.php b/resources/views/layout/partials/sidenav.blade.php index 69f6584..0aaeebb 100644 --- a/resources/views/layout/partials/sidenav.blade.php +++ b/resources/views/layout/partials/sidenav.blade.php @@ -106,6 +106,13 @@ --}} {{-- MASTER --}} + + @if(!Auth::guard('admin')->check()) @if(auth()->user()->dataUser->mappingUnitKerjaPegawai()->where('objectunitkerjapegawaifk', 43)->exists()) diff --git a/routes/web.php b/routes/web.php index af98f67..455b1bc 100644 --- a/routes/web.php +++ b/routes/web.php @@ -66,18 +66,22 @@ Route::middleware(['auth:admin,web'])->group(function(){ Route::post('/pengajuan-file/{id}/update', [DashboardController::class, 'updatePengajuanFile']); // Route::middleware(['master.persetujuan'])->group(function () { - Route::get('/pending-file', [DashboardController::class, 'pendingFile']); - Route::get('/datatable/pending-file', [DashboardController::class, 'dataPendingFile']); - Route::post('/pending-file/{id}/approve', [DashboardController::class, 'approvePendingFile']); - Route::post('/pending-file/approve-multiple', [DashboardController::class, 'approvePendingFileMultiple']); - Route::post('/pending-file/{id}/reject', [DashboardController::class, 'rejectPendingFile']); - Route::get('/data/count-pending', [DashboardController::class, 'countDataPending']); - Route::get('/data/count-rejected', [DashboardController::class, 'countRejectedPengajuan']); + Route::get('/pending-file', [DashboardController::class, 'pendingFile']); + Route::get('/datatable/pending-file', [DashboardController::class, 'dataPendingFile']); + Route::post('/pending-file/{id}/approve', [DashboardController::class, 'approvePendingFile']); + Route::post('/pending-file/approve-multiple', [DashboardController::class, 'approvePendingFileMultiple']); + Route::post('/pending-file/{id}/reject', [DashboardController::class, 'rejectPendingFile']); + Route::get('/data/count-pending', [DashboardController::class, 'countDataPending']); + Route::get('/data/count-rejected', [DashboardController::class, 'countRejectedPengajuan']); // }); Route::get('/data/notifications', [DashboardController::class, 'notifkasiList']); Route::post('/data/notifications/read', [DashboardController::class, 'notifkasiMarkRead']); Route::get('/data/log-dokumen', [DashboardController::class, 'logDokumen']); + + Route::get('/expired-dokumen', [DashboardController::class, 'expDokumen']); + Route::get('/data/expired-dokumen', [DashboardController::class, 'dataUnitExp']); + Route::get('/data/recapExp', [DashboardController::class, 'recapDataExp']); }); Route::get('/login', [AuthController::class, 'index'])->name('login');