diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php
index d0280d1..625af0b 100644
--- a/app/Http/Controllers/DashboardController.php
+++ b/app/Http/Controllers/DashboardController.php
@@ -144,16 +144,40 @@ class DashboardController extends Controller
public function dataUnitInternal(){
$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)
+ $user = auth()->user();
+ $isAdmin = auth('admin')->check();
+ $pegawaiId = $user?->dataUser?->id;
+
+ $unitIds = [];
+ if (!$isAdmin) {
+ if (!$pegawaiId) {
+ return response()->json([
+ 'status' => false,
+ 'message' => 'Pegawai tidak ditemukan',
+ 'data' => [],
+ 'kategori_list' => [],
+ 'pagination' => [
+ 'current_page' => 1,
+ 'next_page' => null,
+ 'has_more' => false,
+ 'last_page' => 1,
+ 'per_page' => $perPage,
+ 'total' => 0,
+ ],
+ ], 404);
+ }
+
+ $mapping = MappingUnitKerjaPegawai::where('statusenabled', true)
+ ->where('objectpegawaifk', $pegawaiId)
->get(['objectunitkerjapegawaifk']);
- $unitIds = $mapping->pluck('objectunitkerjapegawaifk')
- ->filter() // buang null
- ->unique()
- ->values()
- ->toArray();
+
+ $unitIds = $mapping->pluck('objectunitkerjapegawaifk')
+ ->filter(fn ($v) => $v !== null && $v !== '')
+ ->map(fn ($v) => (int) $v)
+ ->unique()
+ ->values()
+ ->toArray();
+ }
$keyword = request('keyword');
$kategori = request('kategori');
$kategoriHeader = request('kategori_header');
@@ -202,11 +226,14 @@ class DashboardController extends Controller
->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);
+ if (!$isAdmin) {
+ if (in_array(22, $unitIds, true)) {
+ // akses semua unit
+ } elseif (($user?->username === 'admin.turt')) {
+ // akses semua unit (exception user)
+ } else {
+ $baseQuery = $baseQuery->whereIn('id_unit_kerja', $unitIds);
+ }
}
$query = (clone $baseQuery)
@@ -235,6 +262,7 @@ class DashboardController extends Controller
});
})
->when($keyword, function ($q) use ($keyword) {
+
$q->where(function ($sub) use ($keyword) {
$sub->where('nama_dokumen', 'ILIKE', "%{$keyword}%")
->orWhere('no_dokumen', 'ILIKE', "%{$keyword}%");
@@ -1312,10 +1340,17 @@ class DashboardController extends Controller
'data' => $file
]);
}
- $userUnitIds = auth()->user()
- ->dataUser
- ->mappingUnitKerjaPegawai
- ->pluck('objectunitkerjapegawaifk');
+
+ $user = auth()->user();
+ $isAdmin = auth('admin')->check();
+ if ($isAdmin || ($user?->username === 'admin.turt')) {
+ return view('pdf.index', [
+ 'id' => $id,
+ 'data' => $file
+ ]);
+ }
+
+ $userUnitIds = $user?->dataUser?->mappingUnitKerjaPegawai?->pluck('objectunitkerjapegawaifk') ?? collect();
// cek apakah unit file termasuk unit user
if ($userUnitIds->contains($file->id_unit_kerja)) {
@@ -1962,6 +1997,14 @@ class DashboardController extends Controller
public function notifkasiList()
{
try {
+ if (auth('admin')->check()) {
+ return response()->json([
+ 'status' => true,
+ 'data' => [],
+ 'unread' => 0
+ ]);
+ }
+
$pegawaiId = auth()->user()?->dataUser?->id;
if (!$pegawaiId) {
return response()->json([
@@ -1996,6 +2039,13 @@ class DashboardController extends Controller
public function notifkasiMarkRead()
{
try {
+ if (auth('admin')->check()) {
+ return response()->json([
+ 'status' => true,
+ 'message' => 'Notifikasi ditandai dibaca'
+ ]);
+ }
+
$pegawaiId = auth()->user()?->dataUser?->id;
if (!$pegawaiId) {
return response()->json([
@@ -2020,6 +2070,228 @@ class DashboardController extends Controller
}
}
+ public function expiredNotifkasiList()
+ {
+ try {
+ $user = auth()->user();
+ $pegawaiId = $user?->dataUser?->id;
+ $isAdmin = auth('admin')->check();
+ $unitIds = [];
+ if (!$isAdmin) {
+ // if (!$pegawaiId) {
+ // return response()->json([
+ // 'status' => false,
+ // 'message' => 'Pegawai tidak ditemukan',
+ // 'data' => [],
+ // 'unread' => 0
+ // ], 404);
+ // }
+
+ $mapping = MappingUnitKerjaPegawai::where('statusenabled', true)
+ ->where('objectpegawaifk', $pegawaiId)
+ ->get(['objectunitkerjapegawaifk']);
+
+ $unitIds = $mapping->pluck('objectunitkerjapegawaifk')
+ ->filter(fn ($v) => $v !== null && $v !== '')
+ ->map(fn ($v) => (int) $v)
+ ->unique()
+ ->values()
+ ->toArray();
+ }
+
+ $baseQuery = FileDirectory::query()
+ ->where('statusenabled', true)
+ ->where('status_action', 'approved')
+ ->whereNotNull('tgl_expired')
+ ->whereBetween('tgl_expired', [
+ now()->startOfDay(),
+ now()->addMonth()->endOfDay()
+ ]);
+
+ if (!$isAdmin && !in_array(22, $unitIds, true) && ($user?->username !== 'admin.turt')) {
+ $baseQuery->whereIn('id_unit_kerja', $unitIds);
+ }
+
+ $seenAtRaw = session('expired_notif_seen_at');
+ $seenAt = $seenAtRaw ? Carbon::parse($seenAtRaw) : null;
+ $unreadQuery = (clone $baseQuery);
+ if ($seenAt) {
+ $unreadQuery->whereDate('tgl_expired', '>=', $seenAt->toDateString());
+ }
+ $unread = (int) $unreadQuery->count();
+
+ $rows = (clone $baseQuery)
+ ->orderBy('tgl_expired', 'desc')
+ ->orderBy('entry_at', 'desc')
+ ->limit(20)
+ ->get([
+ 'file_directory_id',
+ 'nama_dokumen',
+ 'no_dokumen',
+ 'tgl_expired',
+ 'file',
+ ]);
+ $items = $rows->map(function ($row) use ($seenAt) {
+ $expiredAt = $row->tgl_expired ? Carbon::parse($row->tgl_expired)->format('d/m/Y') : '-';
+ $namaDokumen = $row->nama_dokumen ?: ($row->no_dokumen ?: 'Dokumen');
+ $text = "Dokumen '{$namaDokumen}' expired pada {$expiredAt}";
+ $isRead = false;
+ if ($seenAt && $row->tgl_expired) {
+ $isRead = Carbon::parse($row->tgl_expired)->toDateString() < $seenAt->toDateString();
+ }
+
+ return [
+ 'id' => $row->file_directory_id,
+ 'text_notifikasi' => $text,
+ 'url' => url("/file-preview/{$row->file_directory_id}"),
+ 'is_read' => $isRead,
+ 'created_at' => $expiredAt,
+ 'meta' => [
+ 'no_dokumen' => $row->no_dokumen,
+ 'nama_dokumen' => $row->nama_dokumen,
+ 'tgl_expired' => $row->tgl_expired,
+ 'file' => $row->file,
+ ],
+ ];
+ });
+
+ return response()->json([
+ 'status' => true,
+ 'data' => $items,
+ 'unread' => $unread,
+ ]);
+ } catch (\Throwable $th) {
+ return response()->json([
+ 'status' => false,
+ 'message' => 'Terdapat kesalahan!',
+ 'data' => [],
+ 'unread' => 0
+ ], 500);
+ }
+ }
+
+ public function expiredNotifkasiDetail(Request $request)
+ {
+ try {
+ $user = auth()->user();
+ $pegawaiId = $user?->dataUser?->id;
+ $isAdmin = auth('admin')->check();
+
+ $unitIds = [];
+ if (!$isAdmin) {
+ $mapping = MappingUnitKerjaPegawai::where('statusenabled', true)
+ ->where('objectpegawaifk', $pegawaiId)
+ ->get(['objectunitkerjapegawaifk']);
+
+ $unitIds = $mapping->pluck('objectunitkerjapegawaifk')
+ ->filter(fn ($v) => $v !== null && $v !== '')
+ ->map(fn ($v) => (int) $v)
+ ->unique()
+ ->values()
+ ->toArray();
+ }
+
+ $docId = (int) $request->query('doc_id', 0);
+ $daysLeftMinRaw = $request->query('days_left_min');
+ $daysLeftMaxRaw = $request->query('days_left_max');
+
+ $page = max(1, (int) $request->query('page', 1));
+ $perPage = (int) $request->query('per_page', 10);
+ $perPage = max(5, min(50, $perPage));
+
+ $today = Carbon::now()->startOfDay();
+ $query = FileDirectory::query()
+ ->where('statusenabled', true)
+ ->where('status_action', 'approved')
+ ->whereNotNull('tgl_expired')
+ ->whereDate('tgl_expired', '>=', $today->toDateString());
+
+ if (!$isAdmin && !in_array(22, $unitIds, true) && ($user?->username !== 'admin.turt')) {
+ $query->whereIn('id_unit_kerja', $unitIds);
+ }
+
+ if ($docId > 0) {
+ $query->where('file_directory_id', $docId);
+ }
+
+ $daysLeftMin = null;
+ if ($daysLeftMinRaw !== null && $daysLeftMinRaw !== '') {
+ $daysLeftMin = max(0, (int) $daysLeftMinRaw);
+ $query->whereDate('tgl_expired', '>=', (clone $today)->addDays($daysLeftMin)->toDateString());
+ }
+
+ $daysLeftMax = null;
+ if ($daysLeftMaxRaw !== null && $daysLeftMaxRaw !== '') {
+ $daysLeftMax = max(0, (int) $daysLeftMaxRaw);
+ $query->whereDate('tgl_expired', '<=', (clone $today)->addDays($daysLeftMax)->toDateString());
+ }
+
+ if ($daysLeftMin === null && $daysLeftMax === null && $docId <= 0) {
+ $query->whereDate('tgl_expired', '<=', (clone $today)->addMonth()->endOfDay()->toDateString());
+ }
+ $total = (clone $query)->count();
+ $rows = $query
+ ->orderBy('tgl_expired', 'asc')
+ ->orderBy('entry_at', 'desc')
+ ->forPage($page, $perPage)
+ ->get([
+ 'file_directory_id',
+ 'nama_dokumen',
+ 'no_dokumen',
+ 'tgl_expired',
+ 'id_unit_kerja'
+ ]);
+ $data = $rows->map(function ($row) use ($today) {
+ $expiredAt = $row->tgl_expired ? Carbon::parse($row->tgl_expired)->startOfDay() : null;
+ $daysLeft = $expiredAt ? $today->diffInDays($expiredAt, false) : null;
+
+ return [
+ 'id' => $row->file_directory_id,
+ 'no_dokumen' => $row->no_dokumen,
+ 'nama_dokumen' => $row->nama_dokumen,
+ 'unit_name' => $row->unit?->name,
+ 'tgl_expired' => $expiredAt ? $expiredAt->toDateString() : null,
+ 'tgl_expired_label' => $expiredAt ? $expiredAt->format('d/m/Y') : '-',
+ 'days_left' => $daysLeft,
+ 'preview_url' => url("/full-preview/{$row->file_directory_id}"),
+ ];
+ })->values();
+
+ return response()->json([
+ 'status' => true,
+ 'data' => $data,
+ 'meta' => [
+ 'page' => $page,
+ 'per_page' => $perPage,
+ 'total' => $total,
+ ],
+ ]);
+ } catch (\Throwable $th) {
+ return response()->json([
+ 'status' => false,
+ 'message' => 'Terdapat kesalahan!',
+ 'data' => [],
+ ], 500);
+ }
+ }
+
+ public function expiredNotifkasiMarkRead()
+ {
+ try {
+ session(['expired_notif_seen_at' => now()->toISOString()]);
+
+ return response()->json([
+ 'status' => true,
+ 'message' => 'Notifikasi expired ditandai dibaca'
+ ]);
+ } catch (\Throwable $th) {
+ return response()->json([
+ 'status' => false,
+ 'message' => 'Terdapat kesalahan!'
+ ], 500);
+ }
+ }
+
public function pengajuanFile(){
$katDok = MasterKategori::where('statusenabled', true)
->select('master_kategori_directory_id', 'nama_kategori_directory')
diff --git a/resources/views/layout/partials/topnav.blade.php b/resources/views/layout/partials/topnav.blade.php
index 6111e12..15a40ec 100644
--- a/resources/views/layout/partials/topnav.blade.php
+++ b/resources/views/layout/partials/topnav.blade.php
@@ -1,41 +1,50 @@
-