Desktop POS — Phase 5A KDS

Что сделано

Domain

  • packages/domain/src/types/kitchenStation.ts (new) — KitchenStation { id, name, description, is_default, product_count?, ... }
  • packages/domain/src/types/product.ts — добавлено kitchen_station_id?: string | null

API client + Store

  • packages/api-client/src/endpoints/kitchenStations.ts (new) — list()
  • apps/desktop/src/stores/kitchenStationsStore.ts (new) — кэш на сессию, lazy load(), byId(id)

screens/KitchenQueueScreen.tsx — extended

Логика разделения по станциям:

  1. Подгружаем kitchenStationsStore.load() + читаем useMenuStore.products
  2. Строим productById: Map<string, Product> для O(1) lookup
  3. Если stations.length > 1 — показываем табы (Все + по name каждой станции)
  4. filteredOrders фильтрует список заказов: оставляет только те, у которых есть item с product.kitchen_station_id == activeStation
  5. filterItemsForStation(order) фильтрует items внутри карточки — кухарь Горячей не видит позиции Холодной даже если они в одном order

Fallback: если у ТТ ≤1 станция — табы скрыты, поведение как раньше (single list, BR 2.5 совместимо).

Wiring

  • api/client.tsgetKitchenStationsEndpoints() factory
  • api/mockEndpoints.ts:
    • MOCK_STATION_HOT/COLD/BAR константы (объявлены наверху, до MENU)
    • mockKitchenStations — 3 seed (Горячая, Холодная, Бар)
    • createMockKitchenStationsEndpoints — list returns delay()
    • 3 mock products получили kitchen_station_id: sandwich/croissant=COLD, shawarma=HOT

Файлы

Created (3):

  • packages/domain/src/types/kitchenStation.ts
  • packages/api-client/src/endpoints/kitchenStations.ts
  • apps/desktop/src/stores/kitchenStationsStore.ts

Modified (5):

  • packages/domain/src/types/index.ts
  • packages/domain/src/types/product.ts
  • packages/api-client/src/index.ts
  • apps/desktop/src/api/client.ts
  • apps/desktop/src/api/mockEndpoints.ts
  • apps/desktop/src/screens/KitchenQueueScreen.tsx

Тесты

  • pnpm typecheck — zero errors
  • pnpm exec vite build — passing (204 modules, +3 от Phase 4)
  • Mock-mode E2E:
    • Открыть /kitchen → видим 3 таба «Все / Горячая / Холодная / Бар» (если seed добавит ≥2 станции)
    • Tab «Горячая» → виден только заказ с шаурмой; sandwich/croissant скрыты
    • Tab «Все» → как раньше
    • У ТТ с одной станцией → табы скрыты автоматически