- Titre du bon de pesée : « Ticket de pesée 86-TP-0001 » (numéro accolé, absent en brouillon).
- Bouton « Imprimer » (edit) : v-if isValidated → masqué sur un ticket en attente (DRAFT, sans numéro).
Problème : connecté en usine (usine17/82/86), les déroulants Client/Fournisseur
du ticket de pesée sortent vides. Cause = 403 : le rôle usine n'a pas
`commercial.clients.view`/`suppliers.view`, et le composable contrepartie (résilient
au 403) laisse les selects vides. Ce n'est PAS le filtre site (ERP-208).
Fix (permission dédiée « référentiel », ne fuit pas le répertoire) :
- CommercialModule : nouvelles permissions `commercial.clients.read_ref` et
`commercial.suppliers.read_ref` (lecture de la LISTE pour alimenter un select).
- Client/Supplier GetCollection : security `view OR read_ref`. Seule la collection
s'ouvre ; item Get, POST et PATCH restent gardés par `view`/`manage`. La sidebar
répertoire reste gardée par `view` → usine ne voit pas le répertoire.
- RbacSeeder (rôle Usine) : ajout des 2 read_ref.
- Miroirs RBAC (règle ABSOLUE n°8) : personas.ts (user-full) + SeedE2ECommand alignés.
- Tests : testUsineIsForbiddenEverywhere → testUsineCanReadListButNothingElse
(200 sur la liste, 403 sur détail/création/édition) pour Client et Supplier ;
l'assertion categories/sites confirme que read_ref ne couvre QUE clients/suppliers.
Déploiement : jouer `app:sync-permissions` puis `app:seed-rbac`. Si usine17/82/86
utilisent des rôles custom (pas le rôle « usine » standard), leur ajouter les 2
permissions read_ref à la main.
RETOUR ARRIÈRE MÉTIER (si l'usine ne doit PAS voir les tiers) : retirer les 2
read_ref de RbacSeeder ROLE_USINE + de CommercialModule + le `or ...read_ref` des
GetCollection Client/Supplier, puis sync-permissions + seed-rbac. Restaurer aussi
les tests testUsineIsForbiddenEverywhere (403 partout).
Note : une fois le 403 levé, la liste reste filtrée sur le site courant (ERP-208) ;
si aucun tiers n'a d'adresse sur le site usine, le select peut rester vide — point
de données/sémantique distinct, à arbitrer séparément.
Masque front 5 chiffres sur la modale manuelle + Assert\LessThanOrEqual(99999)
sur WeighbridgeReadingResource (weight/dsd, mode MANUAL) et backstop entité
(validateManualEntryDigits). Le DSD auto (compteur de site) n'est pas contraint.
Le firewall répondait par une 302 (target /login). Le fetch front suivait le
Location absolu (host upstream du proxy « nginx » en dev) → ERR_NAME_NOT_RESOLVED
+ ~3s de timeout DNS. ApiLogoutSuccessListener rétrograde la réponse en 204 en
conservant le Set-Cookie qui efface BEARER.
Déconnexion déplacée du menu vers le footer (compte connecté au survol +
version). useLogout() appelle clearSession() (reset des stores singletons via
onAuthSessionCleared) puis redirige vers /login, sans page /logout intermédiaire.
- Sites : les tags du multiselect prennent la couleur de fond du site
(champ color, groupe site:read) avec texte blanc, en saisie comme en
consultation (clients, fournisseurs, prestataires, produits).
- Autres multiselects : 3 tags affichés au maximum (surplus condensé en « +N »).
- Bump @malio/layer-ui 1.7.15 → 1.7.17 (support color/textColor et maxTags
sur les options).