Устройства
Единый раздел для всех зарегистрированных в франшизе устройств: POS-кассы (Windows desktop) и KDS-планшеты (Android). Структура и поведение зеркальные — KDS-устройства появились первыми в BR 5.1, POS-устройства добавлены позже как часть POS Desktop onboarding.
Кейс — зачем нужно
Без онбординга .exe инсталлер POS Desktop работает только когда bffUrl и storeId зашиты в сборку (через VITE_* env). Это значит:
- На каждую ТТ собираем отдельный
.exe, либо разработчик идёт на каждую кассу с настройками. - Нет учёта установленных касс в базе → админ не видит сколько касс в франшизе, не может удалённо их отозвать или переименовать.
- При смене ТТ или замене ПК — пересборка инсталлера или ручной перенастрой.
С онбордингом — один универсальный .exe, при первом запуске пользователь проходит wizard, касса попадает в БД. Тот же паттерн для KDS уже работает.
Сущности
POS-устройство (Windows-касса)
| Поле | Тип | NULL | Описание |
|---|---|---|---|
id | uuid | — | PK, server-side. |
device_id | uuid | — | Генерится на устройстве при первом запуске, persisted в localStorage. Уникален в рамках франшизы среди не-revoked. |
franchise_id | uuid | — | FK на текущую франшизу (через JWT при регистрации). |
store_id | uuid | — | ТТ к которой привязана касса (выбирается при регистрации из доступных юзеру). |
name | varchar(100) | nullable | Понятное имя. По умолчанию POS-{first 6 hex of device_id}. |
last_user_id | uuid | nullable | Последний логинившийся кассир. |
current_user_id | uuid | nullable | Активная сессия. Снимается на logout. |
app_version | varchar(20) | nullable | Версия инсталлера. Обновляется через X-App-Version header. |
last_seen_at | timestamp | nullable | Heartbeat при каждом запросе через pos-bff. |
revoked_at | timestamp | nullable | Soft-delete. После revoke касса отдаёт 401 DEVICE_REVOKED на следующем запросе. |
KDS-устройство (Android-планшет)
См. BR 5.1 и User Service · Data Model. Структура идентична POS-устройству.
Бизнес-правила
- Уникальность.
(franchise_id, device_id)уникален среди не-revoked. Двойная регистрация одногоdevice_id(на ту же машину) либо переиспользует запись, либо отдаёт409 DEVICE_ALREADY_REGISTERED. - Soft-delete. Удаление через админку =
revoked_at = now(). Запись остаётся для аудита (последний пользователь, app_version). - Force-logout. Pos-bff на каждом запросе делает heartbeat в User Service. Если устройство revoke’нуто — pos-bff возвращает
401 DEVICE_REVOKED. Клиент чистит локальную регистрацию и показывает RegistrationScreen. - Online/offline. Устройство считается online если
last_seen_at< 2 минут назад.
Ролевая матрица
| Действие | pos.settings.edit |
|---|---|
| Видеть пункт «Устройства» в сайдбаре | ✅ |
| Список POS- и KDS-устройств | ✅ |
| Регистрация POS (с устройства, через admin login) | ✅ |
| Регистрация KDS (с устройства, через admin login) | ✅ |
| Переименование любого устройства | ✅ |
| Отзыв (revoke) устройства | ✅ |
Один permission на оба типа
pos.settings.editрасширен по решению с пользователем (2026-04-30) — теперь покрывает не только настройки кассы, но и управление POS+KDS-устройствами. То же самое в KDS:kds.settings.editотвечает за настройки KDS и за устройства KDS (но дублируется через эту страницу — оба permission’а имеют доступ к табу KDS).
Связи
- BR 5.1 — изначальная фича KDS-онбординга, паттерн для POS.
- User Service · Data Model — таблицы
kds_devices+pos_desktop_devices. - User Service · API — admin endpoints
/api/v1/admin/{kds,pos}/devices/*. - POS · Регистрация устройства — wizard на стороне Windows-кассы.
- Админка · Устройства — UI таблицы со списком всех устройств.