112 lines
4.6 KiB
Python
112 lines
4.6 KiB
Python
from pydantic import BaseModel, Field, field_validator
|
|
from typing import Optional
|
|
from uuid import UUID
|
|
|
|
|
|
class PedimentoBaseSchema(BaseModel):
|
|
"""Esquema base para pedimentos con campos comunes"""
|
|
aduana: str = Field(..., min_length=3, max_length=3, description="Código de aduana (3 dígitos)", pattern="^[0-9]{3}$")
|
|
patente: str = Field(..., min_length=4, max_length=4, description="Número de patente (4 dígitos)", pattern="^[0-9]{4}$")
|
|
pedimento: str = Field(..., min_length=7, max_length=7, description="Número de pedimento (7 dígitos)", pattern="^[0-9]{7}$")
|
|
|
|
@field_validator('aduana')
|
|
def validate_aduana(cls, v):
|
|
if not v.isdigit():
|
|
raise ValueError('Aduana debe contener solo dígitos')
|
|
return v
|
|
|
|
@field_validator('patente')
|
|
def validate_patente(cls, v):
|
|
if not v.isdigit():
|
|
raise ValueError('Patente debe contener solo dígitos')
|
|
return v
|
|
|
|
@field_validator('pedimento')
|
|
def validate_pedimento(cls, v):
|
|
if not v.isdigit():
|
|
raise ValueError('Pedimento debe contener solo dígitos')
|
|
return v
|
|
|
|
|
|
class PedimentoRequest(PedimentoBaseSchema):
|
|
"""Esquema para solicitudes de pedimento"""
|
|
pedimento_id: str = Field(..., description="ID único del pedimento")
|
|
organizacion_id: str = Field(..., description="ID de la organización")
|
|
|
|
@field_validator('pedimento_id', 'organizacion_id')
|
|
def validate_ids(cls, v):
|
|
if not v or not v.strip():
|
|
raise ValueError('Los IDs no pueden estar vacíos')
|
|
return v.strip()
|
|
|
|
|
|
class PedimentoCompletoRequest(PedimentoBaseSchema):
|
|
"""Esquema para solicitar pedimento completo"""
|
|
username: str = Field(..., min_length=3, max_length=50, description="Usuario para autenticación")
|
|
password: str = Field(..., min_length=1, description="Contraseña para autenticación")
|
|
|
|
@field_validator('username')
|
|
def validate_username(cls, v):
|
|
if not v or not v.strip():
|
|
raise ValueError('Username no puede estar vacío')
|
|
return v.strip()
|
|
|
|
|
|
class EstadoPedimentoRequest(PedimentoBaseSchema):
|
|
"""Esquema para consultar estado de pedimento"""
|
|
username: str = Field(..., min_length=3, max_length=50, description="Usuario para autenticación")
|
|
password: str = Field(..., min_length=1, description="Contraseña para autenticación")
|
|
numero_operacion: str = Field(..., min_length=1, max_length=20, description="Número de operación del pedimento")
|
|
|
|
@field_validator('username')
|
|
def validate_username(cls, v):
|
|
if not v or not v.strip():
|
|
raise ValueError('Username no puede estar vacío')
|
|
return v.strip()
|
|
|
|
@field_validator('numero_operacion')
|
|
def validate_numero_operacion(cls, v):
|
|
if not v or not v.strip():
|
|
raise ValueError('Número de operación no puede estar vacío')
|
|
return v.strip()
|
|
|
|
|
|
class RemesasRequest(PedimentoBaseSchema):
|
|
"""Esquema para consultar remesas"""
|
|
username: str = Field(..., min_length=3, max_length=50, description="Usuario para autenticación")
|
|
password: str = Field(..., min_length=1, description="Contraseña para autenticación")
|
|
numero_operacion: str = Field(..., min_length=1, max_length=20, description="Número de operación del pedimento")
|
|
|
|
@field_validator('username')
|
|
def validate_username(cls, v):
|
|
if not v or not v.strip():
|
|
raise ValueError('Username no puede estar vacío')
|
|
return v.strip()
|
|
|
|
@field_validator('numero_operacion')
|
|
def validate_numero_operacion(cls, v):
|
|
if not v or not v.strip():
|
|
raise ValueError('Número de operación no puede estar vacío')
|
|
return v.strip()
|
|
|
|
|
|
class PedimentoResponse(BaseModel):
|
|
"""Esquema para respuestas de pedimento"""
|
|
success: bool = Field(..., description="Indica si la operación fue exitosa")
|
|
message: str = Field(..., description="Mensaje descriptivo de la operación")
|
|
pedimento_id: Optional[str] = Field(None, description="ID del pedimento procesado")
|
|
organizacion_id: Optional[str] = Field(None, description="ID de la organización")
|
|
task_id: Optional[str] = Field(None, description="ID de la tarea en segundo plano")
|
|
data: Optional[dict] = Field(None, description="Datos adicionales de la respuesta")
|
|
|
|
class Config:
|
|
json_schema_extra = {
|
|
"example": {
|
|
"success": True,
|
|
"message": "Pedimento procesado exitosamente",
|
|
"pedimento_id": "12345",
|
|
"organizacion_id": "org-123",
|
|
"task_id": "task-abc-123",
|
|
"data": {}
|
|
}
|
|
} |