Rapport — Extension module Pilotage : TypeIndicateur + désagrégation H/F¶
Date : 2026-06-21 à 07h50
Périmètre : ProjetESM — module Pilotage (backend + frontend)
Objectif : Exploiter l'analyse des 31 indicateurs (20260621_0150_analyse-indicateurs-type-desagregation.md) pour enrichir le module Pilotage existant avec la notion de type d'indicateur et de désagrégation par genre.
1. Contexte¶
L'analyse préalable a classé les 31 indicateurs du projet ESM en trois catégories :
| Type | Nb | Description |
|---|---|---|
COMPTAGE |
20 | Entiers (personnes, sessions, supports…) |
TAUX |
9 | Proportion 0–1 (taux de participation, etc.) |
TEXTE |
2 | Référence document / lien |
19 indicateurs nécessitent une désagrégation Homme/Femme (personnes directement concernées). 12 ne le sont pas (objets, structures, séances).
2. Modifications Prisma¶
Fichier : BackEnd/prisma/schema.prisma
enum TypeIndicateur {
COMPTAGE
TAUX
TEXTE
}
Modèle IndicateurSuivi — champs ajoutés :
- typeIndicateur TypeIndicateur @default(COMPTAGE)
- desagregationGenre Boolean @default(false)
- cibleHomme String?
- cibleFemme String?
Modèle MesureIndicateur — champs ajoutés :
- valeurNumerique Float?
- valeurHomme Float?
- valeurFemme Float?
Commande exécutée : npx prisma db push ✅ (DB synchronisée en 100ms, Prisma Client régénéré)
3. Seed des 31 indicateurs¶
Fichier créé : BackEnd/prisma/seed-indicateurs.ts
Upsert sur le champ code (unique) → idempotent, sans doublons.
Chaque indicateur est rattaché à son activité (par ID DB) avec :
- typeIndicateur correct (COMPTAGE / TAUX / TEXTE)
- desagregationGenre (true/false)
- valeurCible quand définie
- unite (personnes, séances, comités, %)
Résultat : 31 indicateurs upsertés ✅
4. Modifications backend¶
4.1 Domain¶
| Fichier | Modification |
|---|---|
domain/types/PilotageDTO.ts |
Type TypeIndicateur, nouveaux champs sur IndicateurSuiviDTO, MesureIndicateurDTO, DonneesCreerIndicateur, DonneesModifierIndicateur, DonneesSaisirMesure, IndicateurAvecMesuresDTO, MesureBulkItem |
domain/interfaces/repositories/IIndicateurSuiviRepository.ts |
DonneesCreationIndicateur et DonneesModificationIndicateur étendus |
domain/interfaces/repositories/IMesureIndicateurRepository.ts |
DonneesCreationMesure étendu |
4.2 Infrastructure — Schémas Zod¶
Fichier : infrastructure/schemas/zod/pilotage.schemas.ts
- Ajout de
TypeIndicateurSchema = z.enum(['COMPTAGE', 'TAUX', 'TEXTE']) CreerIndicateurSchema:typeIndicateur,desagregationGenre,cibleHomme,cibleFemmeModifierIndicateurSchema: idemSaisirMesureSchema:valeurNumerique,valeurHomme,valeurFemme
4.3 Infrastructure — Repositories Prisma¶
| Fichier | Modification |
|---|---|
IndicateurSuiviRepositoryPrisma.ts |
creer() et modifier() passent les nouveaux champs ; mapToDTO() les retourne |
MesureIndicateurRepositoryPrisma.ts |
Upsert (create + update) et mapToDTO() incluent valeurNumerique/Homme/Femme |
ActiviteRepositoryPrisma.ts |
listerAvecMesuresPourAgent() expose typeIndicateur, desagregationGenre, cibleHomme, cibleFemme dans IndicateurAvecMesuresDTO |
4.4 Application — Use Cases¶
| Fichier | Modification |
|---|---|
CreerIndicateurUseCase.ts |
Passe typeIndicateur, desagregationGenre, cibleHomme, cibleFemme au repository |
ModifierIndicateurUseCase.ts |
Idem |
SaisirMesureUseCase.ts |
Passe valeurNumerique, valeurHomme, valeurFemme au repository |
SaisirMesuresParActiviteUseCase.ts |
Passe valeurHomme, valeurFemme par item dans la boucle bulk |
Backend TypeScript : 0 erreur ✅
5. Modifications frontend¶
5.1 DTOs¶
Fichier : FrontEnd/src/Modules/pilotage/application/dto/dtos.ts
- Type
TypeIndicateur = 'COMPTAGE' | 'TAUX' | 'TEXTE' IndicateurDTO:typeIndicateur,desagregationGenre,cibleHomme,cibleFemmeMesureDTO:valeurNumerique,valeurHomme,valeurFemmeCreateIndicateurForm/UpdateIndicateurForm: nouveaux champsIndicateurAvecMesuresDTO:typeIndicateur,desagregationGenre,cibleHomme,cibleFemmeMesureBulkItem:valeurHomme,valeurFemme
5.2 PilotagePage.tsx¶
IndicateurFormModal — nouveaux champs :
- Sélecteur typeIndicateur (Comptage / Taux / Texte)
- Case à cocher desagregationGenre
- Champs cibleHomme / cibleFemme (conditionnels, visibles si désagrégation activée)
ModalSaisieActivite — saisie adaptative :
| Condition | Rendu |
|---|---|
typeIndicateur === 'TEXTE' |
Input texte libre (titre ou lien document) |
desagregationGenre === true |
Grille H / F + champ Total calculé automatiquement (H+F) |
COMPTAGE sans désagrégation |
Input numérique entier (step=1) |
TAUX sans désagrégation |
Input numérique décimal (step=0.01, max=1), placeholder Ex : 0.75 (= 75%) |
Les valeurs H et F sont transmises à l'API via valeurHomme / valeurFemme dans MesureBulkItem.
Frontend TypeScript : 0 erreur ✅
6. Chaîne de validation complète¶
Formulaire (PilotagePage)
→ MesureBulkItem { valeur, valeurHomme?, valeurFemme? }
→ PilotageRepository.saisirMesuresParActivite() — POST JSON
→ SaisirMesuresParActiviteUseCase (backend)
→ DonneesCreationMesure { valeur, valeurHomme, valeurFemme }
→ MesureIndicateurRepositoryPrisma.saisir() — upsert Prisma
→ DB : MesureIndicateur { valeur, valeurNumerique, valeurHomme, valeurFemme }
7. Fichiers créés ou modifiés¶
Créés¶
BackEnd/prisma/seed-indicateurs.ts
Modifiés (backend)¶
BackEnd/prisma/schema.prismaBackEnd/src/Modules/Pilotage/domain/types/PilotageDTO.tsBackEnd/src/Modules/Pilotage/domain/interfaces/repositories/IIndicateurSuiviRepository.tsBackEnd/src/Modules/Pilotage/domain/interfaces/repositories/IMesureIndicateurRepository.tsBackEnd/src/Modules/Pilotage/infrastructure/schemas/zod/pilotage.schemas.tsBackEnd/src/Modules/Pilotage/infrastructure/repositories/prisma/IndicateurSuiviRepositoryPrisma.tsBackEnd/src/Modules/Pilotage/infrastructure/repositories/prisma/MesureIndicateurRepositoryPrisma.tsBackEnd/src/Modules/Pilotage/infrastructure/repositories/prisma/ActiviteRepositoryPrisma.tsBackEnd/src/Modules/Pilotage/application/usecases/CreerIndicateurUseCase.tsBackEnd/src/Modules/Pilotage/application/usecases/ModifierIndicateurUseCase.tsBackEnd/src/Modules/Pilotage/application/usecases/SaisirMesureUseCase.tsBackEnd/src/Modules/Pilotage/application/usecases/SaisirMesuresParActiviteUseCase.ts
Modifiés (frontend)¶
FrontEnd/src/Modules/pilotage/application/dto/dtos.tsFrontEnd/src/Modules/pilotage/presentation/pages/PilotagePage.tsx