feat: sledování objednávek přes Wolt
CI / Generate TypeScript types (push) Successful in 13s
CI / Server unit tests (push) Successful in 25s
CI / Build server (push) Successful in 28s
CI / Build client (push) Successful in 41s
CI / Playwright E2E tests (push) Successful in 1m47s
CI / Build and push Docker image (push) Successful in 53s
CI / Notify (push) Successful in 2s

Vedle Bolt Food jde nově sledovat i objednávka z Woltu — stačí u objednané
skupiny vložit odkaz z track.wolt.com. Logika sledování je zobecněná do
registru rozvozových služeb (trackingProviders.ts): každá služba umí vytáhnout
kód ze sdílecího odkazu a dotázat se svého API, scheduler i stepper jsou společné.

- pole skupiny bolt* přejmenována na tracking* + nové trackingProvider
- endpoint /groups/setBoltTracking → /groups/setTracking
- Wolt: čas doručení z delivery_eta v časové zóně objednávky, 404 ukončí
  sledování, stav kurýra odvozen z is_delivering/is_delivering_other_order
- DEV simulace zůstává jen pro Bolt Food
This commit is contained in:
2026-08-24 11:27:56 +02:00
parent eeb1630391
commit 5c048fe1f1
25 changed files with 1326 additions and 869 deletions
+7 -7
View File
@@ -1,7 +1,7 @@
import { test, expect } from '@playwright/test';
import { loginViaApi } from './helpers';
const BOLT_LABEL = 'Upozornění na doručení objednávky (Bolt Food)';
const DELIVERY_LABEL = 'Upozornění na doručení objednávky (Bolt Food / Wolt)';
test.beforeEach(async ({ page }) => {
await loginViaApi(page, 'e2e-user');
@@ -15,24 +15,24 @@ async function openSettings(page: import('@playwright/test').Page) {
await expect(page.locator('.modal-title')).toContainText('Nastavení', { timeout: 5_000 });
}
test('Přepínač doručení Bolt je pod výběrem času připomínky', async ({ page }) => {
test('Přepínač doručení objednávky je pod výběrem času připomínky', async ({ page }) => {
await openSettings(page);
const reminderGroup = page.locator('.modal-body .mb-3').filter({ hasText: 'Připomínka výběru oběda' });
const boltGroup = page.locator('.modal-body .mb-3').filter({ hasText: BOLT_LABEL });
const deliveryGroup = page.locator('.modal-body .mb-3').filter({ hasText: DELIVERY_LABEL });
await expect(reminderGroup).toBeVisible();
await expect(boltGroup).toBeVisible();
await expect(deliveryGroup).toBeVisible();
// Přepínač musí v DOM následovat až za skupinou s časem připomínky
const order = await page.evaluate((label) => {
const groups = Array.from(document.querySelectorAll('.modal-body .mb-3'));
return {
reminder: groups.findIndex(g => g.textContent?.includes('Připomínka výběru oběda')),
bolt: groups.findIndex(g => g.textContent?.includes(label)),
delivery: groups.findIndex(g => g.textContent?.includes(label)),
};
}, BOLT_LABEL);
}, DELIVERY_LABEL);
expect(order.reminder).toBeGreaterThanOrEqual(0);
expect(order.bolt).toBe(order.reminder + 1);
expect(order.delivery).toBe(order.reminder + 1);
// Výchozí stav je vypnuto
await expect(page.locator('#boltDeliveredCheckbox')).not.toBeChecked();