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>
This commit is contained in:
Matthieu
2026-05-22 16:00:28 +02:00
parent e9aaccc62c
commit f9773b3a5e
12 changed files with 123 additions and 25 deletions
+8 -2
View File
@@ -8,6 +8,7 @@ enum AbsenceType: string
{
case PaidLeave = 'cp';
case MarriagePacs = 'mariage_pacs';
case Birth = 'naissance';
case ParentalLeave = 'conge_parental';
case Bereavement = 'deces';
case SickLeave = 'maladie';
@@ -17,6 +18,7 @@ enum AbsenceType: string
return match ($this) {
self::PaidLeave => 'Congés payés',
self::MarriagePacs => 'Mariage / PACS',
self::Birth => 'Naissance',
self::ParentalLeave => 'Congé parental',
self::Bereavement => 'Décès proche',
self::SickLeave => 'Arrêt maladie',
@@ -25,10 +27,14 @@ enum AbsenceType: string
/**
* Whether taking this absence decrements a balance.
* Sick leave is managed by social security and has no balance.
*
* Only paid leave (CP) draws down an acquired balance. Family-event leaves
* (marriage/PACS, birth, bereavement) are per-event entitlements, parental
* leave is a contract suspension, and sick leave is handled by social
* security — none of them decrement a balance.
*/
public function decrementsBalance(): bool
{
return self::SickLeave !== $this;
return self::PaidLeave === $this;
}
}