feat(field_sales) : fondations du module Tournées + VisitableInterface + RBAC (ERP-123)
- Module FieldSales (ID field_sales, REQUIRED false) avec 2 permissions field_sales.tours.view / .manage (scope V0.2, pas de reports.*), active dans config/modules.php. - Contrat partage VisitableInterface (getId/getDisplayName/getVisitableType) implemente par Client (client) et Supplier (supplier) sans import inter-module. Note doctrine.yaml : contrat polymorphe (2 implementations) donc resolu par service via (tier_type, tier_id), pas via resolve_target_entities. - 3 miroirs RBAC alignes : sidebar.php (section Tournées, item /tours, i18n sidebar.field_sales.*), personas.ts et SeedE2ECommand.php (user-full) ; matrice metier RbacSeeder (Commerciale = view+manage, Bureau = view, Compta exclue, Admin bypass).
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Shared\Domain\Contract;
|
||||
|
||||
/**
|
||||
* Contrat partage rendant un Tiers « visitable » par le module FieldSales (M6),
|
||||
* sans creer de couplage direct FieldSales -> Commercial (regle ABSOLUE n°1).
|
||||
*
|
||||
* Implemente par les Tiers du referentiel : Client (M1) et Supplier (M2), et
|
||||
* extensible aux futurs types (Prestataire...) sans toucher au module FieldSales.
|
||||
*
|
||||
* Resolution polymorphe : une etape de tournee (TourStop, ERP-124) cible un Tiers
|
||||
* via le couple (`tier_type`, `tier_id`) plutot que via une association Doctrine.
|
||||
* `getVisitableType()` fournit la valeur stable de `tier_type` ('client',
|
||||
* 'supplier', ...) qui permet, cote service, de retrouver l'implementation
|
||||
* concrete a partir de l'id. Cette interface n'est donc PAS une cible
|
||||
* `resolve_target_entities` (qui ne mappe qu'un contrat -> une seule classe,
|
||||
* alors qu'ici plusieurs entites l'implementent) : cf. note dans doctrine.yaml.
|
||||
*/
|
||||
interface VisitableInterface
|
||||
{
|
||||
/**
|
||||
* Identifiant du Tiers (null tant que non persiste).
|
||||
*/
|
||||
public function getId(): ?int;
|
||||
|
||||
/**
|
||||
* Libelle affichable du Tiers (ex: raison sociale), pour les pins de la carte
|
||||
* et la liste d'etapes d'une tournee. Jamais null (chaine vide a defaut).
|
||||
*/
|
||||
public function getDisplayName(): string;
|
||||
|
||||
/**
|
||||
* Type stable du Tiers, valeur portee par `tour_stop.tier_type`
|
||||
* ('client' | 'supplier' | ... ). Volontairement une string (et non un enum
|
||||
* ferme) pour rester ouvert aux futurs types Visitable + au point `custom`.
|
||||
*/
|
||||
public function getVisitableType(): string;
|
||||
}
|
||||
Reference in New Issue
Block a user