fix(rbac) : usine peut lire les listes client/fournisseur pour le select de contrepartie pesée (ERP-209)
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.
This commit is contained in:
@@ -63,7 +63,11 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
||||
#[ApiResource(
|
||||
operations: [
|
||||
new GetCollection(
|
||||
security: "is_granted('commercial.clients.view')",
|
||||
// `read_ref` (ERP-209) : lecture de la LISTE seule, pour alimenter le
|
||||
// select de contrepartie du ticket de pesee (role Usine, qui n'a pas
|
||||
// `view` et donc pas le repertoire). N'ouvre que la collection — l'item,
|
||||
// la creation et l'edition restent gardes par `view`/`manage`.
|
||||
security: "is_granted('commercial.clients.view') or is_granted('commercial.clients.read_ref')",
|
||||
// La liste embarque les categories (avec leur code, groupe
|
||||
// category:read) et les sites agreges des adresses (groupe
|
||||
// site:read) pour alimenter les colonnes « Catégories » et
|
||||
|
||||
Reference in New Issue
Block a user