Склад
Управление складом материалов. Веб-интерфейс: sklad.salonai.ru.
Архитектура складского учёта
Склад построен вокруг концепции движений (SkladMovement). Любое изменение остатка — это движение с типом и источником.
SkladProduct (товар)
│
├── SkladStockBalance — остаток по каждому хранилищу (SkladStorage)
│
├── SkladMovement — каждое изменение остатка
│ ├── doc_type: receipt / expense / write_off / ...
│ ├── status: draft → posted
│ └── source: manual / yclients_sync / work_session / package
│
├── SkladPurchaseOrder — заказ поставщику
│ └── SkladPurchaseOrderLine — позиции заказа
│
├── SkladInventorySession — инвентаризация
│ └── SkladInventoryLine — позиции пересчёта
│
├── SkladTechCard — техкарта (норма расхода на услугу)
│ └── SkladTechCardLine — позиции техкарты
│
├── SkladBatch — партионный учёт
├── SkladReservation — резерв под предстоящие услуги
└── SkladOverconsumptionAlert — сигнал о перерасходе
Д вижения (SkladMovement)
Типы движений (doc_type)
| Тип | Описание | Влияние на остаток |
|---|---|---|
receipt | Поступление (от поставщика) | + |
expense | Расход (продажа клиенту) | − |
write_off | Списание (порча, истечение срока) | − |
consumption_write_off | Списание по факту использования на услуге | − |
transfer | Перемещение между хранилищами | ±0 (два движения) |
adjustment | Корректировка (по итогам инвентаризации) | ± |
Статусы движения
draft → posted
| Статус | Описание |
|---|---|
draft | Черновик — остатки ещё не изменены |
posted | Проведён — остатки обновлены в SkladStockBalance |
Источники движения (source)
| Источник | Описание |
|---|---|
manual | Создано вручную пользователем |
yclients_sync | Автоматически при синхронизации с YClients |
work_session | Автоматически при закрытии рабочей сессии мастера |
package | Списание из открытого пакета (SkladOpenPackage) |
Заказы поставщи кам (SkladPurchaseOrder)
Жизненный цикл заказа
draft → sent → partial → received
│
└──────────────> cancelled
| Статус | Описание |
|---|---|
draft | Черновик заказа, ещё не отправлен |
sent | Заказ отправлен поставщику |
partial | Получена часть позиций |
received | Получено полностью |
cancelled | Отменён |
При переходе в received автоматически создаётся движение типа receipt в SkladMovement.
Инвентаризация (SkladInventorySession)
Жизненный цикл инвентаризации
draft → counting → posted
| Статус | Описание |
|---|---|
draft | Инвентаризация создана, счёт не начат |
counting | Идёт пересчёт: вносятся фактические остатки по позициям |
posted | Проведена: расхождения зафиксированы движениями adjustment |
Алгоритм проведения инвентаризации:
- По каждой позиции (
SkladInventoryLine) сравниваетсяfact_qtyсsystem_qty - Если есть расхождение — создаётся
SkladMovementтипаadjustment SkladStockBalanceобновляется до фактических значений
Техкарты (SkladTechCard)
Техкарта — это норма расхода материалов на конкретную услугу.
SalonService ──── SkladServiceTechCardBinding ──── SkladTechCard
│
SkladTechCardLine
(product + quantity)
При закрытии рабочей сессии (work_session) система:
- Находит техкарты для каждой оказанной услуги
- Создаёт движение
consumption_write_offна фактический расход - Если фактический расход превышает норму — создаётся
SkladOverconsumptionAlert
Список товаров на складе
GET /api/sklad/products/
Authorization: Bearer <token>
Ответ:
{
"results": [
{
"id": 101,
"name": "Краска для волос Wella",
"sku": "WL-1234",
"quantity": 15,
"unit": "шт",
"critical_stock": 5,
"desired_stock": 20,
"price": "350.00",
"photo": "https://sklad.salonai.ru/media/sklad/products/..."
}
]
}
Критический остаток
Когда quantity <= critical_stock, система генерирует предупреждение владельцу. Уведомление отправляется через n8n (N8N_OWNER_ADMIN_WEBHOOK_URL).