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()