38 lines
1.5 KiB
PHP
38 lines
1.5 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\PeopleProcess;
|
|
use App\Models\User;
|
|
|
|
/** One permission-aware projection shared by consultation and portable process dossiers. */
|
|
class PeopleProcessProjection
|
|
{
|
|
/** @return array{process:array<string,mixed>,candidates:list<array<string,mixed>>} */
|
|
public function read(User $actor, PeopleProcess $record): array
|
|
{
|
|
$access = app(PeopleAccess::class);
|
|
abort_unless($access->can($actor, $record, 'view'), 403);
|
|
$workflow = app(PeopleHiring::class);
|
|
$snapshot = $workflow->snapshot($record);
|
|
$rows = $workflow->matrix($record);
|
|
if (! $access->can($actor, $record, 'financial')) {
|
|
unset($snapshot['rules']['annex']['fields']['financial']);
|
|
unset($snapshot['selection']['rules']['annex']['fields']['financial']);
|
|
}
|
|
if (! $access->can($actor, $record, 'interviews')) {
|
|
$rows = array_map(fn ($row) => [...$row, 'reviews' => []], $rows);
|
|
if (isset($snapshot['selection']['rows'])) {
|
|
$snapshot['selection']['rows'] = array_map(fn ($row) => [...$row, 'reviews' => []], $snapshot['selection']['rows']);
|
|
}
|
|
}
|
|
if (! $access->can($actor, $record, 'contract') && ! $access->can($actor, $record, 'contract_view')) {
|
|
$snapshot['contract'] = null;
|
|
}
|
|
|
|
$rows = app(ReceivedCandidateAvailability::class)->attach($actor, $record, $rows);
|
|
|
|
return ['process' => $snapshot, 'candidates' => $rows];
|
|
}
|
|
}
|