gmao/docs/ui-audit/BUGS.md
root bbdd066207
Some checks are pending
CI - Tests et Syntax / lint-and-test (push) Waiting to run
audit(ui): analyser l'association des labels
2026-08-22 12:17:32 +00:00

12 KiB
Raw Blame History

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, commit unknown.
  • 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 à 830 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_SOL puis 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_MULTI et TEST_UI_USER_NONE.
  • Résultat : les deux dashboards contiennent les mêmes liens équipements, interventions et nettoyage, y compris pour TEST_UI_USER_NONE sans rôle.
  • Backend : TEST_UI_USER_NONE reçoit bien 403 sur ces URLs ; le backend est donc plus strict que le menu.
  • Résultat multi-rôles : TEST_UI_USER_MULTI reç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=2 et /equipments/?page=2 répondent 200.
  • /interventions/?page=2 et /companies/?page=2 ré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/1 ré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:495 et l'expression interv.equipment.name alors que interv.equipment vaut None.
  • 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 abc et 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_SOL pour 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 for et 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="…"> à un id unique, 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.