import datetime from typing import TYPE_CHECKING, Optional from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from models import BaseModel if TYPE_CHECKING: from models import Product, Client class ResidualPallet(BaseModel): __tablename__ = 'residual_pallets' id: Mapped[int] = mapped_column(primary_key=True) created_at: Mapped[datetime.datetime] = mapped_column(nullable=False) client_id: Mapped[Optional[int]] = mapped_column(ForeignKey('clients.id')) client: Mapped['Client'] = relationship(back_populates='pallets') boxes: Mapped[list['ResidualBox']] = relationship( back_populates='pallet', uselist=True, lazy='joined', cascade='all, delete-orphan', ) residual_products: Mapped[list['ResidualProduct']] = relationship( back_populates='pallet', uselist=True, lazy='joined', cascade='all, delete-orphan', ) class ResidualProduct(BaseModel): __tablename__ = 'residual_products' id: Mapped[int] = mapped_column(primary_key=True) quantity: Mapped[int] = mapped_column() product_id: Mapped[int] = mapped_column(ForeignKey('products.id')) product: Mapped['Product'] = relationship(lazy='joined') pallet_id: Mapped[Optional[int]] = mapped_column(ForeignKey('residual_pallets.id')) pallet: Mapped[ResidualPallet] = relationship(lazy='joined', back_populates="residual_products") box_id: Mapped[Optional[int]] = mapped_column(ForeignKey('residual_boxes.id')) box: Mapped['ResidualBox'] = relationship(back_populates='residual_products') class ResidualBox(BaseModel): __tablename__ = 'residual_boxes' id: Mapped[int] = mapped_column(primary_key=True) created_at: Mapped[datetime.datetime] = mapped_column(nullable=False) pallet_id: Mapped[Optional[int]] = mapped_column(ForeignKey('residual_pallets.id')) pallet: Mapped[ResidualPallet] = relationship(back_populates='boxes') client_id: Mapped[Optional[int]] = mapped_column(ForeignKey('clients.id')) client: Mapped['Client'] = relationship(back_populates='boxes') residual_products: Mapped[list['ResidualProduct']] = relationship(back_populates='box')