Gestion du changement de type de contrat + correction du calcule des RTT sur un contrat qui commence en milieu de semaine #19

Merged
tristan merged 55 commits from feat/contract-phase-view-selector into develop 2026-05-22 06:42:33 +00:00
Showing only changes of commit dc9b49e254 - Show all commits

View File

@@ -564,6 +564,34 @@ final readonly class EmployeeLeaveSummaryProvider implements ProviderInterface
return $prior;
}
/**
* CP nets encore disponibles (jours + samedis) hérités de la phase non-forfait
* précédant immédiatement une entrée en FORFAIT. 0 si aucune phase précédente
* ou si la précédente est elle-même un FORFAIT (nouvel embauché → cas 2).
*
* Le total disponible = remainingDays (acquis restant) + accruingDays (généré
* restant, samedis générés inclus) + remainingSaturdays (samedis acquis restant).
* Les congés déjà posés sous la phase précédente sont déjà déduits par
* computeYearSummary, donc on récupère bien le NET (ex. Grégory : 12 acquis 5 pris ≈ 7).
*/
private function resolveCarriedCpFromPriorPhase(Employee $employee, ContractPhase $forfaitPhase): float
{
$prior = $this->resolvePhaseImmediatelyBefore($employee, $forfaitPhase);
if (null === $prior || ContractType::FORFAIT === $prior->contractType) {
return 0.0;
}
$reference = $prior->endDate ?? new DateTimeImmutable('today');
$priorYear = $this->exerciseYearResolver->forDate($reference, false);
$summary = $this->computeYearSummary($employee, $priorYear, 0.0, null, $prior);
if (null === $summary) {
return 0.0;
}
return $summary['remainingDays'] + $summary['accruingDays'] + $summary['remainingSaturdays'];
}
/**
* @param list<ContractSuspension> $suspensions
* @param list<array{start: DateTimeImmutable, end: DateTimeImmutable}> $longMaladiePeriods