Skip to content

Модуль 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/Создать резервирование

Логика резервирования

При подтверждении заказа покупателя:

  1. Система проверяет ZoneBalance.quantity - ZoneBalance.reserved
  2. Если свободного остатка достаточно — создаёт ZoneReservation
  3. ZoneBalance.reserved увеличивается
  4. При отгрузке: ZoneMovement (→ зона Отгрузки), ZoneReservation удаляется, ZoneBalance.quantity уменьшается

Инвентаризация

При проведении инвентаризации (set_inventory_applicable):

  • Сравниваются учётные остатки (ZoneBalance) с фактическими (InventoryPosition)
  • По расхождениям создаются корректирующие документы
  • ZoneBalance обновляется по факту

Связи

  • app.document — документы-основания движений
  • app.manufacture — списание материалов в производство
  • app.tms — паллетная сборка и отгрузка