É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

+32 -1
View File
@@ -1,6 +1,15 @@
import type { AbsenceColorKey } from '@/domain/absences/colors';
import { cx } from '@/lib/cx';
export type AbsenceKind = 'cp' | 'rtt' | 'maladie' | 'sans-solde' | 'attente';
/**
* Familles d'absence, pour la teinte de la barre — voir
* `src/domain/absences/colors.ts`.
*
* Le repli est `sans-solde`, gris, et c'est délibérément le plus terne : une
* teinte inconnue doit se remarquer comme une configuration incomplète, pas se
* fondre dans les congés payés.
*/
export type AbsenceKind = AbsenceColorKey;
const KINDS: Record<AbsenceKind, { bg: string; ink: string; edge: string }> = {
cp: {
@@ -18,6 +27,28 @@ const KINDS: Record<AbsenceKind, { bg: string; ink: string; edge: string }> = {
ink: 'var(--color-ink-2)',
edge: 'var(--color-line-3)',
},
famille: {
bg: 'var(--post-rss-bg)',
ink: 'var(--post-rss-fg)',
edge: 'var(--post-rss-edge)',
},
formation: {
bg: 'var(--post-for-bg)',
ink: 'var(--post-for-fg)',
edge: 'var(--post-for-edge)',
},
ferie: {
bg: 'var(--post-enc-bg)',
ink: 'var(--post-enc-fg)',
edge: 'var(--post-enc-edge)',
},
// Une sanction se distingue d'une absence ordinaire : elle est subie, elle se
// conteste, et elle ne se lit pas comme un congé.
sanction: {
bg: 'var(--color-danger-soft)',
ink: 'var(--color-danger-soft-ink)',
edge: 'var(--color-danger)',
},
'sans-solde': {
bg: 'var(--color-surface-2)',
ink: 'var(--color-ink-2)',
+2 -4
View File
@@ -1,6 +1,7 @@
import { AbsenceBar, type AbsenceKind } from '@/components/planning/AbsenceBar';
import { CounterStrip } from '@/components/planning/CounterStrip';
import { ShiftChip } from '@/components/planning/ShiftChip';
import { isAbsenceColorKey } from '@/domain/absences/colors';
import { computeWeekCounters } from '@/domain/counters/week';
import {
displayName,
@@ -246,8 +247,5 @@ function Row({
* repli neutre : une teinte inconnue vaut mieux affichée en gris qu'absente.
*/
function absenceKind(colorKey: string): AbsenceKind {
const known: AbsenceKind[] = ['cp', 'rtt', 'maladie', 'sans-solde', 'attente'];
return known.includes(colorKey as AbsenceKind)
? (colorKey as AbsenceKind)
: 'sans-solde';
return isAbsenceColorKey(colorKey) ? colorKey : 'sans-solde';
}