*/ public function counts(PeopleProcess $process, User $actor): array { $frozen = in_array($process->status, ['selected', 'contract_draft'], true); $rows = $frozen ? ($process->selection['rows'] ?? []) : app(PeopleHiring::class)->matrix($process); $complete = count(array_filter($rows, fn ($row) => $row['score_minor'] !== null)); $started = count(array_filter($rows, fn ($row) => $row['evaluation_count'] > 0)); $triage = app(CandidateTriage::class); $portal = $triage->canRead($actor, $process) && Schema::hasTable('candidate_triage'); $received = $portal ? DB::table('candidate_submissions')->where('tenant_id', $process->tenant_id)->where('people_process_id', $process->id)->count() : null; $decisions = $portal ? DB::table('candidate_triage')->where('tenant_id', $process->tenant_id)->where('people_process_id', $process->id)->get(['outcome']) : collect(); return ['registered' => count($rows), 'evaluation_complete' => $complete, 'evaluation_pending' => count($rows) - $complete, 'evaluation_unstarted' => count($rows) - $started, 'evaluation_in_progress' => $started - $complete, 'basis' => $frozen ? 'selection_snapshot' : 'current_eligibility', 'portal_received' => $received, 'portal_accepted' => $portal ? $decisions->where('outcome', 'accepted_for_analysis')->count() : null, 'portal_rejected' => $portal ? $decisions->where('outcome', 'not_accepted')->count() : null, 'portal_pending' => $portal ? $triage->pending($process) : null]; } }