fix: přesnější stav kurýra u sledování Wolt
CI / Generate TypeScript types (push) Successful in 10s
CI / Server unit tests (push) Successful in 24s
CI / Build server (push) Successful in 29s
CI / Build client (push) Successful in 40s
CI / Playwright E2E tests (push) Successful in 1m46s
CI / Build and push Docker image (push) Successful in 48s
CI / Notify (push) Successful in 3s

Wolt hlásí stav podniku, ne rozvozu — status zůstane na "ready" i celou dobu,
co kurýr objednávku veze. Vyzvednutí proto poznáme podle pickup_eta: dokud je
v budoucnosti, jídlo ještě čeká v podniku, po vyzvednutí se ustálí na skutečném
čase. Dřív se stav odvozoval jen z příznaků kurýra, takže objednávka zůstala
viset na kroku "Vyzvedávání", i když už byla na cestě.

Kurýr má nově tři odvozené stavy: assigned (ještě nevyzvedl), delivering (veze
ji k nám) a delivering_other (veze ji, ale nejdřív doručuje cizí objednávku —
Wolt objednávky spojuje a kurýr se pak na mapě vzdaluje). Oba stavy delivering*
znamenají krok "Na cestě", tooltip u nich vysvětlí objížďku.
This commit is contained in:
batmanisko committed 2026-08-24 12:06:43 +02:00
1 parent 5c048fe1f1
commit 936ce2a9e4
4 files changed
+56 -17

No files matched your search

+19 -7
View File
@@ -153,6 +153,7 @@ const boltTracker: DeliveryTracker = {
interface WoltTrackingDetails {
status?: string;
delivery_eta?: string | null;
pickup_eta?: string | null;
couriers?: WoltCourier[];
timezone?: string;
}
@@ -165,14 +166,25 @@ interface WoltCourier {
}
/**
* Wolt neposílá stav kurýra, jen jeho pozici a dva příznaky. Odvodíme z nich
* dvojí stav: 'delivering' (veze naši objednávku → krok „Na cestě") a 'assigned'
* (kurýr přiřazen, ale naše jídlo ještě nemá — typicky doručuje cizí objednávku).
* Wolt nemá stav „vyzvednuto" — status zůstává celou dobu doručování na hodnotě
* ready (ta popisuje jen podnik: jídlo je hotové). Že kurýr jídlo skutečně veze,
* poznáme podle pickup_eta: dokud vyzvednutí teprve nastane, je v budoucnosti;
* po vyzvednutí se ustálí na skutečném čase a zůstane v minulosti (na rozdíl od
* delivery_eta, který se dál přepočítává).
*
* Odvozené stavy kurýra:
* - 'assigned' kurýr přiřazen, jídlo ještě nevyzvedl
* - 'delivering' veze naši objednávku k nám
* - 'delivering_other' veze naši objednávku, ale nejdřív doručuje cizí (Wolt
* spojuje objednávky — kurýr se pak na mapě vzdaluje)
*/
function woltCourierState(couriers?: WoltCourier[]): string | undefined {
const courier = couriers?.[0];
function woltCourierState(details: WoltTrackingDetails, now: number = Date.now()): string | undefined {
const courier = details.couriers?.[0];
if (!courier) return undefined;
return courier.is_delivering && !courier.is_delivering_other_order ? 'delivering' : 'assigned';
const pickupEta = details.pickup_eta ? new Date(details.pickup_eta).getTime() : NaN;
const pickedUp = !Number.isNaN(pickupEta) && pickupEta <= now;
if (!courier.is_delivering || !pickedUp) return 'assigned';
return courier.is_delivering_other_order ? 'delivering_other' : 'delivering';
}
const woltTracker: DeliveryTracker = {
@@ -214,7 +226,7 @@ const woltTracker: DeliveryTracker = {
}
return {
orderState: details.status,
courierState: woltCourierState(details.couriers),
courierState: woltCourierState(details),
deliveryAt: details.delivery_eta ? formatEtaHHMM(details.delivery_eta, details.timezone) : undefined,
};
},