Files
microservice/api/api_v2/modules/edocs/tasks.py
2026-03-26 11:41:52 -06:00

98 lines
3.4 KiB
Python

import asyncio
import logging
import time
from celery_app import celery_app
from typing import Dict
from .services import obtener_edoc
from api.api_v2.modules.tasks.services import register_task, update_task
# Logger para el módulo
logger = logging.getLogger(__name__)
@celery_app.task(bind=True)
def process_edoc_download_request(self, edoc_data: Dict) -> Dict:
"""
Tarea de Celery para procesar la descarga de un solo documento edoc.
"""
task_id = self.request.id
pedimento_info = edoc_data.get('pedimento', {})
pedimento_id = pedimento_info.get('id')
organizacion_id = pedimento_info.get('organizacion')
pedimento_app = pedimento_info.get('pedimento_app', 'N/A')
edoc_info = edoc_data.get('edoc', {})
edoc_number = edoc_info.get('numero_edoc', 'N/A')
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
# Registrar el inicio de la tarea
logger.info(f"[EDOC] Registrando inicio de tarea {task_id}")
loop.run_until_complete(
register_task(
task_id=task_id,
status="submitted",
message=f"Iniciando proceso de descarga de E-document {edoc_number} para pedimento {pedimento_app}",
pedimento_id=pedimento_id,
organizacion_id=organizacion_id,
servicio=3 # 3 corresponde a "E-document"
)
)
# Esperar un momento breve para asegurar que el registro se complete
time.sleep(1)
# Actualizar estado: procesando
logger.info(f"[EDOC] Actualizando estado a processing para tarea {task_id}")
loop.run_until_complete(
update_task(
task_id=task_id,
status="processing",
message=f"Descargando E-document {edoc_number} para pedimento {pedimento_app}",
pedimento_id=pedimento_id,
organizacion_id=organizacion_id,
servicio=3
)
)
# Obtener el E-document
result = loop.run_until_complete(obtener_edoc(**edoc_data))
# Actualizar estado: completado
loop.run_until_complete(
update_task(
task_id=task_id,
status="completed",
message=f"E-document {edoc_number} descargado exitosamente para pedimento {pedimento_app}",
pedimento_id=pedimento_id,
organizacion_id=organizacion_id,
servicio=3
)
)
return {"status": "success", "result": result}
except Exception as e:
# En caso de error, actualizar estado
error_message = f"Error al descargar E-document {edoc_number} para pedimento {pedimento_app}: {str(e)}"
logger.error(error_message, exc_info=True)
try:
loop.run_until_complete(
update_task(
task_id=task_id,
status="failed",
message=error_message,
pedimento_id=pedimento_id,
organizacion_id=organizacion_id,
servicio=3
)
)
except Exception as update_error:
logger.error(f"Error actualizando estado de tarea: {update_error}")
raise
finally:
# Cerrar el loop para liberar recursos
loop.close()