import type { DeltaTone, WeekCountersView } from '@/domain/counters/week'; import { cx } from '@/lib/cx'; const DELTA_TONES: Record = { flat: 'text-ink-1', over: 'bg-warn-soft text-warn-soft-ink', under: 'bg-danger-soft text-danger-soft-ink', none: 'text-ink-3', }; export interface CounterStripProps { counters: WeekCountersView; /** Vrai si le contrat est au forfait jours : pas de comparaison horaire. */ forfaitJours?: boolean; /** Ligne des besoins sans titulaire : il n'y a pas de contrat à comparer. */ unassigned?: boolean; className?: string; } function Cell({ label, value }: { label: string; value: string }) { return ( {label} {value} ); } /** * Les cinq compteurs d'une ligne salarié — PLAN.md §7.4 : **heures * contractuelles, planifié, absences, écart, repos compensateur**. * * Ce sont ces cinq-là et pas d'autres. Les dimanches travaillés et les jours de * repos se lisent sur la grille ; le repos compensateur, lui, ne se lit nulle * part ailleurs — c'est une contrepartie **due**, et l'omettre du bandeau * masque la seule valeur qui dit qu'une dette existe. * * Rendus depuis `computeWeekCounters`, jamais recalculés localement : la même * implémentation alimente la grille, le rapport d'heures et l'export de paie. */ export function CounterStrip({ counters, forfaitJours = false, unassigned = false, className, }: CounterStripProps) { // Un besoin non couvert n'a pas de contrat : afficher un écart le compare à // zéro et fait lire « +14 h » comme un dépassement, alors que c'est // simplement le volume à pourvoir. if (unassigned) { return (
À pourvoir {counters.plannedLabel}
); } if (forfaitJours) { return (
Forfait jours {/* Un forfait jours reste soumis aux repos : le RC s'affiche, l'écart horaire non. */}
); } return (
· {counters.deltaLabel}
); }