fix : écran du récap. congés ordre d'affichage + Calcule des jours ouvrés pour les FORFAIT
This commit is contained in:
@@ -71,7 +71,10 @@ final readonly class LeaveBalanceComputationService
|
||||
$fractionedDays = $this->resolveFractionedDays($employee, $ruleCode, $year);
|
||||
|
||||
if (LeaveRuleCode::FORFAIT_218 === $ruleCode) {
|
||||
$totalBusinessDays = $this->countBusinessDays($from, $to);
|
||||
// Business days for forfait must use the RAW holiday list (excluded holidays
|
||||
// like "Lundi de Pentecôte" / journée de solidarité still count as non-working
|
||||
// days for the 218-day legal target).
|
||||
$totalBusinessDays = $this->countBusinessDaysInRange($from, $to, $this->buildRawPublicHolidayMap($from, $to));
|
||||
$baseAcquiredDays = (float) max(0, $totalBusinessDays - self::FORFAIT_TARGET_WORKED_DAYS);
|
||||
$acquiredDays = $carryDays + $baseAcquiredDays + $fractionedDays;
|
||||
$absences = $this->absenceRepository->findByEmployeeAndOverlappingDateRange($employee, $effectiveFrom, $to);
|
||||
@@ -406,6 +409,29 @@ final readonly class LeaveBalanceComputationService
|
||||
return $map;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, string>
|
||||
*/
|
||||
private function buildRawPublicHolidayMap(DateTimeImmutable $from, DateTimeImmutable $to): array
|
||||
{
|
||||
$map = [];
|
||||
$startYear = (int) $from->format('Y');
|
||||
$endYear = (int) $to->format('Y');
|
||||
|
||||
try {
|
||||
for ($year = $startYear; $year <= $endYear; ++$year) {
|
||||
$holidays = $this->publicHolidayService->getRawHolidaysDayByYears('metropole', (string) $year);
|
||||
foreach ($holidays as $date => $label) {
|
||||
$map[(string) $date] = (string) $label;
|
||||
}
|
||||
}
|
||||
} catch (Throwable) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return $map;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param list<Absence> $absences
|
||||
*
|
||||
|
||||
@@ -78,12 +78,25 @@ final readonly class PublicHolidayService implements PublicHolidayServiceInterfa
|
||||
* @throws ClientExceptionInterface
|
||||
*/
|
||||
public function getHolidaysDayByYears(string $zone, string $years): array
|
||||
{
|
||||
return $this->applyExclusions($this->fetchHolidaysByYears($zone, $years));
|
||||
}
|
||||
|
||||
public function getRawHolidaysDayByYears(string $zone, string $years): array
|
||||
{
|
||||
return $this->fetchHolidaysByYears($zone, $years);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, string>
|
||||
*/
|
||||
private function fetchHolidaysByYears(string $zone, string $years): array
|
||||
{
|
||||
$zone = strtolower(trim($zone));
|
||||
$years = trim($years);
|
||||
$key = "public_holidays_{$zone}_{$years}";
|
||||
|
||||
$holidays = $this->cache->get($key, function (ItemInterface $item) use ($zone, $years): array {
|
||||
return $this->cache->get($key, function (ItemInterface $item) use ($zone, $years): array {
|
||||
$item->expiresAfter(30 * 86400);
|
||||
$url = $this->holidayUrl."{$zone}/{$years}.json";
|
||||
|
||||
@@ -101,8 +114,6 @@ final readonly class PublicHolidayService implements PublicHolidayServiceInterfa
|
||||
|
||||
return json_decode($response->getContent(), true);
|
||||
});
|
||||
|
||||
return $this->applyExclusions($holidays);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -9,4 +9,11 @@ interface PublicHolidayServiceInterface
|
||||
public function getHolidaysDay(string $zone): array;
|
||||
|
||||
public function getHolidaysDayByYears(string $zone, string $years): array;
|
||||
|
||||
/**
|
||||
* Same as getHolidaysDayByYears but WITHOUT the configured exclusions applied.
|
||||
* Used for legal/contractual computations (e.g. forfait 218 days) where excluded
|
||||
* holidays (journée de solidarité) must still count as non-working days.
|
||||
*/
|
||||
public function getRawHolidaysDayByYears(string $zone, string $years): array;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user