fix(absences) : garde-fou solde négatif à l'approbation + cohérence fixture

- AbsenceBalanceService::availableForRequest() : jours disponibles (acquis N-1
  + en cours N − pris) pour la période de la demande, null si type non suivi.
- Blocage de l'approbation si countedDays > disponible, dans les deux chemins
  (REST AbsenceReviewProcessor + MCP ReviewAbsenceRequestTool), comme le motif
  décès. Les CP en cours d'acquisition restent posables, mais pas au-delà du
  droit total (plus de solde négatif silencieux à l'approbation).
- Fixture : demande pending CP d'alice replacée dans sa période de référence
  2025-2026 (26→29/05/2026, 4 j ouvrés) et solde pending aligné (5 → 4) ;
  plus de "en attente" orphelin non lié à une demande.
- Test fonctionnel testApproveBeyondAvailableBalanceIsBlocked + employé de test
  doté d'un droit pour que les approbations existantes passent le garde-fou.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Matthieu
2026-05-22 16:48:49 +02:00
parent f9773b3a5e
commit 65df36dd1a
5 changed files with 89 additions and 4 deletions
+8 -4
View File
@@ -686,8 +686,9 @@ class AppFixtures extends Fixture
$cpPeriod = '2025-2026';
$balanceData = [
// [user, acquired (N-1), acquiring (N, en cours), taken, pending]
// Alice's `pending` matches her pending CP request below (same 2025-2026 period).
[$admin, 10.0, 22.5, 5.0, 0.0],
[$userAlice, 8.0, 18.0, 2.0, 5.0],
[$userAlice, 8.0, 18.0, 2.0, 4.0],
[$userBob, 0.0, 14.0, 0.0, 0.0],
];
@@ -717,12 +718,15 @@ class AppFixtures extends Fixture
$approvedCp->setReviewedBy($admin);
$manager->persist($approvedCp);
// Pending CP within Alice's current reference period (2025-2026), so the
// reserved days line up with her balance's `pending` bucket above.
// Tue 26 → Fri 29 May 2026 = 4 working days (Pentecost Mon 25/05 excluded).
$pendingCp = new AbsenceRequest();
$pendingCp->setUser($userAlice);
$pendingCp->setType(AbsenceType::PaidLeave);
$pendingCp->setStartDate(new DateTimeImmutable('2026-06-15'));
$pendingCp->setEndDate(new DateTimeImmutable('2026-06-19'));
$pendingCp->setCountedDays(5.0);
$pendingCp->setStartDate(new DateTimeImmutable('2026-05-26'));
$pendingCp->setEndDate(new DateTimeImmutable('2026-05-29'));
$pendingCp->setCountedDays(4.0);
$pendingCp->setStatus(AbsenceStatus::Pending);
$pendingCp->setCreatedAt(new DateTimeImmutable('-2 days'));
$manager->persist($pendingCp);