from typing import Optional, Union, Dict, Any, List from uuid import UUID from datetime import datetime # CORRECCIÓN CLAVE: Se importa el 'validator' para que el decorador funcione from pydantic import BaseModel, Field, validator from schemas.CredencialSchema import CredencialBaseSchema class PedimentoBaseSchema(BaseModel): id: str = Field(..., description="ID único del pedimento") pedimento: str = Field(..., description="Número de pedimento") pedimento_app: str = Field(..., description="Número de pedimento en la aplicación") aduana: str = Field(..., description="Aduana asociada al pedimento") patente: str = Field(..., description="Patente asociada al pedimento") numero_operacion: str = Field(None, description="Número de operación del pedimento") # Usamos Field(None, ...) para campos Optional regimen: Optional[str] = Field(None, description="Régimen aduanero del pedimento") organizacion: str = Field(..., description="Organización asociada al pedimento") clave_pedimento: Optional[str] = Field(None, description="Clave del pedimento") fecha_pago: Optional[str] = Field(None, description="Fecha de pago del pedimento") fecha_inicio: Optional[str] = Field(None, description="Fecha de inicio del pedimento") fecha_fin: Optional[str] = Field(None, description="Fecha de fin del pedimento") alerta: Optional[bool] = Field(None, description="Indica si hay alerta en el pedimento") agente_aduanal: Optional[str] = Field(None, description="Agente aduanal asociado al pedimento") curp_apoderado: Optional[str] = Field(None, description="CURP del apoderado") importe_total: Optional[float] = Field(None, description="Importe total del pedimento") saldo_disponible: Optional[float] = Field(None, description="Saldo disponible del pedimento") importe_pedimento: Optional[float] = Field(None, description="Importe del pedimento") existe_expediente: Optional[bool] = Field(None, description="Indica si existe expediente") # Validadores de Pydantic v1 (usando @validator) @validator('id') def validate_id(cls, v): if not v or not isinstance(v, str): raise ValueError('id must be a non-empty string') return v @validator('pedimento') def validate_pedimento(cls, v): if not v or not isinstance(v, str): raise ValueError('pedimento must be a non-empty string') return v @validator('pedimento_app') def validate_pedimento_app(cls, v): if not v or not isinstance(v, str): raise ValueError('pedimento_app must be a non-empty string') return v @validator('aduana') def validate_aduana(cls, v): if not v or not isinstance(v, str): raise ValueError('aduana must be a non-empty string') return v @validator('patente') def validate_patente(cls, v): if not v or not isinstance(v, str): raise ValueError('patente must be a non-empty string') return v @validator('organizacion') def validate_organizacion(cls, v): if not v or not isinstance(v, str): raise ValueError('organizacion must be a non-empty string') return v # Validadores combinados para campos opcionales @validator('fecha_pago', 'fecha_inicio', 'fecha_fin', 'agente_aduanal', 'curp_apoderado', 'regimen', 'clave_pedimento', pre=True) def validate_optional_strings(cls, v): if v is not None and not isinstance(v, str): raise ValueError('Campo opcional debe ser string o None') return v @validator('alerta', 'existe_expediente', pre=True) def validate_optional_bools(cls, v): if v is not None and not isinstance(v, bool): raise ValueError('Campo opcional debe ser booleano o None') return v @validator('importe_total', 'saldo_disponible', 'importe_pedimento', pre=True) def validate_optional_numbers(cls, v): if v is not None and not isinstance(v, (float, int)): raise ValueError('Campo opcional debe ser numérico o None') class PedimentoCompletoRequestSchema(BaseModel): pedimento: PedimentoBaseSchema credencial: CredencialBaseSchema