From 25fe78ccfc08206ca663621facfcf6cbffde3960 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 1 Jul 2026 19:16:42 +0200 Subject: [PATCH] =?UTF-8?q?fix(booking-edit):=20recalcul=20du=20prix=20cas?= =?UTF-8?q?s=C3=A9=20par=20le=20format=20du=20nom=20transporteur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La recherche de tarif renvoie le transporteur en slug ("ssc-consolidation") alors que la réservation stocke le nom d'affichage ("SSC Consolidation"), donc le matching exact companyName === carrierName ne trouvait jamais l'offre → "aucun tarif trouvé" et prix jamais recalculé. Matching robuste : comparaison normalisée du transporteur (minuscules, sans séparateurs) + conteneur + transit, avec fallbacks. Vérifié en conditions réelles (GET booking, search-csv-offers, PATCH details renvoient 200 ; le prix change bien quand le volume change). Co-Authored-By: Claude Opus 4.8 --- .../dashboard/booking/[id]/edit/page.tsx | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/apps/frontend/app/[locale]/dashboard/booking/[id]/edit/page.tsx b/apps/frontend/app/[locale]/dashboard/booking/[id]/edit/page.tsx index 8a7ec76..af6baea 100644 --- a/apps/frontend/app/[locale]/dashboard/booking/[id]/edit/page.tsx +++ b/apps/frontend/app/[locale]/dashboard/booking/[id]/edit/page.tsx @@ -145,17 +145,25 @@ export default function EditBookingPage() { hasDangerousGoods: false, }); const results = response.results || []; + + // The rate search returns the carrier as a slug (e.g. "ssc-consolidation") + // while the booking stores the display name ("SSC Consolidation"), so carriers + // are compared on a normalized form. Container + transit uniquely identify the + // originally chosen offer for the route, and are the primary match keys. + const norm = (s: string) => (s || '').toLowerCase().replace(/[^a-z0-9]/g, ''); + const carrier = norm(booking.carrierName); + const sameContainer = (r: any) => r.containerType === booking.containerType; + const sameTransit = (r: any) => + (r.adjustedTransitDays ?? r.transitDays) === booking.transitDays; + const sameCarrier = (r: any) => norm(r.companyName) === carrier; + const match = - results.find( - (r: any) => - r.companyName === booking.carrierName && - r.containerType === booking.containerType && - (r.adjustedTransitDays ?? r.transitDays) === booking.transitDays - ) || - results.find( - (r: any) => - r.companyName === booking.carrierName && r.containerType === booking.containerType - ); + results.find((r: any) => sameCarrier(r) && sameContainer(r) && sameTransit(r)) || + results.find((r: any) => sameContainer(r) && sameTransit(r)) || + results.find((r: any) => sameCarrier(r) && sameContainer(r)) || + results.find((r: any) => sameCarrier(r)) || + results.find((r: any) => sameContainer(r)) || + null; if (!match) return null;