feat(field_sales) : calcul de trajet, optimisation, duplication & roadbook PDF (ERP-125)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Failing after 52s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Failing after 11s

- RouteEngineInterface (computeMatrix/optimizeOrder/estimateLegDurations) + HaversineRouteEngine V1 (vitesse moyenne parametrable, plus proche voisin)
- TourRouteCalculator : resolution coords, ETA (RG-6.11), exclusion sans coords (RG-6.05), totaux ; optimize = reorder + recompute
- Endpoints API Platform POST /tours/{id}/compute, /optimize, /duplicate (TourDuplicator, RG-6.13) + Processors, security manage
- Feuille de route PDF GET /tours/{id}/roadbook.pdf (Dompdf + Twig) via PdfRendererInterface (Shared), controller priority:1, security view
- TierAddressResolver etendu (coords + location DBAL)
- Tests : HaversineRouteEngine (unit), compute/optimize/duplicate/roadbook (API)
This commit is contained in:
Matthieu
2026-06-11 16:46:49 +02:00
parent 0052eab1fe
commit f8f7571cc0
21 changed files with 2120 additions and 4 deletions
+11
View File
@@ -1,6 +1,8 @@
# yaml-language-server: $schema=../vendor/symfony/dependency-injection/Loader/schema/services.schema.json
parameters:
# Vitesse moyenne (km/h) du moteur de trajet V1 Haversine (M6 § 3.4).
field_sales.route_average_speed_kmh: 50.0
imports:
- { resource: version.yaml }
@@ -38,6 +40,15 @@ services:
App\Shared\Domain\Contract\GeocoderInterface:
alias: App\Shared\Infrastructure\Geocoding\BanGeocoder
# Moteur de trajet V1 (M6 § 3.4) : Haversine + plus proche voisin. La V2
# rebranchera OrsRouteEngine ici sans toucher au calculateur ni au front.
App\Module\FieldSales\Domain\Route\RouteEngineInterface:
alias: App\Module\FieldSales\Infrastructure\Route\HaversineRouteEngine
# Rendu PDF (feuille de route M6.4, etc.) : Dompdf.
App\Shared\Domain\Contract\PdfRendererInterface:
alias: App\Shared\Infrastructure\Pdf\DompdfRenderer
# En test : geocodeur en memoire, deterministe et sans reseau (les tests
# fonctionnels d'adresse ne doivent jamais appeler la BAN reelle).
when@test: