docs(phase15): document Pronote revalidation

This commit is contained in:
root 2026-08-22 23:26:02 +00:00
parent 90de40e227
commit 5b40037d33
6 changed files with 149 additions and 0 deletions

View file

@ -518,3 +518,12 @@ faux échec ultérieur du smoke stock selon l'ordre d'exécution. Le test restau
maintenant le lien dans un bloc `finally` (`933f0a5`). La suite ciblée passe
22/22 et la suite complète ne conserve plus que l'échec historique GMAO
lookback hors périmètre et son erreur de teardown.
## Phase 1.5 — anomalies revalidées
- Aucun nouveau bug bloquant observé sur la copie locale.
- L'ancien bouton d'import Pronote « non implémenté » est raccordé au
planning interne ; les erreurs de récupération sont gérées sans vider les
créneaux connus.
- Responsive/accessibilité visuels restent à confirmer avec un navigateur
instrumenté avant VM distante.

View file

@ -138,3 +138,9 @@ de déplacement ; aucune donnée antérieure ni `alban` n'a été supprimée.
conservé pour inspection manuelle.
- Les tests automatisés créent des objets préfixés `Phase1` dans leur base de
test isolée ; aucune donnée `TEST_UI_*` existante n'a été nettoyée.
## Données ajoutées — Phase 1.5 locale — 22/08/2026
- Créneau `TEST_UI_PLANNING_PROTECTED`, salle `TEST_UI_CLASSE_101`, semaine du
07/09/2026, vendredi 14:0016:00, réunion exceptionnelle manuelle avec
protection contre les mises à jour Pronote. Donnée conservée pour inspection.

View file

@ -0,0 +1,102 @@
# Phase 1.5 — raccord Pronote et revalidation des fondations
Date : 22 août 2026
Base : copie locale MariaDB issue de la VM
Version conservée : `0.1.0-dev.5`
Commit de départ : `e006f4f`
## Baseline
- Working tree propre au démarrage.
- Docker : `gmao-flask:0.1.0-dev.5`, MariaDB et Adminer sains.
- `/health/` : HTTP 200, base connectée, Pronote/watchdogs non configurés.
- Migration courante : `g1a2b3c4d5e6`.
- Données `TEST_UI_*` présentes et conservées ; `alban` inchangé.
- Baseline global connue : 125 passed, 1 failed, 1 error ; l'échec et
l'erreur concernent le lookback de configuration GMAO hors périmètre.
## Pipeline Pronote
### Avant
Le client `get_lessons_for_room()` récupérait et normalisait des cours, mais
la page `/pronote/planning/<room_id>` les affichait directement et le bouton
d'import était un simple message « non implémenté ». La disponibilité interne
utilisait déjà `RoomSchedule`, mais aucun raccord réel ne persistait ces
données.
### Après
Le pipeline est désormais :
`Pronote → get_lessons_for_room(strict=True) → normalize_pronote_lessons() → sync_pronote_schedules() → RoomSchedule → active_room_schedules() → disponibilité/planning`
Les identifiants de cours absents sont déterministes (empreinte des attributs
du créneau), les horodatages sont conservés et l'import est limité à la
semaine demandée. Une erreur de récupération n'appelle pas la synchronisation
et conserve donc les dernières données connues.
Pronote ne participe plus au calcul direct de disponibilité. Avec Pronote
désactivé ou non configuré, le planning interne et la saisie manuelle restent
utilisables.
## Règles de synchronisation couvertes
- manuel initial non protégé : supplanté par un Pronote correspondant, sans
doublon actif ;
- horaire Pronote modifié : ancienne ligne manuelle supplantée, nouvelle ligne
Pronote active ;
- manuel protégé : jamais écrasé ; conflit conservé et affiché ;
- rapprochement ambigu : aucune fusion automatique, conflit à valider ;
- créneau absent d'une synchronisation : `disabled`, jamais supprimé ;
- suppression limitée à la semaine synchronisée, sans désactiver les semaines
voisines ;
- panne Pronote : planning et fraîcheur précédents conservés ;
- retour Pronote : `last_synced_at` avancé et lignes réconciliées.
La page de planning interne affiche l'origine en termes métier, la protection
et les conflits. Une action permet de protéger/déprotéger un manuel et de
désactiver un créneau Pronote sans effacer son historique.
## Centre documentaire revalidé
La V1 a été retestée avec documents intervention, équipement et produit/FDS :
agrégation, recherche par titre/fichier/contexte, source/type, pagination,
fichier manquant, chemin hors racine, source inconnue et restriction de
permission source. Aucun fichier n'est copié.
## Tests
- tests Phase 1.5 planning/documents : **7 passed** ;
- suites Phase 1 ciblées (P1, équipements, nettoyage, interventions) :
**26 passed** ;
- tests unitaires de version : passants.
Les contrôles HTTP sur la copie VM locale après rebuild ont donné 200 pour
`/health/`, `/documents/`, `/documents/fds`, `/planning/rooms`,
`/planning/rooms/new`, `/pronote/planning` et `/pronote/planning/2`.
La création réelle du créneau `TEST_UI_PLANNING_PROTECTED` a été vérifiée,
avec protection persistée en base.
## Responsive et accessibilité ciblés
Les nouvelles pages utilisent les composants responsive existants (`table-
responsive`, `table-responsive-stack`), des labels associés aux champs, des
boutons textuels et des messages métier. Aucun navigateur instrumenté n'est
disponible dans cet environnement ; une vérification visuelle manuelle aux
trois tailles demandées reste à effectuer avant déploiement distant.
## Données ajoutées
- `TEST_UI_PLANNING_PROTECTED` dans `TEST_UI_CLASSE_101`, semaine du
07/09/2026, vendredi 14:0016:00, réunion protégée.
Aucune donnée `TEST_UI_*` n'a été supprimée.
## Limitations et hors périmètre
- aucune modification des identifiants/secrets Pronote ;
- aucune Phase 2 (optimisation de journée, solveur, multi-techniciens) ;
- aucune modification alban, watchdog, contexte GMAO, ENT ou Outlook ;
- résolution humaine des conflits uniquement ;
- le test historique lookback GMAO reste volontairement non corrigé.

View file

@ -120,3 +120,8 @@ activement.
| FDS globales | `/documents/fds` | Implémenté, à revalider après rebuild | Produits d'entretien |
| Planning interne des salles | `/planning/rooms` | Implémenté, à revalider après rebuild | Saisie manuelle et créneaux résolus |
| Nouveau créneau salle | `/planning/rooms/new` | Implémenté | Permission planning.edit |
### Phase 1.5 — revalidation locale
| Planning Pronote d'une salle | `/pronote/planning/<id>` | 200 local | Vue interne résolue, provenance et fraîcheur |
| Import Pronote d'une semaine | `/pronote/planning/<id>/import` | Raccordé | Synchronisation contrôlée, protection/conflits |

View file

@ -405,3 +405,22 @@ interdit (configuration GMAO). Aucun nouvel échec lié à cette phase.
Version : `0.1.0-dev.4``0.1.0-dev.5` (commit de version séparé
`676becd`), source de vérité `VERSION` et valeurs Docker/Compose alignées.
## Phase 1.5 — raccord Pronote et revalidation
Baseline : commit `e006f4f`, version `0.1.0-dev.5`, migration
`g1a2b3c4d5e6`, Docker sain et Pronote non configuré. Le pipeline Pronote est
maintenant raccordé à `normalize_pronote_lessons()` puis
`sync_pronote_schedules()` ; la disponibilité et les pages métier ne lisent
que la vue interne `RoomSchedule` résolue.
Cas couverts : relais manuel → Pronote sans doublon, horaire modifié, manuel
protégé et conflit, rapprochement ambigu, suppression limitée à la semaine,
panne/retour Pronote et fraîcheur. Le bouton d'import Pronote persiste enfin
les créneaux normalisés ; une panne conserve les derniers créneaux.
Tests Phase 1.5 : **7 passed** ; suites Phase 1 ciblées : **26 passed**.
Sur la copie locale de la VM, `/health/`, `/documents/`, `/documents/fds`,
`/planning/rooms`, `/planning/rooms/new`, `/pronote/planning` et
`/pronote/planning/2` répondent 200. Le scénario réel
`TEST_UI_PLANNING_PROTECTED` a été créé et conservé.

View file

@ -300,3 +300,11 @@ variantes de planning et la validation sur installation neuve.
également sur la contrainte `gmao_context.user_id NOT NULL`. Aucun nouveau
échec fonctionnel n'a été introduit. La correction d'isolation est dans
`933f0a5`.
## Phase 1.5 — raccord Pronote
Pronote alimente désormais réellement `RoomSchedule` via une normalisation
déterministe et un import explicite par semaine. Pronote désactivé ou en panne
ne vide pas le planning et ne bloque pas la disponibilité interne. Les conflits
protégés, rapprochements ambigus et suppressions distantes sont conservés et
visibles ; aucun nouveau système de planning n'a été créé.