Интеграция: Админка ↔ KDS ↔ POS
End-to-end: «открыть кафе и принять заказ с приготовлением»
Тестируется не одна фича, а связка трёх клиентов через event-flow и REST-вызовы.
Типичные баги — интеграционные: рассогласование данных между клиентами, race conditions, неправильные статусы, propagation delays.
Зачем тестировать в связке
Каждый клиент по отдельности можно тестировать в своей зоне (T1/T2/T3). Но в реальной работе они связаны:
| Связь | Что передаётся |
|---|---|
| Catalog → POS | Товары, цены, флаги requires_kitchen / kitchen_station_id, стоп-листы, прейскурант |
| Catalog → KDS | Настройки KDS (звуки, auto-logout), пороги цвета станций, состав группы модификаторов |
| POS → Kitchen | Order создан → in_progress → отображается на нужной станции |
| Kitchen → POS | Order отмечен «готов» → POS показывает «к выдаче» |
| Админка → KDS | Revoke устройства, изменение настроек, добавление/удаление станций |
| Админка → POS | Деактивация сотрудника, изменение PIN, изменение прав |
Этот документ тестирует связку, а не отдельные модули.
Prerequisites
Setup в админке (один раз перед серией тестов)
- ИП-владелец залогинен
- Создана 1 ТТ, привязан POS-терминал (по
fs_number) - Создан Cashier с PIN, permission
pos.access, привязан к ТТ - Создан KDS-сотрудник с PIN, permission
kds.access, привязан к ТТ (если KDS Phase 2) - Создана кухонная станция «Hot Kitchen» с порогами
yellow_threshold_minutes=5,red_threshold_minutes=10 - Создана вторая станция «Bar» (для multi-station сценариев)
- (Phase 2) Зарегистрировано KDS-устройство, привязано к ТТ
Setup каталога (через админку)
- Категория «Завтраки»
- Товар «Бургер»:
requires_kitchen=true,kitchen_station_id = Hot Kitchen,vat_rate=vat20,payment_subject=goods - Товар «Капучино»:
requires_kitchen=true,kitchen_station_id = Bar - Товар «Бутылка воды»:
requires_kitchen=false(продаётся как good) - Группа модификаторов «Молоко» (для Капучино): обычное / соевое / овсяное
- Прейскурант с ценами на все 3 товара + опции модификаторов
- Прейскурант привязан к ТТ
Учётки
| Роль | Назначение |
|---|---|
| Franchise (ИП-владелец) | Админка |
| Cashier (PIN) | POS-терминал |
KDS employee (kds.access) | KDS-устройство |
| Manager (опционально) | Админка для отмен заказов и просмотра |
Test Scenarios
TC-INT-001 — Заказ с приготовлением (happy path)
Goal: Полный цикл заказа от приёма до выдачи через все три клиента.
Priority: P0 · Regression: yes
Steps:
- Cashier на POS: PIN-логин на терминале
- Cashier: открывает смену
- ✓ Смена открыта, X-отчёт пустой, фискальный модуль готов
- Cashier: создаёт заказ — добавляет «Бургер» × 1
- ✓ Позиция в заказе с правильной ценой из прейскуранта
- Cashier: добавляет «Бутылка воды» × 1
- Cashier: оплата картой
- ✓ Чек печатается, фискализируется
- ✓ Заказ → статус
in_progress
- Kitchen (KDS / Kitchen Queue): заказ появляется на станции «Hot Kitchen»
- ✓ Виден только «Бургер» (вода
requires_kitchen=false, не идёт на кухню) - ✓ Ячейка нейтрального цвета (зелёная/белая)
- ✓ Звуковое уведомление о новом заказе
- ✓ Виден только «Бургер» (вода
- Kitchen: ждёт 5+ минут
- ✓ Ячейка переходит в yellow
- Kitchen: повар отмечает «принят» / начинает готовить
- ✓ Статус позиции на KDS: «в работе»
- Kitchen: через ~3 минуты отмечает «готов»
- ✓ На POS появляется уведомление «Бургер готов к выдаче»
- ✓ Заказ → статус
ready - ✓ Позиция исчезает с экрана KDS (или уезжает в раздел «закрытые»)
- Cashier на POS: отмечает «выдан клиенту» / закрывает заказ
- ✓ Заказ → статус
closed
- ✓ Заказ → статус
- Cashier: закрывает смену → Z-отчёт
- ✓ Фискальный Z-отчёт, выручка совпадает с суммой заказов
TC-INT-002 — Заказ только без приготовления
Goal: Заказ из good-товаров не идёт на кухню.
Priority: P1
Steps:
- POS: заказ только из «Бутылка воды» × 2
- Оплата
- ✓ Заказ может пропустить
in_progressили быть в нём <1 сек
- ✓ Заказ может пропустить
- KDS: заказ не появляется ни на одной станции
- Cashier: «выдан» →
closed
TC-INT-003 — Stop-list блокирует на POS
Goal: Товар в стоп-листе недоступен кассиру.
Priority: P0 · Regression: yes
Steps:
- Админка: ставит «Бургер» в стоп-лист на ТТ
- POS: ждёт ~30 сек / делает refresh меню
- POS: пытается создать заказ с «Бургер»
- ✓ Товар не виден в меню ИЛИ показан с пометкой «недоступен», нельзя добавить
- Админка: снимает стоп
- POS: refresh
- ✓ «Бургер» снова доступен
Известный баг: BUG-049 — Manager не может управлять стоп-листами на своей ТТ (403). Если делает Manager, ожидаемое поведение — нужна возможность.
TC-INT-004 — Несколько кухонных станций (multi-routing)
Goal: Заказ корректно расщепляется на несколько станций.
Priority: P0 · Regression: yes
Steps:
- POS: один заказ — «Бургер» + «Капучино»
- Оплата →
in_progress - KDS станции «Hot Kitchen»: видит только «Бургер»
- KDS станции «Bar»: видит только «Капучино»
- Hot Kitchen отмечает «Бургер готов»
- ✓ Заказ ещё в
in_progress(Капучино не готов)
- ✓ Заказ ещё в
- Bar отмечает «Капучино готов»
- ✓ Заказ →
ready(обе позиции готовы)
- ✓ Заказ →
- POS: уведомление «весь заказ готов»
TC-INT-005 — Заказ с модификаторами на KDS
Goal: KDS видит детали состава для приготовления.
Priority: P1 · Regression: yes
Steps:
- POS: «Капучино» + модификатор «соевое молоко» + (если есть) «без сахара»
- Оплата
- KDS станция Bar: видит «Капучино — соевое молоко, без сахара»
- ✓ Все выбранные опции модификаторов отображены повару
- (Если каталог обновился) — повар видит актуальный набор опций без рестарта приложения
TC-INT-006 — Отмена заказа во время приготовления
Goal: При отмене заказа кухня узнаёт.
Priority: P0
Steps:
- POS: заказ в
in_progress, KDS видит позицию - POS / Manager: отмена заказа с указанием причины
- KDS: позиция исчезает / помечается «отменён»
- ✓ Звуковое уведомление об отмене (если был включён звук)
- Заказ →
cancelled, позиция не списывается
TC-INT-007 — Изменение каталога во время активной смены
Goal: Изменения в админке доходят до POS/KDS без рестарта.
Priority: P1
Steps:
- Cashier открыл смену, видит меню
- Админка: меняет цену «Бургер» в прейскуранте (например, 350 → 400)
- POS: создаёт новый заказ с «Бургер»
- ✓ Цена обновлённая (400) ИЛИ задокументировать что нужен refresh
- Админка: добавляет новую опцию модификатора «Молоко» — «миндальное»
- POS: создаёт новый заказ
- ✓ Новая опция видна
- KDS: при принятии заказа видит «миндальное молоко» в составе
TC-INT-008 — KDS device revoke (force logout)
Goal: Админ принудительно отключает KDS-устройство.
Priority: P1 · применимо если KDS Phase 2 запущен
Steps:
- Setup: KDS залогинен на устройстве, активная сессия
- Админка: открывает список KDS-устройств
- Админка: DELETE на устройстве (revoke)
- KDS: на следующем heartbeat (≤2 мин) получает 401
- ✓ Выкидывает из приложения, показывает «устройство деактивировано»
- KDS: для повторного входа нужна повторная регистрация устройства
По спеке (BR 5.1): публикуется событие
user.kds_device.revoked,pos-bffconsumer завершает WebSocket-сессии. На стороне UI — мгновенный logout.
TC-INT-009 — Изменение KDS-настроек на лету
Goal: Изменение настроек применяется без перезагрузки KDS.
Priority: P2
Steps:
- KDS: повар работает, звуки включены
- Админка: меняет KDS-настройки франшизы — отключает звук
- KDS: получает событие
catalog.kds_settings.updated- ✓ Настройка применена (звук отключён) без рестарта приложения
По спеке: в P0 consumer не реализован — KDS делает re-pull при «Применить». В P1 — pos-bff broadcast’ит в WebSocket.
TC-INT-010 — Изменение порогов цвета станции
Steps:
- Админка: меняет для Hot Kitchen
yellow=2min,red=4min - KDS: получает обновление (re-pull или push)
- POS: создаёт новый заказ
- KDS: цвет ячейки переходит yellow за 2 мин (не за 5)
TC-INT-011 — Network failure recovery
Goal: KDS теряет связь и восстанавливается без потери заказов.
Priority: P1
Steps:
- Pre-: заказ в
in_progressотображён на KDS - KDS: разрыв сети (выключить Wi-Fi на устройстве)
- POS: создаёт новый заказ
- KDS: показывает статус «офлайн» / «нет связи»
- KDS: восстановление сети
- ✓ KDS подтягивает пропущенные заказы / синхронизируется
- ✓ Не дублирует уже отображённые
TC-INT-012 — RBAC между POS и KDS
Goal: Права на POS и KDS разделены.
Priority: P1 · Regression: yes
Steps:
- Сотрудник X — только
pos.access, безkds.access- ✓ Логин на POS — да
- ✓ Логин на KDS — 403 «Нет доступа»
- Сотрудник Y — только
kds.access- ✓ Логин на KDS — да
- ✓ Логин на POS — 403
- Сотрудник Z —
pos.access+kds.access- ✓ Логин на оба
TC-INT-013 — Force logout деактивированного сотрудника
Goal: При деактивации Cashier на POS все сессии завершаются.
Priority: P1
Steps:
- Cashier работает на POS, есть открытая смена и активный заказ
- Админка: деактивирует Cashier
- POS: следующее действие
- ✓ 401 / выкидывает на логин с сообщением «учётка деактивирована»
- ✓ Открытая смена не теряется (можно закрыть под другим Cashier)
TC-INT-014 — Удаление сотрудника во время приготовления
Edge case.
Steps:
- Cashier создал заказ с приготовлением, вышел из смены
- Админка: удаляет / деактивирует Cashier
- KDS: завершает приготовление, отмечает «готов»
- ✓ Заказ обрабатывается без ошибок (нет dangling reference на удалённого Cashier)
- ✓ В отчёте смены сохраняется кто принимал заказ (исторические данные)
TC-INT-015 — Stop-list появляется во время активного заказа
Edge case.
Steps:
- POS: создал заказ с «Бургер» в
in_progress - Админка: ставит «Бургер» в стоп-лист
- KDS: заказ продолжает отображаться (он уже принят)
- ✓ Не пропадает с кухни, повар готовит
- POS: новые заказы — «Бургер» уже недоступен
Известные баги, влияющие на эту связку
| Bug | Impact на интеграцию |
|---|---|
| BUG-060 | Меню в карточке ТТ → 500 в админке. Не блокирует POS-меню (отдельный API), но не позволяет владельцу проверить «как выглядит меню» |
| BUG-061 | Меню — нет кнопки добавить товар. Может быть: меню вычисляемое автоматом, а кнопка не нужна. Уточнить логику |
| BUG-062 | Меню — отображаются модификаторы вместо описания. Косметика |
| BUG-066 | «Склад не найден для ТТ» в Приёмках. Если склад не автосоздаётся при ТТ → блокирует автосписание ингредиентов после продажи (Phase 2 фича) |
| BUG-021 | Clock in/out отсутствует. POS-смена через ФЯ работает, но фактическое отработанное время кассира не фиксируется автоматически — только ручной ввод |
Out of scope
- Фискализация чеков на ОФД — работа фискального ядра K10, тестируется отдельно (Honest Mark integration)
- Webhook-обмен с агрегаторами (Я.Еда, Маркет Деливери) — отдельный документ, M2 skeleton
- Автосписание со склада при продаже — Phase 2, не реализовано
- Возвраты после
closed— Phase 2
Acceptance criteria
Связка считается рабочей если:
- TC-INT-001 проходит без ошибок (полный happy path)
- TC-INT-003 (стоп-лист) — propagation ≤30 секунд
- TC-INT-004 (multi-станции) — корректное расщепление позиций
- TC-INT-006 (отмена) — реакция на KDS ≤10 секунд
- TC-INT-008 (revoke) — KDS вылетает за ≤2 минуты (при наличии Phase 2)
- TC-INT-012 (RBAC) — все 3 комбинации прав работают как ожидается
- Никаких 500/422 на happy path
Кто прогоняет
Эта серия — cross-team, не одного тестировщика. Варианты:
- A) Один тестер с тремя устройствами (или одной машиной с 3 окнами): админка в одном браузере, POS в Tauri / отдельном окне, KDS на планшете или вкладке. Самый чистый вариант
- B) Парный тест: один за POS, другой за админкой/KDS, синхронизация по тимс-чату
- C) Триплет: T1 в админке, T3 на POS, тест-лид на KDS — для high-pressure прогонов
Рекомендую вариант A для системного прогона + B/C для exploratory или regression после критичных фиксов.