@php $viewerId = (int) (Auth::id() ?? 0); $viewerRole = (string) (Auth::user()->role ?? $dashboardDefaultRole); $decisionStatusLabel = 'Need Your Decision'; $sentBackStatusLabel = 'Sent Back by You'; $canRequestDocument = \App\Support\WorkflowPermission::canUseAdminPermission($viewerRole, \App\Support\WorkflowPermission::ADMIN_PERMISSION_REQUEST_DOCUMENT); $isRequesterSideCorrection = function ($request) use ($viewerId) { $latestHistory = $request->latestWorkflowHistory; $latestMeta = is_array($latestHistory?->meta) ? $latestHistory->meta : []; $targetType = strtolower(trim((string) data_get($latestMeta, 'sent_back_target_type', ''))); $targetStepOrder = (int) data_get($latestMeta, 'sent_back_selected_target_step_order', 0); $targetUserId = (int) data_get( $latestMeta, 'sent_back_to_user_id', data_get($latestMeta, 'sent_back_selected_target_user_id', 0) ); $isRequesterTarget = in_array($targetType, ['requester', 'user'], true) || ($targetType === '' && $targetStepOrder <= 0 && $targetUserId === $viewerId); return (string) ($latestHistory?->action ?? '') === \App\Support\WorkflowPermission::ACTION_REQUEST_REVISION && (int) ($request->user_id ?? 0) === $viewerId && $targetStepOrder <= 0 && $isRequesterTarget && ($targetUserId === 0 || $targetUserId === $viewerId); }; $syncDecisionKpiStatus = function (array $status) use ($decisionStatusLabel, $sentBackStatusLabel) { if (in_array($status['label'], ['Needs Your Review', 'Returned Back'], true)) { $status['label'] = $decisionStatusLabel; $status['badge'] = \App\Support\WorkflowPermission::dashboardStatusBadgeClass('Needs Your Review'); } if ($status['label'] === 'Sent Back by My Organization') { $status['label'] = $sentBackStatusLabel; $status['badge'] = \App\Support\WorkflowPermission::dashboardStatusBadgeClass('Sent Back by You'); } if ($status['label'] === 'Approved') { $status['badge'] = 'bg-primary-subtle text-primary'; } return $status; }; $workStatusFor = function ($request) use ($viewerRole, $viewerId, $syncDecisionKpiStatus) { $status = $request->dashboard_status_payload ?: \App\Support\WorkflowPermission::dashboardStatus($request, $viewerRole, $viewerId); return $syncDecisionKpiStatus($status); }; $requestStatusFor = function ($request) use ($viewerId) { $status = $request->requester_dashboard_status_payload ?: \App\Support\WorkflowPermission::dashboardStatus($request, \App\Support\WorkflowPermission::ROLE_REQUESTER, $viewerId); if (!in_array($status['label'], ['Sent Back to You', 'Sent Back by My Organization', 'Completed', 'Rejected'], true)) { $status['label'] = 'In Progress'; $status['badge'] = \App\Support\WorkflowPermission::dashboardStatusBadgeClass('In Progress'); $status['title'] = ''; } return $status; }; $allRequests = collect($requests ?? []); $personalRequests = $allRequests->filter(fn ($request) => (int) ($request->user_id ?? 0) === $viewerId)->values(); $workRequests = $allRequests->filter(function ($request) use ($viewerId, $isRequesterSideCorrection) { if ($isRequesterSideCorrection($request)) { return false; } $isOwnRequest = (int) ($request->user_id ?? 0) === $viewerId; $latestHistory = $request->latestHistory; $isOwnFreshSubmission = $isOwnRequest && (string) optional($latestHistory)->action === 'submit_document' && (int) optional($latestHistory)->actor_user_id === $viewerId; if ($isOwnFreshSubmission) { return false; } return !$isOwnRequest || (int) ($request->current_holder_user_id ?? 0) === $viewerId || (int) optional($latestHistory)->actor_user_id === $viewerId; }) ->filter(fn ($request) => $workStatusFor($request)['label'] !== 'In Progress') ->values(); $hasDashboardTabs = $canRequestDocument; $requestedDashboardTab = (string) request()->query('view', ''); $activeDashboardTab = $hasDashboardTabs && $requestedDashboardTab === 'requests' ? 'requests' : 'work'; $tableRequests = $activeDashboardTab === 'work' ? $workRequests : $personalRequests; $dashboardStatusFor = $activeDashboardTab === 'work' ? $workStatusFor : $requestStatusFor; $statusCounts = $tableRequests->map(fn ($request) => $dashboardStatusFor($request)['label'])->countBy(); $isUnreadAttentionForViewer = function ($request) use ($viewerId): bool { if ((bool) ($request->dashboard_has_unread_update ?? false)) { return true; } $latestHistory = $request->latestHistory; return $latestHistory !== null && !(bool) ($latestHistory->is_read ?? false) && (int) ($latestHistory->actor_user_id ?? 0) !== $viewerId && $latestHistory->hasNotificationRecipient($viewerId, Auth::user()); }; $workTabAttentionCount = $workRequests ->filter(function ($request) use ($workStatusFor, $decisionStatusLabel, $isUnreadAttentionForViewer) { return (\App\Support\WorkflowPermission::isDashboardOverdue($request) && \App\Support\WorkflowPermission::isCurrentActionOwner($request, Auth::user())) || (in_array($workStatusFor($request)['label'], [ $decisionStatusLabel, 'Returned Back', 'Sent Back to You', ], true) && $isUnreadAttentionForViewer($request)); }) ->count(); $requestTabAttentionCount = $personalRequests ->filter(function ($request) use ($viewerId, $isUnreadAttentionForViewer) { $status = $request->requester_dashboard_status_payload ?: \App\Support\WorkflowPermission::dashboardStatus( $request, \App\Support\WorkflowPermission::ROLE_REQUESTER, $viewerId ); return (\App\Support\WorkflowPermission::isDashboardOverdue($request) && \App\Support\WorkflowPermission::isCurrentActionOwner($request, Auth::user())) || ($status['label'] === 'Sent Back to You' && $isUnreadAttentionForViewer($request)); }) ->count(); $rowHighlightForView = function ($request, string $view) use ( $workStatusFor, $requestStatusFor, $isUnreadAttentionForViewer, $decisionStatusLabel ): array { $isWorkQueue = $view === 'work'; $status = $isWorkQueue ? $workStatusFor($request) : $requestStatusFor($request); $statusLabel = (string) ($status['label'] ?? ''); $isOverdue = $isWorkQueue && \App\Support\WorkflowPermission::isDashboardOverdue($request) && \App\Support\WorkflowPermission::isCurrentActionOwner($request, Auth::user()); $isActionRequired = $isWorkQueue && $statusLabel === $decisionStatusLabel && ! $isOverdue; $attentionLabels = $isWorkQueue ? [$decisionStatusLabel, 'Returned Back', 'Sent Back to You'] : ['Sent Back to You']; $isNew = in_array($statusLabel, $attentionLabels, true) && $isUnreadAttentionForViewer($request); return [ 'overdue' => $isOverdue, 'action_required' => $isActionRequired, 'unread' => $isNew, 'highlighted' => $isOverdue || $isActionRequired || $isNew, ]; }; $activeRowHighlightResolver = fn ($request) => $rowHighlightForView($request, $activeDashboardTab); $tableTitle = $activeDashboardTab === 'work' ? 'Documents for Review and Decision' : 'Submitted Documents'; $statusFilterMap = $activeDashboardTab === 'work' ? [ $decisionStatusLabel => [$decisionStatusLabel], 'Approved' => ['Approved'], $sentBackStatusLabel => [$sentBackStatusLabel], 'Completed' => ['Completed'], 'Rejected' => ['Rejected'], ] : [ 'In Progress' => ['In Progress'], 'Sent Back to Me' => ['Sent Back to You'], 'Sent Back by My Organization' => ['Sent Back by My Organization'], 'Completed' => ['Completed'], 'Rejected' => ['Rejected'], ]; $workKpiCards = [ [ 'label' => $decisionStatusLabel, 'count' => $activeDashboardTab === 'work' ? (int) ($statusCounts[$decisionStatusLabel] ?? 0) : $tableRequests->count(), 'description' => 'Waiting for your review', 'icon' => 'ri-archive-line', 'color' => 'info', ], [ 'label' => 'Approved', 'count' => (int) ($statusCounts['Approved'] ?? 0), 'description' => 'Approved documents', 'icon' => 'ri-check-line', 'color' => 'primary', ], [ 'label' => $sentBackStatusLabel, 'count' => (int) ($statusCounts[$sentBackStatusLabel] ?? 0), 'description' => 'Waiting for the target to return it', 'icon' => 'ri-time-line', 'color' => 'warning', ], [ 'label' => 'Completed', 'count' => (int) ($statusCounts['Completed'] ?? 0), 'description' => 'Completed documents', 'icon' => 'ri-checkbox-circle-line', 'color' => 'success', ], [ 'label' => 'Rejected', 'count' => (int) ($statusCounts['Rejected'] ?? 0), 'description' => 'Rejected documents', 'icon' => 'ri-close-line', 'color' => 'danger', ], ]; $myRequestKpiCards = [ [ 'label' => 'Total Submitted', 'count' => $personalRequests->count(), 'description' => 'Documents you created', 'icon' => 'ri-file-add-line', 'color' => 'info', ], [ 'label' => 'In Progress', 'count' => (int) ($statusCounts['In Progress'] ?? 0), 'description' => 'Still moving through workflow', 'icon' => 'ri-loader-4-line', 'color' => 'warning', ], [ 'label' => 'Sent Back to Me', 'count' => (int) ($statusCounts['Sent Back to You'] ?? 0), 'description' => 'Needs your revision', 'icon' => 'ri-arrow-go-back-line', 'color' => 'warning', ], [ 'label' => 'Completed', 'count' => (int) ($statusCounts['Completed'] ?? 0), 'description' => 'Finished successfully', 'icon' => 'ri-check-double-line', 'color' => 'success', ], [ 'label' => 'Rejected', 'count' => (int) ($statusCounts['Rejected'] ?? 0), 'description' => 'Rejected documents', 'icon' => 'ri-close-line', 'color' => 'danger', ], ]; $dashboardKpiCards = $activeDashboardTab === 'work' ? $workKpiCards : $myRequestKpiCards; $dashboardChartColors = ['primary', 'success', 'warning', 'info', 'danger', 'secondary']; $dashboardChartCards = $tableRequests ->groupBy(fn ($request) => trim((string) ($request->document_type_label ?: $request->document_type ?: __('N/A')))) ->map(fn ($items, $label) => [ 'label' => $label !== '' ? $label : __('N/A'), 'key' => md5(mb_strtolower((string) ($label !== '' ? $label : __('N/A')))), 'count' => $items->count(), ]) ->sortByDesc('count') ->values() ->map(function ($card, $index) use ($dashboardChartColors) { $card['color'] = $dashboardChartColors[$index % count($dashboardChartColors)]; return $card; }) ->all(); $dashboardChartMax = max(1, (int) collect($dashboardChartCards)->max('count')); @endphp
{{ __($activeDashboardTab === 'work' ? 'Review assigned documents, decisions, deadlines, and completed work.' : 'Track your requests, current progress, and recent document activity.') }}