from datetime import datetime from decimal import Decimal from pydantic import BaseModel, ConfigDict, EmailStr, Field class AccountBase(BaseModel): # Datos generales name: str = Field(..., min_length=1, max_length=255) trade_name: str | None = Field(None, max_length=255) rfc: str | None = Field(None, max_length=13) curp: str | None = Field(None, max_length=18) record_type: str = Field("cliente", max_length=20) # cliente | prospecto person_type: str | None = Field(None, max_length=10) # fisica | moral industry: str | None = Field(None, max_length=120) account_type: str | None = Field(None, max_length=40) status: str = Field("active", max_length=20) # active | inactive # Comercial commercial_classification: str | None = Field(None, max_length=20) preferred_contact_method: str | None = Field(None, max_length=20) preferred_contact_other: str | None = Field(None, max_length=120) language: str | None = Field(None, max_length=40) email: EmailStr | None = None phone: str | None = Field(None, max_length=40) website: str | None = Field(None, max_length=255) commercial_observations: str | None = None # observaciones generales # Fiscal tax_regime: str | None = Field(None, max_length=120) cfdi_use: str | None = Field(None, max_length=60) payment_method: str | None = Field(None, max_length=60) payment_form: str | None = Field(None, max_length=60) currency: str | None = Field(None, max_length=3) credit_limit: Decimal | None = Field(None, ge=0, max_digits=14, decimal_places=2) credit_days: int | None = Field(None, ge=0) commercial_terms: str | None = None # Aduanero / ubicación patente_aduanal: str | None = Field(None, max_length=20) address: str | None = None city: str | None = Field(None, max_length=120) state: str | None = Field(None, max_length=120) country: str | None = Field("MX", max_length=2) # Observaciones notes: str | None = None internal_notes: str | None = None owner_user_id: str | None = Field(None, max_length=64) class AccountCreate(AccountBase): pass class AccountUpdate(BaseModel): name: str | None = Field(None, min_length=1, max_length=255) trade_name: str | None = Field(None, max_length=255) rfc: str | None = Field(None, max_length=13) curp: str | None = Field(None, max_length=18) record_type: str | None = Field(None, max_length=20) person_type: str | None = Field(None, max_length=10) industry: str | None = Field(None, max_length=120) account_type: str | None = Field(None, max_length=40) status: str | None = Field(None, max_length=20) commercial_classification: str | None = Field(None, max_length=20) preferred_contact_method: str | None = Field(None, max_length=20) preferred_contact_other: str | None = Field(None, max_length=120) language: str | None = Field(None, max_length=40) email: EmailStr | None = None phone: str | None = Field(None, max_length=40) website: str | None = Field(None, max_length=255) commercial_observations: str | None = None tax_regime: str | None = Field(None, max_length=120) cfdi_use: str | None = Field(None, max_length=60) payment_method: str | None = Field(None, max_length=60) payment_form: str | None = Field(None, max_length=60) currency: str | None = Field(None, max_length=3) credit_limit: Decimal | None = Field(None, ge=0, max_digits=14, decimal_places=2) credit_days: int | None = Field(None, ge=0) commercial_terms: str | None = None patente_aduanal: str | None = Field(None, max_length=20) address: str | None = None city: str | None = Field(None, max_length=120) state: str | None = Field(None, max_length=120) country: str | None = Field(None, max_length=2) notes: str | None = None internal_notes: str | None = None owner_user_id: str | None = Field(None, max_length=64) class AccountResponse(AccountBase): model_config = ConfigDict(from_attributes=True) id: int tenant_id: int company_id: int created_by: str | None = None updated_by: str | None = None created_at: datetime updated_at: datetime