KDS — PIN-логин и выбор станций
Когда показывается: при первом запуске после регистрации устройства; при auto-логауте; после reboot устройства; после Logout.
Источник
BR 5.1 §1.1, §2.1а (multi-station) Бизнес-спека: Кухонный экран §2.2 «Multi-station», §2.9 «Жизненный цикл сессии»
Двухшаговый экран: ввод PIN → выбор станций. После успеха повар попадает на главный экран «Список заказов».
Шаг 1 — Ввод PIN
Layout
Полноэкранный экран на чёрном фоне (kitchen-mode):
- Логотип франшизы вверху (если задан)
- Текст «Введите PIN»
- 4 точки-индикатора цифр PIN
- Цифровая клавиатура 3×4 (кнопки 1–9, 0, backspace)
- Внизу справа — название ТТ устройства серым (для контекста)
- Внизу слева — мини-кнопка «Настройки» (открывает Settings без авторизации — только для смены ТТ / Logout / About)
Поведение
- При вводе 4-й цифры → автоматический вызов
POST /api/v1/pos/auth/pinс{ pin, device_id } - Спиннер на индикаторах
- При успехе:
- JWT сохраняется в SQLite (table
session) - Переход на шаг 2 (выбор станций)
- JWT сохраняется в SQLite (table
- При ошибке:
- Точки становятся красными на 1 сек
- Очищаются
- Toast с сообщением
Ошибки
| Code | Сообщение |
|---|---|
INVALID_PIN (401) | «Неверный PIN. Попробуйте снова.» |
KDS_ACCESS_DENIED (403) | «У вас нет доступа к KDS. Обратитесь к менеджеру.» (если у сотрудника нет permission kds.access) |
EMPLOYEE_INACTIVE (403) | «Сотрудник деактивирован.» |
DEVICE_REVOKED (401) | «Устройство отвязано админом.» → перенаправление на экран регистрации |
| Network | Баннер сверху «Нет связи с сервером», возможность повторить |
Anti-bruteforce
- После 5 неудачных попыток подряд — блокировка ввода на 30 секунд (с таймером на экране)
- После 10 — на 5 минут
Шаг 2 — Выбор станций (Multi-select)
Layout
После успешного PIN — экран «На какой станции работаете?» со списком станций франшизы.
- Заголовок: «Привет, {имя сотрудника}!»
- Подзаголовок: «Выберите одну или несколько станций»
- Список станций франшизы (полученный из
GET /api/v1/pos/kitchen-stations):- Чекбоксы (multi-select)
- Имя станции, описание (если есть)
- Иконка по типу станции (опционально, если задано в админке)
- Внизу — кнопка «Начать смену» (disabled пока не выбрано хотя бы одной станции)
- Внизу-слева — линк «Сменить пользователя» (возврат на шаг 1)
Поведение
- При тапе «Начать смену»:
- В SQLite сохраняется
selected_station_ids[] - Открывается WebSocket-соединение
wss://.../api/v1/pos/kds/stream?station_ids=... - Загружается начальный список заказов через
GET /api/v1/pos/kds/orders?station_ids=...&status=accepted - Переход на «Список заказов»
- В SQLite сохраняется
Состояния
- Загрузка списка станций: skeleton-блоки
- Нет станций: «В этой франшизе ещё нет кухонных станций. Обратитесь к владельцу.» + кнопка «Logout»
- Auto-select: если станция одна — автоматически выбрана, кнопка «Начать смену» сразу активна
Сохранение выбора между сессиями
Последний выбор selected_station_ids сохраняется в SQLite. При следующем PIN-логине — пред-выбран автоматически (для UX). Повар может изменить выбор перед нажатием «Начать смену».
Reboot и sleep
После reboot устройства
После полной перезагрузки планшета (или закрытия приложения) — обязательный повторный PIN. JWT в SQLite не используется для auto-resume — security.
После sleep / wake
Если приложение было в фоне или экран блокировки:
- Если JWT не истёк (по
expires_at) → auto-resume в «Список заказов» без PIN - Если истёк → показать PIN-экран с пред-выбранными станциями (повар не вводит станции заново)
Auto-логаут
Через auto_logout_minutes (per-франшиза, default 30) минут неактивности (нет тапов на экране) — JWT очищается, возврат на PIN.
Тех. детали
Хранение сессии
-- SQLite на устройстве
CREATE TABLE session (
jwt TEXT PRIMARY KEY,
user_id TEXT,
user_name TEXT,
selected_station_ids TEXT, -- JSON array
expires_at TEXT, -- ISO 8601
last_activity_at TEXT
);При каждом тапе на экране — обновляется last_activity_at. Background timer проверяет каждые 60 сек: если now - last_activity_at > auto_logout_minutes → logout.
Audio resume
При активной сессии и переходе из background — приложение должно auto-resume аудио (для звуковых уведомлений) если оно было выключено системой.
Что НЕ входит в P0
- Биометрия / face unlock
- Магнитная карта сотрудника
- Логин по NFC-меткам
- 6-значный PIN (только 4)
Связи
- Бизнес-спека §2.1, §2.2, §2.9
- User Service — PIN validation
- Catalog Service — список станций
- Следующий экран
- Сотрудники — управление PIN