diff --git a/api/api_v2/modules/acuses/tasks.py b/api/api_v2/modules/acuses/tasks.py index 9e05ab1..ae47aca 100644 --- a/api/api_v2/modules/acuses/tasks.py +++ b/api/api_v2/modules/acuses/tasks.py @@ -20,20 +20,8 @@ def process_acuse_request(acuse_request: Dict[str, Any]) -> Dict[str, Any]: Returns: Diccionario con la respuesta del acuse. """ - try: - # Crear un nuevo event loop para esta tarea - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - - # Ejecutar la corutina - acuse_response = loop.run_until_complete(obtener_acuse(**acuse_request)) - - return {"status": "processed", "data": acuse_response} - except Exception as e: - logging.error(f"Error processing acuse request: {str(e)}") - raise - finally: - # Asegurarse de cerrar el loop y limpiarlo - loop.close() - asyncio.set_event_loop(None) + loop = asyncio.get_event_loop() + acuse_response = loop.run_until_complete(obtener_acuse(**acuse_request)) + + return {"status": "processed", "data": acuse_response} diff --git a/api/api_v2/modules/coves/services.py b/api/api_v2/modules/coves/services.py index 4293381..7d7654e 100644 --- a/api/api_v2/modules/coves/services.py +++ b/api/api_v2/modules/coves/services.py @@ -95,7 +95,6 @@ async def consume_ws_get_cove(**kwargs): # Enviar documento _file_name = f"vu_COVE_{pedimento_app}_{cove}.xml" try: - document_response = await coves_rest_controller.post_document( soap_response=soap_response, organizacion=kwargs.get('pedimento').get('organizacion'), @@ -162,19 +161,33 @@ async def consume_ws_get_acuse_cove(**kwargs): if response.status_code != 200: raise Exception(f"Error en la solicitud SOAP: {response.status}") + if soap_error(response): + rest_response = await coves_rest_controller.post_document( + soap_response=response, + organizacion=kwargs.get('pedimento').get('organizacion'), + pedimento=kwargs.get('pedimento').get('id'), + file_name=f"vu_AC_COVE_{kwargs.get('pedimento', {}).get('pedimento_app', 'N/A')}_{kwargs['cove'].get('cove', 'N/A')}_ERROR.xml", + document_type=10, + ) + raise Exception("Error detectado en la respuesta SOAP.") if (response) and (not soap_error(response)): logger.debug(f"Respuesta SOAP recibida, extrayendo acuse...") acuse_base64 = _extract_acuse_data(response.text) if acuse_base64 is None: logger.error("No se encontró elemento acuseDocumento en la respuesta") - logger.debug(f"Contenido de respuesta (primeros 1000 chars): {response.text[:1000]}") + logger.debug(f"Contenido de respuesta (primeros 1000 chars): {response.text}") else: logger.error("Error en respuesta SOAP o soap_error detectado") - logger.debug(f"Contenido de respuesta con error: {response.text[:500] if response else 'No response'}") + logger.debug(f"Contenido de respuesta con error: {response.text if response else 'No response'}") if acuse_base64 is None: - raise Exception("No se pudo extraer el acuse del documento de la respuesta SOAP.") + # Log de la respuesta SOAP para debugging + logger.error(f"Contenido de respuesta SOAP: {response.text}") + raise HTTPException( + status_code=500, + detail="No se pudo extraer el acuse del documento de la respuesta SOAP. Verifique el log para más detalles." + ) pdf_bytes = _decode_acuse_base64_content(acuse_base64) @@ -330,7 +343,9 @@ def _extract_acuse_data(soap_response_text: str) -> str: # Log de todos los elementos para debugging logger.error("No se encontró elemento acuseDocumento. Elementos disponibles:") for elem in root.iter(): - logger.debug(f" - {elem.tag}: {elem.text[:50] if elem.text else 'Sin contenido'}...") + logger.error(f" - {elem.tag}: {elem.text[:50] if elem.text else 'Sin contenido'}...") + if 'acuse' in elem.tag.lower(): + logger.error(f"Elemento similar encontrado: {elem.tag}") return None if acuse_elemento is not None and acuse_elemento.text: diff --git a/api/api_v2/modules/coves/tasks.py b/api/api_v2/modules/coves/tasks.py index d0c6837..c34b9b7 100644 --- a/api/api_v2/modules/coves/tasks.py +++ b/api/api_v2/modules/coves/tasks.py @@ -13,102 +13,16 @@ logger = logging.getLogger(__name__) @celery_app.task(bind=True) def process_cove_request(self, cove_request: Dict[str, Any]) -> Dict[str, Any]: - """ - Tarea de Celery para procesar la solicitud de descarga de COVE. - - Args: - cove_request: Diccionario con los datos de la solicitud de COVE. - - Returns: - Diccionario con la respuesta del COVE procesado. - """ - try: - logger.info(f"Iniciando procesamiento de COVE - Task ID: {self.request.id}") - - # Actualizar progreso - self.update_state(state='PROGRESS', meta={'current': 10, 'total': 100, 'status': 'Iniciando procesamiento de COVE'}) - - # Usar run_async_task para ejecutar la función asíncrona - result = run_async_task(consume_ws_get_cove, **cove_request) - - # Actualizar progreso - self.update_state(state='SUCCESS', meta={'current': 100, 'total': 100, 'status': 'COVE procesado exitosamente'}) - - logger.info(f"COVE procesado exitosamente - Task ID: {self.request.id}") - - # Asegurar que la respuesta sea serializable para Celery - return { - "status": "processed", - "data": result, - "task_id": self.request.id - } + loop = asyncio.get_event_loop() + cove_response = loop.run_until_complete(consume_ws_get_cove(**cove_request)) - except Exception as e: - error_msg = f"Error procesando COVE: {str(e)}" - logger.error(error_msg, exc_info=True) - - # Actualizar estado con error - self.update_state( - state='FAILURE', - meta={ - 'current': 0, - 'total': 100, - 'status': error_msg, - 'error': str(e) - } - ) - - # Re-lanzar excepción para que Celery la registre - raise e + return {"status": "processed", "data": cove_response} @celery_app.task(bind=True) def process_acuse_cove_request(self, cove_request: Dict[str, Any]) -> Dict[str, Any]: - """ - Tarea de Celery para procesar la solicitud de acuse de COVE. - - Args: - cove_request: Diccionario con los datos de la solicitud de acuse. - - Returns: - Diccionario con la respuesta del acuse procesado. - """ - try: - logger.info(f"Iniciando procesamiento de acuse de COVE - Task ID: {self.request.id}") - - # Actualizar progreso - self.update_state(state='PROGRESS', meta={'current': 10, 'total': 100, 'status': 'Iniciando procesamiento de acuse de COVE'}) - - # Usar run_async_task para ejecutar la función asíncrona - result = run_async_task(consume_ws_get_acuse_cove, **cove_request) - - # Actualizar progreso - self.update_state(state='SUCCESS', meta={'current': 100, 'total': 100, 'status': 'Acuse de COVE procesado exitosamente'}) - - logger.info(f"Acuse de COVE procesado exitosamente - Task ID: {self.request.id}") - - # Asegurar que la respuesta sea serializable para Celery - return { - "status": "processed", - "data": result, - "task_id": self.request.id - } + loop = asyncio.get_event_loop() + acuse_response = loop.run_until_complete(consume_ws_get_acuse_cove(**cove_request)) - except Exception as e: - error_msg = f"Error procesando acuse de COVE: {str(e)}" - logger.error(error_msg, exc_info=True) - - # Actualizar estado con error - self.update_state( - state='FAILURE', - meta={ - 'current': 0, - 'total': 100, - 'status': error_msg, - 'error': str(e) - } - ) - - # Re-lanzar excepción para que Celery la registre - raise e + return {"status": "processed", "data": acuse_response} diff --git a/test.xml b/test.xml index 3a936ef..486b03e 100644 --- a/test.xml +++ b/test.xml @@ -1,4 +1,4 @@ - + - 2025-10-04T02:03:34Z - 2025-10-04T02:04:34Z + 2025-10-06T01:09:44Z + 2025-10-06T01:10:44Z - - false - - COVE2040ICIR4 - 1 - 1 - - - COVE2040OQV98 - 2 - 2 - - - COVE2040OQVJ5 - 3 - 3 - - - COVE2040OQVS2 - 4 - 4 - - - COVE2040OQVT3 - 5 - 5 - - - COVE2040OQW01 - 6 - 6 - - - COVE2040OQW17 - 7 - 7 - - - COVE2040OQW66 - 8 - 8 - - - COVE2040OQWB5 - 9 - 9 - - + + 0 + true + + 4 + El RFC no tiene relación con el eDocument. + + - \ No newline at end of file + +--uuid:29d62a47-b685-4746-9959-43ab40c1ef88-- \ No newline at end of file