82 lines
3.1 KiB
Python
82 lines
3.1 KiB
Python
from pydantic import BaseModel, Field, field_validator
|
|
from typing import Optional, List, Union
|
|
|
|
class ServiceBaseSchema(BaseModel):
|
|
"""Esquema base para servicios con campos comunes"""
|
|
estado: int = Field(..., description="ID único del servicio")
|
|
tipo_procesamiento: int = Field(..., description="ID de la organización")
|
|
pedimento: str = Field(..., description="ID del estado del servicio")
|
|
servicio: int = Field(..., description="ID del tipo de servicio")
|
|
organizacion: str = Field(..., description="ID de la organización")
|
|
|
|
|
|
|
|
@field_validator('pedimento', 'organizacion')
|
|
def validate_string_fields(cls, v):
|
|
if not v or not v.strip():
|
|
raise ValueError('Los campos de texto no pueden estar vacíos')
|
|
return v.strip()
|
|
|
|
@field_validator('estado', 'tipo_procesamiento', 'servicio')
|
|
def validate_numeric_ids(cls, v):
|
|
if v is None or v < 0:
|
|
raise ValueError('Los IDs numéricos deben ser números positivos')
|
|
return v
|
|
|
|
class ServiceUpdateRequest(ServiceBaseSchema):
|
|
"""Esquema para actualizar un servicio"""
|
|
id: int = Field(..., description="ID del servicio a actualizar")
|
|
|
|
@field_validator('id')
|
|
def validate_id(cls, v):
|
|
if v is None or v < 0:
|
|
raise ValueError('El ID debe ser un número positivo')
|
|
return v
|
|
|
|
class ServiceRemesaSchema(BaseModel):
|
|
"""Esquema para remesas de servicios"""
|
|
organizacion: str = Field(..., description="ID de la organización")
|
|
pedimento: str = Field(..., description="ID del pedimento")
|
|
|
|
@field_validator('organizacion', 'pedimento')
|
|
def validate_string_fields(cls, v):
|
|
if not v or not v.strip():
|
|
raise ValueError('Los campos de texto no pueden estar vacíos')
|
|
return v.strip()
|
|
|
|
class MultiPedimentoCompletoSchema(BaseModel):
|
|
"""Esquema para procesar múltiples pedimentos de forma asíncrona"""
|
|
organizacion: str = Field(..., description="ID de la organización")
|
|
pedimentos: List[str] = Field(
|
|
...,
|
|
description="Lista de IDs de pedimentos a procesar",
|
|
min_length=1,
|
|
max_length=200
|
|
)
|
|
|
|
@field_validator('organizacion')
|
|
def validate_organizacion(cls, v):
|
|
if not v or not v.strip():
|
|
raise ValueError('La organización no puede estar vacía')
|
|
return v.strip()
|
|
|
|
@field_validator('pedimentos')
|
|
def validate_pedimentos(cls, v):
|
|
if not v:
|
|
raise ValueError('Debe proporcionar al menos un pedimento')
|
|
if len(v) > 200:
|
|
raise ValueError(f'Máximo 200 pedimentos por solicitud. Recibidos: {len(v)}')
|
|
# Eliminar duplicados y vacíos
|
|
pedimentos_limpios = [p.strip() for p in v if p and p.strip()]
|
|
if not pedimentos_limpios:
|
|
raise ValueError('La lista de pedimentos no puede estar vacía')
|
|
# Eliminar duplicados
|
|
return list(set(pedimentos_limpios))
|
|
|
|
class Config:
|
|
json_schema_extra = {
|
|
"example": {
|
|
"organizacion": "1",
|
|
"pedimentos": ["123", "456", "789"]
|
|
}
|
|
} |