diff --git a/src/State/EmployeeLeaveSummaryProvider.php b/src/State/EmployeeLeaveSummaryProvider.php index 0292a1a..f7fd33e 100644 --- a/src/State/EmployeeLeaveSummaryProvider.php +++ b/src/State/EmployeeLeaveSummaryProvider.php @@ -545,6 +545,25 @@ final readonly class EmployeeLeaveSummaryProvider implements ProviderInterface return $phases[0]; } + /** + * Phase dont la date de début est la plus proche en deçà de celle de $phase + * (la phase qui précède immédiatement). Null si $phase est la première. + */ + private function resolvePhaseImmediatelyBefore(Employee $employee, ContractPhase $phase): ?ContractPhase + { + $prior = null; + foreach ($this->phaseResolver->resolvePhases($employee) as $candidate) { + if ($candidate->startDate >= $phase->startDate) { + continue; + } + if (null === $prior || $candidate->startDate > $prior->startDate) { + $prior = $candidate; + } + } + + return $prior; + } + /** * @param list $suspensions * @param list $longMaladiePeriods diff --git a/tests/State/EmployeeLeaveSummaryProviderTest.php b/tests/State/EmployeeLeaveSummaryProviderTest.php index 8a2347f..6d4fbb0 100644 --- a/tests/State/EmployeeLeaveSummaryProviderTest.php +++ b/tests/State/EmployeeLeaveSummaryProviderTest.php @@ -247,6 +247,31 @@ final class EmployeeLeaveSummaryProviderTest extends TestCase self::assertFalse($this->invokePrivate($provider, 'isForfaitEntryYear', $h39Phase, 2026)); } + public function testResolvePhaseImmediatelyBeforeReturnsPriorH39Phase(): void + { + $employee = $this->buildEmployeeWithTransition('2020-06-01', '2026-04-30', '2026-05-01'); + $phases = new EmployeeContractPhaseResolver()->resolvePhases($employee); + $forfaitPhase = $phases[0]; // current FORFAIT + $h39Phase = $phases[1]; + $provider = $this->buildProvider(); + + $prior = $this->invokePrivate($provider, 'resolvePhaseImmediatelyBefore', $employee, $forfaitPhase); + + self::assertNotNull($prior); + self::assertSame($h39Phase->id, $prior->id); + self::assertSame(ContractType::H39, $prior->contractType); + } + + public function testResolvePhaseImmediatelyBeforeReturnsNullForFirstPhase(): void + { + $employee = $this->buildEmployeeWithTransition('2020-06-01', '2026-04-30', '2026-05-01'); + $phases = new EmployeeContractPhaseResolver()->resolvePhases($employee); + $firstPhase = $phases[1]; // the H39 (earliest) + $provider = $this->buildProvider(); + + self::assertNull($this->invokePrivate($provider, 'resolvePhaseImmediatelyBefore', $employee, $firstPhase)); + } + public function testNonForfaitPhaseStartingMidExerciseUsesFullExerciseFromAsStart(): void { // Scenario: 35h CDI from 2014-07-01 to 2025-10-31, then 39h CDI from 2025-11-01.