3
from typing import Optional
5
from sqlalchemy import Sequence, Uuid, DateTime, UniqueConstraint
6
from sqlalchemy.orm import mapped_column, Mapped
8
from app.inventory.mixins import StockMixin
9
from core.db import Base
10
from core.db.mixins import AllMixin
11
from core.db.types import ids
14
class Lot(Base, AllMixin):
16
**Партия** - Партия обозначает уникальный набор аттрибутов конкретного количества товаров, например Единый срок годности
17
или пришедшая от другого поставщика
20
__table_args__ = (UniqueConstraint('external_number', 'product_id', 'partner_id', name='_lot_ex_pr_par_id_uc'),)
21
lsn_seq = Sequence(f'lot_lsn_seq')
22
id: Mapped[uuid.UUID] = mapped_column(Uuid, primary_key=True, index=True, default=uuid.uuid4)
23
expiration_datetime: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(timezone=True))
24
product_id: Mapped[uuid.UUID] = mapped_column(Uuid, index=True, nullable=True)
25
external_number: Mapped[Optional[str]] = mapped_column(nullable=False, unique=True)
26
partner_id: Mapped[Optional[uuid.UUID]] = mapped_column(Uuid, index=True, nullable=True)
29
class Quant(Base, AllMixin, StockMixin):
31
**Квант** - это минимальная и уникальная единица остатка являющаяся одинаковой по своим свойствам в рамках местоположения
32
Например, если в ячейку "A" на которой находится уже товар "A" с партией "A" и количеством 5 добавляется товар
33
"A" с партией "A" и количеством 5, то к в ячейке "A" будет создан квант с количеством 10,
34
Но если добавляется товар "A" c партией "B", то в местоположении будет создано 2 кванта
35
*Поля свойства определяющие уникальность кванта*
36
- store_id: ID магазина
37
- location_id: ID местоположения кванта
38
- lot_id: ID партии кванта
39
- owner_id: ID собственника кванта
40
- uom_id: Единица измерения, в которой находится квант
41
quantity: Количество товара в кванте
42
reserved_quantity: Зарезервирвоанное количество товара в кванте
44
__tablename__ = "quant"
45
__table_args__ = (UniqueConstraint(
46
'store_id', 'location_id', 'lot_id', 'expiration_datetime', name='_quant_st_loc_lot_ex_id_uc'
48
lsn_seq = Sequence(f'quant_lsn_seq')
49
quantity: Mapped[float]
50
reserved_quantity: Mapped[float]
51
incoming_quantity: Mapped[float]
52
expiration_datetime: Mapped[Optional[datetime.datetime]] = mapped_column(DateTime(timezone=True))
53
uom_id: Mapped[uuid.UUID] = mapped_column(Uuid, index=True, nullable=False)
54
move_ids: Mapped[Optional[ids]] = mapped_column(index=True)
57
def available_quantity(self):
58
return self.quantity - self.reserved_quantity