feature/capturar errores, evitar duplicados, eliminar manejar nuevas flags para descargar datos de vucem

This commit is contained in:
2026-06-15 11:20:58 -06:00
parent 042d02e240
commit b9c6ab89c3
10 changed files with 326 additions and 90 deletions

View File

@@ -5,12 +5,16 @@ from celery_app import celery_app
from typing import Dict
from fastapi import HTTPException as _HTTPException
from .services import obtener_edoc
from .services import obtener_edoc, marcar_error_edocument
from api.api_v2.modules.tasks.services import register_task, update_task
# Logger para el módulo
logger = logging.getLogger(__name__)
# Reintentos internos del worker: pertenecen al MISMO intento orquestado y no
# incrementan el contador de intentos del backend (T2026-05-027)
WORKER_MAX_RETRIES = 2
@celery_app.task(bind=True)
def process_edoc_download_request(self, edoc_data: Dict) -> Dict:
"""
@@ -29,18 +33,19 @@ def process_edoc_download_request(self, edoc_data: Dict) -> Dict:
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=7 # cambiamos el servicio, el 7 le corresponde a los e documents
# Registrar el inicio de la tarea (solo en la primera ejecución, no en reintentos)
if self.request.retries == 0:
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=7 # cambiamos el servicio, el 7 le corresponde a los e documents
)
)
)
# Esperar un momento breve para asegurar que el registro se complete
time.sleep(1)
@@ -79,7 +84,22 @@ def process_edoc_download_request(self, edoc_data: Dict) -> Dict:
# 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)
# Reintento interno del worker para fallos transitorios (red, timeout):
# mismo intento orquestado, NO incrementa el contador del backend
if not isinstance(e, _HTTPException) and self.request.retries < WORKER_MAX_RETRIES:
raise self.retry(exc=e, countdown=60 * (self.request.retries + 1))
# Fallo definitivo de este intento: registrar el detalle en el registro de
# negocio. Permanece 'pendiente'; el tope de intentos automáticos del
# backend (MAX_INTENTOS_AUTO) gobierna la transición a 'error'.
try:
loop.run_until_complete(
marcar_error_edocument(edoc_info, pedimento_info, error_message, definitivo=False)
)
except Exception as report_error:
logger.error(f"No se pudo registrar el error en el registro de negocio: {report_error}")
try:
loop.run_until_complete(
update_task(