Модуль stock / warehouse_zones
Пути: app/stock/, app/storage/, app/warehouse_zones/
Django apps: app.stock, app.storage, app.warehouse_zones
Назначение
Управляет складскими остатками, зонами хранения, движением товаров, резервированием и инвентаризацией.
Модели
app.stock
python
class Units(Model):
"""Единицы измерения"""
name = CharField()
short_name = CharField()
okei_code = CharField() # код ОКЕЙ
class Packaging(Model):
"""Иерархия упаковки"""
assortiment = FK(Assortiment)
parent_unit = FK(Units) # вышестоящая единица
child_unit = FK(Units) # вложенная единица
quantity = DecimalField() # коэффициент пересчётаapp.warehouse_zones
python
class ZoneBalance(Model):
"""Баланс остатков в зоне"""
warehouse = FK(Warehouse)
zone = FK(WarehouseZone)
assortiment = FK(Assortiment)
quantity = DecimalField() # фактический остаток
reserved = DecimalField() # зарезервировано
updated_at = DateTimeField()
class ZoneMovement(Model):
"""Движение товара между зонами"""
from_zone = FK(WarehouseZone, null=True)
to_zone = FK(WarehouseZone, null=True)
assortiment = FK(Assortiment)
quantity = DecimalField()
document = FK(Documents) # основание
created_at = DateTimeField()
created_by = FK(User)
class ZoneReservation(Model):
"""Резервирование товаров"""
zone = FK(WarehouseZone)
assortiment = FK(Assortiment)
quantity = DecimalField()
document = FK(Documents) # под какой заказ
expires_at = DateTimeField() # срок резервированияapp.storage
python
class BalanceInStockZone(Model):
"""Агрегированный баланс для отчётов"""
warehouse = FK(Warehouse)
assortiment = FK(Assortiment)
quantity_total = DecimalField()
quantity_free = DecimalField() # свободный остаток
date = DateField()API
| Endpoint | Описание |
|---|---|
GET /api/v2/warehouse-zones/ | Список зон склада |
GET /api/v2/warehouse-zones/balance/ | Баланс по зонам |
GET /api/v2/warehouse-zones/movements/ | История движений |
POST /api/v2/warehouse-zones/reserve/ | Создать резервирование |
Логика резервирования
При подтверждении заказа покупателя:
- Система проверяет
ZoneBalance.quantity - ZoneBalance.reserved - Если свободного остатка достаточно — создаёт
ZoneReservation ZoneBalance.reservedувеличивается- При отгрузке:
ZoneMovement(→ зона Отгрузки),ZoneReservationудаляется,ZoneBalance.quantityуменьшается
Инвентаризация
При проведении инвентаризации (set_inventory_applicable):
- Сравниваются учётные остатки (
ZoneBalance) с фактическими (InventoryPosition) - По расхождениям создаются корректирующие документы
ZoneBalanceобновляется по факту
Связи
app.document— документы-основания движенийapp.manufacture— списание материалов в производствоapp.tms— паллетная сборка и отгрузка