107 lines
4.2 KiB
Python
107 lines
4.2 KiB
Python
from datetime import datetime
|
|
from enum import IntEnum, unique
|
|
from typing import Optional, TYPE_CHECKING
|
|
|
|
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Boolean
|
|
from sqlalchemy.orm import relationship, backref, Mapped, mapped_column
|
|
|
|
from models.base import BaseModel
|
|
from .marketplace import BaseMarketplace
|
|
from .board import Board
|
|
from .status import DealStatus
|
|
from .shipping import Pallet, Box
|
|
from .shipping_warehouse import ShippingWarehouse
|
|
|
|
if TYPE_CHECKING:
|
|
from . import (
|
|
DealBillRequest,
|
|
DealGroup,
|
|
User,
|
|
)
|
|
|
|
|
|
class Deal(BaseModel):
|
|
__tablename__ = 'deals'
|
|
id = Column(Integer, autoincrement=True, primary_key=True, index=True)
|
|
name = Column(String, nullable=False, comment='Название сделки')
|
|
created_at = Column(DateTime, nullable=False, comment='Дата создания')
|
|
|
|
client_id = Column(Integer, ForeignKey('clients.id', ondelete='CASCADE'), nullable=False, comment='ID клиента')
|
|
client = relationship('Client', backref=backref('deals', cascade="all, delete-orphan"))
|
|
|
|
status_history = relationship('DealStatusHistory', back_populates='deal', cascade="all, delete-orphan")
|
|
|
|
is_deleted = Column(Boolean, nullable=False, server_default='0', default=False, comment='Удалена')
|
|
is_completed = Column(Boolean, nullable=False, server_default='0', default=False, comment='Завершена')
|
|
is_locked: Mapped[bool] = mapped_column(default=False, server_default='0')
|
|
is_accounted: Mapped[bool] = mapped_column(default=True, server_default='1')
|
|
|
|
current_status_id: Mapped[int] = mapped_column(
|
|
ForeignKey("deal_statuses.id"),
|
|
nullable=False,
|
|
comment='Текущий статус',
|
|
)
|
|
status: Mapped["DealStatus"] = relationship(lazy="selectin")
|
|
|
|
|
|
shipping_warehouse_id: Mapped[int] = mapped_column(ForeignKey('shipping_warehouses.id'), nullable=True)
|
|
shipping_warehouse: Mapped["ShippingWarehouse"] = relationship()
|
|
|
|
base_marketplace_key: Mapped[str] = mapped_column(ForeignKey("base_marketplaces.key"), nullable=True)
|
|
base_marketplace: Mapped["BaseMarketplace"] = relationship(lazy="joined")
|
|
|
|
delivery_date: Mapped[Optional[datetime]] = mapped_column(nullable=True)
|
|
receiving_slot_date: Mapped[Optional[datetime]] = mapped_column(nullable=True)
|
|
|
|
services = relationship(
|
|
'DealService',
|
|
back_populates='deal',
|
|
cascade="all, delete-orphan",
|
|
order_by="desc(DealService.service_id)"
|
|
)
|
|
|
|
products = relationship(
|
|
'DealProduct',
|
|
back_populates='deal',
|
|
cascade="all, delete-orphan",
|
|
order_by="desc(DealProduct.product_id)"
|
|
)
|
|
|
|
board_id: Mapped[int] = mapped_column(ForeignKey('boards.id'), nullable=True, server_default='1')
|
|
board: Mapped[Board] = relationship(
|
|
"Board",
|
|
back_populates="deals",
|
|
)
|
|
|
|
# TODO remake with sequence
|
|
lexorank = Column(String, nullable=False, comment='Lexorank', index=True)
|
|
|
|
comment = Column(String, nullable=False, server_default='', comment='Коментарий к заданию')
|
|
bill_request: Mapped[Optional['DealBillRequest']] = relationship(back_populates='deal', lazy='joined')
|
|
|
|
group: Mapped[Optional["DealGroup"]] = relationship(
|
|
'DealGroup',
|
|
secondary='deal_relations',
|
|
lazy='joined',
|
|
back_populates='deals'
|
|
)
|
|
|
|
manager_id: Mapped[int] = mapped_column(ForeignKey('users.id'), nullable=True)
|
|
manager: Mapped[Optional["User"]] = relationship(back_populates='managed_deals', lazy='joined')
|
|
|
|
pallets: Mapped[list[Pallet]] = relationship(back_populates='deal', lazy='selectin')
|
|
boxes: Mapped[list[Box]] = relationship(back_populates='deal', lazy='selectin')
|
|
|
|
employees: Mapped[list['DealEmployees']] = relationship(back_populates='deal', lazy='selectin')
|
|
|
|
|
|
class DealEmployees(BaseModel):
|
|
__tablename__ = 'deal_employees'
|
|
user_id: Mapped[int] = mapped_column(ForeignKey('users.id'), primary_key=True)
|
|
user: Mapped['User'] = relationship('User', back_populates='deals', lazy='selectin')
|
|
|
|
deal_id: Mapped[int] = mapped_column(ForeignKey('deals.id'), primary_key=True)
|
|
deal: Mapped[Deal] = relationship('Deal', back_populates='employees', lazy='selectin')
|
|
|
|
created_at: Mapped[datetime] = mapped_column()
|