@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 --}}

Pending Approval

{{ $pendingItems->count() }}

Approved

{{ $approvedCount }}

Rejected

{{ $rejectedCount }}

Completed

{{ $completedCount }}
{{-- Section Head Approval - Pending Items --}}
Daftar Pengajuan Baru
Approval Head
@forelse ($pendingItems as $detail) @php $primary = ''; if (isset($table_primary_d) && count($table_primary_d) > 0) { foreach ($table_primary_d as $p) { $primary = $primary == '' ? $detail->{$p->field} : $primary . ':' . $detail->{$p->field}; } } if ($primary == '' && isset($detail->id)) { $primary = $detail->id; } $rawStatus = $detail->request_status ?? $detail->status ?? ''; $status = strtolower($rawStatus); if (in_array($status, ['approved'], true)) { $status = 'review'; } elseif ($status === 'reject') { $status = 'rejected'; } elseif (in_array($status, ['canceled', 'cancelled'], true)) { $status = 'cancel'; } $badgeClass = 'status-badge status-' . ($status ?: 'pending'); $dateValue = $detail->created_at ?? $detail->tanggal ?? $detail->date ?? null; $displayDate = $dateValue ? \Illuminate\Support\Carbon::parse($dateValue)->format('d-m-Y') : '-'; @endphp @empty @endforelse
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' }}
{{-- Section Head Tracking Items --}}
Tracking Status Pekerjaan
Pekerjaan yang sedang berjalan
@foreach ($trackingItems as $detail) @php $primary = ''; if (isset($table_primary_d) && count($table_primary_d) > 0) { foreach ($table_primary_d as $p) { $primary = $primary == '' ? $detail->{$p->field} : $primary . ':' . $detail->{$p->field}; } } if ($primary == '' && isset($detail->id)) { $primary = $detail->id; } $rawStatus = $detail->request_status ?? $detail->status ?? ''; $status = strtolower($rawStatus); $datePending = $detail->created_at ? \Illuminate\Support\Carbon::parse($detail->created_at)->format('d/m/Y') : '-'; $dateReview = $detail->head_approval_date ? \Illuminate\Support\Carbon::parse($detail->head_approval_date)->format('d/m/Y') : '-'; $datePengadaan = (!empty($detail->pengadaan_started_at) && $detail->pengadaan_started_at !== '0000-00-00 00:00:00') ? \Illuminate\Support\Carbon::parse($detail->pengadaan_started_at)->format('d/m/Y') : '-'; $datePengerjaan = (!empty($detail->pengerjaan_started_at) && $detail->pengerjaan_started_at !== '0000-00-00 00:00:00') ? \Illuminate\Support\Carbon::parse($detail->pengerjaan_started_at)->format('d/m/Y') : '-'; $isPengadaanDone = in_array($status, ['pengadaan', 'pengerjaan', 'revisi', 'verifikasi', 'completed']) || (!empty($detail->pengadaan_started_at) && $detail->pengadaan_started_at !== '0000-00-00 00:00:00'); $isPengerjaanDone = in_array($status, ['pengerjaan', 'revisi', 'verifikasi', 'completed']) || (!empty($detail->pengerjaan_started_at) && $detail->pengerjaan_started_at !== '0000-00-00 00:00:00'); $isCompleteDone = in_array($status, ['verifikasi', 'completed']); $isRejected = in_array($status, ['reject', 'rejected', 'cancel', 'canceled', 'cancelled']); // Determine current status step $currentStep = 'review'; if ($isRejected) $currentStep = 'rejected'; elseif (in_array($status, ['pengadaan'])) $currentStep = 'pengadaan'; elseif (in_array($status, ['pengerjaan', 'revisi'])) $currentStep = 'pengerjaan'; elseif (in_array($status, ['verifikasi', 'completed'])) $currentStep = 'complete'; @endphp @endforeach
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
-
@endif
{{-- Verifikasi Pekerjaan removed from head partial (should be shown only in user/hrd views) --}} @push('js') @endpush