Documente le réaudit et complète la navigation

This commit is contained in:
root 2026-08-14 22:13:37 +00:00
parent 8f276b5c47
commit 03e0c114f7
3 changed files with 292 additions and 0 deletions

View file

@ -143,6 +143,7 @@
<ul class="dropdown-menu dropdown-menu-end"> <ul class="dropdown-menu dropdown-menu-end">
<li><span class="dropdown-item-text small text-muted">{{ current_user.role_label }}</span></li> <li><span class="dropdown-item-text small text-muted">{{ current_user.role_label }}</span></li>
<li><hr class="dropdown-divider"></li> <li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="{{ url_for('auth.profile') }}"><i class="bi bi-person-vcard"></i> Mon profil</a></li>
<li><a class="dropdown-item" href="{{ url_for('auth.change_own_password') }}"><i class="bi bi-key"></i> Changer mon mot de passe</a></li> <li><a class="dropdown-item" href="{{ url_for('auth.change_own_password') }}"><i class="bi bi-key"></i> Changer mon mot de passe</a></li>
<li><hr class="dropdown-divider"></li> <li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="{{ url_for('auth.logout') }}"><i class="bi bi-box-arrow-right"></i> Déconnexion</a></li> <li><a class="dropdown-item" href="{{ url_for('auth.logout') }}"><i class="bi bi-box-arrow-right"></i> Déconnexion</a></li>
@ -211,6 +212,7 @@
<li><a class="dropdown-item" href="{{ url_for('equipments.categories') }}"><i class="bi bi-tags"></i> Catégories</a></li> <li><a class="dropdown-item" href="{{ url_for('equipments.categories') }}"><i class="bi bi-tags"></i> Catégories</a></li>
<li><hr class="dropdown-divider" style="border-color:rgba(255,255,255,0.15)"></li> <li><hr class="dropdown-divider" style="border-color:rgba(255,255,255,0.15)"></li>
<li><a class="dropdown-item" href="{{ url_for('buildings.index') }}"><i class="bi bi-buildings"></i> Bâtiments</a></li> <li><a class="dropdown-item" href="{{ url_for('buildings.index') }}"><i class="bi bi-buildings"></i> Bâtiments</a></li>
<li><a class="dropdown-item" href="{{ url_for('zones.index') }}"><i class="bi bi-diagram-3"></i> Zones</a></li>
<li><a class="dropdown-item" href="{{ url_for('rooms.index') }}"><i class="bi bi-door-open"></i> Salles</a></li> <li><a class="dropdown-item" href="{{ url_for('rooms.index') }}"><i class="bi bi-door-open"></i> Salles</a></li>
<li><a class="dropdown-item" href="{{ url_for('housing.index') }}"><i class="bi bi-house-door"></i> Logements de fonction</a></li> <li><a class="dropdown-item" href="{{ url_for('housing.index') }}"><i class="bi bi-house-door"></i> Logements de fonction</a></li>
<li><a class="dropdown-item" href="{{ url_for('room_types.index') }}"><i class="bi bi-tags"></i> Types de salles</a></li> <li><a class="dropdown-item" href="{{ url_for('room_types.index') }}"><i class="bi bi-tags"></i> Types de salles</a></li>
@ -220,6 +222,7 @@
<li><a class="dropdown-item" href="{{ url_for('lots.index') }}"><i class="bi bi-boxes"></i> Lots</a></li> <li><a class="dropdown-item" href="{{ url_for('lots.index') }}"><i class="bi bi-boxes"></i> Lots</a></li>
<li><a class="dropdown-item" href="{{ url_for('services.index') }}"><i class="bi bi-building-gear"></i> Services</a></li> <li><a class="dropdown-item" href="{{ url_for('services.index') }}"><i class="bi bi-building-gear"></i> Services</a></li>
<li><a class="dropdown-item" href="{{ url_for('parts.index') }}"><i class="bi bi-box-seam"></i> Pièces</a></li> <li><a class="dropdown-item" href="{{ url_for('parts.index') }}"><i class="bi bi-box-seam"></i> Pièces</a></li>
<li><a class="dropdown-item" href="{{ url_for('meters.index') }}"><i class="bi bi-graph-up-arrow"></i> Historique des compteurs</a></li>
<li><hr class="dropdown-divider" style="border-color:rgba(255,255,255,0.15)"></li> <li><hr class="dropdown-divider" style="border-color:rgba(255,255,255,0.15)"></li>
<li><a class="dropdown-item" href="{{ url_for('equipments.to_trash') }}"><i class="bi bi-trash"></i> À jeter</a></li> <li><a class="dropdown-item" href="{{ url_for('equipments.to_trash') }}"><i class="bi bi-trash"></i> À jeter</a></li>
<li><a class="dropdown-item" href="{{ url_for('equipments.trashed') }}"><i class="bi bi-archive"></i> Anciens</a></li> <li><a class="dropdown-item" href="{{ url_for('equipments.trashed') }}"><i class="bi bi-archive"></i> Anciens</a></li>
@ -238,15 +241,23 @@
<li><a class="dropdown-item" href="{{ url_for('constraints.index') }}"><i class="bi bi-shield-exclamation"></i> Contraintes de zone</a></li> <li><a class="dropdown-item" href="{{ url_for('constraints.index') }}"><i class="bi bi-shield-exclamation"></i> Contraintes de zone</a></li>
<li><hr class="dropdown-divider" style="border-color:rgba(255,255,255,0.15)"></li> <li><hr class="dropdown-divider" style="border-color:rgba(255,255,255,0.15)"></li>
<li><a class="dropdown-item" href="{{ url_for('outlook_pages.index') }}"><i class="bi bi-envelope-at"></i> Comptes Outlook</a></li> <li><a class="dropdown-item" href="{{ url_for('outlook_pages.index') }}"><i class="bi bi-envelope-at"></i> Comptes Outlook</a></li>
<li><a class="dropdown-item" href="{{ url_for('outlook_pages.add_account') }}"><i class="bi bi-person-plus"></i> Ajouter un compte Outlook</a></li>
<li><a class="dropdown-item" href="{{ url_for('outlook_dashboard.processed_folders_config') }}"><i class="bi bi-folder-check"></i> Dossiers Outlook surveillés</a></li>
<li><a class="dropdown-item" href="{{ url_for('ent.index') }}"><i class="bi bi-broadcast"></i> ENT77</a></li> <li><a class="dropdown-item" href="{{ url_for('ent.index') }}"><i class="bi bi-broadcast"></i> ENT77</a></li>
<li><a class="dropdown-item" href="{{ url_for('ent.messages') }}"><i class="bi bi-inbox"></i> Messages ENT</a></li>
<li><a class="dropdown-item" href="{{ url_for('ent.interpretations') }}"><i class="bi bi-stars"></i> Interprétations ENT</a></li>
<li><a class="dropdown-item" href="{{ url_for('ent.staff') }}"><i class="bi bi-people"></i> Personnels ENT</a></li> <li><a class="dropdown-item" href="{{ url_for('ent.staff') }}"><i class="bi bi-people"></i> Personnels ENT</a></li>
<li><hr class="dropdown-divider" style="border-color:rgba(255,255,255,0.15)"></li> <li><hr class="dropdown-divider" style="border-color:rgba(255,255,255,0.15)"></li>
<li><a class="dropdown-item" href="{{ url_for('pronote.connect') }}"><i class="bi bi-qr-code"></i> PRONOTE (QR)</a></li> <li><a class="dropdown-item" href="{{ url_for('pronote.connect') }}"><i class="bi bi-qr-code"></i> PRONOTE (QR)</a></li>
<li><form method="post" action="{{ url_for('pronote.sync_salles') }}"><button class="dropdown-item" type="submit"><i class="bi bi-download"></i> PRONOTE (sync salles)</button></form></li> <li><form method="post" action="{{ url_for('pronote.sync_salles') }}"><button class="dropdown-item" type="submit"><i class="bi bi-download"></i> PRONOTE (sync salles)</button></form></li>
<li><a class="dropdown-item" href="{{ url_for('pronote.planning') }}"><i class="bi bi-calendar3"></i> PRONOTE (plannings)</a></li> <li><a class="dropdown-item" href="{{ url_for('pronote.planning') }}"><i class="bi bi-calendar3"></i> PRONOTE (plannings)</a></li>
<li><a class="dropdown-item" href="{{ url_for('pronote.rooms') }}"><i class="bi bi-door-open"></i> Salles PRONOTE</a></li>
<li><a class="dropdown-item" href="{{ url_for('pronote.personnels') }}"><i class="bi bi-person-badge"></i> Personnels PRONOTE</a></li>
<li><a class="dropdown-item" href="{{ url_for('pronote.professeurs') }}"><i class="bi bi-person-workspace"></i> Professeurs PRONOTE</a></li>
<li><hr class="dropdown-divider" style="border-color:rgba(255,255,255,0.15)"></li> <li><hr class="dropdown-divider" style="border-color:rgba(255,255,255,0.15)"></li>
<li><a class="dropdown-item" href="{{ url_for('yeastar.index') }}"><i class="bi bi-telephone"></i> Téléphone P520</a></li> <li><a class="dropdown-item" href="{{ url_for('yeastar.index') }}"><i class="bi bi-telephone"></i> Téléphone P520</a></li>
<li><a class="dropdown-item" href="{{ url_for('yeastar.config_page') }}"><i class="bi bi-telephone-gear"></i> Config téléphone</a></li> <li><a class="dropdown-item" href="{{ url_for('yeastar.config_page') }}"><i class="bi bi-telephone-gear"></i> Config téléphone</a></li>
<li><a class="dropdown-item" href="{{ url_for('yeastar.dnd_config_page') }}"><i class="bi bi-bell-slash"></i> Watchdog DND</a></li>
<li><hr class="dropdown-divider" style="border-color:rgba(255,255,255,0.15)"></li> <li><hr class="dropdown-divider" style="border-color:rgba(255,255,255,0.15)"></li>
<li><a class="dropdown-item" href="{{ url_for('status.index') }}"><i class="bi bi-activity"></i> Status système</a></li> <li><a class="dropdown-item" href="{{ url_for('status.index') }}"><i class="bi bi-activity"></i> Status système</a></li>
<li><a class="dropdown-item" href="{{ url_for('logs.index') }}"><i class="bi bi-journal-text"></i> Logs watchdogs</a></li> <li><a class="dropdown-item" href="{{ url_for('logs.index') }}"><i class="bi bi-journal-text"></i> Logs watchdogs</a></li>
@ -261,9 +272,17 @@
<!-- Mobile : liens config à plat --> <!-- Mobile : liens config à plat -->
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('gmao_config.index') }}"><i class="bi bi-gear"></i> Contexte GMAO</a></li> <li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('gmao_config.index') }}"><i class="bi bi-gear"></i> Contexte GMAO</a></li>
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('outlook_pages.index') }}"><i class="bi bi-envelope-at"></i> Outlook</a></li> <li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('outlook_pages.index') }}"><i class="bi bi-envelope-at"></i> Outlook</a></li>
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('outlook_dashboard.processed_folders_config') }}"><i class="bi bi-folder-check"></i> Dossiers Outlook</a></li>
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('ent.index') }}"><i class="bi bi-broadcast"></i> ENT77</a></li> <li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('ent.index') }}"><i class="bi bi-broadcast"></i> ENT77</a></li>
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('ent.messages') }}"><i class="bi bi-inbox"></i> Messages ENT</a></li>
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('ent.interpretations') }}"><i class="bi bi-stars"></i> Interprétations ENT</a></li>
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('pronote.connect') }}"><i class="bi bi-qr-code"></i> PRONOTE</a></li> <li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('pronote.connect') }}"><i class="bi bi-qr-code"></i> PRONOTE</a></li>
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('pronote.rooms') }}"><i class="bi bi-door-open"></i> Salles PRONOTE</a></li>
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('pronote.personnels') }}"><i class="bi bi-person-badge"></i> Personnels PRONOTE</a></li>
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('pronote.professeurs') }}"><i class="bi bi-person-workspace"></i> Professeurs PRONOTE</a></li>
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('yeastar.index') }}"><i class="bi bi-telephone"></i> Téléphone</a></li> <li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('yeastar.index') }}"><i class="bi bi-telephone"></i> Téléphone</a></li>
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('yeastar.config_page') }}"><i class="bi bi-telephone-gear"></i> Config téléphone</a></li>
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('yeastar.dnd_config_page') }}"><i class="bi bi-bell-slash"></i> Watchdog DND</a></li>
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('status.index') }}"><i class="bi bi-activity"></i> Status</a></li> <li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('status.index') }}"><i class="bi bi-activity"></i> Status</a></li>
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('logs.index') }}"><i class="bi bi-journal-text"></i> Logs</a></li> <li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('logs.index') }}"><i class="bi bi-journal-text"></i> Logs</a></li>
<li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('auth.list_users') }}"><i class="bi bi-people"></i> Utilisateurs</a></li> <li class="nav-item d-lg-none"><a class="nav-link" href="{{ url_for('auth.list_users') }}"><i class="bi bi-people"></i> Utilisateurs</a></li>

269
docs/AUDIT_2026-08-14.md Normal file
View file

@ -0,0 +1,269 @@
# Réaudit fonctionnel, technique et UI
Date : 14 août 2026
État audité : branche `main`, commit `8f276b5`
Périmètre : routes Flask, templates actifs, permissions, données MariaDB,
planification, intégrations, Docker, sauvegardes et tests.
## Verdict
Le projet est utilisable comme environnement de développement et de
démonstration. Il n'est pas encore prêt pour une utilisation réelle au collège.
Les principaux blocages sont la planification préventive incohérente, plusieurs
pages en erreur, les vocabulaires de statuts divergents, le compte de test
`admin/admin`, l'autorisation des documents et une stratégie de restauration
incomplète.
Le dépôt était propre et synchronisé au début de l'audit. L'audit n'a modifié ni
la base ni les données de production.
## Mesures et contrôles
- 319 règles d'URL et 317 endpoints enregistrés ;
- 121 routes GET fixes testées avec un compte administrateur ;
- 67 tests automatisés réussis ;
- 163 appels à `render_template`, pour 138 templates distincts ;
- 15 liens `url_for()` invalides dans les templates actifs ;
- 32 noms de templates dupliqués entre le dossier global et les blueprints ;
- 5 pages fixes reproduisent une erreur ;
- 376 équipements et 470 tâches planifiées dans la base auditée ;
- environ 1,15 Mo de HTML pour la liste des 376 équipements.
## Blocages P0
### Authentification
Le compte de test `admin/admin` est actif. Avant ouverture à d'autres
utilisateurs, il faut supprimer ce mot de passe, imposer un changement au
premier accès, refuser les mots de passe faibles et journaliser les échecs de
connexion.
### Planification préventive
La base contient 330 tâches de lot et 470 échéances, dont 300 placées un
week-end. Les 330 tâches importées sont actuellement classées comme
calendaires. Les règles gel, orage, saison, compteur et événement ne sont donc
pas correctement représentées.
Deux chemins de génération coexistent. Le chemin historique ignore une partie
du calendrier de travail. Le moteur récent traite mieux les déclencheurs mais
ne recalcule pas toujours la prochaine date à partir de la dernière réalisation.
Un seul moteur doit :
- partir de la dernière exécution ;
- respecter périodicité, anticipation et jours travaillés ;
- fermer les vacances scolaires par défaut ;
- accepter les jours exceptionnels avec horaires propres à chaque date ;
- distinguer calendrier, saison, météo, événement et compteur ;
- prévisualiser et réconcilier les échéances avant écriture ;
- empêcher les doublons par une contrainte en base.
### Pages en erreur et navigation
Les routes fixes suivantes ont échoué pendant le test :
- `/admin/room-types/new` : template absent ;
- `/planning/availability/leave/new` : endpoint de retour inexistant ;
- `/room-types/new` : formulaire non transmis au template ;
- `/yeastar/api/extensions` : erreur 500 lorsque Yeastar est absent ;
- `/yeastar/config` : accès incorrect à une configuration vide.
La création d'une tâche préventive référence aussi `LotTask` sans import local,
et les routes de formation construisent des attributs absents de leurs modèles.
### Statuts et tableau de bord
Les équipements présents utilisent notamment `en_service`, `en_panne`,
`en_maintenance`, `hs`, `a_jeter` et `jete`, tandis que certains indicateurs
recherchent encore `actif` ou `panne`. Les totaux du tableau de bord peuvent
donc être faux. L'urgence mélange par endroits le statut et la priorité, et le
stock faible est encore fixé à zéro.
Une énumération unique, une migration des valeurs et des tests de statistiques
sont nécessaires.
### Intégrité des interventions
Une intervention générale sans équipement peut être associée silencieusement
au premier équipement de la base. Une intervention doit pouvoir cibler un
équipement, une salle, une zone, un bâtiment, un logement ou aucun objet
patrimonial, sans attribution artificielle.
Le message Outlook ou ENT à l'origine d'une intervention doit être conservé en
lecture seule au lieu d'être supprimé après conversion.
### API, documents et historique
L'authentification API lit un attribut `api_key` absent du modèle clé/valeur.
Les futures clés doivent être hachées, révocables, expirables, limitées par
permission et auditées.
Le blueprint `documents` n'est pas classé explicitement dans les permissions :
la lecture peut hériter d'un droit trop large tandis que les mutations exigent
un droit système. Les droits doivent venir de l'objet parent. Il faut également
contrôler MIME, contenu, taille, checksum et suppression logique.
Les changements de statut et autres historiques ne sont pas réellement
immuables s'ils sont supprimés en cascade avec l'intervention.
### Sauvegarde et exploitation
La sauvegarde actuelle ne constitue pas encore un plan de reprise : les uploads
et la configuration ne sont pas couverts de bout en bout, il n'y a pas de copie
chiffrée hors machine et aucune restauration régulière n'est vérifiée.
Avant production : reverse proxy HTTPS, cookies sécurisés, sauvegarde complète,
copie hors machine, restauration automatisée de contrôle et supervision des
échecs.
## État fonctionnel des données
| Objet | Nombre |
|---|---:|
| Bâtiments | 7 |
| Zones | 22 |
| Salles | 228 |
| Logements | 0 |
| Catégories | 36 |
| Lots | 91 |
| Équipements | 376 |
| Interventions | 0 |
| Tâches de lot | 330 |
| Tâches planifiées | 470 |
Points de qualité : 29 salles n'ont pas de zone, 87 lots déclarés présents
n'ont pas d'équipement directement associé et aucun lot n'est marqué absent.
Le diagnostic des lots devra compter séparément les équipements directs et les
équipements héritant du lot de leur groupe.
## Navigation et pages orphelines
Le contrôle automatique a trouvé 34 routes GET sans lien entrant. Elles ne sont
pas toutes destinées à la navigation : 19 sont des API, exports, redirections
ou formulaires enfants qui doivent être ouverts depuis leur liste parente.
Les accès directs utiles ajoutés au menu sont :
- profil utilisateur ;
- zones et historique des compteurs ;
- ajout de compte et dossiers surveillés Outlook ;
- messages et interprétations ENT ;
- salles, personnels et professeurs PRONOTE ;
- configuration des identifiants et du watchdog DND Yeastar.
Les routes historiques `/admin/room-types`, `/admin/services` et
`/admin/staff` dupliquent des écrans métier existants. Elles ne doivent pas être
ajoutées comme seconds écrans dans le menu : elles doivent être redirigées vers
les pages canoniques puis supprimées. Les API et téléchargements ne sont pas des
pages de menu.
Une vérification automatique de navigation doit être ajoutée à la CI : toute
nouvelle page HTML GET sans paramètre doit soit recevoir un lien, soit être
explicitement déclarée comme page enfant, redirection ou écran interne.
## Proposition UI
### Architecture de navigation
Conserver cinq espaces principaux : Accueil, Patrimoine, Interventions,
Planning et Prévention. Les intégrations et l'administration restent réservées
aux utilisateurs autorisés. À terme, la longue liste actuelle d'intégrations
devrait devenir une page d'accueil « Intégrations » composée de cartes avec
état, configuration, dernière synchronisation et journaux.
### Tableau de bord
Afficher des cartes dépendant du rôle : tâches du jour, retards, urgences,
attente de pièce ou prestataire, contrats proches de l'échéance, stocks faibles,
lots incohérents et temps de prévention. Chaque carte doit ouvrir une liste déjà
filtrée.
### Inventaire
Ne plus rendre l'arbre complet. Charger progressivement : catégorie, bâtiment
ou logement, zone, salle, groupe puis unité. Ajouter recherche instantanée,
filtres mémorisés, sélection multiple et compteurs par niveau.
### Création d'équipements
Proposer trois parcours : fiche rapide, groupe quantitatif et assistant
multi-salles. Les valeurs venant du lot doivent être visibles comme héritées.
La création en masse doit offrir aperçu, validation des anomalies, rapport et
annulation.
### Interventions
Ajouter liste, Kanban et calendrier. La fiche doit utiliser une chronologie
unique pour statut, diagnostic, commentaires, photos, temps, pièces et visite
prestataire. La détection de récurrence doit être paramétrable selon la
catégorie : prise, fenêtre ou luminaire ne se traitent pas comme chaise ou
graffiti.
### Logements
Ajouter historique des occupants, états des lieux, clés, compteurs, documents,
inventaire et interventions. Les données personnelles de l'occupant exigent
une permission séparée de la simple consultation du patrimoine.
### Prévention
Séparer tableau de bord, agents, risques, actions, habilitations, formations,
incidents, DUERP et temps consacré. La cible de 10 % doit être calculée depuis
le temps réellement travaillé et tenir compte de chaque journée exceptionnelle
pendant les petites et grandes vacances.
### Composants et accessibilité
Réduire les pages de plusieurs centaines de lignes et les nombreux styles ou
scripts intégrés. Construire des composants communs pour champs, badges,
tableaux, filtres, états vides et erreurs. Corriger les blocs JavaScript nommés
`scripts` alors que le layout rend `extra_scripts`, ajouter des libellés aux
boutons icône et fournir les ressources critiques localement plutôt que par CDN
seulement.
## Feuille de route
### Lot 1 — Stabilisation
- supprimer le mot de passe de test ;
- corriger les cinq routes en erreur et les 15 liens invalides ;
- réparer création de tâche et formations ;
- unifier les statuts et les statistiques ;
- empêcher l'attribution artificielle des interventions ;
- tester chaque page fixe en CI.
### Lot 2 — Fiabilité métier
- fusionner les moteurs de maintenance ;
- réconcilier les 470 tâches ;
- intégrer complètement calendrier scolaire et horaires exceptionnels ;
- corriger permissions documents et clés API ;
- rendre les historiques non destructibles ;
- tester une restauration complète.
### Lot 3 — Parcours quotidiens
- refondre navigation et tableau de bord ;
- charger l'inventaire progressivement ;
- finaliser la création en masse ;
- compléter les logements ;
- ajouter le workflow et la récurrence des interventions.
### Lot 4 — Fonctions avancées
- générer les visites contractuelles ;
- tracer tous les mouvements de stock ;
- fiabiliser compteurs et consommables ;
- compléter prévention et DUERP ;
- fournir exports métier et suivi des coûts.
### Lot 5 — Mise en production
- HTTPS et configuration de production ;
- dépendances verrouillées et analyse de vulnérabilités ;
- sauvegardes chiffrées hors machine ;
- test de restauration ;
- supervision, accessibilité, tests mobiles et test de charge.

View file

@ -1,5 +1,9 @@
# Audit fonctionnel, pages, routes et permissions # Audit fonctionnel, pages, routes et permissions
> Ce document conserve l'audit historique réalisé avant les phases de
> sécurisation. Le réaudit de l'état courant et la feuille de route active sont
> disponibles dans [AUDIT_2026-08-14.md](AUDIT_2026-08-14.md).
Date de l'audit : 14 août 2026 Date de l'audit : 14 août 2026
Périmètre : application Flask `app_new`, modèles, templates, routes enregistrées, configuration Docker et tests. Périmètre : application Flask `app_new`, modèles, templates, routes enregistrées, configuration Docker et tests.