Files
compras/app/Services/PeopleApplicationReport.php
T
2026-11-02 08:08:05 +02:00

32 lines
1.8 KiB
PHP

<?php
namespace App\Services;
use App\Models\PeopleProcess;
use App\Models\User;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
class PeopleApplicationReport
{
/** @return array<string,int|string|null> */
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];
}
}