139 lines
5.0 KiB
Python
139 lines
5.0 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import date
|
|
from typing import List, Optional
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# CRUD DTOs
|
|
# ---------------------------------------------------------------------------
|
|
|
|
class ExpedienteArchivoCreateDTO(BaseModel):
|
|
e_document: Optional[str] = Field(None, max_length=50)
|
|
num_operacion: Optional[str] = Field(None, max_length=50)
|
|
tipo_documento: Optional[str] = Field(None, max_length=10)
|
|
archivo_digitalizado_en: Optional[str] = Field(None, max_length=500)
|
|
fecha_digitalizacion: Optional[date] = None
|
|
agente_aduanal: Optional[str] = Field(None, max_length=50)
|
|
pedimento: Optional[str] = Field(None, max_length=21)
|
|
rfc_consulta: Optional[str] = Field(None, max_length=13)
|
|
nombre_archivo: Optional[str] = Field(None, max_length=255)
|
|
|
|
|
|
class ExpedienteArchivoUpdateDTO(BaseModel):
|
|
e_document: Optional[str] = Field(None, max_length=50)
|
|
num_operacion: Optional[str] = Field(None, max_length=50)
|
|
tipo_documento: Optional[str] = Field(None, max_length=10)
|
|
archivo_digitalizado_en: Optional[str] = Field(None, max_length=500)
|
|
fecha_digitalizacion: Optional[date] = None
|
|
agente_aduanal: Optional[str] = Field(None, max_length=50)
|
|
pedimento: Optional[str] = Field(None, max_length=21)
|
|
rfc_consulta: Optional[str] = Field(None, max_length=13)
|
|
nombre_archivo: Optional[str] = Field(None, max_length=255)
|
|
|
|
|
|
class ExpedienteArchivoResponseDTO(BaseModel):
|
|
id: int
|
|
e_document: Optional[str] = None
|
|
num_operacion: Optional[str] = None
|
|
tipo_documento: Optional[str] = None
|
|
archivo_digitalizado_en: Optional[str] = None
|
|
fecha_digitalizacion: Optional[date] = None
|
|
agente_aduanal: Optional[str] = None
|
|
pedimento: Optional[str] = None
|
|
rfc_consulta: Optional[str] = None
|
|
nombre_archivo: Optional[str] = None
|
|
status: Optional[str] = None
|
|
task_id: Optional[str] = None
|
|
external_task_id: Optional[str] = None
|
|
acuse_pdf_path: Optional[str] = None
|
|
envio_xml_path: Optional[str] = None
|
|
respuesta_xml_path: Optional[str] = None
|
|
consulta_envio_xml_path: Optional[str] = None
|
|
consulta_respuesta_xml_path: Optional[str] = None
|
|
company_id: int
|
|
tenant_id: int
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class ExpedienteArchivoListResponse(BaseModel):
|
|
items: List[ExpedienteArchivoResponseDTO]
|
|
total: int
|
|
page: int
|
|
page_size: int
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Digitalización DTOs
|
|
# ---------------------------------------------------------------------------
|
|
|
|
class DigitalizarRequest(BaseModel):
|
|
"""
|
|
Solicitud de digitalización enviada por el frontend.
|
|
La configuracion_vu se ensambla server-side desde CustomsBrokerVU / company.
|
|
"""
|
|
rfc_consulta: Optional[str] = Field(None, max_length=13)
|
|
clave_documento: Optional[str] = Field(None, max_length=10)
|
|
nombre_archivo: Optional[str] = Field(None, max_length=255)
|
|
archivo_base64: Optional[str] = None # contenido del archivo en base64; opcional si el expediente ya tiene archivo almacenado
|
|
|
|
|
|
class RegistrarDigitalizacionRequest(BaseModel):
|
|
"""Digitalizar múltiples expedientes existentes por ID."""
|
|
rfc_consulta: Optional[str] = Field(None, max_length=13)
|
|
ids_archivos: List[int]
|
|
|
|
|
|
class DigitalizarResponse(BaseModel):
|
|
task_id: str
|
|
message: str
|
|
status: str
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Task status DTOs (espejo del schema del servicio externo)
|
|
# ---------------------------------------------------------------------------
|
|
|
|
class DigitalizacionResult(BaseModel):
|
|
status: Optional[str] = None
|
|
message: Optional[str] = None
|
|
request_id: Optional[str] = None
|
|
response_code: Optional[int] = None
|
|
xml_path: Optional[str] = None
|
|
response_path: Optional[str] = None
|
|
acuese_digitalizacion_pdf_base64: Optional[str] = None
|
|
nombre_archivo: Optional[str] = None
|
|
timestamp: Optional[str] = None
|
|
numero_operacion: Optional[str] = None
|
|
e_document: Optional[str] = None
|
|
envio_xml_base64: Optional[str] = None
|
|
respuesta_xml_base64: Optional[str] = None
|
|
consulta_envio_xml_base64: Optional[str] = None
|
|
consulta_respuesta_xml_base64: Optional[str] = None
|
|
|
|
|
|
class DigitalizacionErrorDetail(BaseModel):
|
|
codigo: Optional[str] = None
|
|
descripcion: Optional[str] = None
|
|
paso: Optional[str] = None
|
|
sugerencias: Optional[List[str]] = None
|
|
|
|
|
|
class DigitalizacionTaskDetailResponse(BaseModel):
|
|
task_id: str
|
|
external_task_id: Optional[str] = None
|
|
state: str
|
|
status: Optional[str] = None
|
|
current_step: Optional[str] = None
|
|
progress: Optional[int] = None
|
|
total_steps: Optional[int] = None
|
|
request_id: Optional[str] = None
|
|
result: Optional[DigitalizacionResult] = None
|
|
error: Optional[str] = None
|
|
error_type: Optional[str] = None
|
|
error_detail: Optional[DigitalizacionErrorDetail] = None
|
|
info: Optional[dict] = None
|