From 2d1c1e6e2219bc4ed77088c8d49c2ccdf16ede2f Mon Sep 17 00:00:00 2001 From: tristan Date: Wed, 11 Mar 2026 08:42:57 +0100 Subject: [PATCH] =?UTF-8?q?fix=20:=20api=20jour=20f=C3=A9ri=C3=A9=20qui=20?= =?UTF-8?q?a=20chang=C3=A9=20d'url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/settings.local.json | 3 +- config/services.yaml | 4 +++ src/Service/PublicHolidayService.php | 11 ++++---- src/State/EmployeeLeaveSummaryProvider.php | 32 ++++++++++++++-------- 4 files changed, 32 insertions(+), 18 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 502e17c..78cf90c 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -6,7 +6,8 @@ "Bash(php:*)", "Bash(docker compose:*)", "Bash(make test:*)", - "Bash(grep:*)" + "Bash(grep:*)", + "Bash(docker exec:*)" ] } } diff --git a/config/services.yaml b/config/services.yaml index f1d8a11..2e913f9 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -22,6 +22,10 @@ services: App\: resource: '../src/' + App\Service\PublicHolidayService: + arguments: + $holidayUrl: '%env(HOLIDAY_URL)%' + App\Repository\Contract\AbsenceReadRepositoryInterface: '@App\Repository\AbsenceRepository' App\Repository\Contract\EmployeeContractPeriodReadRepositoryInterface: '@App\Repository\EmployeeContractPeriodRepository' App\Repository\Contract\EmployeeScopedRepositoryInterface: '@App\Repository\EmployeeRepository' diff --git a/src/Service/PublicHolidayService.php b/src/Service/PublicHolidayService.php index 75dbb69..005a02a 100644 --- a/src/Service/PublicHolidayService.php +++ b/src/Service/PublicHolidayService.php @@ -13,12 +13,11 @@ use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; use Throwable; -final class PublicHolidayService implements PublicHolidayServiceInterface +final readonly class PublicHolidayService implements PublicHolidayServiceInterface { - private const string BASE_URL = 'https://calendrier.api.gouv.fr/jours-feries/'; - public function __construct( - private readonly HttpClientInterface $client, + private HttpClientInterface $client, + private string $holidayUrl ) {} /** @@ -31,7 +30,7 @@ final class PublicHolidayService implements PublicHolidayServiceInterface public function getHolidaysDay(string $zone): array { $zone = strtolower(trim($zone)); - $url = self::BASE_URL."{$zone}.json"; + $url = $this->holidayUrl."{$zone}.json"; try { $response = $this->client->request( @@ -61,7 +60,7 @@ final class PublicHolidayService implements PublicHolidayServiceInterface { $zone = strtolower(trim($zone)); $years = trim($years); - $url = self::BASE_URL."{$zone}/{$years}.json"; + $url = $this->holidayUrl."{$zone}/{$years}.json"; try { $response = $this->client->request('GET', $url); diff --git a/src/State/EmployeeLeaveSummaryProvider.php b/src/State/EmployeeLeaveSummaryProvider.php index 5ee8c76..6a98f7a 100644 --- a/src/State/EmployeeLeaveSummaryProvider.php +++ b/src/State/EmployeeLeaveSummaryProvider.php @@ -168,7 +168,7 @@ final readonly class EmployeeLeaveSummaryProvider implements ProviderInterface $carrySaturdays = 0.0; } - $calculationEnd = $this->resolveCalculationEndDate($leavePolicy['ruleCode'], $year, $to); + $calculationEnd = $this->resolveCalculationEndDate($leavePolicy['ruleCode'], $year, $to, $employee); $generatedDays = $leavePolicy['accrualPerMonth'] > 0.0 ? $this->computeAccruedDaysFromStart( $leavePolicy['acquiredDays'], @@ -356,7 +356,8 @@ final readonly class EmployeeLeaveSummaryProvider implements ProviderInterface private function resolveCalculationEndDate( string $ruleCode, int $year, - DateTimeImmutable $periodEnd + DateTimeImmutable $periodEnd, + Employee $employee ): ?DateTimeImmutable { $today = new DateTimeImmutable('today'); $currentYear = LeaveRuleCode::FORFAIT_218->value === $ruleCode @@ -364,18 +365,27 @@ final readonly class EmployeeLeaveSummaryProvider implements ProviderInterface : $this->resolveCurrentLeaveYear($today); if ($year < $currentYear) { - return $periodEnd; - } - if ($year > $currentYear) { - return null; + $end = $periodEnd; + } elseif ($year > $currentYear) { + $end = null; + } else { + $lastDayPreviousMonth = $today + ->modify('first day of this month') + ->modify('-1 day') + ; + $end = $lastDayPreviousMonth < $periodEnd ? $lastDayPreviousMonth : $periodEnd; } - $lastDayPreviousMonth = $today - ->modify('first day of this month') - ->modify('-1 day') - ; + // Cap at contract end date if the employee has left. + $contractEndRaw = $employee->getCurrentContractEndDate(); + if (null !== $end && null !== $contractEndRaw && '' !== trim($contractEndRaw)) { + $contractEnd = DateTimeImmutable::createFromFormat('Y-m-d', $contractEndRaw); + if ($contractEnd instanceof DateTimeImmutable && $contractEnd < $end) { + $end = $contractEnd; + } + } - return $lastDayPreviousMonth < $periodEnd ? $lastDayPreviousMonth : $periodEnd; + return $end; } /**