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 Создание приёмки

При клике “Создать приёмку”:

  1. POST /receipt-acts → создаёт draft
  2. Редирект на карточку 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

Ссылки