51 lines
1.5 KiB
PHP
51 lines
1.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Service\WorkHours;
|
|
|
|
use App\Entity\Absence;
|
|
use App\Enum\HalfDay;
|
|
|
|
final class AbsenceSegmentsResolver
|
|
{
|
|
/**
|
|
* @return array{bool, bool}
|
|
*/
|
|
public function resolveForDate(Absence $absence, string $dateYmd): array
|
|
{
|
|
$startDate = $absence->getStartDate()->format('Y-m-d');
|
|
$endDate = $absence->getEndDate()->format('Y-m-d');
|
|
$startHalf = $absence->getStartHalf();
|
|
$endHalf = $absence->getEndHalf();
|
|
|
|
// Cas d'une absence sur une seule date: on déduit matin/après-midi depuis les bornes.
|
|
if ($startDate === $endDate) {
|
|
if (HalfDay::AM === $startHalf && HalfDay::AM === $endHalf) {
|
|
// Uniquement le matin absent.
|
|
return [true, false];
|
|
}
|
|
if (HalfDay::PM === $startHalf && HalfDay::PM === $endHalf) {
|
|
// Uniquement l'après-midi absent.
|
|
return [false, true];
|
|
}
|
|
|
|
// Sinon, on considère la journée complète absente.
|
|
return [true, true];
|
|
}
|
|
|
|
// Premier jour d'une absence multi-jours qui commence l'après-midi.
|
|
if ($dateYmd === $startDate && HalfDay::PM === $startHalf) {
|
|
return [false, true];
|
|
}
|
|
|
|
// Dernier jour d'une absence multi-jours qui se termine le matin.
|
|
if ($dateYmd === $endDate && HalfDay::AM === $endHalf) {
|
|
return [true, false];
|
|
}
|
|
|
|
// Les jours intermédiaires sont entièrement absents.
|
|
return [true, true];
|
|
}
|
|
}
|