se estan creando el registro de las tareas sin problemas
This commit is contained in:
@@ -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)}
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
Reference in New Issue
Block a user