se estan creando el registro de las tareas sin problemas

This commit is contained in:
2025-10-08 21:15:03 -06:00
parent 48db0d72d8
commit 770e0a4d13
15 changed files with 858 additions and 258 deletions

View File

@@ -2,9 +2,8 @@ from fastapi import APIRouter, HTTPException, Depends
from fastapi.responses import JSONResponse
from typing import Dict, Any, List, Optional
from api.api_v2.modules.authentication.services import get_current_user
from api.api_v2.modules.tasks.services import register_task
from .schemas import AcuseSchema, AcuseMasivoSchema
from .tasks import process_acuse_request
@@ -19,7 +18,17 @@ async def obtener_acuse(acuse_request: AcuseSchema):
acuse_dict = acuse_request.model_dump()
# Ejecuta la tarea de Celery de forma asíncrona
task = process_acuse_request.delay(acuse_dict)
# Puedes devolver el ID de la tarea para consultar el estado después
# Registra la tarea en el servicio de seguimiento
await register_task(
task_id=task.id,
message=f"Procesando acuse para pedimento {acuse_dict.get('pedimento', {}).get('pedimento_app', 'N/A')}",
status="submitted",
pedimento_id=acuse_dict.get('pedimento', {}).get('id'),
organizacion_id=acuse_dict.get('pedimento', {}).get('organizacion'),
servicio=6 # 6 corresponde a "Acuse"
)
return {"task_id": task.id, "status": "submitted"}
@@ -39,5 +48,15 @@ async def obtener_acuses(acuse_request: AcuseMasivoSchema):
}
task = process_acuse_request.delay(acuse_dict)
task_ids.append(task.id)
# Registra cada tarea en el servicio de seguimiento
await register_task(
task_id=task.id,
message=f"Procesando acuse masivo para pedimento {acuse_request_dict.get('pedimento', {}).get('pedimento_app', 'N/A')}",
status="submitted",
pedimento_id=acuse_request_dict.get('pedimento', {}).get('id'),
organizacion_id=acuse_request_dict.get('pedimento', {}).get('organizacion'),
servicio=6 # 6 corresponde a "Acuse"
)
return {"task_ids": task_ids, "status": "submitted", "total": len(task_ids)}

View File

@@ -1,10 +1,16 @@
from http.client import HTTPException
import base64
import re
import logging
from typing import Any, Dict, Optional
import xml.etree.ElementTree as ET
from fastapi import HTTPException
from .controllers import acuse_vu_controller, acuse_rest_controller
from utils.helpers import soap_error
from ..common import create_service_response, create_error_response
import xml.etree.ElementTree as ET
# Logger configurado para el módulo
logger = logging.getLogger("app.api")
soap_headers = {
'Content-Type': 'text/xml; charset=utf-8',
@@ -23,29 +29,68 @@ async def obtener_acuse(**kwargs):
)
if response is None:
raise Exception("No se obtuvo respuesta del servicio SOAP.")
logger.error("No se obtuvo respuesta del servicio SOAP")
raise HTTPException(
status_code=500,
detail=create_error_response(
message="Error al contactar el servicio SOAP",
errors=["No se obtuvo respuesta del servicio"]
)
)
if response.status_code != 200:
raise Exception(f"Error en la solicitud SOAP: {response.status}")
logger.error(f"Error en la solicitud SOAP: {response.status_code}")
raise HTTPException(
status_code=response.status_code,
detail=create_error_response(
message=f"Error en la solicitud SOAP: {response.status_code}",
data={"soap_response": response.text[:500]}
)
)
if (response) and (not soap_error(response)):
acuse_base64 = _extract_acuse_data(response.text)
if soap_error(response):
logger.error("Error SOAP detectado en la respuesta")
raise HTTPException(
status_code=500,
detail=create_error_response(
message="Error en la respuesta del servicio SOAP",
data={"soap_response": response.text[:500]}
)
)
acuse_base64 = _extract_acuse_data(response.text)
if acuse_base64 is None:
raise Exception("No se pudo extraer el acuse del documento de la respuesta SOAP.")
pdf_bytes = _decode_acuse_base64_content(acuse_base64)
logger.error("No se pudo extraer el acuse del documento")
raise HTTPException(
status_code=500,
detail=create_error_response(
message="No se pudo extraer el acuse del documento",
errors=["El formato de la respuesta SOAP no es el esperado"]
)
)
pdf_bytes = _decode_acuse_base64_content(acuse_base64)
if not pdf_bytes:
raise HTTPException(status_code=500, detail="No se pudo decodificar el documento del acuse")
logger.error("No se pudo decodificar el contenido Base64 del acuse")
raise HTTPException(
status_code=500,
detail=create_error_response(
message="No se pudo decodificar el documento del acuse",
errors=["El contenido Base64 no es válido"]
)
)
# Validar que el PDF sea válido
if not pdf_bytes.startswith(b'%PDF'):
import logging
logger = logging.getLogger("app.api")
logger.warning("El contenido decodificado no parece ser un PDF válido")
logger.error("El contenido decodificado no es un PDF válido")
raise HTTPException(
status_code=500,
detail=create_error_response(
message="El documento recibido no es un PDF válido",
errors=["El contenido no tiene el formato PDF esperado"],
metadata={"content_start": str(pdf_bytes[:20])}
)
)
# Mejorar el nombre del archivo usando todos los datos relevantes
pedimento = kwargs.get('pedimento', {})
@@ -65,21 +110,49 @@ async def obtener_acuse(**kwargs):
)
if rest_response is None:
raise Exception("No se pudo enviar el acuse a la API interna.")
logger.error("Error al enviar el acuse a la API interna")
raise HTTPException(
status_code=500,
detail=create_error_response(
message="Error al guardar el acuse en el sistema",
errors=["No se pudo enviar el documento a la API interna"],
metadata={"file_name": _file_name}
)
)
if rest_response.get("id") is None:
raise Exception("La respuesta de la API interna no contiene un ID válido.")
logger.error("Respuesta de API interna sin ID válido")
raise HTTPException(
status_code=500,
detail=create_error_response(
message="Error al procesar la respuesta del sistema",
errors=["La respuesta de la API no contiene un ID válido"],
data={"api_response": rest_response}
)
)
acuse_update_response = await change_edocument_status(
edoc=kwargs.get('edoc'),
status=True,
pedimento=pedimento
)
return {
"document_response": rest_response,
"file_name": _file_name,
"pedimento": pedimento_num,
"acuse_update_response": acuse_update_response
}
return create_service_response(
message="Acuse procesado exitosamente",
data={
"document_response": rest_response,
"file_name": _file_name,
"pedimento": pedimento_num,
"acuse_update_response": acuse_update_response
},
metadata={
"document_type": 4,
"pedimento_app": pedimento.get('pedimento_app'),
"organizacion": organizacion,
"edoc_number": kwargs.get('edoc', {}).get('numero_edocument'),
"content_type": "application/pdf"
}
)
async def change_edocument_status(edoc: dict, status: bool, pedimento: dict):
data = {