@php $headRoute = $puRouteBases['trreq'] ?? 'pengajuan'; $headHistoryRoute = \Illuminate\Support\Facades\DB::table('sys_dmenu') ->where('dmenu', 'trhis') ->value('url') ?? 'history'; // Get data $items = $table_detail_d ?? collect(); // Jika kosong, query langsung dari database if ($items->isEmpty()) { $items = \Illuminate\Support\Facades\DB::table('tr_non_periodic') ->leftJoin('ms_area', 'tr_non_periodic.area_id', '=', 'ms_area.id') ->select('tr_non_periodic.*', 'ms_area.nama_area as area_name') ->orderBy('tr_non_periodic.created_at', 'desc') ->get(); } $areaMap = \Illuminate\Support\Facades\DB::table('ms_area') ->pluck('nama_area', 'id'); $currentHeadUser = $user_login ?? ($currentUser ?? auth()->user()); if (!$currentHeadUser && session()->has('username')) { $currentHeadUser = \Illuminate\Support\Facades\DB::table('users') ->where('username', session('username')) ->first(); } $currentHeadUserId = $currentHeadUser->id ?? null; $currentHeadRoles = array_map('trim', explode(',', strtolower((string) ($currentHeadUser->idroles ?? '')))); $isCurrentViewerAdmin = in_array('admins', $currentHeadRoles, true) || in_array('admin', $currentHeadRoles, true); $headDepartmentIds = collect(); if ($currentHeadUserId && !$isCurrentViewerAdmin) { $headDepartmentIds = \Illuminate\Support\Facades\DB::table('ms_department') ->where('head_user_id', $currentHeadUserId) ->where('is_active', '1') ->pluck('id') ->map(fn ($id) => (int) $id) ->unique() ->values(); // Compatibility for data that has not been migrated yet. if ($headDepartmentIds->isEmpty()) { $headDepartmentIds = \Illuminate\Support\Facades\DB::table('ms_employee') ->where('user_id', $currentHeadUserId) ->where('is_active', '1') ->whereNotNull('departemen_id') ->pluck('departemen_id') ->map(fn ($id) => (int) $id) ->unique() ->values(); } } $requestUserIds = $items->pluck('user_id') ->filter(fn ($id) => $id !== null && $id !== '' && is_numeric((string) $id)) ->map(fn ($id) => (int) $id); $requestUsernames = $items->flatMap(function ($item) { $values = []; $uid = isset($item->user_id) ? (string) $item->user_id : ''; $createdBy = trim((string) ($item->user_create ?? '')); if ($uid !== '' && !is_numeric($uid)) { $values[] = strtolower($uid); } if ($createdBy !== '') { $values[] = strtolower($createdBy); } return $values; })->filter()->unique()->values(); $usernameToUserId = $requestUsernames->isNotEmpty() ? \Illuminate\Support\Facades\DB::table('users') ->whereIn(\Illuminate\Support\Facades\DB::raw('LOWER(username)'), $requestUsernames->all()) ->pluck('id', 'username') ->mapWithKeys(fn ($id, $username) => [strtolower((string) $username) => (int) $id]) : collect(); $requestDepartmentByUserId = $requestUserIds ->merge($usernameToUserId->values()) ->unique() ->values() ->whenNotEmpty(function ($userIds) { return \Illuminate\Support\Facades\DB::table('ms_employee') ->whereIn('user_id', $userIds->all()) ->where('is_active', '1') ->pluck('departemen_id', 'user_id') ->map(fn ($departmentId) => $departmentId ? (int) $departmentId : null); }, fn () => collect()); $resolveItemDepartmentId = function ($item) use ($usernameToUserId, $requestDepartmentByUserId) { if (!empty($item->request_department_id)) { return (int) $item->request_department_id; } $requestUserId = null; $uid = isset($item->user_id) ? (string) $item->user_id : ''; if ($uid !== '' && is_numeric($uid)) { $requestUserId = (int) $uid; } else { $legacyUsernames = array_filter([ $uid !== '' ? strtolower($uid) : null, strtolower(trim((string) ($item->user_create ?? ''))), ]); foreach ($legacyUsernames as $legacyUsername) { $requestUserId = $usernameToUserId->get($legacyUsername); if ($requestUserId) { break; } } } if (!$requestUserId) { return null; } $departmentId = $requestDepartmentByUserId->get($requestUserId); return $departmentId ? (int) $departmentId : null; }; $displayItems = $items->filter(function ($item) use ($isCurrentViewerAdmin, $headDepartmentIds, $resolveItemDepartmentId) { if ($isCurrentViewerAdmin) { return true; } $departmentId = $resolveItemDepartmentId($item); return $departmentId && $headDepartmentIds->contains($departmentId); })->map(function ($item) use ($areaMap) { if (empty($item->area_name) && !empty($item->area_id)) { $item->area_name = $areaMap->get((int) $item->area_id) ?? $areaMap->get((string) $item->area_id); } return $item; })->values(); $statusField = 'request_status'; if ($displayItems->first() && isset($displayItems->first()->status)) { $statusField = 'status'; } $hrdUserIds = \Illuminate\Support\Facades\DB::table('users') ->where(function ($q) { $q->whereRaw("FIND_IN_SET('hrdxxx', REPLACE(LOWER(idroles), ' ', ''))") ->orWhereRaw("FIND_IN_SET('hrd', REPLACE(LOWER(idroles), ' ', ''))"); }) ->pluck('id') ->map(fn ($id) => (int) $id) ->all(); $hrdUsernames = \Illuminate\Support\Facades\DB::table('users') ->where(function ($q) { $q->whereRaw("FIND_IN_SET('hrdxxx', REPLACE(LOWER(idroles), ' ', ''))") ->orWhereRaw("FIND_IN_SET('hrd', REPLACE(LOWER(idroles), ' ', ''))"); }) ->pluck('username') ->map(fn ($username) => strtolower((string) $username)) ->all(); $isHrdSubmission = function ($item) use ($hrdUserIds, $hrdUsernames) { $uid = isset($item->user_id) ? (string) $item->user_id : ''; $uidInt = is_numeric($uid) ? (int) $uid : null; $createdBy = strtolower((string) ($item->user_create ?? '')); if ($uidInt !== null && in_array($uidInt, $hrdUserIds, true)) { return true; } if ($uid !== '' && !is_numeric($uid) && in_array(strtolower($uid), $hrdUsernames, true)) { return true; } return $createdBy !== '' && in_array($createdBy, $hrdUsernames, true); }; $currentUserId = $user_login->id ?? null; $sessionUsername = strtolower(trim((string) (session('username') ?? ''))); $modelUsername = strtolower(trim((string) ($user_login->username ?? ''))); $currentUsername = $sessionUsername !== '' && !is_numeric($sessionUsername) ? $sessionUsername : $modelUsername; $isCurrentViewerHrd = ($currentUserId && in_array((int) $currentUserId, $hrdUserIds, true)) || ($currentUsername !== '' && in_array($currentUsername, $hrdUsernames, true)); $isOwnedByCurrentUser = function ($item) use ($currentUserId, $currentUsername) { $uid = isset($item->user_id) ? (string) $item->user_id : ''; $createdBy = strtolower((string) ($item->user_create ?? '')); $byUserId = $currentUserId && $uid !== '' && is_numeric($uid) && (int) $uid === (int) $currentUserId; $byLegacyUserId = $currentUsername !== '' && $uid !== '' && !is_numeric($uid) && strtolower($uid) === $currentUsername; $byUserCreate = $currentUsername !== '' && $createdBy === $currentUsername; return $byUserId || $byLegacyUserId || $byUserCreate; }; // Filter pending items - status pending atau review yang belum ada head_approval_date $pendingItems = $displayItems->filter(function ($item) use ($statusField, $isHrdSubmission) { $statusValue = strtolower($item->{$statusField} ?? ''); return ($statusValue === 'pending' || $statusValue === 'review') && empty($item->head_approval_date) && !$isHrdSubmission($item); }); // Approved count $approvedCount = $displayItems->filter(function ($item) use ($statusField) { $statusValue = strtolower($item->{$statusField} ?? ''); return !empty($item->head_approval_date) && in_array($statusValue, ['review', 'approved', 'pengadaan', 'pengerjaan', 'completed']); })->count(); // Rejected count $rejectedCount = $displayItems->filter(function ($item) use ($statusField) { $statusValue = strtolower($item->{$statusField} ?? ''); return in_array($statusValue, ['rejected', 'reject']); })->count(); // Completed count $completedCount = $displayItems->where($statusField, 'completed')->count(); // History items - semua yang sudah diproses head atau ditolak $historyItems = $displayItems->filter(function ($item) use ($statusField) { $statusValue = strtolower($item->{$statusField} ?? ''); return !empty($item->head_approval_date) || in_array($statusValue, ['rejected', 'reject', 'cancel', 'cancelled', 'canceled']); }); // Verifikasi HRD di menu Pengajuan PU (mirip user) $verifikasiItems = collect(); if ($isCurrentViewerHrd) { $verifikasiItems = $displayItems->filter(function ($item) use ($statusField, $isOwnedByCurrentUser) { $statusValue = strtolower($item->{$statusField} ?? ''); return $statusValue === 'verifikasi' && $isOwnedByCurrentUser($item); })->values(); } $trackingItems = $displayItems->filter(function ($item) use ($statusField) { $statusValue = strtolower($item->{$statusField} ?? ''); return !empty($item->head_approval_date) && in_array($statusValue, ['review', 'pengadaan', 'pengerjaan', 'revisi', 'verifikasi']); }); @endphp {{-- Summary Cards --}}
| Aksi | ID Trans | Tanggal Pengajuan | Area | Deskripsi | Status |
|---|---|---|---|---|---|
|
{{-- Button View --}}
{{-- Button Toggle --}}
|
{{ $detail->id_trans ?: '-' }} | {{ $displayDate }} | {{ $detail->area_name ?? $detail->area ?? $detail->area_id ?? '-' }} | {{ $detail->job_description ?? $detail->description ?? '-' }} | {{ $status ?: 'pending' }} |
| Aksi | Area | Deskripsi | Progress |
|---|---|---|---|
| {{ $detail->area_name ?? $detail->area ?? $detail->area_id ?? '-' }} | {{ $detail->job_description ?? $detail->description ?? '-' }} |
@if($isRejected)
Ditolak / Dibatalkan
@else
Pending
{{ $datePending }}
Review
{{ $dateReview }}
Pengadaan
{{ $datePengadaan !== '-' ? $datePengadaan : ($currentStep == 'pengadaan' ? 'Proses...' : '-') }}
Pengerjaan
{{ $datePengerjaan !== '-' ? $datePengerjaan : ($currentStep == 'pengerjaan' ? 'Proses...' : '-') }}
Complete
-
|