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