diff --git a/config/sidebar.php b/config/sidebar.php index 5f5d3a0..fd45eda 100644 --- a/config/sidebar.php +++ b/config/sidebar.php @@ -134,6 +134,16 @@ return [ 'module' => 'transport', 'permission' => 'transport.carriers.view', ], + // Catalogue produit (M6, ERP-197). Place juste sous le repertoire + // transporteurs (DECISION Matthieu 24/06). Admin-only : gate par + // `catalog.products.view` et son module owner `catalog`. + [ + 'label' => 'sidebar.catalog.products', + 'to' => '/admin/products', + 'icon' => 'mdi:package-variant-closed', + 'module' => 'catalog', + 'permission' => 'catalog.products.view', + ], [ 'label' => 'sidebar.core.roles', 'to' => '/admin/roles', diff --git a/frontend/i18n/locales/fr.json b/frontend/i18n/locales/fr.json index d0ac263..b3a8e70 100644 --- a/frontend/i18n/locales/fr.json +++ b/frontend/i18n/locales/fr.json @@ -52,7 +52,8 @@ "admin": "Sites" }, "catalog": { - "categories": "Gestion des catégories" + "categories": "Gestion des catégories", + "products": "Catalogue produit" } }, "dashboard": { diff --git a/frontend/tests/e2e/_fixtures/personas.ts b/frontend/tests/e2e/_fixtures/personas.ts index 3d7ace5..6596efa 100644 --- a/frontend/tests/e2e/_fixtures/personas.ts +++ b/frontend/tests/e2e/_fixtures/personas.ts @@ -35,7 +35,7 @@ export interface Persona { // sidebar-visibility pour driver la matrice. Les valeurs correspondent // aux slugs de route (`/admin/`), volontairement stables quand // la copie/i18n change. - expectedAdminLinks: Array<'users' | 'roles' | 'sites' | 'audit-log' | 'categories'> + expectedAdminLinks: Array<'users' | 'roles' | 'sites' | 'audit-log' | 'categories' | 'products'> } const SHARED_PASSWORD = 'e2e-secret' @@ -47,7 +47,7 @@ export const personas: Record = { password: SHARED_PASSWORD, isAdmin: true, permissions: [], - expectedAdminLinks: ['users', 'roles', 'sites', 'categories', 'audit-log'], + expectedAdminLinks: ['users', 'roles', 'sites', 'categories', 'products', 'audit-log'], }, 'user-full': { key: 'user-full', @@ -65,6 +65,12 @@ export const personas: Record = { 'sites.bypass_scope', 'catalog.categories.view', 'catalog.categories.manage', + // Catalogue produit (M6, ERP-197). Admin-only (matrice docx p.3) : + // mappe sur le persona "tout", pas de nouveau persona (regle ABSOLUE + // n°7). L'item vit dans la section Administration sur la route + // `/admin/products` -> ajoute le lien `products` a expectedAdminLinks. + 'catalog.products.view', + 'catalog.products.manage', // Commercial — Repertoire clients (M1). Mappe ici sur le persona // "tout" en attendant les vrais roles metier (bureau/compta/ // commerciale/usine) seedes par ERP-74. Pas de nouveau persona @@ -110,7 +116,7 @@ export const personas: Record = { 'logistique.weighing_tickets.view', 'logistique.weighing_tickets.manage', ], - expectedAdminLinks: ['users', 'roles', 'sites', 'categories', 'audit-log'], + expectedAdminLinks: ['users', 'roles', 'sites', 'categories', 'products', 'audit-log'], }, 'user-readonly': { key: 'user-readonly', @@ -155,4 +161,4 @@ export function getPersona(key: PersonaKey): Persona { return personas[key] } -export const ALL_ADMIN_LINKS = ['users', 'roles', 'sites', 'categories', 'audit-log'] as const +export const ALL_ADMIN_LINKS = ['users', 'roles', 'sites', 'categories', 'products', 'audit-log'] as const diff --git a/src/Module/Catalog/CatalogModule.php b/src/Module/Catalog/CatalogModule.php index 1465e57..c5154f9 100644 --- a/src/Module/Catalog/CatalogModule.php +++ b/src/Module/Catalog/CatalogModule.php @@ -43,6 +43,10 @@ final class CatalogModule // sans donner l'acces d'administration `.view` (qui ouvre la page Catalogue // dans la sidebar). Accordee aux roles metier via la matrice RBAC § 2.7. ['code' => 'catalog.categories.read_ref', 'label' => 'Lire le referentiel categories (transverse, lecture seule)'], + // Catalogue produit (M6, ERP-197) : admin-only (matrice docx p.3, C7). + // Item sidebar dans la section Administration, sous « Repertoire transporteurs ». + ['code' => 'catalog.products.view', 'label' => 'Voir les produits'], + ['code' => 'catalog.products.manage', 'label' => 'Gérer les produits (créer, éditer)'], ]; } } diff --git a/src/Module/Core/Infrastructure/Console/SeedE2ECommand.php b/src/Module/Core/Infrastructure/Console/SeedE2ECommand.php index bd24d5c..3763268 100644 --- a/src/Module/Core/Infrastructure/Console/SeedE2ECommand.php +++ b/src/Module/Core/Infrastructure/Console/SeedE2ECommand.php @@ -186,6 +186,10 @@ final class SeedE2ECommand extends Command 'sites.bypass_scope', 'catalog.categories.view', 'catalog.categories.manage', + // Catalogue produit (M6, ERP-197). Admin-only (matrice docx + // p.3) : mappe sur le persona "tout". Miroir de personas.ts. + 'catalog.products.view', + 'catalog.products.manage', // Commercial — Repertoire clients (M1). Mappe ici sur le // persona "tout" en attendant les vrais roles metier // (bureau/compta/commerciale/usine) seedes par ERP-74.