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
@@ -20,6 +20,7 @@ const STATUS_ICONS: Record<AbsenceStatus, string> = {
const TYPE_COLORS: Record<AbsenceType, string> = {
cp: '#4A90D9',
mariage_pacs: '#E91E63',
naissance: '#26A69A',
conge_parental: '#9C27B0',
deces: '#607D8B',
maladie: '#C62828',
+9 -5
View File
@@ -1,6 +1,8 @@
# Absences
Le module **Absences** gère les congés des salariés : demande, validation, et suivi des soldes de congés payés (CP) et des congés pour événements (mariage/PACS, décès, congé parental, maladie).
Le module **Absences** gère les congés des salariés : demande, validation, et suivi du **solde de congés payés (CP)**. Les congés pour événements familiaux (mariage/PACS, naissance, décès) sont des **droits par événement** : ils sont enregistrés et validés mais **ne se déduisent pas d'un solde**. Le congé parental et l'arrêt maladie sont des suspensions, sans impact sur les soldes.
> Convention de référence pour les valeurs par défaut : **Syntec (IDCC 1486)** — à confirmer selon le code APE de l'entreprise (une CCN ne se déduit pas de la seule activité).
Il y a deux espaces :
@@ -13,11 +15,13 @@ Il y a deux espaces :
Depuis **Mes absences** → bouton *Nouvelle demande* :
1. **Type** : Congés payés, Mariage/PACS, Congé parental, Décès, ou Maladie.
2. **Dates** : début et fin. Une **demi-journée** (matin / après-midi) peut être posée sur le premier ou le dernier jour (décompte 0,5).
3. **Motif** (optionnel) et **justificatif** (selon le type).
1. **Type** : Congés payés, Mariage/PACS, Naissance, Congé parental, Décès, ou Maladie.
2. **Dates** : début et fin. Une **demi-journée** (matin / après-midi) peut être posée sur le premier ou le dernier jour (décompte 0,5, uniquement si ce jour-borne est un jour décompté).
3. **Motif** et **justificatif** (selon le type). Le **motif est obligatoire pour le décès** : il sert à préciser le lien de parenté, qui détermine le nombre de jours légal.
La demande passe au statut **En attente**. Les jours sont immédiatement **réservés** dans le solde « en attente » pour éviter de poser deux fois les mêmes congés. Un administrateur valide ou refuse ensuite la demande.
La demande passe au statut **En attente**, puis un administrateur la valide ou la refuse. Pour les CP uniquement, les jours sont immédiatement **réservés** dans le solde « en attente » pour éviter de poser deux fois les mêmes congés.
> **Congés pour événements familiaux — minimums légaux (rappel).** Mariage/PACS : 4 jours. Naissance : 3 jours (hors congé paternité). Décès : selon le lien — **enfant : au moins 5 jours + 8 jours de congé de deuil**, conjoint/partenaire/parent/frère/sœur : 3 jours. L'administrateur accorde le nombre de jours légal en validant les dates. La convention Syntec peut prévoir des durées supérieures.
## Lire ses soldes
+2 -1
View File
@@ -577,6 +577,7 @@
"types": {
"cp": "Congés payés",
"mariage_pacs": "Mariage / PACS",
"naissance": "Naissance",
"conge_parental": "Congé parental",
"deces": "Décès proche",
"maladie": "Arrêt maladie"
@@ -719,7 +720,7 @@
},
"policies": {
"title": "Politiques d'absence",
"subtitle": "Réglez les défauts par type d'absence (convention collective).",
"subtitle": "Réglez les défauts par type d'absence convention de référence : Syntec (IDCC 1486), à confirmer selon le code APE.",
"type": "Type",
"daysPerYear": "Jours / an",
"daysPerEvent": "Jours / événement",
+1 -1
View File
@@ -1,4 +1,4 @@
export type AbsenceType = 'cp' | 'mariage_pacs' | 'conge_parental' | 'deces' | 'maladie'
export type AbsenceType = 'cp' | 'mariage_pacs' | 'naissance' | 'conge_parental' | 'deces' | 'maladie'
export type AbsenceStatus = 'pending' | 'approved' | 'rejected' | 'cancelled'
export type HalfDay = 'matin' | 'apres_midi'