fix: správné mapování stavu waiting_delivery ve stepperu Bolt
CI / Generate TypeScript types (push) Successful in 12s
CI / Server unit tests (push) Successful in 20s
CI / Build server (push) Successful in 28s
CI / Build client (push) Successful in 1m10s
CI / Playwright E2E tests (push) Successful in 1m22s
CI / Build and push Docker image (push) Successful in 42s
CI / Notify (push) Successful in 1s
CI / Generate TypeScript types (push) Successful in 12s
CI / Server unit tests (push) Successful in 20s
CI / Build server (push) Successful in 28s
CI / Build client (push) Successful in 1m10s
CI / Playwright E2E tests (push) Successful in 1m22s
CI / Build and push Docker image (push) Successful in 42s
CI / Notify (push) Successful in 1s
Stav waiting_delivery znamená "jídlo čeká v podniku na vyzvednutí", heuristika ho ale kvůli slovu "delivery" mapovala na krok "Na cestě". - waiting_delivery (a obecně waiting_*) se nyní mapuje na "Příprava" - server nově ukládá i stav kurýra (boltCourierState z courier.state); krok "Na cestě" se aktivuje až když kurýr objednávku skutečně veze (picked_up, heading_to_client, ...), kurýr u podniku zůstává v "Příprava" - tooltip stepperu zobrazuje oba raw stavy pro snadnější diagnostiku - regresní test s reálnou odpovědí Bolt API Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -3,16 +3,21 @@ import './BoltOrderProgress.scss';
|
||||
|
||||
const STEPS = ['Přijato', 'Příprava', 'Na cestě', 'Doručeno'];
|
||||
|
||||
/** Známé stavy objednávky z Bolt API → index kroku ve stepperu. */
|
||||
const STATE_TO_STEP: Record<string, number> = {
|
||||
/**
|
||||
* Známé stavy objednávky z Bolt API → index kroku ve stepperu.
|
||||
* Pozor: waiting_delivery znamená "jídlo čeká v podniku na vyzvednutí",
|
||||
* nikoli "na cestě" — tu signalizuje až stav kurýra (picked_up apod.).
|
||||
*/
|
||||
const ORDER_STATE_TO_STEP: Record<string, number> = {
|
||||
created: 0,
|
||||
pending: 0,
|
||||
accepted: 0,
|
||||
waiting_preparation: 0,
|
||||
preparing: 1,
|
||||
waiting_delivery: 1,
|
||||
ready_for_pickup: 1,
|
||||
waiting_courier: 1,
|
||||
courier_assigned: 1,
|
||||
waiting_pickup: 1,
|
||||
picked_up: 2,
|
||||
in_delivery: 2,
|
||||
delivering: 2,
|
||||
@@ -21,32 +26,56 @@ const STATE_TO_STEP: Record<string, number> = {
|
||||
finished: 3,
|
||||
};
|
||||
|
||||
/** Stavy kurýra z Bolt API → index kroku. Kurýr u podniku ještě neznamená "na cestě". */
|
||||
const COURIER_STATE_TO_STEP: Record<string, number> = {
|
||||
heading_to_provider: 1,
|
||||
arrived_to_provider: 1,
|
||||
picked_up: 2,
|
||||
heading_to_client: 2,
|
||||
delivering: 2,
|
||||
arrived_to_client: 2,
|
||||
delivered: 3,
|
||||
};
|
||||
|
||||
/** Neznámé stavy se mapují heuristicky podle klíčových slov. */
|
||||
function stepForState(state: string): number | 'cancelled' {
|
||||
function stepForOrderState(state: string): number | 'cancelled' {
|
||||
const s = state.toLowerCase();
|
||||
if (s in STATE_TO_STEP) return STATE_TO_STEP[s];
|
||||
if (s in ORDER_STATE_TO_STEP) return ORDER_STATE_TO_STEP[s];
|
||||
if (/cancel|reject|fail/.test(s)) return 'cancelled';
|
||||
if (/delivered|finished/.test(s)) return 3;
|
||||
if (/courier|picked|delivery|transport/.test(s)) return 2;
|
||||
if (/prepar|ready|cook/.test(s)) return 1;
|
||||
if (/^waiting|prepar|ready|cook/.test(s)) return 1;
|
||||
if (/picked|delivering|heading_to_client|transport/.test(s)) return 2;
|
||||
return 0;
|
||||
}
|
||||
|
||||
function stepForCourierState(state?: string): number {
|
||||
if (!state) return 0;
|
||||
const s = state.toLowerCase();
|
||||
if (s in COURIER_STATE_TO_STEP) return COURIER_STATE_TO_STEP[s];
|
||||
if (/picked|client|delivering|transport/.test(s)) return 2;
|
||||
return 0;
|
||||
}
|
||||
|
||||
interface Props {
|
||||
/** Raw order_state z Bolt API (např. waiting_preparation) */
|
||||
state: string;
|
||||
/** Raw courier.state z Bolt API (např. arrived_to_provider) */
|
||||
courierState?: string;
|
||||
/** Zda sledování stále běží (skupina má boltTrackingToken) */
|
||||
tracking: boolean;
|
||||
}
|
||||
|
||||
/** Mini progress stepper se stavem objednávky Bolt Food. */
|
||||
export default function BoltOrderProgress({ state, tracking }: Props) {
|
||||
const step = stepForState(state);
|
||||
if (step === 'cancelled') {
|
||||
export default function BoltOrderProgress({ state, courierState, tracking }: Props) {
|
||||
const orderStep = stepForOrderState(state);
|
||||
if (orderStep === 'cancelled') {
|
||||
return <small className="text-danger">Objednávka Bolt byla zrušena</small>;
|
||||
}
|
||||
// Stav kurýra může krok jen zpřesnit dopředu (např. waiting_delivery + picked_up → Na cestě)
|
||||
const step = Math.max(orderStep, stepForCourierState(courierState));
|
||||
const rawInfo = courierState ? `${state} / kurýr: ${courierState}` : state;
|
||||
return (
|
||||
<OverlayTrigger overlay={<Tooltip>Stav z Bolt Food: {state}</Tooltip>}>
|
||||
<OverlayTrigger overlay={<Tooltip>Stav z Bolt Food: {rawInfo}</Tooltip>}>
|
||||
<div className={`bolt-progress${tracking && step < 3 ? ' live' : ''}`}>
|
||||
{STEPS.map((label, i) => (
|
||||
<div key={label} className={`bolt-step${i <= step ? ' done' : ''}${i === step ? ' active' : ''}`}>
|
||||
|
||||
@@ -800,7 +800,7 @@ export default function OrderGroupsPage() {
|
||||
)}
|
||||
{group.boltOrderState && (
|
||||
<div className="mt-2">
|
||||
<BoltOrderProgress state={group.boltOrderState} tracking={!!group.boltTrackingToken} />
|
||||
<BoltOrderProgress state={group.boltOrderState} courierState={group.boltCourierState} tracking={!!group.boltTrackingToken} />
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user