Декомпозиция POS Phase 5A — KDS by stations

Netmonet outgoing — переехал в BR 3.2

Эта декомпозиция изначально включала «Netmonet outgoing employee sync», но 2026-05-05 вся история по Нетмонет (outgoing API, deep-link QR, UI «Подключить к Нетмонет», блокеры по incoming webhook) собрана в единый документ BR 3.2. Здесь остаётся только KDS by stations.

Цель

KDS by stations — на десктоп-кассе кухонная очередь разделена табами по станциям (Горячая / Холодная / Бар), кухарь каждой станции видит только свои позиции.

Затронутые сервисы

СлойРепоЗадачи
Catalog Serviceerp-catalog-serviceCatalog Service
POS BFFerp-pos (bff/)POS BFF
desktop-poserp-pos-desktopDesktop POS

Decision points

  • KDS — без backend изменения OrderItem: вместо добавления kitchen_station_id в OrderItem entity (миграция + snapshot), используем JOIN на фронте: kitchen-queue отдает order.items с product_id → menuStore lookup → product.kitchen_station_id. Цена снапшотится в OrderItem (нужна для возвратов), но station — нет (если product перенёс station, очередь покажет новую).
  • POS BFF kitchen-stations: проксирует на новый Internal endpoint catalog-service (без JWT — через X-Service-Token).

Acceptance criteria (PASS)

  1. ✅ Если у ТТ ≥2 kitchen-stations — на /kitchen появляются табы (Все + по станции). Активный таб фильтрует order list + позиции внутри карточек.
  2. ✅ Если у ТТ ≤1 station — UI выглядит как раньше (single list, без табов — обратная совместимость BR 2.5).
  3. ✅ POS BFF GET /api/v1/pos/kitchen-stations возвращает список станций франшизы.
  4. ✅ Catalog /menu теперь отдаёт requires_kitchen + kitchen_station_id для каждого продукта.

Прогресс

  • Catalog ServiceInternalCatalogMenuController.mapProduct: добавлены requires_kitchen + kitchen_station_id; NEW InternalKitchenStationController GET /by-franchise/{franchiseId}
  • POS BFF — NEW routes/kitchen-stations.ts (proxy на catalog /internal/kitchen-stations/by-franchise/{franchiseId})
  • desktop-pos:
    • domain: KitchenStation, Product.kitchen_station_id
    • api-client: kitchenStations endpoints (list)
    • kitchenStationsStore (cache на сессию, byId)
    • KitchenQueueScreen: табы по станциям (Все + N штук), filterOrders + filterItemsForStation, fallback на single если ≤1
    • mock: 3 station seeds (Горячая/Холодная/Бар) + 3 mock products привязаны (sandwich/croissant=COLD, shawarma=HOT)

Verification

  • TypeScript desktop-pos: zero errors
  • Vite build: passing (204 modules, +3 от Phase 4)
  • POS BFF tsc: новые правки чисты

Out of scope

  • Netmonet outgoing / incoming — целиком в BR 3.2
  • Phase 6: Reports в POS, Printer config, hotkeys, kiosk mode

Ссылки