[Full-stack] Audit / traçabilité des modifications dossier et profils (parent/AM) #128
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte
Pour la sécurité et le suivi des dossiers (familles et assistantes maternelles), il faut pouvoir savoir qui a modifié quoi, quand sur les données d'un dossier ou d'un profil. C'est essentiel en cas de litige ou désaccord entre co-parents, de support / audit, et pour la conformité minimale.
Aujourd'hui :
cree_le/modifie_le(dossier_famille,utilisateurs), mais ils ne disent pas qui a modifié, ni quels champs, ni les événements transverses (refus, validation, fusion de comptes…).Objectif
Mettre en place un journal d'audit (qui / quand / quoi) couvrant :
…sans logger tout le bruit applicatif.
Périmètre & règles produit
1. Règle simple — alignée inscription
À chaque modification d'une information fournie lors de la création du dossier parent ou AM, un événement est loggé. La liste exacte est dérivée des champs persistés à l'inscription (
RegisterParentCompletDto,RegisterAMCompletDtoet entités liées), ce qui couvre notamment :Exclus par défaut (sauf décision ultérieure) : lectures, listings, requêtes purement techniques, heartbeats, etc.
2. Actions structurelles et événements métier (toujours loggés)
numero_dossier, tout regroupement ou scission identifiable → événement dédié (qui, quand, identifiants concernés, type d'opération).Architecture proposée
Journal d'audit en BDD (recommandé vs simple fichier)
numero_dossierouuser_id, sauvegardes PG, cohérence transactionnelle.idoccurred_at(timestamptz)actor_user_id(nullable si action système) +actor_rolenumero_dossier(dénormalisé pour filtrage)entity_type(utilisateur|parent|assistante_maternelle|enfant|dossier_famille| …)entity_idaction(create|update|delete| événement métier :refus,validation,suspension,fusion_comptes,affectation_numero_dossier, …)changesJSON (ancien / nouveau ou patch, ou résumé pour les événements)request_id,ip,source(gestionnaire_ui,selfservice_reprise, …)Colonnes « création / dernière modification »
cree_le/modifie_leexistent déjà surdossier_familleetutilisateurs.@UpdateDateColumn/ triggers.numero_dossier: soit vue / requête surmax(modifie_le), soit colonne dérivée sur une entité pivot — à trancher en spec.Fichier
Réservé éventuellement en complément (export append-only, intégration SI) ; pas comme source unique si l'app affiche l'historique.
Accès gestionnaire (exigence métier)
numero_dossier), notamment en cas de litige entre co-parents.GET …/dossiers/:numeroDossier/auditou sous-ressource des routes gestionnaire existantes), pagination, tri par date, contrôle d'accès gestionnaire / admin (même périmètre que la validation dossier).Visibilité parents & AM (phase suivante)
À terme, lorsque les parents et les AM auront leur tableau de bord, un sous-menu discret (non mis en avant, mais accessible) donnera accès au même historique côté demandeur, incluant toutes les lignes d'audit (gestionnaire, admin, parent, AM).
→ Le ticket peut être livré en deux temps si nécessaire : MVP (API + écran gestionnaire), phase dashboard (entrée parent/AM dans leur tableau de bord, dépend de l'avancée des dashboards).
Points transverses
apply…(context)) : l'audit doit recevoir unsourceoucorrelation_idpour distinguer gestionnaire vs demandeur.Critères de done (V1)
database/BDD.sql: table d'audit + index utiles (numero_dossier,occurred_at,actor_user_id).@CreateDateColumn/@UpdateDateColumnmanquants sur les entités du dossier.appendAuditLog(...)(ou équivalent) branché sur :numero_dossier, fusion / association de comptes.GET …/dossiers/:numeroDossier/audit(gestionnaire / admin) — pagination, tri par date.Hors périmètre (à scinder en autres tickets si besoin)