32 lines
1.8 KiB
PHP
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];
|
|
}
|
|
}
|