diff --git a/B4A/C_Cliente.bas b/B4A/C_Cliente.bas
index 01fd342..189a873 100644
--- a/B4A/C_Cliente.bas
+++ b/B4A/C_Cliente.bas
@@ -149,6 +149,7 @@ Sub Class_Globals
Dim j As Cursor
Dim h As Cursor
Dim distance As Long
+ Dim cuest As C_Cuestionario
End Sub
'You can add more parameters here.
@@ -162,7 +163,7 @@ Private Sub B4XPage_Created (Root1 As B4XView)
'load the layout to Root
' Activity.RemoveAllViews
Root.LoadLayout("cliente")
- Log("Create")
+ cuest.Initialize(Me, "cuest", Root, Starter.skmt)
ruta = File.DirInternal
If File.Exists(ruta, "kmt.db") = False Then
File.Copy(File.DirAssets, "kmt.db", ruta, "kmt.db")
@@ -414,6 +415,11 @@ End Sub
Sub gest_Click
B4XPages.MainPage.tipo_venta = "PREVENTA"
+ Log($"${cuest.encuestaIniciada} - ${cuest.clienteConCuestionario(Subs.traeCliente)}"$)
+ If Not(cuest.encuestaIniciada) And Not(cuest.clienteConCuestionario(Subs.traeCliente)) Then
+ cuest.agregaPregunta("1", "¿Se puede acceder al negocio o está enrejado?", Array As String("No, está enrejado o no se tiene acceso", "Si se pude acceder"))
+ Return False
+ End If
Private x As Cursor = B4XPages.MainPage.skmt.ExecQuery($"select tienda_id from COORDENADAS_GPS where tienda_id = '${la_cuenta.text}'"$)
' Log("+++++++++++++ " & x.RowCount)
If distance > 50 And x.RowCount = 0 Then
@@ -445,6 +451,8 @@ Private Sub B4XPage_CloseRequest As ResumableSub
' BACK key pressed
' Return True To close, False To cancel
' Log($"venimosDeTicketsDia=${venimosDeTicketsDia}"$)
+ cuest.encuestaIniciada = False
+ cuest.ocultPanelPregunta
If IsNumber(l_total.text) And Not(Subs.pedidoGuardado) Then
LogColor("Hay Venta", Colors.Red)
Private resultado1 As Int = Msgbox2($"Va salir sin haber guardado la venta, si continua, la venta se BORRARA.${CRLF}${CRLF}¿Esta seguro que desea continuar?"$, "SE VA A BORRAR LA VENTA", "Borrar Venta", "Guardar Venta", "", LoadBitmap(File.DirAssets,"alert2.png"))
@@ -1058,3 +1066,68 @@ Sub CreateListItem(mostrar As String, mostrar1 As String) As Panel
Return p
End Sub
+Sub cuest_preguntaContestada(m As Map)
+' Recibimos el id de la pregunta, el id de la respuesta, el texto de la respuesta y el objeto del panelSombra para poder ocultarlo.
+ Log(m)
+' If q.IsInitialized Then Log($"${q.encuestaIniciada}|${q.preguntaActual}"$)
+' m.Get("panel").As(Panel).Visible = False 'Ocultamos el panel de la pregunta.
+ m.Get("panel").As(Panel).RemoveView 'Quitamos le panel de la pregunta
+ DateTime.DateFormat = "dd/MM/yyyy"
+ DateTime.TimeFormat = "HH:mm:ss"
+ Starter.skmt.ExecNonQuery($"delete from CUESTIONARIO where Q_IDCLIENTE = '${Subs.traeCliente}' and Q_IDPREGUNTA = '${m.Get("idPregunta")}'"$)
+ Starter.skmt.ExecNonQuery($"insert into CUESTIONARIO (Q_IDCLIENTE, Q_IDPREGUNTA, Q_PREGUNTA, Q_IDRESPUESTA, Q_RESPUESTA, Q_FECHA) values ('${Subs.traeCliente}', '${m.Get("idPregunta")}', '${m.Get("pregunta")}', '${m.Get("idRespuesta")}', '${m.Get("respuesta")}', '${DateTime.Date(DateTime.now)} ${DateTime.time(DateTime.now)}')"$)
+ Select Case m.Get("idPregunta")
+ Case "1"
+ If m.Get("respuesta") = "No, está enrejado o no se tiene acceso" Then
+ Log("Tiendajon / Ventana / Kiosko")
+ ToastMessageShow("Tiendajon / Ventana / Kiosko", False)
+ cuest.agregaPregunta("6", "¿Cuenta con caja de salida para cobro con sistema de computo?", Array As String("Si, tiene sistema de computo para cobro", "No"))
+ Else if m.Get("respuesta") = "Si se pude acceder" Then
+ cuest.agregaPregunta("2", "¿Tiene al menos 2 pasillos con acceso directo a la mercancía?", Array As String("Si tiene al menos 2 pasillos con acceso directo a la mercancía", "No tiene pasillos o solo uno central"))
+ End If
+ Case "2"
+ If m.Get("respuesta") = "Si tiene al menos 2 pasillos con acceso directo a la mercancía" Then
+ Log("Mini-Super")
+ ToastMessageShow("Mini-Super", False)
+ cuest.agregaPregunta("6", "¿Cuenta con caja de salida para cobro con sistema de computo?", Array As String("Si, tiene sistema de computo para cobro", "No"))
+ else If m.Get("respuesta") = "No tiene pasillos o solo uno central" Then
+ cuest.agregaPregunta("3", "¿Cuenta con enfriador horizontal para venta de perecederos como queso, jamon, crema, etc.?", Array As String("Si", "No tiene enfriador horizontal."))
+ End If
+ Case "3"
+ Log("|"&m.Get("respuesta")&"|")
+ If m.Get("respuesta") = "Si" Then
+ Log("Miscelanea")
+ ToastMessageShow("Miscelanea", False)
+ cuest.agregaPregunta("6", "¿Cuenta con caja de salida para cobro con sistema de computo?", Array As String("Si, tiene sistema de computo para cobro", "No"))
+ else If m.Get("respuesta") = "No tiene enfriador horizontal." Then
+ cuest.agregaPregunta("4", "¿El local esta enfocado a venta especializada?", Array As String("No", "Si"))
+ End If
+ Case "4"
+ If m.Get("respuesta") = "No" Then
+ Log("Abarrotera")
+ ToastMessageShow("Abarrotera", False)
+ cuest.agregaPregunta("6", "¿Cuenta con caja de salida para cobro con sistema de computo?", Array As String("Si, tiene sistema de computo para cobro", "No"))
+ else If m.Get("respuesta") = "Si" Then
+ cuest.agregaPregunta("5", "¿Cual venta especializada?", Array As String("Carnicería / Pollería", "Cremería", "Depósito / Vinateria", "Dulcería", "Farmacia", "Fonda / Restaurante / Cafetería", "Verdulería"))
+ End If
+ Case "5"
+ Log(m.Get("respuesta"))
+ ToastMessageShow(m.Get("respuesta"), False)
+' If m.Get("respuesta") = "No" Then
+' Log("Abarrotera")
+' q.agregaPregunta("5", "¿Cuenta con caja de salida para cobro con sistema de computo?", Array As String("Si, tiene sistema de computo para cobro", "No"))
+' else If m.Get("respuesta") = "Si" Then
+ cuest.agregaPregunta("6", "¿Cuenta con caja de salida para cobro con sistema de computo?", Array As String("Si, tiene sistema de computo para cobro", "No"))
+' End If
+ Case "6"
+ Log(m.Get("respuesta"))
+ ToastMessageShow(m.Get("respuesta"), False)
+ Log(">>>>>>>>>> " & cuest.encuestaIniciada)
+ cuest.encuestaIniciada = False
+ Log(">>>>>>>>>> " & cuest.encuestaIniciada)
+' refrescarCliente = True
+' Log($"#### REFRESCAR CLIENTE -> ${refrescarCliente}"$)
+ B4XPage_Appear
+' Case 6
+ End Select
+End Sub
diff --git a/B4A/C_Cuestionario.bas b/B4A/C_Cuestionario.bas
new file mode 100644
index 0000000..7015b09
--- /dev/null
+++ b/B4A/C_Cuestionario.bas
@@ -0,0 +1,155 @@
+B4A=true
+Group=Default Group
+ModulesStructureVersion=1
+Type=Class
+Version=12.2
+@EndOfDesignText@
+Sub Class_Globals
+ Private Root As B4XView 'ignore
+ Private xui As XUI 'ignore
+ Private bAceptarPregunta As Button
+ Dim encuestaIniciada As Boolean = False
+ Private Root2 As B4XView
+ Private EventName As String 'ignore
+ Private CallBack As Object 'ignore
+ Private vPreguntaActual As String
+ Private db As SQL
+ Private clienteAnt As String = ""
+ Dim panelSombra As Panel 'Panel de sombra.
+End Sub
+
+'You can add more parameters here.
+Public Sub Initialize (vCallback As Object, vEventName As String, vRoot As B4XView, skmt As SQL) As Object
+ Root2 = vRoot
+ EventName = vEventName
+ CallBack = vCallback
+ db = skmt
+ vPreguntaActual = 0
+ db.ExecNonQuery("CREATE TABLE IF NOT EXISTS CUESTIONARIO (Q_IDCLIENTE TEXT, Q_IDPREGUNTA TEXT, Q_PREGUNTA TEXT, Q_IDRESPUESTA TEXT, Q_RESPUESTA TEXT, Q_FECHA TEXT)")
+ Return Me
+End Sub
+
+'This event will be called once, before the page becomes visible.
+Private Sub B4XPage_Created (Root1 As B4XView)
+ Root = Root1
+ 'load the layout to Root
+End Sub
+
+'Regresa verdadero o falso dependiendo de si ya se inició la encuesta.
+'Sub encuestaIniciada As Boolean
+' Return vEncuestaIniciada
+'End Sub
+
+'Regresa el Id de la pregunta actual (read-only).
+Sub preguntaActual As String 'ignore
+ Return vPreguntaActual
+End Sub
+
+'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.
+
+'Muestra una pregunta con sus posibles respuestas.
+' La lista de respuestas puede ser directamente un array p. ej. Array As String("value1", "value2")
+' Crear un Sub_Click con el nombre del evento para que reciba un mapa con la respuesta p. ej.: Sub questionario_Click
+' Regresa un mapa con:
+' idPregunta - El Id especificado de la pregunta.
+' pregunta - El texto de la pregunta.
+' idRespuesta - Un numero consecutivo empezando en 1 por cada pregunta.
+' respuesta - El texto de la respuesta.
+' panel - El panel del popup para poder ocultarlo al contestar la pregunta. ( p. ej.: m.Get("panel").As(Panel).Visible = false )
+'###########################################
+' Sub questionario_Click
+' if m.get("idPregunta") = "1" ..Then .. Else con nuevas preguntas
+' End Sub
+'###########################################
+Sub agregaPregunta(id As String, pregunta As String, respuestas As List)
+ encuestaIniciada = True
+ vPreguntaActual = id
+ bAceptarPregunta.Initialize("bAceptarPregunta")
+
+ Private su As StringUtils
+ panelSombra.Initialize("pSombra")
+ Private cd As ColorDrawable
+ cd.Initialize(Colors.ARGB(125, 98, 98, 98), 0)
+ panelSombra.Background = cd
+ Private panelX As Panel 'Panel de la pregunta.
+ panelX.Initialize("pQuest")
+ Private lbl As Label 'Etiqueta de la pregunta.
+ lbl.Initialize("")
+ lbl.Text = pregunta
+ lbl.TextSize = 16
+ lbl.TextColor = Colors.Black
+ cd.Initialize2(Colors.white, 20, 1, Colors.Gray) 'Borde y esquinas redondeadas del panel de la pregunta.
+ panelX.Background = cd
+ panelSombra.AddView(panelX, 10dip, 0dip, 80%x, 200dip)
+ Root2.AddView(panelSombra, 0, 0, 100%x, 100%y) 'add the panel to the layout
+ panelX.AddView(lbl, 20dip, 20dip, (panelX.Width * 0.9), 40dip) 'Agregamos la etiqueta al panel.
+ lbl.Height = su.MeasureMultilineTextHeight(lbl, lbl.Text)
+ Private r(respuestas.Size) As RadioButton
+ For p = 0 To respuestas.Size - 1
+ r(p).Initialize("r")
+ r(p).Text = respuestas.Get(p)
+ r(p).Tag = CreateMap("id":id, "pregunta":pregunta, "panel":panelSombra, "idRespuesta":p + 1)
+ panelX.AddView(r(p), 10dip, (70 * (p + 1)), (panelX.Width * 0.9), 10) 'Agegamos el radio al panel.
+ r(p).Height = su.MeasureMultilineTextHeight(r(p), r(p).Text) + 25 'Calculamos el alto del radio de acuerdo al largo del texto.
+ Private newTop As Int = lbl.top + lbl.Height + 10 'Si es el primer radio, lo ponemos en top = alto de la "pregunta" + 10.
+ If p <> 0 Then newTop = r(p - 1).Top + r(p - 1).Height + 5 'Calculamos el Top del radio de acuerdo al top y alto del radio anterior.
+ r(p).Top = newTop
+ Next
+ r(0).Checked = True
+ bAceptarPregunta.Text = "Continuar"
+ panelX.AddView(bAceptarPregunta, 10, newTop + r(respuestas.Size - 1).Height + 20, 150dip, 50dip) 'Ponemos el boton de continuar despues del ultimo radio.
+ bAceptarPregunta.Left = (panelX.Width / 2) - (bAceptarPregunta.Width / 2)
+ panelX.Height = bAceptarPregunta.Top + bAceptarPregunta.Height + 15dip 'Calculamos el alto del panel de acuerdo al Top del boton.
+ panelX.left = (Root2.Width / 2) - (panelX.Width / 2)
+ panelX.top = (Root2.Height / 3) - (panelX.Height / 2)
+ panelSombra.Width = Root2.Width
+ panelSombra.Height = Root2.Height
+ panelSombra.Elevation = 100
+ panelSombra.BringToFront
+' panelSombra.Elevation = 0
+End Sub
+
+private Sub preguntaContestada(Success As Map) 'ignore
+ If SubExists(CallBack, EventName & "_preguntaContestada") Then
+ CallSubDelayed2(CallBack, EventName & "_preguntaContestada", Success)
+ End If
+End Sub
+
+private Sub pSombra_Click
+End Sub
+
+private Sub r_CheckedChange(Checked As Boolean)
+ bAceptarPregunta.tag = CreateMap("idPregunta":Sender.As(RadioButton).tag.As(Map).Get("id").As(String), "pregunta":Sender.As(RadioButton).tag.As(Map).Get("pregunta"), "idRespuesta":Sender.As(RadioButton).tag.As(Map).Get("idRespuesta").As(String), "respuesta":Sender.As(RadioButton).text, "panel":Sender.As(RadioButton).tag.As(Map).Get("panel"))
+End Sub
+
+Private Sub bAceptarPregunta_Click
+ encuestaIniciada = True
+ Private m As Map = Sender.As(Button).tag.As(Map) 'Recibimos el id de la pregunta, el id de la respuesta, el texto de la respuesta y el objeto del panelSombra para poder ocultarlo.
+ preguntaContestada(m)
+'' m.Get("panel").As(Panel).Visible = False 'Ocultamos el panel de la pregunta.
+' m.Get("panel").As(Panel).RemoveView
+' If m.Get("idPregunta") = "1" And m.Get("respuesta") = "No, está enrejado o no se tiene acceso" Then
+' Log("Tiendajon / Ventana / Kiosko")
+' else If m.Get("idPregunta") = "1" And m.Get("respuesta") = "Si se pude acceder" Then
+' agregaPregunta("2", "¿Tiene al menos 2 pasillos con acceso directo a la mercancía?", Array As String("Si tiene al menos 2 pasillos con acceso directo a la mercancía", "No tiene pasillos o solo uno central"))
+' End If
+' If m.Get("idPregunta") = "2" And m.Get("respuesta") = "Si tiene al menos 2 pasillos con acceso directo a la mercancía" Then
+' Log("Mini-Super")
+' else If m.Get("idPregunta") = "2" And m.Get("respuesta") = "No tiene pasillos o solo uno central" Then
+' agregaPregunta("3", "¿Cuenta con enfriador horizontal para venta de perecederos como queso, jamon, crema, etc.?", Array As String("Si", "No tiene enfriador horizontal. ¿El local esta enfocado a venta especializada?"))
+' End If
+End Sub
+
+'Regresa verdadero si el cliente dado tiene cuestionario contestado.
+Sub clienteConCuestionario(idCliente As String) As Boolean 'ignore
+ Private r As Boolean = False
+ Private c As Cursor = db.ExecQuery($"select count(*) as q from CUESTIONARIO where Q_IDCLIENTE = '${idCliente}'"$)
+ c.Position = 0
+ If c.GetInt("q") > 0 Then r = True
+ Return r
+End Sub
+
+'Oculta el anel de la pregunta.
+Sub ocultPanelPregunta
+ If panelSombra.IsInitialized Then panelSombra.RemoveView
+End Sub
\ No newline at end of file
diff --git a/B4A/C_Principal.bas b/B4A/C_Principal.bas
index 48cc49e..6108c57 100644
--- a/B4A/C_Principal.bas
+++ b/B4A/C_Principal.bas
@@ -581,7 +581,7 @@ Sub Subir_Click
'ELSE IF c.GetString("DESCUENTO") = 0 Then
PASO = 1
'End If
- If PASO =1 Then
+ If PASO = 1 Then
B4XPages.MainPage.skmt.ExecNonQuery2("delete from PEDIDO WHERE PE_PRONOMBRE = ? ", Array As Object("N/A") )
B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE not In (select PE_CLIENTE from pedido)")
c=B4XPages.MainPage.skmt.ExecQuery("select usuario from usuarioa")
@@ -745,6 +745,23 @@ Sub Subir_Click
img2.Visible =True
PORCENTAJE = Round(100/ (cuantos_noventa + cuantos_pedido + cuantos_pedidosc + 1))
If Starter.marcaCel <> "Sony" Then ToastMessageShow("Se Actualizaran los datos, Este proceso podria tardar hasta un minuto, gracias "& l_ruta.text , True)
+
+
+ 'CUESTIONARIOS
+ c = B4XPages.MainPage.skmt.ExecQuery($"select * from cuestionario"$)
+ Private rutaActual As String = Subs.traeRuta
+ If c.RowCount > 0 Then
+ For x = 0 To c.RowCount - 1
+ c.Position = x
+ Dim cmd As DBCommand
+ cmd.Initialize
+ cmd.Name = "insert_CUESTIONARIO_DUR"
+ cmd.Parameters = Array As Object(c.GetString("Q_IDCLIENTE"), rutaActual, ALMACEN, c.GetString("Q_FECHA"), c.GetString("Q_IDPREGUNTA"), c.GetString("Q_PREGUNTA"), c.GetString("Q_IDRESPUESTA"), C.GetString("Q_RESPUESTA"))
+ B4XPages.MainPage.reqManager.ExecuteCommand(cmd , "ins_cuestionario")
+ Next
+ End If
+ c.Close
+
End If
End Sub
@@ -1720,8 +1737,12 @@ Sub JobDone(Job As HttpJob)
Next
End If
End If
-
End If
+
+ If RESULT.Tag = "ins_cuestionario" Then 'query tag
+ Subs.logJobDoneResultados(RESULT)
+ End If
+
Job.Release
End Sub
diff --git a/B4A/INTMEX_LL.b4a b/B4A/INTMEX_LL.b4a
index 2ac8b56..b61195a 100644
--- a/B4A/INTMEX_LL.b4a
+++ b/B4A/INTMEX_LL.b4a
@@ -127,35 +127,36 @@ Library8=compressstrings
Library9=contentresolver
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~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~SetApplicationAttribute(android:usesCleartextTraffic, "true")~\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~ )
Module1=appUpdater
-Module10=C_NuevoCliente
-Module11=C_Pedidos
-Module12=C_Principal
-Module13=C_Productos
-Module14=C_Promos
-Module15=C_RespaldoDiario
-Module16=C_Subs
-Module17=C_TicketsDia
-Module18=C_UpdateAvailable
-Module19=DBRequestManager
+Module10=C_NoVenta
+Module11=C_NuevoCliente
+Module12=C_Pedidos
+Module13=C_Principal
+Module14=C_Productos
+Module15=C_Promos
+Module16=C_RespaldoDiario
+Module17=C_Subs
+Module18=C_TicketsDia
+Module19=C_UpdateAvailable
Module2=B4XMainPage
-Module20=FileHandler
-Module21=ManageExternalStorage
-Module22=MAPA_RUTAS
-Module23=NotificationService
-Module24=Pendientes
-Module25=Starter
-Module26=Subs
-Module27=Tracker
+Module20=DBRequestManager
+Module21=FileHandler
+Module22=ManageExternalStorage
+Module23=MAPA_RUTAS
+Module24=NotificationService
+Module25=Pendientes
+Module26=Starter
+Module27=Subs
+Module28=Tracker
Module3=BatteryUtilities
Module4=C_Cliente
Module5=C_Clientes
-Module6=C_Historico
-Module7=C_Mapas
-Module8=C_Nota
-Module9=C_NoVenta
+Module6=C_Cuestionario
+Module7=C_Historico
+Module8=C_Mapas
+Module9=C_Nota
NumberOfFiles=46
NumberOfLibraries=33
-NumberOfModules=27
+NumberOfModules=28
Version=12.5
@EndOfDesignText@
#Region Project Attributes
diff --git a/B4A/INTMEX_LL.b4a.meta b/B4A/INTMEX_LL.b4a.meta
index d00415a..6e40276 100644
--- a/B4A/INTMEX_LL.b4a.meta
+++ b/B4A/INTMEX_LL.b4a.meta
@@ -19,6 +19,7 @@ ModuleBookmarks24=
ModuleBookmarks25=
ModuleBookmarks26=
ModuleBookmarks27=
+ModuleBookmarks28=
ModuleBookmarks3=
ModuleBookmarks4=
ModuleBookmarks5=
@@ -47,6 +48,7 @@ ModuleBreakpoints24=
ModuleBreakpoints25=
ModuleBreakpoints26=
ModuleBreakpoints27=
+ModuleBreakpoints28=
ModuleBreakpoints3=
ModuleBreakpoints4=
ModuleBreakpoints5=
@@ -58,10 +60,10 @@ ModuleClosedNodes0=
ModuleClosedNodes1=
ModuleClosedNodes10=
ModuleClosedNodes11=
-ModuleClosedNodes12=1,7
-ModuleClosedNodes13=9,11
-ModuleClosedNodes14=9,10
-ModuleClosedNodes15=
+ModuleClosedNodes12=
+ModuleClosedNodes13=1,7
+ModuleClosedNodes14=9,11
+ModuleClosedNodes15=9,10
ModuleClosedNodes16=
ModuleClosedNodes17=
ModuleClosedNodes18=
@@ -69,19 +71,20 @@ ModuleClosedNodes19=
ModuleClosedNodes2=
ModuleClosedNodes20=
ModuleClosedNodes21=
-ModuleClosedNodes22=2
-ModuleClosedNodes23=
-ModuleClosedNodes24=1
-ModuleClosedNodes25=
-ModuleClosedNodes26=49,50,52,53,55,58,61
-ModuleClosedNodes27=
+ModuleClosedNodes22=
+ModuleClosedNodes23=2
+ModuleClosedNodes24=
+ModuleClosedNodes25=1
+ModuleClosedNodes26=
+ModuleClosedNodes27=49,50,52,53,55,58,61
+ModuleClosedNodes28=
ModuleClosedNodes3=
ModuleClosedNodes4=
ModuleClosedNodes5=3
ModuleClosedNodes6=
ModuleClosedNodes7=
-ModuleClosedNodes8=1
-ModuleClosedNodes9=
-NavigationStack=C_Productos,b_terminar1_Click,606,0,C_Productos,b_prodMas_Click,513,0,C_Cliente,JobDone,902,0,C_Cliente,mandaPendientes,884,0,B4XMainPage,b_apk_Click,655,0,Diseñador Visual,login.bal,-100,4,B4XMainPage,muestraProgreso,656,0,Starter,Process_Globals,26,0,appUpdater,download_newApk,164,0,B4XMainPage,B4XPage_Appear,248,0,B4XMainPage,B4XPage_Created,141,0
+ModuleClosedNodes8=
+ModuleClosedNodes9=1
+NavigationStack=C_Cliente,Class_Globals,145,0,C_Cliente,B4XPage_Created,158,0,Visual Designer,cliente.bal,-100,1,C_Cliente,b_venta_Click,722,0,C_Cliente,gest_Click,411,0,C_Cliente,B4XPage_CloseRequest,448,0,C_Cliente,CreateListItem,1060,0,C_Cliente,cuest_preguntaContestada,1064,0,C_Principal,Class_Globals,0,0,C_Principal,Subir_Click,739,0,C_Principal,JobDone,1737,0
SelectedBuild=0
-VisibleModules=2,25,23,12,15,13,4,26,14,8
+VisibleModules=2,26,24,13,16,14,4,27,15,9