Ir al contenido principal

AUTOMATIZACIÓN DE GUIAS EN SYSLIMA

 16/02/2025

Versión 1.0

Queda prohibido cualquier tipo de explotación y, en particular, la reproducción, distribución, comunicación pública y/o transformación, total o parcial, por cualquier medio, de este documento sin el previo consentimiento expreso y por escrito a overskull.

ÍNDICE


  1. 1. INTRODUCCIÓN Y OBJETIVOS
       1.1 Contexto
       1.2 Propósito
    2. ALCANCE TÉCNICO
       2.1 Automatización Operativa
       2.2 Gestión de Impresión
       2.3 Puntos de Control
    3. COMPONENTES Y DATA DEL PROCESO
       3.1 Entradas (Inputs)
       3.2 Reglas de Negocio
       3.3 Mapeo de Selectores
    4. FLUJO OPERATIVO PASO A PASO
       4.1 Navegación Inicial
       4.2 Llenado de Formulario
       4.3 Finalización
    5. EVIDENCIAS TÉCNICAS (CAPTURA DE CÓDIGO Y SISTEMA)
       5.1 Inspección delde elementos DOM
       5.2 LogicLógica Corede interacción con ventanas
       5.3 Resultadosvalidación de claves y verificación 

       5.4 resultado de ejecución exitosa
    6. GESTIÓN DE RIESGOS Y BUENAS PRÁCTICAS
       6.1 Riesgos Detectados
       6.2 Recomendaciones7.DIAGRAMA DE FLUJO

 

7.DIAGRAMA DE FLUJO

8.CODIGO COMPLETO DOCUMENTADO

1. INTRODUCCIÓN Y OBJETIVOS


   1.1 Contexto

La digitalización logística exige rapidezeficiencia en el flujosector logístico depende directamente de datos.la Elvelocidad presentecon la que se procesa la información. Este proyecto surgese desarrolla para optimizar el registro en el portal SYSLIMA, una plataforma esencial que, debido a sus constantesmúltiples validacionesfiltros internas,y validaciones, suele ralentizargenerar demoras en el despacho manual de encomiendas.encomiendas durante las horas punta.

   1.2 Propósito


El objetivo principal es transformar el llenado de datos, que actualmente es una tarea mecánica y lenta, en un proceso automático y fluido. AlCon automatizaresta la entrada de datos,automatización se buscabusca:

liberar

- Liberar al personal de la carga operativa,operativa permitiéndolespara centrarseque se enfoque en la calidad de atención al clientecliente.

mientras

- Garantizar la precisión de la información, eliminando errores de digitación en datos críticos.

- Acelerar el despacho, permitiendo que el sistema garantiza la precisión enprocese la información registrada.en una fracción del tiempo que toma hacerlo manualmente.

2. ALCANCE TÉCNICO


   2.1 Automatización Operativa

La solución abarcacubre el ciclo de vida inicialintegral del registro de la guía:guía, desde la autenticación segura del usuario hastaeliminando la navegación profundamanual enredundante. losEste menúsproceso incluye:

  1.  Gestión de Autenticación: Protocolo de acceso seguro al portal mediante la inyección automatizada de credenciales.
  2.  Navegación Estructurada: Acceso directo a módulos profundos como "Generales" y "Orden de Servicio", gestionandosuperando la latencia de formalos inteligentemenús desplegables.
  3.  Sincronización Inteligente: El bot utiliza algoritmos de espera (pausas técnicas) calculados para alinearse con los tiempos de cargarespuesta del servidor.

    servidor de Shalom. Esto asegura que los datos del remitente y destinatario se carguen completamente desde la base de datos antes de proceder, evitando registros incompletos o errores de validación de DNI.


   2.2 Gestión de Impresión


El bot poseeestá ladiseñado capacidadpara operar en entornos multiventana, una de detectarlas fases más críticas y propensas a errores del proceso manual:

  1. Detección de Contexto: Capacidad de identificar y transferir el control (switch) a ventanas emergentes,emergentes de forma aislada, permitiendo interactuarque el script interactúe con el móduloPDF sin interferir con la pestaña principal.
  2. Protocolo de impresiónSeguridad: Gestión automatizada de formala aislada.clave Estomaestra. garantizaEl bot no solo ingresa los dígitos, sino que gestiona la validación y confirmación en dos pasos dentro del modal de seguridad, garantizando que la generación del PDFcódigo final sea exitosa y la creación del códigolibre de seguridad se realicen sin bloqueos visuales.

    visuales o cierres inesperados de la sesión.


   2.3 Puntos de Control


Se ha definidoimplementado ununa arquitectura de automatización asistida. Este modelo híbrido.permite Elque el bot se detienedetenga enestratégicamente durante la selección del destino, permitiendootorgando queal operador el criteriocontrol humanototal decidasobre la ruta logísticalogística. final,Esta lopausa crítica garantiza que combina la velocidad dedel bot no comprometa la máquinatoma conde decisiones humanas en variables geográficas o agencias específicas, logrando una sinergia perfecta entre la precisión robótica y la flexibilidad necesariadel entransporte el transporte.logístico.

 

3. COMPONENTES Y DATA DEL PROCESO


   3.1 Entradas (Inputs)


ElLa sistema se alimentaintegridad de la automatización reside en tres pilaresfuentes de datos:datos credencialesfundamentales:

  1. Credenciales de accesoAcceso: institucional, númerosGestión de identidadperfiles (DNI/RUC) y una clave maestra de seguridad (9191) predefinidainstitucionales para la autenticación en el portal.
  2. Identificadores de Identidad: Procesamiento dinámico de registros DNI/RUC para la consulta de bases de datos.
  3. Clave Maestra de Seguridad: Uso de una secuencia predefinida (9191) para la autenticación en el módulo de firma digital y emisión de documentos.

    documentos, estandarizando la seguridad en cada guía generada.


   3.2 Reglas de Negocio


El bot incorpora un protocolo de sincronización asíncrona. Para evitarmitigar errores de tipo "nombreNombre no encontrado" o "Datos no cargados", else bothan respetaprogramado pausas técnicas de entre 6 y 7 segundos. Este tiempo es vitalindispensable para permitir que lalos base de datosservidores de Shalom sincronicecompleten la identidadbúsqueda delen el padrón electoral o SUNAT, asegurando que los nombres de remitente y destinatario se reflejen correctamente antes de proceder con el registro del teléfono.


   3.3 Mapeo de Selectores


Se han auditado y extraído rutas específicasde navegación precisas (XPaths) y selectores de identidad (IDs) para cada campo.nodo Sedel destacaformulario. elAl uso depriorizar identificadores estables como swal-input para la clave y telefonoEntrega para el contacto, asegurando quetelefonoEntrega, el bot siempreadquiere "sepa"visión dóndetécnica", escribir,permitiéndole inclusoignorar siventanas emergentes publicitarias o banners distractores, garantizando que la páginainserción tienede elementosdatos distractores.se realice exclusivamente en los campos correctos.

 

4. FLUJO OPERATIVO PASO A PASO


   4.1 Navegación Inicial


El procesociclo comienzainicia con el inicio de sesión y el despliegue del menúmotor lateral.de Elnavegación y la autenticación cifrada. Tras superar el acceso, el bot ejecuta una secuencia de búsqueda en el árbol de menús: despliega el panel lateral, localiza lael secciónnodo de "Generales" y accedeactiva alel formulario de orden"Orden de servicioServicio". Este flujo reduce el tiempo de manerabúsqueda inmediatamanual trasa elmenos ingreso.de 2 segundos.


  4.2 Llenado de Formulario


La carga de información se ejecuta de manera modular para evitar colisiones de datos:

  1. Bloque de Identidad: Registro y validación secuencial del remitente y destinatario.
  2. Bloque de Configuración: El bot inyectautiliza lacomandos informaciónde enJavaScript bloques:(JS primeroExecutor) elpara remitenteseleccionar con su validación, luego el destinatario. Posteriormente, seleccionainstantáneamente el método de pago y el tipo de paquete (documentos)Documentos). El uso de formaJS automáticapermite interactuar con elementos que a travésveces quedan ocultos o bloqueados por otros componentes de comandosla depágina.
  3. JavaScript.


  4.3 Finalización


UnaAl vez listocompletar el formulario,llenado, se disparaactiva lael ordendisparador de impresión. El botsistema saltarealiza una transferencia de foco a la pestaña del PDF, donde el bot gestiona el Módulo de Seguridad. En esta fase final, ingresa la clave de seguridad en los campos de entrada y verificación,los yrepite finalizaen pulsandolos de verificación con precisión matemática, culminando el proceso al accionar el botón verde de generación de código.código, dejando la guía lista para su distribución.

5. EVIDENCIAS TÉCNICAS (CAPTURA DE CÓDIGO Y SISTEMA)


  5.1 Inspección delde elementos DOM

image.png


A través de herramientas de desarrollo, se capturó la jerarquía de los elementos swal-input. Estas capturas demuestran que el bot interactúa con campos que tienen comportamientos automáticos (saltos de foco), los cuales fueron replicados en el código.


 

  5.2 LogicLógica Corede Interacción con Ventanas


Uno de los mayores retos técnicos fue el manejo de múltiples pestañas. El núcleosiguiente delfragmento de código utilizamuestra la lógica de window_handles. Esta función permite quecómo el bot mantenga"salta" la conexión conde la ventana principal mientras opera ena la ventanade secundariaimpresión:


image.png

5.3 Validación de impresión,Claves unay técnicaVerificación

avanzada

Se documenta el proceso de llenado doble (ingreso y confirmación). El bot replica el comportamiento humano ingresando los dígitos uno a uno para evitar bloqueos del sistema.

image.png

Descripción: Interfaz final del módulo de generación de código antes de la ejecución del comando "Crear código".

 

5.4 Resultado de Ejecución Exitosa

Se presenta la confirmación visual de que la guía ha sido procesada correctamente por el procesobot.

se pierda al abrirse nuevas pestañas.

image.png


 5.3 Resultados


Como evidencia final, se adjuntan las capturas de las guías emitidas satisfactoriamente, donde se observa que tanto los datos de contacto como los códigos de seguridad fueron insertados sin intervención manual en el último tramo del proceso.

6. GESTIÓN DE RIESGOS Y BUENAS PRÁCTICAS


  6.1 Riesgos Detectados


  1. Inestabilidad de Selectores: El principal riesgo crítico es la actualización del portal SYSLIMA. Si el mantenimientoequipo técnico de Shalom modifica los IDs o XPaths de los selectores; si la web de Shalom se actualiza,campos, el bot podríaperderá nola encontrarcapacidad losde campos.localizar Asimismo,elementos, unacausando conexióninterrupciones en el flujo.
  2. Latencia de Red: Conexiones inestables pueden retrasar la carga de elementos dinámicos. Esto obligaría a internet inestable podría requerir aumentarreajustar los tiempos de espera configurados.

    (Wait Times) para evitar que el bot intente interactuar con campos que aún no son visibles.
  3. Seguridad y Bloqueos: El uso de automatización a velocidades no humanas puede ser detectado por sistemas anti-bot, resultando en bloqueos temporales de la IP o la cuenta si no se respetan las pausas programadas.


  6.2 Recomendaciones


Se

    sugiere
  1. Mantenimiento realizarPreventivo: unRealizar monitoreouna auditoría semanal de los XPaths y mantener el software de Chrome actualizadoprincipales para asegurar que el webdrivermapeo funcionesiga correctamente.vigente Además,tras secada recomiendaactualización del sitio web.
  2. Actualización de Entorno: Mantener el navegador Chrome y su respectivo WebDriver sincronizados en la misma versión para evitar fallos de compatibilidad en el arranque del script.
  3. Protocolo de Validación: Es imperativo no reducir las pausas de validación6 a 7 segundos. Estos tiempos actúan como un "seguro" que permite la sincronización con los servidores de identidad y simula un comportamiento de navegación orgánica para evitar el bloqueo por parte del sistema de seguridadsanciones del portal.

  4. Monitoreo de Logs: Registrar las fallas frecuentes para identificar si los errores son causados por la web de Shalom o por caídas locales de internet.
7.Diagrama de Flujo

 

8.CODIGO COMPLETO DOCUMENTADO

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager

# ==============================================================================
# CONFIGURACIÓN Y PARÁMETROS GLOBALES
# ==============================================================================
URL_LOGIN = "https://syslima.shalomcontrol.com/login"
USER_DATA = {"user": "70900128", "pass": "Prueba12."}
CONTACTOS = {"remitente": "900161011", "destinatario": "900161012"}
CLAVE_MAESTRA = "9191"

class ShalomBot:
    def __init__(self):
        """Inicializa el navegador con opciones para mantener la sesión abierta."""
        print("🚀 Iniciando motor de automatización...")
        options = webdriver.ChromeOptions()
        options.add_argument("--disable-notifications")
        options.add_experimental_option("detach", True) # Evita que Chrome se cierre al terminar
        
        self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
        self.driver.maximize_window()
        self.wait = WebDriverWait(self.driver, 25) # Tiempo de espera para carga de elementos

    def escribir_campo(self, xpath, texto, limpiar=True):
        """Limpia un campo de texto e ingresa la información de forma segura."""
        try:
            elemento = self.wait.until(EC.element_to_be_clickable((By.XPATH, xpath)))
            if limpiar:
                elemento.click()
                elemento.send_keys(Keys.CONTROL + "a")
                elemento.send_keys(Keys.BACKSPACE)
            elemento.send_keys(texto)
            return True
        except Exception as e:
            print(f"⚠️ Error al escribir en {xpath}: {e}")
            return False

    def login(self):
        """Realiza la autenticación en el portal SYSLIMA."""
        print("🔑 Accediendo al sistema...")
        self.driver.get(URL_LOGIN)
        self.escribir_campo('//*[@id="loginaction"]/div/div[1]/input', USER_DATA["user"])
        self.escribir_campo('//*[@id="password-text"]', USER_DATA["pass"])
        self.driver.find_element(By.ID, "boton-submit").click()
        print("✅ Autenticación exitosa.")

    def navegar_a_formulario(self):
        """Navega a través del menú lateral hasta 'Orden de Servicio'."""
        time.sleep(2)
        # Clic en menú hamburguesa
        self.wait.until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[3]/section/header/div[1]'))).click()
        # Clic en sección Generales
        self.wait.until(EC.element_to_be_clickable((By.XPATH, "//span[contains(text(),'Generales')]"))).click()
        # Clic en Orden de Servicio
        self.wait.until(EC.element_to_be_clickable((By.XPATH, "//span[contains(text(),'Orden de servicio')]"))).click()
        print("📋 Formulario de orden cargado.")

    def procesar_guia(self, dni_cliente):
        """Ejecuta el flujo completo de llenado de la guía."""
        
        # --- PASO 1: CONTROL HÍBRIDO ---
        print("\n🟡 ESPERANDO SELECCIÓN DE DESTINO (Hazlo manualmente en el navegador)...")
        input("👉 Una vez seleccionado el destino, presiona ENTER aquí para continuar...")

        # --- PASO 2: DATOS DEL REMITENTE ---
        print(f"👤 Remitente: Ingresando DNI {dni_cliente}")
        self.escribir_campo('//*[@id="input_valida_campo2"]', dni_cliente)
        time.sleep(6) # Espera técnica para validación de base de datos
        self.escribir_campo('//*[@id="input_telf_rem"]', CONTACTOS["remitente"])

        # --- PASO 3: DATOS DEL DESTINATARIO ---
        print(f"👤 Destinatario: Ingresando DNI {dni_cliente}")
        self.escribir_campo('//*[@id="input_valida_campo3"]', dni_cliente)
        time.sleep(7) # Espera técnica para carga de identidad
        self.escribir_campo('//*[@id="telefonoEntrega"]', CONTACTOS["destinatario"])

        # --- PASO 4: CONFIGURACIÓN DE PAGO Y PAQUETE ---
        print("💰 Configurando pago (Entrega) y tipo de producto...")
        # Selección de Pago
        self.wait.until(EC.element_to_be_clickable((By.ID, "idosTipoPago"))).click()
        self.driver.find_element(By.XPATH, '//*[@id="idosTipoPago"]/option[3]').click() # Opción 'Entrega'
        # Agregar Producto
        self.driver.find_element(By.ID, "btn_name_paquete").click()
        time.sleep(1.5)
        self.wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="formDeclaracionJurada"]/div/div[1]/div/div/div[2]'))).click() # Documentos
        self.driver.find_element(By.ID, "declaracion_btn-agregar").click()

        # --- PASO 5: IMPRESIÓN Y SEGURIDAD ---
        print("🚀 Generando impresión...")
        time.sleep(2)
        btn_imprimir = self.driver.find_element(By.ID, "imprimePDF")
        self.driver.execute_script("arguments[0].click();", btn_imprimir)
        
        # Confirmar cuadro de diálogo "SÍ"
        self.wait.until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[5]/div/div[3]/button[1]'))).click()
        
        # Cambio a la ventana emergente del PDF
        self.wait.until(lambda d: len(d.window_handles) > 1)
        self.driver.switch_to.window(self.driver.window_handles[1])
        print("🔀 Foco transferido al Módulo de Impresión.")

        # --- PASO 6: CREACIÓN DE CÓDIGO DE SEGURIDAD ---
        print(f"🔑 Aplicando clave maestra: {CLAVE_MAESTRA}")
        # Bloque de ingreso inicial (swal-input)
        for i, num in enumerate(CLAVE_MAESTRA, 1):
            self.escribir_campo(f'//*[@id="swal-input{i}"]', num, limpiar=False)

        self.driver.find_element(By.XPATH, "//button[contains(text(), 'Siguiente')]").click()
        time.sleep(1)

        # Bloque de verificación (confirm-input)
        for i, num in enumerate(CLAVE_MAESTRA, 1):
            self.escribir_campo(f'//*[@id="confirm-input{i}"]', num, limpiar=False)

        # Clic final
        self.driver.find_element(By.XPATH, "//button[contains(text(), 'Crear codigo')]").click()
        print("✅ PROCESO FINALIZADO CON ÉXITO.")

# ==============================================================================
# EJECUCIÓN PRINCIPAL
# ==============================================================================
if __name__ == "__main__":
    bot = ShalomBot()
    try:
        bot.login()
        bot.navegar_a_orden()
        bot.procesar_guia("71423703")
    except Exception as e:
        print(f"❌ Error crítico en la ejecución: {e}")