feat(transport) : permissions carriers + sidebar (ERP-153) #111
Reference in New Issue
Block a user
Delete Branch "feat/erp-153-rbac"
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?
ERP-153 — Socle RBAC du module Transport (M4 § 5)
Pose les permissions
transport.carriers.*et l'entrée de menu, sans entité ni migration (scope strict RBAC + sidebar).Livré
TransportModule::permissions()déclaretransport.carriers.view,.manage,.archive(app:sync-permissions→ +3 permissions).RbacSeeder::MATRIX: Bureau (view+manage), Commerciale (view) ; Compta + Usine aucun accès ;archiveréservé à l'admin.config/sidebar.php: section « Transport » + item/carriersgaté partransport.carriers.view;frontend/tests/e2e/_fixtures/personas.ts: personauser-fullétendu (expectedAdminLinksinchangé, Transport n'est pas un lien admin) ;SeedE2ECommand.php: miroir back.sidebar.transport.{section,carriers}.TransportModuleTest: garde-fou figeant le jeu de 3 permissions.Vérifications
make test: 725 tests verts (dont matrices RBAC Client/Supplier/Provider + nouveau TransportModuleTest).make nuxt-test: 480 tests verts.make php-cs-fixer-allow-risky: 0 correction.Section « Transport » masquée pour Compta/Usine ; visible Admin/Bureau/Commerciale.
Code review ERP-153 (socle RBAC + sidebar transporteurs) — relue contre la spec M4 (matrice de rôles p.3).
Conformité RBAC : exacte. Bureau = view+manage, Commerciale = view seul, Compta + Usine = aucun accès, archive réservée à l'admin → conforme à la matrice. Les 3 miroirs RBAC (sidebar / personas.ts / SeedE2ECommand) sont bien synchronisés (règle n°8). Bon garde-fou de test.
Un point bloquant : la sidebar expose un lien
/carriersvers une page qui n'existe pas encore (le moduletransportest actif mais le layer front n'a aucune page) → 404 pour Admin/Bureau/Commerciale. Détail en commentaire inline. Le reste = remarques mineures / confirmations.@@ -79,2 +79,4 @@],],// Section "Transport" (M4, ERP-153) : pole logistique, porte le repertoire// transporteurs. L'item est gate par `transport.carriers.view` ; la section🟡 Mineur (commentaire). « la section disparaît automatiquement (SidebarProvider) … si l'user n'a pas la permission » : exact dans les faits, mais la section ne déclare pas de clé
permission— le masquage repose sur la permission de l'item + la suppression des sections vides (if ([] === $items) continue;dansSidebarProvider). Préciser « via la permission de l'item » éviterait de laisser croire à un gate de section explicite.@@ -81,0 +88,4 @@'items' => [['label' => 'sidebar.transport.carriers','to' => '/carriers',✅ Mise à jour — point retiré (non bloquant). Après revue de la séquence M4 dans le suivi de tickets : la page Répertoire
/carriers(datatable + filtres + export) est livrée par ERP-164, suivie de l'écran Ajouter/carriers/new(ERP-165) et des onglets (ERP-166→171). Le lien sidebar est donc volontairement posé en amont — séquencement assumé RBAC+sidebar (153) → backend (155-161) → front (164-171). Rien à corriger ici.Seul point d'attention opérationnel (non bloquant pour cette PR) : veiller à ce que la stack backend n'atterrisse pas sur
developen prod avant le merge d'ERP-164, sinon 404 temporaire visible pour Admin/Bureau/Commerciale.(commentaire initial « lien mort » remplacé suite à la prise en compte des MR suivantes)
@@ -78,2 +78,4 @@'technique.providers.view','technique.providers.manage',// Transporteurs (M4 § 5.2, ERP-153) : view + manage (PAS archive -> admin seul).'transport.carriers.view',✅ Conforme spec p.3 — Bureau = Consultation/Ajout-Modif « Tout », Archive « Non » →
view+managesansarchive. RAS.@@ -122,1 +125,4 @@'technique.providers.manage',// Transporteurs (M4 § 5.2, ERP-153) : view seul (consultation « Tout »,// ni manage ni archive pour la Commerciale).'transport.carriers.view',✅ Conforme spec p.3 — Commerciale = Consultation « Tout », Ajout-Modif « Non », Archive « Non » →
viewseul. RAS.(Pour mémoire : Compta et Usine ne reçoivent aucune permission transport, conforme à « Non / Non / Non ».)
@@ -0,0 +22,4 @@self::assertFalse(TransportModule::REQUIRED);}public function testPermissionsSetContainsExactlyThreeCodes(): void👍 Bon garde-fou : le jeu de codes est figé, le test casse si on dérive de la spec § 5.1 sans intention. Optionnel : asserter aussi que chaque
labelest non vide FR (partiellement couvert partestEveryPermissionCodeIsPrefixedByModuleId).Socle RBAC du module Transport (M4 § 5) : - TransportModule::permissions() declare transport.carriers.{view,manage,archive} - RbacSeeder::MATRIX (§ 5.2) : Bureau (view+manage), Commerciale (view) ; Compta/Usine aucun acces ; archive admin seul - config/sidebar.php : section Transport + item /carriers (gate transport.carriers.view) - i18n sidebar.transport.{section,carriers} - 3 miroirs RBAC alignes : sidebar.php, personas.ts (user-full), SeedE2ECommand.php - TransportModuleTest : garde-fou sur le jeu de permissionse607cccf08to2be9cd05d4