feat(transport) : permissions carriers + sidebar (ERP-153) #111

Manually merged
matthieu merged 0 commits from feat/erp-153-rbac into develop 2026-06-16 13:47:05 +00:00
Owner

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éclare transport.carriers.view, .manage, .archive (app:sync-permissions → +3 permissions).
  • Matrice § 5.2 dans RbacSeeder::MATRIX : Bureau (view+manage), Commerciale (view) ; Compta + Usine aucun accès ; archive réservé à l'admin.
  • 3 sources RBAC alignées dans le même commit (règle ABSOLUE n°8) :
    • config/sidebar.php : section « Transport » + item /carriers gaté par transport.carriers.view ;
    • frontend/tests/e2e/_fixtures/personas.ts : persona user-full étendu (expectedAdminLinks inchangé, Transport n'est pas un lien admin) ;
    • SeedE2ECommand.php : miroir back.
  • i18n 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.

## 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éclare `transport.carriers.view`, `.manage`, `.archive` (`app:sync-permissions` → +3 permissions). - **Matrice § 5.2** dans `RbacSeeder::MATRIX` : Bureau (view+manage), Commerciale (view) ; Compta + Usine aucun accès ; `archive` réservé à l'admin. - **3 sources RBAC alignées dans le même commit** (règle ABSOLUE n°8) : - `config/sidebar.php` : section « Transport » + item `/carriers` gaté par `transport.carriers.view` ; - `frontend/tests/e2e/_fixtures/personas.ts` : persona `user-full` étendu (`expectedAdminLinks` inchangé, Transport n'est pas un lien admin) ; - `SeedE2ECommand.php` : miroir back. - i18n `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.
matthieu added the backfrontM4-Transporteurtype/feat labels 2026-06-15 16:11:56 +00:00
tristan reviewed 2026-06-16 08:57:19 +00:00
tristan left a comment
Owner

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 /carriers vers une page qui n'existe pas encore (le module transport est actif mais le layer front n'a aucune page) → 404 pour Admin/Bureau/Commerciale. Détail en commentaire inline. Le reste = remarques mineures / confirmations.

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 `/carriers` vers une page qui n'existe pas encore (le module `transport` est 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
Owner

🟡 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; dans SidebarProvider). Préciser « via la permission de l'item » éviterait de laisser croire à un gate de section explicite.

🟡 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;` dans `SidebarProvider`). 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',
Owner

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 develop en 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)

✅ **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 `develop` en prod avant le merge d'ERP-164, sinon 404 temporaire visible pour Admin/Bureau/Commerciale._ <sub>(commentaire initial « lien mort » remplacé suite à la prise en compte des MR suivantes)</sub>
@@ -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',
Owner

Conforme spec p.3 — Bureau = Consultation/Ajout-Modif « Tout », Archive « Non » → view + manage sans archive. RAS.

✅ Conforme spec p.3 — Bureau = Consultation/Ajout-Modif « Tout », Archive « Non » → `view` + `manage` sans `archive`. 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',
Owner

Conforme spec p.3 — Commerciale = Consultation « Tout », Ajout-Modif « Non », Archive « Non » → view seul. RAS.

(Pour mémoire : Compta et Usine ne reçoivent aucune permission transport, conforme à « Non / Non / Non ».)

✅ Conforme spec p.3 — Commerciale = Consultation « Tout », Ajout-Modif « Non », Archive « Non » → `view` seul. 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
Owner

👍 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 label est non vide FR (partiellement couvert par testEveryPermissionCodeIsPrefixedByModuleId).

👍 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 `label` est non vide FR (partiellement couvert par `testEveryPermissionCodeIsPrefixedByModuleId`).
matthieu added 1 commit 2026-06-16 13:15:01 +00:00
feat(transport) : permissions carriers + sidebar (ERP-153)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 2m41s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m24s
2be9cd05d4
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 permissions
matthieu force-pushed feat/erp-153-rbac from e607cccf08 to 2be9cd05d4 2026-06-16 13:15:01 +00:00 Compare
matthieu manually merged commit c60daebf3e into develop 2026-06-16 13:47:05 +00:00
Sign in to join this conversation.