[ERP-74] Seed RBAC idempotent (rôles + matrice § 2.7 + demo users) + RG-1.04 + test matrice #40

Merged
malio merged 5 commits from feature/ERP-74-seed-rbac-command into develop 2026-06-01 21:06:34 +00:00

5 Commits

Author SHA1 Message Date
Matthieu c1c7080788 perf(commercial) : memoize request payload decoding in ClientProcessor
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 1m48s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m16s
2026-06-01 23:01:14 +02:00
Matthieu 840fc3671e fix(commercial) : compare categories by value in guardManage (avoid false 403 on full-representation PATCH) 2026-06-01 23:00:51 +02:00
Matthieu 49cf798fc9 test(commercial) : full RBAC matrix (M1)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 1m52s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m16s
ClientRBACMatrixTest : matrice § 2.7 par role metier via les comptes demo seedes
par la commande reelle app:seed-rbac --with-demo-users (idempotente). Valide
200/403 par verbe et par onglet pour bureau / compta / commerciale / usine :
- usine : 403 partout ;
- bureau : view + manage, sans accounting ni archive ;
- compta : view + edition accounting (200), POST/main/information/archive -> 403 ;
- commerciale : view + manage, sans accounting ni archive ;
- RG-1.04 : POST Commerciale incomplet -> 422, meme POST par Admin -> 201.
2026-06-01 22:26:56 +02:00
Matthieu 09e1d7884a feat(commercial) : enforce RG-1.04 completeness for commerciale role
- 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.
2026-06-01 22:26:49 +02:00
Matthieu 275c6ff5b5 feat(core) : add idempotent app:seed-rbac command (roles + matrix + demo users)
- RbacSeeder : source unique des 4 roles metier (bureau/compta/commerciale/usine),
  de la matrice RBAC § 2.7 (role -> permissions) et des comptes demo. Operations
  idempotentes et non destructives (ensureRoles / attachMatrix / ensureDemoUsers).
- app:seed-rbac : commande applicative presente en build prod (contrairement aux
  fixtures require-dev). Sans option : roles + matrice. --with-demo-users +
  --password / RBAC_DEMO_PASSWORD : un compte demo par role. Garde-fou : exit
  non-zero + invite a lancer app:sync-permissions si les codes manquent.
- RbacDemoFixtures (dev/test) : appelle le meme seeder (DRY). La matrice est
  attachee post-sync par app:seed-rbac (la table permission est purgee au load).
- makefile : etape seed-rbac apres sync-permissions (db-reset + test-db-setup).
- Doc deploiement (README) + credentials des comptes demo (CLAUDE.md / README).
2026-06-01 22:22:33 +02:00