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"] } }