""" Modelos ORM para gestión de clases SCAII y SCAF """ from typing import TYPE_CHECKING, Optional from sqlalchemy import Integer, String, SmallInteger, ForeignKey, PrimaryKeyConstraint, ForeignKeyConstraint, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column, relationship from core.database import Base if TYPE_CHECKING: from api.v1.modules.a76.parts.models import Part from api.v1.modules.public.reference_data.material_types.models import MaterialType class Class(Base): """ Modelo para la tabla GClases - Información de clases en sistemas SCAII y SCAF """ __tablename__ = "classes" __table_args__ = ( PrimaryKeyConstraint('id', name='classes_pkey'), UniqueConstraint('client_key', 'class_code', name='uq_classes_client_key_class_code'), ForeignKeyConstraint(['tenant_id'], ['a76.tenants.id'], name='fk_classes_tenant'), ForeignKeyConstraint(['material_key'], ['public.material_types.key'], name='fk_classes_material_type'), {"schema": "a76"} ) id: Mapped[int] = mapped_column(Integer, primary_key=True) # Unique constraint compuesta client_key: Mapped[int] = mapped_column() class_code: Mapped[str] = mapped_column(String(8)) tenant_id: Mapped[int] = mapped_column(Integer, nullable=False, index=True) # Basic information description_es: Mapped[Optional[str]] = mapped_column(String(500)) description_en: Mapped[Optional[str]] = mapped_column(String(500)) # Material and measurement material_key: Mapped[Optional[str]] = mapped_column(String(10), ForeignKey('public.material_types.key')) # CLAVEMAT - homologated from TIPOMAT/TIPOMATEQUIPO unit_of_measure: Mapped[Optional[str]] = mapped_column(String(5)) # UNIMED - homologated from UNIMEDIDA # Tariff fractions fraction: Mapped[Optional[str]] = mapped_column(String(10)) # Mexican tariff fraction us_fraction: Mapped[Optional[str]] = mapped_column(String(16)) # FRACCIONAME - US tariff fraction # Additional classification sub_key: Mapped[Optional[str]] = mapped_column(String(5)) # CLAVESUB physical_review: Mapped[Optional[int]] = mapped_column(SmallInteger) # REVFISICA iva_exempt_fraction: Mapped[Optional[str]] = mapped_column(String(4)) # FRACCIONEXENTAIVA # Relationships material_type: Mapped[Optional["MaterialType"]] = relationship(foreign_keys=[material_key]) # Inverse relationship with GParts that have this class parts: Mapped[list["Part"]] = relationship( primaryjoin="and_(Class.client_key == Part.client_key, Class.class_code == Part.part_class)", foreign_keys="[Part.client_key, Part.part_class]", viewonly=True, back_populates="part_class_info" ) def __repr__(self) -> str: return f""