Декомпозиция 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 Service | erp-catalog-service | Catalog Service |
| POS BFF | erp-pos (bff/) | POS BFF |
| desktop-pos | erp-pos-desktop | Desktop POS |
Decision points
- KDS — без backend изменения OrderItem: вместо добавления
kitchen_station_idвOrderItementity (миграция + 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)
- ✅ Если у ТТ ≥2 kitchen-stations — на
/kitchenпоявляются табы (Все + по станции). Активный таб фильтрует order list + позиции внутри карточек. - ✅ Если у ТТ ≤1 station — UI выглядит как раньше (single list, без табов — обратная совместимость BR 2.5).
- ✅ POS BFF
GET /api/v1/pos/kitchen-stationsвозвращает список станций франшизы. - ✅ Catalog
/menuтеперь отдаётrequires_kitchen+kitchen_station_idдля каждого продукта.
Прогресс
- Catalog Service —
InternalCatalogMenuController.mapProduct: добавленыrequires_kitchen+kitchen_station_id; NEWInternalKitchenStationController 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:
kitchenStationsendpoints (list) kitchenStationsStore(cache на сессию, byId)KitchenQueueScreen: табы по станциям (Все + N штук),filterOrders+filterItemsForStation, fallback на single если ≤1- mock: 3 station seeds (Горячая/Холодная/Бар) + 3 mock products привязаны (sandwich/croissant=COLD, shawarma=HOT)
- domain:
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