Aller au contenu

Exécution — 4 bugs signalés par Bernard (menu sous-activités, RBAC indicateurs, études, crash fiche enfant)

Note écrite après coup (pas en direct comme l'exige la règle habituelle) : le diagnostic et les correctifs ont été enchaînés dans la même session sans pause pour journaliser section par section. Le contenu ci-dessous reconstitue fidèlement le déroulé réel à partir des actions effectuées, mais n'a pas la même valeur de "suivi en temps réel" que les notes précédentes.

Origine

Bernard a signalé 4 problèmes d'affilée en testant l'application en conditions réelles, avant de dire "je m'en arrête là d'abord" : 1. Aucune entrée de menu ne permet visiblement à un agent de terrain d'enregistrer une sous-activité et ses données. 2. /pilotage/indicateurs : aucun agent, pas même MEAL_COMMUNAL, ne peut modifier/ajouter un indicateur — seul MEAL_NATIONAL le peut. 3. /pilotage/etudes affiche "Erreur de chargement.", et l'agent de terrain ne peut rien y saisir. 4. /rapports/enfants/<id> plante : Cannot read properties of undefined (reading 'length').

Diagnostic (4 investigations Explore en parallèle)

#1 Menu sous-activités : les 4 volets holistiques (appui alimentaire, soutien psychologique, prise en charge sanitaire, alphabétisation) fonctionnent et ont les bonnes permissions, mais sont montés uniquement dans EnfantDetailPage.tsx (PriseEnChargeHolistiqueSection), sans entrée de menu dédiée. En creusant plus loin (cf. section suivante), il s'est avéré que c'est un choix déjà tranché par Bernard le 2026-07-10, pas un oubli.

#2 RBAC indicateurs : INDICATEUR_CREER (une seule permission pour créer ET modifier, pilotage.module.routes.ts:83,99) n'est accordée qu'à MEAL_NATIONAL/ADMIN/SUPER_ADMIN dans seed.ts — choix documenté et délibéré (commentaire seed.ts:180-182 : "spécialité MEAL, création légitime"). IndicateurSuivi n'a pas de communeCode (référentiel global), cohérent avec le fait que seul MEAL_NATIONAL le modifie. En revanche, écart réel trouvé : les boutons "+ Nouvel indicateur"/"Modifier" de PilotagePage.tsx n'étaient gatés par aucune vérification usePermission('INDICATEUR_CREER') côté frontend (contrairement au pattern déjà utilisé pour ETUDE_CREER dans le même fichier) — visibles par tout profil ayant accès à la page, bien que le backend bloque correctement en 403.

#3 Études "Erreur de chargement." : bug réel. Le lien Sidebar "Études diagnostiques" était gaté au niveau section sur INDICATEUR_LIRE (que les agents de terrain ont), sans gate propre sur ETUDE_LIRE — permission qu'agentTerrain n'avait pas dans seed.ts. Résultat : 403 côté API, affiché comme un message générique indifférencié de toute autre erreur.

#4 Crash /rapports/enfants/:id : PAS une réoccurrence du bug d'enveloppe API déjà connu (../../../feedback/feedback_enveloppe_api_donnees — vérifié, le repository frontend unwrap correctement res.data.donnees). La vraie cause : le champ FicheEnfantDTO.accompagnements attendu côté frontend (Modules/rapports/pages/FicheEnfantPage.tsx, application/dto/dtos.ts) n'existe tout simplement plus côté backend depuis la refonte du 2026-07-10 (20260710_1344_execution-refonte-accompagnements-suivi-orientations) — renommé en casOrientes à ce moment-là (confirmé dans cette note : "FicheEnfantDTO.accompagnementscasOrientes"), y compris dans les tests Jest correspondants (rapports.fiche-enfant.test.ts), mais le frontend Rapports n'a jamais suivi ce renommage. fiche.accompagnements valait donc undefined, d'où le crash sur .length.

Confirmation de Bernard avant correction

Avant de coder quoi que ce soit sur le point #1, la note de refonte du 2026-07-10 a été relue intégralement : elle indique noir sur blanc que "les 4 volets et le nouveau suivi n'ont jamais eu d'entrée de menu dédiée — cohérent avec le fait qu'ils s'affichent en ligne sur la fiche enfant." C'est donc une décision de Bernard vieille de 2 jours, pas un oubli. Question posée explicitement avant de coder : revenir dessus, ou juste améliorer la découvrabilité ? Réponse : garder le choix du 07-10, améliorer seulement la découvrabilité. Portée du travail confirmée séparément : les 4 correctifs, maintenant.

Correctifs appliqués (commit 42594d7)

  1. Sidebar (shared/components/layout/Sidebar.tsx) : nouveau sous-lien "Enregistrer une prise en charge" sous "Gestion des enfants" (pointe vers /enfants, gaté ACCOMPAGNEMENT_LIRE) — pas de nouveau menu de premier niveau. Lien "Études diagnostiques" désormais gaté ETUDE_LIRE en plus du gate de section. Piège rencontré en cours de route : deux SubItem avec le même to: '/enfants' cassaient la key React de la liste (key={item.to}) — le second lien ne se rendait pas du tout tant que la clé n'a pas été changée en ${item.to}-${item.label}. Trouvé uniquement grâce à la vérification Playwright après premier déploiement (le lien n'apparaissait pas malgré un code apparemment correct).
  2. seed.ts : ETUDE_LIRE ajoutée à agentTerrain (PSYCHOLOGUE/ASSISTANT_SOCIAL passent de 24 à 25 permissions). Réappliqué en base via docker exec projetesm-backend npx tsx prisma/seeds/seed.ts (script déclaratif, deleteMany/upsert scopés par profil, sans risque pour les données métier — vérifié avant exécution qu'aucun deleteMany n'était à risque).
  3. PilotagePage.tsx : boutons Créer/Modifier indicateur gatés usePermission('INDICATEUR_CREER') (3 emplacements : bouton "+ Nouvel indicateur", ligne tableau desktop, carte mobile). Message d'erreur de l'onglet Études distingué : 403 (ApiError.status === 403) affiche "Vous n'avez pas les droits nécessaires..." au lieu du générique "Erreur de chargement."
  4. Rapports (application/dto/dtos.ts, pages/FicheEnfantPage.tsx) : AccompagnementInfoDTO remplacé par CasOrienteInfoDTO (miroir exact du DTO backend : serviceDestinataire/typeOrientation/dateOrientation/dateRetourInfo/suitesDonnees), section "Accompagnements" de la fiche renommée "Orientations" avec un rendu adapté à ces champs. Lien mort vers /accompagnements/:id (route inexistante depuis la refonte du 07-10) retiré au passage.

Déployé au passage (backend redéployé de toute façon) : le correctif du refresh token (limite Zod 1000→4000 caractères, cf. ../../project_refresh_token_deconnexion_forcee) qui était resté non commité depuis une session antérieure le même jour.

Vérification

tsc --noEmit propre côté backend et frontend (les ~60 erreurs Prisma initiales côté backend étaient un client généré obsolète, résolu par npx prisma generate, sans lien avec ces correctifs). npm run build frontend OK. Déployé via deploy.sh --target both, puis reseed ciblé. Vérification réelle par script Playwright ad hoc (login réel assistant.social.test@esm.local, pas de raccourci API pour les assertions UI) contre esm.tekdhi.dev : - Lien "Enregistrer une prise en charge" présent dans le menu (après le fix de la clé React). - /pilotage/etudes : plus de "Erreur de chargement." pour ce profil. - /pilotage/indicateurs : aucun bouton "+ Nouvel indicateur"/"Modifier" visible pour ce profil. - /rapports/enfants/<id réel> : plus de crash, section "Orientations" rendue correctement, aucune requête réseau en échec, aucune erreur JS.

Script de vérification et captures d'écran laissés dans le scratchpad de session (pas conservés dans Test_E2E/ — vérification ponctuelle d'un correctif, pas un scénario de test à rejouer, contrairement aux scripts numérotés du dossier).

Liens connexes