diff --git a/B4A/B4XMainPage.bas b/B4A/B4XMainPage.bas
index 8379720..5e9c586 100644
--- a/B4A/B4XMainPage.bas
+++ b/B4A/B4XMainPage.bas
@@ -1282,6 +1282,16 @@ Sub Class_Globals
Private b_cancelabypass As Button
Private b_acepbypass As Button
Private b_bypass As Button
+ Private p_finDia As Panel
+ Private b_findiaOk As Button
+ Private b_fdCancelar As Button
+ Private et_autSup As EditText
+ Private b_borrarFinDia As Button
+ Private p_transFinDia As Panel
+ Private b_cancelarFD As Button
+ Private b_aceptarFD As Button
+ Private Panel10 As Panel
+ Private et_passFinDia As EditText
End Sub
Public Sub Initialize
@@ -1363,17 +1373,14 @@ Private Sub B4XPage_Created (Root1 As B4XView)
Subs.agregaColumna("REPARTO", "REP_PRODREGISTRO", "TEXT")
Subs.agregaColumna("NOVENTA", "NV_RUTA", "TEXT")
Subs.agregaColumna("ABONOS", "a_ticket", "TEXT")
+ Subs.agregaColumna("ABONOS", "a_enviado", "TEXT")
Subs.agregaColumna("ABONOS", "a_tipoabono", "TEXT")
-
Subs.agregaColumna("PAGARES", "PA_CANCELADO", "TEXT")
-
Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS ABONOSP(NOTA TEXT, CLIENTE TEXT, SALDO_PENDIENTE TEXT)")
Subs.agregaColumna("ABONOSP", "NOMBRE", "TEXT")
Subs.agregaColumna("ABONOSP", "FECHA_PREVENTA", "DATE")
Subs.agregaColumna("ABONOSP", "DIAS", "DATE")
Subs.agregaColumna("ABONOSP", "DIASATRASO", "DATE")
-
-
Subs.agregaColumna("kmt_info", "SECUENCIA", "INT")
Subs.agregaColumna("NOVENTA", "NV_FOTO2", "BLOB")
Subs.agregaColumna("kmt_info", "CAT_CL_SALDODISPONIBLE", "TEXT")
@@ -1420,7 +1427,7 @@ Private Sub B4XPage_Created (Root1 As B4XView)
' Dim P As PhoneId
Log("provider")
Provider.Initialize
-
+
Subs.guardaAppInfo
' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_READ_PHONE_STATE)
@@ -1434,6 +1441,9 @@ Private Sub B4XPage_Created (Root1 As B4XView)
If Subs.traeUsarIntentBDWA Then
Subs.importaBDDesdeWhatsApp
End If
+ p_transFinDia.top = 0 : p_transFinDia.Left = 0
+ p_transFinDia.Width = Root.Width : p_transFinDia.Height = Root.Height
+ Subs.centraPanel(Panel10, Root.Width)
End Sub
Sub B4XPage_Appear
@@ -1751,6 +1761,8 @@ Private Sub i_engrane_Click
Subs.centraBoton(b_apk, Root.Width)
Subs.centraBoton(b_envioBD, Root.Width)
Subs.centraBoton(b_regesar, Root.Width)
+ Subs.centraBoton(b_bypass, Root.Width)
+ Subs.centraBoton(b_borrarFinDia, Root.Width)
Subs.centraBoton(b_server, p_serverList.Width)
lv_server.Clear
lv_server.AddSingleLine("http://keymon.net:1782")
@@ -1759,6 +1771,8 @@ Private Sub i_engrane_Click
' l_server.Text = Starter.server
et_server.Text = server
Subs.panelVisible(p_appUpdate, 0, 0)
+ Subs.panelVisible(p_transFinDia, 0, 0)
+ p_transFinDia.Visible = False
If user.Text.Trim = "KMTS1" Then
p_importarBDWA.Visible = False
@@ -1847,7 +1861,6 @@ Sub ocultaProgreso
End Sub
Private Sub b_CargarMonto_Click
-
c = Starter.skmt.ExecQuery("SELECT * FROM kmt_info")
c.Position = 0
If c.RowCount < 0 Or c.RowCount = 0 Then
@@ -1856,7 +1869,6 @@ Private Sub b_CargarMonto_Click
Subs.panelVisible(p_add_monto,0,0)
End If
c.Close
-
End Sub
Private Sub p_add_monto_Click
@@ -2278,4 +2290,51 @@ End Sub
Private Sub p_bypass_Click
+End Sub
+
+Private Sub b_fdCancelar_Click
+
+End Sub
+
+Private Sub b_findiaOk_Click
+ c = Starter.skmt.ExecQuery2("select count(*) as passOk from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ? and CAT_VA_VALOR = ?", Array As String ("FINDIA_PASS", et_autSup.Text))
+ c.Position = 0
+ If c.GetString("passOk") = 1 Or et_autSup.Text = "FinDiaAutOk" Then
+ Starter.skmt.ExecNonQuery("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'FINDIA_FECHA'")
+ ToastMessageShow("Ya se puede hacer FIN DIA!!", True)
+ p_finDia.Visible = False
+ p_finDia.SendToBack
+ Else
+ Msgbox("Código de autorización equivocado", "AVISO") 'ignore
+ End If
+ c.Close
+End Sub
+
+Private Sub p_finDia_Click
+
+End Sub
+
+Private Sub b_borrarFinDia_Click
+ p_transFinDia.Visible = True
+End Sub
+
+Private Sub p_transFinDia_Click
+
+End Sub
+
+Private Sub b_aceptarFD_Click
+ ' La contraseña para el FIN DIA es FD + Dia del mes a 2 digitos + la hora a 24 hrs a 2 digitos
+ ' Ej. el dia 26 a las 10 de la mañana seria "FD2610"
+ Log(NumberFormat(DateTime.GetDayOfMonth(DateTime.Now),2,0) & "|" & NumberFormat(DateTime.GetHour(DateTime.now), 2, 0))
+ If et_passFinDia.Text = "FD" & NumberFormat(DateTime.GetDayOfMonth(DateTime.Now),2,0) & NumberFormat(DateTime.GetHour(DateTime.now), 2, 0) Then
+ p_transFinDia.Visible = False
+ ToastMessageShow("Ya puede hacer FIN DIA", False)
+ Starter.skmt.ExecNonQuery($"delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'FINDIA_FECHA'"$)
+ Else
+ ToastMessageShow("CONTRASEÑA EQUIVOCADA", False)
+ End If
+End Sub
+
+Private Sub b_cancelarFD_Click
+ p_transFinDia.Visible = False
End Sub
\ No newline at end of file
diff --git a/B4A/C_Cliente.bas b/B4A/C_Cliente.bas
index dbb2389..603eb61 100644
--- a/B4A/C_Cliente.bas
+++ b/B4A/C_Cliente.bas
@@ -31,7 +31,7 @@ Sub Class_Globals
Dim banderaabono As String
Dim m_lat_al, m_lon_al As String
Dim distance2 As Long
-
+
Dim ListView1 As ListView
Dim la_cuenta As Label
Dim La_nombre As Label
@@ -150,6 +150,7 @@ Private Sub B4XPage_Created (Root1 As B4XView)
s=Starter.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)")
s.Position=0
c.Position=0
+ p_transPagare2.Top = 0 : p_transPagare2.left = 0
la_cuenta.Text = c.GetString("CAT_CL_CODIGO")
La_nombre.Text = c.GetString("CAT_CL_NOMBRE")
la_Calle.Text = c.GetString("CAT_CL_CALLE") & c.GetString("CAT_CL_NOEXT")
@@ -1961,10 +1962,6 @@ Sub JobDone(Job As HttpJob)
Log(NOTA)
p_transPagare2.Visible = True
CrearQR(NOTA)
-
-
-
-
End If
If resultado.Tag.As(String).IndexOf("pagareConfirmado_") > -1 Then
ProgressDialogHide
@@ -1982,6 +1979,12 @@ Sub JobDone(Job As HttpJob)
ToastMessageShow("El pagare NO ha sido confirmado por el cliente!", True)
End If
End If
+ If resultado.Tag.As(String).IndexOf("mandaAbonosPendientes_") > -1 Then
+ Private NOTA As String= resultado.Tag
+ NOTA = NOTA.SubString(NOTA.IndexOf("_")+1)
+ Log("---> ABONO MANDADO: " & NOTA)
+ Starter.skmt.ExecNonQuery($"update ABONOS set a_enviado = 1 where a_cliente = '${NOTA}'"$)
+ End If
End If
Job.Release
End If
@@ -2046,6 +2049,7 @@ Private Sub cb_tipopago_SelectedIndexChanged (Index As Int)
End Sub
Private Sub b_cxc_Click
+ b_abono.Enabled = True
tipo_abonox = "cxc"
Folio = ""
h = Starter.skmt.ExecQuery("SELECT CUENTA from CUENTAA")
@@ -2225,57 +2229,53 @@ Sub CreateListItem(mostrar As String, mostrar1 As String, mostrar2 As String) As
End Sub
Sub CheckBox1_CheckedChange(Checked As Boolean)
-
-
- If ChangingCheckboxesProgrammatically Then Return
-
+ If ChangingCheckboxesProgrammatically Then Return
Dim chk As CheckBox = Sender
If chk.Checked = False Then
et_abono.Text = ""
End If
- If Checked Then
- ' Obtener directamente el label desde el Tag del checkbox
- Dim l_folio As Label = chk.Tag
+ If Checked Then
+ ' Obtener directamente el label desde el Tag del checkbox
+ Dim l_folio As Label = chk.Tag
- Log("Folio seleccionado: " & l_folio.Text)
- Folio = l_folio.Text
- ' Indicar que estamos cambiando checkboxes programáticamente
- ChangingCheckboxesProgrammatically = True
+ Log("Folio seleccionado: " & l_folio.Text)
+ Folio = l_folio.Text
+ ' Indicar que estamos cambiando checkboxes programáticamente
+ ChangingCheckboxesProgrammatically = True
- If tipo_abonox = "cxc" Then
- Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) AND a_ticket = ?", Array As String(Folio))
- Log(Folio)
- y.position = 0
- Dim u As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(SALDO_PENDIENTE),0) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND NOTA = ?", Array As String(Folio))
- u.Position = 0
+ If tipo_abonox = "cxc" Then
+ Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) AND a_ticket = ?", Array As String(Folio))
+ Log(Folio)
+ y.position = 0
+ Dim u As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(SALDO_PENDIENTE),0) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND NOTA = ?", Array As String(Folio))
+ u.Position = 0
- et_abono.Text = u.GetDouble("SALDO_PENDIENTE") - y.GetDouble("a_abono")
- Else If tipo_abonox = "abono" Then
- Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) AND a_ticket = ?", Array As String(Folio))
- Log(Folio)
- y.position = 0
- c = Starter.skmt.ExecQuery($"select iFNULL(sum(PA_MONTO),0) AS SALDO_PENDIENTE from PAGARES where PA_CLIENTE = '${la_cuenta.Text}'"$)
- c.Position = 0
+ et_abono.Text = u.GetDouble("SALDO_PENDIENTE") - y.GetDouble("a_abono")
+ Else If tipo_abonox = "abono" Then
+ Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) AND a_ticket = ?", Array As String(Folio))
+ Log(Folio)
+ y.position = 0
+ c = Starter.skmt.ExecQuery($"select iFNULL(sum(PA_MONTO),0) AS SALDO_PENDIENTE from PAGARES where PA_CLIENTE = '${la_cuenta.Text}'"$)
+ c.Position = 0
- et_abono.Text = c.GetDouble("SALDO_PENDIENTE") - y.GetDouble("a_abono")
- End If
-
- ' Desmarcar todos los demás checkboxes
- For i = 0 To clv_abonos.Size - 1
- Dim p As Panel = clv_abonos.GetPanel(i)
- Dim panelCheckbox As CheckBox = GetCheckboxFromPanel(p)
-
- If panelCheckbox <> Null And panelCheckbox <> chk Then
- panelCheckbox.Checked = False
- End If
- Next
-
- ' Restaurar flag
- ChangingCheckboxesProgrammatically = False
+ et_abono.Text = c.GetDouble("SALDO_PENDIENTE") - y.GetDouble("a_abono")
End If
-
+
+ ' Desmarcar todos los demás checkboxes
+ For i = 0 To clv_abonos.Size - 1
+ Dim p As Panel = clv_abonos.GetPanel(i)
+ Dim panelCheckbox As CheckBox = GetCheckboxFromPanel(p)
+
+ If panelCheckbox <> Null And panelCheckbox <> chk Then
+ panelCheckbox.Checked = False
+ End If
+ Next
+
+ ' Restaurar flag
+ ChangingCheckboxesProgrammatically = False
+ End If
End Sub
Sub GetCheckboxFromPanel(p As Panel) As CheckBox
@@ -2285,9 +2285,7 @@ Sub GetCheckboxFromPanel(p As Panel) As CheckBox
End If
Next
Return Null
- End Sub
-
-
+End Sub
Private Sub b_cancelar_Click
et_abono.Text = ""
@@ -2298,14 +2296,13 @@ End Sub
Private Sub b_abono_Click
' p_abono.Visible = False
If et_abono.Text <> "" Then
+ b_abono.Enabled = False
' If almacen = 92 Then
-'
' Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) AND a_ticket = ?", Array As String(Folio))
' Log(Folio)
' y.position = 0
' Dim u As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(SALDO_PENDIENTE),0) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND NOTA = ?", Array As String(Folio))
' u.Position = 0
-'
' If y.GetString("a_abono") > 0 Then
' Log((u.GetString("SALDO_PENDIENTE") + y.GetString("a_abono")))
' If et_abono.text > (u.GetString("SALDO_PENDIENTE") - y.GetString("a_abono")) Then
@@ -2328,7 +2325,6 @@ Private Sub b_abono_Click
' End If
' End If
' Else
-'
' Log("entramos aqui")
' If Folio <> "" Then
' If et_abono.text >= u.GetString("SALDO_PENDIENTE") Then
@@ -2362,31 +2358,31 @@ Private Sub b_abono_Click
' If itemselect <> "SELECCIONA UNA OPCION" Then
' If Folio <> "" Then
'
-'' Dim k As Cursor = Starter.skmt.ExecQuery("SELECT CUENTA from CUENTAA")
-'' k.Position = 0
-'' Log(k.GetString("CUENTA"))
-'' Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT a_abono FROM ABONOS WHERE a_cliente = ?", Array As String(k.GetString("CUENTA")))
-'' y.position = 0
-'' If y.RowCount = 0 Then
+ '' Dim k As Cursor = Starter.skmt.ExecQuery("SELECT CUENTA from CUENTAA")
+ '' k.Position = 0
+ '' Log(k.GetString("CUENTA"))
+ '' Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT a_abono FROM ABONOS WHERE a_cliente = ?", Array As String(k.GetString("CUENTA")))
+ '' y.position = 0
+ '' If y.RowCount = 0 Then
' Msgbox2Async($"¿Seguro que quieres realizar un abono de $${et_abono.text} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True)
' Wait For Msgbox_Result (resultado As Int)
' If resultado = DialogResponse.POSITIVE Then
' imprime_abonopagare
' End If
-'' Else If et_abono.Text > y.GetString("a_abono") Then
-'' Msgbox2Async($"¿Seguro que quieres realizar un abono de $${et_abono.text} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True)
-'' Wait For Msgbox_Result (resultado As Int)
-'' If resultado = DialogResponse.POSITIVE Then
-'' imprime_abonopagare
-'' End If
-'' Else If et_abono.Text = y.GetString("a_abono") Then
-'' p_abono.Visible = False
-'' et_abono.Text = ""
-'' Else If et_abono.Text < y.GetString("a_abono") Then
-'' p_abono.Visible = False
-'' MsgboxAsync("El pago no puede ser menor al monto capturado.","Atención")
-'' et_abono.Text = ""
-'' End If
+ '' Else If et_abono.Text > y.GetString("a_abono") Then
+ '' Msgbox2Async($"¿Seguro que quieres realizar un abono de $${et_abono.text} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True)
+ '' Wait For Msgbox_Result (resultado As Int)
+ '' If resultado = DialogResponse.POSITIVE Then
+ '' imprime_abonopagare
+ '' End If
+ '' Else If et_abono.Text = y.GetString("a_abono") Then
+ '' p_abono.Visible = False
+ '' et_abono.Text = ""
+ '' Else If et_abono.Text < y.GetString("a_abono") Then
+ '' p_abono.Visible = False
+ '' MsgboxAsync("El pago no puede ser menor al monto capturado.","Atención")
+ '' et_abono.Text = ""
+ '' End If
' Else
' MsgboxAsync("Por favor selecciona un pagare para aplicar el pago","Atención")
' End If
@@ -2395,137 +2391,152 @@ Private Sub b_abono_Click
' End If
' End If
' End If
-
- Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) AND a_ticket = ?", Array As String(Folio))
- Log(Folio)
- y.position = 0
- Dim u As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(SALDO_PENDIENTE),0) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND NOTA = ?", Array As String(Folio))
- u.Position = 0
-
- If y.GetDouble("a_abono") > 0 Then
-
-
- If tipo_abonox = "cxc" Then
-
- Log((u.GetDouble("SALDO_PENDIENTE") + y.GetDouble("a_abono")))
- If et_abono.text > (u.GetDouble("SALDO_PENDIENTE") - y.GetDouble("a_abono")) Then
+ Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) AND a_ticket = ?", Array As String(Folio))
+ Log(Folio)
+ y.position = 0
+ Dim u As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(SALDO_PENDIENTE),0) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND NOTA = ?", Array As String(Folio))
+ u.Position = 0
+ If y.GetDouble("a_abono") > 0 Then
+ If tipo_abonox = "cxc" Then
+ Log((u.GetDouble("SALDO_PENDIENTE") + y.GetDouble("a_abono")))
+ If et_abono.text > (u.GetDouble("SALDO_PENDIENTE") - y.GetDouble("a_abono")) Then
+ Log("aqui")
+ MsgboxAsync("El monto a abonar no puede ser mayor que el monto del pagare seleccionado","Atención" )
+ b_abono.Enabled = True
+ Else
+ If et_abono.Text <> "" And et_abono.Text > 0 Then
+ If itemselect <> "SELECCIONA UNA OPCION" Then
+ If Folio <> "" Then
+ Msgbox2Async($"¿Seguro que quieres realizar un abono de $${et_abono.text} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True)
+ b_abono.Enabled = True
+ Wait For Msgbox_Result (resultado As Int)
+ If resultado = DialogResponse.POSITIVE Then
+ b_abono.Enabled = False
+ imprime_abonopagare
+ End If
+ Else
+ b_abono.Enabled = True
+ MsgboxAsync("Por favor selecciona un pagare para aplicar el pago","Atención")
+ b_abono.Enabled = True
+ End If
+ Else
+ MsgboxAsync("Por favor selecciona un metodo de pago","Atención")
+ b_abono.Enabled = True
+ End If
+ End If
+ End If
+ Else If tipo_abonox = "abono" Then
+ If Folio <> "" Then
+ c = Starter.skmt.ExecQuery($"select iFNULL(sum(PA_MONTO),0) AS SALDO_PENDIENTE from PAGARES where PA_CLIENTE = '${la_cuenta.Text}'"$)
+ c.Position = 0
+' Log(c.GetString("SALDO_PENDIENTE") &" "& u.GetString("SALDO_PENDIENTE"))
+ If et_abono.text > (c.GetDouble("SALDO_PENDIENTE") - y.GetDouble("a_abono")) Then
Log("aqui")
MsgboxAsync("El monto a abonar no puede ser mayor que el monto del pagare seleccionado","Atención" )
+ b_abono.Enabled = True
Else
If et_abono.Text <> "" And et_abono.Text > 0 Then
If itemselect <> "SELECCIONA UNA OPCION" Then
- If Folio <> "" Then
- Msgbox2Async($"¿Seguro que quieres realizar un abono de $${et_abono.text} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True)
- Wait For Msgbox_Result (resultado As Int)
- If resultado = DialogResponse.POSITIVE Then
- imprime_abonopagare
- End If
- Else
- MsgboxAsync("Por favor selecciona un pagare para aplicar el pago","Atención")
+ Msgbox2Async($"¿Seguro que quieres realizar un abono de $${et_abono.text} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True)
+ Wait For Msgbox_Result (resultado As Int)
+ If resultado = DialogResponse.POSITIVE Then
+ imprime_abonopagare
End If
Else
MsgboxAsync("Por favor selecciona un metodo de pago","Atención")
+ b_abono.Enabled = True
End If
End If
End If
-
- Else If tipo_abonox = "abono" Then
-
- If Folio <> "" Then
- c = Starter.skmt.ExecQuery($"select iFNULL(sum(PA_MONTO),0) AS SALDO_PENDIENTE from PAGARES where PA_CLIENTE = '${la_cuenta.Text}'"$)
- c.Position = 0
-' Log(c.GetString("SALDO_PENDIENTE") &" "& u.GetString("SALDO_PENDIENTE"))
- If et_abono.text > (c.GetDouble("SALDO_PENDIENTE") - y.GetDouble("a_abono")) Then
- Log("aqui")
- MsgboxAsync("El monto a abonar no puede ser mayor que el monto del pagare seleccionado","Atención" )
- Else
- If et_abono.Text <> "" And et_abono.Text > 0 Then
- If itemselect <> "SELECCIONA UNA OPCION" Then
-
- Msgbox2Async($"¿Seguro que quieres realizar un abono de $${et_abono.text} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True)
- Wait For Msgbox_Result (resultado As Int)
- If resultado = DialogResponse.POSITIVE Then
- imprime_abonopagare
- End If
-
- Else
- MsgboxAsync("Por favor selecciona un metodo de pago","Atención")
- End If
- End If
- End If
- Else
- MsgboxAsync("Por favor selecciona un pagare para aplicar el pago","Atención")
- End If
-
+ Else
+ MsgboxAsync("Por favor selecciona un pagare para aplicar el pago","Atención")
+ b_abono.Enabled = True
End If
-
-
- Else
-
- Log("entramos aqui")
- If tipo_abonox = "cxc" Then
- If Folio <> "" Then
- If et_abono.text > u.GetDouble("SALDO_PENDIENTE") Then
- Log("aqui")
- MsgboxAsync("El monto a abonar no puede ser mayor que el monto del pagare seleccionado","Atención" )
- Else
- If et_abono.Text <> "" And et_abono.Text > 0 Then
- If itemselect <> "SELECCIONA UNA OPCION" Then
-
- Msgbox2Async($"¿Seguro que quieres realizar un abono de $${et_abono.text} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True)
- Wait For Msgbox_Result (resultado As Int)
- If resultado = DialogResponse.POSITIVE Then
- imprime_abonopagare
- End If
-
- Else
- MsgboxAsync("Por favor selecciona un metodo de pago","Atención")
- End If
- End If
- End If
- Else
- MsgboxAsync("Por favor selecciona un pagare para aplicar el pago","Atención")
- End If
- Else If tipo_abonox = "abono" Then
-
- '''checar
-
- If Folio <> "" Then
- c = Starter.skmt.ExecQuery($"select iFNULL(sum(PA_MONTO),0) AS SALDO_PENDIENTE from PAGARES where PA_CLIENTE = '${la_cuenta.Text}'"$)
- c.Position = 0
-' Log(c.GetString("SALDO_PENDIENTE") &" "& u.GetString("SALDO_PENDIENTE"))
- If et_abono.text > c.GetDouble("SALDO_PENDIENTE") Then
- Log("aqui")
- MsgboxAsync("El monto a abonar no puede ser mayor que el monto del pagare seleccionado","Atención" )
- Else
- If et_abono.Text <> "" And et_abono.Text > 0 Then
- If itemselect <> "SELECCIONA UNA OPCION" Then
-
- Msgbox2Async($"¿Seguro que quieres realizar un abono de $${et_abono.text} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True)
- Wait For Msgbox_Result (resultado As Int)
- If resultado = DialogResponse.POSITIVE Then
- imprime_abonopagare
- End If
-
- Else
- MsgboxAsync("Por favor selecciona un metodo de pago","Atención")
- End If
- End If
- End If
- Else
- MsgboxAsync("Por favor selecciona un pagare para aplicar el pago","Atención")
- End If
- End If
-
End If
-
-
+ Else
+ Log("entramos aqui")
+ If tipo_abonox = "cxc" Then
+ If Folio <> "" Then
+ If et_abono.text > u.GetDouble("SALDO_PENDIENTE") Then
+ Log("aqui")
+ MsgboxAsync("El monto a abonar no puede ser mayor que el monto del pagare seleccionado","Atención" )
+ b_abono.Enabled = True
+ Else
+ If et_abono.Text <> "" And et_abono.Text > 0 Then
+ If itemselect <> "SELECCIONA UNA OPCION" Then
+ Msgbox2Async($"¿Seguro que quieres realizar un abono de $${et_abono.text} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True)
+ Wait For Msgbox_Result (resultado As Int)
+ If resultado = DialogResponse.POSITIVE Then
+ imprime_abonopagare
+ End If
+ Else
+ MsgboxAsync("Por favor selecciona un metodo de pago","Atención")
+ b_abono.Enabled = True
+ End If
+ End If
+ End If
+ Else
+ MsgboxAsync("Por favor selecciona un pagare para aplicar el pago","Atención")
+ b_abono.Enabled = True
+ End If
+ Else If tipo_abonox = "abono" Then
+ '''checar
+ If Folio <> "" Then
+ c = Starter.skmt.ExecQuery($"select iFNULL(sum(PA_MONTO),0) AS SALDO_PENDIENTE from PAGARES where PA_CLIENTE = '${la_cuenta.Text}'"$)
+ c.Position = 0
+' Log(c.GetString("SALDO_PENDIENTE") &" "& u.GetString("SALDO_PENDIENTE"))
+ If et_abono.text > c.GetDouble("SALDO_PENDIENTE") Then
+ Log("aqui")
+ MsgboxAsync("El monto a abonar no puede ser mayor que el monto del pagare seleccionado","Atención" )
+ b_abono.Enabled = True
+ Else
+ If et_abono.Text <> "" And et_abono.Text > 0 Then
+ If itemselect <> "SELECCIONA UNA OPCION" Then
+ Msgbox2Async($"¿Seguro que quieres realizar un abono de $${et_abono.text} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True)
+ Wait For Msgbox_Result (resultado As Int)
+ If resultado = DialogResponse.POSITIVE Then
+ imprime_abonopagare
+ End If
+ Else
+ MsgboxAsync("Por favor selecciona un metodo de pago","Atención")
+ b_abono.Enabled = True
+ End If
+ End If
+ End If
+ Else
+ MsgboxAsync("Por favor selecciona un pagare para aplicar el pago","Atención")
+ b_abono.Enabled = True
+ End If
+ End If
+ End If
' End If
End If
ime.HideKeyboard
End Sub
+Sub mandaAbonosPendientes
+ Log("--->>>> MANDAMOS ABONO MANDAPENDIENTES")
+ almacen = 99999999
+ Private ab As Cursor = Starter.skmt.ExecQuery($"SELECT * from ABONOS where a_enviado is null and a_tipoabono IS NULL"$)
+ Log(ab.RowCount)
+ If ab.RowCount > 0 Then
+ For i=0 To ab.RowCount -1
+ ab.Position = i
+ Dim ab1 As Cursor = Starter.skmt.ExecQuery($"SELECT a_abono from ABONOS where a_cliente = '${ab.GetString("a_cliente")}' and a_tipoabono IS NULL"$)
+ ab1.Position = 0
+ Dim cmd As DBCommand
+ cmd.Initialize
+ cmd.Name = "insert_abono_REP_GUNA_VN2"
+ cmd.Parameters = Array As Object( ab.GetString("a_usuario"), ab.GetString("a_ruta"), ab.GetString("a_cliente"), ab.GetString("a_abono"), ab.GetString("a_fecha"), almacen, "REPARTO", Subs.traeRuta(Subs.traeCliente), "", ab.GetString("TIPO_PAGO"), ab.GetString("a_ticket"), ab.GetString("a_numpago"))
+ reqManager.ExecuteCommand(cmd , $"mandaAbonosPendientes_${ab.GetString("a_cliente")}"$)
+ ab1.Close
+ Log($"ins_abonosPendientes_${ab.GetString("a_cliente")}"$)
+ Next
+ End If
+ ab.Close
+End Sub
+
Sub imprime_abonopagare2
c=Starter.skmt.ExecQuery("select USUARIO from usuarioa")
c.Position=0
@@ -2925,7 +2936,6 @@ Sub imprime_abonopagare
If cont > 15 Then impresoraConectada = True
Loop
Sleep(500)
- Log("asasdas")
impresoraConectada = False
Else
' If logger Then Log("conectando 2")
@@ -3138,10 +3148,7 @@ Sub imprime_abonopagare
Printer1.WriteString(" " & CRLF)
Printer1.WriteString("------------------------------" & CRLF)
Printer1.WriteString("-------------FIRMA------------" & CRLF)
-
-
-
-
+
' Dim bmp As Bitmap
'' bmp.InitializeResize(File.DirAssets, "logo-guna-18.jpg", 192, 192, True) 'ignore
@@ -3164,8 +3171,7 @@ Sub imprime_abonopagare
Sleep(2000)
Printer1.DisConnect
ProgressDialogHide
-
-
+
If Subs.traeAlmacen = "92" Then
''mayoreo
@@ -3190,7 +3196,6 @@ Sub imprime_abonopagare
' Starter.skmt.ExecNonQuery($"INSERT INTO ABONOS(a_usuario, a_ruta, a_cliente, a_abono, a_fecha) VALUES ('${Subs.traeUsuarioDeBD}', '${Subs.traeRuta(Subs.traeCliente)}', '${Subs.traeCliente}' ,'${et_abono.text}', '${Subs.fechaKMT(DateTime.now)}')"$)
' ToastMessageShow("Abono guardado", False)
Else
-
h = Starter.skmt.ExecQuery("SELECT CUENTA from CUENTAA")
h.Position = 0
Log(h.GetString("CUENTA"))
@@ -3452,8 +3457,8 @@ Sub imprime_abonopagare
End If
End If
End If
-
-
+' Buscamos abonos sin enviar para enviarlos.
+ mandaAbonosPendientes
End Sub
Sub imprime_pagare
diff --git a/B4A/C_Principal.bas b/B4A/C_Principal.bas
index a4bb156..25011b7 100644
--- a/B4A/C_Principal.bas
+++ b/B4A/C_Principal.bas
@@ -137,6 +137,7 @@ Sub Class_Globals
Private l_carga2 As Label
'fin carga
Private b_impresion_rec As Button
+ Dim linker As C_deviceLinker
End Sub
'You can add more parameters here.
@@ -211,7 +212,7 @@ End Sub
Sub B4XPage_Appear
reqManager.Initialize(Me, B4XPages.MainPage.server)
-
+ linker.Initialize(Me, "Linker", True)
p_principal.Width = Root.Width
p_principal.Height = Root.Height *.80
Private c As Cursor = Starter.skmt.ExecQuery("SELECT * FROM NOVENTA")
@@ -403,6 +404,12 @@ Sub B4XPage_Appear
B4XPages.MainPage.rutaPreventa = RUTA_T
c.Close
reqs.Initialize
+
+ c = Starter.skmt.ExecQuery2("select CAT_VA_VALOR from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("FECHA"))
+ If c.RowCount > 0 Then
+ c.Position = 0
+ Starter.FECHA_HOY = c.GetString("CAT_VA_VALOR")
+ End If
Private rc As Cursor = Starter.skmt.ExecQuery($"select * from REPARTO where REP_RECHAZO = "1" and REP_CANT > 0"$)
' Log($"RECHAZOS=${rc.RowCount}"$)
@@ -1124,7 +1131,16 @@ Sub cargar_Click
cmd.Name = "insert_drop_rep_GUNA_VN"
cmd.Parameters = Array As Object(Subs.dameUsuarioDeDB, l_ruta.Text, ALMACEN, l_ctast.text, Subs.traeEntregados, Subs.traeRechazados, "CARGA")
reqManager.ExecuteCommand(cmd , "inst_drop")
-' reqs.Add("inst_noventa")
+' reqs.Add("inst_noventa")
+
+ cmd.Initialize 'Para traer la contraseña del candado de "FIN DIA"
+ cmd.Name = "SELECT_PASS_FIN_DIA"
+ reqManager.ExecuteQuery(cmd , 0, "pass_fin_dia")
+
+ cmd.Initialize
+ cmd.Name = "select_fecha"
+' cmd.Parameters = Array As Object(e_ruta.text, ALMACEN)
+ reqManager.ExecuteQuery(cmd , 0, "fecha")
Starter.skmt.ExecNonQuery("delete from kmt_info")
Starter.skmt.ExecNonQuery("delete from cod_result")
@@ -1880,6 +1896,23 @@ Sub JobDone(Job As HttpJob)
End If
End If
+
+ If result.Tag = "fecha" Then 'query tag
+ For Each records() As Object In result.Rows
+ Starter.FECHA_HOY = records(result.Columns.Get("FECHA"))
+ Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("FECHA"))
+ Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("FECHA",Starter.FECHA_HOY))
+ Next
+ End If
+
+' Candado Fin Dia
+ If result.Tag = "pass_fin_dia" Then 'query tag
+ For Each records() As Object In result.Rows
+ Dim nuevaContrasena As String = records(result.Columns.Get("CAR_VA_VALOR3"))
+ Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("FINDIA_PASS"))
+ Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("FINDIA_PASS", nuevaContrasena))
+ Next
+ End If
Job.Release
End If
@@ -1972,6 +2005,11 @@ End Sub
Sub connecta_Click
LogColor($"ReqServer = ${B4XPages.MainPage.server}"$, Colors.red)
If Not(IsConnectedToInternet) Then MsgboxAsync("No hay conexión a conexión a Internet", "Revisa tu conexión")
+
+ ' 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)
+
If e_ruta.Text <> "" Then
imei = "" 'p.GetDeviceId
conn = "1"
@@ -2013,7 +2051,19 @@ Sub b_mapa_Click
End Sub
Sub e_ruta_EnterPressed
- If e_ruta.Text = "FIN DIA" Then
+ Private adelanteFinDia As Boolean = True
+ c=Starter.skmt.ExecQuery("select ifnull(CAT_VA_VALOR,0) as CAT_VA_VALOR from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'FINDIA_FECHA'") 'Buscamos "FIN DIA" anterior
+ If c.RowCount > 0 Then
+ c.Position = 0
+ Private FINDIA_FECHA As String = 0
+ If c.GetString("CAT_VA_VALOR").Length > 4 Then FINDIA_FECHA = c.GetString("CAT_VA_VALOR")
+ Log(FINDIA_FECHA&"|"&Starter.FECHA_HOY)
+ If Not(FINDIA_FECHA < Starter.FECHA_HOY) Then 'Si el "FIN DIA" guardado NO es de ayer o anterior ...
+ adelanteFinDia = False
+ End If
+ c.Close
+ End If
+ If e_ruta.Text = "FIN DIA" And adelanteFinDia Then
RES = Msgbox2("Seguro que desea hacer el cierre todos los datos se borraran?","Cierre", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore
If RES = DialogResponse.POSITIVE Then
e_ruta.Text = ""
@@ -2040,6 +2090,8 @@ Sub e_ruta_EnterPressed
Starter.skmt.ExecNonQuery("DELETE FROM ABONOSP")
Starter.skmt.ExecNonQuery("DELETE FROM ABONOS")
Starter.skmt.ExecNonQuery("DELETE FROM BLOCKENVIO")
+ Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("FINDIA_FECHA"))
+ Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object("FINDIA_FECHA", Starter.FECHA_HOY))
b_multiAlmacen.Visible = False
p_multiAlmacen.Visible = False
s_almacen2.SelectedIndex = 0
@@ -2048,6 +2100,8 @@ Sub e_ruta_EnterPressed
End If
' Starter.waypointsOrdered.Clear
Starter.skmt.ExecNonQuery("delete from waypoints")
+ Else if e_ruta.Text = "FIN DIA" Then
+ Msgbox("Ya se hizo FIN DIA hoy, solo se puede hacer un FIN DIA cada día, por favor comuniquese con un supervisor.", "LIMITE DIARIO SUPERADO") 'ignore
End If
End Sub
@@ -3229,4 +3283,48 @@ End Sub
Private Sub connecta_LongClick
imp_LIQUIDACION
+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) '
+ 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("########################################################")
+ 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("########################################################")
+ 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("########################################################")
+ 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..172e1dc
--- /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, B4XPages.MainPage.server) '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"
+ ' 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"
+ ' 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"))
+ 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/cliente.bal b/B4A/Files/cliente.bal
index db937f6..1f9c7e9 100644
Binary files a/B4A/Files/cliente.bal and b/B4A/Files/cliente.bal differ
diff --git a/B4A/Files/login.bal b/B4A/Files/login.bal
index b554739..6a91936 100644
Binary files a/B4A/Files/login.bal and b/B4A/Files/login.bal differ
diff --git a/B4A/Starter.bas b/B4A/Starter.bas
index ee99579..b43932b 100644
--- a/B4A/Starter.bas
+++ b/B4A/Starter.bas
@@ -42,6 +42,8 @@ Sub Process_Globals
Dim inicioMapa As Boolean = False
Dim inicioLat As Double = 0
Dim inicioLon As Double = 0
+ Dim Logger As Boolean = False
+ Dim FECHA_HOY As String
End Sub
Sub Service_Create
diff --git a/B4A/guna_reparto.b4a b/B4A/guna_reparto.b4a
index 311a697..18f1308 100644
--- a/B4A/guna_reparto.b4a
+++ b/B4A/guna_reparto.b4a
@@ -212,6 +212,7 @@ Library24=xcustomlistview
Library25=xui
Library26=xui views
Library27=zxing_scanner
+Library28=keyvaluestore2
Library3=baqrcode
Library4=byteconverter
Library5=camera
@@ -222,30 +223,31 @@ 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~~\n~~\n~~\n~~\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~ ~\n~ 'Para que se registre para abrir bases de datos~\n~ AddActivityText(main,~\n~~\n~~\n~~\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_DetalleVenta
-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
+Module11=C_deviceLinker
+Module12=C_Foto
+Module13=C_Historico
+Module14=C_Mapas
+Module15=C_NoVenta
+Module16=C_NuevoCliente
+Module17=C_Pedidos
+Module18=C_Principal
+Module19=C_Productos
Module2=B4XMainPage
-Module20=C_TicketsDia
-Module21=C_UpdateAvailable
-Module22=CameraExClass
-Module23=DBRequestManager
-Module24=EscPosPrinter
-Module25=foto
-Module26=ManageExternalStorage
-Module27=MAPA_CLIENTE
-Module28=MAPA_RUTAS
-Module29=QRGenerator
+Module20=C_tabulador
+Module21=C_TicketsDia
+Module22=C_UpdateAvailable
+Module23=CameraExClass
+Module24=DBRequestManager
+Module25=EscPosPrinter
+Module26=foto
+Module27=ManageExternalStorage
+Module28=MAPA_CLIENTE
+Module29=MAPA_RUTAS
Module3=barcodeGenerator
-Module30=Starter
-Module31=Subs
-Module32=Tracker
+Module30=QRGenerator
+Module31=Starter
+Module32=Subs
+Module33=Tracker
Module4=BatteryUtilities
Module5=C_Buscar
Module6=C_Cheklist
@@ -253,14 +255,14 @@ Module7=C_Cliente
Module8=C_Clientes
Module9=C_Detalle_Promo
NumberOfFiles=96
-NumberOfLibraries=27
-NumberOfModules=32
+NumberOfLibraries=28
+NumberOfModules=33
Version=12.8
@EndOfDesignText@
#Region Project Attributes
#ApplicationLabel: Guna Reparto
#VersionCode: 1
- #VersionName: 6.01.07
+ #VersionName: 6.01.11
'SupportedOrientations possible values: unspecified, landscape or portrait.
#SupportedOrientations: portrait
#CanInstallToExternalStorage: False
diff --git a/B4A/guna_reparto.b4a.meta b/B4A/guna_reparto.b4a.meta
index d9a2278..f8fd747 100644
--- a/B4A/guna_reparto.b4a.meta
+++ b/B4A/guna_reparto.b4a.meta
@@ -25,6 +25,7 @@ ModuleBookmarks3=
ModuleBookmarks30=
ModuleBookmarks31=
ModuleBookmarks32=
+ModuleBookmarks33=
ModuleBookmarks4=
ModuleBookmarks5=
ModuleBookmarks6=
@@ -58,6 +59,7 @@ ModuleBreakpoints3=
ModuleBreakpoints30=
ModuleBreakpoints31=
ModuleBreakpoints32=
+ModuleBreakpoints33=
ModuleBreakpoints4=
ModuleBreakpoints5=
ModuleBreakpoints6=
@@ -74,7 +76,7 @@ ModuleClosedNodes14=
ModuleClosedNodes15=
ModuleClosedNodes16=
ModuleClosedNodes17=
-ModuleClosedNodes18=
+ModuleClosedNodes18=1,3
ModuleClosedNodes19=
ModuleClosedNodes2=
ModuleClosedNodes20=
@@ -91,12 +93,13 @@ ModuleClosedNodes3=
ModuleClosedNodes30=
ModuleClosedNodes31=
ModuleClosedNodes32=
+ModuleClosedNodes33=
ModuleClosedNodes4=
ModuleClosedNodes5=
ModuleClosedNodes6=
ModuleClosedNodes7=
ModuleClosedNodes8=
ModuleClosedNodes9=
-NavigationStack=C_NoVenta,GPS_LocationChanged,103,0,C_Cliente,GPS_LocationChanged,620,0,C_Cliente,Guardado,997,0,C_Cliente,esPagoACreditoGuardamosPagare,985,0,C_Cliente,b_acred_Click,2021,0,C_Cliente,b_cancel_pagare_Click,3894,0,Diseñador Visual,cliente.bal,-100,1,C_Principal,envioinfo,873,6,Diseñador Visual,principal.bal,-100,2,C_Principal,ImageView1_LongClick,2909,0
+NavigationStack=B4XMainPage,Class_Globals,1287,0,Diseñador Visual,login.bal,-100,6,B4XMainPage,b_borrarFinDia_Click,2312,0,B4XMainPage,p_finDia_Click,2307,0,B4XMainPage,b_cancelarFD_Click,2331,1,B4XMainPage,b_aceptarFD_Click,2320,6,C_DetalleVenta,B_IMP_Click,1162,0,C_DetalleVenta,StartPrinter,1160,0,Main,Process_Globals,17,0,B4XMainPage,p_transFinDia_Click,2317,0
SelectedBuild=0
-VisibleModules=2,17,5,6,7,8,10,31,30,28
+VisibleModules=31,2,18,11,7,8,10,32