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 (выбор станций)
  • При ошибке:
    • Точки становятся красными на 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
    • Переход на «Список заказов»

Состояния

  • Загрузка списка станций: 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)

Связи