Files
Lesstime/tests/Unit/Service/AbsenceDayCalculatorTest.php
Matthieu f9773b3a5e feat(absences) : mise en conformité légale (événements familiaux, demi-journée, CCN)
Périmètre 1-6 du design 2026-05-22-absence-legal-compliance-fixes (points
lourds — ancienneté, CP pendant maladie, rétention — reportés en backlog).

- Événements familiaux sans solde : AbsenceType::decrementsBalance() ne vaut
  true que pour les CP. Mariage/PACS, naissance, décès = droits par événement ;
  congé parental = suspension ; maladie = Sécu. Plus de solde fantôme.
- Décès : daysPerEvent = null (selon lien de parenté) + motif obligatoire à la
  création (REST + MCP), les minimums légaux étant rappelés dans l'aide.
- Ajout du congé naissance (type, policy 3 j, justificatif, libellés/couleur front).
- Garde-fou demi-journée : -0,5 appliqué uniquement si le jour-borne est
  réellement décompté (corrige un sous-décompte week-end/férié) — TDD.
- CCN documentée : paramètre app.absence.convention = "Syntec (IDCC 1486)",
  rappelée en sous-titre admin et dans l'aide /help.

Tests : AbsenceDayCalculatorTest (garde-fou demi-journée), AbsenceRequestLifecycle
(motif décès obligatoire + aucun solde touché). make test 52/52, build Nuxt OK.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 16:00:28 +02:00

116 lines
3.5 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Tests\Unit\Service;
use App\Enum\HalfDay;
use App\Service\AbsenceDayCalculator;
use App\Service\PublicHolidayProvider;
use DateTimeImmutable;
use PHPUnit\Framework\TestCase;
/**
* @internal
*/
class AbsenceDayCalculatorTest extends TestCase
{
private AbsenceDayCalculator $calculator;
protected function setUp(): void
{
$this->calculator = new AbsenceDayCalculator(new PublicHolidayProvider());
}
public function testFullWeekIsFiveWorkingDays(): void
{
// Mon 2026-06-01 to Fri 2026-06-05, no holidays that week
self::assertSame(5.0, $this->calculator->countWorkingDays(
new DateTimeImmutable('2026-06-01'),
new DateTimeImmutable('2026-06-05'),
));
}
public function testWeekendIsSkipped(): void
{
// Fri 2026-06-05 to Mon 2026-06-08 => Fri + Mon = 2
self::assertSame(2.0, $this->calculator->countWorkingDays(
new DateTimeImmutable('2026-06-05'),
new DateTimeImmutable('2026-06-08'),
));
}
public function testHolidayIsSkipped(): void
{
// Thu 2026-05-07 to Fri 2026-05-08 (Victoire 1945) => Thu only = 1
self::assertSame(1.0, $this->calculator->countWorkingDays(
new DateTimeImmutable('2026-05-07'),
new DateTimeImmutable('2026-05-08'),
));
}
public function testHalfDayStartSubtractsHalf(): void
{
self::assertSame(4.5, $this->calculator->countWorkingDays(
new DateTimeImmutable('2026-06-01'),
new DateTimeImmutable('2026-06-05'),
HalfDay::Afternoon,
));
}
public function testBothHalfDaysSubtractOne(): void
{
self::assertSame(4.0, $this->calculator->countWorkingDays(
new DateTimeImmutable('2026-06-01'),
new DateTimeImmutable('2026-06-05'),
HalfDay::Afternoon,
HalfDay::Morning,
));
}
public function testSingleHalfDay(): void
{
self::assertSame(0.5, $this->calculator->countWorkingDays(
new DateTimeImmutable('2026-06-01'),
new DateTimeImmutable('2026-06-01'),
HalfDay::Morning,
));
}
public function testHalfDayOnNonCountedStartIsIgnored(): void
{
// Sat 2026-06-06 → Mon 2026-06-08, jours ouvrés : Sat & Sun skipped, Mon = 1.
// startHalfDay sits on Saturday (not counted) => must NOT subtract 0.5.
self::assertSame(1.0, $this->calculator->countWorkingDays(
new DateTimeImmutable('2026-06-06'),
new DateTimeImmutable('2026-06-08'),
HalfDay::Afternoon,
));
}
public function testHalfDayOnNonCountedEndIsIgnored(): void
{
// Fri 2026-06-05 → Sun 2026-06-07, jours ouvrés : Fri = 1, weekend skipped.
// endHalfDay sits on Sunday (not counted) => must NOT subtract 0.5.
self::assertSame(1.0, $this->calculator->countWorkingDays(
new DateTimeImmutable('2026-06-05'),
new DateTimeImmutable('2026-06-07'),
null,
HalfDay::Morning,
));
}
public function testWorkingDaysVsOpenDays(): void
{
// Fri 2026-06-05 to Mon 2026-06-08, "ouvrables" includes Saturday
// => Fri + Sat + Mon = 3 (Sunday always skipped)
self::assertSame(3.0, $this->calculator->countWorkingDays(
new DateTimeImmutable('2026-06-05'),
new DateTimeImmutable('2026-06-08'),
null,
null,
false,
));
}
}