faafd99ef8
Auto Tag Develop / tag (push) Successful in 8s
MR unique regroupant tout le module M5 « Tickets de pesée » (remplace les MR empilées #140/#141/#142/#143).
## Périmètre
- **ERP-188** — Page liste des tickets de pesée + export XLSX (colonnes Fournisseur/Client/Autre + Statut).
- **ERP-189** — Écran « Ajouter » (4 champs en haut, 2 blocs de pesée, pesée bascule/manuelle, date+heure horodatée à la validation).
- **ERP-190** — Écran « Modifier » + bouton Imprimer.
- **ERP-191** — i18n + libellés + branchement site courant.
- **ERP-192** — Bon de pesée PDF généré côté back (template Twig → Dompdf), endpoint `GET /api/weighing_tickets/{id}/print.pdf`.
- **ERP-193** — Cycle de vie brouillon/validé (status DRAFT/VALIDATED, numéro attribué à la validation), DSD saisi conservé en pesée manuelle, retours métier design.
## Vérifications
- Back : tests Logistique + architecture verts, php-cs-fixer propre, migrations appliquées (dev + test).
- Front : suite Vitest complète verte, ESLint propre.
Base : `develop` — contient les 16 commits du M5 (rien d'autre).
Reviewed-on: #144
Co-authored-by: tristan <tristan@yuno.malio.fr>
Co-committed-by: tristan <tristan@yuno.malio.fr>
196 lines
8.6 KiB
PHP
196 lines
8.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/*
|
|
* Sidebar configuration.
|
|
*
|
|
* This file defines the sidebar sections displayed in the frontend.
|
|
*
|
|
* Each SECTION may declare :
|
|
* - `label` (required) : i18n key resolved by the frontend
|
|
* - `icon` (required) : MDI icon name
|
|
* - `items` (required) : list of items (see below)
|
|
* - `permission` (opt.) : RBAC permission code ; when set, the whole
|
|
* section (and every one of its items) is hidden
|
|
* from users who do not hold that permission.
|
|
* Use this for "umbrella" sections like
|
|
* Administration where you want to gate the
|
|
* entire group behind one coarse permission.
|
|
*
|
|
* Each ITEM may declare :
|
|
* - `label` (required) : i18n key
|
|
* - `to` (required) : Nuxt route
|
|
* - `icon` (required) : MDI icon name
|
|
* - `module` (required) : owner module ID ; item is hidden if the
|
|
* module is not listed in config/modules.php
|
|
* - `permission` (opt.) : RBAC permission code ; finer-grained gate
|
|
* applied in addition to the section-level one
|
|
*
|
|
* Precedence : section-level `permission` is evaluated first. If it fails,
|
|
* the whole section is skipped and every item's `to` is added to the
|
|
* `disabledRoutes` payload of /api/sidebar (so the front middleware can
|
|
* redirect any direct navigation). Individual items without their own
|
|
* permission are implicitly protected by the section-level one.
|
|
*
|
|
* This config is decoupled from the modules themselves: you can freely
|
|
* move an item from one section to another without touching the module code.
|
|
*/
|
|
|
|
return [
|
|
// Section "Logistique" (M5, ERP-181) : nouveau pole "operations physiques sur
|
|
// site", distinct du repertoire Transport (M4, desormais rattache a la section
|
|
// Administration cote develop). Porte le ticket de pesee au pont bascule.
|
|
// Placee en tete de sidebar (avant Commerciale). 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:truck-outline',
|
|
'items' => [
|
|
[
|
|
'label' => 'sidebar.logistique.weighing_tickets',
|
|
'to' => '/weighing-tickets',
|
|
'icon' => 'mdi:truck-outline',
|
|
'module' => 'logistique',
|
|
'permission' => 'logistique.weighing_tickets.view',
|
|
],
|
|
],
|
|
],
|
|
// Section "Commerciale" : pole metier principal (ERP-71).
|
|
// L'ordre interne des onglets et les permissions restent inchanges (simple deplacement
|
|
// du bloc, aucun gate touche).
|
|
[
|
|
'label' => 'sidebar.commercial.section',
|
|
'icon' => 'mdi:account-arrow-left-outline',
|
|
'items' => [
|
|
[
|
|
'label' => 'sidebar.commercial.suppliers',
|
|
'to' => '/suppliers',
|
|
'icon' => 'mdi:account-arrow-left-outline',
|
|
'module' => 'commercial',
|
|
'permission' => 'commercial.suppliers.view',
|
|
],
|
|
[
|
|
'label' => 'sidebar.commercial.clients',
|
|
'to' => '/clients',
|
|
'icon' => 'mdi:account-group-outline',
|
|
'module' => 'commercial',
|
|
'permission' => 'commercial.clients.view',
|
|
],
|
|
],
|
|
],
|
|
// Section "Technique" (M3, ERP-138) : pole distinct du Commercial, porte le
|
|
// repertoire prestataires. L'item est gate par `technique.providers.view` ;
|
|
// la section disparait automatiquement (SidebarProvider) si le module
|
|
// `technique` est desactive ou si l'user n'a pas la permission.
|
|
[
|
|
'label' => 'sidebar.technique.section',
|
|
'icon' => 'mdi:account-convert-outline',
|
|
'items' => [
|
|
[
|
|
'label' => 'sidebar.technique.providers',
|
|
'to' => '/providers',
|
|
'icon' => 'mdi:account-wrench-outline',
|
|
'module' => 'technique',
|
|
'permission' => 'technique.providers.view',
|
|
],
|
|
],
|
|
],
|
|
// Section "Administration" : regroupe toutes les pages de configuration
|
|
// applicative (RBAC, users, sites, audit log).
|
|
//
|
|
// CONVENTION : "etre admin" = detenir au moins une permission admin-scoped.
|
|
// En pratique, le groupe `core.*` represente l'administration applicative
|
|
// (users, roles, audit_log) ; les autres permissions admin-scoped proviennent
|
|
// des modules qui exposent leur propre page d'admin dans cette section
|
|
// (ex: `sites.view`). Un user qui n'a AUCUNE de ces permissions n'a pas
|
|
// acces a l'administration.
|
|
//
|
|
// Gate implicite : tous les items de cette section declarent une `permission`.
|
|
// Sans aucune permission correspondante, tous les items sont filtres, la
|
|
// section devient vide et est automatiquement masquee par SidebarProvider
|
|
// (cf. la boucle de filtrage : section vide => `continue`). Inutile donc
|
|
// d'ajouter un gate explicite au niveau section tant que chaque item porte
|
|
// sa propre permission.
|
|
//
|
|
// Pour imposer un gate explicite supplementaire (ex: "seuls les membres du
|
|
// groupe support voient l'administration, meme s'ils ont des permissions
|
|
// individuelles"), ajouter : 'permission' => 'core.admin.access'.
|
|
[
|
|
'label' => 'sidebar.administration.section',
|
|
'icon' => 'mdi:file-settings-cog-outline',
|
|
'items' => [
|
|
// Transport — Repertoire transporteurs (M4, ERP-164). Rattache a
|
|
// l'Administration (premier item) plutot qu'a une section dediee :
|
|
// referentiel global de configuration applicative, sans cloisonnement
|
|
// par site. Reste gate par sa propre permission `transport.carriers.view`
|
|
// (Admin / Bureau / Commerciale) et son module owner `transport`.
|
|
[
|
|
'label' => 'sidebar.transport.carriers',
|
|
'to' => '/carriers',
|
|
'icon' => 'mdi:truck-outline',
|
|
'module' => 'transport',
|
|
'permission' => 'transport.carriers.view',
|
|
],
|
|
[
|
|
'label' => 'sidebar.core.roles',
|
|
'to' => '/admin/roles',
|
|
'icon' => 'mdi:shield-account-outline',
|
|
'module' => 'core',
|
|
'permission' => 'core.roles.view',
|
|
],
|
|
[
|
|
'label' => 'sidebar.core.users',
|
|
'to' => '/admin/users',
|
|
'icon' => 'mdi:account-group-outline',
|
|
'module' => 'core',
|
|
'permission' => 'core.users.view',
|
|
],
|
|
[
|
|
'label' => 'sidebar.sites.admin',
|
|
'to' => '/admin/sites',
|
|
'icon' => 'mdi:domain',
|
|
'module' => 'sites',
|
|
'permission' => 'sites.view',
|
|
],
|
|
[
|
|
'label' => 'sidebar.catalog.categories',
|
|
'to' => '/admin/categories',
|
|
'icon' => 'mdi:tag-multiple-outline',
|
|
'module' => 'catalog',
|
|
'permission' => 'catalog.categories.view',
|
|
],
|
|
[
|
|
'label' => 'sidebar.core.audit_log',
|
|
'to' => '/admin/audit-log',
|
|
'icon' => 'mdi:clipboard-text-clock',
|
|
'module' => 'core',
|
|
'permission' => 'core.audit_log.view',
|
|
],
|
|
],
|
|
],
|
|
// Section "Mon compte" : espace personnel. Accessible a tout user authentifie
|
|
// (aucune permission RBAC requise, tous les items restent dans `core` pour
|
|
// rester toujours presents meme quand les modules metier sont desactives).
|
|
[
|
|
'label' => 'sidebar.account.section',
|
|
'icon' => 'mdi:account-circle-outline',
|
|
'items' => [
|
|
[
|
|
'label' => 'sidebar.account.dashboard',
|
|
'to' => '/',
|
|
'icon' => 'mdi:view-dashboard-outline',
|
|
'module' => 'core',
|
|
],
|
|
[
|
|
'label' => 'sidebar.account.logout',
|
|
'to' => '/logout',
|
|
'icon' => 'mdi:logout',
|
|
'module' => 'core',
|
|
],
|
|
],
|
|
],
|
|
];
|