[ERP-74] Seed RBAC idempotent (rôles + matrice § 2.7 + demo users) + RG-1.04 + test matrice #40
Reference in New Issue
Block a user
Delete Branch "feature/ERP-74-seed-rbac-command"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Objectif
Seeder le RBAC métier de façon rejouable et disponible en recette/prod (commande applicative, pas fixture
require-dev), durcir RG-1.04, et écrire le test de matrice (rôles enfin existants).A.
RbacSeeder(Core) — source unique anti-drift4 rôles (
bureau/compta/commerciale/usine, isSystem=false), matrice § 2.7 (rôle → permissions) et comptes démo, définis en un seul endroit. Méthodes idempotentesensureRoles/attachMatrix/ensureDemoUsers.commercialeréférenceBusinessRoles::COMMERCIALE(déjà consommé par RG-1.04).B. Commande
app:seed-rbac(présente en build prod, idempotente, non destructive)--with-demo-users+--password=<…>ou envRBAC_DEMO_PASSWORD: 1 compte démo/rôle. Aucun mot de passe en dur côté serveur.app:sync-permissionssi les codescommercial.clients.*manquent.C. Fixture dev/test
RbacDemoFixtures(DRY)Appelle le même seeder (
ensureRoles+ensureDemoUsers). La matrice est attachée juste après par l'étapeapp:seed-rbacdu makefile (la tablepermissionest purgée au moment dufixtures:load, doncattachMatrixne peut pas tourner pendant le load).make db-reset/test-db-setupreproduisent l'état de recette.Déploiement (documenté README)
Après
migration-migrate+app:sync-permissions:app:seed-rbac(prod) ;app:seed-rbac --with-demo-users --password=…(recette).D. Durcissement RG-1.04
Pour une Commerciale, complétude de l'onglet Information exigée sur POST + tout PATCH (suppression de la condition d'intersection). Conséquence : POST Commerciale → 422 (le POST n'expose pas le groupe Information), Admin → 201. Spec § 7 amendée.
Compta ↔ onglet Comptabilité (§ 2.7)
Pour que
compta PATCH accounting → 200(exigé par la matrice), la security duPatch /clients/{id}est élargie àmanageOUaccounting.manage, et un nouveauguardManage(mode strict RG-1.28) interdit à un porteur non-managede modifier les onglets principal/Information (→ 403). Approche validée : élargir la security + guard in-processor (pas de nouvel endpoint).E.
ClientRBACMatrixTestMatrice § 2.7 complète via les comptes démo seedés (
app:seed-rbac --with-demo-users) : bureau / compta / commerciale / usine (200/403 par verbe et par onglet) + RG-1.04 (POST Commerciale 422 / Admin 201).Tests
make php-cs-fixer-allow-riskyOK ;make test429 tests verts. Idempotence vérifiée (rejeu de la commande : 0 rôle / 0 lien / 0 user).test-db-setupexécute la nouvelle étapeapp:seed-rbacsans erreur.Cible :
develop. Squash merge.- RG-1.04 durcie : pour une Commerciale, la completude de l'onglet Information est exigee sur POST et sur tout PATCH, independamment des champs envoyes (suppression de la condition d'intersection dans validateInformationCompleteness). - Onglet Comptabilite editable par Compta : security du Patch /clients/{id} elargie a `manage` OU `accounting.manage` ; nouveau guardManage (ClientProcessor, mode strict RG-1.28) qui refuse a un porteur non-`manage` de modifier les onglets principal / Information -> 403. Compta reste donc cantonne a la Comptabilite. - Spec § 7 RG-1.04 amendee (+ consequence POST 422) + docblock du validator. - Tests unitaires ClientProcessor : guardManage (Compta accounting-only -> 200, champ metier -> 403) + RG-1.04 durcie hors onglet Information.