Стоп-листы
Бизнес-спека
Route
/stop-lists
Layout
- Header: “Стоп-листы”
- Store selector — дропдаун выбора ТТ (вверху страницы)
- Две секции ниже: “Остановленные товары” и “Остановленные категории”
Store selector
Выбор торговой точки, для которой отображаются стоп-листы.
| Роль | Поведение |
|---|---|
| Франшиза | Дропдаун со всеми ТТ франшизы |
| Франчайзи | Дропдаун только с собственными ТТ (фильтр по store_ids из JWT) |
| Менеджер ТТ | Автовыбор единственной ТТ, дропдаун не показывается |
API: GET /api/v1/admin/stores (через BFF из Store Service)
При смене ТТ — перезагрузка данных стоп-листа.
Остановленные товары
Таблица
| Колонка | Данные |
|---|---|
| Товар | product_name |
| Причина | reason или ”---“ |
| Остановил | stopped_by (имя пользователя если доступно, иначе ID) |
| Дата | created_at (формат: dd.mm.yyyy HH:mm) |
| Действия | Кнопка “Снять стоп” |
API: GET /api/v1/stop-lists/stores/{storeId} — поле products
Действия
-
“Остановить товар” (кнопка над таблицей) — открывает модалку:
- Поиск товара (из каталога,
GET /api/v1/products?search=...) - Поле “Причина” (optional, textarea)
- Кнопка “Остановить”
- API:
POST /api/v1/stop-lists/stores/{storeId}/products
- Поиск товара (из каталога,
-
“Снять стоп” (кнопка в строке) — модалка подтверждения:
- “Снять стоп с товара «{product_name}»?”
- Кнопки “Отмена” / “Снять”
- API:
DELETE /api/v1/stop-lists/stores/{storeId}/products/{productId}
Остановленные категории
Таблица
| Колонка | Данные |
|---|---|
| Категория | category_name |
| Причина | reason или ”---“ |
| Остановил | stopped_by (имя пользователя если доступно, иначе ID) |
| Дата | created_at (формат: dd.mm.yyyy HH:mm) |
| Действия | Кнопка “Снять стоп” |
API: GET /api/v1/stop-lists/stores/{storeId} — поле categories
Действия
-
“Остановить категорию” (кнопка над таблицей) — открывает модалку:
- Выбор категории из дерева (
GET /api/v1/categories) - Поле “Причина” (optional, textarea)
- Кнопка “Остановить”
- API:
POST /api/v1/stop-lists/stores/{storeId}/categories
- Выбор категории из дерева (
-
“Снять стоп” (кнопка в строке) — модалка подтверждения:
- “Снять стоп с категории «{category_name}»?”
- Кнопки “Отмена” / “Снять”
- API:
DELETE /api/v1/stop-lists/stores/{storeId}/categories/{categoryId}
Empty state
“Нет остановленных позиций на этой ТТ”
Показывается когда обе таблицы пусты (нет ни остановленных товаров, ни категорий).
Ролевой доступ
| Роль | Просмотр | Остановить / Снять стоп |
|---|---|---|
| Франшиза | Да | Да |
| Франчайзи | Да (свои ТТ) | Да (свои ТТ) |
| Менеджер ТТ | Да (своя ТТ) | Да (своя ТТ) |
| Кассир | Только чтение | Нет (кнопки скрыты) |
Ошибки
| Код | Описание | UI |
|---|---|---|
PRODUCT_NOT_FOUND | Товар не найден | Toast: “Товар не найден” |
PRODUCT_ALREADY_STOPPED | Товар уже в стоп-листе | Toast: “Товар уже остановлен” |
CATEGORY_NOT_FOUND | Категория не найдена | Toast: “Категория не найдена” |
CATEGORY_ALREADY_STOPPED | Категория уже в стоп-листе | Toast: “Категория уже остановлена” |
STORE_ACCESS_DENIED | Нет доступа к ТТ | Toast: “Нет доступа к этой точке” |