BR 5.1 — KDS Android — кухонный экран MVP

Статус — драфт

Требования сформированы. Не начинать реализацию — сначала проходит /process-br 5.1 через все слои workflow. Перед запуском процесса — пройти открытые вопросы §7 с пользователем.

Серия BR 5.X

Это первая BR серии «KDS». В серии:

  • BR 5.1 (этот) — Cloud-режим Android-приложения, multi-station, in-app updater
  • BR 5.2 (план) — LAN-hub mode: POS Desktop как локальный сервер, работа без интернета
  • BR 5.3 (план) — Full offline-first с SQLite-репликацией и event-log sync
  • BR 5.4 (план) — Принтеры per-станция (ESC/POS)
  • BR 5.5 (план) — Bump bar
  • BR 5.6 (план) — Курсы подачи (горячее/холодное/десерт)
  • BR 5.7 (план) — Кастомные звуковые файлы per-франшиза
  • BR 5.8 (план) — Фильтры заказов по типу/каналу
  • BR 5.9 (план) — Английский UI / i18n

Контекст

В BR 2.5 был сознательно введён справочник «Кухонные станции» без реализации KDS-экрана — это была отложенная Phase 2. Сейчас стартуем эту фазу.

Что есть на входе:

  • ✅ Каталог-товары имеют requires_kitchen (boolean) и kitchen_station_id (FK → справочник станций)
  • ✅ Order Service хранит заказы и позиции, статусная модель работает
  • ✅ POS Desktop (Tauri 2 + React под Windows) собран и используется кассирами
  • ✅ POS BFF работает как агрегатор для POS клиента
  • ✅ Архитектурный research проведён — см. KDS Phase 2 — Hardware и Architecture Research

Что нужно решить этой BR: Дать кухне/бару Android-планшет с Tauri-приложением, которое в реальном времени показывает заказы для выбранной станции и позволяет повару отмечать готовность позиций.

Архитектурный курс (зафиксирован):

  • В P0 KDS подключается к облаку напрямую (через интернет к pos-bff — как POS Desktop)
  • Транспорт-слой написан с абстракцией (IKdsTransport), чтобы в BR 5.2 добавить LAN-режим (через POS Desktop как hub) без рефакторинга UI
  • Полный offline-first (SQLite-реплика на устройстве) — не в этой BR, делается в BR 5.3

Цель

Дать поварам/барменам Android-планшет с приложением, которое в реальном времени отображает заказы для их станции и позволяет отмечать готовность позиций. Сократить «шум на кухне», убрать бумажные чеки, повысить скорость и точность подачи.


§1. Скоуп

1.1. Что входит (P0)

Мобильное приложение:

  • Tauri 2 приложение с Android target (cargo tauri android build) — APK для установки
  • Окно разработки под Windows (cargo tauri dev) — для работы фронтенд-разработчика без планшета
  • Тот же стек что POS Desktop: Rust + React + TypeScript

Авторизация:

  • PIN-логин на устройстве (как в POS) → JWT-сессия
  • Выбор одной или нескольких станций при логине (галочки из списка станций франшизы) — например маленькая ТТ может выбрать «Кухня + Бар» на одном планшете
  • Обязательный PIN после reboot устройства; auto-resume сессии после короткого sleep/wake
  • Auto-логаут через 30 минут неактивности

Список заказов:

  • Live-обновляющийся список активных заказов с фильтром по выбранным станциям
  • Отображение: имя/номер заказа, тип (зал/самовывоз/доставка), время до готовности, позиции выбранных станций
  • Карточки или горизонтальный/вертикальный список (выбирается в Settings)
  • Цвет карточки по времени до плановой готовности (зелёный/жёлтый/красный)
  • Звуковое уведомление о новом заказе (повторяется до открытия)

Карточка заказа:

  • Все позиции выбранных станций с модификаторами и комментарием гостя
  • Если выбрано несколько станций — позиции группируются по станциям, каждая со своей кнопкой «Готово»
  • Позиции других станций (не выбранных) отображаются серым (контекст), без управления
  • Тап на «?» рядом с блюдом → модалка с техкартой (через Catalog Service)

Управление статусами:

  • Тап на позицию → переключение pending → preparing → ready
  • Откат ready → preparing запрещён (если ошибка — отмена через POS кассиром)
  • Кнопка «Готово» на станцию (внутри карточки заказа) — активна когда все позиции этой станции готовы → закрывает заказ для этой станции

Settings:

  • Звук вкл/выкл, выбор мелодии (из встроенного набора), интервал повтора
  • Цветовые пороги (берутся из админки франшизы; на устройстве можно переопределить локально)
  • Layout заказов (карточки / список)
  • «Держать экран включённым»
  • Переключатель транспорта (Облако / Локальная сеть / Авто) — в P0 рабочий только «Облако», остальные disabled с подсказкой «Будет в BR 5.2»

In-app обновление APK:

  • Кнопка «Проверить обновления» в Settings
  • Tauri-updater plugin: проверяет новую версию на нашем endpoint (GitHub Releases или собственный CDN), скачивает APK, ставит
  • Auto-check каждые 24 часа в фоне (опционально, настраивается)
  • Это упрощает выкатку патчей во время пилота — не нужно бегать по ТТ с флешкой

Связь:

  • WebSocket к pos-bff для live-обновлений
  • REST polling fallback (каждые 5 сек) при потере WS
  • Красный баннер «Нет связи» при дисконнекте; кэш заказов в памяти продолжает отображаться

1.2. Что НЕ входит (отложено)

  • LAN-hub режим (POS Desktop как локальный сервер на :8080) — BR 5.2
  • Полный offline-first (SQLite-репликация state, event-log sync) — BR 5.3
  • Печать кухонных чеков на ESC/POS принтерах — BR 5.4
  • Возврат / отмена заказа с кухни — требует финансовой логики, риск в MVP
  • Курсы подачи (горячее/холодное/десерт) — BR 5.6
  • Bump bar (USB HID контроллер) — BR 5.5
  • Загрузка кастомных звуковых файлов на устройство (per-франшиза мелодии) — звуки настраиваются выбором из встроенного набора, P1+ загрузка своих
  • iOS-сборка — только Android в P0
  • Hub failover / auto-promotion — Phase 3+
  • Анимации в стиле kiosk — функциональный минимум, не UI-конкурс

§2. Сценарии использования

2.1. Утренний запуск кухни

  1. Повар приходит к 7:00, ставит планшет на крепление, включает
  2. Открывает KDS-приложение (или оно уже открыто после ночи)
  3. Вводит свой PIN, выбирает станцию «Горячий цех» из списка (одну галочку)
  4. Видит экран «Ожидание заказов» (либо логотип франшизы, либо приветствие — финализируется в спеке)

2.1а. Маленькое кафе с одним планшетом на кухню+бар

  1. Бариста-повар включает планшет в маленьком кафе
  2. Логин по PIN, выбирает галочки «Кухня» и «Бар»
  3. На экране все заказы обоих станций; в карточке позиции группируются «Кухня: …» и «Бар: …»
  4. Может закрыть «Кухню» отдельно (эспрессо готов), потом «Бар» (сэндвич готов) — у каждой группы своя кнопка «Готово»

2.2. Новый заказ от кассира

  1. Кассир пробивает заказ «Карбонара + Цезарь + Колу» в POS Desktop
  2. POS отправляет заказ → Order Service → Kafka событие order.created
  3. POS BFF (Kafka consumer) получает событие, делает фильтр «есть ли позиции для подключённых станций», пушит через WebSocket подписчикам
  4. KDS на станции «Горячий цех» получает событие → ≤2 сек на экране появляется зелёная карточка с «Карбонара» (Цезарь — на станции «Холодный цех», Кола — на «Бар»)
  5. Звучит звуковой сигнал, повторяется каждые 30 сек пока повар не откроет карточку

2.3. Готовка

  1. Повар открывает карточку «Стол 5 — заказ #1234»
  2. Звук перестаёт повторяться
  3. Тапает «В работе» на «Карбонара» → позиция становится синей
  4. Готовит, по готовности тапает «Готово» → позиция становится зелёной с галочкой
  5. Кнопка «Готово» вверху карточки становится активной (все позиции ready)
  6. Тап → заказ уезжает с экрана → POS видит «готов к подаче»

2.4. Просрочка

  1. Заказ висит дольше плановой готовности (expected_ready_at)
  2. За 5 мин до срока — карточка становится жёлтой
  3. После срока — красной + тревожный звуковой сигнал
  4. Повар видит, ускоряется или связывается с менеджером

2.5. Просмотр техкарты

  1. Новый стажёр не помнит рецепт «Карбонары»
  2. В карточке тапает «?» рядом с блюдом
  3. Открывается модалка с техкартой (название, ингредиенты, последовательность, фото если есть)
  4. Возврат к карточке заказа

2.6. Потеря соединения

  1. Wi-Fi отключился (перезагрузка роутера, smoke-проверка)
  2. KDS показывает красный баннер «Нет связи» (3 сек)
  3. Текущие заказы продолжают отображаться (кэш в памяти)
  4. Повар продолжает работу, тапает «Готово» на позиции — действие записывается в очередь
  5. Wi-Fi вернулся → KDS отправляет очередь действий → синхронизация → баннер «Связь восстановлена»

2.7. Конец смены

  1. Повар тапает «Меню» → «Logout»
  2. Сессия закрывается, экран PIN-логина

§3. Архитектура (бизнес-уровень)

3.1. Высокоуровневая схема

┌─────────────────┐
│ Android планшет │   HTTPS REST + WSS
│  (Tauri 2 KDS)  │ ─────────────────────►  ┌─────────────┐
└─────────────────┘                          │   POS BFF   │ ◄──── Kafka events
                                             │ (Node + WS) │       (order.created,
                                             └──────┬──────┘        order.item.*)
                                                    │
                                              REST через cluster
                                                    │
                                             ┌──────▼──────┐
                                             │ Order Svc   │
                                             │ Catalog Svc │
                                             │ User Svc    │
                                             └─────────────┘
  • KDS подключается к публичному https://erp-test.nirbi.ru/api/v1/pos/...
  • Авторизация: JWT (PIN-логин → выдаёт JWT с permission kds.access)
  • Live-обновления: WebSocket-канал wss://erp-test.nirbi.ru/api/v1/pos/kds/stream?station_id=...
  • REST для CRUD: см. план файлов в §9

3.2. Endpoints в POS BFF (новые)

Решение: добавляем в существующий pos-bff

Не выделяем отдельный kds-bff в P0. KDS-routes идут в pos-bff/src/routes/kds.ts. Если разрастётся — выделим в P1+.

МетодPathНазначение
POST/api/v1/pos/auth/pinЛогин по PIN, выдача JWT (если ещё нет — может уже существовать в pos-bff)
GET/api/v1/pos/kds/orders?station_ids=A,B&status=activeАктивные заказы для одной или нескольких станций (csv)
WS/api/v1/pos/kds/stream?station_ids=A,BLive-стрим событий (новый заказ, изменение статуса)
PATCH/api/v1/pos/orders/{id}/items/{itemId}/statusСмена статуса позиции (preparing/ready)
PATCH/api/v1/pos/orders/{id}/kds-status?station_id=...Закрыть заказ для одной станции (все позиции этой станции готовы)
GET/api/v1/pos/catalog/products/{id}/recipeТехкарта блюда (proxy в Catalog Service)
GET/api/v1/pos/kitchen-stationsСписок станций для выбора при логине
GET/api/v1/pos/kds/settingsНастройки KDS франшизы (звуки/цвета/пороги)
GET/api/v1/kds/updates/latestПоследний APK для in-app updater (или GitHub Releases proxy)

3.3. Транспорт-абстракция в коде KDS

interface KdsTransport {
  login(pin: string): Promise<{ jwt, employee, availableStations[] }>
  listKitchenStations(): Promise<KitchenStation[]>      // для multi-select при логине
  listOrders(stationIds: string[]): Promise<Order[]>
  subscribeOrderStream(stationIds: string[], onEvent): Unsubscribe
  setItemStatus(orderId, itemId, status): Promise<void>
  setKdsStatusForStation(orderId, stationId, status): Promise<void>
  getRecipe(productId): Promise<Recipe>
  getKdsSettings(): Promise<KdsFranchiseSettings>       // звуки/цвета/пороги
  checkForUpdate(): Promise<{ hasUpdate, downloadUrl, version, notes } | null>
}

Реализации:

  • CloudTransport — P0, через pos-bff (HTTPS + WSS)
  • MockTransport — для разработки UI без сети (in-memory data, time-based simulator для нового заказа)
  • LanTransport — P1, в BR 5.2 (через POS Desktop hub в LAN)

В Settings выбор: Облако / Локальная сеть / Авто (auto fallback). В P0 — только «Облако», остальные disabled.

3.4. Что нужно от Order Service

Большинство уже есть (заказы, статусы), но возможно потребуется:

  • Поле expected_ready_at на заказе (для расчёта цвета по времени)
  • Внутренний endpoint GET /internal/orders?station_id=...&active=true для pos-bff
  • Публикация Kafka событий order.created, order.item.status_changed если ещё не публикуются

Точное состояние проверяется на этапе бэкенд-контрактов (Шаг 2 Workflow).


§4. Бизнес-правила

  1. Одно устройство — одна или несколько станций (multi-select при логине). Можно сменить набор через Logout → новый логин с другими галочками.

  2. Заказ виден если хотя бы одна позиция требует одну из выбранных станций: product.requires_kitchen=true AND product.kitchen_station_id IN (selected) AND order.status IN ('confirmed', 'in_progress'). Позиции невыбранных станций в карточке отображаются серым (контекст), без управления.

  3. Статусы позиций: pending → preparing → ready. Откат ready → preparing запрещён на KDS. Если ошибка — отмена через POS кассиром.

  4. Кнопка «Готово» на станцию (внутри карточки заказа) доступна когда все позиции этой станции в статусе ready. У каждой выбранной станции в карточке свой блок и своя кнопка. Когда все станции отмечены готовыми — заказ уезжает с экрана.

  5. Live-обновления ≤2 сек от момента изменения в Order Service до отображения на KDS.

  6. При потере соединения: красный баннер сверху «Нет связи». Заказы продолжают отображаться (кэш в памяти), действия пользователя складываются в очередь и синхронизируются после reconnect.

  7. Звук + визуальное оповещение на новый заказ. Звук повторяется каждые N секунд (настраивается, default 30 сек) пока заказ не открыт.

  8. Цвет карточки по времени до плановой готовности expected_ready_at — пороги настраиваются per-станция в админке франшизы, например: «Бар: жёлтый за 2 мин, красный после 0; Кухня: жёлтый за 7 мин, красный после 0». Дефолты:

    • Зелёный: > 5 мин до срока
    • Жёлтый: ≤ 5 мин
    • Красный: просрочка (now > expected_ready_at) На устройстве можно переопределить локально.
  9. Авто-логаут через 30 минут неактивности.

  10. Поведение при reboot/sleep устройства:

    • После reboot устройства — обязательный повторный PIN (security)
    • После sleep/wake (короткий блок экрана) — auto-resume сессии, если не истёк JWT
    • После авто-логаута 30 мин — PIN
  11. Только одна сессия на устройство: новый PIN-логин закрывает старую сессию.

  12. Permission kds.access обязателен — без него попытка PIN-логина возвращает 403. Кассир без kds.access не может работать с KDS.

  13. Multi-tenancy соблюдается: в JWT есть franchise_id, BFF фильтрует заказы и станции только этой франшизы. Пересечение между франшизами невозможно.

  14. Регистрация устройства: при первом логине устройство регистрируется в отдельной таблице kds_devices (id устройства, franchise_id, current_user_id, last_seen_at, app_version). Это используется для удалённого logout и аудита.


§5. Hardware

5.1. Минимальные требования к планшету

  • Android 10+ (API 29+)
  • 10–13” экран, рекомендуется 1280×800 или выше
  • 3+ ГБ RAM
  • 32+ ГБ хранилища
  • Wi-Fi 5GHz (рекомендуется) или Ethernet через USB-C адаптер для надёжности

5.2. Рекомендованный список (для саппорта)

СегментМодельПримерная цена
БюджетLenovo Tab M10 (3rd Gen), Xiaomi Redmi Pad SE15–20K руб
MidSamsung Galaxy Tab A9+, Huawei MatePad 1125–35K руб
Industrial (жирные кухни)ELO Touch Tablet (IP54)60K+ руб

Финальный список будет в спеке после теста на 1–2 моделях.

5.3. Что владелец докупает

  • Крепление-монтаж (стенное / подвесное / на штатив) — 1.5–5K руб
  • Зарядное устройство 2А+ с кабелем — 1–2K руб
  • Опционально: USB-Ethernet адаптер для надёжного соединения — 1K руб
  • Опционально: UPS для роутера и hub-POS

§6. Ролевая модель

ДействиеВладелец франшизыВладелец партнёраМенеджерПовар/БаристаКассир
Логин в KDS-приложение
Видеть заказы своей станции
Менять статус позиции
Закрыть заказ как готовый
Изменить настройки KDS на устройстве
Видеть финансы / возвраты

6.1. Новые permissions

  • kds.access — позволяет логиниться в KDS-приложение и менять статус позиций
  • kds.settings.edit — позволяет менять настройки на устройстве (звуки, цвета, layout)

Сотрудник может иметь и pos.access, и kds.access одновременно — например менеджер.

6.2. Как раздаются permissions

Через раздел «Роли» в Админке Франшизы (см. Роли). Создаётся роль «Повар» с kds.access, привязывается к сотрудникам. Менеджер получает обе.


§7. Принятые решения

Все 11 вопросов из draft-версии BR закрыты пользователем 2026-04-29

#ВопросРешение
1Один или несколько BFFДобавляем KDS-routes в существующий pos-bff. Файл bff/src/routes/kds.ts. Если разрастётся — выделим отдельный kds-bff в P1+.
2Несколько станций на устройстве в P0Включено в P0. Multi-select при логине. Маленькие ТТ кладут один планшет на «Кухня + Бар».
3Заказы на самовывоз/доставкуПоказывать всё в P0, фильтры по типу заказа — P1+.
4Цвета и звукиНастраиваемые per-франшиза в админке. Endpoint GET /api/v1/pos/kds/settings отдаёт текущие. На устройстве — локальное переопределение.
5Авто-обновление приложенияSideload через in-app updater (кнопка «Проверить обновления» в Settings + опц. auto-check каждые 24ч). Tauri-updater plugin или собственный механизм через GitHub Releases / наш CDN. Это упрощает выкатку патчей во время пилота.
6Время уведомлений / цветовые порогиНастраиваемые per-станция в админке франшизы (раздел «Кухонные станции» → поля yellow_threshold_minutes, red_threshold_minutes).
7Что показывать когда заказов нетПустой экран с надписью «Ожидание заказов» + название выбранных станций (минималистично, без лишнего шума). Дизайнер может добавить лого франшизы — финализируется в фронт-спеке.
8Reboot vs sleepПосле reboot — обязательный PIN. После sleep/wake — auto-resume если JWT не истёк. После 30 мин неактивности — PIN.
9Где KDS логируетсяОтдельная таблица kds_devices (device_id, franchise_id, current_user_id, last_seen_at, app_version). Используется для аудита, удалённого logout, лимитирования сессий.
10Звуковые файлыВстроенные в APK (набор из 3–5 мелодий). Per-франшиза кастомизация = выбор из встроенного набора + загрузка своих файлов отложена в P1+.
11Языки UIТолько русский в P0.

Sideload + in-app updater — что это и как

Sideload — установка APK файла напрямую на устройство, минуя Google Play. У нас в любом случае такой путь, потому что приложение для собственных клиентов франшизы (не публичное, не нужна модерация).

In-app updater: Tauri 2 имеет официальный плагин @tauri-apps/plugin-updater, работающий и на Windows, и на Android. Принцип:

  1. Приложение читает https://updates.nirbi.ru/kds/latest.json → получает версию + URL APK + signature
  2. Если версия новее текущей — показывает кнопку «Обновить»
  3. Тап → скачивает APK → ставит (Android требует пользовательского подтверждения, но без флешки)

Для P0 — ручная кнопка «Проверить обновления» в Settings. Auto-check каждые 24 часа можно включить опционально. Это значит: разработчик собрал новый APK → залил в наше хранилище → все планшеты во всех ТТ подхватили в течение суток (или вручную при тапе).


§8. Фазинг

ФазаЧтоСрокКто
A. POS BFF — KDS endpointsREST + WebSocket для KDS, Kafka consumer на order.*, фильтрация по station1 неделяБэкенд
B. Order Service — расширениеEndpoint /internal/orders?station_id=, статусы позиций, события в Kafka (если нет)1 неделяБэкенд (параллельно A)
C. erp-kds — Tauri скелетНовый репо, Tauri 2 + React + Android target, базовый layout, login1 неделяФронтенд
D. KDS — UI и логикаКарточки заказов, статусы, фильтры, цвета, звуки, техкарта, settings2 неделиФронтенд
E. KDS — транспорт-абстракция и e2eIKdsTransport, CloudTransport, MockTransport, e2e через интернет1 неделяФронтенд
F. Pilot и smokeДеплой APK, установка на реальный планшет в demo-coffee, неделя реального использования1 неделяВсе

Итого: ~5–6 недель парных усилий (бэкенд + фронт). Фазы A+B можно делать параллельно с C, потом D зависит от B (контракт).


§9. План работ — файлы под создание/правку

CREATE при /process-br 5.1

  • 08-Specs/KDS/Overview.md — новый продукт (по аналогии с 08-Specs/POS/Overview.md)
  • 08-Specs/KDS/KDS Android.md — бизнес-спека приложения
  • 09-Frontend Specs/KDS/Логин.md
  • 09-Frontend Specs/KDS/Список заказов.md
  • 09-Frontend Specs/KDS/Карточка заказа.md
  • 09-Frontend Specs/KDS/Настройки.md
  • 07-Tasks/Decomposition/5.1 KDS Android/Overview.md
  • 07-Tasks/Decomposition/5.1 KDS Android/Order Service.md
  • 07-Tasks/Decomposition/5.1 KDS Android/POS BFF.md
  • 07-Tasks/Decomposition/5.1 KDS Android/erp-kds.md

EDIT при /process-br 5.1

  • 03-Services/Order Service/API.md — endpoints для KDS-фильтрации (multi-station csv)
  • 03-Services/Order Service/Events.mdorder.created, order.item.status_changed (если ещё не публикуются — добавить)
  • 03-Services/Order Service/Data Model.md — поле expected_ready_at если нет
  • 03-Services/Catalog Service/Data Model.mdkitchen_stations дополняется полями yellow_threshold_minutes, red_threshold_minutes (per-station цветовые пороги)
  • 08-Specs/Админка Франшизы/Кухонные станции.md — расширить:
    • секция про KDS-связку (сейчас только справочник)
    • новые поля yellow_threshold_minutes, red_threshold_minutes на станции
    • UI настройки звуков франшизы
  • 08-Specs/Админка Франшизы/Роли.md — новые permissions kds.access, kds.settings.edit
  • 07-Tasks/Repositories.md — добавить новый репо erp-kds (Android+Windows target Tauri)
  • 01-Architecture/Tech Stack.md — добавить KDS как Tauri-Android в стек
  • 01-Architecture/System Overview.md — добавить KDS в карту продуктов
  • 08-Specs/Админка Франшизы/Overview.md — упоминание KDS как клиента кухонных станций

CODE (после /verify 5.1)

  • erp-pos-bff — новые routes для KDS (/api/v1/pos/kds/*), Kafka consumer на order.*, WebSocket gateway
  • erp-order-service — внутренние endpoints, Kafka события (если нужны)
  • erp-catalog-service — миграция kitchen_stations (поля yellow_threshold_minutes, red_threshold_minutes), API расширения
  • erp-user-service — таблица kds_devices, endpoint регистрации устройства
  • erp-admin/web — раздел «KDS-настройки» в админке (per-станция пороги, звуки франшизы), список зарегистрированных KDS-устройств
  • erp-kds — новый репо: apps/kds, packages/api-client, packages/domain, packages/ui (структура как erp-pos-desktop). Tauri 2 с targets Android + Windows.
  • In-app updater инфраструктура: https://updates.nirbi.ru/kds/latest.json + хранилище APK (S3/MinIO bucket) + signing keys
  • CI/CD: GitHub Actions — Android signing, APK release pipeline, публикация manifest для updater

§10. Verification

После реализации (на erp-test.nirbi.ru + demo-coffee tenant):

  1. Создать сотрудника-повара с permission kds.access через админку
  2. Скачать APK, установить на тестовый Android-планшет
  3. Войти в KDS по PIN, выбрать станцию «Горячий цех»
  4. На POS Desktop: пробить заказ с товаром, привязанным к «Горячему цеху»
  5. ≤2 сек на KDS появляется заказ + звуковое уведомление
  6. Тапнуть «В работе» на позиции → меняет цвет на синий
  7. Тапнуть «Готово» на позицию → меняет на зелёный с галочкой
  8. Тапнуть «Готово» на весь заказ → заказ уезжает с экрана
  9. На POS у кассира — статус заказа обновился до «готов к подаче»
  10. Отключить Wi-Fi на планшете → красный баннер «Нет связи», текущие заказы остаются
  11. Включить Wi-Fi → баннер «Связь восстановлена», синхронизация
  12. Тестировать просрочку — карточка краснеет, тревожный звук
  13. Тестировать просмотр техкарты — модалка открывается с рецептом
  14. Logout → возврат на PIN-экран
  15. Login другим сотрудником → его станция, его заказы
  16. Multi-station: logout, заново login с галочками «Кухня + Бар» — на экране заказы обеих станций, в карточке группировка, две кнопки «Готово»
  17. Per-станция пороги: в админке «Кухонные станции» поставить «Бар: жёлтый = 2 мин, красный = 0 мин» — на устройстве для бар-заказов цвет соответствует
  18. Per-франшиза звуки: в админке выбрать другую мелодию для «нового заказа» → на устройстве при следующем заказе звучит новая
  19. Reboot устройства: перезагрузить планшет → требует PIN заново
  20. Sleep/wake: заблокировать экран → разблокировать → сессия восстановлена
  21. In-app updater: собрать новый APK с минорным изменением → залить в updates.nirbi.ru/kds/ → на устройстве в Settings «Проверить обновления» → должен показать «Доступна версия X.Y.Z» → тап «Обновить» → APK ставится

§11. Что входит в следующие BR (на будущее)

Чтобы зафиксировать границу скоупа и backlog:

BRЧтоКогда
BR 5.2KDS LAN-hub mode: POS Desktop поднимает axum-сервер на :8080, KDS подключается по LAN, работа без интернетаP1 (после P0 в проде)
BR 5.3KDS Offline-first: SQLite-реплика на каждом устройстве, event-log sync, конфликт-резолюшнP2
BR 5.4Принтеры per-станция: ESC/POS принтеры через USB/Ethernet, конфиг per-станция в админкеP1
BR 5.5Bump bar: USB HID-контроллер для high-volume кухоньP2
BR 5.6Курсы подачи (горячее/холодное/десерт) — порядок отображения позиций в карточке + последовательная готовкаP2
BR 5.7Кастомные звуковые файлы per-франшиза (загрузка через админку) — расширение P0 настройки звуковP2
BR 5.8Фильтры заказов по типу (зал/самовывоз/доставка) и каналу (POS/web/Yandex)P1
BR 5.9Английский UI и i18n-инфраструктураP2

§12. Ссылки