""" 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('client_id', name='client_provider_pkey'), ForeignKeyConstraint(['tenant_id'], ['a76.tenants.id'], name='fk_client_provider_tenant'), {"schema": "a76"} ) # Primary key client_id: Mapped[int] = mapped_column(Integer, primary_key=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) tenant_id: Mapped[int] = mapped_column(Integer, nullable=False, index=True) # 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.client_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.client_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.client_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.client_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")