68 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from datetime import datetime
 | 
						|
from typing import Optional, TYPE_CHECKING
 | 
						|
 | 
						|
from sqlalchemy import ForeignKey
 | 
						|
from sqlalchemy.orm import relationship, Mapped, mapped_column
 | 
						|
 | 
						|
from models import BaseModel
 | 
						|
 | 
						|
if TYPE_CHECKING:
 | 
						|
    from models import ResidualPallet, ResidualBox, Product, BarcodeTemplate, User, TgGroup, Chat
 | 
						|
 | 
						|
 | 
						|
class Client(BaseModel):
 | 
						|
    __tablename__ = 'clients'
 | 
						|
    id: Mapped[int] = mapped_column(primary_key=True)
 | 
						|
    name: Mapped[str] = mapped_column(nullable=False, unique=True, comment='Название клиента')
 | 
						|
 | 
						|
    company_name: Mapped[str] = mapped_column(
 | 
						|
        nullable=False,
 | 
						|
        server_default='',
 | 
						|
        comment='Название компании',
 | 
						|
    )
 | 
						|
 | 
						|
    created_at: Mapped[datetime] = mapped_column(nullable=False, comment='Дата создания')
 | 
						|
    is_deleted: Mapped[bool] = mapped_column(
 | 
						|
        nullable=False,
 | 
						|
        default=False,
 | 
						|
        server_default='0',
 | 
						|
    )
 | 
						|
 | 
						|
    products: Mapped[list['Product']] = relationship('Product', back_populates='client')
 | 
						|
    details: Mapped['ClientDetails'] = relationship(
 | 
						|
        uselist=False,
 | 
						|
        back_populates='client',
 | 
						|
        cascade='all, delete',
 | 
						|
        lazy='joined',
 | 
						|
    )
 | 
						|
 | 
						|
    barcode_template_id: Mapped[int] = mapped_column(ForeignKey('barcode_templates.id'), nullable=True)
 | 
						|
    barcode_template: Mapped['BarcodeTemplate'] = relationship('BarcodeTemplate', lazy='selectin')
 | 
						|
 | 
						|
    comment: Mapped[Optional[str]] = mapped_column(nullable=True, server_default=None, comment='Комментарий')
 | 
						|
 | 
						|
    pallets: Mapped[list['ResidualPallet']] = relationship(back_populates='client', lazy='selectin')
 | 
						|
    boxes: Mapped[list['ResidualBox']] = relationship(back_populates='client', lazy='selectin')
 | 
						|
 | 
						|
    tg_group: Mapped[Optional['TgGroup']] = relationship('TgGroup', back_populates='client', lazy='joined')
 | 
						|
    chat: Mapped[Optional['Chat']] = relationship('Chat', back_populates='client', lazy='joined')
 | 
						|
 | 
						|
 | 
						|
class ClientDetails(BaseModel):
 | 
						|
    __tablename__ = 'client_details'
 | 
						|
 | 
						|
    id: Mapped[int] = mapped_column(primary_key=True)
 | 
						|
 | 
						|
    client_id: Mapped[int] = mapped_column(ForeignKey('clients.id'), unique=True, nullable=False, comment='ID клиента')
 | 
						|
    client: Mapped[Client] = relationship('Client', back_populates='details', cascade='all, delete', uselist=False)
 | 
						|
 | 
						|
    telegram: Mapped[Optional[str]] = mapped_column()
 | 
						|
    phone_number: Mapped[Optional[str]] = mapped_column()
 | 
						|
    inn: Mapped[Optional[str]] = mapped_column()
 | 
						|
    email: Mapped[Optional[str]] = mapped_column()
 | 
						|
 | 
						|
    last_modified_at: Mapped[datetime] = mapped_column(nullable=False)
 | 
						|
 | 
						|
    modified_by_user_id: Mapped[int] = mapped_column(ForeignKey('users.id'), nullable=False)
 | 
						|
    modified_by_user: Mapped['User'] = relationship('User')
 |