From 1919f61049f3a083d35a7db6a8f73cc90d9f24fb Mon Sep 17 00:00:00 2001 From: jalarakmt Date: Wed, 18 Mar 2026 11:18:56 -0600 Subject: [PATCH] Se agrega codigo unico de imei Se agrego el brinco para replicar con el KMTM se agrego que mande la fecha --- B4A/C_Principal.bas | 127 +++++++++++--- B4A/C_deviceLinker.bas | 310 +++++++++++++++++++++++++++++++++++ B4A/DBRequestManager.bas | 113 +++++++++++-- B4A/Files/principal.bal | Bin 23258 -> 23258 bytes B4A/Mariana_Reparto.b4a | 54 +++--- B4A/Mariana_Reparto.b4a.meta | 7 +- B4A/Starter.bas | 1 + B4A/Subs.bas | 17 ++ 8 files changed, 569 insertions(+), 60 deletions(-) create mode 100644 B4A/C_deviceLinker.bas diff --git a/B4A/C_Principal.bas b/B4A/C_Principal.bas index ca3a2be..2de8aeb 100644 --- a/B4A/C_Principal.bas +++ b/B4A/C_Principal.bas @@ -95,6 +95,7 @@ Sub Class_Globals Private b_regreso As Button Private lv_prod_Prin As ListView Private b_venta_emp As Button + Dim linker As C_deviceLinker End Sub 'You can add more parameters here. @@ -167,6 +168,8 @@ End Sub Sub B4XPage_Appear + linker.Initialize(Me, "Linker", True) + Private c As Cursor = Starter.skmt.ExecQuery("SELECT * FROM NOVENTA") If c.RowCount > 0 Then Starter.skmt.ExecNonQuery("Update kmt_info set gestion = 2 WHERE CAT_CL_CODIGO IN (SELECT NV_CLIENTE FROM NOVENTA WHERE NV_MOTIVO = 'ENTREGA')") @@ -243,6 +246,9 @@ Sub B4XPage_Appear ' If f.RowCount > 0 Then l_ruta.Text = f.GetString("CAT_CL_RUTA") ' f.Close + reqManager.Initialize(Me, Starter.DBReqServer) + Log($"DBREQSERVER = ${Starter.DBReqServer}"$) + cargar.Visible = False Subir.Visible = False connecta.Visible = True @@ -1064,8 +1070,8 @@ Sub cargar_Click If Not(IsConnectedToInternet) Then MsgboxAsync("No hay conexión a Internet", "Revisa tu conexión") Dim cmd As DBCommand cmd.Initialize - cmd.Name = "select_ruta_entrega_cargada" - cmd.Parameters = Array As Object(ALMACEN, e_ruta.text) + cmd.Name = "select_ruta_entrega_cargada2" + cmd.Parameters = Array As Object(ALMACEN, e_ruta.text, Subs.traeUsuario) reqManager.ExecuteQuery(cmd ,0, "entrega_cargada") End If @@ -1386,7 +1392,7 @@ Sub JobDone(Job As HttpJob) ' Dim CAT_GP_DEV As String = records(RESULT.Columns.Get("CAT_GP_DEV")) ' skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG,CAT_GP_ALMACEN,CAT_GP_DEV) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object (CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG, CAT_GP_ALMACEN,CAT_GP_DEV)) ' Log(" ++ insert into CAT_GUNAPROD: "&CAT_GP_ID&","&CAT_GP_NOMBRE&","&CAT_GP_IMP1) - Log(CAT_GP_NOMBRE & "<-------------------------------------") +' Log(CAT_GP_NOMBRE & "<-------------------------------------") Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG,CAT_GP_ALMACEN,CONVERSION,PRECIOCONVER) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object (CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG, 0,CONVERSION,PRECIOCONVER)) Next Starter.skmt.TransactionSuccessful @@ -1661,17 +1667,17 @@ Sub JobDone(Job As HttpJob) End If End If - If Job.JobName = "DBRequest" Then - Dim result As DBResult = reqManager.HandleJob(Job) - If result.Tag = "version" Then 'query tag - For Each records() As Object In result.Rows - Starter.skmt.ExecNonQuery("delete from VERSION") - Dim CAT_VE_VERSION As String = records(result.Columns.Get("CAT_VE_VERSION")) -' Log(" ++ insert into VERSION: "&CAT_VE_VERSION) - Starter.skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object (CAT_VE_VERSION)) - Next - End If - End If +' If Job.JobName = "DBRequest" Then +' Dim result As DBResult = reqManager.HandleJob(Job) +' If result.Tag = "version" Then 'query tag +' For Each records() As Object In result.Rows +' Starter.skmt.ExecNonQuery("delete from VERSION") +' Dim CAT_VE_VERSION As String = records(result.Columns.Get("CAT_VE_VERSION")) +'' Log(" ++ insert into VERSION: "&CAT_VE_VERSION) +' Starter.skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object (CAT_VE_VERSION)) +' Next +' End If +' End If If Job.JobName = "DBRequest" Then Dim result As DBResult = reqManager.HandleJob(Job) @@ -1702,7 +1708,7 @@ Sub JobDone(Job As HttpJob) Else If l_ctast.Text <> "0" Then Subir.Visible = False End If - cargar.Visible = True +' cargar.Visible = True If Subs.dameUsuarioDeDB = "ROOT" Then Subir.Visible = True connecta.Visible = False Starter.skmt.ExecNonQuery("DELETE FROM RUTAA") @@ -1712,6 +1718,11 @@ Sub JobDone(Job As HttpJob) If conn = "1" Then ToastMessageShow("Existe Conexión con el Servidor." , True) End If + + ' EL EVENTO DE CONECTAR AHORA SE DISPARA DESPUES DE REVISAR SI LA RUTA ESTA LIGADA O NO AL DISPOSITIVO (verifyDevice). + ' REVISAR EL SUB "Linker_Response" + linker.verifyDevice(Subs.traeAlmacen, e_ruta.text) + Else cargar.Visible = False Subir.Visible = False @@ -1756,7 +1767,7 @@ Sub JobDone(Job As HttpJob) Else cmd.Initialize - cmd.Name = "update_ruta_entrega_cargada" + cmd.Name = "update_ruta_entrega_cargada2" cmd.Parameters = Array As Object(ALMACEN,e_ruta.text) reqManager.ExecuteCommand(cmd , "update_rrcargada") Starter.skmt.ExecNonQuery("DELETE FROM RUTAA") @@ -1962,13 +1973,14 @@ Sub connecta_Click imei = "" 'p.GetDeviceId conn = "1" ime.HideKeyboard +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "select_version_MARDS" +' reqManager.ExecuteQuery(cmd , 0, "version") + Dim cmd As DBCommand cmd.Initialize - cmd.Name = "select_version_MARDS" - reqManager.ExecuteQuery(cmd , 0, "version") - Dim cmd As DBCommand - cmd.Initialize - cmd.Name = "select_ruta_re_REPG3" + cmd.Name = "select_ruta_re_REPG4" cmd.Parameters = Array As Object(ALMACEN, e_ruta.text, Subs.traeUsuario) ' Log($"${ALMACEN}, ${e_ruta.text}, ${imei}"$) reqManager.ExecuteQuery(cmd , 0, "ruta") @@ -1978,6 +1990,24 @@ Sub connecta_Click End If End Sub +Private Sub connecta_LongClick +' Private h As ResultSet = Starter.skmt.ExecQuery($"select * from bitacoraGPS"$) +' Do While h.nextrow +' cmd.Initialize +' cmd.Name = "mandaBitacora" + '' TMP_ALMACEN, TMP_USUARIO, TMP_RUTA, TMP_EVENTO, TMP_ID_CLIENTE, TMP_NOMBRE_CLIENTE, TMP_INICIO, TMP_FINAL, TMP_LATITUD, TMP_LONGITUD, TMP_PRESICION, TMP_MOTIVO_NO_VENTA, TMP_MOTIVO_NO_VISITA, TMP_FECHA_SINC +' cmd.Parameters = Array As Object(h.GetString("almacenb"), h.GetString("usuariob"), h.GetString("rutab"), h.GetString("eventob"), h.GetString("clienteb"), h.GetString("clienteb"), h.GetString("iniciob"), h.GetString("finb"), h.GetString("latitudb"), h.GetString("longitudb"), h.GetString("precision"), h.GetString("motivonoventa"), h.GetString("motivonovisita")) +' reqManager.ExecuteCommand(cmd , "mandaBitacora") + '' cmd.Name = "borraBitacora" + '' cmd.Parameters = Array As Object(c.GetString("almacenb"), c.GetString("rutab"), c.GetString("usuariob"), c.GetString("almacenb")) +' Loop + '' End If +' Log("MANDAMOS BITACORA") + If e_ruta.Text = "KMTM" Then Subs.deshabilitaValidaciones +' B4XPages.MainPage.recordatorio.agregaPanelRecordatorio(Root) +End Sub + + Sub BUSCA_Click If b_check.Visible = True Then MsgboxAsync("Favor de hacer el checklist.","Atención") @@ -2014,6 +2044,8 @@ Sub e_ruta_EnterPressed Starter.skmt.ExecNonQuery("DELETE FROM TABULADOR_MONEDAS") Starter.skmt.ExecNonQuery("DELETE FROM TABULADOR_BILLETES") Starter.skmt.ExecNonQuery("DELETE FROM RUTAA") + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("VERIFY_DEVICE")) + B4XPage_Appear End If ' Starter.waypointsOrdered.Clear @@ -2377,4 +2409,57 @@ Private Sub b_venta_emp_Click Starter.skmt.ExecNonQuery("delete from CUENTAA") Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object("63403")) B4XPages.ShowPage("Cliente") +End Sub + +Sub Linker_Response(Status As String) ' << AÑADE ESTE SUB [New Query] +' If Starter.Logger Then + LogColor($"Respuesta de DeviceLinker para la verificación del dispositivo: ${Status}"$, Colors.Magenta) ' +' End If + Select Status + Case "UUID_ERROR" + Log("Error interno al obtener el identificador único del dispositivo.") + ToastMessageShow("Error interno al obtener el identificador único del dispositivo.", True) + Case "HTTP_ERROR" + LogColor("Error HTTP al verificar el dispositivo: " & linker.lastJobDoneError, Colors.Red) + ToastMessageShow("Error de conexión al servidor durante la verificación del dispositivo.", True) + Case "SERVER_LOGIC_ERROR" + Log("El servidor no proporcionó un estado de verificación válido. Contacte a soporte.") + ToastMessageShow("El servidor no proporcionó un estado de verificación válido. Contacte a soporte.", True) + Case "OK" + Log("ocultamos cargar") + cargar.Visible = True + Log("########################################################") + Log("Dispositivo vinculado y verificado exitosamente.") + ToastMessageShow("Dispositivo verificado y vinculado correctamente.", False) + ' Aquí puedes añadir lógica adicional si la verificación es exitosa, por ejemplo, habilitar ciertos botones o continuar con el flujo normal. +' connecta2 + Case "REGISTRO_COMPLETO" + Log("ocultamos cargar") + cargar.Visible = True + Log("########################################################") + Log("¡Registro completo!") + ToastMessageShow("¡Registro completo!", False) +' connecta2 + Case "SIN_REGISTRO" + Log("########################################################") + Log("Sin registro") + ToastMessageShow("¡Dispositivo sin registro!", False) + linker.linkDevice(Subs.traeAlmacen, e_ruta.text) + Case "REGISTRANDO" + Log("¡Registro en proceso!") + ToastMessageShow("¡Registro en proceso!", True) + Case "YA_REGISTRADO" + Log("ocultamos cargar") + cargar.Visible = False + Subir.Visible = False + Log("########################################################") + Log("¡El dispositivo ya esta registrado con otra ruta!") + ToastMessageShow("¡¡El dispositivo ya esta registrado con otra ruta!!", True) + Msgbox2("Esa ruta ya esta registrada en otro dispositivo", "RUTA INCORRECTA","Aceptar", "", "",Null) 'ignore + Case Else ' Otros estados que tu servidor pueda devolver (ej. "UNAUTHORIZED", "PENDING_APPROVAL") + Log("########################################################") + Log($"Estado de verificación del dispositivo: ${Status}"$) + ToastMessageShow($"Verificación del dispositivo: ${Status}"$, True) + ' Puedes decidir si bloquear la funcionalidad o mostrar un mensaje específico según el estado. + End Select End Sub \ No newline at end of file diff --git a/B4A/C_deviceLinker.bas b/B4A/C_deviceLinker.bas new file mode 100644 index 0000000..96171be --- /dev/null +++ b/B4A/C_deviceLinker.bas @@ -0,0 +1,310 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=12.8 +@EndOfDesignText@ +'----------------------------------------------------------------------------------- +' Modulo de Clase: DeviceLinker.bas +' Propósito: Gestionar el GUID del dispositivo y verificar/ligar el dispositivo +' a un almacén y ruta en el servidor de forma segura. +'----------------------------------------------------------------------------------- +' Ejemplo de uso: +' ==== En config.properties ==== +' sql.verify_device=Select nvl(CAT_RU_IDTELEFONO, 0) As CAT_RU_IDTELEFONO from kelloggs.CAT_RUTAS where cat_ru_idalmacen = ? And cat_ru_ruta = ? +' sql.registarMovil=update kelloggs.CAT_RUTAS set CAT_RU_IDTELEFONO = ? where cat_ru_idalmacen = ? And cat_ru_ruta = ? +' ==== En Class_Globals ==== +' Dim linker As C_deviceLinker '<<<< Class_Globals +' ==== En B4XPage_Created ==== +' linker.Initialize(Me, "Linker", True) '<<<<<< B4XPage_Created +' ==== En donde se quiera llamar ==== +' linker.VerifyDevice(Subs.traeAlmacen, Subs.traeRuta) +' Sub Linker_Response(Status As String) ' << AÑADE ESTE SUB [New Query] +' If Starter.Logger Then LogColor($"Respuesta de DeviceLinker para la verificación del dispositivo: ${Status}"$, Colors.Magenta) ' +' Select Status +' Case "OK" +' Log("########################################################") +' ToastMessageShow("Dispositivo verificado y vinculado correctamente.", False) +' ' Aquí puedes añadir lógica adicional si la verificación es exitosa, por ejemplo, habilitar ciertos botones o continuar con el flujo normal. +' Case "REGISTRO_COMPLETO" +' Log("########################################################") +' ToastMessageShow("¡Registro completo!", False) +' Case "SIN_REGISTRO" +' Log("########################################################") +' ToastMessageShow("¡Dispositivo sin registro!", False) +' linker.linkDevice(Subs.traeAlmacen, e_ruta.text) '<<<<<<<<< Si no esta registrado lo registramos. +' Case "REGISTRANDO" +' ToastMessageShow("¡Registro en proceso!", True) +' Case "YA_REGISTRADO" +' Log("########################################################") +' ToastMessageShow("¡¡El dispositivo ya esta registrado con otra ruta!!", True) +' Case Else ' Otros estados que tu servidor pueda devolver (ej. "UNAUTHORIZED", "PENDING_APPROVAL") +' Log("########################################################") +' ToastMessageShow($"Verificación del dispositivo: ${Status}"$, True) +' ' Puedes decidir si bloquear la funcionalidad o mostrar un mensaje específico según el estado. +' End Select +' End Sub + +Sub Class_Globals + ' Configuración del servidor y comandos + Private Const GUID_KEY_ALIAS As String = "DeviceGUID" ' << ALIAS PARA EL GUID EN EL KEYSTORE + + ' Objetos y variables internas + Private kvs As KeyValueStore ' << ALMACENAMIENTO SEGURO PARA EL GUID + Private CallBack As Object ' << OBJETO DE CALLBACK PARA ENVIAR RESPUESTAS + Private EventName As String ' << NOMBRE DEL EVENTO DE RESPUESTA + Public reqManager As DBRequestManager ' << GESTOR DE PETICIONES AL SERVIDOR jRDC + Private logger As Boolean ' << PARA CONTROLAR LOS LOGS DE ESTA CLASE + Dim lastJobDoneError As String = "" + Dim almacen As String = "" + Dim ruta As String = "" + Dim deviceId As String = "" + ' Se requieren las siguientes librerías: + ' - KeyValueStore2 + ' - DBRequestManager + ' - XUI + Dim dlDB As SQL +End Sub + +' Inicializa la clase DeviceLinker. +' PageObject: El módulo (ej. C_Principal) que inicializa esta clase y manejará sus respuestas (normalmente "Me"). +' NameOfEvent: El prefijo para el evento de respuesta (ej. "DeviceLinker_Response"). +' AppLogger: Booleano para activar/desactivar los logs internos de esta clase, siguiendo el Starter.Logger de la app. +Public Sub Initialize (PageObject As Object, NameOfEvent As String, AppLogger As Boolean) + CallBack = PageObject + EventName = NameOfEvent + logger = AppLogger ' Asignamos el estado del logger de la aplicación. + + ' Inicializamos el KeyValueStore para almacenamiento seguro del GUID + kvs.Initialize(File.DirInternal, "DeviceKeyStore.b4xkey") + If logger Then Log("B4XKeyStore 'DeviceKeyStore' inicializado.") + + dlDB.Initialize(File.DirInternal, "deviceLink.db", True) + dlDB.ExecNonQuery("CREATE TABLE IF NOT EXISTS Registro (GUID_KEY_ALIAS TEXT)") ' Creamos la tabla si no existe + + ' Inicializamos el DBRequestManager para las comunicaciones con el servidor. + ' 'Me' indica que el evento JobDone de esta clase se encargará de las respuestas de reqManager. +' reqManager.Initialize(Me, Starter.DBReqServer) +' reqManager.Initialize(Me, "http://keymon.net:9010/DB2") 'Servidor de pruebas +' reqManager.Initialize(Me, "http://keymon.net:1781") 'Servidor productivo + reqManager.Initialize(Me, Starter.DBReqServer) 'Servidor productivo + + If logger Then Log("DBRequestManager para DeviceLinker inicializado.") + If logger Then Log("DeviceLinker inicializado y listo para operar.") +End Sub + +' Verifica y liga el dispositivo con un almacén y una ruta en el servidor. +' Almacen: El identificador del almacén. +' Ruta: El identificador de la ruta. +Public Sub verifyDevice(Almacen_ As String, Ruta_ As String) + Private verificar As Boolean = True ' La verificacion se realiza por default + Private tv As Cursor = Starter.skmt.ExecQuery("select * from cat_variables where CAT_VA_DESCRIPCION = 'VERIFY_DEVICE'") + If tv.RowCount > 0 Then + tv.Position = 0 + If tv.GetString("CAT_VA_VALOR") = 0 Then verificar = False + End If + If verificar Then ' Si VERIFY_DEVICE no está en CERO ... verificamos. + Dim DeviceId_ As String = GetDeviceGUID ' Obtenemos o generamos el GUID del dispositivo. + LogColor(DeviceId_, Colors.red) + almacen = Almacen_ + ruta = Ruta_ + deviceId = DeviceId_ + If DeviceId_ = "" Then + If logger Then LogColor("Error: GUID del dispositivo no pudo ser obtenido o generado.", Colors.Red) + ' Enviar una respuesta de error al callback si no se pudo obtener el GUID. + If SubExists(CallBack, EventName & "_Response") Then ' [New Query] + CallSub2(CallBack, EventName & "_Response", "GUID_ERROR") ' Dispara el evento Linker_Response("GUID_ERROR") + End If + Return + End If + + If logger Then Log($"Enviando solicitud de verificación para DeviceId: ${DeviceId_}, Almacen: ${Almacen_}, Ruta: ${Ruta_}"$) + + Dim cmd As DBCommand ' Creamos un comando para enviar al servidor. + cmd.Initialize + cmd.Name = "verify_device_MARDS" + ' Pasamos el almacén, la ruta y el GUID del dispositivo como parámetros. + cmd.Parameters = Array As Object(Almacen_, Ruta_) ', DeviceId_ + Log($"Enviamos almacen: ${Almacen_} y ruta: ${Ruta_}"$) + + ' Ejecutamos el comando en el servidor. 'Me' indica que DBRequestManager_JobDone en esta clase manejará la respuesta. + reqManager.ExecuteQuery(cmd, 0, "verify_device") + Else ' Si está en CERO (Verificacion deshabilitada), regresamos "OK". + CallSub2(CallBack, EventName & "_Response", "OK") + End If +End Sub + +Sub linkDevice(Almacen_ As String, Ruta_ As String) + Dim deviceId As String = GetDeviceGUID ' Obtenemos o generamos el GUID del dispositivo. + Log("########################################################") + Log("REGISTRANDO") + Dim cmd As DBCommand ' Creamos un comando para enviar al servidor. + cmd.Initialize + cmd.Name = "registarMovil_MARDS" + ' Pasamos el almacén, la ruta y el GUID del dispositivo como parámetros. + cmd.Parameters = Array As Object(deviceId, Almacen_, Ruta_) + reqManager.ExecuteCommand(cmd, "registramosGUID") + If SubExists(CallBack, EventName & "_Response") Then + CallSub2(CallBack, EventName & "_Response", "REGISTRANDO") ' Dispara el evento Linker_Response("REGISTRANDO") + End If +End Sub + +'244500 + +' Obtiene el GUID único del dispositivo desde B4XKeyStore. +' Si no existe, lo genera y lo guarda utilizando Subs.GUID. +Private Sub GetDeviceGUID As String +' If kvs.ContainsKey(GUID_KEY_ALIAS) = False Then +' ' Corrección: Usamos la función GUID ya existente en el módulo Subs [1]. +' Dim NewGUID As String = generaGUID +' kvs.Put(GUID_KEY_ALIAS, NewGUID) ' Lo guardamos de forma segura en el KeyStore. +' If logger Then LogColor($"Nuevo GUID generado y guardado: ${NewGUID}"$, Colors.Blue) +' Return NewGUID +' Else +' Dim ExistingGUID As String = kvs.Get(GUID_KEY_ALIAS) ' Recuperamos el GUID existente. +' If logger Then LogColor($"GUID existente cargado: ${ExistingGUID}"$, Colors.Blue) +' Return ExistingGUID +' End If + + If deviceLinked = False Then + ' Corrección: Usamos la función GUID ya existente en el módulo Subs [1]. + Dim NewGUID As String = generaGUID + dlDB.ExecNonQuery($"insert into registro ('GUID_KEY_ALIAS') values ('${NewGUID}')"$) ' Guardamos nuevo registro + If logger Then LogColor($"Nuevo GUID generado y guardado: ${NewGUID}"$, Colors.Blue) + Return NewGUID + Else + Dim ExistingGUID As String + Private e As Cursor = dlDB.ExecQuery("select GUID_KEY_ALIAS from registro") + e.Position = 0 + ExistingGUID = e.GetString("GUID_KEY_ALIAS") + If logger Then LogColor($"GUID existente cargado: ${ExistingGUID}"$, Colors.Blue) + Return ExistingGUID + End If +End Sub + +' Callback para manejar las respuestas del DBRequestManager de esta clase. +Public Sub JobDone(Job As HttpJob) ' El nombre del sub debe ser 'JobDone' o el que se haya especificado en reqManager.Initialize(Me, ApiUrl) + If logger Then Log("INICA JOBDONE DEVICELINKER - " & Job.Tag) + If reqManager.reqsList.IsInitialized Then 'Si tenemos lista de requests, la procesamos. + If reqManager.reqsList.IndexOf(Job.tag) <> -1 Then + reqManager.reqsList.RemoveAt(reqManager.reqsList.IndexOf(Job.tag)) + LogColor($">>>>>> Recibimos y quitamos ${Job.tag.As(String).ToUpperCase}"$, Colors.Blue) + End If + LogColor(">>>>>> " & reqManager.reqsList.Size & " - " & reqManager.reqsList, Colors.Blue) + End If + If Job.Success = False Then + lastJobDoneError = Job.ErrorMessage + LogColor("############################################", Colors.red) + LogColor("###### JobError: " & Job.Tag & " ######" & CRLF & "#### " & Job.ErrorMessage, Colors.red) + LogColor("############################################", Colors.red) + ' Enviar una respuesta de error HTTP al callback. + If SubExists(CallBack, EventName & "_Response") Then + CallSub2(CallBack, EventName & "_Response", "HTTP_ERROR") ' Dispara el evento Linker_Response("HTTP_ERROR") + End If + Else 'If Job Success then ... + lastJobDoneError = "" + If Job.JobName = "DBRequest" Then ' Asegurarse de que sea una respuesta de DBRequestManager. + ' Primero verificamos Job.Success para saber si la comunicación HTTP fue exitosa [New Query] + If Job.Success Then + Dim result As DBResult = reqManager.HandleJob(Job) ' Procesamos el HttpJob para obtener el DBResult. + If logger Then LogColor($"Petición exitosa al servidor. Registros devueltos: ${result.Rows.Size}"$, Colors.Green) + + +' If result.Tag = "hist_cliente_promos" Then 'query tag +' Starter.skmt.BeginTransaction +' For Each records() As Object In result.Rows +' Dim HCCP_CLIENTE As String = records(result.Columns.Get("HCCP_CLIENTE")) +' Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CLIENTE_CANT_PROMOS(HCCP_CLIENTE, HCCP_PROMO, HCCP_CANT, HCCP_CANT_VENDIDA) VALUES (?,?,?,?)", Array As Object (HCCP_CLIENTE)) +' Next +' Starter.skmt.TransactionSuccessful +' Starter.skmt.EndTransaction +' ' ToastMessageShow(" Historico Clientes Promociones Actualizado." , True) +' End If + + If result.Tag = "verify_device" Then 'query tag + ' Aquí es donde la lógica de la aplicación interpreta el éxito/falla de la operación en el servidor. + If result.Rows.Size > 0 Then + Subs.logJobDoneResultados(result) + For Each records() As Object In result.Rows + Dim Status As String = "" 'records(result.Columns.Get("ESTATUS")) + Dim CAT_RU_IDTELEFONO As String = records(result.Columns.Get("CAT_RU_IDTELEFONO_REPARTO")) + deviceId = GetDeviceGUID + Log($"|${deviceId}|${CAT_RU_IDTELEFONO}|"$) +' If deviceId <> CAT_RU_IDTELEFONO Then Status = "YA_REGISTRADO" ' Ya existe OTRO registro. + If CAT_RU_IDTELEFONO = 0 Or CAT_RU_IDTELEFONO.Length < 5 Then + Status = "SIN_REGISTRO" + Log("########################################################") + Log("REGISTRANDO") +' Dim cmd As DBCommand ' Creamos un comando para enviar al servidor. +' cmd.Initialize +' cmd.Name = "registarMovil" +' ' Pasamos el almacén, la ruta y el GUID del dispositivo como parámetros. +' cmd.Parameters = Array As Object(deviceId, almacen, ruta) +' reqManager.ExecuteCommand(cmd, "registramosGUID") + If SubExists(CallBack, EventName & "_Response") Then + CallSub2(CallBack, EventName & "_Response", "SIN_REGISTRO") + End If + else if CAT_RU_IDTELEFONO = deviceId Then + Status = "OK" + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("LIGADO")) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("LIGADO", 1)) + Log("OK") + LogColor("######### GUARDAMOS ###########", Colors.red) + Else + Status = "YA_REGISTRADO" + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("LIGADO")) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("LIGADO", 0)) + Log("YA_REGISTRADO") + LogColor("######### GUARDAMOS ###########", Colors.red) + End If + ' Invocamos el callback en el módulo principal con el estado. + Next + Else + Status = "NO_EXISTE_RUTA" + End If + If SubExists(CallBack, EventName & "_Response") Then + CallSub2(CallBack, EventName & "_Response", Status) ' Dispara el evento Linker_Response("OK") o Linker_Response("YA_REGISTRADO") + End If + End If + + If result.Tag = "registramosGUID" Then + Log("########################################################") + Log("REGISTRO_COMPLETO") + LogColor("######### GUARDAMOS ###########", Colors.red) + Subs.logJobDoneResultados(result) + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("LIGADO")) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("LIGADO", 1)) + If SubExists(CallBack, EventName & "_Response") Then + CallSub2(CallBack, EventName & "_Response", "REGISTRO_COMPLETO") ' Dispara el evento Linker_Response("REGISTRO_COMPLETO") + End If + End If + End If + End If + Job.Release ' Muy importante liberar el HttpJob para evitar fugas de memoria. + End If +End Sub + +'Genera un GUID (globally unique identifier) +Sub generaGUID As String + Dim sb As StringBuilder + sb.Initialize + For Each stp As Int In Array(8, 4, 4, 4, 12) + If sb.Length > 0 Then sb.Append("-") + For n = 1 To stp + Dim c As Int = Rnd(0, 16) + If c < 10 Then c = c + 48 Else c = c + 55 + sb.Append(Chr(c)) + Next + Next + Return sb.ToString +End Sub + +'Regresa true si existe registro +Sub deviceLinked As Boolean + Private e As Cursor = dlDB.ExecQuery("select * from registro") + If e.RowCount > 0 Then + Return True + Else + Return False + End If +End Sub \ No newline at end of file diff --git a/B4A/DBRequestManager.bas b/B4A/DBRequestManager.bas index b3d83a1..d0204b6 100644 --- a/B4A/DBRequestManager.bas +++ b/B4A/DBRequestManager.bas @@ -4,7 +4,7 @@ ModulesStructureVersion=1 Type=Class Version=7.01 @EndOfDesignText@ -'Class module +''Class module Sub Class_Globals Private mTarget As Object Type DBResult (Tag As Object, Columns As Map, Rows As List) @@ -15,7 +15,12 @@ Sub Class_Globals ,T_DOUBLE = 6, T_BOOLEAN = 7, T_BLOB = 8 As Byte Private VERSION As Float = 0.9 Private tempArray(1) As Object - Dim jobTagAnterior As String = "" 'Mod por CHV - 211023 + Dim jobTagAnterior As String = "" 'Mod por CHV - 211109 + Dim reqsList, timesList As List + Dim inicioRequest As Long 'ignore + Dim inicioJobDone As Long 'ignore + Dim inicioRequestMap, inicioJobDoneMap As Map + Private logger As Boolean = False End Sub 'Target - The module that handles JobDone (usually Me). @@ -32,8 +37,10 @@ End Sub Public Sub ExecuteQuery(Command As DBCommand, Limit As Int, Tag As Object) Dim j As HttpJob Dim ms As OutputStream - Dim out2 As OutputStream = StartJob(j,ms, Tag) - + Dim out2 As OutputStream = StartJob(j, ms, Tag) +' If reqsList.IsInitialized Then reqsList.Add(Tag) +' If timesList.IsInitialized Then timesList.Add(DateTime.now) + WriteObject(Command.Name, out2) WriteInt(Limit, out2) WriteList(Command.Parameters, out2) @@ -41,13 +48,30 @@ Public Sub ExecuteQuery(Command As DBCommand, Limit As Int, Tag As Object) j.PostBytes(link & "?method=query", ms.ToBytesArray) End Sub +'Sends a query request. +'Command - Query name and parameters. +'Limit - Maximum rows to return or 0 for no limit. +'Tag - An object that will be returned in the result. +'Timeout - The http request timeout in ms, or 0 if default (30 secs) +Public Sub ExecuteQuery3(Command As DBCommand, Limit As Int, Tag As Object, Timeout As Int) 'Mod por CHV, agregué el parametro Timeout - 211229 + Dim j As HttpJob + Dim ms As OutputStream + Dim out2 As OutputStream = StartJob(j,ms, Tag) + WriteObject(Command.Name, out2) + WriteInt(Limit, out2) + WriteList(Command.Parameters, out2) + out2.Close + j.PostBytes(link & "?method=query", ms.ToBytesArray) + If Timeout <> 0 Then j.GetRequest.Timeout = Timeout +End Sub + 'Executes a batch of (non-select) commands. 'ListOfCommands - List of the commands that will be executes. 'Tag - An object that will be returned in the result. Public Sub ExecuteBatch(ListOfCommands As List, Tag As Object) Dim j As HttpJob Dim ms As OutputStream - Dim out2 As OutputStream = StartJob(j,ms, Tag) + Dim out2 As OutputStream = StartJob(j, ms, Tag) WriteInt(ListOfCommands.Size, out2) For Each Command As DBCommand In ListOfCommands WriteObject(Command.Name, out2) @@ -59,10 +83,15 @@ End Sub 'Similar to ExecuteBatch. Sends a single command. Public Sub ExecuteCommand(Command As DBCommand, Tag As Object) +' If reqsList.IsInitialized Then reqsList.Add(Tag) +' If timesList.IsInitialized Then timesList.Add(DateTime.now) ExecuteBatch(Array As DBCommand(Command), Tag) End Sub Private Sub StartJob(j As HttpJob, MemoryStream As OutputStream, Tag As Object) As OutputStream +' inicioRequest = DateTime.now + If reqsList.IsInitialized Then reqsList.Add(Tag) + If timesList.IsInitialized Then timesList.Add(DateTime.now) j.Initialize("DBRequest", mTarget) j.Tag = Tag MemoryStream.InitializeToBytesArray(0) @@ -113,7 +142,7 @@ Private Sub WriteObject(o As Object, out As OutputStream) Else If GetType(tempArray(0)) = "[B" Then data = o out.WriteBytes(Array As Byte(T_BLOB), 0, 1) - WriteInt(data.Length, out) + WriteInt(data.Length, out) Else 'If o Is String Then (treat all other values as string) out.WriteBytes(Array As Byte(T_STRING), 0, 1) data = bc.StringToBytes(o, "UTF8") @@ -186,7 +215,13 @@ End Sub 'Handles the Job result and returns a DBResult. Public Sub HandleJob(Job As HttpJob) As DBResult -' Dim start As Long = DateTime.Now + If jobTagAnterior <> Job.Tag Then +' inicioJobDone = DateTime.Now 'ignore + If inicioJobDoneMap.IsInitialized Then inicioJobDoneMap.Put(Job.Tag, DateTime.Now) +' tiempos.Put(Job.taskId, CreateMap("inicioJobDone":inicioJobDone)) +' Log(tiempos) +' Log("############# " & Job.taskId) + End If Dim In As InputStream = Job.GetInputStream Dim cs As CompressedStreams In = cs.WrapInputStream(In, "gzip") @@ -197,8 +232,6 @@ Public Sub HandleJob(Job As HttpJob) As DBResult table.Columns.Initialize table.rows.Initialize table.Tag = Job.Tag - If jobTagAnterior <> Job.Tag Then LogColor("HandleJob: '"&Job.Tag&"'", Colors.Blue) 'Mod por CHV - 211023 - jobTagAnterior = Job.Tag 'Mod por CHV - 211023 If method = "query" Then Dim numberOfColumns As Int = ReadInt(In) For i = 0 To numberOfColumns - 1 @@ -220,6 +253,11 @@ Public Sub HandleJob(Job As HttpJob) As DBResult Next End If In.Close +' Log("HandleJob: " & (DateTime.Now - start))'Comentado por CHV - 211112 + If jobTagAnterior <> table.Tag Then + LogColor("HandleJob: '"&table.Tag&"'" & " - Registros: " & table.Rows.Size, Colors.RGB(115, 0, 140)) 'Mod por CHV - 211109 + End If + jobTagAnterior = table.Tag 'Mod por CHV - 211109 Return table End Sub @@ -241,6 +279,7 @@ Public Sub ImageToBytes(Image As Bitmap) As Byte() out.Close Return out.ToBytesArray End Sub + 'Converts a bytes array to an image (for BLOB fields). Public Sub BytesToImage(bytes() As Byte) As Bitmap Dim In As InputStream @@ -265,8 +304,60 @@ Public Sub PrintTable(Table As DBResult) For Each record As Object In row sb.Append(record).Append(TAB) Next - ToastMessageShow(sb.ToString, True) + Log(sb.ToString) Next End Sub - \ No newline at end of file +Sub requestTimes(tag As String) As Map 'ignore + Private times As Map + times.Initialize +' Log("###### " & tag) +' Log(reqsList.IsInitialized) + If reqsList.IsInitialized Then +' Log(reqsList) +' Private pos As Int = reqsList.IndexOf(tag) + If inicioRequestMap.ContainsKey(tag) Then + inicioRequest = inicioRequestMap.Get(tag) +' Log(">>>>>>> From inicioRequestMap") + End If + If inicioJobDoneMap.ContainsKey(tag) Then + inicioJobDone = inicioJobDoneMap.Get(tag) +' Log(">>>>>>> From inicioJobDoneMap") + End If + End If +' Log($"${inicioJobDone} - ${inicioRequest}"$) + Private requestTime As String = NumberFormat2(((inicioJobDone - inicioRequest) / 1000),1,5,0,False) + Private JobDoneTime As String = NumberFormat2(((DateTime.Now - inicioJobDone) / 1000),1,5,0,False) + times.Put("request", tag) + times.Put("requestTime", requestTime) + times.Put("jobDoneTime", JobDoneTime) + times.Put("totalTime", NumberFormat2((JobDoneTime + requestTime),1,5,0,False)) + Return times +End Sub + +'Initializes request tracking +Sub trackInit 'ignore + If logger Then Log(">>>>>>>>> TRACKINIT ") + reqsList.Initialize + timesList.Initialize + inicioRequestMap.Initialize + inicioJobDoneMap.Initialize +End Sub + + +Sub trackNext(job As HttpJob) + If reqsList.IsInitialized Then 'Si tenemos lista de requests, la procesamos. + Private quitamos As String = "" + If reqsList.IndexOf(job.tag) <> -1 Then + Private pos As Int = reqsList.IndexOf(job.tag) + If pos <> -1 Then + inicioRequestMap.Put(job.Tag, timesList.Get(pos)) + reqsList.RemoveAt(pos) + timesList.RemoveAt(pos) + End If + quitamos = $"Quitamos ${job.tag} - "$ + End If + If logger Then LogColor(">>>>>> Requests: " & reqsList.Size & " - " & quitamos & reqsList, Colors.Blue) + If logger Then LogColor(">>>>>> inicioRequestMap:" & inicioRequestMap.Size & " - " & inicioRequestMap, Colors.Magenta) + End If +End Sub \ No newline at end of file diff --git a/B4A/Files/principal.bal b/B4A/Files/principal.bal index 16fea42ddacb3afe4f8cbfd87f02ff6b1ef6c890..96e11dcc91e2e93fea7a85c7a11b4a7f16aac6d4 100644 GIT binary patch delta 28 kcmcb$mGRbA#tjwWycvuP43Z2C42*C7|Np~\n~')~\n~'SetApplicationAttribute(android:icon, "@drawable/icon")~\n~'SetApplicationAttribute(android:label, "$LABEL$")~\n~'CreateResourceFromFile(Macro, Themes.LightTheme)~\n~''End of default text.~\n~'~\n~'''''' CAMBIA LA CLAVE API~\n~'AddApplicationText(~\n~'~\n~' ~\n~')~\n~'~\n~'CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~'SetApplicationAttribute(android:usesCleartextTraffic, "true")~\n~'AddManifestText()~\n~'AddPermission(android.permission.ACCESS_BACKGROUND_LOCATION)~\n~''AddManifestText()~\n~''AddManifestText()~\n~''AddManifestText() 'in order to access the device non-resettable identifiers such as IMEI and serial number.~\n~'AddManifestText()~\n~''/////////////// FLP y FBMessageing MOD Inicia /////////////////////~\n~''CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~''CreateResourceFromFile(Macro, FirebaseAnalytics.Firebase)~\n~''CreateResourceFromFile(Macro, FirebaseAnalytics.FirebaseAnalytics)~\n~''CreateResourceFromFile(Macro, FirebaseNotifications.FirebaseNotifications)~\n~'SetServiceAttribute(Tracker, android:foregroundServiceType, "location")~\n~''/////////////// FLP y FBMessageing MOD Termina /////////////////////~\n~'~\n~''Si al cargar un mapa de google mande este error "java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/ProtocolVersion". agregar la siguiente linea:~\n~'AddApplicationText()~\n~'~\n~''/////////////////////// App Updating ////////////////~\n~' AddManifestText(~\n~' )~\n~' AddApplicationText(~\n~' ~\n~' ~\n~' ~\n~' )~\n~' CreateResource(xml, provider_paths,~\n~' ~\n~' ~\n~' ~\n~' ~\n~' ~\n~' )~\n~'AddManifestText()~\n~'AddManifestText()~\n~'AddManifestText()~\n~'AddManifestText()~\n~'~\n~'AddPermission(android.permission.REQUEST_INSTALL_PACKAGES)~\n~'AddPermission(android.permission.INTERNET)~\n~'AddPermission(android.permission.INSTALL_PACKAGES)~\n~'AddPermission(android.permission.READ_EXTERNAL_STORAGE)~\n~'AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)~\n~'AddPermission(android.permission.READ_PHONE_STATE)~\n~'AddPermission(android.permission.WAKE_LOCK)~\n~'CreateResourceFromFile(Macro, JhsIceZxing1.CaturePortrait)~\n~' ~\n~'SetApplicationAttribute(android:largeHeap, "true")~\n~'~\n~'AddManifestText(~\n~' ~\n~' )~\n~' AddPermission(android.permission.MANAGE_EXTERNAL_STORAGE)~\n~' SetApplicationAttribute(android:allowBackup, "false")~\n~' ~\n~' ~\n~' AddManifestText(~\n~' )~\n~' AddPermission(android.permission.READ_EXTERNAL_STORAGE)~\n~~\n~AddManifestText(~\n~~\n~)~\n~SetApplicationAttribute(android:icon, "@drawable/icon")~\n~SetApplicationAttribute(android:label, "$LABEL$")~\n~CreateResourceFromFile(Macro, Themes.LightTheme)~\n~AddApplicationText(~\n~)~\n~CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~ 'End of default text.~\n~''''' CAMBIA LA CLAVE API~\n~AddApplicationText(~\n~~\n~ ~\n~)~\n~AddApplicationText(~\n~~\n~)~\n~AddManifestText(~\n~~\n~)~\n~''CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~ 'End of default text.~\n~ ~\n~SetApplicationAttribute(android:usesCleartextTraffic, "true")~\n~AddManifestText(~\n~~\n~)~\n~AddManifestText(~\n~~\n~)~\n~AddPermission(android.permission.ACCESS_BACKGROUND_LOCATION)~\n~AddManifestText(~\n~~\n~)~\n~AddManifestText(~\n~~\n~) 'in order to access the device non-resettable identifiers such as IMEI and serial number.~\n~~\n~'///////////////////////// FLP Y PUSH /////////////~\n~' CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~' CreateResourceFromFile(Macro, FirebaseAnalytics.Firebase)~\n~' CreateResourceFromFile(Macro, FirebaseAnalytics.FirebaseAnalytics)~\n~' CreateResourceFromFile(Macro, FirebaseNotifications.FirebaseNotifications)~\n~ SetServiceAttribute(Tracker, android:foregroundServiceType, "location")~\n~'//////////////////////////////////////////////////////~\n~~\n~'/////////////////////// App Updating ////////////////~\n~AddManifestText(~\n~ )~\n~AddApplicationText(~\n~ ~\n~ ~\n~ ~\n~ )~\n~CreateResource(xml, provider_paths,~\n~ ~\n~ ~\n~ ~\n~ ~\n~ ~\n~ )~\n~AddManifestText()~\n~AddManifestText()~\n~AddManifestText()~\n~AddManifestText()~\n~~\n~AddPermission(android.permission.REQUEST_INSTALL_PACKAGES)~\n~AddPermission(android.permission.INTERNET)~\n~AddPermission(android.permission.INSTALL_PACKAGES)~\n~AddPermission(android.permission.READ_EXTERNAL_STORAGE)~\n~AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)~\n~AddPermission(android.permission.READ_PHONE_STATE)~\n~AddPermission(android.permission.WAKE_LOCK)~\n~CreateResourceFromFile(Macro, JhsIceZxing1.CaturePortrait)~\n~ ~\n~SetApplicationAttribute(android:largeHeap, "true")~\n~~\n~AddManifestText(~\n~ )~\n~AddApplicationText(~\n~ ~\n~ ~\n~ ~\n~)~\n~CreateResource(xml, provider_paths,~\n~~\n~ ~\n~ ~\n~ ~\n~~\n~)~\n~AddPermission(android.permission.REQUEST_INSTALL_PACKAGES)~\n~AddPermission(android.permission.INTERNET)~\n~AddPermission(android.permission.INSTALL_PACKAGES)~\n~AddPermission(android.permission.READ_EXTERNAL_STORAGE)~\n~AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)~\n~AddPermission("android.permission.MANAGE_EXTERNAL_STORAGE")~\n~AddPermission(android.permission.READ_PHONE_STATE)~\n~AddPermission(android.permission.WAKE_LOCK)~\n~SetApplicationAttribute(android:allowBackup, "false")~\n~AddManifestText()~\n~AddApplicationText(~\n~~\n~ ~\n~ )~\n~AddPermission(android.permission.BLUETOOTH_ADVERTISE)~\n~AddPermission(android.permission.BLUETOOTH_CONNECT)~\n~AddPermission(android.permission.BLUETOOTH_SCAN)~\n~AddManifestText() Module1=appUpdater -Module10=C_Foto -Module11=C_Historico -Module12=C_Mapas -Module13=C_NoVenta -Module14=C_NuevoCliente -Module15=C_Pedidos -Module16=C_Principal -Module17=C_Productos -Module18=C_tabulador -Module19=C_TicketsDia +Module10=C_deviceLinker +Module11=C_Foto +Module12=C_Historico +Module13=C_Mapas +Module14=C_NoVenta +Module15=C_NuevoCliente +Module16=C_Pedidos +Module17=C_Principal +Module18=C_Productos +Module19=C_tabulador Module2=B4XMainPage -Module20=C_UpdateAvailable -Module21=CameraExClass -Module22=DBRequestManager -Module23=EscPosPrinter -Module24=foto -Module25=ManageExternalStorage -Module26=MAPA_CLIENTE -Module27=MAPA_RUTAS -Module28=Starter -Module29=Subs +Module20=C_TicketsDia +Module21=C_UpdateAvailable +Module22=CameraExClass +Module23=DBRequestManager +Module24=EscPosPrinter +Module25=foto +Module26=ManageExternalStorage +Module27=MAPA_CLIENTE +Module28=MAPA_RUTAS +Module29=Starter Module3=BatteryUtilities -Module30=Tracker +Module30=Subs +Module31=Tracker Module4=C_Buscar Module5=C_Cheklist Module6=C_Cliente @@ -209,14 +211,14 @@ Module7=C_Clientes Module8=C_Detalle_Promo Module9=C_DetalleVenta NumberOfFiles=75 -NumberOfLibraries=27 -NumberOfModules=30 +NumberOfLibraries=28 +NumberOfModules=31 Version=12.8 @EndOfDesignText@ #Region Project Attributes #ApplicationLabel: MARIANA Reparto #VersionCode: 1 - #VersionName: 6.03.03 + #VersionName: 6.03.06 'SupportedOrientations possible values: unspecified, landscape or portrait. #SupportedOrientations: portrait #CanInstallToExternalStorage: False diff --git a/B4A/Mariana_Reparto.b4a.meta b/B4A/Mariana_Reparto.b4a.meta index c442b75..1b55a7d 100644 --- a/B4A/Mariana_Reparto.b4a.meta +++ b/B4A/Mariana_Reparto.b4a.meta @@ -23,6 +23,7 @@ ModuleBookmarks28= ModuleBookmarks29= ModuleBookmarks3= ModuleBookmarks30= +ModuleBookmarks31= ModuleBookmarks4= ModuleBookmarks5= ModuleBookmarks6= @@ -54,6 +55,7 @@ ModuleBreakpoints28= ModuleBreakpoints29= ModuleBreakpoints3= ModuleBreakpoints30= +ModuleBreakpoints31= ModuleBreakpoints4= ModuleBreakpoints5= ModuleBreakpoints6= @@ -85,12 +87,13 @@ ModuleClosedNodes28= ModuleClosedNodes29= ModuleClosedNodes3= ModuleClosedNodes30= +ModuleClosedNodes31= ModuleClosedNodes4= ModuleClosedNodes5= ModuleClosedNodes6= ModuleClosedNodes7= ModuleClosedNodes8= ModuleClosedNodes9=8,9 -NavigationStack=C_Cheklist,b_guardar_Click,643,0,Diseñador Visual,checklist.bal,-100,2,Diseñador Visual,check.bal,-100,6,C_Cheklist,Camera1_PictureTaken,269,0,B4XMainPage,b_arqueocieego_Click,731,0,B4XMainPage,Class_Globals,22,0,C_Principal,connecta_Click,1946,0,C_Principal,JobDone,1736,0,C_Principal,cargar____Click,1055,0,C_Principal,cargar_Click,1053,0 +NavigationStack=C_Principal,connecta_Click,1976,0,C_Principal,B4XPage_CloseRequest,1958,0,C_Principal,b_venta_emp_Click,2406,0,C_deviceLinker,GetDeviceGUID,165,0,C_deviceLinker,JobDone,223,0,C_Principal,cargar_Click,1066,0,C_Principal,JobDone,1772,0,C_Principal,e_ruta_EnterPressed,2046,0,C_deviceLinker,verifyDevice,118,0,C_Principal,Linker_Response,2455,6 SelectedBuild=0 -VisibleModules=28,2,3,4,5,6,7,8,9,10,16,29,1 +VisibleModules=29,2,3,4,5,6,7,8,9,11,17,10 diff --git a/B4A/Starter.bas b/B4A/Starter.bas index 89d59dc..b53fb59 100644 --- a/B4A/Starter.bas +++ b/B4A/Starter.bas @@ -34,6 +34,7 @@ Sub Process_Globals Dim cedisLocation As Location Dim reqManager As DBRequestManager Dim server As String = "http://keymon.net:1781" + Dim DBReqServer As String = "http://keymon.net:1781" ' Dim server As String = "http://192.168.100.10:1781" ' Dim server As String = "http://keymon.lat:9000" ' Dim server = "http://192.168.100.10:1781" diff --git a/B4A/Subs.bas b/B4A/Subs.bas index 5f9f028..180935c 100644 --- a/B4A/Subs.bas +++ b/B4A/Subs.bas @@ -1044,4 +1044,21 @@ Sub logJobDoneResultados(resultado As DBResult) LogColor(k & " = " & records(resultado.Columns.Get(k)), Colors.RGB(215,37,0)) Next Next +End Sub + +Sub deshabilitaValidaciones + Log("Deshabilitamos VERIFY_DEVICE") + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("VERIFY_DEVICE")) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("VERIFY_DEVICE", 0)) + Log("Deshabilitamos VALIDA_VERSION") +' Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("VALIDA_VERSION")) +' Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("VALIDA_VERSION", 0)) + Log("Espeificamos LIGADO") + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("LIGADO")) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("LIGADO", 1)) +' B4XPages.MainPage.principal.Btn_CheckList.Enabled = True +' B4XPages.MainPage.principal.trabajar.Enabled = True +' B4XPages.MainPage.principal.Resumen.Enabled = True +' B4XPages.MainPage.principal.BUSCA.Enabled = True + ToastMessageShow("REALIZADO", False) End Sub \ No newline at end of file