From 864bc7e8e8f30021b34ff02b5867fe8c3af4e3c6 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Wed, 17 Jun 2026 15:58:27 +0200 Subject: [PATCH] =?UTF-8?q?feat(logistique)=20:=20scaffold=20module=20+=20?= =?UTF-8?q?socle=20RBAC=20tickets=20de=20pes=C3=A9e=20(ERP-181)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nouveau module Logistique (M5), sans entité ni migration (ticket 1.2) : - LogistiqueModule (ID logistique, permissions weighing_tickets.view/manage) enregistré dans config/modules.php - layer front frontend/modules/logistique (auto-détecté) - sidebar : section Logistique + item /weighing-tickets (gate ...view) + clés i18n sidebar.logistique.* - 3 miroirs RBAC alignés : sidebar.php, personas.ts (user-full), SeedE2ECommand (user-full) - matrice métier RbacSeeder : Bureau + Usine = view/manage ; Compta + Commerciale = aucun accès (spec § 5.2) --- config/modules.php | 2 ++ config/sidebar.php | 18 ++++++++++ frontend/i18n/locales/fr.json | 4 +++ frontend/modules/logistique/nuxt.config.ts | 1 + frontend/tests/e2e/_fixtures/personas.ts | 6 ++++ .../Core/Application/Rbac/RbacSeeder.php | 10 +++++- .../Infrastructure/Console/SeedE2ECommand.php | 4 +++ src/Module/Logistique/LogistiqueModule.php | 33 +++++++++++++++++++ 8 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 frontend/modules/logistique/nuxt.config.ts create mode 100644 src/Module/Logistique/LogistiqueModule.php diff --git a/config/modules.php b/config/modules.php index aad4939..580b62c 100644 --- a/config/modules.php +++ b/config/modules.php @@ -4,6 +4,7 @@ declare(strict_types=1); use App\Module\Catalog\CatalogModule; use App\Module\Commercial\CommercialModule; use App\Module\Core\CoreModule; +use App\Module\Logistique\LogistiqueModule; use App\Module\Sites\SitesModule; use App\Module\Technique\TechniqueModule; use App\Module\Transport\TransportModule; @@ -15,4 +16,5 @@ return [ CatalogModule::class, TechniqueModule::class, TransportModule::class, + LogistiqueModule::class, ]; diff --git a/config/sidebar.php b/config/sidebar.php index e38e1e0..fd57f93 100644 --- a/config/sidebar.php +++ b/config/sidebar.php @@ -95,6 +95,24 @@ return [ ], ], ], + // Section "Logistique" (M5, ERP-181) : nouveau pole "operations physiques sur + // site", distinct du repertoire Transport (M4). Porte le ticket de pesee au + // pont bascule. L'item est gate par `logistique.weighing_tickets.view` ; la + // section disparait automatiquement (SidebarProvider) si le module `logistique` + // est desactive ou si l'user n'a pas la permission (Compta / Commerciale). + [ + 'label' => 'sidebar.logistique.section', + 'icon' => 'mdi:scale', + 'items' => [ + [ + 'label' => 'sidebar.logistique.weighing_tickets', + 'to' => '/weighing-tickets', + 'icon' => 'mdi:scale', + 'module' => 'logistique', + 'permission' => 'logistique.weighing_tickets.view', + ], + ], + ], // Section "Administration" : regroupe toutes les pages de configuration // applicative (RBAC, users, sites, audit log). // diff --git a/frontend/i18n/locales/fr.json b/frontend/i18n/locales/fr.json index c469f5a..6c84127 100644 --- a/frontend/i18n/locales/fr.json +++ b/frontend/i18n/locales/fr.json @@ -39,6 +39,10 @@ "section": "Transport", "carriers": "Répertoire transporteurs" }, + "logistique": { + "section": "Logistique", + "weighing_tickets": "Tickets de pesée" + }, "core": { "roles": "Gestion des rôles", "users": "Utilisateurs", diff --git a/frontend/modules/logistique/nuxt.config.ts b/frontend/modules/logistique/nuxt.config.ts new file mode 100644 index 0000000..268da7f --- /dev/null +++ b/frontend/modules/logistique/nuxt.config.ts @@ -0,0 +1 @@ +export default defineNuxtConfig({}) diff --git a/frontend/tests/e2e/_fixtures/personas.ts b/frontend/tests/e2e/_fixtures/personas.ts index b690cc2..0d36cf3 100644 --- a/frontend/tests/e2e/_fixtures/personas.ts +++ b/frontend/tests/e2e/_fixtures/personas.ts @@ -102,6 +102,12 @@ export const personas: Record = { 'transport.carriers.view', 'transport.carriers.manage', 'transport.carriers.archive', + // Logistique — Tickets de pesee (M5, ERP-181). Meme logique : mappe sur + // le persona "tout", pas de nouveau persona (regle ABSOLUE n°7). + // logistique.weighing_tickets.view n'ajoute pas de lien dans la section + // Administration, donc expectedAdminLinks reste inchange. + 'logistique.weighing_tickets.view', + 'logistique.weighing_tickets.manage', ], expectedAdminLinks: ['users', 'roles', 'sites', 'categories', 'audit-log'], }, diff --git a/src/Module/Core/Application/Rbac/RbacSeeder.php b/src/Module/Core/Application/Rbac/RbacSeeder.php index d96d7b6..0f14233 100644 --- a/src/Module/Core/Application/Rbac/RbacSeeder.php +++ b/src/Module/Core/Application/Rbac/RbacSeeder.php @@ -80,6 +80,9 @@ final class RbacSeeder // Transporteurs (M4 § 5.2, ERP-153) : view + manage (PAS archive -> admin seul). 'transport.carriers.view', 'transport.carriers.manage', + // Tickets de pesee (M5 § 5.2, ERP-181) : view + manage (« Tout »). + 'logistique.weighing_tickets.view', + 'logistique.weighing_tickets.manage', // Visibilite multi-site des prestataires (M3 § 2.13) : voit tous les sites. 'sites.bypass_scope', // Lecture des referentiels transverses pour les selects client (ERP-102). @@ -137,9 +140,14 @@ final class RbacSeeder 'label' => 'Usine', // Prestataires (M3 § 2.9 + § 2.13, ERP-138) : view en lecture seule, // SANS `sites.bypass_scope` -> cloisonne aux prestataires de son site - // courant. Aucun autre acces metier. + // courant. 'permissions' => [ 'technique.providers.view', + // Tickets de pesee (M5 § 5.2, ERP-181) : view + manage. L'Usine + // pese sur site -> reste cloisonnee a son site courant (pas de + // bypass_scope ; les tickets sont filtres par SiteScopedQueryExtension). + 'logistique.weighing_tickets.view', + 'logistique.weighing_tickets.manage', ], ], ]; diff --git a/src/Module/Core/Infrastructure/Console/SeedE2ECommand.php b/src/Module/Core/Infrastructure/Console/SeedE2ECommand.php index 880a2cb..bd24d5c 100644 --- a/src/Module/Core/Infrastructure/Console/SeedE2ECommand.php +++ b/src/Module/Core/Infrastructure/Console/SeedE2ECommand.php @@ -217,6 +217,10 @@ final class SeedE2ECommand extends Command 'transport.carriers.view', 'transport.carriers.manage', 'transport.carriers.archive', + // Logistique — Tickets de pesee (M5, ERP-181). Meme logique : + // mappe sur le persona "tout". Miroir de personas.ts. + 'logistique.weighing_tickets.view', + 'logistique.weighing_tickets.manage', ], ], [ diff --git a/src/Module/Logistique/LogistiqueModule.php b/src/Module/Logistique/LogistiqueModule.php new file mode 100644 index 0000000..8e9bda0 --- /dev/null +++ b/src/Module/Logistique/LogistiqueModule.php @@ -0,0 +1,33 @@ + permissions dans + * `RbacSeeder::MATRIX` (§ 5.2 : Bureau / Usine = view + manage ; Compta / + * Commerciale = aucun acces). + * + * @return array + */ + public static function permissions(): array + { + return [ + ['code' => 'logistique.weighing_tickets.view', 'label' => 'Voir les tickets de pesée'], + ['code' => 'logistique.weighing_tickets.manage', 'label' => 'Créer / modifier les tickets de pesée'], + ]; + } +}