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') try: # Registrar el inicio de la tarea loop = asyncio.get_event_loop() 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) 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 ) ) raise