Watch
1
0
Fork
You've already forked Seyyed_arc
0
forked from hesabix/arc
Seyyed_arc/hesabixAPI/adapters/db/models/inventory_discrepancy.py

89 lines
4.1 KiB
Python

from __future__ import annotations
from datetime import datetime
from decimal import Decimal
from sqlalchemy import DateTime, ForeignKey, Integer, Numeric, String, Text, UniqueConstraint
from sqlalchemy.orm import Mapped, mapped_column, relationship
from adapters.db.session import Base
class InventoryDiscrepancyCase(Base):
"""ردپای قابل رسیدگی برای فروش‌هایی که با کسری سیستمی ثبت شده‌اند."""
__tablename__ = "inventory_discrepancy_cases"
__table_args__ = (
UniqueConstraint("business_id", "request_token", name="uq_inventory_discrepancy_request"),
)
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
business_id: Mapped[int] = mapped_column(
Integer, ForeignKey("businesses.id", ondelete="CASCADE"), nullable=False, index=True
)
invoice_document_id: Mapped[int] = mapped_column(
Integer, ForeignKey("documents.id", ondelete="RESTRICT"), nullable=False, index=True
)
warehouse_document_id: Mapped[int | None] = mapped_column(
Integer, ForeignKey("warehouse_documents.id", ondelete="SET NULL"), nullable=True, index=True
)
resolution_document_id: Mapped[int | None] = mapped_column(
Integer,
ForeignKey("goods_expense_income_documents.id", ondelete="SET NULL"),
nullable=True,
index=True,
)
status: Mapped[str] = mapped_column(String(24), nullable=False, default="open", index=True)
source_type: Mapped[str] = mapped_column(String(32), nullable=False, default="quick_sale")
request_token: Mapped[str] = mapped_column(String(80), nullable=False)
reason_code: Mapped[str] = mapped_column(String(48), nullable=False)
reason_note: Mapped[str | None] = mapped_column(Text, nullable=True)
created_by_user_id: Mapped[int] = mapped_column(Integer, nullable=False, index=True)
resolved_by_user_id: Mapped[int | None] = mapped_column(Integer, nullable=True)
resolution_type: Mapped[str | None] = mapped_column(String(48), nullable=True)
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow, nullable=False)
updated_at: Mapped[datetime] = mapped_column(
DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False
)
resolved_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
lines = relationship(
"InventoryDiscrepancyLine",
back_populates="case",
cascade="all, delete-orphan",
order_by="InventoryDiscrepancyLine.id",
)
invoice_document = relationship("Document", foreign_keys=[invoice_document_id])
class InventoryDiscrepancyLine(Base):
__tablename__ = "inventory_discrepancy_lines"
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
case_id: Mapped[int] = mapped_column(
Integer,
ForeignKey("inventory_discrepancy_cases.id", ondelete="CASCADE"),
nullable=False,
index=True,
)
product_id: Mapped[int] = mapped_column(
Integer, ForeignKey("products.id", ondelete="RESTRICT"), nullable=False, index=True
)
warehouse_id: Mapped[int] = mapped_column(
Integer, ForeignKey("warehouses.id", ondelete="RESTRICT"), nullable=False, index=True
)
invoice_item_line_id: Mapped[int | None] = mapped_column(
Integer, ForeignKey("invoice_item_lines.id", ondelete="SET NULL"), nullable=True
)
available_quantity: Mapped[Decimal] = mapped_column(Numeric(18, 6), nullable=False)
requested_quantity: Mapped[Decimal] = mapped_column(Numeric(18, 6), nullable=False)
shortage_quantity: Mapped[Decimal] = mapped_column(Numeric(18, 6), nullable=False)
resolved_quantity: Mapped[Decimal] = mapped_column(
Numeric(18, 6), nullable=False, default=Decimal("0")
)
resolution_unit_cost: Mapped[Decimal | None] = mapped_column(Numeric(18, 6), nullable=True)
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow, nullable=False)
case = relationship("InventoryDiscrepancyCase", back_populates="lines")
product = relationship("Product", foreign_keys=[product_id])
warehouse = relationship("Warehouse", foreign_keys=[warehouse_id])