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