Compare commits

..

1 Commits

Author SHA1 Message Date
Matthieu 864bc7e8e8 feat(logistique) : scaffold module + socle RBAC tickets de pesée (ERP-181)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 3m23s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m49s
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)
2026-06-17 15:58:27 +02:00
8 changed files with 77 additions and 1 deletions
+2
View File
@@ -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,
];
+18
View File
@@ -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).
//
+4
View File
@@ -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",
@@ -0,0 +1 @@
export default defineNuxtConfig({})
+6
View File
@@ -102,6 +102,12 @@ export const personas: Record<PersonaKey, Persona> = {
'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'],
},
@@ -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',
],
],
];
@@ -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',
],
],
[
@@ -0,0 +1,33 @@
<?php
declare(strict_types=1);
namespace App\Module\Logistique;
final class LogistiqueModule
{
public const string ID = 'logistique';
public const string LABEL = 'Logistique';
public const bool REQUIRED = false;
/**
* Liste declarative des permissions RBAC exposees par le module Logistique.
*
* Socle des tickets de pesee (M5 § 5.1, ERP-181) :
* - `view` : consultation de la liste / fiche d'un ticket de pesee ;
* - `manage` : creation / modification d'un ticket de pesee.
*
* Consommee par `app:sync-permissions`. Matrice role -> permissions dans
* `RbacSeeder::MATRIX` (§ 5.2 : Bureau / Usine = view + manage ; Compta /
* Commerciale = aucun acces).
*
* @return array<int, array{code: string, label: string}>
*/
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'],
];
}
}