AméliorationRefonte admin — phase 1 (D1) complete : la page Settings monolithique de 1021 lignes est decoupee en un hub Admin a 3 cartes (Equipe / Moteur / Acces) et trois sous-pages distinctes. Avant, Cecile y allait une fois, voyait l'effet 'bordel' (28 curseurs + 14 protections + 11 medecins x 7 sous-sections sur la meme page), et n'y revenait pas. Desormais, /admin ouvre un menu clair, chaque carte mene a sa propre page focalisee : Equipe (medecins + affinites), Moteur (presets + 28 contraintes + protections), Acces (liens personnels + planning public).
AméliorationHub vivant : chaque carte affiche un mini-resume contextuel — nombre de medecins actifs, preset actif detecte, nombre de reglages modifies depuis les defauts, nombre de liens personnels. Si une transition de medecin est programmee dans le futur (ex : LV passe a 50% le 1er mai), un badge ambre s'affiche sur la carte Equipe avec la date — directement actionnable depuis le hub. Si une lecture Supabase echoue, un bandeau de degraded mode s'affiche et les compteurs s'adaptent.
AméliorationDetection des incoherences cross-page : le ConflictBanner (qui signale par exemple 'pas assez de medecins primary pour les postes obligatoires') vit desormais sur le hub uniquement. Il lit l'etat sauvegarde des 2 slices et detecte les conflits qui traversent equipe et moteur. Avant, le banner etait noye en haut de la page Settings monolithique.
AméliorationSave par page : modifier un medecin sauvegarde uniquement la ligne 'doctor_profiles' Supabase, modifier un poids sauvegarde uniquement 'soft_constraint_weights' et 'hard_constraint_toggles'. Plus de risque d'ecrasement croise. Si Cecile quitte une page avec des modifs non sauvegardees (clic sur un autre onglet, refresh, fermeture), un modal de confirmation s'affiche : 'Modifications non sauvegardees. Quitter sans enregistrer ?'
AméliorationArchitecture interne : reducer splitte en equipe-state + moteur-state alignes sur les 4 rows Supabase 'solver_config' (doctor_profiles, combo_groups, soft_constraint_weights, hard_constraint_toggles). Hooks dedies useEquipeViewState et useMoteurViewState (au lieu d'un hook monolithique de 460 lignes). Tous les fichiers < 300 lignes (mandate CLAUDE.md respecte). 12 nouveaux tests vitest (equipe-merge, moteur-merge, admin-hub-summary, admin-redirects, admin-flow-integration) en plus des 13 tests de regression sur la facade settings-merge maintenue pour les API routes solve et suggest-fixes.
AméliorationBackward compat complete : /settings et tous les vieux liens ?section=X (medecins, affinites, presets, repartition_gardes, rythme_travail, organisation_postes, protections, liens_perso, liens_planning) redirigent automatiquement vers la bonne sous-page admin. Lien 'Admin' dans la nav (desktop + bottom tab bar mobile) pointe desormais sur /admin. Logique de mapping extraite en module pur testable (admin-redirects.ts).
AméliorationPhase 2 (D2) a venir : audit du vocabulaire des contraintes du moteur (les ~10 termes opaques type 'Continuite poste→garde' ou 'Renfort sous-effectif' a re-ecrire avec Marion), badge d'impact 'Eleve / Modere / Fin' sur chaque carte de contrainte, et tiers de visibilite (5 contraintes 'toujours visibles' / 10 'depliables' / 10 'avancees cachees par defaut') pour reduire la charge cognitive.
v8.1.226/05/2026
FixPages /a-propos et /auteur/clement-tardy : correction de la duree d'experience hospitaliere de la conjointe (10 ans dans le milieu hospitalier au lieu de 15 ans). Metadata, OpenGraph, JSON-LD et corps de texte alignes.
FixPage /a-propos lettre fondateur : ajout de l'apposition 'medecin' pour lever l'ambiguite (avant : 'Ma conjointe evolue dans le milieu hospitalier' — pouvait laisser croire a un poste de cadre ou administratif).
v8.1.126/05/2026
AméliorationBandeau d'impact tiroir — diff baseline. Le bandeau ne compte plus que les contraintes dures introduites par l'edition courante, calculees par difference exacte entre la baseline (originalDays) et le planning edite. Avant, le filtre par cellule editee matchait trop large pour les contraintes day-scoped (repos de garde, double affectation, desiderata) — n'importe quelle edition sur le meme jour faisait surgir des violations preexistantes sans rapport. Le validateur retourne maintenant aussi baselineHardViolations dans ValidationResult, et la cle de comparaison combine constraintId + jour + medecin + poste + description.
AméliorationGarde-fou defense-in-depth sur handleEnterEdit (planning-view) : premiere ligne if (!isAdminView(isAdmin, activeTab)) return;. La chaine de rendu n'exposait deja le declenchement edition qu'en contexte admin, mais un appelant orphelin (devtools, hot-reload, futur refactor) ne peut plus glisser. Canary structurel admin-gating-day-sheet.test.ts couvre 5 invariants : Changer gate par editable, editable={isAdmin}, footer gate par isAdmin && hasEdits, ServiceActivitiesSection gate par isAdmin, handleEnterEdit guard precoce.
v8.1.026/05/2026
AméliorationTiroir de jour vivant : changer un medecin met a jour le nom affiche dans le tiroir instantanement. Avant, le tiroir gardait un instantane fige des affectations au moment de l'ouverture — apres un changement, le bandeau continuait a afficher 'Agnes' meme si on l'avait remplacee par 'Margaux'. Le tiroir derive maintenant le jour affiche depuis l'etat courant des journees via la date selectionnee, ce qui evite la divergence.
AméliorationBandeau d'impact contextuel : il n'affiche plus que les regles a corriger liees aux cellules que l'admin est en train de modifier, plus toutes les regles preexistantes du mois. Le compteur souple devient detaille — on voit la liste des preferences degradees avec le delta (+poids), le label et le detail (ex. '+30 · Equilibre gardes samedi degrade — MS 2 vs LB 0'). Avant, le bandeau affichait toutes les contraintes du mois (bruit) avec un simple compteur opaque pour les souples.
AméliorationFooter du tiroir admin reorganise en deux lignes : ligne 1 = compteur 'X modif(s)' + boutons texte 'Annuler' et 'Tout annuler' (avec icones), ligne 2 = bouton 'Enregistrer le brouillon' pleine largeur. Avant, les boutons Annuler n'avaient qu'une icone (peu clair) et le footer empietait sur la barre gestuelle iOS sur mobile. La distance de securite respecte maintenant env(safe-area-inset-bottom).
AméliorationMode edition auto-declenche au premier clic 'Changer' : plus besoin de cliquer le bouton 'Modifier' separement. L'ancien bouton 'Modifier' + le bandeau 'Mode edition actif' + l'EditToolbar sticky en haut de page sont supprimes — l'edition vit entierement dans le tiroir d'un jour. Le bouton 'Regenerer le planning' devient toujours visible (avant cache quand le planning etait valide) avec une boite de dialogue de confirmation explicite si le planning est valide.
FixErreur runtime corrigee quand l'admin positionnait un medecin libre sur une activite via le selecteur : 'Cannot set properties of null (setting value)'. React annule la reference au selecteur apres le retour du handler — avec un await onAssign au milieu, le reset de la selection plantait. La reference est maintenant capturee de maniere synchrone et verifiee (isConnected) avant le reset, puisque le selecteur peut aussi etre demonte si le medecin a quitte la liste 'Pas positionnes'.
AméliorationVocabulaire de l'app : le mot 'violee' est banni de l'interface utilisateur. Les contraintes ne sont plus 'violees' mais 'a corriger' ou 'non respectees'. Le ton de l'app reste aidant, pas accusatoire.
AméliorationNettoyage : fichier impact-panel.tsx supprime (orphelin apres la refonte 8.0.0). Le bandeau d'impact vit desormais uniquement dans le tiroir de jour.
v8.0.023/05/2026
NouveauVue planning unifiee mobile/desktop. Avant, la grille desktop ouvrait quatre popovers differents au clic sur une cellule (un pour editer l'affectation admin, un pour voir 'pourquoi ce medecin', un pour gerer les consultations, un pour les absences) et le mobile ouvrait un panneau par le bas avec d'autres options encore. Resultat : un medecin qui passait de son telephone a son ordi voyait des interfaces et des options completement differentes pour la meme feature. Desormais, click ou tap n'importe ou sur la ligne d'un jour ouvre le MEME panneau, organise par sections : Postes, Modifier (admin), Pourquoi ce medecin, Activites, Activites du service (admin), Absents, Actions (echanger / reprendre / declarer une activite). Sur mobile le panneau s'ouvre par le bas (overlay classique), sur desktop il s'ouvre par la droite (largeur 420px) et reste ouvert pendant que la grille reste interactive a gauche — l'administrateur peut cliquer d'un jour a l'autre pour les auditer sans fermer le panneau a chaque fois (la ligne active est marquee par un trait teal a gauche).
NouveauCinq nouveaux types d'activite disponibles sur mobile : CA, RTT, Arret, Activite externe, Conge sans solde. Avant, ces cinq types n'etaient declarables que via le wizard 'Remplir mon mois' ou la page Desiderata — le mobile etait limite a six types (Consultation, Bureau, Ado, Diabete, Off, Formation), donc un medecin qui voulait ajouter rapidement un CA depuis son telephone devait passer par un autre ecran. Les options sont alignees sur celles du desktop, gatees comme avant sur le suivi P (un medecin sans suivi P n'a pas acces a CA/RTT/Arret/Externe/CSS).
NouveauL'administrateur peut desormais editer le planning depuis son telephone : changer une affectation, scinder une garde, valider/refuser une consultation pending avec une raison de refus optionnelle, positionner un medecin libre sur une consultation ou un autre type d'activite. Avant, toutes ces actions necessitaient d'ouvrir l'ordinateur (le bouton 'Vue tableau' mobile etait un patch qui forcait la grille desktop en scroll horizontal, peu utilisable). Le panneau jour expose toutes ces actions admin via une section 'Modifier' qui s'ouvre automatiquement quand le mode edition est actif (sinon repliee). Le bouton 'Vue tableau' mobile a ete supprime puisque le panneau couvre tout.
AméliorationVisibilite des indicateurs : sur n'importe quel jour, le panneau affiche maintenant clairement l'icone verrou pour les affectations verrouillees par l'admin, un badge ambre 'A pourvoir' pour les postes sans medecin sur un planning partiel, un anneau teal pour les modifications en cours dans le brouillon, et la section 'Pourquoi ce medecin' qui resume les raisons de la generation (peut etre depliee a la demande). Avant, ces signaux n'apparaissaient que cote desktop dans les popovers.
AméliorationRefonte technique : suppression de 5 fichiers popover desktop (~1400 lignes) et de 4 fichiers planning-v3 mort, remplaces par un seul composant DaySheet decoupe en 7 fichiers de moins de 300 lignes chacun (orchestrateur + 6 sections). Hook useIsDesktop SSR-safe via useSyncExternalStore, modal asymetrique (modal=true mobile, modal=false desktop pour le pattern side rail). Pattern button-in-cell pour l'accessibilite — la cellule jour-label devient un bouton focusable, les badges medecins deviennent du pur affichage, le click sur la ligne entiere ouvre le panneau. 4 tests canary structurels verrouillent l'invariant : aucun popover ne peut etre reintroduit, les 5 types d'activite restent presents, mobileForceTable reste banni, le dossier day-sheet/ conserve sa structure (363 vitest au vert).
v7.9.022/05/2026
NouveauLa page Desiderata d'un mois est desormais organisee en deux onglets pour les administrateurs (Marion, Cecile) : 'Mes desiderata' et 'Vue admin'. 'Mes desiderata' est la declaration personnelle — le medecin peint son calendrier et le transmet — sans aucun outil de supervision. 'Vue admin' regroupe le pilotage de la campagne (suivi des soumissions, geler / degeler la collecte) et la consultation des desiderata de toute l'equipe. Un medecin non-admin ne voit aucun onglet : sa page reste la declaration propre, comme avant. Le gate est etanche cote serveur — un non-admin qui force l'URL ?vue=admin retombe sur 'Mes desiderata' et ne charge jamais les desiderata nommes des autres.
Nouveau'Vue admin' est organise en deux sections. 'Vue d'ensemble du mois' : une grille globale medecins x jours qui montre d'un coup tous les desiderata declares — avant, l'administrateur ne pouvait les consulter que medecin par medecin, impossible de voir 'le 14 juillet, 6 medecins indisponibles' sans tout parcourir. Une ligne 'Total indisponibles' en bas du tableau additionne les absences de chaque jour et passe en rouge sur les jours charges : les jours difficiles a couvrir sautent aux yeux avant de lancer une generation. Une legende decode les icones, la colonne des noms et l'en-tete des jours restent visibles au defilement horizontal. 'Desiderata par medecin' : la liste des medecins a droite, selection en un clic, le calendrier du medecin choisi a gauche, editable par l'admin avec les verrous.
NouveauUn point vert apparait sur l'onglet 'Vue admin' quand tous les medecins ont transmis leurs desiderata et qu'aucun planning n'est encore genere : le signal 'collecte complete, prete a generer'. L'administrateur garde ainsi sa vue 'Mes desiderata' propre sans perdre de vue l'avancement de la collecte.
AméliorationRefonte technique : la page Desiderata (1230 lignes) decoupee en composants de moins de 300 lignes — feuille de calendrier partagee par les deux onglets, sous-arbres perso et admin, grille, barre d'onglets, hook de logique. Un echec de chargement de la grille affiche desormais un etat 'Donnees indisponibles' avec bouton reessayer au lieu d'un ecran en erreur, et un echec de chargement du calendrier d'un medecin affiche une erreur explicite au lieu d'un calendrier vide trompeur. 30 nouveaux tests vitest (359 au vert) : construction de la grille, detection des jours charges, derivation des couleurs d'outils, et canaries du gate (?vue, ?month preserve, le sous-arbre perso n'importe aucune donnee admin).
v7.8.022/05/2026
NouveauLa page Planning est desormais organisee en deux onglets pour les administrateurs (Marion, Cecile) : 'Mon planning' et 'Vue admin'. 'Mon planning' est exactement la page d'un medecin — la grille du service, ses propres postes, ses echanges — sans aucun outil de supervision. 'Vue admin' regroupe au meme endroit tout ce qui releve du pilotage : l'audit de generation (genere par... + accuses de lecture), les conflits et postes vides, la validation, le mode edition, les scenarios, la regeneration, les diagnostics. Avant, ces outils admin etaient eparpilles dans le defilement de la page, melanges a ce que voit aussi le medecin — l'admin devait trier mentalement entre sa vue perso et ses outils. Un medecin non-admin ne voit aucun onglet : sa page reste strictement la vue propre, comme avant.
NouveauUn point d'alerte ambre apparait sur l'onglet 'Vue admin' des qu'il y a quelque chose a traiter — un conflit, un poste vide, une consultation en attente. L'administrateur garde ainsi sa vue 'Mon planning' propre sans perdre de vue ce qui l'attend cote supervision. Le simple statut 'brouillon' ne declenche pas le point, sinon il serait allume en permanence sur tout planning fraichement genere.
AméliorationLe mode edition survit au changement d'onglet. Un administrateur qui modifie le planning dans 'Vue admin', bascule sur 'Mon planning' pour verifier quelque chose, puis revient, retrouve ses modifications non sauvegardees intactes. L'onglet actif est porte par l'URL (?vue=admin) : forcer cette URL en tant que non-admin renvoie automatiquement sur 'Mon planning'.
AméliorationRefonte technique : le composant de la page Planning (978 lignes) decoupe en 7 fichiers de moins de 300 lignes chacun, sans changement de comportement. Le parametre isAdmin vient desormais d'une source unique (l'en-tete serveur), coherente avec le gate des onglets. 11 nouveaux tests vitest (325 au vert) : logique pure isGridEditable, gate resolveActiveTab cote Planning, et 3 tests structurels canary qui verrouillent l'invariant de survie de l'edition (pas de loading.tsx sur la route, le panneau admin n'appelle aucun hook de cycle de vie, les onglets preservent le parametre ?month).
v7.7.021/05/2026
FixSecurite : les headers d'identite du middleware ne sont plus usurpables. Le middleware recopiait les headers de la requete entrante puis posait x-doctor-id / x-is-admin / x-service-id de maniere conditionnelle, sans jamais supprimer d'eventuelles copies fournies par le client. Un utilisateur non-admin pouvait donc envoyer lui-meme un header x-is-admin: 1 et acceder aux ecrans admin, usurper un autre medecin via x-doctor-id, ou changer de service via x-service-id. Le middleware supprime desormais systematiquement ces 4 headers de confiance avant de poser les siens. Corrige les 6 surfaces concernees (Mon suivi, Settings, Dashboard, Planning, Desiderata, layout). Faille pre-existante reperee lors de la revue de la Vue admin.
NouveauNouvel onglet 'Vue admin' dans Mon suivi, reserve aux administrateurs (Marion, Cecile). Pendant nomme de la vue medecin anonyme : la ou chaque medecin voit ses propres gardes comparees a une mediane sans noms, l'admin voit un tableau nomme par medecin pour arbitrer concretement les desequilibres (ex. un medecin a 11 dimanches+feries sur l'annee quand la mediane est a 4). Deux tableaux empiles, structure miroir de la page medecin : 'Temps de travail' et 'Gardes'. Un medecin non-admin ne voit jamais cet onglet ni aucune donnee nommee d'autrui : le gate est etanche cote serveur, la donnee equipe n'est ni chargee ni envoyee a un non-admin.
NouveauTableau 'Temps de travail' avec selecteur de granularite Mois / Quadrimestre / Annee, plus un sous-selecteur en pills pour choisir quel mois ou quel quadrimestre afficher. La fenetre 'Annee' va du debut d'annee au DERNIER MOIS VALIDE (pas l'annee civile entiere) : realise et attendu sont ainsi compares sur la meme periode ecoulee, sans fausser l'ecart avec des mois futurs non generes. La plage de dates exacte du calcul est affichee a chaque selection. Un repere ambre 'j non declares' signale une saisie incomplete : un ecart negatif peut alors venir de donnees manquantes plutot que d'un vrai retard. Les medecins partages sur plusieurs hopitaux portent un badge 'Ext.' et n'affichent qu'un realise (pas de budget attendu sur ce service). Tableau compact, lisible sur mobile sans scroll horizontal.
NouveauTableau 'Gardes' triable par colonne (semaine / vendredis / samedis / dimanches+feries / total), tri par defaut sur le total : le medecin le plus charge en tete. Le sous-titre indique la periode reellement couverte (ex. janvier -> aout 2026). Une valeur nettement au-dessus de la mediane equipe est marquee d'un repere visuel. Les medecins ne participant pas au cycle de gardes (oncall_volume non defini) sont grises et places en bas, exclus de la mediane, mais leurs vraies gardes restent affichees (ils peuvent en avoir fait quelques-unes). Couleurs de categorie identiques a la vue medecin, pas de score pondere. Version mobile compacte : en-tetes abreges pour faire tenir les 6 colonnes sans scroll horizontal.
AméliorationPalette de couleurs des categories de garde extraite dans un module partage (guard-classification.ts), importee par la carte medecin et le tableau admin : une seule source pour les couleurs brand vendredi / samedi / dimanche+ferie. 35 nouveaux tests vitest (306 au vert) sur la logique pure : resolution des fenetres P (annee bornee au dernier mois valide, quadrimestre, mois), plage de dates, somme des jours non declares, tri et detection d'ecart, et regression critique du gate admin (un non-admin qui force l'URL ?vue=admin retombe sur sa propre vue).
v7.6.121/05/2026
FixUn medecin peut desormais reprendre ou echanger une garde (ou un poste) un jour de la semaine ou il n'est habituellement pas disponible. Avant, les jours de disponibilite declares (ex. Laura n'est de garde que le lundi) bloquaient totalement toute reprise ou tout echange sur un autre jour : impossible de proposer a Laura une garde le vendredi, et impossible pour elle de se proposer pour la reprendre. Or ces jours de disponibilite ne servent qu'a la generation automatique du planning : un echange entre medecins se fait avec l'accord des deux parties, il ne doit pas etre bloque. Desormais, dans tous les flux d'echange (offre de reprise, reprise directe, demande au service, echange croise), un jour hors des disponibilites habituelles affiche une simple alerte orange informative au lieu d'un blocage : la proposition reste possible. Le cas signale (Laura qui reprend la garde de Marion du vendredi 5 juin) fonctionne maintenant.
Amélioration8 nouveaux tests vitest verrouillant la regle : la disponibilite par jour de semaine devient une alerte souple dans les echanges (gardes et postes, reprise comme echange croise), sans jamais masquer un vrai conflit bloquant (absence, repos de garde, ne fait pas de gardes). La grille admin garde le blocage dur, car c'est le contexte de generation automatique.
v7.6.021/05/2026
FixJour de garde de nuit visible dans 'Remplir mon mois' et sur mobile. Avant, des qu'un medecin etait de garde un jour, ce jour disparaissait entierement du wizard 'Remplir mon mois' et le bouton 'Declarer une activite' etait masque sur mobile, comme si la garde occupait toute la journee. Or la garde de nuit ne prend que la soiree : le matin et l'apres-midi restent libres (un medecin de garde peut tout a fait etre en consultation la journee). Le wizard et la fiche jour mobile affichent desormais ces jours, avec leurs creneaux matin et apres-midi remplissables. Seuls le repos du lendemain de garde et la garde de jour d'une garde fractionnee bloquent encore la journee.
NouveauUn medecin peut desormais retirer ses propres consultations meme une fois validees, sans passer par l'administrateur. Avant, le comportement etait incoherent : bloque dans la grille desktop et la vue 'Mon planning', mais possible sans friction via 'Remplir mon mois' et la modale mobile. C'est desormais autorise partout, avec un rappel systematique avant le retrait : verifier qu'aucun patient n'a ete positionne sur le creneau, et prevenir le secretariat. Aucune notification automatique n'est envoyee (decision validee avec la cheffe de service) : le medecin previent le secretariat lui-meme.
Amélioration5 nouveaux tests vitest sur isPostedDaytime (poste de jour, garde de nuit, garde fractionnee jour et nuit, aucune affectation).
v7.5.020/05/2026
NouveauRefonte de la page Mon suivi pour donner une place premium au suivi des gardes, sans casser le suivi du temps. Le haut de page presente deux cartes cote a cote : 'Mon activite' (bilan temps de travail + bilan gardes sur la periode validee) et 'Soldes annuels' (CA / RTT / FO). Tout est cale sur la meme fenetre temporelle (mois valides ou en brouillon, ex. janvier -> aout 2026), pour ne plus melanger 'mois courant' et 'annuel' dans la tete du medecin.
NouveauNouvelle section 'Mes gardes' en bas de page avec chart annuel complet : 12 mois empiles par categorie (semaine / vendredi / samedi / dimanche+ferie), palette 4 couleurs brand distinctes (gris, ambre Warning #D4930D, Bois de Rose #C2707F, rouge Error #C93545), repartition mensuelle, et comparaison anonyme a la mediane de l'equipe (total + detail par categorie). Repond a la question 'est-ce que je suis lesee sur le long terme' sans nommer personne.
NouveauDistinction visuelle des trois zones temporelles partout (gardes ET P) : mois valides en plein, mois en brouillon avec hachures legeres en surimpression, mois futurs non generes avec hachures grises sur colonne vide. Coherence visuelle entre la carte 'Mois par mois' (P) et 'Mes gardes' (chart annuel). Permet d'etre honnete sur l'incertain : le medecin voit immediatement ce qui est confirme et ce qui est encore un projet revisable.
AméliorationCarte 'Mois par mois' (P) passe de 6 a 12 mois fixes (annee civile complete), suppression du toggle 'Tous / 6 derniers'. Coherent avec le chart annuel des gardes en bas.
AméliorationWizard 'Remplir mon mois' deplace dans la carte 'Mois par mois' : il apparait inline a la selection d'un mois valide via un bouton 'Remplir ce mois' dans le detail deroulant. Plus de bouton flottant orphelin au-dessus de la carte. Le wizard est contextualise au mois selectionne.
AméliorationMediane equipe calculee uniquement sur les medecins qui participent aux gardes (`oncall_volume` defini, exclut MM Moulay et ES Emilie au CH Rochefort). Pas de medianes 'normal vs reduced' separees : une seule comparaison de reference, claire. Si moins de 3 medecins participants : 'Comparaison equipe indisponible'. Si le medecin lui-meme ne participe pas aux gardes : message adapte, pas de comparaison.
AméliorationRenommages : 'Solde annuel' -> 'Soldes annuels' (pluriel) ; 'Conges' -> 'Conges' (avec accent). Lien d'ancre dans 'Mon activite' qui scrolle vers le detail mois par mois en bas.
AméliorationAucune nouvelle dependance ajoutee : tout le rendu visuel reutilise le pattern HTML/CSS pur deja en place pour les barres P mensuelles (pas de Recharts, pas de chart library externe). Bundle inchange.
Amélioration16 nouveaux tests vitest (266 au vert) verrouillant la classification des jours feries (regression critique : un samedi ferie compte comme dimanche+ferie en double-paie, pas comme samedi standard ; pareil pour vendredi ferie et jeudi ferie) et le calcul de la mediane d'equipe (cas a 10, 9, 2 medecins, totaux nuls).
v7.4.219/05/2026
FixUne seule comptabilite des P partout. Avant, la page Planning calculait les P sur le mois calendaire (1 au 31) et la page Mon suivi sur la periode administrative (du 1er lundi au dimanche avant le 1er lundi suivant) : deux chiffres differents pour le meme mois, et la version calendaire introduisait un arrondi (ex. aout : 25 au lieu de 30 pour un 60%). Desormais la page Planning affiche exactement le meme calcul que Mon suivi (periode administrative), pour le medecin connecte comme pour le tableau de tous les medecins. La grille reste calendaire pour editer le planning ; seul le compteur P bascule sur la periode administrative. Plus aucun arrondi, plus de double comptabilite, chiffres conformes a l'administration.
NouveauEncart explicatif quand la periode P est a cheval sur deux mois calendaires (ex. periode d'aout = 3 aout au 6 septembre). Tant que le planning du mois suivant n'est pas valide, le realise affiche est forcement incomplet : un bandeau bleu l'explique clairement (l'objectif, lui, reste definitif) au lieu de laisser croire a un retard. Affiche a l'identique sur Planning et sur Mon suivi.
Amélioration4 tests vitest verrouillant la detection 'periode a cheval' (aout -> septembre, fevrier -> mars, mai ne deborde pas, decembre -> janvier de l'annee suivante). 250 tests au vert.
v7.4.119/05/2026
FixSuivi du temps de travail : le budget P attendu d'un mois dont la periode administrative deborde sur le mois suivant n'est plus sous-estime quand le planning du mois suivant n'est pas encore genere. Exemple : la periode admin d'aout 2026 va du lundi 3 aout au dimanche 6 septembre (25 jours ouvres, dont 4 en septembre). Tant que septembre n'etait pas genere, le budget ne comptait que 21 jours (Laura 50% voyait 21P au lieu de 25P, Cecile 60% voyait 25P au lieu de 30P). Le budget attendu est desormais calcule sur les bornes administratives completes, independamment de l'existence du planning, et ne bougera plus quand le mois suivant sera genere. Corrige d'un seul coup la carte budget mensuel, les barres mois par mois, le hero de progression, le tableau de bord et la carte quadrimestre. Le realise reste calcule sur les jours reellement saisis (un mois futur non genere = 0P realise, normal).
Amélioration8 nouveaux tests vitest verrouillant le calcul du budget sur la fenetre admin complete (aout 2026 debordant sur septembre) + non-regression start_date (arrivee en cours de periode), conge sans solde, et ferie en semaine (regle PR #26).
AméliorationAudit de robustesse du calcul des P attendus (suite retour Laura) : 7 tests vitest figent 3 garanties. (1) Preuve sur 120 cas que sur la periode administrative le budget egale exactement le modele 'P par semaine x semaines - 2 par ferie' : aucun arrondi parasite cote Mon suivi. (2) La deduction d'un jour ferie vaut toujours 2P pleins, identique quelle que soit la quotite, et un ferie tombant un week-end ne retire rien. (3) Le garde-fou empechant un budget negatif ne se declenche jamais pour les quotites reelles du service (30 a 100%). Aucun bug trouve : comportement deja correct, desormais verrouille contre toute regression.
v7.4.015/05/2026
FixBudget P attendu pour les temps partiels : aligne sur la regle administrative officielle CH Rochefort. Avant, les jours feries en semaine etaient deduits au prorata du temps partiel (0.6 × ferie pour un 60%), ce qui surestimait le budget. Desormais, les feries sont deduits pleins (2P par ferie) independamment de la quotite, conformement aux OS quadrimestriels valides sur Q1 et Q2 2025. Exemples : Cecile (60%) juillet 2026 = 22P (au lieu de 23P), Q2 2025 = 92P (au lieu de 96P) ; Laura Berdah (50%) Q2 2025 = 75P (au lieu de 80P). Le 100% n'est pas impacte. Cartes budget mensuel, barres mois par mois, hero progression, dashboard suivi, carte quadrimestre et wizard 'Remplir mon mois' refletent automatiquement le bon budget.
MoteurContrainte H10 (work_rate cap) suit la meme regle admin : un ferie en semaine deduit 1 jour plein du cap d'activite mensuel, sans prorata par quotite. Exemple Cecile en juillet (1 ferie 14/7) : cap = round(0.6 × 23) - 1 = 13 days ; en mai (4 feries) : cap = round(0.4 × 21) - 4 = 4 days. Avant fix : 7 days pour le 40% en mai (3 days de trop). 2 nouveaux tests pytest validant la formule sur juillet+mai 2026.
Amélioration16 nouveaux tests vitest validant la formule admin sur Q1+Q2 2025 : 100% Q1=166P, Cecile 60% Q1=98P / Q2=92P, Berdah 50% Q1=81P / Q2=75P. Couvre computeMonthlyBudget, computeBudgetFromDates, computeAnnualBudget. Edge cases : ferie sur seul jour ouvre = budget 0 (max clamp).
v7.3.023/04/2026
NouveauConge sans solde (L6152-4 CSP) : nouveau type d'absence pour remplacement externe ou journees hors obligation de service. Disponible dans le popover d'activites, le wizard 'Remplir mon mois' et la page desiderata (bouton CSS slate). Ces jours ne sont PAS payes (0P realise) et reduisent le budget P attendu du mois (Margaux une semaine en CSS = budget reduit de 10P, elle ne doit pas rattraper ces jours). Cote solver : nouvelle contrainte dure CONGE_SANS_SOLDE bloque toute affectation sur ces jours (equivalent d'un UNAVAILABLE + reduction H10). Saisie via desiderata si declare avant generation, via activite sinon.
MoteurDesideratumType CONGE_SANS_SOLDE ajoute : H10 (work_rate cap) reduit le budget, H11 (desiderata unavailable) bloque toute affectation, H19 (specialist) exclut la date. Les activites CSS saisies via wizard sont projetees en desiderata CSS cote route /api/solve pour garantir la coherence solver.
AméliorationcomputeMonthlyBudget / computeBudgetFromDates / computeAnnualBudget acceptent desormais un parametre excludedDates pour exclure des jours du decompte budget. computeAnnualBudget ne deduit PAS de CA/RTT supplementaire pour les jours CSS (regle legale PH : CSS est une derogation a l'obligation de service, pas une perte de droits acquis).
v7.2.423/04/2026
FixConges, RTT, RTA et arrets poses sur des weekends, jours feries ou jours off contractuels (ex: mercredi pour Cecile) ne sont plus decomptes du solde annuel ni du budget P mensuel. Cas Cecile juillet 2026 : 34P → 26P correct, solde CA 22j → 14j correct. La saisie en plage continue (ex: 18 juillet → 9 aout) reste disponible et simple, les demi-journees hors jour travaille sont simplement ignorees au calcul. Formation et activite externe continuent de compter quel que soit le jour (temps de travail reel). Correction automatique pour 6 medecins deja impactes : AL, SB, AT, MM, MNA, HM.
v7.2.323/04/2026
FixSuivi du temps de travail : la date d'arrivee d'un medecin (reglages) ajuste desormais le budget P attendu, le solde annuel CA/RTT, le compteur de demi-journees libres et le bandeau de completude. Avant, un medecin arrive le 9 fevrier se voyait reclamer 42P pour janvier, 25 CA complets pour l'annee, et Fev 2-6 apparaissaient comme des demi-journees libres alors qu'il n'etait pas arrive. Le quadrimestre, le solde annuel (prorata legal), les listes de jours libres et les alertes de completude respectent tous la date d'arrivee.
AméliorationPlanning > Suivi du temps de travail : le bloc personnel affiche desormais 'arrivee le X' a cote du nom du mois quand le medecin est arrive en cours de mois, pour que le budget reduit soit immediatement comprehensible.
AméliorationSuivi P : helper fmtP (formatage des demi-journees) centralise dans p-tracking-helpers, elimine 7 duplications. Composant PAnnualCard non utilise supprime.
v7.2.222/04/2026
NouveauMessage optionnel dans les demandes d'echange : en proposant une reprise, une offre de reprise, un broadcast au service ou un echange, le medecin peut ajouter un mot pour son/ses collegues (ex: 'peux-tu me depanner, mon petit est malade'). Champ limite a 280 caracteres, visible dans les cartes entrantes ET dans l'email de notification (bloc cite avec barre teal).
FixEmails reprise et echange : l'envoi n'etait pas toujours fiable (fire-and-forget gele avec le container Vercel apres la reponse HTTP — signature observee le 20/04 : email Lucas avec 4m37s de retard, email Marion jamais envoye). Correction appliquee sur les 10 sites d'envoi d'emails des 5 routes swaps : offre de reprise (propose + respond), demande de reprise (propose + respond : refus direct, refus broadcast, acceptation), echange de garde (propose + 4 actions de respond). +200ms de latence, emails garantis.
v7.2.120/04/2026
AméliorationColonne Garde plus lisible : header transforme en chip Bois de Rose avec icone lune, badges medecins avec contour rose, icone lune prefixee devant chaque initiale. Desktop et mobile.
FixOffre de reprise : le bouton 'Reprendre la garde' n'apparaissait que sur la vue bureau (tableau). Sur mobile (et dans 'Mes postes'), tapper sur la garde d'un collegue n'offrait aucune action. Le bouton est desormais disponible dans la fiche jour mobile pour chaque poste tenu par un autre medecin sur une date future. Un poste = bouton direct, plusieurs postes = liste depliable inline.
FixOffre de reprise : les cellules verrouillees par l'admin (cadenas amber) sont exclues des propositions de reprise. Evite qu'un medecin reprenne une affectation qu'une regeneration retablirait automatiquement. S'applique a la fiche jour mobile et au popover bureau.
v7.2.009/04/2026
NouveauOffre de reprise : un medecin peut desormais proposer de prendre la garde d'un collegue (et non plus seulement en ceder une). Clic sur la cellule d'un collegue → 'Proposer de reprendre'. Verification d'eligibilite en temps reel (conflits bloquants en rouge, alertes souples en ambre). Le collegue recoit une notification et accepte ou refuse — le planning se met a jour automatiquement si accepte.
v7.1.307/04/2026
NouveauPage Glossaire (/glossaire) : 20 definitions du vocabulaire du planning de garde hospitalier en 5 categories. Strategie GEO 'niche dictionary' — definitions autonomes 30-50 mots citables par les IA. Schema DefinedTermSet JSON-LD, barre d'ancres sticky, maillage interne.
v7.1.206/04/2026
NouveauPage FAQ dediee (/faq) : 24 questions en 6 categories, optimisee SEO + GEO (format answer-first pour citation par les IA). Schema FAQPage JSON-LD, barre d'ancres sticky, liens internes vers articles et fonctionnalites.
v7.1.105/04/2026
FixPresets solver : les poids de 2 contraintes (preference de jours, poste prefere) etaient inverses dans les presets Equilibre/Continuite/Confort. Le solver penalisait les preferences au lieu de les favoriser. Corrige.
FixCalendrier personnel : le dialog 'Mon calendrier' n'affichait rien si le medecin n'avait pas de lien calendrier configure. Affiche desormais un message explicatif avec contact admin.
FixCopie lien calendrier : le toast 'Lien copie' s'affichait meme si la copie echouait. Corrige avec gestion d'erreur.
AméliorationReglages : ajout de 2 contraintes structurelles dans la documentation (plafond activite P, date de debut medecin).
AméliorationLabels admin : 'Lancer la collecte' remplace par 'Aller au planning' dans le panneau desiderata et 'Collecte a lancer' dans le dashboard, pour eviter la confusion avec le vrai bouton de lancement.
AméliorationRefactoring planning-view.tsx : 1752 lignes splitees en 6 modules (use-planning-lifecycle, use-regeneration, use-planning-days, use-admin-banner-state, calendar-subscription-dialog, swap-proposals-panel). Maintenabilite amelioree, zero regression.
v7.1.003/04/2026
NouveauPlanning valide : nouvelle vue mobile compacte avec badges couleur, garde en premiere colonne, legende sticky et separation visuelle des semaines.
NouveauFiche jour : tap sur un jour ouvre un bottom sheet avec les postes, les activites declarees et les absences. Consultations en attente signalees par un badge ambre.
NouveauDeclaration d'activite en ligne : grilles Matin / Apres-midi avec 6 types (Consultation, Bureau, Ado, Diabete, Off, Formation). Masquee les week-ends et quand le medecin est poste.
NouveauMes postes : vue personnelle avec carte prochaine garde, jours postes en blanc, week-ends grises, et declaration d'activite integree.
AméliorationAdmin : point ambre sur les jours avec consultations en attente (pas bureau ni formation). Validation et rejet en un tap.
AméliorationToggle Vue tableau pour forcer l'ancien tableau sur mobile.
FixGarde partagee : affichage correct des deux medecins (jour / nuit) dans la fiche jour et la vue compacte.
FixAccessibilite : suppression des warnings Radix 'Missing Description' sur les bottom sheets.
FixReglages : suppression d'une regle fantome ('Indisponibilites fixes') qui n'avait plus d'effet depuis la refonte des disponibilites.
FixValidation du planning : si l'import des conges/formations depuis les desiderata echouait, aucun message d'erreur n'apparaissait. Corrige.
FixGeneration : quand le moteur manque de temps sans trouver de solution, le message distingue desormais un timeout d'une impossibilite mathematique.
AméliorationNettoyage de code mort (contraintes H6/H7/H8, composant planning-v2 inutilise) et meilleure gestion des erreurs dans le moteur de planification.
v7.0.202/04/2026
FixMedecins 24h (Helene) : le moteur pouvait attribuer une garde sans poste en journee. Corrige : poste + garde toujours ensemble, dans les deux sens.
v7.0.131/03/2026
FixCalendrier perso : une garde ou un poste assigne apparaissait comme 'Absent' si un desiderata d'indisponibilite existait le meme jour. Le planning genere prime desormais sur les souhaits.
FixCalendrier perso : les consultations n'apparaissaient pas sur les mois au-dela du mois suivant (ex: mai quand on est en mars). Corrige.
v7.0.027/03/2026
NouveauReprise de garde entre medecins : proposez une reprise depuis Mon planning. Deux modes : direct (a un collegue specifique) ou broadcast (au service, seuls les eligibles sont notifies). Filtrage intelligent par contraintes. Notifications in-app + email.
NouveauScore de faisabilite sur chaque candidat (vert = OK, orange = impact souple, rouge = impossible) — meme systeme que l'editeur admin.
NouveauAlertes avant acceptation : le medecin voit les contraintes impactees (ex: garde le lendemain) avant d'accepter.
AméliorationLes reprises en cours sont automatiquement annulees lors d'une regeneration du planning.
v6.1.327/03/2026
MoteurActivite externe : penalite separee de 'prefere pas' (80 vs 25). Un medecin en activite externe (IME, cours…) sera beaucoup moins facilement poste par le moteur. Ajustable dans Reglages.
v6.1.227/03/2026
NouveauCompteur Formation (FO) dans Mon suivi : solde annuel 15 jours, non proratise (droit legal identique quelle que soit la quotite). Jauge bleue a cote de CA et RTT.
NouveauCompteur FO dans le wizard 'Remplir mon mois' : solde formation restant visible en temps reel, comme CA et RTT.
FixWizard : seuls les mois avec un planning valide apparaissent dans le selecteur. Plus possible de remplir un mois dont le planning n'a pas ete valide.
FixTableau P du service visible pour les admins non-medecins sur la page planning.
FixAlerte completude : 'Mercredi 1 Mars' corrige — les jours en debordement de mois P (ex: avril dans le mois P de mars) affichent maintenant le bon mois.
FixWizard : les jours de repos apres garde ne sont plus proposes a remplir, meme quand la garde etait en fin de mois precedent.
v6.1.127/03/2026
FixWizard 'Remplir mon mois' : correction du compteur CA/RTT qui variait entre les mois (desynchronisation activites/slots).
FixWizard : le bouton Enregistrer ne se grisait plus apres avoir peint des activites deja presentes en base.
FixWizard : crash corrige lors du passage au mois de mai (tableau de tailles differentes).
AméliorationWizard : chargement des activites avant affichage pour eviter les donnees stales.
NouveauWizard : retrait d'absences obsoletes (repos de garde avec absence declaree). Bouton 'absent x' + sauvegarde via Enregistrer.
FixBarres mois par mois : les barres budget (ghost bars) s'affichent correctement sur desktop. Mobile : barres proportionnelles au taux de remplissage.
AméliorationLanding : labels Avant/Apres et fleche de transition sur le hero. Image visible sur mobile. Excel plus chaotique.
v6.1.026/03/2026
NouveauSite vitrine : nouvelles pages Tarifs, Fonctionnalites, Contact et A propos. Navigation publique et footer etendu pour les visiteurs.
AméliorationLanding page allegee : sections deplacees vers /fonctionnalites, CTAs vers /tarifs et /contact. Bandeau 'Utilise en pediatrie hospitaliere'.
AméliorationHeader marketing avec navigation publique (Fonctionnalites, Tarifs, A propos, Changelog, Se connecter) pour les visiteurs non connectes.
AméliorationMetadata SEO sur toutes les pages publiques (title, description, openGraph).
v6.0.125/03/2026
NouveauFormation et Arret auto-declares : nouveaux boutons FO/AM dans le popover et la vue medecin (beta). Une formation ou un arret pose depuis le planning compte 1P par demi-journee dans Mon suivi.
v6.0.025/03/2026
NouveauMon suivi : nouvelle page personnelle de tracking des demi-journees (P). Progression du mois, historique, resume quadrimestriel et annuel. Badges cliquables pour voir le detail des jours.
NouveauCarte P sur le planning : tableau recapitulatif Realise / Attendu / Ecart par medecin avec legende et warning donnees.
NouveauCA / RTT post-validation : nouveaux boutons dans le popover d'activites et la vue medecin pour poser un conge annuel ou RTT apres validation du planning.
NouveauP-month : le decompte mensuel demarre le premier lundi du mois (ex: mars 2026 = 2 mars au 5 avril), conformement au comptage de l'administration.
MoteurH10 : les absences (formation, conge, arret) reduisent maintenant le budget du solver. Un medecin absent n'est plus sur-alloue.
FixImport de 61 consultations historiques (janvier + fevrier 2026) depuis les CSV de Cecile.
v5.5.023/03/2026
NouveauRetrait d'absence : un medecin peut desormais retirer sa propre absence depuis le planning (clic sur son badge dans la colonne Absences). Il devient libre de se positionner en consultation ou bureau.
FixDashboard : les mois valides au-dela de M+1 (ex: mai quand on est en mars) apparaissent maintenant dans le panneau mois complet.
v5.4.023/03/2026
MoteurNouveau role Specialiste : un medecin specialiste (ex: urgentiste adulte) est automatiquement affecte a son poste autorise chaque jour de presence. Libere un generaliste pour un autre secteur.
NouveauParametres : nouvelle option 'Specialiste' dans le role du medecin. Le moteur affecte automatiquement le specialiste a son poste dedie.
v5.3.020/03/2026
FixDevalidation preservee : repasser un planning en brouillon conserve maintenant les corrections manuelles au lieu de les supprimer.
FixTriangles de violation : les postes non autorises (ex: ES hors urgences) et les medecins WE-only affiches en semaine sont maintenant detectes sur la grille.
FixContrat contraintes : synchronisation complete des IDs entre le fichier de regles JSON, les labels TypeScript et le solver Python. 3 contraintes dures manquantes ajoutees.
FixDonnees orphelines : la desactivation d'un medecin nettoie maintenant ses desiderata et verrous futurs. La suppression definitive nettoie toutes les donnees liees.
AméliorationRegeneration : avertissement explicite quand des corrections manuelles sauvegardees seront remplacees par le nouveau calcul.
v5.2.020/03/2026
NouveauSous-poids editables : les 5 contraintes multi-poids (desiderata, continuite, renfort, espacement, recup) affichent maintenant des curseurs individuels dans Parametres. Chaque sous-poids peut etre ajuste independamment.
NouveauNouvelle contrainte visible : les desiderata souples (prefere pas, consultation demandee, demande de garde) apparaissent desormais dans la page Parametres avec leurs 3 sous-poids.
v5.1.020/03/2026
FixCurseurs multi-poids (continuite, backup, espacement, desiderata, recup) : les modifications etaient ignorees par le moteur. Les sous-poids sont maintenant ajustes proportionnellement.
FixProtections desactivables : les interrupteurs de contraintes dures dans Parametres n'avaient aucun effet. Le moteur respecte maintenant les protections desactivees.
FixGel desiderata : un medecin ne peut plus modifier ou soumettre ses desiderata apres la cloture de la collecte.
FixPlanning public : les plannings non valides ne sont plus visibles sur la page publique.
FixCalendrier iCal : correction de doublons potentiels dans le feed (jours de contexte stale).
AméliorationPanneau d'impact : detection des gardes trop rapprochees (3+/7j), des 2 week-ends d'affilee, et du bonus garde-urgences.
AméliorationSauvegarde : detection de conflit si un autre admin a modifie le planning entre-temps.
AméliorationRegeneration : avertissement si des modifications non sauvegardees seront perdues.
FixSecurite : un medecin desactive ne peut plus acceder aux fonctionnalites de l'app.
FixSecurite : le micro-feedback ne peut plus etre envoye au nom d'un autre medecin.
FixEquite annuelle : les corrections manuelles de gardes sont maintenant prises en compte dans le calcul d'equite.
FixSuppression medecin : verification des verrous admin avant suppression pour eviter les donnees orphelines.
FixRegeneration : timeout de 2 minutes sur l'appel au moteur — plus de barre de progression bloquee.
FixFormulaire feedback : l'ecran de confirmation ne s'affiche plus si la sauvegarde en base a echoue.
AméliorationPreferences email : le toggle 'Consultations par email' est desormais marque comme 'a venir' (in-app uniquement pour l'instant).
AméliorationDesiderata : message explicite quand tous les jours de semaine sont bloques par la disponibilite.
AméliorationExport CSV : echappement correct des champs contenant virgules ou guillemets.
v5.0.020/03/2026
MoteurPoids configurables : les curseurs de poids dans Parametres > Contraintes controlent maintenant reellement le moteur de planification. Chaque contrainte souple (26 au total) lit son poids depuis la configuration au lieu d'utiliser des valeurs fixes.
FixCorrection des poids dans le fichier de reference : S8 (preference de jour de garde) aligne sur le vrai bonus, S13 (desiderata souples) decompose en 3 sous-poids (prefer_not, consultation, demande de garde), S24 (recuperation post-garde) complete avec le poids jour unique.
v4.9.019/03/2026
NouveauDiagnostic intelligent : quand le moteur ne trouve pas de solution, un diagnostic detaille explique pourquoi (blocages de garde, sous-effectif) et identifie les jours problematiques.
NouveauRecherche de solutions : le moteur peut tester des modifications de desiderata pour proposer des alternatives classees par impact sur l'equilibre global du planning.
AméliorationDialog d'echec simplifie avec lien direct vers le diagnostic sur la page planning.
v4.8.119/03/2026
AméliorationRecapitulatif par medecin : retrait de la colonne Recup dont le calcul etait imprecis. Le tableau se concentre sur les donnees fiables (gardes, postes, jours libres, activites).
AméliorationVerification des regles : retrait de la section 'Charge de travail' (budget P) dont le calcul simplifie etait trompeur. Sera remplace par un vrai suivi du temps de travail.
v4.8.019/03/2026
MoteurFix S13 : le desideratum 'Consultation' ne penalise plus la garde du soir. Un medecin qui souhaite consulter en journee reste disponible pour la garde. Pour refuser poste ET garde, utiliser 'Plutot pas dispo'.
NouveauDesiderata : nouveau statut 'Activite externe' (IME, cours a la fac, vacations…). Compte comme temps de travail hospitalier. L'algorithme evite d'affecter un poste ou une garde mais peut le faire en cas de necessite.
NouveauDesiderata : panneau de description contextuel. En cliquant sur un statut, un panneau detaille apparait sous la toolbar avec l'impact sur les postes et la garde en langage clair.
AméliorationDesiderata : toolbar reorganisee en 2 groupes — Absences (5 statuts) puis Preferences (5 statuts + gomme). Plus facile a scanner.
AméliorationDesiderata : descriptions enrichies pour chaque statut. Chaque bouton indique explicitement son effet sur les postes de jour et la garde du soir (ex: 'Pas de poste . Garde possible').
NouveauDesiderata : bouton d'aide '?' avec recapitulatif de tous les statuts, impact poste/garde, et quand les utiliser.
FixDesiderata : boutons 'Transmettre' et 'Enregistrer le brouillon' ne debordent plus sur mobile. Les boutons passent en pleine largeur sur petit ecran.
v4.7.118/03/2026
NouveauDesiderata : acces en lecture seule aux desiderata des mois valides. Double CTA 'Voir le planning' + 'Mes desiderata' sur l'overview.
v4.7.018/03/2026
NouveauDesiderata : alerte douce a la soumission si un medecin de garde bloque plus de 50% des week-ends du mois (hors conges et arrets). Dialog de confirmation non bloquant.
NouveauDesiderata : badge temps reel 'WE : X/Y dispo' sous le calendrier en mode edition. Passe en orange avec icone d'alerte si trop de week-ends bloques.
NouveauDesiderata : sidebar admin enrichie — indicateur de disponibilite week-end par medecin de garde avec code couleur (vert/orange/rouge).
v4.6.017/03/2026
NouveauPlanning : nouveaux types d'activite Ado et Diabete. Les medecins peuvent se positionner en service adolescent ou HDJ diabete, en plus de Consultation, Off et Bureau.
AméliorationPlanning : les boutons de positionnement sont reorganises en 2 groupes — cliniques (Consult, Ado, Diab.) puis administratifs (Off, Bureau).
AméliorationPlanning : la colonne Consult. du recapitulatif devient Activites avec un total et un tooltip detaillant la repartition par type.
AméliorationDashboard : le service du jour inclut desormais les medecins positionnes en Ado et Diabete.
v4.5.117/03/2026
FixPlanning : confirmation avant de quitter le mode edition si des modifications n'ont pas ete sauvegardees. Evite de perdre son travail par un clic accidentel.
v4.5.017/03/2026
NouveauDesiderata : nouveaux types Conges et Arret maladie. Permet de distinguer les absences planifiees (CP, CT, RT) des arrets de travail, en preparation du futur suivi budget jours.
AméliorationDesiderata : palette couleurs revue — 9 statuts avec couleurs toutes distinctes. Consultation passe en bleu ciel (sky) pour se differencier clairement de l'absence (rouge).
FixDesiderata : dark mode entierement corrige. Tous les statuts, la toolbar, la legende et les cellules s'affichent correctement en mode nuit.
AméliorationDesiderata : cellules compactes sur desktop (hauteur fixe 56px au lieu de carres geants). Mobile inchange.
AméliorationDesiderata : week-ends visuellement distincts (headers Sam/Dim en couleur accent, contour subtil sur les cellules WE).
NouveauDesiderata : jours feries affiches avec un indicateur visuel (point rouge) et le nom du ferie en tooltip. Vacances scolaires Zone A egalement visibles.
AméliorationDesiderata : peinture verticale activee sur desktop (drag multi-directionnel). Sur mobile, le comportement horizontal-only est conserve pour eviter les conflits avec le scroll.
NouveauDesiderata : Shift+clic pour peindre une plage de jours. Cliquez un jour, puis Shift+clic un autre pour remplir tous les jours entre les deux.
MoteurConges et arrets maladie traites comme indisponibilites dures par le solver (meme comportement que 'Indisponible').
v4.4.017/03/2026
MoteurH18 : pas de garde la veille d'une formation. Le solver interdit automatiquement de placer un medecin de garde s'il a une formation le lendemain.
MoteurH18 cross-mois : si un medecin a une formation le 1er du mois suivant, le solver bloque aussi la garde le dernier jour du mois courant.
AméliorationL'editeur de planning signale en temps reel les conflits garde/formation (jour meme et veille).
FixLes jours de formation ne sont plus comptes comme jours libres dans l'audit et le budget consultations.
v4.3.317/03/2026
AméliorationDesiderata : UX admin clarifiee — CTA differenciee par etat (brouillon/transmis), badge 'Transmis' au lieu de 'Valide', date de soumission visible, banniere mode admin.
AméliorationPlanning : retrait d'une consultation validee necessite une confirmation et notifie le medecin (in-app + email digest).
FixDesiderata : le switch mode (?switch=1) est maintenant reserve aux admins.
v4.3.217/03/2026
FixLes boutons d'action (Enregistrer, Annuler) ne sont plus masques par la barre de navigation mobile. Corrige aussi le bouton 'remonter en haut' des reglages.
v4.3.116/03/2026
NouveauLe service du jour affiche les medecins en consultation et bureau (matin/apres-midi) en plus des postes obligatoires.
NouveauCompte admin developpeur (CT) : connexion propre avec impersonation, invisible pour les medecins et les autres admins.
v4.3.015/03/2026
NouveauPages legales publiques : mentions legales, CGV, CGU, politique de confidentialite et DPA accessibles depuis le footer.
v4.2.115/03/2026
AméliorationConfirmations de desactivation et suppression de medecin via modale au lieu d'une boite de dialogue navigateur.
FixLes erreurs inattendues sont maintenant enregistrees dans la console pour faciliter le diagnostic.
FixLe formulaire feedback n'affiche plus 'mars 2026' en dur mais le mois courant.
MoteurLes jours feries sont maintenant calcules dynamiquement (Paques, Ascension, Pentecote) au lieu d'etre codes en dur pour 2026.
MoteurVersions des dependances solver epinglees pour eviter les mises a jour inattendues.
MoteurCorrection d'une mutation potentielle des donnees d'entree dans le chargement des profils medecins.
AméliorationL'email 'planning valide' invite maintenant les medecins a se positionner sur leurs jours libres (consultation, bureau, off).
NouveauNotification in-app quand vos consultations sont validees ou refusees par l'admin. Les notifications sont agregees (pas de spam si plusieurs validations d'affilee).
NouveauL'admin peut relancer par email les medecins qui n'ont pas encore rempli leurs desiderata (bouton dans l'espace admin desiderata).
NouveauNotification in-app quand les desiderata sont geles par l'admin.
NouveauPage 'Mes notifications' : chaque medecin peut gerer ses preferences de notification, modifier son email, et desactiver les alertes non essentielles (accessible depuis la cloche).
NouveauEmail de bienvenue automatique : quand un admin cree un nouveau medecin, un email avec le lien de premiere connexion est envoye automatiquement.
v4.2.015/03/2026
NouveauEspace admin integre au dashboard : vue de pilotage avec alertes planning, suivi desiderata et demandes de consultation, directement sur la page d'accueil.
NouveauBandeau admin sur la page planning : conflits detectes en temps reel (medecin assigne mais absent, postes vides), avec possibilite de masquer les alertes volontaires.
NouveauPanneau admin sur la page desiderata : suivi collecte par mois avec progression visuelle (chips medecins) et actions rapides (lancer la collecte).
AméliorationLes 3 espaces admin (dashboard, planning, desiderata) sont repliables via un chevron pour ne pas encombrer la vue.
AméliorationDates lisibles dans les alertes planning (ex: 'vendredi 20 mars' au lieu de 'jour 20').
FixCorrection du scroll automatique vers le bas sur le dashboard (la page restait en haut sur le hero).
FixSecurite : les alertes masquees ne sont accessibles qu'aux administrateurs (politique RLS corrigee).
v4.1.014/03/2026
NouveauL'app peut maintenant etre installee comme une vraie application sur Android (menu Chrome > Installer DeGarde). L'icone s'affiche correctement sur tous les appareils.
NouveauPage hors ligne : si vous ouvrez l'app sans connexion, vous voyez un message clair au lieu d'une page d'erreur du navigateur.
AméliorationSupport iOS ameliore : l'app s'ouvre en mode plein ecran (sans barre URL Safari) quand ajoutee a l'ecran d'accueil.
NouveauBandeau d'installation in-app : un bouton 'Installer' apparait en haut de la page pour ajouter DeGarde a l'ecran d'accueil. Sur iOS, des instructions adaptees sont affichees.
FixIcone de l'app corrigee sur Android 13+ (Pixel 10 Pro, etc.) : ajout d'icones maskable dediees avec fond plein.
v4.0.113/03/2026
AméliorationSecurite renforcee : toutes les API verifient maintenant la session Supabase Auth au lieu de se fier a un header modifiable. Plus aucun acces sans connexion valide.
AméliorationProtection anti-brute-force : 5 tentatives de connexion maximum par quart d'heure.
AméliorationLe lien de premiere connexion ne fonctionne qu'une seule fois. Apres le choix du PIN, il faut passer par un administrateur pour reinitialiser.
AméliorationRenforcement des droits d'acces en base de donnees (RLS) : les tokens et les mappings d'authentification ne sont plus lisibles par les utilisateurs.
FixLes tokens dans les liens email sont maintenant correctement encodes (caracteres speciaux).
v4.0.013/03/2026
NouveauConnexion par code PIN : chaque medecin choisit un code a 4 chiffres (comme une carte bancaire). Plus besoin de retrouver un lien a chaque fois — selectionnez votre nom et entrez votre PIN.
NouveauPremiere connexion simplifiee : cliquez sur le lien personnel recu par email ou message, choisissez votre PIN, et c'est fait. La session reste active 30 jours.
NouveauBouton Se deconnecter dans le menu profil (en haut a droite).
AméliorationSuppression du code d'acces etablissement (748291). Il n'etait plus utile depuis les liens personnels.
AméliorationSecurite renforcee : sessions gerees par Supabase Auth (JWT + refresh tokens) au lieu d'un simple cookie.
v3.5.013/03/2026
FixDashboard : les consultations et activites validees (bureau, off) s'affichent desormais dans la vue semaine, la vue mois et le hero briefing. Avant ce fix, ces jours apparaissaient comme 'Libre' au lieu de 'Consultation' ou 'Bureau'.
v3.4.012/03/2026
NouveauDashboard Round 4 : vue semaine cross-mois (affiche les 7 jours meme quand la semaine chevauche deux mois), navigation mois dans la carte calendrier, prochaine garde dans le hero briefing.
NouveauRaccourcis rapides dans le hero : Mon planning, Planning service, Desiderata.
FixFix bug critique prevDay cross-mois : le repos de garde etait mal detecte le 1er du mois (arithmetique jour-du-mois remplacee par lookup date string).
FixFix bug timezone UTC : toISOString().slice(0,10) remplace par toLocalDateStr() sur le dashboard et la page planning (decalage de date en UTC+1/+2).
FixFix hydratation SSR sur la page planning (ActivityPopover span/button mismatch).
AméliorationVue mois : couleurs et labels alignes avec la vue semaine (dark gradient pour gardes, noms complets des postes).
AméliorationExtraction de helpers partages (daysUntil, prevDateStr) dans utils.ts, suppression du prop isAdmin inutilise.
v3.3.012/03/2026
NouveauNavigation mois redessinee : fenetre glissante de 5 mois (3 en mobile), fleches pour decaler la fenetre, dots colores selon le statut du mois, spinner de chargement sur la pill cliquee.
FixCorrection des cles React dupliquees dans la grille planning : les jours contextuels (mois adjacents) sauvegardes par erreur dans planning_edits sont desormais filtres au chargement.
FixCorrection des erreurs d'hydratation SSR/client sur le bandeau audit trail et le selecteur de scenarios.
v3.2.111/03/2026
FixSecurite notifications : sanitisation du parametre doctor_id contre l'injection PostgREST, validation des liens internes (pas de navigation hors app).
FixRLS active sur les 3 tables notifications (in_app_notifications, notification_reads, notification_dismissals).
FixCompteur non-lus : ne decremente plus pour des notifications deja lues. Sentinel read_at corrige (ISO timestamp au lieu de string 'read').
AméliorationDual-write email/in-app : les erreurs d'insertion in-app sont desormais loguees (console.warn) au lieu d'etre avalees silencieusement.
v3.2.011/03/2026
NouveauRefonte du dashboard medecin 'Mon Planning' : nouveau hero briefing avec statut du jour, emoji contextuelle, et apercu de demain.
NouveauEquipe du jour : voir d'un coup d'oeil qui fait quoi dans le service aujourd'hui (postes + garde du soir).
NouveauZone 'A faire' : CTA contextuelles (desiderata a remplir, notifications non lues, consultations en attente) ou 'Tout est a jour'.
AméliorationStrip semaine enrichi : affiche le nom du poste (URG, MAT, HOS) au lieu de 'Poste', jours passes attenues, aujourd'hui mis en avant.
AméliorationCalendrier mois + stats fusionnes en une seule carte compacte avec prochaine garde integree.
AméliorationSuppression des 3 boutons CTA redondants remplaces par des actions contextuelles plus pertinentes.
v3.1.011/03/2026
NouveauCentre de notifications in-app : icone cloche dans le header avec badge compteur non-lus. Dropdown style GitHub/Notion avec regroupement par date (Aujourd'hui / Cette semaine / Plus ancien).
NouveauNotifications automatiques : chaque email envoye (collecte ouverte, planning valide, desiderata recus) cree aussi une notification in-app persistante.
NouveauAnnonces produit (admin) : formulaire en bas du dropdown pour envoyer une annonce a tous les medecins (titre + message + lien optionnel).
AméliorationMarquer comme lu : clic sur une notification navigue vers la page concernee et la marque comme lue. Bouton 'Tout lire' pour marquer toutes les notifications.
AméliorationMobile : la cloche est visible a cote du badge identite. Le dropdown s'adapte en quasi-pleine largeur.
v3.0.111/03/2026
AméliorationCartes medecins compactes : 2 lignes max, toute la carte est cliquable, 3 colonnes sur grands ecrans.
FixLa sidebar suit maintenant le scroll et surligne la bonne section en temps reel.
AméliorationLe toggle Mode expert est repositionne dans un en-tete de zone 'Ajustement des contraintes', clairement separe des presets.
AméliorationSuppression de la distinction Bonus (jauge verte) : toutes les contraintes utilisent la meme jauge d'importance, plus simple a comprendre.
v3.0.011/03/2026
NouveauRefonte complete de la page Administration. Nouvelle navigation par sections (sidebar desktop, pills mobile) au lieu des onglets.
NouveauReglages rapides : 3 profils pre-configures (Equilibre, Continuite, Confort) pour configurer le moteur en un clic.
NouveauJauges d'importance : les poids numeriques sont remplaces par 5 niveaux clairs (Optionnel → Quasi-obligatoire). Les poids fins restent accessibles via un toggle.
NouveauDetection de conflits : le systeme signale automatiquement les configurations problematiques (sous-effectif, preferences orphelines, objectifs contradictoires).
AméliorationDescriptions en langage clair : chaque regle du moteur est expliquee en termes concrets ("Le moteur espace les gardes d'au moins 5-7 jours").
AméliorationProfils medecins en grille : vue d'ensemble compacte avec role, gardes/mois et jours en un coup d'oeil. Modification dans un panneau lateral.
AméliorationJours autorises : le selecteur de jours utilise maintenant un interrupteur explicite (On/Off) avec les jours bloques barres en rouge.
AméliorationRegles inviolables organisees en 3 niveaux : fondations (verrouillees), protections (desactivables avec avertissement), pilotees par profil.
AméliorationMobile : panneau medecin plein ecran, zones tactiles 44px minimum sur boutons et selecteurs de jours.
v2.3.011/03/2026
FixSecurite : cookie d'identite desormais httpOnly + secure (non accessible par JavaScript). L'identite est transmise du serveur au client via un contexte React.
FixSecurite : tokens d'acces renforces (128 bits au lieu de 32 bits).
FixMemory leak : nettoyage du timer de progression lors de la navigation pendant une regeneration.
AméliorationSolver API : validation Pydantic des parametres (month, time_limit, alternatives) avec bornes strictes.
AméliorationSolver API : les erreurs sont desormais loguees cote serveur (traceback complet).
v2.2.110/03/2026
FixSecurite : politiques RLS corrigees sur la table doctors (lecture publique, ecriture admin uniquement via service role).
FixToken creation : erreur silencieuse corrigee. Si la generation du token echoue a la creation d'un medecin, un message explicite est affiche.
FixProfils medecins : la priorite 'regular' est desormais fusionnee avec 'primary' (identiques cote moteur).
FixCouleurs medecins : les couleurs dynamiques (stockees en base) sont maintenant appliquees partout dans le planning et les badges.
FixRoute solver : guard ajoute si aucun medecin actif n'est trouve (erreur explicite au lieu d'un crash).
FixSauvegarde profils medecins : les modifications dans Settings sont maintenant persistees via l'API (corrige un echec silencieux lie aux politiques RLS).
v2.2.010/03/2026
NouveauWizard creation medecin : formulaire en 3 etapes (Identite, Disponibilites, Role) avec stepper visuel et navigation avant/arriere. Tous les reglages sont accessibles des la creation.
AméliorationReglages avances depliables a chaque etape du wizard : postes autorises, gardes preferees, espacement, jour off conditionnel, notifications. Visibles sans etre imposes.
AméliorationRecapitulatif visuel avant creation : badge couleur, initiales, quotite et cible gardes affiches a l'etape finale.
v2.1.009/03/2026
NouveauAjout de medecin : le responsable peut creer un nouveau medecin depuis les Settings. Formulaire avec initiales, nom, quotite, priorite, gardes et couleur. Un lien d'acces est genere automatiquement.
AméliorationSource de verite unique : les profils medecins sont stockes dans une table dediee en base. Plus de fichier JSON statique ni de systeme de delta.
AméliorationCouleurs dynamiques : palette de 20 couleurs pastels distinctes, auto-attribuee a la creation. Les couleurs sont stockees en base par medecin.
AméliorationListe admins centralisee : une seule source de verite pour les droits administrateur (supprime la duplication dans 4 fichiers).
v2.0.109/03/2026
NouveauAlertes contraintes visibles : les cellules du planning qui violent une contrainte dure (repos de garde, absence, etc.) sont signalees par un indicateur rouge. Un toast d'alerte apparait lors de l'assignation.
AméliorationToasts repositionnes en haut de l'ecran pour ne plus etre caches par la barre d'edition.
AméliorationToasts plus lisibles : fonds opaques avec contraste ameliore.
v2.0.006/03/2026
NouveauGel des desiderata : le responsable du planning peut geler la collecte d'un mois. Les medecins ne peuvent plus modifier leurs desiderata une fois la collecte gelee. Reouverture possible a tout moment.
NouveauLien public planning : lien partageable en lecture seule pour les secretaires du service. Accessible sans compte, affiche la grille du mois avec consultations validees, navigation entre mois, et bouton imprimer.
NouveauMode sombre : suit automatiquement la preference systeme (mode nuit du telephone/ordinateur). Toggle manuel dans le header. Confort pour les gardes de nuit.
AméliorationReorganisation des actions planning : onglets de vue a gauche, actions admin a droite. Menu ⋯ regroupe impression, export CSV, partage et calendrier. Sur mobile, les actions admin passent dans le menu ⋯.
AméliorationImpression planning : selecteur de colonnes a imprimer, recapitulatif masque, seules les consultations validees sont imprimees.
AméliorationExport CSV : colonnes Consultations Matin et Consultations Apres-midi avec uniquement les consultations validees.
v1.7.605/03/2026
NouveauExport calendrier (iCal) : bouton dans la vue médecin pour copier un lien d'abonnement. Collez-le dans Google Calendar ou Apple Calendar pour voir votre planning automatiquement mis à jour.
v1.7.505/03/2026
NouveauNouveau désidérata « Consultation souhaitée » : signalez les jours où vous souhaitez être libre pour consulter. Le solver en tient compte (préférence souple).
v1.7.405/03/2026
FixDésidérata « Dispo journée seule » (pas de garde ce soir-là) : les entrées n'étaient pas sauvegardées en base (contrainte SQL manquante). Corrigé.
AméliorationGestion d'erreurs sur la sauvegarde des désidérata : un toast d'erreur s'affiche si la persistance échoue, au lieu d'un échec silencieux.
v1.7.304/03/2026
FixAlternatives planning : les médecins en consultation sont maintenant correctement exclus des remplaçants dans le popover de cellule.
AméliorationProtection double-clic sur tous les boutons d'action activités (consultation, off, bureau, valider, refuser, retirer).
AméliorationRefactoring code : extraction des sous-composants activités dans un fichier dédié (day-row-activities.tsx).
v1.7.204/03/2026
AméliorationColonne Consult splitée en deux colonnes Matin et Après-midi : lecture immédiate de qui consulte quand, sans labels am/pm.
NouveauPopover admin scopé par période : chaque colonne (Matin/Après-midi) a son propre popover avec médecins non positionnés et section 'Me positionner'.
NouveauCommentaire de refus : au clic sur ✕, un champ texte optionnel permet d'indiquer la raison du refus avant confirmation.
AméliorationAbsences groupées : off/bureau AM+PM même type → affichage pleine journée sans suffixe. Demi-journées avec suffixes français (mat. / a-m.).
FixAdmin peut maintenant se positionner en consultation depuis le popover (section 'Me positionner' visible quand libre).
AméliorationSuppression de tous les labels am/pm dans la grille, les popovers et la vue médecin.
v1.7.104/03/2026
NouveauDemi-journées AM/PM : les médecins peuvent maintenant se positionner séparément le matin et l'après-midi (ex: consultation le matin, bureau l'après-midi).
AméliorationVue médecin : deux colonnes Matin/Après-midi remplacent la colonne unique Activité.
AméliorationColonne Consult : seules les consultations apparaissent (off/bureau restent dans Absences uniquement).
FixCorrection d'un décalage d'affichage (hydration mismatch) sur l'en-tête Consult.
v1.7.004/03/2026
NouveauGestion des consultations post-planning : après validation du planning, les médecins peuvent se positionner sur leurs jours libres (consultation, off, bureau).
NouveauColonne 'Consult' dans la grille service : affiche les médecins en consultation avec badge vert (validée) ou orange (en attente).
NouveauValidation admin des consultations : popover dans la colonne Consult pour valider/refuser les demandes et assigner directement les médecins non positionnés.
NouveauVue médecin enrichie : boutons Consult/Off/Bureau sur chaque jour libre quand le planning est validé. Statut visible en temps réel.
AméliorationAlternatives planning : les médecins en consultation sont exclus des remplaçants proposés (raison 'En consultation').
AméliorationRécapitulatif enrichi : colonne Consult. affiche le ratio consultations/jours libres avec indicateur d'attente.
AméliorationOff et bureau apparaissent dans la colonne Absences avec un label distinctif.
v1.6.203/03/2026
FixCorrection prénom Margaux Populaire (MP) dans toutes les sources de données et l'interface.
FixNotifications email : ajout d'un délai entre les envois pour respecter la limite Resend (2 req/s). Plus de mails perdus en campagne.
FixAjout du token d'accès pour Emilie Stempf (ES) — elle peut maintenant recevoir les notifications et accéder à ses désidérata.
v1.6.103/03/2026
FixÉditeur planning : le grid ne saute plus au premier clic en mode édition. L'éditeur s'initialise maintenant depuis le brouillon sauvegardé (et non la sortie solver brute).
v1.6.003/03/2026
NouveauWidget micro-feedback : bouton discret 'Votre avis ?' dans le footer, accessible à tous les médecins identifiés. Note 1-5 en un clic + commentaire optionnel, envoi en < 15 secondes.
NouveauCooldown intelligent : le widget se masque 14 jours après soumission, 7 jours après 3 fermetures sans répondre. Pas de harcèlement.
NouveauEmail notification : chaque feedback envoyé génère un email brandé à l'admin avec note, commentaire et page concernée.
NouveauVue admin /admin/micro-feedback : distribution des notes (bar chart) + liste chronologique avec badge coloré par note.
v1.5.103/03/2026
NouveauBrouillon désidérata : bouton 'Sauvegarder' (outline) confirme que les marquages sont enregistrés sans transmettre. 'Valider' renommé en 'Transmettre mes désidérata' pour distinguer brouillon et transmission. Après transmission : seul 'Mettre à jour' reste visible.
AméliorationLifecycle auto-advance : si tous les médecins ont transmis leurs désidérata sans campagne officielle, le mois passe automatiquement en statut 'Collecte'. La carte 'Lancer la collecte' disparaît et 'Générer le planning' devient visible.
AméliorationPerformance : chargement des pages ~3x plus rapide. Les requêtes Supabase par mois (12-15 requêtes individuelles) sont remplacées par une seule requête batch. Le chargement de la liste des médecins est parallélisé et mutualisé.
v1.5.003/03/2026
Nouveau3 nouvelles notifications email : désidérata reçu (admin informé par médecin), tous désidérata complets (admin peut générer), accusé de lecture planning (tracking via email + visite in-app).
NouveauAccusé de lecture planning : lien email passe par /api/notify/ack (tracking 1er clic), visite in-app met à jour read_at. Admin voit 'Vu par X/Y' sous 'Généré par'.
AméliorationTemplate email extrait dans email-template.ts (route.ts allégée de 290 à 190 lignes). 4 variantes de contenu (campagne, planning validé, désidérata reçu, tous reçus).
AméliorationMigration 010 : nouveaux types notification_log (desiderata_submitted, all_desiderata_received) + colonne read_at pour les accusés de lecture.
v1.4.002/03/2026
NouveauNotifications email : les médecins reçoivent un email quand la collecte de désidérata est lancée ou quand le planning est validé. Envoi via Resend, templates brandés (teal + Bois de Rose), liens personnalisés avec token d'authentification.
NouveauChamp email par médecin dans les Settings, avec préférences de notification séparées (collecte désidérata / planning validé). Badges 'À venir' retirés.
NouveauTable notification_log dans Supabase : idempotence native (pas de doublon par type + mois + médecin), log des envois et erreurs.
AméliorationTemplate email contact (/api/contact) aligné sur le brand kit : header teal bicolore DeGarde, bande accent Bois de Rose, espacement Gmail corrigé.
v1.3.102/03/2026
AméliorationRoute /planning dédiée : le planning a sa propre URL au lieu de /dashboard?month=. L'onglet 'Planning' dans la navigation est maintenant correctement actif. Ancien lien /dashboard?month= redirige automatiquement.
AméliorationTouch targets mobile : hamburger et flèches semaine agrandis (min 44px), toast centré en bas, backdrop sombre sur le menu mobile.
AméliorationNavigation : Feedback retiré du header (déplacé en footer admin), active state sur les liens, Changelog visible par tous les utilisateurs identifiés.
AméliorationDialogues de confirmation natifs (window.confirm) remplacés par des ConfirmDialog stylisés : validation, annulation, régénération, enregistrement, collecte, génération.
AméliorationDésidérata mobile : grille outils 4 colonnes avec labels courts, suppression en lot optimisée (1 requête au lieu de N).
AméliorationTap sans outil sélectionné : toast d'avertissement 'Choisissez un statut'.
AméliorationPlanning grid : légende couleurs médecins sous la grille, gradient de fade pour le scroll horizontal mobile, bouton Imprimer masqué sur mobile.
AméliorationTooltip avec le nom complet du médecin sur chaque onglet de la vue planning.
AméliorationDashboard médecin : empty state explicatif quand le planning n'est pas encore disponible, mois affiché à côté de 'Cette semaine'.
AméliorationAccessibilité : role='button' + tabIndex + onKeyDown sur les cartes mois du dashboard admin.
AméliorationPremier contact : texte d'accueil amélioré sur l'écran code d'accès + lien personnel, mention 'le responsable du planning' au lieu d'un nom.
v1.2.102/03/2026
FixCorrection imports inutilisés (PenLine, Cpu, isKnown) qui bloquaient le lint CI.
FixescapeHtml : ajout du remplacement des apostrophes (') dans le formulaire de contact.
MoteurNouveau type désidérata no_oncall : interdit la garde un jour donné (les postes restent autorisés). Traité dans H11.
FixBiais annuel cohérent API/CLI : la route /api/solve ne mélange plus les données de l'année précédente dans les stats annuelles.
AméliorationEmail contact configurable via variable d'environnement CONTACT_EMAIL.
AméliorationRate limiting sur /api/contact : 1 requête par minute par IP pour protéger le quota Resend.
v1.2.002/03/2026
NouveauFormulaire de contact sur la landing page : nom, email, établissement, message. Envoi par email via Resend. Section intégrée entre 'Pourquoi DeGarde' et le CTA final.
v1.1.001/03/2026
NouveauCode d'accès établissement : premier écran de connexion avec code à 6 chiffres. Cookie 30 jours. Les liens personnels (?token=xxx) passent directement.
NouveauPages d'erreur en français : error boundary (500), page introuvable (404), spinner de chargement.
NouveauLiens personnels dans Settings : onglet 'Liens' avec copie individuelle ou groupée des URLs par médecin.
AméliorationSélecteur d'identité masqué pour les non-admins : les médecins arrivent via leur lien personnel. Admins gardent 'Changer de profil'.
AméliorationOnboarding réécrit pour les médecins : 3 étapes (Bienvenue, Comment ça marche, C'est parti) au lieu du texte 'prototype'.
AméliorationGuard API /api/solve : seuls les admins (CA/MS/LB) peuvent lancer une génération. Timeout 60s sur l'appel solver.
AméliorationGuard API /api/desiderata : les non-admins ne voient que leurs propres désidérata.
AméliorationCompteur X/10 médecins visibles par tous dans la vue désidérata.
AméliorationRésilience dashboard : Promise.allSettled pour les queries non-critiques. Si Supabase est indisponible, le dashboard s'affiche quand même.
NouveauLanding page marketing : page d'accueil DeGarde avec sections Hero, Problème, Comment ça marche, Fonctionnalités, CTA. Esthétique professionnelle healthcare.
NouveauDashboard désidérata : vue d'ensemble des mois avec statut de soumission (envoyé, à remplir, à venir). Visible quand on clique sur Désidérata sans mois sélectionné.
NouveauRoute /planning dans la navbar : accès direct au planning du mois en cours.
AméliorationRestructuration routes : app déplacée de / vers /dashboard. Page d'accueil marketing indépendante.
v1.0.427/02/2026
AméliorationRefonte UX panneau Médecins (Settings) : ancien monobloc 710 lignes → 12 fichiers par catégorie. 7 groupes logiques (Disponibilités, Gardes, Postes, Règles, Transitions, Notifications, Note). Chaque champ a une description en ligne et un badge de sévérité (règle stricte / préférence). Pilier et Régulier fusionnés en « Standard » (identiques côté moteur). Note de disponibilité et raison du jour off conditionnels sont maintenant éditables.
v1.0.327/02/2026
MoteurS24 récup fériés : garde un jour férié en semaine → 1j récup (comme dimanche). Garde dimanche veille de férié → 2j récup (le repos H3 tombe sur férié, ne compte pas). Récapitulatif front mis à jour.
MoteurChangement de profil avec date d'effet : profile_changes remplace le champ transition hardcodé. Permet plusieurs transitions datées (quotité, priorité, volume gardes). UI Settings : ajout/suppression de transitions par médecin.
v1.0.226/02/2026
MoteurS24 — Récup post-garde WE : le moteur favorise des jours libres après les gardes weekend. Ven garde → 1j récup (lundi), Sam → 2j (lundi + mardi), Dim → 1j (mardi, lundi = repos). Cross-mois via contexte M-1.
NouveauColonne Récup dans le récapitulatif par médecin : affiche le ratio jours de récup pris/dus avec code couleur (vert si OK, orange si partiel, rouge si déficit).
v1.0.126/02/2026
NouveauRégénération partielle : quand on régénère un mois en cours, les jours passés (≤ aujourd'hui) sont automatiquement figés. Le moteur ne recalcule que les jours restants. Utile pour les changements de dernière minute (arrêt maladie, remplacements).
AméliorationConfirmation adaptée : le dialogue de régénération indique combien de jours seront conservés quand le mois est en cours.
AméliorationToast informatif après régénération : affiche le nombre de jours conservés (ex: '26 jours conservés').
v1.0.026/02/2026
MoteurUnified Weekly Availability : suppression complète du modèle fixed_unavailabilities (H4 + S9). Les disponibilités hebdomadaires sont désormais gérées exclusivement par les whitelists available_post_weekdays et available_oncall_weekdays (H16).
MoteurHéritage oncall : si available_oncall_weekdays est vide et available_post_weekdays est renseigné, la garde hérite les restrictions postes en semaine. Le WE reste toujours ouvert.
Améliorationdoctors.json migré : CA, LB, SB, AT, ES convertis de fixed_unavailabilities vers les whitelists + availability_note descriptif. SB mardi IME devient un désidérata prefer_not.
AméliorationTypeScript full-stack nettoyé : interface Unavailability supprimée, constraint-validator et doctor-constraints-check réécrits pour les whitelists, month-calendar simplifié (offWeekdays booléen), doctor-section affiche availability_note.
v0.9.926/02/2026
MoteurH16 réécriture : modèle blacklist (oncall_forbidden_weekdays) remplacé par deux whitelists optionnelles — available_post_weekdays et available_oncall_weekdays. Si vide = aucune restriction. Si renseigné = seuls ces jours sont autorisés pour postes ou garde.
MoteurH16 : bypass désidérata identique à H4 — AVAILABLE lève toutes les restrictions du jour, REQUEST_ONCALL lève uniquement la restriction garde. LB passe de 'pas de garde mardi' à 'garde uniquement lundi'.
AméliorationSettings UI : section 'Jours sans garde' remplacée par deux whitelists (jours poste autorisés + jours garde autorisés). UX : vide = tous les jours autorisés, clic = toggle inclusion/exclusion.
AméliorationVue planning responsive : toolbar en colonne sur mobile, onglets médecins scrollables horizontalement, boutons action avec retour à la ligne, grille table scrollable horizontalement.
MoteurFix biais annuel : compute_annual_guard_stats ne compte plus que les mois de l'année civile cible (jan→mois précédent). Sept-déc 2025 n'influencent plus le planning 2026.
v0.9.726/02/2026
MoteurH4 + désidérata : AVAILABLE sur un jour hard-off lève la contrainte pour tous les rôles ce jour-là. REQUEST_ONCALL lève H4 pour la garde uniquement. Le solver peut enfin respecter 'je suis dispo mercredi exceptionnellement'.
MoteurS10 adapté : la pénalité 'garde avant jour off' est désactivée quand le médecin a posé AVAILABLE ou REQUEST_ONCALL sur le lendemain — cohérence avec la levée de H4.
FixIcône 🔒 verrou admin masquée pour les médecins — visible uniquement par les admins dans la grille de planning
FixAudit 'Vérification des règles' : comptage des gardes recalculé depuis le planning affiché (activeDays) au lieu du snapshot solver — plus de désynchronisation après edits sauvegardés
FixPopover d'affectation : les jours de contexte (mois précédent) exclus du comptage de gardes — plus de faux 'N gardes ce mois (cible M)'
v0.9.525/02/2026
NouveauVerrous admin : Cécile peut verrouiller un médecin sur un poste précis avant de lancer le solver (ex: 'HM de garde le 16/04'). Priorité absolue sur toutes les règles.
MoteurContrainte H15 : admin_locked_assignments — force x[day][doc][role]==1. Override H4 (indisponibilités fixes) et H13 (allowed_posts). 4 tests PASS.
NouveauVue désidérata : section 'Verrous admin' par médecin — liste des locks actifs + formulaire date/poste + indicateur 🔒 dans le calendrier
AméliorationPlanning view : cellules verrouillées surlignées amber avec 🔒 — visibilité de ce qui est figé
NouveauTable Supabase admin_locks (migration 008) : persistance par mois/date/poste avec audit trail
v0.9.425/02/2026
MoteurContrainte H14 : shift_24h_only — certains médecins (HM) ne viennent qu'en 24h. Si affectés à un poste, ils doivent aussi être de garde ce jour-là.
NouveauSettings Config : toggle 'Garde seule (24h)' par médecin dans la section Profil
AméliorationValidator front : H14 détecte les violations (poste sans garde pour shift_24h_only) dans l'éditeur et la vue complète
v0.9.325/02/2026
AméliorationConcurrence Régénérer : lock optimiste (10 min TTL) — 2 admins ne peuvent plus lancer deux générations simultanées. Le 2e voit le bouton disabled avec tooltip 'En cours par X'.
AméliorationUX attente Régénérer : modal 5 étapes avec barre de progression estimée + purge du wording technique 'solver'
FixAudit trail : 'generated_by' n'était jamais renseigné (toujours 'unknown'). Corrigé : doctorId passé dans le body du fetch.
NouveauToolbar planning : affiche 'Généré par X · date' — traçabilité de qui a lancé la dernière génération
v0.9.225/02/2026
FixBug lifecycle brouillon : router.refresh() ajouté après dé-validation — dashboard affiche maintenant le bon mois
FixNextActionCard : statut 'brouillon' (draft) inclus dans la priorité 1 (à valider)
AméliorationAdmin override : les médecins en violation dure sont maintenant cliquables (⚠️ + texte rouge) — c'est l'admin qui décide, pas le solver