0052eab1fe
Modèle et API CRUD du module Tournées (M6.3, scope réduit V0.2 : pas de
rapport de visite, donc TourStop sans report_id ni check-in).
- Entités Tour (table tour) + TourStop (table tour_stop) : #[Auditable],
Timestampable/Blamable, enum TourStatus (draft|planned|in_progress|done),
soft delete sur Tour.
- API Platform : GET/POST/GET/PATCH/DELETE /api/tours (DELETE = soft delete),
sous-ressource POST /api/tours/{tourId}/stops + PATCH/DELETE /api/tour_stops/{id}.
- RG-6.01 : tournée personnelle (TourProvider filtre owner ; admin/Bureau
voient tout). RG-6.03 : adresse appartient au Tiers (TourStopProcessor +
TierAddressResolver DBAL, sans import inter-module). RG-6.07 : pas d'unicité
tier_id. RG-6.12 : cohérence custom/Tiers (Assert\Callback).
- Migration racine : tables + COMMENT ON COLUMN FR + index unique
(tour_id, position) + FK CASCADE ; mirror dans ColumnCommentsCatalog.
- i18n audit (fieldsales_tour / _tourstop), mappings Doctrine + API Platform.
- Tests fonctionnels : owner, RG-6.03/6.07/6.12, pagination, unicité position,
soft delete, RBAC (17 tests).
Co-Authored-By: Matthieu <mtholot19@gmail.com>
54 lines
2.2 KiB
PHP
54 lines
2.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Shared\Domain\Security;
|
|
|
|
/**
|
|
* Codes des roles METIER MALIO partages entre modules.
|
|
*
|
|
* Distincts des roles SYSTEME (cf. App\Module\Core\Domain\Security\SystemRoles :
|
|
* `admin` / `user`). Un role metier porte une intention fonctionnelle (poste de
|
|
* travail) et conditionne certaines regles de gestion au-dela des permissions
|
|
* RBAC pures (Commerciale et Bureau partagent par ex. les memes permissions
|
|
* commercial.clients.view + manage mais peuvent porter des regles de gestion
|
|
* propres au poste). NB : l'ancienne RG-1.04 du M1 (« Information obligatoire
|
|
* pour Commerciale ») a ete retiree — l'onglet Information est facultatif pour
|
|
* tous ; la machinerie de role metier reste disponible pour de futures regles.
|
|
*
|
|
* Ces constantes vivent dans Shared (et non dans un module) pour que :
|
|
* - le seed des roles cote Core (ERP-74) reference le meme code sans importer
|
|
* une constante du module Commercial (regle ABSOLUE n°1 : pas d'import
|
|
* inter-modules) ;
|
|
* - le ClientProcessor (module Commercial) detecte le role Commerciale via ce
|
|
* meme code, sans dependre de Core.
|
|
*
|
|
* Coordination stack M1 :
|
|
* - ERP-74 seede le role `commerciale` avec ce code exact.
|
|
* - ERP-59 / ERP-60 (declaration RBAC + tests personas) le reutilisent.
|
|
* - ERP-55 le referencait pour la completude Information (M1 RG-1.04), regle
|
|
* depuis retiree ; le code reste utilise par le seed RBAC et les personas.
|
|
*/
|
|
final class BusinessRoles
|
|
{
|
|
/**
|
|
* Role metier « Commerciale » — code de Role RBAC (champ Role::code,
|
|
* snake_case impose par la regex Role).
|
|
*/
|
|
public const string COMMERCIALE = 'commerciale';
|
|
|
|
/**
|
|
* Role metier « Bureau » — code de Role RBAC. Utilise par FieldSales (M6,
|
|
* RG-6.01) : le Bureau voit TOUTES les tournees en lecture (comme l'admin),
|
|
* la Commerciale ne voit que les siennes. Reference ici (Shared) pour que le
|
|
* TourProvider raisonne sur le role metier via BusinessRoleAwareInterface
|
|
* sans importer le RbacSeeder du module Core (regle ABSOLUE n°1).
|
|
*/
|
|
public const string BUREAU = 'bureau';
|
|
|
|
private function __construct()
|
|
{
|
|
// Classe de constantes : non instanciable.
|
|
}
|
|
}
|