diff --git a/docs/development/DECISIONS_020_DEV3.md b/docs/development/DECISIONS_020_DEV3.md new file mode 100644 index 0000000..80be245 --- /dev/null +++ b/docs/development/DECISIONS_020_DEV3.md @@ -0,0 +1,57 @@ +# Décisions architecturales 0.2.0-dev.3 + +Les décisions sont ajoutées au fil des checkpoints. Les modèles existants sont privilégiés avant toute nouvelle table. + +## D-000 — Checkpoints indépendants + +**CONTEXTE** : le chantier couvre plusieurs domaines avec migrations et risques différents. + +**OPTIONS ÉTUDIÉES** : un gros développement continu ; checkpoints commitables. + +**CHOIX** : checkpoints A à E, chacun documenté, testé et versionné. + +**JUSTIFICATION** : reprise fiable, absence de régression masquée, dépôt source de vérité. + +**CONSÉQUENCES** : aucun checkpoint suivant ne démarre avant validation du précédent. + +**DATE/COMMIT** : 2026-08-23 / initialisation. + +## D-001 — Service de création Equipment + +**CONTEXTE** : les routes fiche avancée et wizard construisaient des objets différents et le wizard retrouvait ensuite des équipements par nom. + +**OPTIONS ÉTUDIÉES** : conserver les routes indépendantes ; centraliser la construction dans un service. + +**CHOIX** : `core.services.equipment_creation.create_equipment`, lot et catégorie facultatifs, retour de l'instance persistée. + +**JUSTIFICATION** : évite les collisions de noms et garantit la même gestion de quantité, parent, localisation et génération préventive. + +**CONSÉQUENCES** : les anciens parcours sont progressivement migrés ; les relations techniques restent hors `parent_id`. + +**DATE/COMMIT** : 2026-08-23 / checkpoint A en cours. + +## D-003 — Catégorie et lot facultatifs + +**CONTEXTE** : un inventaire peut être saisi avant que le référentiel de maintenance soit complet. + +**OPTIONS ÉTUDIÉES** : bloquer toute création sans lot ; accepter un équipement incomplet et le compléter plus tard. + +**CHOIX** : la création reste valide sans lot (et sans catégorie dans les parcours wizard) ; un lot fourni est validé et peut déclencher la génération préventive. + +**JUSTIFICATION** : respecter le principe de configuration progressive sans fabriquer de maintenance implicite. + +**CONSÉQUENCES** : l'interface doit pouvoir signaler ultérieurement « Lot non renseigné » ; les relations techniques restent indépendantes. + +**DATE/COMMIT** : 2026-08-23 / checkpoint A. + +## D-002 — Durée d'intervention inconnue + +**CONTEXTE** : `Intervention.effective_estimated_duration` retournait silencieusement 60 minutes. + +**CHOIX** : retourner 0 si aucune estimation ou moyenne historique n'existe ; DayPlanner affiche alors une tâche sans durée à renseigner. + +**JUSTIFICATION** : ne pas présenter une estimation arbitraire comme une contrainte métier. + +**CONSÉQUENCES** : les statistiques historiques restent inchangées ; les workflows doivent renseigner les interventions planifiables. + +**DATE/COMMIT** : 2026-08-23 / checkpoint A en cours. diff --git a/docs/development/ROADMAP_020_DEV3.md b/docs/development/ROADMAP_020_DEV3.md new file mode 100644 index 0000000..8b0b1a0 --- /dev/null +++ b/docs/development/ROADMAP_020_DEV3.md @@ -0,0 +1,81 @@ +# Roadmap 0.2.0-dev.3 + +## Objectif + +Faire évoluer la GMAO par checkpoints indépendants, reprenables et testables, depuis la consolidation de la création d'équipements jusqu'aux compteurs, au graphe technique et à la page « À documenter ». + +## État initial + +- Version : 0.1.0-dev.12 +- Migration : j5e6f7a8b9c0 +- Docker local : gmao-college:0.1.0-dev.12 +- Pytest baseline : 159 passed, 1 failed, 1 error (lookback GMAO historique) +- Benchmark 100 équipements : 214 requêtes après optimisation, génération 3,22 s. + +## Protections + +Alban, watchdogs, ENT, Outlook, Pronote, Yeastar, IA, secrets, données TEST_UI_* et Ancien menu 76/76 doivent rester inchangés sauf nécessité démontrée. + +## Checkpoints + +### A — Fondations équipements → 0.2.0-dev.1 + +- [x] service métier unique de création Equipment ; +- [x] lot facultatif et équipement incomplet accepté ; +- [x] création quantitative/individuelle/groupe/parent homogène ; +- [x] suppression des recherches par nom dans les nouveaux workflows ; +- [x] audit du fallback Intervention 60 minutes ; +- [x] validation des parcours et génération préventive ; +- [x] tests ciblés et pytest complet sans nouvelle régression ; +- [ ] version 0.2.0-dev.1 commitée séparément. + +### B — Patrimoine, profils, setup → après A + +- [ ] décision RoomType enrichi ou RoomProfile ; +- [ ] profils de locaux et propositions d'équipements ; +- [ ] ouvrages facultatifs ; +- [ ] création en masse et duplication ; +- [ ] setup Essentiel/Maintenance/Avancé ; +- [ ] logements intégrés avec HousingUnit ; +- [ ] charge 200 locaux. + +### C — Compteurs, consommations, contrats → 0.2.0-dev.2 + +- [ ] Meter/MeterReading réutilisés ; +- [ ] périmètre générique et calendrier scolaire ; +- [ ] relevés dans Ma journée ; +- [ ] consommation normalisée et alertes ; +- [ ] quotas globaux photocopieurs ; +- [ ] tests ciblés, complets, migration et version. + +### D — Graphe technique générique + +- [ ] décision et migration non destructive ; +- [ ] relations techniques génériques ; +- [ ] cascades électricité/eau/gaz/CVC/SSI/informatique ; +- [ ] points de coupure progressifs. + +### E — Exploitation / complétude → 0.2.0-dev.3 + +- [ ] page Patrimoine → À documenter ; +- [ ] navigation des relations ; +- [ ] intégration Centre documentaire ; +- [ ] compteur en retard et anomalies visibles ; +- [ ] benchmark final ; +- [ ] version 0.2.0-dev.3 uniquement si tous les critères sont démontrés. + +## Migrations prévues + +Uniquement Alembic, non destructives, testées sur installation existante et neuve. Chaque checkpoint décide ses tables après audit des modèles existants. + +## Risques / dépendances + +- workflows historiques multiples pour Equipment ; +- données de test locales non équivalentes à une validation UI ; +- absence éventuelle de compte fonctionnel de validation ; +- coût N+1 des périmètres et des graphes ; +- règles contractuelles de quotas et calendrier. + +## Définition de DONE + +Un checkpoint est DONE quand son code, sa migration éventuelle, ses tests ciblés, le pytest complet, sa documentation, son statut et ses commits sont cohérents et poussés sur origin/main et audit/main. diff --git a/docs/development/STATUS_020_DEV3.md b/docs/development/STATUS_020_DEV3.md new file mode 100644 index 0000000..669f2bf --- /dev/null +++ b/docs/development/STATUS_020_DEV3.md @@ -0,0 +1,38 @@ +CURRENT VERSION: 0.1.0-dev.12 +CURRENT CHECKPOINT: A — validation technique terminée, version à taguer +CURRENT COMMIT: 2fa13d4 (fonctionnel non encore commité) +CURRENT MIGRATION: j5e6f7a8b9c0 +DOCKER VERSION: gmao-college:0.1.0-dev.12 (healthy) +LAST FULL TEST: 161 passed, 1 failed, 1 error en 198,60 s — uniquement lookback/configuration GMAO historique et son teardown +LAST TARGETED TEST: 28 passed (service Equipment, maintenance engine, scope, DayPlanner) +BLOCKERS: Aucun nouveau défaut ; les deux erreurs historiques restent autorisées +NEXT ACTION: Commiter le code du checkpoint A, puis versionner 0.2.0-dev.1 et reconstruire Docker + +## Avancement + +- [x] mémoire de chantier créée ; +- [x] baseline Git/Docker/version vérifié ; +- [x] service commun introduit pour les routes fiche et wizard ; +- [x] lot facultatif accepté par les routes wizard ; +- [x] suppression de la recherche par nom dans le wizard ; +- [x] fallback Intervention 60 minutes supprimé ; +- [x] tests ciblés A (28 passants) ; +- [x] audit A1-A7 ; +- [ ] checkpoint A commit/version ; +- [ ] checkpoint B ; +- [ ] checkpoint C ; +- [ ] checkpoint D ; +- [ ] checkpoint E. + +## Reprise + +Lire ROADMAP_020_DEV3.md et DECISIONS_020_DEV3.md, puis reprendre sur NEXT ACTION. Ne pas commencer B avant clôture documentée de A. + +## Détail checkpoint A + +- Le service `core.services.equipment_creation.create_equipment` est utilisé par la fiche Equipment et les deux parcours wizard. +- Catégorie et lot sont facultatifs dans les créations wizard ; une catégorie/lot explicitement invalide reste rejeté. +- Les instances créées sont conservées en mémoire ; aucune recherche post-création par nom n'est effectuée. +- Le fallback silencieux de 60 minutes des interventions est remplacé par une durée inconnue (`0`) quand aucune estimation n'est disponible. +- Les nouveaux tests unitaires couvrent l'équipement sans lot et les noms dupliqués. +- Le test historique `test_gmao_config_caps_lookback_at_one_year` échoue encore (plafond 9000 au lieu de 8760) et son teardown échoue sur `gmao_context.user_id` NULL ; aucune nouvelle régression observée.