# 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 à 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_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 `