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