""" Modelos ORM para gestión de clientes y proveedores """ from typing import Optional from decimal import Decimal from sqlalchemy import ( Integer, String, SmallInteger, Numeric, ForeignKey, PrimaryKeyConstraint, ForeignKeyConstraint, ) from sqlalchemy.orm import Mapped, mapped_column, relationship from core.database import Base class ClientProvider(Base): """ Modelo para la tabla GClientesPro - Información de clientes y proveedores """ __tablename__ = "client_provider" __table_args__ = ( PrimaryKeyConstraint("id", name="client_provider_pkey"), ForeignKeyConstraint( ["tenant_id"], ["a76.tenants.id"], name="fk_client_provider_tenant" ), ForeignKeyConstraint( ["company_id"], ["a76.company.id"], name="fk_client_provider_company" ), {"schema": "a76"}, ) # Primary key id: Mapped[int] = mapped_column(Integer, primary_key=True) tenant_id: Mapped[int] = mapped_column(Integer, nullable=False, index=True) company_id: Mapped[int] = mapped_column(Integer, nullable=False, index=True) # Basic information type_nat_foreign: Mapped[Optional[str]] = mapped_column( String(1) ) # TIPO NACIONAL/EXTRANJERO name: Mapped[Optional[str]] = mapped_column(String(256)) short_name: Mapped[Optional[str]] = mapped_column(String(10)) rfc: Mapped[Optional[str]] = mapped_column(String(30)) curp: Mapped[Optional[str]] = mapped_column(String(19)) client_or_provider: Mapped[Optional[str]] = mapped_column(String(1)) linking: Mapped[Optional[str]] = mapped_column(String(1)) transform_subassembly: Mapped[Optional[str]] = mapped_column(String(1)) extra_information: Mapped[Optional[str]] = mapped_column(String(399)) web_key: Mapped[Optional[str]] = mapped_column(String(40)) responsible: Mapped[Optional[str]] = mapped_column(String(80)) position: Mapped[Optional[str]] = mapped_column(String(30)) incoterm: Mapped[Optional[str]] = mapped_column(String(19)) is_national_provider: Mapped[Optional[str]] = mapped_column(String(2)) enabled_disabled: Mapped[Optional[int]] = mapped_column(SmallInteger) # Relationships address: Mapped[Optional["ClientProviderAddress"]] = relationship( back_populates="client_provider", uselist=False, cascade="all, delete-orphan" ) programs: Mapped[Optional["ClientProviderPrograms"]] = relationship( back_populates="client_provider", uselist=False, cascade="all, delete-orphan" ) class ClientProviderAddress(Base): """ Modelo para la tabla GClientesPro_Direccion - Dirección de clientes y proveedores """ __tablename__ = "client_provider_address" __table_args__ = ( PrimaryKeyConstraint("id", name="client_provider_address_pkey"), ForeignKeyConstraint( ["tenant_id"], ["a76.tenants.id"], name="fk_client_provider_address_tenant" ), ForeignKeyConstraint( ["client_id"], ["a76.client_provider.id"], ondelete="CASCADE", name="fk_client_provider_address_client", ), {"schema": "a76"}, ) # Primary key (foreign key) id: Mapped[int] = mapped_column(Integer, primary_key=True) client_id: Mapped[int] = mapped_column( Integer, ForeignKey("a76.client_provider.id", ondelete="CASCADE") ) tenant_id: Mapped[int] = mapped_column(Integer, nullable=False, index=True) # Address information municipality: Mapped[Optional[str]] = mapped_column(String(150)) streets: Mapped[Optional[str]] = mapped_column(String(100)) neighborhood: Mapped[Optional[str]] = mapped_column(String(40)) interior_number: Mapped[Optional[str]] = mapped_column(String(20)) exterior_number: Mapped[Optional[str]] = mapped_column(String(20)) postal_code: Mapped[Optional[str]] = mapped_column(String(15)) city: Mapped[Optional[str]] = mapped_column(String(30)) state: Mapped[Optional[str]] = mapped_column(String(30)) country: Mapped[Optional[str]] = mapped_column(String(3)) phone: Mapped[Optional[str]] = mapped_column(String(30)) fax_number: Mapped[Optional[str]] = mapped_column(String(30)) email: Mapped[Optional[str]] = mapped_column(String(100)) contact: Mapped[Optional[str]] = mapped_column(String(50)) reference: Mapped[Optional[str]] = mapped_column(String(250)) # Relationship client_provider: Mapped["ClientProvider"] = relationship(back_populates="address") class ClientProviderPrograms(Base): """ Modelo para la tabla GClientesPro_Programas - Programas de clientes y proveedores """ __tablename__ = "client_provider_programs" __table_args__ = ( PrimaryKeyConstraint("id", name="client_provider_programs_pkey"), ForeignKeyConstraint( ["tenant_id"], ["a76.tenants.id"], name="fk_client_provider_programs_tenant" ), ForeignKeyConstraint( ["client_id"], ["a76.client_provider.id"], ondelete="CASCADE", name="fk_client_provider_programs_client", ), {"schema": "a76"}, ) # Primary key (foreign key) id: Mapped[int] = mapped_column(Integer, primary_key=True) client_id: Mapped[int] = mapped_column( Integer, ForeignKey("a76.client_provider.id", ondelete="CASCADE") ) tenant_id: Mapped[int] = mapped_column(Integer, nullable=False, index=True) # Program information program: Mapped[Optional[str]] = mapped_column(String(7)) program_number: Mapped[Optional[str]] = mapped_column(String(40)) prosec: Mapped[Optional[int]] = mapped_column(SmallInteger) prosec_authorization: Mapped[Optional[str]] = mapped_column(String(20)) secon_auth_date: Mapped[Optional[int]] = mapped_column(Integer) manufacturer_id: Mapped[Optional[str]] = mapped_column(String(25)) tax_id: Mapped[Optional[str]] = mapped_column(String(30)) broker: Mapped[Optional[str]] = mapped_column(String(6)) import_broker: Mapped[Optional[str]] = mapped_column(String(6)) transfer_key: Mapped[Optional[str]] = mapped_column(String(8)) secon_authorization: Mapped[Optional[str]] = mapped_column(String(20)) applied_proportion: Mapped[Optional[Decimal]] = mapped_column(Numeric(7, 2)) is_certified_company: Mapped[Optional[str]] = mapped_column(String(1)) certified_company_registry: Mapped[Optional[str]] = mapped_column(String(40)) donation_auth_number: Mapped[Optional[str]] = mapped_column(String(50)) ctpat_svi: Mapped[Optional[str]] = mapped_column(String(100)) tax_registry_number: Mapped[Optional[str]] = mapped_column(String(40)) subassembly_service: Mapped[Optional[int]] = mapped_column(SmallInteger) autse_dates: Mapped[Optional[int]] = mapped_column() autse_number: Mapped[Optional[str]] = mapped_column(String(300)) # Relationship client_provider: Mapped["ClientProvider"] = relationship(back_populates="programs")