BR 1.15: Фронт складского учёта
Зависит от:
Контекст
Бэкенд складского учёта реализован (BR 1.14): склады, остатки, приёмки, списания, партии, FIFO, средневзвешенная цена. Нужен UI в единой админке (erp-admin) для управления складом. Как в YumaPos — отдельная секция “Склад” в sidebar с подразделами.
Требования
1. Секция “Склад” в sidebar
Отдельная группа в sidebar (после “Каталог”), как в YumaPos:
Склад
├─ Остатки
├─ Приёмки
└─ Списания
Видна: Franchise, Franchisee, Manager. Не видна: Cashier.
2. Store selector
На каждой странице склада — выбор ТТ (склад привязан к ТТ):
- Franchise: dropdown всех ТТ
- Franchisee: dropdown своих ТТ
- Manager: автоматически выбрана своя ТТ (dropdown заблокирован)
Паттерн: как на странице стоп-листов.
3. Складские остатки (/warehouse/inventory)
Таблица текущих остатков выбранного склада:
| Колонка | Данные |
|---|---|
| Ингредиент | ingredient_name — кликабельное (переход в карточку ингредиента) |
| Ед. изм. | unit_of_measure |
| Текущий остаток | current_quantity |
| Средняя цена | average_cost (₽ за единицу) или ”—“ |
| Обновлено | updated_at |
Поиск по названию ингредиента. Пустое состояние: “Нет данных по остаткам”.
API: GET /api/v1/stock-balances?warehouse_id={id}
4. Акты приёмки (/warehouse/receipt-acts)
4.1 Список приёмок
Таблица всех приёмок выбранного склада:
| Колонка | Данные |
|---|---|
| Номер | document_number — кликабельное |
| Дата | receipt_date |
| Статус | badge: Черновик (серый) / Проведён (зелёный) |
| Сумма | total_amount ₽ |
| Комментарий | comment или ”—” |
Кнопка “Создать приёмку” (Franchise/Franchisee/Manager). Фильтр по статусу (Все / Черновики / Проведённые).
API: GET /api/v1/receipt-acts?warehouse_id={id}&status=
4.2 Карточка приёмки (/warehouse/receipt-acts/:id)
Шапка: номер, дата, статус badge, кнопки.
Поля (редактируемые в draft):
- Дата приёмки (datepicker)
- Комментарий (textarea)
Таблица строк:
| Колонка | Данные |
|---|---|
| Ингредиент | ingredient_name |
| Кол-во | quantity (inline-edit в draft) |
| Ед. изм. | unit_of_measure |
| Цена за ед. | unit_price ₽ (inline-edit в draft) |
| Сумма | line_total ₽ (авто: кол-во × цена) |
| Срок годности | shelf_life_date (опционально) |
| Действия | ”Убрать” (только в draft) |
“Добавить строку” → модалка поиска ингредиента (как в техкарте) → ввод кол-ва, цены, ед.изм.
Кнопки:
- “Сохранить” — сохраняет draft
- “Провести” —
POST /receipt-acts/{id}/post. После проводки: статус → “Проведён”, поля заблокированы. Подтверждение модалкой. - “Редактировать” — только для draft
Ошибки:
DOCUMENT_ALREADY_POSTED— toast “Документ уже проведён”EMPTY_DOCUMENT— toast “Добавьте хотя бы одну строку”
4.3 Создание приёмки
При клике “Создать приёмку”:
POST /receipt-acts→ создаёт draft- Редирект на карточку draft → пользователь добавляет строки → проводит
5. Акты списания (/warehouse/write-off-acts)
5.1 Список списаний
Аналогично приёмкам:
| Колонка | Данные |
|---|---|
| Номер | document_number |
| Дата | write_off_date |
| Статус | badge |
| Причина | reason |
| Сумма | total_cost ₽ |
API: GET /api/v1/write-off-acts?warehouse_id={id}
5.2 Карточка списания (/warehouse/write-off-acts/:id)
Поля:
- Дата списания
- Причина (текст, обязательно)
Таблица строк:
| Колонка | Данные |
|---|---|
| Ингредиент | ingredient_name |
| Кол-во | quantity (inline-edit в draft) |
| Себестоимость ед. | unit_cost ₽ (из средневзвешенной, read-only) |
| Стоимость | line_cost ₽ (авто) |
| Действия | ”Убрать” |
Ошибки при проводке:
INSUFFICIENT_STOCK— toast “Недостаточно остатков на складе”
Ролевой доступ
| Действие | Франшиза | Франчайзи | Менеджер | Кассир |
|---|---|---|---|---|
| Видеть раздел “Склад” | Да | Да | Да | Нет |
| Просмотр остатков | Все ТТ | Свои ТТ | Своя ТТ | Нет |
| Создать приёмку | Любая ТТ | Свои ТТ | Своя ТТ | Нет |
| Провести приёмку | Любая ТТ | Свои ТТ | Своя ТТ | Нет |
| Создать списание | Любая ТТ | Свои ТТ | Своя ТТ | Нет |
| Провести списание | Любая ТТ | Свои ТТ | Своя ТТ | Нет |
Затронутые сервисы
| Сервис | Что меняется |
|---|---|
| erp-admin (web) | 5 новых страниц: InventoryPage, ReceiptActListPage, ReceiptActDetailPage, WriteOffActListPage, WriteOffActDetailPage. Sidebar секция “Склад”. |
| erp-admin (BFF) | Proxy routes для warehouse: /warehouses, /stock-balances, /receipt-acts/, /write-off-acts/ |
| erp-admin (shared) | Типы: Warehouse, StockBalance, ReceiptAct, WriteOffAct и связанные |
Что НЕ входит
- Журнал документов (единый лог всех типов документов) — Phase 2
- Страница управления складами (/warehouse/settings) — склады создаются автоматически
- Inline-редактирование строк (пока через модалку) — Phase 2 UX
- Импорт строк приёмки из Excel — Phase 2
- Печать документов — Phase 2
Ссылки
- Склад (бизнес-спека)
- Warehouse Service API
- BR 1.14 — бэкенд
- YumaPos:
_reference/yumapos/inventory-items.md,acceptance-acts.md,write-off-acts.md