Étoffer le référentiel des types d'absence

Cinq types d'amorce ne tiennent pas un registre. Un commerce de détail
rencontre un accident de trajet, une mise à pied, un congé pour examen, une
visite médicale — et faute de type, ces absences se saisissent en « congé sans
solde », ce qui fausse à la fois le décompte et la paie.

Vingt-quatre types désormais, relevés sur le sélecteur du produit audité et
recoupés avec les rubriques du dossier de paie. Les drapeaux sont des valeurs
d'amorce, modifiables depuis les réglages : la nature Sécurité sociale ne se
discute pas, mais l'acquisition de congés pendant une absence dépend de la
convention.

« Repos hebdomadaire » figure au sélecteur audité et pas ici. C'est un repos
légal, porté par le modèle `Rest`, pas une absence qui se demande — en faire un
type d'absence laisserait un manager refuser une obligation.

Les familles de couleur passent de cinq à neuf, et deviennent une liste fermée
avec ses libellés. Le champ des réglages était libre : une clé fautive s'y
enregistrait sans bruit et la grille affichait un gris inexplicable. Quatre
familles s'ajoutent — famille, formation, jour férié, sanction. Une sanction se
distingue d'une absence ordinaire : elle est subie, elle se conteste, elle ne se
lit pas comme un congé.

La couleur groupe, le libellé précise. Donner sa teinte à chacun des
vingt-quatre types rendrait la grille illisible bien avant la fin de la liste.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5 committed 2026-08-11 13:45:53 +02:00
1 parent a0524c56d7
commit 804e14bf04
7 files changed
+173 -22

No files matched your search

+28
View File
@@ -0,0 +1,28 @@
import { describe, expect, it } from 'vitest';
import {
ABSENCE_COLOR_KEYS,
ABSENCE_COLORS,
isAbsenceColorKey,
} from '@/domain/absences/colors';
describe('familles de couleur des absences', () => {
it('n’a pas deux fois la même clé', () => {
expect(new Set(ABSENCE_COLOR_KEYS).size).toBe(ABSENCE_COLOR_KEYS.length);
});
it('donne un libellé à chaque famille', () => {
for (const color of ABSENCE_COLORS) {
expect(color.label, `libellé manquant pour ${color.key}`).toBeTruthy();
}
});
it('refuse une clé hors liste', () => {
// La grille se replie alors sur le gris. Le contrôle sert à empêcher qu'une
// clé fautive s'enregistre en base : elle y resterait invisible jusqu'à ce
// qu'un planning affiche une barre grise sans qu'on sache pourquoi.
expect(isAbsenceColorKey('neutral')).toBe(false);
expect(isAbsenceColorKey('')).toBe(false);
expect(isAbsenceColorKey('cp')).toBe(true);
});
});