Contexte métier
La base de données EGAPRO contient des dizaines de colonnes dont les noms techniques (ex: remunerationsMoyennesParTrancheAgeFemmes0) ne correspondent pas aux libellés utilisés dans l'export JSON SUIT (ex: Rem_globale_annuelle_moyenne_F) ni aux champs d'origine GIP-MDS (indicateurs A–F pré-calculés à partir de la DSN).
Aujourd'hui, les équipes DARES, le support et les nouveaux développeurs doivent reconstituer mentalement cette correspondance en lisant plusieurs fichiers TypeScript, ce qui ralentit toute intervention (debug, support, onboarding, évolutions fonctionnelles).
L'objectif est de documenter de manière traçable et publiée la correspondance colonne DB → label API SUIT → origine GIP-MDS, directement à la source (schema.ts), et de l'exposer sur le wiki via le workflow existant db-schema.yaml.
User stories
- En tant que développeur egapro, je veux voir directement dans
schema.ts le label SUIT correspondant à chaque colonne, afin de comprendre immédiatement ce que représente la donnée.
- En tant que agent support / DARES, je veux consulter une page wiki à jour qui donne la correspondance DB ↔ SUIT ↔ GIP-MDS, afin de répondre aux demandes sans lire le code.
- En tant que nouveau développeur onboardé, je veux savoir d'un coup d'œil si une donnée provient du GIP-MDS ou a été saisie par l'entreprise, afin de ne pas me tromper sur son mode de calcul.
Contexte technique
Fichiers clés pour l'architect :
- Schéma DB à annoter :
packages/app/src/server/db/schema.ts
- Mapping JSON SUIT :
packages/app/src/modules/export/shared/apiLabels.ts (constantes INDICATOR_A_LABELS … INDICATOR_F_LABELS)
- Assemblage du payload JSON SUIT : fonction
assembleDeclaration() dans packages/app/src/app/api/v1/export/declarations/route.ts
- Workflow de publication wiki :
.github/workflows/db-schema.yaml (outil db-schema-toolkit)
- Page wiki cible : https://github.com/SocialGouv/egapro/wiki/Schema-Egapro-V2
Rappel métier : les indicateurs A–F sont pré-calculés par le GIP-MDS à partir des DSN. L'indicateur G est calculé par l'entreprise elle-même (pas d'origine GIP-MDS).
Décisions cadrées (Q&A PO)
| # |
Question |
Décision |
| Q1 |
Périmètre tables |
Toutes les tables de schema.ts, pas seulement celles exposées via SUIT |
| Q2 |
Portée colonnes |
Uniquement les colonnes qui ont un label SUIT JSON ; les autres restent sans commentaire |
| Q3 |
Format commentaire |
Préfixe TS inline // SUIT: <label> ; si la donnée provient du GIP-MDS (indicateurs A–F pré-calculés), ajouter l'origine GIP au commentaire. Format suggéré : // GIP-MDS | SUIT: <label> — format final à formaliser par l'architect |
| Q4 |
Mapping XLSX ? |
Non. On ignore DECLARATION_COLUMNS / INDICATOR_G_COLUMNS (libellés XLSX) — seuls les libellés JSON SUIT (apiLabels.ts + assembleDeclaration()) sont documentés |
| Q5 |
Garde-fou CI |
Aucun. Documentation one-shot, pas de test automatisé pour détecter les colonnes manquantes à l'avenir |
| Q6 |
Critère de Done |
Validation visuelle par l'utilisateur sur https://github.com/SocialGouv/egapro/wiki/Schema-Egapro-V2. Si db-schema-toolkit ne rend pas correctement les commentaires, l'architect découpera en ticket(s) de remédiation (switch d'outil / post-processing) — pas de scope créé upfront pour ça |
Scénarios de test
S1 — Traçabilité côté code
- Étant donné un développeur qui lit
packages/app/src/server/db/schema.ts
- Quand il se positionne sur une colonne qui a un label SUIT (ex:
remunerationsMoyennesParTrancheAgeFemmes0)
- Alors il voit en commentaire TS le label SUIT correspondant (ex:
// SUIT: Rem_globale_annuelle_moyenne_F ou // GIP-MDS | SUIT: ...)
S2 — Publication wiki
S3 — Origine GIP-MDS visible
- Étant donné une colonne qui contient une donnée pré-calculée par le GIP-MDS (indicateurs A–F)
- Quand un utilisateur consulte le wiki ou lit
schema.ts
- Alors le commentaire indique explicitement l'origine GIP-MDS (ex:
GIP-MDS | SUIT: ...), permettant de distinguer ces données de celles saisies par l'entreprise (indicateur G, méta-données)
S4 — Couverture exhaustive
- Étant donné l'ensemble des libellés définis dans
apiLabels.ts et utilisés par assembleDeclaration()
- Quand l'architect / dev passe en revue le mapping
- Alors chaque libellé JSON SUIT présent dans le payload d'export a une colonne DB commentée correspondante (aucun label SUIT orphelin, aucune colonne SUIT non commentée)
Hors scope
- Pas de validation automatisée (pas de test CI qui détecte les colonnes SUIT manquantes à l'avenir)
- Pas de documentation des libellés XLSX (
DECLARATION_COLUMNS, INDICATOR_G_COLUMNS) — seuls les libellés JSON SUIT sont couverts
- Pas de refactor de
apiLabels.ts ni de assembleDeclaration() — on documente ce qui existe
- Pas d'étape designer (feature backend + docs uniquement)
- Pas de création d'un nouvel outil de rendu wiki upfront — on utilise
db-schema-toolkit existant ; un éventuel switch d'outil sera un ticket séparé si la validation utilisateur échoue
Critères d'acceptation de haut niveau
L'architect découpera ces critères en tickets exécutables.
Note pipeline
Pas d'étape designer (feature purement backend + documentation, aucun rendu UI dans l'app). Après validation de cet epic par l'utilisateur, l'architect prend le relais pour découper en tickets exécutables par code-dev.
Contexte métier
La base de données EGAPRO contient des dizaines de colonnes dont les noms techniques (ex:
remunerationsMoyennesParTrancheAgeFemmes0) ne correspondent pas aux libellés utilisés dans l'export JSON SUIT (ex:Rem_globale_annuelle_moyenne_F) ni aux champs d'origine GIP-MDS (indicateurs A–F pré-calculés à partir de la DSN).Aujourd'hui, les équipes DARES, le support et les nouveaux développeurs doivent reconstituer mentalement cette correspondance en lisant plusieurs fichiers TypeScript, ce qui ralentit toute intervention (debug, support, onboarding, évolutions fonctionnelles).
L'objectif est de documenter de manière traçable et publiée la correspondance
colonne DB → label API SUIT → origine GIP-MDS, directement à la source (schema.ts), et de l'exposer sur le wiki via le workflow existantdb-schema.yaml.User stories
schema.tsle label SUIT correspondant à chaque colonne, afin de comprendre immédiatement ce que représente la donnée.Contexte technique
Fichiers clés pour l'architect :
packages/app/src/server/db/schema.tspackages/app/src/modules/export/shared/apiLabels.ts(constantesINDICATOR_A_LABELS…INDICATOR_F_LABELS)assembleDeclaration()danspackages/app/src/app/api/v1/export/declarations/route.ts.github/workflows/db-schema.yaml(outildb-schema-toolkit)Rappel métier : les indicateurs A–F sont pré-calculés par le GIP-MDS à partir des DSN. L'indicateur G est calculé par l'entreprise elle-même (pas d'origine GIP-MDS).
Décisions cadrées (Q&A PO)
schema.ts, pas seulement celles exposées via SUIT// SUIT: <label>; si la donnée provient du GIP-MDS (indicateurs A–F pré-calculés), ajouter l'origine GIP au commentaire. Format suggéré :// GIP-MDS | SUIT: <label>— format final à formaliser par l'architectDECLARATION_COLUMNS/INDICATOR_G_COLUMNS(libellés XLSX) — seuls les libellés JSON SUIT (apiLabels.ts+assembleDeclaration()) sont documentésDonedb-schema-toolkitne rend pas correctement les commentaires, l'architect découpera en ticket(s) de remédiation (switch d'outil / post-processing) — pas de scope créé upfront pour çaScénarios de test
S1 — Traçabilité côté code
packages/app/src/server/db/schema.tsremunerationsMoyennesParTrancheAgeFemmes0)// SUIT: Rem_globale_annuelle_moyenne_Fou// GIP-MDS | SUIT: ...)S2 — Publication wiki
schema.tsa été annoté et mergé surmasterdb-schema.yamls'exécuteS3 — Origine GIP-MDS visible
schema.tsGIP-MDS | SUIT: ...), permettant de distinguer ces données de celles saisies par l'entreprise (indicateur G, méta-données)S4 — Couverture exhaustive
apiLabels.tset utilisés parassembleDeclaration()Hors scope
DECLARATION_COLUMNS,INDICATOR_G_COLUMNS) — seuls les libellés JSON SUIT sont couvertsapiLabels.tsni deassembleDeclaration()— on documente ce qui existedb-schema-toolkitexistant ; un éventuel switch d'outil sera un ticket séparé si la validation utilisateur échoueCritères d'acceptation de haut niveau
packages/app/src/server/db/schema.tsayant un label SUIT JSON porte un commentaire TS au format// SUIT: <label>(ou// GIP-MDS | SUIT: <label>si la donnée provient du GIP-MDS — format final à arrêter par l'architect)schema.tssont passées en revue (pas seulement celles exposées via SUIT)INDICATOR_A_LABELS…INDICATOR_F_LABELSdeapiLabels.tsest associé à exactement une colonne DB commentée.github/workflows/db-schema.yamla été déclenché avec succès après le merge surmasterNote pipeline
Pas d'étape
designer(feature purement backend + documentation, aucun rendu UI dans l'app). Après validation de cet epic par l'utilisateur, l'architectprend le relais pour découper en tickets exécutables parcode-dev.