Files
microservice/api/api_v2/modules/pedimentos/schemas.py

95 lines
4.2 KiB
Python

from typing import Optional, Union, Dict, Any
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