feat(leave) : resolve phase immediately preceding a given phase
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -545,6 +545,25 @@ final readonly class EmployeeLeaveSummaryProvider implements ProviderInterface
|
|||||||
return $phases[0];
|
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<ContractSuspension> $suspensions
|
* @param list<ContractSuspension> $suspensions
|
||||||
* @param list<array{start: DateTimeImmutable, end: DateTimeImmutable}> $longMaladiePeriods
|
* @param list<array{start: DateTimeImmutable, end: DateTimeImmutable}> $longMaladiePeriods
|
||||||
|
|||||||
@@ -247,6 +247,31 @@ final class EmployeeLeaveSummaryProviderTest extends TestCase
|
|||||||
self::assertFalse($this->invokePrivate($provider, 'isForfaitEntryYear', $h39Phase, 2026));
|
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
|
public function testNonForfaitPhaseStartingMidExerciseUsesFullExerciseFromAsStart(): void
|
||||||
{
|
{
|
||||||
// Scenario: 35h CDI from 2014-07-01 to 2025-10-31, then 39h CDI from 2025-11-01.
|
// Scenario: 35h CDI from 2014-07-01 to 2025-10-31, then 39h CDI from 2025-11-01.
|
||||||
|
|||||||
Reference in New Issue
Block a user