95 lines
4.2 KiB
Python
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 |