17 KiB
17 KiB
Bugs et anomalies
UI-001 — Transvasement inaccessible
- Priorité : P1
- Module : Matériel & Produits d'entretien
- URL :
/cleaning/transvasement - Compte :
chatgpt/super_admin - Résultat : HTTP 500, écran générique.
- Attendu : formulaire utilisable ou message métier explicite si le stock est vide.
- Impact : dilution et transvasement impossibles.
UI-002 — Configuration des prévisions inaccessible
- Priorité : P1
- Module : Matériel & Produits d'entretien
- URL :
/cleaning/forecast-config - Compte :
chatgpt/super_admin - Résultat : HTTP 500.
- Attendu : coefficients par défaut affichés et modifiables.
- Impact : coefficients de permanence impossibles à configurer.
UI-003 — Création de salle bloquée
- Priorité : P1
- Module : Établissement
- URL :
/equipments/rooms/new - Résultat : le select « Bâtiment » est vide malgré des bâtiments visibles
dans
/equipments/buildings/. - Attendu : bâtiments proposés, puis zones filtrées par bâtiment.
- Impact : impossibilité de poursuivre les scénarios équipements/interventions.
UI-004 — Confusion Site/Bâtiment
- Priorité : P2
- URL :
/equipments/buildings/ - Résultat : le formulaire principal crée un
Site(Collège), tandis que le véritable bâtiment se crée via/equipments/buildings/new. - Recommandation : séparer les deux actions et afficher la hiérarchie établissement → bâtiment → zone → salle.
UI-005 — Commit Docker non identifié
- Priorité : P2
- URL :
/health/, setup - Résultat : version
0.1.0-dev.2, commitunknown. - Recommandation : fournir
GIT_VERSION=$(git rev-parse HEAD)au build.
UI-006 — Instabilité sous navigation séquentielle
- Priorité : P1 à confirmer
- Résultat : temps de réponse parfois supérieur à 8–30 secondes, puis indisponibilité temporaire.
- Recommandation : surveiller CPU/RAM, Gunicorn, connexions MariaDB et documenter les temps de réponse sans lancer de test de charge.
UI-007 — Disponibilités et horaires semblent partager le même écran
- Priorité : P2
- URL :
/planning/availability - Résultat : titre « Horaires et suivi annuel » et structure identique à
/planning/time. - Attendu : redirection explicite ou écran distinct avec un libellé cohérent.
- Impact : l'utilisateur peut croire qu'il existe deux écrans différents.
UI-008 — Requête 401 visible dans la console au chargement du login
- Priorité : P3 à confirmer
- Résultat : Playwright signale une ressource 401 sur
/auth/login. - Impact : bruit console et appel potentiellement lancé avant la session.
UI-009 — Soumission produit très lente/non confirmée
- Priorité : P1 à confirmer (environnementale ou applicative)
- URL :
/cleaning/products/new - Compte :
chatgpt/super_admin - Étapes : remplir un produit
TEST_UI_DETERGENT_SOLpuis soumettre une seule fois. - Résultat : l'action Playwright est restée bloquée plus de 30 secondes ; la requête n'a pas été répétée.
- Impact : impossible de confirmer la création d'un produit dans cette passe.
- Qualification : vérifier les logs et la charge VM avant de conclure à un bug applicatif.
UI-010 — Soumission prévention très lente/non confirmée
- Priorité : P1 à confirmer (environnementale ou applicative)
- URL :
/prevention/ - Compte :
chatgpt/super_admin - Étapes : remplir le formulaire d'agent prévention avec des données
TEST_UI_*, puis soumettre une seule fois. - Résultat : clic bloqué au-delà du délai ; aucune répétition.
- Impact : impossible de confirmer la création d'un personnel de prévention dans cette passe.
UI-011 — Lien Documents renvoie 404
- Priorité : P2
- URL :
/documents/ - Compte :
chatgpt/super_admin - Résultat : HTTP 404.
- Attendu : liste documentaire ou redirection vers le module documentaire réellement utilisé.
- Impact : lien cassé pour un utilisateur qui cherche les documents.
UI-012 — Menu non filtré selon les permissions
- Priorité : P1
- Comptes :
TEST_UI_USER_MULTIetTEST_UI_USER_NONE. - Résultat : les deux dashboards contiennent les mêmes liens équipements,
interventions et nettoyage, y compris pour
TEST_UI_USER_NONEsans rôle. - Backend :
TEST_UI_USER_NONEreçoit bien 403 sur ces URLs ; le backend est donc plus strict que le menu. - Résultat multi-rôles :
TEST_UI_USER_MULTIreçoit 200 sur patrimoine et interventions, puis 403 patrimoine après un refus individuel, tandis que les interventions restent accessibles. - Impact : UX trompeuse et risque d'erreurs ; un utilisateur voit des liens qu'il ne peut pas ouvrir.
UI-013 — Pagination absente ou non supportée sur plusieurs listes
- Priorité : P2
/lots/?page=2et/equipments/?page=2répondent 200./interventions/?page=2et/companies/?page=2répondent 404.- Attendu : pagination cohérente, ou absence explicite du paramètre avec une interface qui ne l'affiche pas.
- Impact : incohérence de navigation lorsque le volume de données augmente.
UI-014 — Entreprises sans recherche ni filtre visible
- Priorité : P2
- URL :
/companies/ - Résultat : aucune zone de recherche ou de tri dans la liste.
- Attendu : recherche par nom/contact lorsque le nombre d'entreprises croît.
UI-015 — Formulaire entreprise vide provoque une erreur 500
- Priorité : P1
- URL :
/companies/new - Étapes : soumettre le formulaire vide avec un CSRF valide.
- Résultat : HTTP 500 au lieu d'une validation utilisateur.
- Attendu : HTTP 400 ou retour formulaire avec champ obligatoire signalé.
UI-016 — Formulaire intervention vide provoque une erreur 500
- Priorité : P1
- URL :
/interventions/new - Étapes : soumettre le formulaire vide avec un CSRF valide.
- Résultat : HTTP 500.
- Attendu : validation des champs obligatoires et message compréhensible.
UI-017 — Liste interventions casse avec une intervention sans salle
- Priorité : P1
- URL :
/interventions/ - Donnée :
TEST_UI_INTERVENTION_ELECTRICITE(ID 1), créée sans salle ni équipement pour tester le cas autorisé par le formulaire. - Résultat : le détail
/interventions/1répond 200, mais la liste renvoie HTTP 500. - Attendu : afficher l'intervention avec « Salle non renseignée » ou demander une salle avant validation.
- Impact : une intervention valide au niveau formulaire rend la liste principale inutilisable.
UI-018 — Titre d'édition ambigu
- Priorité : P2
- URL :
/interventions/1/edit - Résultat : le titre HTML reste « Nouvelle intervention » en édition.
- Attendu : « Modifier l'intervention » avec identifiant/titre existant.
UI-019 — Tableau de bord en erreur avec une intervention sans équipement
- Priorité : P1
- URL :
/ - Utilisateur :
chatgpt(super-administrateur) - Précondition : l'intervention de test ID 1 existe sans équipement associé.
- Étapes : ouvrir une session puis demander
/. - Résultat : HTTP 500. Le journal indique
dashboard/index.html:495et l'expressioninterv.equipment.namealors queinterv.equipmentvautNone. - Attendu : le tableau de bord doit afficher une valeur de remplacement (« Aucun équipement ») ou exclure proprement la relation absente.
- Impact : erreur critique pour la page d'entrée et perte d'accès au tableau de bord dès qu'une intervention sans équipement est enregistrée.
UI-020 — Lien Journaux visible mais accès refusé
- Priorité : P2
- URL :
/logs/ - Utilisateur :
chatgpt(rôle personnaliséchatgpt) - Étapes : ouvrir une page autorisée contenant la navigation, puis suivre le
lien « Journaux » ; ouvrir également
/logs/directement. - Résultat : le lien
/logs/est présent dans le HTML de navigation, mais le serveur répond HTTP 403. Le compte possède les permissions d'audit visibles dans sa matrice, sans permission effective acceptée par cette route. - Attendu : masquer le lien si l'accès est refusé, ou attribuer/vérifier la permission réellement requise par la route.
- Impact : incohérence UI/backend et perte de temps pour l'utilisateur.
UI-021 — Certains formulaires planning dépendent de l'injection JavaScript du CSRF
- Priorité : P2
- URLs :
/planning/availability/closure/new,/planning/tasks/new - Résultat : le HTML initial ne contient pas de champ caché
csrf_token; le jeton est ajouté par le JavaScript global. Une soumission sans JavaScript reçoit bien 400, mais le formulaire ne peut alors pas être utilisé. - Attendu : rendre le champ CSRF dans le formulaire serveur, tout en gardant l'injection JS comme secours pour les requêtes dynamiques.
- Impact : dépendance inutile à JavaScript et accessibilité dégradée.
UI-022 — État du stock en erreur après une réception valide
- Priorité : P1
- URL :
/cleaning/stock - Précondition : produit, référence, conditionnement, emplacement et deux lots
TEST_UI_*réceptionnés avec succès. - Étapes : ouvrir l'état du stock après les réceptions.
- Résultat : HTTP 500, alors que le journal des mouvements reste accessible et affiche les réceptions, la sortie FEFO, le transfert et la correction d'inventaire.
- Attendu : afficher les soldes par lot et emplacement, même lorsque les mouvements précédents ont modifié les quantités.
- Impact : l'écran central de consultation du stock est inutilisable dès qu'un stock réel existe.
UI-023 — Aucun contrôle UI pour autoriser un produit sur les fiches de demande
- Priorité : P2
- URLs :
/cleaning/products/new,/cleaning/products/1/edit,/cleaning/requests/new - Résultat : le modèle distingue
request_enabled, mais les formulaires du produit ne proposent aucun champ pour l'activer. Le formulaire de profil affiche donc zéro produit sélectionnable, et la fiche imprimée ne contient aucune ligne. - Attendu : case « Autoriser sur les fiches de demande » dans le produit, avec un état visible dans le profil.
- Impact : la fonctionnalité de fiches papier ne peut pas être configurée depuis l'interface.
UI-024 — Valeur numérique invalide sur l'édition d'un produit → 500
- Priorité : P1
- URL :
/cleaning/products/1/edit - Étapes : remplacer « Stock minimum » par
abcet soumettre le produit de test. - Résultat : HTTP 500 au lieu d'un message de validation.
- Attendu : conserver les valeurs saisies et signaler que les quantités doivent être numériques, comme le fait déjà la création.
- Impact : une faute de saisie rend l'écran d'édition inutilisable.
UI-025 — Doublon de référence commerciale accepté sans avertissement
- Priorité : P2
- URL :
/cleaning/references/new - Étapes : créer une seconde référence
TEST_UI_REF_DETERGENT_SOLpour le même produit générique. - Résultat : la soumission est acceptée (302) et deux occurrences apparaissent dans la liste, sans avertissement ni indication d'historique.
- Attendu : avertir l'utilisateur ou demander une référence fabricant/ fournisseur distincte avant de créer un doublon involontaire.
- Impact : catalogue commercial ambigu et risque d'erreur lors des réceptions.
UI-026 — Labels de formulaires non associés aux contrôles
- Priorité : P2
- Périmètre : formulaires produits, références, conditionnements, réceptions, sorties, transferts et prévention.
- Résultat : les libellés sont visuellement présents, mais n'ont pas
d'attribut
foret les contrôles n'ont pas d'identifiant associé. Le clic sur le libellé ne place donc pas le focus et les lecteurs d'écran ne peuvent pas relier automatiquement le nom au champ. - Attendu : associer chaque
<label for="…">à unidunique, ou envelopper explicitement le contrôle dans le label. - Impact : accessibilité clavier et compréhension des champs dégradées pour les utilisateurs débutants ou avec assistance vocale.
UI-027 — Habilitation prévention accepte des dates inversées
- Priorité : P2
- URL :
/prevention/(formulaire/prevention/authorization) - Étapes : pour
TEST_UI_AGENT ENTRETIEN, saisir une date d'émission 31/12/2026 et une expiration 01/01/2026. - Résultat : POST accepté avec redirection 302, sans message d'erreur ni validation de l'ordre chronologique.
- Attendu : refuser une expiration antérieure à l'émission et expliquer la correction attendue.
- Impact : historique d'habilitations incohérent.
UI-028 — Les habilitations ne sont pas visibles dans le récapitulatif prévention
- Priorité : P2
- URL :
/prevention/ - Résultat : le formulaire d'ajout d'habilitation est présent, mais aucune liste des habilitations enregistrées n'est affichée ; l'entrée de test ne peut donc pas être relue ou contrôlée dans l'interface.
- Attendu : tableau agent, habilitation, date d'émission, expiration et émetteur, avec signalement des habilitations expirées.
- Impact : absence de suivi opérationnel malgré la possibilité de saisie.
UI-029 — Listes stock et produits sans recherche ni filtre
- Priorité : P2
- URLs :
/cleaning/products,/cleaning/references,/cleaning/movements,/cleaning/requests - Résultat : les listes ne présentent ni champ de recherche, ni filtre, ni pagination visible. Après ajout de lots et mouvements, retrouver un produit ou une opération nécessite de parcourir toute la page.
- Attendu : recherche par produit/référence/lot et filtres par période, emplacement et type de mouvement, avec pagination.
- Impact : ergonomie insuffisante dès que le catalogue ou l'historique grandit.
UI-030 — Document téléversé absent du détail de l'intervention
- Priorité : P1
- URLs :
/interventions/1,/documents/upload/intervention/1 - Étapes : téléverser le fichier artificiel
test_document.pdfdepuis le détail de l'intervention de test, puis revenir au détail. - Résultat : le POST est accepté (302) et le téléchargement
/documents/intervention/download/1répond 200, mais aucun nom ou lien de document n'est affiché sur/interventions/1. - Attendu : afficher le document, sa description, sa date et les actions téléchargement/suppression dans le détail.
- Impact : l'utilisateur ne sait pas si son fichier a été enregistré et ne peut pas le gérer depuis l'intervention.
Corrections locales — passe P1
Les éléments ci-dessous sont CORRIGÉS DANS LE CODE — À REVALIDER SUR VM DE TEST.
La VM et sa base TEST_UI_* ne sont pas accessibles depuis cet environnement.
| Bug | Cause racine | Correction locale | Tests locaux |
|---|---|---|---|
| UI-001 | ReusableContainer manquait dans les imports de la route |
Import explicite du modèle et chargement défensif de la page | test_cleaning_module.py, test_ui_p1_regressions.py |
| UI-002 | Le nom de contexte config masquait la configuration Flask dans base.html, en plus de l'import manquant |
Import de CleaningForecastConfig et contexte renommé forecast_config |
test_ui_p1_regressions.py::test_cleaning_pages_load_without_reference_data |
| UI-003 | La route ne fournissait pas buildings au template et n'assurait pas la cohérence zone/bâtiment |
Contexte complet, validation serveur et conservation des saisies | test_ui_p1_regressions.py::test_room_form_lists_buildings_and_rejects_cross_building_zone, test_equipment_forms.py |
| UI-015 | Le nom entreprise était envoyé directement en base sans validation | Validation obligatoire et retour formulaire HTTP 400 | test_ui_p1_regressions.py::test_empty_intervention_and_company_are_validation_errors |
| UI-016 | Le titre et les dates d'intervention étaient parsés sans validation | Validation du titre et des dates/heures avec message français | test_ui_p1_regressions.py::test_empty_intervention_and_company_are_validation_errors |
| UI-017 | Le template appelait interv.equipment.name lorsque l'équipement était absent |
Affichage salle/localisation générale de remplacement | test_ui_p1_regressions.py::test_optional_location_is_safe_in_interventions |
| UI-019 | Le dashboard appelait interv.equipment.name lorsque l'équipement était absent |
Garde équipement/salle/aucune localisation | test_ui_p1_regressions.py::test_optional_equipment_is_safe_on_dashboard |
| UI-022 | La vue stock n'injectait pas current_date, utilisé par le template |
Passage explicite de la date courante | test_ui_p1_regressions.py::test_cleaning_pages_load_without_reference_data, tests stock existants |
| UI-024 | Decimal() non protégé dans l'édition produit |
Validation numérique et rollback sans 500 | test_ui_p1_regressions.py::test_invalid_product_quantity_is_validation_error |
| UI-030 | La fiche module utilisait des endpoints de documents inexistants et une relation dynamique directement dans Jinja | Endpoints réels, liste de documents matérialisée dans la route et template | test_ui_p1_regressions.py::test_intervention_detail_template_exposes_document_actions |
| UI-012 | Les groupes de navigation et liens métier étaient statiques | Filtrage des groupes, liens et raccourci logs par has_permission() |
Vérification de compilation/rendu des templates et suite ciblée |
Les résultats ci-dessus sont des tests automatisés locaux uniquement ; ils ne valident pas la base distante ni le rendu sur la VM d'audit.