import { Badge, type Tone } from '@/components/ui/Badge'; import type { BoardAlert } from '@/server/planning/queries'; /** * Panneau des constats de convention — PLAN.md §6.5. * * Trois choix délibérés : * * - Les constats sont **listés**, pas comptés. « 3 alertes » n'aide personne ; * « repos de 9 h 30 entre mardi et mercredi » se corrige. * - Un constat acquitté reste affiché, avec son motif. Le faire disparaître * donnerait l'illusion qu'il a été résolu alors qu'il a été assumé. * - Les informatives (dimanche, jour férié) sont montrées à part : ce ne sont * pas des anomalies mais des contreparties à ne pas oublier en paie. */ export interface AlertPanelProps { alerts: BoardAlert[]; /** Nom affichable par membership, pour situer chaque constat. */ names: Map; } const SEVERITY_TONE: Record = { BLOCKING: 'danger', WARNING: 'warn', INFO: 'info', }; const SEVERITY_LABEL: Record = { BLOCKING: 'Bloquant', WARNING: 'Alerte', INFO: 'À reporter en paie', }; export function AlertPanel({ alerts, names }: AlertPanelProps) { if (alerts.length === 0) return null; const anomalies = alerts.filter((alert) => alert.severity !== 'INFO'); const informative = alerts.filter((alert) => alert.severity === 'INFO'); return (

Convention collective

    {[...anomalies, ...informative].map((alert) => (
  • {SEVERITY_LABEL[alert.severity]}

    {alert.message}

    {[ alert.membershipId ? (names.get(alert.membershipId) ?? 'Salarié') : null, alert.localDate, alert.ruleCode, ] .filter(Boolean) .join(' · ')}

    {alert.acknowledged ? (

    Publié malgré l’alerte {alert.acknowledgementReason ? ` — ${alert.acknowledgementReason}` : ''}

    ) : null}
  • ))}
); }