[Backend] Cartes rose soin_enfant — 3 sous-types, instant T, correction 24 h #206
Open
opened 2026-10-05 20:44:26 +00:00 by jmartin
·
0 comments
No Branch/Tag Specified
master
feature/207-front-soin-enfant
feature/206-soin-enfant
develop
feature/175-declarer-absence
feature/174-feed-bulles-am
feature/173-feed-bulles-parent
feature/205-evenements-agenda
feature/fix-card-respond-id-card
feature/170-fix-api-couples-am
feature/170-selecteur-couple-enfant-parents-am
feature/171-api-couples-garde-am
feature/169-coquille-tdb-am
feature/187-agenda-absences-stub
feature/195-realtime-cartes
feature/fix-jwt-absences-cards
feature/194-module-cartes-system
feature/172-api-absences-garde
feature/193-bdd-absences-garde
docs/norme-merge-squash
feature/168-api-couples-garde-parent
feature/167-selecteur-couple-enfant-nounou
feature/166-tdb-parent-coquille-bandeau
docs/117-cdc-v1.4-srs-users
docs/rationalisation-0.1.0
feature/164-staff-modal-uniformisation
feature/155-rename-admin-prefix-dashboard
docs/155-phase2-spec
feature/152-remove-est-multiple
feature/161-admin-creation-staff
feature/160-suppressions-dashboard
feature/159-suppressions-backend
feature/135-edition-dossier
feature/153-onglet-dossiers
feature/129-creation-dossier-parent
feature/156-creation-dossier-am
feature/158-affiliation-enfant-foyer
feature/157-enfant-sans-responsable
feature/132-creation-enfant-onglet-enfants
fix/151-get-relais-gestionnaire
backup/auth-fixes
archive/maquette-initiale
v0.1.0
stable
Labels
Clear labels
a11y
admin
api
auth
backend
bug
cdc
cleanup
critique
database
documentation
duplicate
email
enhancement
frontend
gestionnaire
good first issue
help wanted
infra
invalid
juridique
monitoring
on-premise
p0-bloquant
p1-bloquant
p2
p3
p4
phase-1
question
rgpd
security
tests
ui
upload
ux
v0.1.0
v0.2.0
wontfix
Accessibilité
Administration
Authentification
Backend NestJS
Something isn't working
Cahier des charges
Nettoyage/Refactoring
Critique
Base de données PostgreSQL
Improvements or additions to documentation
This issue or pull request already exists
Email/Notifications
New feature or request
Frontend Flutter/Web
Gestionnaire
Good for newcomers
Extra attention is needed
Infrastructure Docker/CI-CD
This doesn't seem right
Juridique/Légal
Monitoring/Logs
Configuration on-premise
Priorité 0 - BLOQUANT
Priorité 1 - BLOQUANT
Priorité 2
Priorité 3
Priorité 4
Phase 1
Further information is requested
RGPD/Conformité
Sécurité
Tests unitaires/E2E
Upload fichiers
UX/UI
Issue rattachée au périmètre release 0.1.0
Milestone quotidien parent/AM
This will not be worked on
Projects
Clear projects
No projects
Assignees
jmartin (MARTIN Julien)
Clear assignees
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: jmartin/petitspas#206
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Contexte
Epic #165 — file d'attention Cartes. Front associé : #207.
Intention produit figée dans docs/32_MINI-SPEC-BULLES-CARTES.md §5.
La nounou signale un événement concernant l'enfant (fièvre, bobo, médicament donné) vers les parents, qui acquittent. Ce n'est pas que de la messagerie : c'est loggé dans la file, lié à l'agenda, et acquittable sans noyer le chat.
Cadrage commun (à ne pas perdre de vue)
L'outil n'a aucune valeur juridique, comme le module contrat : la vraie vie prévaut. Une carte soin vaut un message WhatsApp du genre « l'enfant a de la fièvre, je lui donne du paracétamol ». C'est informatif, ce n'est ni un circuit de validation ni une autorisation.
Ce qui rend ces cartes différentes des précédentes
soin_enfant, trois formulaires distincts).On les conserve malgré tout dans
evenements_agenda: c'est fait pour se souvenir. La période y est dégénérée (date_debut == date_fin) et l'instant précis vit dansheure_releve.Sous-types retenus
sous_typefievreackboboackmedicamentackPas de 4e sous-type « autre » :
autrereste une valeur de la liste des natures de bobo.Règle anti-ambiguïté : fièvre → carte
fievre(le médicament éventuel y est un champ satellite) ; médicament pour toute autre raison → cartemedicament. Un seul chemin par fait consigné, sinon l'historique devient incohérent.Plusieurs cartes par jour sont normales : une fièvre se mesure plusieurs fois. Chaque relevé est une carte, pas de regroupement en V1.
Contrat de payload
Commun aux trois sous-types :
sous_type,date_debut/date_fin(même jour en V1),heure_releve(HH:mm).L'heure est indispensable : 38,2 à 9 h et 38,2 à 16 h ne racontent pas la même histoire, et sans elle les parents la redemandent dans le chat.
fievretemperature_c365→36,5)medicament_donneOn ne bloque pas une observation de santé : une hypothermie réelle doit pouvoir être consignée, et les mesures axillaires ou frontales descendent bas. Un formulaire qui refuse la réalité pousse à ne rien saisir.
Pas de champ poids : c'est une donnée stable qui appartient à la fiche enfant, et l'AM n'a pas de balance. Voir #208.
bobobobo_naturechute|coup|egratignure|piqure|brulure|autredescriptionLa limite est volontaire : le fait suffit dans la carte, le contexte va dans la messagerie.
medicamentmedicament_nomcontexteÀ faire
1. Seed du type
À ajouter à la liste de database/migrations/2026_cards_system.sql (lignes 88-120, avec son
ON CONFLICT DO UPDATE) :audience_resolver=couple_parents, commeconge_ametarret_maladie_am: c'est le resolver des cartes émises par l'AM, qui ajoute tous les parents de l'enfant. (couple_amest l'inverse, pour les cartes émises par un parent.) → aucun code d'audience à écrire,buildAudiencebranche déjà sur ce champ.retention_days= 7, aligné sur la famille informative (absence_enfantest à 7 ; les 14 jours deconge_am/arret_maladie_amservent une décision sur une période à venir). Un relevé de la semaine dernière est du bruit dans le feed, l'historique vit dans l'agenda.À savoir :
purgeAtappliquemax(retention, 15)tant que la carte estOUVERTE, donc une carte non acquittée reste 15 jours quoi qu'il arrive.couleurexiste encore en base sans être exposée par l'API ; on la renseigne par cohérence avec ses voisines.Le statut initial de la carte sera
OUVERTEpuisqueresponse_mode = ack: rien à changer.2. Enum agenda — trois endroits à tenir synchrones
TypeEvenementAgendaTypene contient queabsence_enfant,conge_am,arret_maladie_am. Pas de contrainte de prod, donc on modifie librement, mais il faut penser au schéma de référence sinon une base recréée repart sans la valeur :soin_enfantà la création de l'enum (synchronize: falsecôté TypeORM, rien n'est déduit des entités) ;database/migrations/:ALTER TYPE type_evenement_agenda_type ADD VALUE 'soin_enfant'pour les bases dev déjà en place ;Puis étendre
mapAbsenceTypedanscards.service.ts, qui lève une exception pour tout type non mappé.3. Deux branches dans
evenements-agenda.service.tsstatutInitial: seulABSENCE_ENFANTrenvoieACCEPTEaujourd'hui, tout le reste tombe enEN_ATTENTE.SOIN_ENFANTdoit renvoyerACCEPTE— il n'y a rien à négocier. Effet de bord voulu :expireAtForrenvoie alors le sentinelEXPIRE_ACCEPTE(9999-12-31), donc la ligne d'agenda ne se purge jamais.assertCanCreateType: l'AM est limitée àCONGE_AM/ARRET_MALADIE_AM; ajouterSOIN_ENFANTpour l'AM, et surtout ne pas l'ouvrir aux parents.Attention : il existe deux fonctions
statutInitialhomonymes, une pour la carte et une pour l'agenda, dans deux services différents.4. Payload structuré
Le payload est aujourd'hui figé en dur à
date_debut/date_fin/motifdanscreer. Le rendre extensible pour accueillir les champs par sous-type, sans casser les types existants.Le
motifest dérivé côté back à partir du payload (ex.36,5 °C à 14:20) ; le front ne l'envoie pas. C'est lui qui alimente lemotifde la ligne d'agenda, il ne doit donc pas dépendre d'une chaîne construite par le client.5. Correction encadrée — fenêtre de 24 h
L'erreur de saisie est inévitable (38,5 tapé au lieu de 36,5). On autorise donc la correction, mais bornée et tracée : corrigeable brièvement, inaltérable ensuite.
cree_le. Contrôle côté back ; le front se contente de masquer le bouton.sous_type, pas le placement, pas l'enfant.Trace : conserver la valeur précédente dans un
historique[]horodaté du payload, avec son auteur, et posercorrige_le. Une correction ne doit pas être silencieuse.Re-acquittement : si des parents avaient déjà acquitté, la carte repasse
OUVERTEet doit être acquittée à nouveau. Une température corrigée de 36,5 à 38,5 est médicalement signifiante, un badge discret dans un feed déjà traité se perdrait. Effets de bord utiles : le tri placeOUVERTEen tête donc la carte remonte d'elle-même,purge_atest recalculé, etrepondreredevient possible puisqu'il exigestatut === OUVERTE.Les lignes
card_responsesantérieures sont conservées (c'est de l'historique). « Ce parent a-t-il acquitté la version corrigée ? » se détermine en comparant la date de sa réponse àcorrige_le— à prévoir explicitement, sinon un ancien acquittement passera pour un acquittement de la correction.Implémentation : le chemin existant
majEnAttenteexige un statut en attente ; poursoin_enfantla garde devient la règle des 24 h, la ligne d'agenda étant mise à jour en parallèle viamaj.supprimerreçoit une branche dédiée : fenêtre 24 h au lieu du testOUVERTE | REFUSEEactuel.6. Contraintes à transmettre à la purge TTL
Pour #196, pas encore implémenté :
card_instancesde typesoin_enfant. L'agenda ne stocke que la période et lemotifen texte : toute la donnée structurée (temperature_c,heure_releve,bobo_nature,historique[]) ne vit que dans le payload de la carte. Une suppression physique rendrait l'historique inexploitable autrement qu'en relisant une phrase. Les cartes soin sortent du feed par le filtrepurge_at, mais leur ligne reste.7. Tests
Création des trois sous-types, validations (bornes, longueurs, enum, format heure), dérivation du
motif, correction dans les 24 h, refus au-delà, re-acquittement après correction.Hors scope
type_codeséparés (soin_temperature…) : un seul type + payloadcouleurdans l'API (la teinte est un mapping front)Done when
GET /cardsid_evenementrenseigné, ligne d'agenda enaccepteet non purgeableRéf.
backend/src/modules/cards/(#194) · SSE (#195)Évolution notée (pas de ticket)
L'AM pourra plus tard partager son agenda au gestionnaire, qui disposerait alors de droits de modification sur les cartes verrouillées. D'où deux précautions dès maintenant : garder la fenêtre de 24 h comme règle de service contournable par un rôle habilité (pas une contrainte figée en base), et tracer l'auteur dans
historique[].[Backend] Cartes rose — type soin_enfant (AM → parents, ack + agenda)to [Backend] Cartes rose soin_enfant — 3 sous-types, instant T, correction 24 h