gmao/docs/development/STATUS_020_DEV3.md
root 254018d132
Some checks are pending
CI - Tests et Syntax / lint-and-test (push) Waiting to run
test(c4): complete contract and consumable coverage
2026-08-24 18:17:27 +00:00

189 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

CURRENT VERSION: 0.2.0-dev.2
CURRENT CHECKPOINT: C4 — contrats photocopieurs et consommables
CURRENT COMMIT: 0767d8a — docs(development): document checkpoint C4 foundation
CURRENT MIGRATION: s4g5h6i7j8k9 (down_revision r3f4g5h6i7j8)
DOCKER VERSION: gmao-college:0.2.0-dev.2 (reconstruite, healthy, MariaDB connectée)
LAST FULL TEST: baseline précédente 202 passed, 1 failed, 1 error ; les deux anomalies historiques restent visibles
LAST TARGETED TEST: 46 passed (C1/C2/C3/C4) ; 7 tests C4, dont instrumentation performance
BLOCKERS: validation responsive visuelle et base vide non exécutées ; anomalies pytest historiques conservées
NEXT ACTION: compléter la couverture C4, tester Docker puis revue indépendante ; ne pas bump la version
## C4 — contrats photocopieurs, quotas et consommables
- [x] photocopieurs et imprimantes restent des `Equipment`, avec type d'appareil, S/N, IP, hostname et MAC facultatifs ;
- [x] contrats pluriannuels, date globale, date de début des quotas et anniversaire configurable ;
- [x] périodes annuelles de quota, quotas N&B/couleur facultatifs et association machine datée ;
- [x] remplacement de machine dans le même contrat avec historique et motif ;
- [x] consommation contractuelle séparée N&B/couleur et projection simple selon les jours scolaires ;
- [x] alerte de dépassement quota dédupliquée ;
- [x] références `Consumable` partagées entre plusieurs machines, stock global, cible de stock et quantité à commander ;
- [x] commandes, réceptions partielles/complètes, sorties via `ConsumableUsage` et durée par couple machine/référence ;
- [x] migration additive `s4g5h6i7j8k9`, appliquée sur la base existante, données stock existantes conservées ;
- [x] instrumentation C4 : calcul contrat 11 SQL / 0,110 s ; détail contrat 98 SQL / 1,052 s ; détail consommable 4 SQL / 0,111 s ;
- [ ] couverture HTTP/mobile complète, base vide et validation Playwright ;
- [ ] C4 complètement validé indépendamment.
## C3 — socle analytique
- [x] intervalles calculés à partir de deux `MeterReading` bruts, avec rupture explicite sur reset/baisse et frontières de compteur remplacé ;
- [x] contexte calendrier réutilisant `CollegeClosure`/`PlanningService`, logements hors calendrier scolaire par défaut ;
- [x] régimes datés `NORMAL`/`REDUCED`/`STOP` par compteur et réseau ;
- [x] reste parent/sous-compteurs avec qualités `EXACT`, `ESTIMATED`, `PARTIAL` ;
- [x] règles et alertes persistées, niveaux WARNING/CRITICAL, médiane et déduplication des alertes ouvertes ;
- [x] conversions gaz datées, priorité manuelle, tarifs facultatifs et coût informatif au tarif du relevé final ;
- [x] tableau de surveillance et fiche analytique ;
- [x] agrégations DAY/WEEK/MONTH, seuil décart, minimum comparable et zero/low ;
- [x] preuves idempotentes et exclusions baseline pour fuite/erreur de relevé ;
- [x] conversion gaz issue de facture et règle eau m³ sans conversion kWh ;
- [x] alertes informatives dans Ma journée et graphiques locaux responsives ;
- [x] recalcul ciblé automatique après nouveau relevé et correction auditée ; preuves obsolètes neutralisées sans effacer l'historique clôturé ;
- [x] anomalies statistiques branchées automatiquement avec distinction explicite `MANUAL_THRESHOLD` / `STATISTICAL_ANOMALY` ;
- [x] clôture HTTP RBAC, visibilité filtrée dans Ma journée et création d'intervention idempotente ;
- [x] dashboard 30 jours avec données insuffisantes et synthèses séparées eau/gaz/électricité ;
- [x] migration `q2f3g4h5i6j7` appliquée ; migration additive `r3f4g5h6i7j8` préparée ;
- [x] mesures C3-CLOSE sur `TEST_UI_C3_PERF_*` : dashboard 83 requêtes, fiche 24, évaluation 4, Ma journée 86 ; temps variables selon MariaDB ;
- [ ] validation Playwright/base vide non effectuée ;
- [ ] C4 non commencé.
## C2 — état et limites
- [x] règles hebdomadaire, mensuelle, semestrielle, annuelle et date annuelle fixe ;
- [x] occurrences idempotentes à horizon borné, retard persistant et traitement avec/sans relevé ;
- [x] intégration dans `DayPlanner`/« Ma journée » avec responsable et durée ;
- [x] tournées ordonnées, occurrences de tournée et progression ;
- [x] migration `o0d1e2f3g4h5` appliquée sur la base existante ;
- [x] tests C2 ciblés et absence de nouvelle régression dans le pytest complet ;
- [ ] validation sur base vide non effectuée ;
- [ ] validation Playwright authentifiée desktop/tablette/mobile non effectuée ;
- [ ] mesure de référence avant C2-FIX : `Ma journée` 199 requêtes / 4,8439 s ; tournée 88 requêtes / 0,6140 s ;
- [x] C3 terminé fonctionnellement sous réserve de revue indépendante ; [ ] C4 non commencé.
## C2-FIX — fiabilisation
- [x] une tournée génère les occurrences selon `operational_date`, y compris lorsque `target_date` est ultérieure ;
- [x] priorité d'affectation : règle de compteur, responsable par défaut de tournée, puis non attribué ;
- [x] isolation utilisateurs, double traitement et progression/reprise testés ;
- [x] génération batchée des occurrences existantes et cache des calculs horaires/calendrier ;
- [x] mesure après C2-FIX : Ma journée 183 requêtes ; tournée 89 requêtes ; temps variable selon la charge MariaDB (mesures observées respectivement 1,22852,9419 s et 0,36990,7112 s) ;
- [ ] la majorité des requêtes restantes provient de l'autorisation/navigation globale ; la tournée reste à une requête de la référence SQL ;
- [ ] collision réellement concurrente non simulée ; la contrainte unique `(schedule_id, target_date)` reste la protection DB ;
- [ ] validation Playwright et base vide toujours non effectuées.
## 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 ;
- [x] checkpoint A commit/version ;
- [x] 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.
## Après versionnement A
- Version applicative : `0.2.0-dev.1`.
- La version est mise à jour dans `VERSION`, dans les valeurs par défaut de `docker-compose.yml` et dans le test de version.
- Le checkpoint B n'est pas commencé ; aucune migration nouvelle n'a été créée.
- Docker doit être reconstruit avec `GMAO_VERSION=0.2.0-dev.1` avant toute validation UI de cette version.
- Reconstruction effectuée : image `gmao-college:0.2.0-dev.1`, migrations lancées au démarrage, `/health/` retourne `healthy`, version `0.2.0-dev.1`, MariaDB connectée.
- Le compose signale encore `health: starting` pendant sa fenêtre initiale ; l'endpoint applicatif est déjà sain.
- Aucun fichier non commité après le commit de statut suivant.
## Reprise checkpoint B
- [x] exigences Centre de configuration permanent ajoutées à la roadmap ;
- [x] configuration progressive et intégrations facultatives documentées ;
- [x] horaires technicien explicitement rattachés à l'utilisateur et absence de fallback rappelée ;
- [x] hiérarchie Site → Building → Zone → Room et HousingUnit documentée ;
- [x] non-régression TaskExecutionSegment/interruption documentée ;
- [x] exigences détaillées des checkpoints C, D et E ajoutées à la roadmap sans les commencer ;
- [ ] audit B1 des modèles et parcours ;
- [ ] décision RoomType enrichi ou RoomProfile ;
- [x] décision documentée : RoomProfile séparé de RoomType ;
- [x] migration B écrite : k6f7a8b9c0d1 puis l7a8b9c0d1e2 ;
- [x] implémentation initiale des profils, propositions, surfaces et Centre de configuration ;
- [x] association facultative d'un profil aux locaux et sélection dans le bulk ;
- [x] tests ciblés B et pytest complet sans nouvelle régression ;
- [x] rebuild Docker dev.2, application des migrations et `/health/` healthy ;
- [x] validation HTTP authentifiée des profils : création UI, preview, application, réapplication, modification sans mutation ;
- [x] validation HTTP authentifiée des horaires de deux techniciens ;
- [x] Centre de configuration rendu et liens principaux vérifiés ;
- [x] charge 200 locaux ;
- [ ] validation responsive visuelle avec compte admin local (non bloquante, limitation documentée) ;
- [x] checkpoint B validé et version `0.2.0-dev.2`.
## Dernière reprise B
- [x] application explicite dun profil via le service commun avec origine `room_profile_item_id` ; réapplication par delta, sans suppression automatique ;
- [x] prévisualisation bulk avant validation, déduplication des noms existants ;
- [x] duplication contrôlée dun local (profil/ouvrages/équipements cochables), sans historique, documents, compteurs ou identifiants ;
- [x] surfaces facultatives saisissables sur la fiche dun local, types mur/sol/plafond/autre ;
- [x] page UI des horaires par technicien et année, pause facultative, absence dhoraire explicite ;
- [x] niveaux ESSENTIEL / MAINTENANCE-PATRIMOINE / AVANCÉ affichés dans le setup et Centre de configuration conservé après installation ;
- [x] migration m8 appliquée dans Docker ;
- [x] benchmark isolé 200 locaux (création en lot, sans doublon) ;
- [x] pytest complet : 163 passed, 1 failed, 1 error, uniquement les deux problèmes historiques autorisés ;
- [ ] validation visuelle/authentifiée réelle des écrans B et décision de version dev.2.
## Mesures et limites de reprise
- Docker reconstruit avec `GMAO_VERSION=0.2.0-dev.2`; `/health/` : healthy, MariaDB connectée, version `0.2.0-dev.2`; migration `m8b9c0d1e2f3`.
- Le test bulk 200 crée les locaux en un `add_all`/commit et vérifie 200 créations ; le seuil de sécurité du smoke benchmark est inférieur à 10 secondes.
- Chromium Playwright est installé (`~/.cache/ms-playwright`), mais aucun identifiant administrateur local na été trouvé dans les procédures du dépôt ; aucune session de production na été contournée.
- Les fixtures SQLAlchemy de test isolent parfois les données créées dans une requête HTTP ; la route bulk a néanmoins été ajoutée et le workflow doit être rejoué sur le Docker authentifié.
- La version `0.2.0-dev.2` est retenue : les workflows sont démontrés par tests HTTP authentifiés et aucune nouvelle régression nest apparue ; la validation visuelle reste une limitation explicitement documentée.
- Le Centre de configuration a été corrigé pour les contrats (utilisation des colonnes ORM réelles) et les liens profils/bulk/horaires ont été ajoutés au nouveau menu.
## Checkpoint C1 — socle compteurs et relevés
- [x] audit des modèles `Meter` / `MeterReading`, routes historiques et templates ;
- [x] création unifiée des compteurs par service ;
- [x] rattachement direct à Equipment, Building, Zone, Room ou HousingUnit ;
- [x] plusieurs racines et hiérarchie `Meter.parent_id`, avec protection contre les cycles ;
- [x] service unique `core.services.meter_service.record_meter_reading` pour les routes de relevé ;
- [x] baisse refusée sans remise à zéro explicite et motif ;
- [x] corrections auditées dans `meter_reading_corrections` ;
- [x] remplacement explicite avec conservation de l'ancien compteur et de son historique ;
- [x] photo facultative rattachée à `MeterReading` ;
- [x] migration `n9c0d1e2f3g4` appliquée ;
- [x] mesure SQL : liste 75 requêtes dans le contexte applicatif complet (navigation incluse), détail + historique 2 requêtes après chargement explicite ;
- [x] C1-FIX : parent modifiable, statut physique séparé, remplacement/prédécesseur affichés, types usuels et historiques préservés ;
- [x] C1-FIX : tests HTTP ciblés ;
- [x] C1-FIX : documentation finale et clarification de la topologie Forgejo/GitHub principal ;
- [x] C1-CLOSE : relevés bloqués sur compteur remplacé/inactif, historique et corrections conservés ;
- [x] C1-CLOSE : aucune migration supplémentaire ;
- [ ] C2, C3 et C4 non commencés ;
- [ ] validation Playwright visuelle complète non exécutée ;
- [ ] installation complète sur base vide non validée : l'utilisateur MariaDB applicatif n'a pas le privilège de création de base temporaire.
La version reste `0.2.0-dev.2`. Les seuils historiques de compteur ne sont pas réutilisés pour les alertes de consommation futures.
## C4-COMPLETE — état de travail
- [x] estimation réelle d'une consommation manquante au début d'une période contractuelle et qualité globale `EXACT`/`ESTIMATED`/`PARTIAL` ;
- [x] rôle contractuel explicite des compteurs (`COPIER_BW`/`COPIER_COLOR`/`NONE`) ;
- [x] clôture métier des contrats, périodes futures neutralisées et associations clôturées ;
- [x] annulation auditée des commandes non entièrement reçues, sans diminution du stock reçu ;
- [x] agrégation de plusieurs commandes ouvertes et couverture de stock multi-machines ;
- [x] alertes quota/stock informatives dans « Ma journée », sans durée automatique ;
- [x] migration additive `t5h6i7j8k9l0` ;
- [ ] validation base vide, validation Playwright et revue indépendante finale.