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 16fea42..96e11dc 100644
Binary files a/B4A/Files/principal.bal and b/B4A/Files/principal.bal differ
diff --git a/B4A/Mariana_Reparto.b4a b/B4A/Mariana_Reparto.b4a
index f0c1128..317fa6b 100644
--- a/B4A/Mariana_Reparto.b4a
+++ b/B4A/Mariana_Reparto.b4a
@@ -168,8 +168,9 @@ Library22=sql
Library23=togglelibrary
Library24=xcustomlistview
Library25=xui
-Library26=zxing_scanner
-Library27=xui views
+Library26=xui views
+Library27=zxing_scanner
+Library28=keyvaluestore2
Library3=baqrcode
Library4=byteconverter
Library5=camera
@@ -179,29 +180,30 @@ Library8=fileprovider
Library9=fusedlocationprovider
ManifestCode='This code will be applied to the manifest file during compilation.~\n~'You do not need to modify it in most cases.~\n~'See this link for for more information: https://www.b4x.com/forum/showthread.php?p=78136~\n~'AddManifestText(~\n~'~\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