[#339] Ajout d'une page listant les règles de calcules (#5)
Some checks failed
Auto Tag Develop / tag (push) Has been cancelled

| Numéro du ticket | Titre du ticket |
|------------------|-----------------|
|        #339          |        Ajout d'une page listant les règles de calcules         |

## Description de la PR
[#339] Ajout d'une page listant les règles de calcules

## Modification du .env

## Check list

- [ ] Pas de régression
- [x] TU/TI/TF rédigée
- [x] TU/TI/TF OK
- [ ] CHANGELOG modifié

Reviewed-on: #5
Co-authored-by: tristan <tristan@yuno.malio.fr>
Co-committed-by: tristan <tristan@yuno.malio.fr>
This commit was merged in pull request #5.
This commit is contained in:
2026-02-20 16:17:22 +00:00
committed by Autin
parent 49fecfc27a
commit f8ca5e50a0
16 changed files with 664 additions and 59 deletions

View File

@@ -0,0 +1,97 @@
<?php
declare(strict_types=1);
namespace App\Service\Contracts;
use App\Entity\Contract;
use App\Entity\Employee;
use App\Repository\EmployeeContractPeriodRepository;
use DateTimeImmutable;
use LogicException;
readonly class EmployeeContractResolver
{
public function __construct(
private EmployeeContractPeriodRepository $periodRepository,
) {}
public function resolveForEmployeeAndDate(Employee $employee, DateTimeImmutable $date): ?Contract
{
$period = $this->periodRepository->findOneCoveringDate($employee, $date);
$contract = $period?->getContract();
if (null === $contract) {
throw new LogicException(sprintf(
'Missing contract period for employee %d on %s.',
$employee->getId() ?? 0,
$date->format('Y-m-d')
));
}
return $contract;
}
/**
* @param list<Employee> $employees
* @param list<string> $days
*
* @return array<int, array<string, ?Contract>>
*/
public function resolveForEmployeesAndDays(array $employees, array $days): array
{
$resolved = [];
if ([] === $employees || [] === $days) {
return $resolved;
}
foreach ($employees as $employee) {
$employeeId = $employee->getId();
if (!$employeeId) {
continue;
}
foreach ($days as $day) {
$resolved[$employeeId][$day] = null;
}
}
$from = new DateTimeImmutable(min($days));
$to = new DateTimeImmutable(max($days));
$periods = $this->periodRepository->findByEmployeesAndDateRange($employees, $from, $to);
foreach ($periods as $period) {
$employeeId = $period->getEmployee()?->getId();
$contract = $period->getContract();
if (!$employeeId || null === $contract) {
continue;
}
$start = $period->getStartDate()->format('Y-m-d');
$end = $period->getEndDate()?->format('Y-m-d') ?? '9999-12-31';
foreach ($days as $day) {
if ($day < $start || $day > $end) {
continue;
}
$resolved[$employeeId][$day] = $contract;
}
}
foreach ($employees as $employee) {
$employeeId = $employee->getId();
if (!$employeeId) {
continue;
}
foreach ($days as $day) {
if (null === ($resolved[$employeeId][$day] ?? null)) {
throw new LogicException(sprintf(
'Missing contract period for employee %d on %s.',
$employeeId,
$day
));
}
}
}
return $resolved;
}
}