- API visitable_tiers (provider DBAL bbox/q/type, paginé) pour les pins de la carte
- POST /tours/{id}/reorder (drag & drop) : renumérotation atomique + recompute
- Layer front field-sales : TourMap (pins, popup, polyline, sélection rectangle),
liste d'étapes draggable (vuedraggable), composable de planification + Vitest
- Pages /tours, /tours/new, /tours/[id]/plan (split responsive, point custom géocodé)
- i18n FR, deep links Waze/Google/Apple, état 100% local
- 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).