From c58e9dd3b9e93308dca232cc556ea492434cddbe Mon Sep 17 00:00:00 2001 From: Kevin Rosales Date: Wed, 3 Sep 2025 07:59:34 -0600 Subject: [PATCH] Se modifico task de partidas --- tasks.py | 95 ++++++++++++++++++++++++++++++--------------- utils/peticiones.py | 2 +- 2 files changed, 64 insertions(+), 33 deletions(-) diff --git a/tasks.py b/tasks.py index 4ea6099..0175e5c 100644 --- a/tasks.py +++ b/tasks.py @@ -197,46 +197,77 @@ def partidas_task(self, **kwargs): credentials = await _get_vucem_credentials(contribuyente_id, operation_name) - self.update_state(state='PROGRESS', meta={'status': 'Realizando petición SOAP'}) - logger.info("[TASK] Realizando petición SOAP para partidas...") - + # Obtener número de partidas + numero_partidas = service_data['pedimento'].get('numero_partidas', 0) + partidas_procesadas = [] + logger.info(f"Procesando {numero_partidas} partidas...") + + if numero_partidas <= 0: + logger.warning("El pedimento no tiene partidas para procesar") + await _update_service_status(service_data['id'], ESTADO_ERROR, service_data, operation_name) + raise Exception("No se encontraron partidas para el pedimento") + from utils.peticiones import get_soap_partidas - - soap_response = await get_soap_partidas( - credenciales=credentials, - response_service=service_data, - soap_controller=soap_controller, - partida=request_data.get('partida', '') - ) - - if not soap_response: - raise Exception("Error en la petición SOAP para partidas") - - logger.info("[TASK] Petición SOAP para partidas completada exitosamente") - # Subir documento de partidas si la petición fue exitosa - try: - upload_result = await _post_edocuments( - response_service=service_data, - identificadores_ed=[soap_response.get('documento', {}).get('numero_edocument')] - ) - logger.info(f"Documento de partidas subido exitosamente: {upload_result}") - except Exception as upload_err: - logger.error(f"Error al subir documento de partidas: {upload_err}") - + + for partida_num in range(1, numero_partidas + 1): + try: + logger.info(f"Procesando partida {partida_num}/{numero_partidas}") + soap_response = await get_soap_partidas( + credenciales=credentials, + response_service=service_data, + soap_controller=soap_controller, + partida=str(partida_num) + ) + if soap_response: + partidas_procesadas.append({ + "numero": partida_num, + "procesada": True, + "documento": soap_response.get('documento', {}) + }) + logger.info(f"Partida {partida_num} procesada exitosamente") + else: + logger.warning(f"No se pudo procesar la partida {partida_num}") + partidas_procesadas.append({ + "numero": partida_num, + "procesada": False, + "error": "Error en petición SOAP" + }) + except Exception as e: + logger.error(f"Error al procesar partida {partida_num}: {e}") + partidas_procesadas.append({ + "numero": partida_num, + "procesada": False, + "error": str(e) + }) + continue + + partidas_exitosas = [p for p in partidas_procesadas if p.get('procesada', False)] + + if not partidas_exitosas: + logger.error("No se pudo procesar ninguna partida") + await _update_service_status(service_data['id'], ESTADO_ERROR, service_data, operation_name) + raise Exception("No se pudo procesar ninguna partida") + self.update_state(state='PROGRESS', meta={'status': 'Finalizando proceso'}) await _update_service_status(service_data['id'], ESTADO_FINALIZADO, service_data, operation_name) - + response_data = await _create_response( service_data=service_data, additional_data={ - "partidas": soap_response, - "documento": soap_response.get('documento', {}), - "xml_content": soap_response.get('xml_content', {}) + "partidas": partidas_procesadas, + "total_partidas": numero_partidas, + "partidas_exitosas": len(partidas_exitosas), + "partidas_fallidas": len(partidas_procesadas) - len(partidas_exitosas) }, - success_message="Partidas obtenidas exitosamente" + success_message=f"Se procesaron {len(partidas_exitosas)}/{numero_partidas} partidas exitosamente" ) - - logger.info(f"[TASK] Consulta de partidas completada exitosamente - Servicio: {service_data['id']}") + + if len(partidas_exitosas) < numero_partidas: + response_data["warnings"] = [ + f"Se procesaron solo {len(partidas_exitosas)} de {numero_partidas} partidas" + ] + + logger.info(f"Procesamiento de partidas completado - Exitosas: {len(partidas_exitosas)}/{numero_partidas}") return response_data except Exception as e: diff --git a/utils/peticiones.py b/utils/peticiones.py index 89dd333..31453f8 100644 --- a/utils/peticiones.py +++ b/utils/peticiones.py @@ -276,7 +276,7 @@ async def get_soap_pedimento_completo(credenciales, response_service, soap_contr # Realizar petición SOAP logger.info("Realizando petición SOAP...") - + print(f"XML SOAP generado: {soap_xml}") # 👈 Registra el XML completo # Headers específicos para este servicio SOAP soap_headers = { 'Content-Type': 'text/xml; charset=utf-8'