VERSION 6.01.11

- Se agrego el mandaPendientes para los abonos.
- Se agrego que solo se pueda hacer solo una vez FIN DIA y despues de eso se necesita una contraseña (FD + dia + hora)
This commit is contained in:
2026-01-24 21:49:23 -06:00
parent 4f07b6d3d3
commit 3cda52a8a3
10 changed files with 812 additions and 242 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

310
B4A/C_deviceLinker.bas Normal file
View File

@@ -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

View File

@@ -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
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

Binary file not shown.

Binary file not shown.

View File

@@ -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

File diff suppressed because one or more lines are too long

View File

@@ -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