diff --git a/B4A/B4XMainPage.bas b/B4A/B4XMainPage.bas
index 38a66df..12d1963 100644
--- a/B4A/B4XMainPage.bas
+++ b/B4A/B4XMainPage.bas
@@ -42,7 +42,7 @@ Sub Class_Globals
Public historico As C_Historico
Dim reqManager As DBRequestManager
- Dim s As C_Subs
+ Dim kh As kms_helperSubs
Dim v As String = Application.VersionName
Dim ruta As String
Dim tgl As Toggle
@@ -92,6 +92,8 @@ Sub Class_Globals
Dim MES1 As ManageExternalStorage
Dim device As Phone
Private b_importarBD As Button
+ Private p_importarBDWA As Panel
+ Private cb_importarBDWA As CheckBox
End Sub
Public Sub Initialize
@@ -103,7 +105,7 @@ Private Sub B4XPage_Created (Root1 As B4XView)
B4XPages.GetManager.LogEvents = True
Root = Root1
Root.LoadLayout("login")
- s.Initialize(Me, "Subs")
+ kh.Initialize(Me, "Subs")
B4XPages.SetTitle(Me, "Mariana Preventa")
login.Initialize
B4XPages.AddPage("Login", login)
@@ -158,7 +160,11 @@ Private Sub B4XPage_Created (Root1 As B4XView)
End If
' Log(ruta)
' Starter.skmt.Initialize(ruta,"kmt.db", True)
- s.guardaAppInfo(Starter.skmt)
+
+ 'Revisamos si se disparo el intent de cargar la base de datos desde WhatApp.
+ If kh.traeUsarIntentBDWA Then kh.importaBDDesdeWhatsApp
+
+ kh.guardaAppInfo(Starter.skmt)
Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_CUOTAS (HC_META6 TEXT, HC_META5 TEXT, HC_META4 TEXT, HC_META3 TEXT, HC_META2 TEXT, HC_META1 TEXT, HC_RUTA TEXT, HC_CUOTA1 TEXT, HC_CUOTA2 TEXT, HC_CUOTA3 TEXT, HC_CUOTA4 TEXT, HC_CUOTA5 TEXT, HC_CUOTA6 TEXT)")
Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_GPS (HGDATE TEXT, HGLAT TEXT, HGLON TEXT)")
Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_STAY_STORE (HSS_CODIGO TEXT, HSS_IN TEXT, HSS_OUT TEXT, HSS_TOT TEXT)")
@@ -284,7 +290,6 @@ Private Sub B4XPage_Created (Root1 As B4XView)
End Sub
Sub B4XPage_Appear
-
If Starter.muestraProgreso = 1 Then
muestraProgreso("Descargando actualización")
Starter.muestraProgreso = 0
@@ -295,6 +300,7 @@ Sub B4XPage_Appear
DBReqServer = Starter.DBReqServer
reqManager.Initialize(Me, Starter.DBReqServer)
tgl.Initialize()
+ cb_importarBDWA.Checked = kh.traeUsarIntentBDWA
If Not(Starter.gps.GPSEnabled) Then
ToastMessageShow("Es necesario tener el GPS encendido", True)
Sleep(500)
@@ -712,6 +718,11 @@ Sub i_engrane_Click
et_server.Text = Starter.DBReqServer
If user.Text = "KMTS1" Then b_importarBD.Visible = True Else b_importarBD.Visible = False
Subs.panelVisible(p_appUpdate,0,0)
+ If user.Text.Trim = "KMTS1" Then
+ p_importarBDWA.Visible = True
+ Else
+ p_importarBDWA.Visible = False
+ End If
End Sub
Sub b_regesar_Click
@@ -728,7 +739,7 @@ Sub B_SERVER_Click
If Logger Then Log("Inicializamos reqManager con " & Starter.DBReqServer)
reqManager.Initialize(Me, Starter.DBReqServer)
CallSubDelayed2(Starter, "reinicializaReqManager", Starter.DBReqServer)
- s.reqManagerReInit 'Inicializamos el reqManager de C_Subs.
+ kh.reqManagerReInit 'Inicializamos el reqManager de C_Subs.
Subs.panelVisible(p_Main,0,0)
p_appUpdate.Visible = False
' Entrar.Visible = True
@@ -755,11 +766,11 @@ Private Sub b_envioBD_Click
'copy the shared file to the shared folder
Log("xxxxxx:"&Provider.SharedFolder)
Sleep(1000)
- File.Copy(File.DirInternal, FileName, Provider.SharedFolder, FileName)
+ File.Copy(File.DirInternal, FileName, Provider.SharedFolder, "kmt_mariana.db")
Dim email As Email
email.To.Add("cheveguerra@gmail.com")
email.Subject = "subject"
- email.Attachments.Add(Provider.GetFileUri(FileName))
+ email.Attachments.Add(Provider.GetFileUri("kmt_mariana.db"))
' email.Attachments.Add(Provider.GetFileUri(FileName)) 'second attachment
Dim in As Intent = email.GetIntent
in.Flags = 1 'FLAG_GRANT_READ_URI_PERMISSION
@@ -783,4 +794,10 @@ Private Sub b_importarBD_Click
File.Copy(Result.Dir, Result.FileName, File.DirInternal, "kmt.db") 'Copia la base de datos seleccionada al directorio interno.
Starter.skmt.Initialize(Starter.ruta,"kmt.db", True) 'Reiniciliza la base de datos con la recien importada.
ToastMessageShow("¡BD importada!", False)
+End Sub
+
+Private Sub cb_importarBDWA_CheckedChange(Checked As Boolean)
+' LogColor($"cb_importarBDWA_CheckedChange = ${Checked}"$, Colors.Red)
+ Starter.skmt.ExecNonQuery("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'IMPORTAR_BD_WA'")
+ Starter.skmt.ExecNonQuery($"insert into CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) values ('IMPORTAR_BD_WA', '${Checked}')"$)
End Sub
\ No newline at end of file
diff --git a/B4A/C_Principal.bas b/B4A/C_Principal.bas
index 2c43bb5..a20fe0b 100644
--- a/B4A/C_Principal.bas
+++ b/B4A/C_Principal.bas
@@ -6,7 +6,7 @@ Version=11.5
@EndOfDesignText@
Sub Class_Globals
Public rp As RuntimePermissions
- Dim s As C_Subs
+ Dim kh As kms_helperSubs
Private Root As B4XView 'ignore
Private xui As XUI 'ignore
Dim reqManager As DBRequestManager
@@ -239,10 +239,10 @@ Private Sub B4XPage_Created (Root1 As B4XView)
'load the layout to Root
Root.LoadLayout("principal")
B4XPages.SetTitle(Me, $"${Subs.capitalizar(B4XPages.GetPageId(Me))} ${Application.VersionName}"$)
- s.Initialize(Me, "Subs")
+ kh.Initialize(Me, "Subs")
p_mandaInfo.Width = Root.Width
p_mandaInfo.Height = Root.Height
- s.centraPanel(P1, Root.Width)
+ kh.centraPanel(P1, Root.Width)
l_version.Text = Application.VersionName
' rd.Initialize 'Inicializamos el respaldo diario.
' rd.vacuum
@@ -763,7 +763,7 @@ Sub cargar_Click
End If
If Not (pedidodiaanterior) Then
CARGA = "CARGAR"
- s.panelVisible(p_mandaInfo, 0, 0)
+ kh.panelVisible(p_mandaInfo, 0, 0)
P1.Left = (p_mandaInfo.Width/2) - (P1.Width/2)
P1.top = (p_mandaInfo.Height/2) - (P1.Height/2)
img2.Visible =True
@@ -1789,7 +1789,7 @@ End Sub
Sub connecta_LongClick
ProgressDialogShow("Enviamos")
' s.reqManagerReInit 'Reiniciamos el DBReqManager por si hay modificacion en el servidor.
- s.envioTest 'Llamamos envioTest de C_Subs.
+ kh.envioTest 'Llamamos envioTest de C_Subs.
End Sub
Sub tickets_dia_LongClick
diff --git a/B4A/C_Subs_XXX.bas b/B4A/C_Subs_XXX.bas
new file mode 100644
index 0000000..7e65b43
--- /dev/null
+++ b/B4A/C_Subs_XXX.bas
@@ -0,0 +1,607 @@
+B4A=true
+Group=Default Group
+ModulesStructureVersion=1
+Type=Class
+Version=12.2
+@EndOfDesignText@
+Sub Class_Globals
+ 'These global variables will be declared once when the application starts.
+ 'These variables can be accessed from all modules.
+' Public GZip As GZipStrings 'Usa la libreria CompressStrings
+' Private su As StringUtils 'Usa la libreria StringUtils
+ Dim reqManager As DBRequestManager
+ Private EventName As String 'ignore
+ Private CallBack As Object 'ignore
+ Dim phn As Phone
+ Dim devModel As String
+ Dim db, kmt, errorLog As SQL 'Requiere la libreria "SQL" 'ignore
+ Dim ssid As String 'ignore
+ Dim reqsList As List
+ Dim reqError As Boolean = False
+ Private subsLogs As Boolean = False
+End Sub
+
+'You can add more parameters here.
+Public Sub Initialize (vCallback As Object, vEventName As String) As Object
+ reqsList.Initialize
+ EventName = vEventName
+ CallBack = vCallback
+ db = dbInit
+ reqManager = reqManagerInit
+ Return Me
+End Sub
+
+'Inicializa la BD con "kmt.db" en File.DirInternal, si el archivo no existe, lo copia desde File.DirAssets.
+'Dispara el evento "dbOk" cuando termina.
+Sub dbInit As SQL
+ If File.Exists(File.DirInternal, "kmt.db") = False Then File.Copy(File.DirAssets, "kmt.db", File.DirInternal, "kmt.db")
+ db.Initialize(File.DirInternal,"kmt.db", True)
+ dbOk(True)
+' Log(db.IsInitialized)
+ Return db
+End Sub
+
+Sub dbOk(Success As Boolean)
+ If SubExists(CallBack, EventName & "_dbOk") Then
+ CallSub2(CallBack, EventName & "_dbOk", Success)
+ End If
+End Sub
+
+'Inicializamos el DBReqServer.
+Sub reqManagerInit As DBRequestManager
+ Private rm As DBRequestManager
+ rm.Initialize(Me, traeDBReqServerDeBD(db))
+ Log($"Inicializamos reqManager con ${traeDBReqServerDeBD(db)}"$)
+ Return rm
+End Sub
+
+'Reinicializamos el DBReqServer de C_Subs.
+Sub reqManagerReInit
+ Log("reqManager ReInit")
+ reqManager = reqManagerInit
+End Sub
+
+Sub envioTest
+ reqsList.Initialize ' Ponemos la lista de DBRequests en cero.
+ Private cmd As DBCommand
+ cmd.Initialize
+ cmd.Name = "select_fecha"
+ For i = 0 To 50
+' Sleep(200)
+ reqManager.ExecuteQuery(cmd, 0, $"select_fecha_${i}"$)
+ reqsList.Add($"select_fecha_${i}"$)
+ Next
+End Sub
+
+'Dispara el evento "_envioOk" del caller.
+Sub envioOk(Success As Boolean)
+' Log($"_ENVIOOK_"$)
+ If SubExists(CallBack, EventName & "_envioOk") Then
+ CallSub2(CallBack, EventName & "_envioOk", Success)
+ End If
+End Sub
+
+Sub JobDone(Job As HttpJob)
+ LogColor("C_SUBS JOBDONE - " & Job.Success, Colors.Red)
+ If Job.Success = False Then
+ Log($"Error en el request ${Job.Tag}"$)
+ LogColor("** " & Job.Tag & " Error: " & Job.ErrorMessage, Colors.Red)
+ If reqsList.IndexOf(Job.Tag) > -1 Then reqsList.RemoveAt(reqsList.IndexOf(Job.Tag))
+ reqError = True
+ Else
+ If Job.JobName = "DBRequest" Then
+ Dim resultado As DBResult = reqManager.HandleJob(Job)
+ If reqsList.IndexOf(resultado.Tag) > -1 Then reqsList.RemoveAt(reqsList.IndexOf(resultado.Tag))
+ If resultado.Tag = "select_fecha" Then
+ For Each records() As Object In resultado.Rows
+ For Each k As String In resultado.Columns.Keys
+ Log(resultado.Tag & ": " & k & ": " & records(resultado.Columns.Get(k)))
+ Next
+ Next
+ End If
+ End If
+ End If
+ Log(reqsList.Size)
+ If reqsList.Size = 0 Then 'Ya no hay DBReqs pendientes.
+ Log(reqError)
+ If Not(reqError) Then
+ envioOk(True)
+ Else
+ envioOk(False)
+ End If
+ reqError = False
+ Log("-= FIN =-")
+ End If
+ Job.Release
+End Sub
+
+'Pone el valor de phn.Model en la variable global "devModel"
+Sub getPhnId As String 'ignore
+ 'Requiere la libreria "Phone"
+ devModel = phn.Model
+ If devModel.Length <= 3 Then 'Si phn.Model esta en blanco ...
+ Dim t As String = phn.GetSettings("android_id") 'Intentamos con "android_id"
+ devModel = t
+ End If
+ If devModel.Length >= 3 Then 'Si tenemos valor para phn.Model
+ File.WriteString(File.DirInternal, "phnId.txt", devModel) 'Sobreescribimos archivo phnId.txt with deviceId
+' Log("Tenemos phnId: "&devModel&" "&File.DirInternal&"/phn.txt sobreescrito")
+ Else If devModel.Length < 3 Then ' Si no tenemos valor, lo leemos de phnId.txt
+ Dim s As String = File.ReadString(File.DirInternal, "phnId.txt")
+ devModel = s
+' Log("Leemos id de "&File.DirInternal&"/phnId.txt")
+' Log(devModel)
+ End If
+ Return devModel
+End Sub
+
+'Convierte una fecha al formato yyMMddHHmmss
+Sub fechaKMT(fecha As String) As String 'ignore
+' Log(fecha)
+ Dim OrigFormat As String = DateTime.DateFormat 'save orig date format
+ DateTime.DateFormat="yyMMddHHmmss"
+ Dim nuevaFecha As String=DateTime.Date(fecha)
+ DateTime.DateFormat=OrigFormat 'return to orig date format
+' Log(nuevaFecha)
+ Return nuevaFecha
+End Sub
+
+'Escribimos las coordenadas y fecha a un archivo de texto
+Sub guardaInfoEnArchivo(coords As String) 'ignore
+ ' Cambiamos el formato de la hora
+ Dim OrigFormat As String=DateTime.DateFormat 'save orig date format
+ DateTime.DateFormat="MMM-dd HH:mm:ss"
+ Dim lastUpdate As String=DateTime.Date(DateTime.Now)
+ DateTime.DateFormat=OrigFormat 'return to orig date format
+
+ Dim ubic As String = coords&","&lastUpdate
+ Dim out As OutputStream = File.OpenOutput(File.DirInternal, "gps.txt", True)
+ Dim s As String = ubic & CRLF
+ Dim t() As Byte = s.GetBytes("UTF-8")
+ out.WriteBytes(t, 0, t.Length)
+ out.Close
+End Sub
+
+'Escribimos las coordenadas (latitud, longitud, fecha) y fecha a una BD
+Sub guardaInfoEnBD(coords As String) 'ignore
+ Log("Guardamos ubicacion en BD - "&coords)
+ Try
+ Dim latlon() As String = Regex.Split("\|", coords)
+ If latlon.Length < 2 Then latlon = Regex.Split(",", coords) 'Si son menos de 2, entonces estan separadas por comas y no por "|"
+ If subsLogs Then Log("LatLon="&latlon)
+ kmt.ExecNonQuery2("INSERT INTO RUTA_GPS(FECHA, LAT, LON) VALUES (?,?,?)", Array As Object (latlon(2),latlon(0),latlon(1)))
+ Catch
+ LogColor(LastException, Colors.red)
+ End Try
+End Sub
+
+'Limpiamos la tabla RUTA_GPS de la BD
+Sub deleteGPS_DB 'ignore
+ kmt.ExecNonQuery("delete from RUTA_GPS")
+ kmt.ExecNonQuery("vacuum;")
+ ToastMessageShow("Borramos BD Coords GPS", False)
+End Sub
+
+'Limpiamos la tabla errorLog de la BD
+Sub deleteErrorLog_DB 'ignore
+ errorLog.ExecNonQuery("delete from errores")
+ errorLog.ExecNonQuery("vacuum;")
+ ToastMessageShow("BD Errores Borrada", False)
+End Sub
+
+'Mandamos "coords" en un mensaje a "Sprvsr"
+'Sub mandamosLoc(coords As String) 'ignore
+'' Log("Iniciamos mandamosLoc "&coords)
+'' Log("locRequest="&Tracker.locRequest)
+' guardaInfoEnBD(coords)'Escribimos coordenadas y fecha a una bd
+' Dim t As String
+' If Tracker.locRequest="Activa" Then
+' If PushService.au = 1 Then
+' t = "au" ' es una actualizacion
+' Else
+' t = "u" ' es una peticion
+' End If
+' Dim params As Map = CreateMap("topic":"Sprvsr", "coords":coords, "t":t, "b":PushService.battery, "mt":Main.montoActual)
+' CallSub2(PushService, "mandaMensaje",params)
+' Tracker.locRequest="Enviada"
+' CallSubDelayed(Tracker,"CreateLocationRequest")
+' End If
+'End Sub
+
+'Regresa la fecha y hora de hoy a las 00:00 en el formato "yyMMddHHMMSS"
+Sub fechaInicioHoy As String 'ignore
+ Dim OrigFormat As String = DateTime.DateFormat 'save orig date format
+ DateTime.DateFormat="yyMMdd"
+ Private h As String = DateTime.Date(DateTime.Now)&"000000"
+ DateTime.DateFormat=OrigFormat 'return to orig date format
+ Log("Hoy="&h)
+ Return h
+End Sub
+
+'Guardamos "texto" a la bitacora
+Sub log2DB(texto As String) 'ignore
+ LogColor(fechaKMT(DateTime.Now)&" - log2BD: '"&texto&"'", Colors.LightGray)
+ kmt.ExecNonQuery2("INSERT INTO bitacora(fecha, texto) VALUES (?,?)", Array As Object (fechaKMT(DateTime.now), texto))
+End Sub
+
+'Regresa verdadero si ya pasaron XX minutos de la fecha dada
+Sub masDeXXMins(hora As Int, mins As Int) As Boolean 'ignore
+ If (hora + mins * DateTime.TicksPerMinute) < DateTime.Now Then
+ Return True
+ Else
+ Return False
+ End If
+End Sub
+
+'Regresa verdadero si ya pasaron XX minutos de la fechaKMT dada
+Sub masDeXXMinsKMT(hora As String, mins As Int) As Boolean 'ignore
+ Try
+ ' LogColor($"Hora=${fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute)}, Mins=${mins}, Actual=${fechaKMT(DateTime.Now)}"$,Colors.red)
+ If fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute < DateTime.Now Then
+ ' Log("+++ +++ "&fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute) & " < " & fechaKMT(DateTime.Now))
+ Return True
+ Else
+ ' Log("+++ +++ "&fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute) & " > " & fechaKMT(DateTime.Now))
+ Return False
+ End If
+ Catch
+ Log(LastException)
+ End Try
+End Sub
+
+'Limpiamos la tabla "bitacora" de la BD
+Sub borraLogDB 'ignore
+ LogColor("Borramos BD de log", Colors.Magenta)
+ kmt.ExecNonQuery("delete from bitacora")
+ kmt.ExecNonQuery("vacuum;")
+End Sub
+
+'Monitoreamos los servicios para ver si estan activos (No pausados), y si no, los reniciamos
+'Sub Monitor 'ignore
+' Private monitorStatus As Boolean = True
+' LogColor("Corriendo Subs.Monitor", Colors.RGB(161,150,0))
+' If IsPaused(Tracker) Then
+' log2DB("Reiniciando 'Tracker Pausado' desde Subs.Monitor")
+' StartService(Tracker)
+' monitorStatus = False
+' Else
+' CallSubDelayed(Tracker, "revisaFLP")
+' End If
+' If IsPaused(PushService) Then
+' log2DB("Reiniciando 'PushService Pausado' desde Subs.Monitor")
+' StartService(PushService)
+' monitorStatus = False
+' Else
+' revisaPushService
+' End If
+' If monitorStatus Then LogColor(" +++ +++ Servicios Activos", Colors.Green)
+'End Sub
+
+'Convierte una fecha en formato YYMMDDHHMMSS a Ticks
+Sub fechaKMT2Ticks(fKMT As String) As Long 'ignore
+ Try
+ If fKMT.Length = 12 Then
+ Private parteFecha As String = fKMT.SubString2(0,6)
+ Private parteHora As String = fKMT.SubString(6)
+ Private OrigFormat As String = DateTime.DateFormat 'save original date format
+ DateTime.DateFormat="yymmdd"
+ DateTime.TimeFormat="HHmmss"
+ Private ticks As Long = DateTime.DateTimeParse(parteFecha,parteHora)
+ DateTime.DateFormat=OrigFormat 'return to original date format
+ Return ticks
+ Else
+ Log("Formato de fecha incorrecto, debe de ser 'YYMMDDHHMMSS', no '"&fKMT&"' largo="&fKMT.Length)
+ Return 0
+ End If
+ Catch
+ Log(LastException)
+ LogColor($"Fecha dada: ${fKMT}, Parte Fecha: ${parteFecha}, Parte Hora: ${parteHora}"$, Colors.Red)
+ Return 0
+ End Try
+End Sub
+
+Sub InstallAPK(dir As String, apk As String) 'ignore
+ If File.Exists(dir, apk) Then
+ Dim i As Intent
+ i.Initialize(i.ACTION_VIEW, "file://" & File.Combine(dir, apk))
+ i.SetType("application/vnd.android.package-archive")
+ StartActivity(i)
+ End If
+End Sub
+
+'Copia la base de datos del almacenamiento interno al externo en el directorio kmts.
+Sub copiaDB(result As Boolean) 'ignore
+ ToastMessageShow("copiaDB", False)
+ If result Then
+ Dim p As String
+ If File.ExternalWritable Then
+ p = File.DirInternal
+' Log("Externo")
+ Else
+ p = File.DirInternal
+' Log("Interno")
+ End If
+ Dim theDir As String
+ Try
+ File.MakeDir(File.DirInternal,"kmts")
+ theDir = "/kmts"
+ Catch
+ theDir = ""
+ End Try
+ Try
+ File.Copy(File.DirInternal,"kmt.db",File.DirInternal&theDir,"cedex_kmt.db")
+ File.Copy(File.DirInternal,"errorLog.db",File.DirInternal&theDir,"cedex_errorLog.db")
+ ToastMessageShow("BD copiada!", False)
+ Catch
+ ToastMessageShow("No se pudo hacer la copia: "&LastException, True)
+ End Try
+ Log("rootExternal="&p)
+ Log("File.DirInternal="&File.DirInternal)
+ Log("File.DirInternal="&File.DirInternal)
+ Else
+ ToastMessageShow("Sin permisos", False)
+ End If
+End Sub
+
+'Hace visible y trae al frente el panel con los parametros "Top" y "Left" dados.
+Sub panelVisible(panel As Panel, top As Int, left As Int) 'ignore
+ panel.BringToFront
+ panel.Visible = True
+ panel.Top = top
+ panel.Left = left
+End Sub
+
+'Centra una etiqueta dentro de un elemento superior.
+Sub centraEtiqueta(elemento As Label, anchoElementoSuperior As Int) 'ignore
+ elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2)
+End Sub
+
+'Centra un panel horizontalmente dentro de un elemento superior.
+Sub centraPanel(elemento As Panel, anchoElementoSuperior As Int) 'ignore
+ elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2)
+End Sub
+
+'Centra un panel verticalmente dentro de un elemento superior.
+Sub centraPanelV(elemento As Panel, altoElementoSuperior As Int) 'ignore
+ elemento.Top = Round(altoElementoSuperior/2)-(elemento.Height/2)
+End Sub
+
+'Centra una barra de progreso dentro de un elemento superior.
+Sub centraProgressBar(elemento As ProgressBar, anchoElementoSuperior As Int) 'ignore
+ elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2)
+End Sub
+
+'Regresa la fecha en el formato "MM/dd/yyyy"
+Sub traeFecha As String 'ignore
+ DateTime.DateFormat = "MM/dd/yyyy"
+ Private sDate As String = DateTime.Date(DateTime.Now)
+ Private sTime As String = DateTime.Time(DateTime.Now)
+ Return sDate & sTime
+End Sub
+
+'Guarda el nombre y version de la app en CAT_VARIABLES.
+Sub guardaAppInfo(skmt As SQL) 'ignore
+ skmt.ExecNonQuery("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'EMPRESA' or CAT_VA_DESCRIPCION = 'APP_NAME' or CAT_VA_DESCRIPCION = 'APP_VERSION'")
+ skmt.ExecNonQuery($"insert into CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) values ('APP_NAME', '${Application.LabelName}')"$)
+ skmt.ExecNonQuery($"insert into CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) values ('APP_VERSION', '${Application.VersionName}')"$)
+End Sub
+
+'Muestra en el Log los campos y valores que regresan en el JobDone.
+Sub logJobDoneResultados(resultado As DBResult) 'ignore
+ For Each records() As Object In resultado.Rows
+ LogColor($"====== ${resultado.Tag} - REGISTROS = ${resultado.Rows.Size}"$, Colors.RGB(215,37,0))
+ For Each k As String In resultado.Columns.Keys
+ LogColor(k & " = " & records(resultado.Columns.Get(k)), Colors.RGB(215,37,0))
+ Next
+ Next
+End Sub
+
+'Regresa la base de datos especificada ya inicializada.
+Sub inicializaBD(ruta As String, BDName As String) As SQL 'ignore
+ Dim skmt As SQL
+ If File.Exists(ruta, BDName) = False Then
+ File.Copy(File.DirAssets, BDName, ruta, BDName)
+ LogColor($"Copiamos ${BDName} de ${File.DirAssets} a ${ruta}"$,Colors.Green)
+ End If
+ skmt.Initialize(ruta, BDName, True)
+ Return skmt
+End Sub
+
+'Agrega una columna a la tabla especificada.
+'Hay que indicar el "tipo" de la columna (TEXT, INTEGER, ETC)
+'Ej. agregaColumna("TABLA", "COLUMNA", "TIPO")
+Sub agregaColumna(tabla As String, columna As String, tipo As String) 'ignore
+ Try 'Intentamos usar "pragma_table_info" para revisar si existe la columna en la tabla
+ Private c As Cursor = db.ExecQuery($"SELECT COUNT(*) AS fCol FROM pragma_table_info('${tabla}') WHERE name='${columna}'"$)
+ c.Position = 0
+ If c.GetString("fCol") = 0 Then 'Si no esta la columna la agregamos
+ db.ExecNonQuery($"ALTER TABLE ${tabla} ADD COLUMN ${columna} ${tipo}"$)
+ Log($"Columna "${columna} ${tipo}", agregada a "${tabla}"."$)
+ End If
+ Catch 'Si no funciona "pragma_table_info" lo hacemos con try/catch
+ Try
+ db.ExecNonQuery($"ALTER TABLE ${tabla} ADD COLUMN ${columna} ${tipo}"$)
+ Log($"Columna "${columna} ${tipo}", agregada a "${tabla}".."$)
+ Catch
+ Log(LastException)
+ End Try
+ End Try
+End Sub
+
+'Regresa el DBReqServer desde CAT_VARIABLES o "N/A" si no existe.
+Sub traeDBReqServerDeBD(dbx As SQL) As String 'ignore
+ Dim srvr As String = "N/A"
+ Dim rs As ResultSet = dbx.ExecQuery("select CAT_VA_VALOR from cat_variables where CAT_VA_DESCRIPCION = 'SERVER'")
+ If rs.RowCount > 0 Then
+ rs.NextRow
+ srvr = rs.GetString("CAT_VA_VALOR")
+ End If
+ Return srvr
+End Sub
+
+'Regresa el valor de intervalo desde CAT_VARIABLES o "30" si no existe.
+Sub traeIntervaloDeBD As String 'ignore
+ Dim intrvl As String = "30"
+ Dim rs As ResultSet = db.ExecQuery("select valor from cat_variables where nombre = 'intervalo'")
+ If rs.RowCount > 0 Then
+ rs.NextRow
+ intrvl = rs.GetString("valor")
+ End If
+ Return intrvl
+End Sub
+
+'Regresa el valor timeout desde CAT_VARIABLES o "9000" si no existe.
+Sub traeTimeoutDeBD As String 'ignore
+ Dim tmout As String = "9000"
+ Dim rs As ResultSet = db.ExecQuery("select valor from cat_variables where nombre = 'timeout'")
+ If rs.RowCount > 0 Then
+ rs.NextRow
+ tmout = rs.GetString("valor")
+ End If
+ Return tmout
+End Sub
+
+'Crea una notificación con el "body" dado y regresa el objeto.
+Sub CreateNotification (Body As String) As Notification 'ignore
+ Dim notification As Notification
+ notification.Initialize2(notification.IMPORTANCE_LOW)
+ notification.Icon = "icon"
+ notification.SetInfo("Tester", Body, Main)
+ Return notification
+End Sub
+
+'Genera una notificacion con importancia alta
+Sub notiHigh(title As String, body As String, id As String, activity As Object) 'ignore
+ activity = Main
+ Private notif As Notification
+ notif.Initialize2(notif.IMPORTANCE_HIGH)
+ notif.Icon = "icon"
+ notif.Vibrate = False
+ notif.Sound = False
+ notif.AutoCancel = True
+' If logger Then Log("notiHigh: "&title)
+ notif.SetInfo(title, body, activity)
+' Log("notiHigh SetInfo")
+ notif.Notify(id)
+End Sub
+
+'Regresa el objeto de una notificacion con importancia baja
+Sub notiLowReturn(title As String, Body As String, id As Int) As Notification 'ignore
+ Private notification As Notification
+ notification.Initialize2(notification.IMPORTANCE_LOW)
+' Log("notiLowReturn: "&title)
+ notification.Icon = "icon"
+ notification.Sound = False
+ notification.Vibrate = False
+ notification.SetInfo(title, Body, Main)
+ notification.Notify(id)
+' Log("notiLowReturn SetInfo")
+ Return notification
+End Sub
+
+'Regresa el almacen actual de la base de datos.
+Sub traeAlmacen As String 'ignore
+ Private c As Cursor
+ Private a As String
+ c = db.ExecQuery("select ID_ALMACEN from CAT_ALMACEN")
+ c.Position = 0
+ a = C.GetString("ID_ALMACEN")
+ c.Close
+ Return a
+End Sub
+
+'Regresa la ruta actual de la base de datos.
+Sub traeRuta As String 'ignore
+ Private c As Cursor
+ Private r As String
+ c = db.ExecQuery("select CAT_CL_RUTA from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)")
+ r = "0"
+ If c.RowCount > 0 Then
+ c.Position=0
+ r = c.GetString("CAT_CL_RUTA")
+ End If
+ c.Close
+ Return r
+End Sub
+
+'Mandamos los pedidos pendientes (pc_envio_ok <> 1).
+Sub mandaPendientes 'ignore
+ Private logger As Boolean = False
+ 'PEDIDO_CLIENTE (Pendientes)
+ Private c As Cursor = db.ExecQuery("SELECT PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT, PC_COSTO_SIN, PC_RUTA, PC_ALMACEN, PC_FACTURA FROM PEDIDO_CLIENTE where pc_envio_ok <> 1")
+ If logger Then Log($"Pedido_Cliente PENDIENTE: ${c.RowCount}"$)
+ Private almacen As String = traeAlmacen
+ Private ruta As String = traeRuta
+ If c.RowCount>0 Then
+ For i = 0 To c.RowCount - 1
+ c.Position = i
+ Dim cmd As DBCommand
+ cmd.Initialize
+ cmd.Name = "DELETE_PEDIDO_MARDS_PC"
+ cmd.Parameters = Array As Object(almacen, ruta, c.GetString("PC_CLIENTE") )
+ reqManager.ExecuteCommand(cmd , "DEL_PC")
+
+ Dim cmd As DBCommand
+ cmd.Initialize
+ cmd.Name = "insert_pedidos_MARDS"
+ If logger Then Log($"${c.GetString("PC_CLIENTE")}, ${almacen}"$)
+ cmd.Parameters = Array As Object(C.GetString("PC_CLIENTE"), C.GetString("PC_FECHA"), C.GetString("PC_USER"), C.GetString("PC_NOART"), C.GetString("PC_MONTO"), C.GetString("PC_LON"), C.GetString("PC_LAT"), almacen, ruta, C.GetString("PC_COSTO_SIN"), C.GetString("PC_FACTURA"))
+ reqManager.ExecuteCommand(cmd , $"ins_pedidosPendientes_head_${c.GetString("PC_CLIENTE")}"$)
+ Next
+ End If
+
+ 'PEDIDO (Pendientes)
+ c=Starter.skmt.ExecQuery("SELECT PC_ENVIO_OK, PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_FECHA, PE_USUARIO, PE_COSTO_SIN, PE_RUTA, PE_DESC, PE_FOLIO FROM pedido_cliente left join PEDIDO where pc_cliente = pe_cliente and pc_envio_ok <> 1")
+ If logger Then Log($"Pedido PENDIENTE: ${c.RowCount}"$)
+ If c.RowCount>0 Then
+ For i = 0 To c.RowCount - 1
+ c.Position = i
+ Dim cmd As DBCommand
+
+ cmd.Initialize
+ cmd.Name = "DELETE_PEDIDO_MARDS_PE"
+ cmd.Parameters = Array As Object(almacen, ruta,c.GetString("PE_CLIENTE") )
+ reqManager.ExecuteCommand(cmd , "DEL_PE")
+
+ cmd.Initialize
+ cmd.Name = "insert_pedido_MARDS"
+ cmd.Parameters = Array As Object(c.GetString("PE_CEDIS"), almacen, c.GetString("PE_COSTO_TOT"), c.GetString("PE_COSTOU"), c.GetString("PE_CANT"), c.GetString("PE_PRONOMBRE"), c.GetString("PE_PROID"), c.GetString("PE_CLIENTE"), c.GetString("PE_FECHA"), c.GetString("PE_USUARIO"), c.GetString("PE_RUTA"), C.GetString("PE_COSTO_SIN"), c.GetString("PE_DESC"), c.GetString("PE_FOLIO"))
+ reqManager.ExecuteCommand(cmd , $"ins_pedidosPendientes_prods_${c.GetString("PE_CLIENTE")}"$)
+ Next
+ End If
+
+ 'ABONOS
+ Dim ab As Cursor = db.ExecQuery($"SELECT * from ABONOS where a_enviado is null"$)
+ If logger Then Log(ab.RowCount)
+ If ab.RowCount > 0 Then
+ For i = 0 To ab.RowCount - 1
+ ab.Position = i
+ Dim cmd As DBCommand
+ cmd.Initialize
+ cmd.Name = "insert_abono_MARDS"
+ 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") )
+ reqManager.ExecuteCommand(cmd , $"ins_abonosPendientes_${ab.GetString("a_cliente")}"$)
+ If logger Then Log($"ins_abonosPendientes_${ab.GetString("a_cliente")}"$)
+ Next
+ End If
+ ab.Close
+End Sub
+
+'Borra el pedido del cliente actual.
+'Borra los registros de la tabla "pedido" y "pedido_cliente"
+'Actualiza las tablas "cat_gunaprod" y "kmt_info".
+Sub borraPedidoClienteActual As String
+ Private thisC As Cursor
+ thisC=Starter.skmt.ExecQuery("select PE_PROID,PE_CANT FROM PEDIDO where pe_cliente in (Select CUENTA from cuentaa) ")
+ If thisC.RowCount>0 Then
+ For i=0 To thisC.RowCount -1
+ thisC.Position=i
+ Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_id = ?", Array As Object(thisC.GetString("PE_CANT"),thisC.GetString("PE_PROID")))
+ Starter.skmt.ExecNonQuery2("INSERT INTO INVENT_X_ENVIAR (ALMACEN , PROID , CANTIDAD ) VALUES(?,?,?) ", Array As Object (traeAlmacen, thisC.GetString("PE_PROID"),thisC.GetString("PE_CANT")* -1))
+ Next
+ End If
+ Starter.skmt.ExecNonQuery("delete from pedido_cliente where pc_cliente in (Select CUENTA from cuentaa)")
+ Starter.skmt.ExecNonQuery("delete from pedido where pe_cliente in (Select CUENTA from cuentaa)")
+ Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)")
+ Return 1
+End Sub
\ No newline at end of file
diff --git a/B4A/Files/login.bal b/B4A/Files/login.bal
index 561b6b1..6f412c3 100644
Binary files a/B4A/Files/login.bal and b/B4A/Files/login.bal differ
diff --git a/B4A/Mariana.b4a b/B4A/Mariana.b4a
index c0142f6..dfe733d 100644
--- a/B4A/Mariana.b4a
+++ b/B4A/Mariana.b4a
@@ -1033,7 +1033,7 @@ Library6=bctoast
Library7=bitmapcreator
Library8=byteconverter
Library9=camera
-ManifestCode='This code will be applied to the manifest file during compilation.~\n~'You do not need to modify it in most cases.~\n~'See this link for for more information: https://www.b4x.com/forum/showthread.php?p=78136~\n~AddManifestText(~\n~~\n~)~\n~SetApplicationAttribute(android:icon, "@drawable/icon")~\n~SetApplicationAttribute(android:label, "$LABEL$")~\n~CreateResourceFromFile(Macro, Themes.LightTheme)~\n~'AddApplicationText(~\n~')~\n~CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~ 'End of default text.~\n~''''' CAMBIA LA CLAVE API~\n~AddApplicationText(~\n~~\n~ ~\n~)~\n~AddApplicationText(~\n~~\n~)~\n~AddManifestText(~\n~~\n~)~\n~''CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~ 'End of default text.~\n~ ~\n~SetApplicationAttribute(android:usesCleartextTraffic, "true")~\n~ AddManifestText(~\n~~\n~)~\n~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~AddPermission("android.permission.MANAGE_EXTERNAL_STORAGE")~\n~SetApplicationAttribute(android:largeHeap, "true")~\n~AddPermission("android.permission.MANAGE_EXTERNAL_STORAGE")~\n~AddApplicationText(~\n~~\n~ ~\n~ )~\n~ ~\n~ AddManifestText(~\n~ ~\n~ )~\n~ ~\n~
+ManifestCode='This code will be applied to the manifest file during compilation.~\n~'You do not need to modify it in most cases.~\n~'See this link for for more information: https://www.b4x.com/forum/showthread.php?p=78136~\n~AddManifestText(~\n~~\n~)~\n~SetApplicationAttribute(android:icon, "@drawable/icon")~\n~SetApplicationAttribute(android:label, "$LABEL$")~\n~CreateResourceFromFile(Macro, Themes.LightTheme)~\n~'AddApplicationText(~\n~')~\n~CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~ 'End of default text.~\n~''''' CAMBIA LA CLAVE API~\n~AddApplicationText(~\n~~\n~ ~\n~)~\n~AddApplicationText(~\n~~\n~)~\n~AddManifestText(~\n~~\n~)~\n~''CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~ 'End of default text.~\n~ ~\n~SetApplicationAttribute(android:usesCleartextTraffic, "true")~\n~ AddManifestText(~\n~~\n~)~\n~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~AddPermission("android.permission.MANAGE_EXTERNAL_STORAGE")~\n~SetApplicationAttribute(android:largeHeap, "true")~\n~AddPermission("android.permission.MANAGE_EXTERNAL_STORAGE")~\n~AddApplicationText(~\n~~\n~ ~\n~ )~\n~ ~\n~ AddManifestText(~\n~ ~\n~ )~\n~ ~\n~ 'Para que se registre para abrir bases de datos~\n~ AddActivityText(main,~\n~~\n~~\n~~\n~~\n~)~\n~
Module1=appUpdater
Module10=C_NuevoCliente
Module11=C_Pedidos
@@ -1041,19 +1041,20 @@ Module12=C_Principal
Module13=C_Productos
Module14=C_Promos
Module15=C_RespaldoDiario
-Module16=C_Subs
+Module16=C_Subs_XXX
Module17=C_TicketsDia
Module18=C_UpdateAvailable
Module19=CameraExClass2
Module2=B4XMainPage
Module20=DBRequestManager
Module21=FileHandler
-Module22=ManageExternalStorage
-Module23=MAPA_RUTAS
-Module24=NotificationService
-Module25=Starter
-Module26=Subs
-Module27=Tracker
+Module22=kms_helperSubs
+Module23=ManageExternalStorage
+Module24=MAPA_RUTAS
+Module25=NotificationService
+Module26=Starter
+Module27=Subs
+Module28=Tracker
Module3=BatteryUtilities
Module4=C_Cliente
Module5=C_Clientes
@@ -1063,13 +1064,13 @@ Module8=C_Nota
Module9=C_NoVenta
NumberOfFiles=499
NumberOfLibraries=35
-NumberOfModules=27
+NumberOfModules=28
Version=12.8
@EndOfDesignText@
#Region Project Attributes
#ApplicationLabel: Mariana
#VersionCode: 1
- #VersionName: 4.03.18
+ #VersionName: 4.05.16
'SupportedOrientations possible values: unspecified, landscape or portrait.
#SupportedOrientations: portrait
#CanInstallToExternalStorage: False
diff --git a/B4A/Mariana.b4a.meta b/B4A/Mariana.b4a.meta
index ebadd72..7e5c0e1 100644
--- a/B4A/Mariana.b4a.meta
+++ b/B4A/Mariana.b4a.meta
@@ -19,6 +19,7 @@ ModuleBookmarks24=
ModuleBookmarks25=
ModuleBookmarks26=
ModuleBookmarks27=
+ModuleBookmarks28=
ModuleBookmarks3=
ModuleBookmarks4=
ModuleBookmarks5=
@@ -47,6 +48,7 @@ ModuleBreakpoints24=
ModuleBreakpoints25=
ModuleBreakpoints26=
ModuleBreakpoints27=
+ModuleBreakpoints28=
ModuleBreakpoints3=
ModuleBreakpoints4=
ModuleBreakpoints5=
@@ -75,6 +77,7 @@ ModuleClosedNodes24=
ModuleClosedNodes25=
ModuleClosedNodes26=
ModuleClosedNodes27=
+ModuleClosedNodes28=
ModuleClosedNodes3=
ModuleClosedNodes4=2
ModuleClosedNodes5=
@@ -82,6 +85,6 @@ ModuleClosedNodes6=
ModuleClosedNodes7=
ModuleClosedNodes8=
ModuleClosedNodes9=
-NavigationStack=Subs,checaPedido,1339,5,C_Principal,e_ruta_EnterPressed,1902,0,C_Clientes,calc_ean_checksum,220,0,Visual Designer,login.bal,-100,1,C_Principal,JobDone,1737,0,Subs,notiLowReturn,91,0,Subs,notiHigh,73,0,Tracker,CreateNotification,193,0,Tracker,Service_Start,61,0,C_NuevoCliente,B4XPage_Created,81,6,C_NuevoCliente,InitializeCamera2,259,2
+NavigationStack=Starter,Service_Start,50,2,Starter,Process_Globals,32,1,Starter,Service_Create,37,2,B4XMainPage,B_SERVER_Click,728,1,B4XMainPage,i_engrane_Click,714,0,B4XMainPage,b_importarBD_Click,787,0,B4XMainPage,b_envioBD_Click,766,5,Visual Designer,login.bal,-100,3,B4XMainPage,B4XPage_Appear,296,0,B4XMainPage,B4XPage_Created,282,0
SelectedBuild=0
-VisibleModules=2,12,4,5,6,26,10,27,25
+VisibleModules=2,12,4,5,6,27,22,10,28,26,16
diff --git a/B4A/Starter.bas b/B4A/Starter.bas
index d262105..1171fc7 100644
--- a/B4A/Starter.bas
+++ b/B4A/Starter.bas
@@ -16,7 +16,7 @@ Sub Process_Globals
Dim skmt As SQL
Dim ph As Phone
Public rp As RuntimePermissions
- Dim s As C_Subs
+ Dim kh As kms_helperSubs
Public FLP As FusedLocationProvider
' Private flpStarted As Boolean
Dim reqManager As DBRequestManager
@@ -40,8 +40,8 @@ End Sub
Sub Service_Create
'This is the program entry point.
'This is a good place to load resources that are not specific to a single activity.
- s.Initialize(Me, "Subs") 'Inicializamos la clase Subs
- skmt = s.inicializaBD(File.DirInternal, "kmt.db")
+ kh.Initialize(Me, "Subs") 'Inicializamos la clase Subs
+ skmt = kh.inicializaBD(File.DirInternal, "kmt.db")
gps.Initialize("GPS")
Timer1.Initialize("Timer1", Interval * 1000)
Timer1.Enabled = True
@@ -56,7 +56,7 @@ End Sub
Sub Service_Start (StartingIntent As Intent)
Service.StopAutomaticForeground 'Starter service can start in the foreground state in some edge cases.
Subs.revisaBD
- If s.traeDBReqServerDeBD(skmt) <> "N/A" Then DBReqServer = s.traeDBReqServerDeBD(skmt)
+ If kh.traeDBReqServerDeBD(skmt) <> "N/A" Then DBReqServer = kh.traeDBReqServerDeBD(skmt)
reqManager.Initialize(Me, DBReqServer)
' StartService(NotificationService)
End Sub
diff --git a/B4A/kms_helperSubs.bas b/B4A/kms_helperSubs.bas
new file mode 100644
index 0000000..9ac3dab
--- /dev/null
+++ b/B4A/kms_helperSubs.bas
@@ -0,0 +1,654 @@
+B4A=true
+Group=Default Group
+ModulesStructureVersion=1
+Type=Class
+Version=12.8
+@EndOfDesignText@
+Sub Class_Globals
+ 'These global variables will be declared once when the application starts.
+ 'These variables can be accessed from all modules.
+' Public GZip As GZipStrings 'Usa la libreria CompressStrings
+' Private su As StringUtils 'Usa la libreria StringUtils
+ Dim reqManager As DBRequestManager
+ Private EventName As String 'ignore
+ Private CallBack As Object 'ignore
+ Dim phn As Phone
+ Dim devModel As String
+ Dim db, kmt, errorLog As SQL 'Requiere la libreria "SQL" 'ignore
+ Dim ssid As String 'ignore
+ Dim reqsList As List
+ Dim reqError As Boolean = False
+ Private subsLogs As Boolean = False
+ Dim in As Intent
+ Dim intentUsado As Boolean = False
+End Sub
+
+'You can add more parameters here.
+Public Sub Initialize (vCallback As Object, vEventName As String) As Object
+ reqsList.Initialize
+ EventName = vEventName
+ CallBack = vCallback
+ db = dbInit
+ reqManager = reqManagerInit
+ Return Me
+End Sub
+
+'Inicializa la BD con "kmt.db" en File.DirInternal, si el archivo no existe, lo copia desde File.DirAssets.
+'Dispara el evento "dbOk" cuando termina.
+Sub dbInit As SQL
+ If File.Exists(File.DirInternal, "kmt.db") = False Then File.Copy(File.DirAssets, "kmt.db", File.DirInternal, "kmt.db")
+ db.Initialize(File.DirInternal,"kmt.db", True)
+ dbOk(True)
+' Log(db.IsInitialized)
+ Return db
+End Sub
+
+Sub dbOk(Success As Boolean)
+ If SubExists(CallBack, EventName & "_dbOk") Then
+ CallSub2(CallBack, EventName & "_dbOk", Success)
+ End If
+End Sub
+
+'Inicializamos el DBReqServer.
+Sub reqManagerInit As DBRequestManager
+ Private rm As DBRequestManager
+ rm.Initialize(Me, traeDBReqServerDeBD(db))
+ Log($"Inicializamos reqManager con ${traeDBReqServerDeBD(db)}"$)
+ Return rm
+End Sub
+
+'Reinicializamos el DBReqServer de C_Subs.
+Sub reqManagerReInit
+ Log("reqManager ReInit")
+ reqManager = reqManagerInit
+End Sub
+
+Sub envioTest
+ reqsList.Initialize ' Ponemos la lista de DBRequests en cero.
+ Private cmd As DBCommand
+ cmd.Initialize
+ cmd.Name = "select_fecha"
+ For i = 0 To 50
+' Sleep(200)
+ reqManager.ExecuteQuery(cmd, 0, $"select_fecha_${i}"$)
+ reqsList.Add($"select_fecha_${i}"$)
+ Next
+End Sub
+
+'Dispara el evento "_envioOk" del caller.
+Sub envioOk(Success As Boolean)
+' Log($"_ENVIOOK_"$)
+ If SubExists(CallBack, EventName & "_envioOk") Then
+ CallSub2(CallBack, EventName & "_envioOk", Success)
+ End If
+End Sub
+
+Sub JobDone(Job As HttpJob)
+ LogColor("C_SUBS JOBDONE - " & Job.Success, Colors.Red)
+ If Job.Success = False Then
+ Log($"Error en el request ${Job.Tag}"$)
+ LogColor("** " & Job.Tag & " Error: " & Job.ErrorMessage, Colors.Red)
+ If reqsList.IndexOf(Job.Tag) > -1 Then reqsList.RemoveAt(reqsList.IndexOf(Job.Tag))
+ reqError = True
+ Else
+ If Job.JobName = "DBRequest" Then
+ Dim resultado As DBResult = reqManager.HandleJob(Job)
+ If reqsList.IndexOf(resultado.Tag) > -1 Then reqsList.RemoveAt(reqsList.IndexOf(resultado.Tag))
+ If resultado.Tag = "select_fecha" Then
+ For Each records() As Object In resultado.Rows
+ For Each k As String In resultado.Columns.Keys
+ Log(resultado.Tag & ": " & k & ": " & records(resultado.Columns.Get(k)))
+ Next
+ Next
+ End If
+ End If
+ End If
+ Log(reqsList.Size)
+ If reqsList.Size = 0 Then 'Ya no hay DBReqs pendientes.
+ Log(reqError)
+ If Not(reqError) Then
+ envioOk(True)
+ Else
+ envioOk(False)
+ End If
+ reqError = False
+ Log("-= FIN =-")
+ End If
+ Job.Release
+End Sub
+
+'Pone el valor de phn.Model en la variable global "devModel"
+Sub getPhnId As String 'ignore
+ 'Requiere la libreria "Phone"
+ devModel = phn.Model
+ If devModel.Length <= 3 Then 'Si phn.Model esta en blanco ...
+ Dim t As String = phn.GetSettings("android_id") 'Intentamos con "android_id"
+ devModel = t
+ End If
+ If devModel.Length >= 3 Then 'Si tenemos valor para phn.Model
+ File.WriteString(File.DirInternal, "phnId.txt", devModel) 'Sobreescribimos archivo phnId.txt with deviceId
+' Log("Tenemos phnId: "&devModel&" "&File.DirInternal&"/phn.txt sobreescrito")
+ Else If devModel.Length < 3 Then ' Si no tenemos valor, lo leemos de phnId.txt
+ Dim s As String = File.ReadString(File.DirInternal, "phnId.txt")
+ devModel = s
+' Log("Leemos id de "&File.DirInternal&"/phnId.txt")
+' Log(devModel)
+ End If
+ Return devModel
+End Sub
+
+'Convierte una fecha al formato yyMMddHHmmss
+Sub fechaKMT(fecha As String) As String 'ignore
+' Log(fecha)
+ Dim OrigFormat As String = DateTime.DateFormat 'save orig date format
+ DateTime.DateFormat="yyMMddHHmmss"
+ Dim nuevaFecha As String=DateTime.Date(fecha)
+ DateTime.DateFormat=OrigFormat 'return to orig date format
+' Log(nuevaFecha)
+ Return nuevaFecha
+End Sub
+
+'Escribimos las coordenadas y fecha a un archivo de texto
+Sub guardaInfoEnArchivo(coords As String) 'ignore
+ ' Cambiamos el formato de la hora
+ Dim OrigFormat As String=DateTime.DateFormat 'save orig date format
+ DateTime.DateFormat="MMM-dd HH:mm:ss"
+ Dim lastUpdate As String=DateTime.Date(DateTime.Now)
+ DateTime.DateFormat=OrigFormat 'return to orig date format
+
+ Dim ubic As String = coords&","&lastUpdate
+ Dim out As OutputStream = File.OpenOutput(File.DirInternal, "gps.txt", True)
+ Dim s As String = ubic & CRLF
+ Dim t() As Byte = s.GetBytes("UTF-8")
+ out.WriteBytes(t, 0, t.Length)
+ out.Close
+End Sub
+
+'Escribimos las coordenadas (latitud, longitud, fecha) y fecha a una BD
+Sub guardaInfoEnBD(coords As String) 'ignore
+ Log("Guardamos ubicacion en BD - "&coords)
+ Try
+ Dim latlon() As String = Regex.Split("\|", coords)
+ If latlon.Length < 2 Then latlon = Regex.Split(",", coords) 'Si son menos de 2, entonces estan separadas por comas y no por "|"
+ If subsLogs Then Log("LatLon="&latlon)
+ kmt.ExecNonQuery2("INSERT INTO RUTA_GPS(FECHA, LAT, LON) VALUES (?,?,?)", Array As Object (latlon(2),latlon(0),latlon(1)))
+ Catch
+ LogColor(LastException, Colors.red)
+ End Try
+End Sub
+
+'Limpiamos la tabla RUTA_GPS de la BD
+Sub deleteGPS_DB 'ignore
+ kmt.ExecNonQuery("delete from RUTA_GPS")
+ kmt.ExecNonQuery("vacuum;")
+ ToastMessageShow("Borramos BD Coords GPS", False)
+End Sub
+
+'Limpiamos la tabla errorLog de la BD
+Sub deleteErrorLog_DB 'ignore
+ errorLog.ExecNonQuery("delete from errores")
+ errorLog.ExecNonQuery("vacuum;")
+ ToastMessageShow("BD Errores Borrada", False)
+End Sub
+
+'Mandamos "coords" en un mensaje a "Sprvsr"
+'Sub mandamosLoc(coords As String) 'ignore
+'' Log("Iniciamos mandamosLoc "&coords)
+'' Log("locRequest="&Tracker.locRequest)
+' guardaInfoEnBD(coords)'Escribimos coordenadas y fecha a una bd
+' Dim t As String
+' If Tracker.locRequest="Activa" Then
+' If PushService.au = 1 Then
+' t = "au" ' es una actualizacion
+' Else
+' t = "u" ' es una peticion
+' End If
+' Dim params As Map = CreateMap("topic":"Sprvsr", "coords":coords, "t":t, "b":PushService.battery, "mt":Main.montoActual)
+' CallSub2(PushService, "mandaMensaje",params)
+' Tracker.locRequest="Enviada"
+' CallSubDelayed(Tracker,"CreateLocationRequest")
+' End If
+'End Sub
+
+'Regresa la fecha y hora de hoy a las 00:00 en el formato "yyMMddHHMMSS"
+Sub fechaInicioHoy As String 'ignore
+ Dim OrigFormat As String = DateTime.DateFormat 'save orig date format
+ DateTime.DateFormat="yyMMdd"
+ Private h As String = DateTime.Date(DateTime.Now)&"000000"
+ DateTime.DateFormat=OrigFormat 'return to orig date format
+ Log("Hoy="&h)
+ Return h
+End Sub
+
+'Guardamos "texto" a la bitacora
+Sub log2DB(texto As String) 'ignore
+ LogColor(fechaKMT(DateTime.Now)&" - log2BD: '"&texto&"'", Colors.LightGray)
+ kmt.ExecNonQuery2("INSERT INTO bitacora(fecha, texto) VALUES (?,?)", Array As Object (fechaKMT(DateTime.now), texto))
+End Sub
+
+'Regresa verdadero si ya pasaron XX minutos de la fecha dada
+Sub masDeXXMins(hora As Int, mins As Int) As Boolean 'ignore
+ If (hora + mins * DateTime.TicksPerMinute) < DateTime.Now Then
+ Return True
+ Else
+ Return False
+ End If
+End Sub
+
+'Regresa verdadero si ya pasaron XX minutos de la fechaKMT dada
+Sub masDeXXMinsKMT(hora As String, mins As Int) As Boolean 'ignore
+ Try
+ ' LogColor($"Hora=${fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute)}, Mins=${mins}, Actual=${fechaKMT(DateTime.Now)}"$,Colors.red)
+ If fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute < DateTime.Now Then
+ ' Log("+++ +++ "&fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute) & " < " & fechaKMT(DateTime.Now))
+ Return True
+ Else
+ ' Log("+++ +++ "&fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute) & " > " & fechaKMT(DateTime.Now))
+ Return False
+ End If
+ Catch
+ Log(LastException)
+ End Try
+End Sub
+
+'Limpiamos la tabla "bitacora" de la BD
+Sub borraLogDB 'ignore
+ LogColor("Borramos BD de log", Colors.Magenta)
+ kmt.ExecNonQuery("delete from bitacora")
+ kmt.ExecNonQuery("vacuum;")
+End Sub
+
+'Monitoreamos los servicios para ver si estan activos (No pausados), y si no, los reniciamos
+'Sub Monitor 'ignore
+' Private monitorStatus As Boolean = True
+' LogColor("Corriendo Subs.Monitor", Colors.RGB(161,150,0))
+' If IsPaused(Tracker) Then
+' log2DB("Reiniciando 'Tracker Pausado' desde Subs.Monitor")
+' StartService(Tracker)
+' monitorStatus = False
+' Else
+' CallSubDelayed(Tracker, "revisaFLP")
+' End If
+' If IsPaused(PushService) Then
+' log2DB("Reiniciando 'PushService Pausado' desde Subs.Monitor")
+' StartService(PushService)
+' monitorStatus = False
+' Else
+' revisaPushService
+' End If
+' If monitorStatus Then LogColor(" +++ +++ Servicios Activos", Colors.Green)
+'End Sub
+
+'Convierte una fecha en formato YYMMDDHHMMSS a Ticks
+Sub fechaKMT2Ticks(fKMT As String) As Long 'ignore
+ Try
+ If fKMT.Length = 12 Then
+ Private parteFecha As String = fKMT.SubString2(0,6)
+ Private parteHora As String = fKMT.SubString(6)
+ Private OrigFormat As String = DateTime.DateFormat 'save original date format
+ DateTime.DateFormat="yymmdd"
+ DateTime.TimeFormat="HHmmss"
+ Private ticks As Long = DateTime.DateTimeParse(parteFecha,parteHora)
+ DateTime.DateFormat=OrigFormat 'return to original date format
+ Return ticks
+ Else
+ Log("Formato de fecha incorrecto, debe de ser 'YYMMDDHHMMSS', no '"&fKMT&"' largo="&fKMT.Length)
+ Return 0
+ End If
+ Catch
+ Log(LastException)
+ LogColor($"Fecha dada: ${fKMT}, Parte Fecha: ${parteFecha}, Parte Hora: ${parteHora}"$, Colors.Red)
+ Return 0
+ End Try
+End Sub
+
+Sub InstallAPK(dir As String, apk As String) 'ignore
+ If File.Exists(dir, apk) Then
+ Dim i As Intent
+ i.Initialize(i.ACTION_VIEW, "file://" & File.Combine(dir, apk))
+ i.SetType("application/vnd.android.package-archive")
+ StartActivity(i)
+ End If
+End Sub
+
+'Copia la base de datos del almacenamiento interno al externo en el directorio kmts.
+Sub copiaDB(result As Boolean) 'ignore
+ ToastMessageShow("copiaDB", False)
+ If result Then
+ Dim p As String
+ If File.ExternalWritable Then
+ p = File.DirInternal
+' Log("Externo")
+ Else
+ p = File.DirInternal
+' Log("Interno")
+ End If
+ Dim theDir As String
+ Try
+ File.MakeDir(File.DirInternal,"kmts")
+ theDir = "/kmts"
+ Catch
+ theDir = ""
+ End Try
+ Try
+ File.Copy(File.DirInternal,"kmt.db",File.DirInternal&theDir,"cedex_kmt.db")
+ File.Copy(File.DirInternal,"errorLog.db",File.DirInternal&theDir,"cedex_errorLog.db")
+ ToastMessageShow("BD copiada!", False)
+ Catch
+ ToastMessageShow("No se pudo hacer la copia: "&LastException, True)
+ End Try
+ Log("rootExternal="&p)
+ Log("File.DirInternal="&File.DirInternal)
+ Log("File.DirInternal="&File.DirInternal)
+ Else
+ ToastMessageShow("Sin permisos", False)
+ End If
+End Sub
+
+'Hace visible y trae al frente el panel con los parametros "Top" y "Left" dados.
+Sub panelVisible(panel As Panel, top As Int, left As Int) 'ignore
+ panel.BringToFront
+ panel.Visible = True
+ panel.Top = top
+ panel.Left = left
+End Sub
+
+'Centra una etiqueta dentro de un elemento superior.
+Sub centraEtiqueta(elemento As Label, anchoElementoSuperior As Int) 'ignore
+ elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2)
+End Sub
+
+'Centra un panel horizontalmente dentro de un elemento superior.
+Sub centraPanel(elemento As Panel, anchoElementoSuperior As Int) 'ignore
+ elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2)
+End Sub
+
+'Centra un panel verticalmente dentro de un elemento superior.
+Sub centraPanelV(elemento As Panel, altoElementoSuperior As Int) 'ignore
+ elemento.Top = Round(altoElementoSuperior/2)-(elemento.Height/2)
+End Sub
+
+'Centra una barra de progreso dentro de un elemento superior.
+Sub centraProgressBar(elemento As ProgressBar, anchoElementoSuperior As Int) 'ignore
+ elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2)
+End Sub
+
+'Regresa la fecha en el formato "MM/dd/yyyy"
+Sub traeFecha As String 'ignore
+ DateTime.DateFormat = "MM/dd/yyyy"
+ Private sDate As String = DateTime.Date(DateTime.Now)
+ Private sTime As String = DateTime.Time(DateTime.Now)
+ Return sDate & sTime
+End Sub
+
+'Guarda el nombre y version de la app en CAT_VARIABLES.
+Sub guardaAppInfo(skmt As SQL) 'ignore
+ skmt.ExecNonQuery("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'EMPRESA' or CAT_VA_DESCRIPCION = 'APP_NAME' or CAT_VA_DESCRIPCION = 'APP_VERSION'")
+ skmt.ExecNonQuery($"insert into CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) values ('APP_NAME', '${Application.LabelName}')"$)
+ skmt.ExecNonQuery($"insert into CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) values ('APP_VERSION', '${Application.VersionName}')"$)
+End Sub
+
+'Muestra en el Log los campos y valores que regresan en el JobDone.
+Sub logJobDoneResultados(resultado As DBResult) 'ignore
+ For Each records() As Object In resultado.Rows
+ LogColor($"====== ${resultado.Tag} - REGISTROS = ${resultado.Rows.Size}"$, Colors.RGB(215,37,0))
+ For Each k As String In resultado.Columns.Keys
+ LogColor(k & " = " & records(resultado.Columns.Get(k)), Colors.RGB(215,37,0))
+ Next
+ Next
+End Sub
+
+'Regresa la base de datos especificada ya inicializada.
+Sub inicializaBD(ruta As String, BDName As String) As SQL 'ignore
+ Dim skmt As SQL
+ If File.Exists(ruta, BDName) = False Then
+ File.Copy(File.DirAssets, BDName, ruta, BDName)
+ LogColor($"Copiamos ${BDName} de ${File.DirAssets} a ${ruta}"$,Colors.Green)
+ End If
+ skmt.Initialize(ruta, BDName, True)
+ Return skmt
+End Sub
+
+'Agrega una columna a la tabla especificada.
+'Hay que indicar el "tipo" de la columna (TEXT, INTEGER, ETC)
+'Ej. agregaColumna("TABLA", "COLUMNA", "TIPO")
+Sub agregaColumna(tabla As String, columna As String, tipo As String) 'ignore
+ Try 'Intentamos usar "pragma_table_info" para revisar si existe la columna en la tabla
+ Private c As Cursor = db.ExecQuery($"SELECT COUNT(*) AS fCol FROM pragma_table_info('${tabla}') WHERE name='${columna}'"$)
+ c.Position = 0
+ If c.GetString("fCol") = 0 Then 'Si no esta la columna la agregamos
+ db.ExecNonQuery($"ALTER TABLE ${tabla} ADD COLUMN ${columna} ${tipo}"$)
+ Log($"Columna "${columna} ${tipo}", agregada a "${tabla}"."$)
+ End If
+ Catch 'Si no funciona "pragma_table_info" lo hacemos con try/catch
+ Try
+ db.ExecNonQuery($"ALTER TABLE ${tabla} ADD COLUMN ${columna} ${tipo}"$)
+ Log($"Columna "${columna} ${tipo}", agregada a "${tabla}".."$)
+ Catch
+ Log(LastException)
+ End Try
+ End Try
+End Sub
+
+'Regresa el DBReqServer desde CAT_VARIABLES o "N/A" si no existe.
+Sub traeDBReqServerDeBD(dbx As SQL) As String 'ignore
+ Dim srvr As String = "N/A"
+ Dim rs As ResultSet = dbx.ExecQuery("select CAT_VA_VALOR from cat_variables where CAT_VA_DESCRIPCION = 'SERVER'")
+ If rs.RowCount > 0 Then
+ rs.NextRow
+ srvr = rs.GetString("CAT_VA_VALOR")
+ End If
+ Return srvr
+End Sub
+
+'Regresa el valor de intervalo desde CAT_VARIABLES o "30" si no existe.
+Sub traeIntervaloDeBD As String 'ignore
+ Dim intrvl As String = "30"
+ Dim rs As ResultSet = db.ExecQuery("select valor from cat_variables where nombre = 'intervalo'")
+ If rs.RowCount > 0 Then
+ rs.NextRow
+ intrvl = rs.GetString("valor")
+ End If
+ Return intrvl
+End Sub
+
+'Regresa el valor timeout desde CAT_VARIABLES o "9000" si no existe.
+Sub traeTimeoutDeBD As String 'ignore
+ Dim tmout As String = "9000"
+ Dim rs As ResultSet = db.ExecQuery("select valor from cat_variables where nombre = 'timeout'")
+ If rs.RowCount > 0 Then
+ rs.NextRow
+ tmout = rs.GetString("valor")
+ End If
+ Return tmout
+End Sub
+
+'Crea una notificación con el "body" dado y regresa el objeto.
+Sub CreateNotification (Body As String) As Notification 'ignore
+ Dim notification As Notification
+ notification.Initialize2(notification.IMPORTANCE_LOW)
+ notification.Icon = "icon"
+ notification.SetInfo("Tester", Body, Main)
+ Return notification
+End Sub
+
+'Genera una notificacion con importancia alta
+Sub notiHigh(title As String, body As String, id As String, activity As Object) 'ignore
+ activity = Main
+ Private notif As Notification
+ notif.Initialize2(notif.IMPORTANCE_HIGH)
+ notif.Icon = "icon"
+ notif.Vibrate = False
+ notif.Sound = False
+ notif.AutoCancel = True
+' If logger Then Log("notiHigh: "&title)
+ notif.SetInfo(title, body, activity)
+' Log("notiHigh SetInfo")
+ notif.Notify(id)
+End Sub
+
+'Regresa el objeto de una notificacion con importancia baja
+Sub notiLowReturn(title As String, Body As String, id As Int) As Notification 'ignore
+ Private notification As Notification
+ notification.Initialize2(notification.IMPORTANCE_LOW)
+' Log("notiLowReturn: "&title)
+ notification.Icon = "icon"
+ notification.Sound = False
+ notification.Vibrate = False
+ notification.SetInfo(title, Body, Main)
+ notification.Notify(id)
+' Log("notiLowReturn SetInfo")
+ Return notification
+End Sub
+
+'Regresa el almacen actual de la base de datos.
+Sub traeAlmacen As String 'ignore
+ Private c As Cursor
+ Private a As String
+ c = db.ExecQuery("select ID_ALMACEN from CAT_ALMACEN")
+ c.Position = 0
+ a = C.GetString("ID_ALMACEN")
+ c.Close
+ Return a
+End Sub
+
+'Regresa la ruta actual de la base de datos.
+Sub traeRuta As String 'ignore
+ Private c As Cursor
+ Private r As String
+ c = db.ExecQuery("select CAT_CL_RUTA from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)")
+ r = "0"
+ If c.RowCount > 0 Then
+ c.Position=0
+ r = c.GetString("CAT_CL_RUTA")
+ End If
+ c.Close
+ Return r
+End Sub
+
+'Mandamos los pedidos pendientes (pc_envio_ok <> 1).
+Sub mandaPendientes 'ignore
+ Private logger As Boolean = False
+ 'PEDIDO_CLIENTE (Pendientes)
+ Private c As Cursor = db.ExecQuery("SELECT PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT, PC_COSTO_SIN, PC_RUTA, PC_ALMACEN, PC_FACTURA FROM PEDIDO_CLIENTE where pc_envio_ok <> 1")
+ If logger Then Log($"Pedido_Cliente PENDIENTE: ${c.RowCount}"$)
+ Private almacen As String = traeAlmacen
+ Private ruta As String = traeRuta
+ If c.RowCount>0 Then
+ For i = 0 To c.RowCount - 1
+ c.Position = i
+ Dim cmd As DBCommand
+ cmd.Initialize
+ cmd.Name = "DELETE_PEDIDO_MARDS_PC"
+ cmd.Parameters = Array As Object(almacen, ruta, c.GetString("PC_CLIENTE") )
+ reqManager.ExecuteCommand(cmd , "DEL_PC")
+
+ Dim cmd As DBCommand
+ cmd.Initialize
+ cmd.Name = "insert_pedidos_MARDS"
+ If logger Then Log($"${c.GetString("PC_CLIENTE")}, ${almacen}"$)
+ cmd.Parameters = Array As Object(C.GetString("PC_CLIENTE"), C.GetString("PC_FECHA"), C.GetString("PC_USER"), C.GetString("PC_NOART"), C.GetString("PC_MONTO"), C.GetString("PC_LON"), C.GetString("PC_LAT"), almacen, ruta, C.GetString("PC_COSTO_SIN"), C.GetString("PC_FACTURA"))
+ reqManager.ExecuteCommand(cmd , $"ins_pedidosPendientes_head_${c.GetString("PC_CLIENTE")}"$)
+ Next
+ End If
+
+ 'PEDIDO (Pendientes)
+ c=Starter.skmt.ExecQuery("SELECT PC_ENVIO_OK, PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_FECHA, PE_USUARIO, PE_COSTO_SIN, PE_RUTA, PE_DESC, PE_FOLIO FROM pedido_cliente left join PEDIDO where pc_cliente = pe_cliente and pc_envio_ok <> 1")
+ If logger Then Log($"Pedido PENDIENTE: ${c.RowCount}"$)
+ If c.RowCount>0 Then
+ For i = 0 To c.RowCount - 1
+ c.Position = i
+ Dim cmd As DBCommand
+
+ cmd.Initialize
+ cmd.Name = "DELETE_PEDIDO_MARDS_PE"
+ cmd.Parameters = Array As Object(almacen, ruta,c.GetString("PE_CLIENTE") )
+ reqManager.ExecuteCommand(cmd , "DEL_PE")
+
+ cmd.Initialize
+ cmd.Name = "insert_pedido_MARDS"
+ cmd.Parameters = Array As Object(c.GetString("PE_CEDIS"), almacen, c.GetString("PE_COSTO_TOT"), c.GetString("PE_COSTOU"), c.GetString("PE_CANT"), c.GetString("PE_PRONOMBRE"), c.GetString("PE_PROID"), c.GetString("PE_CLIENTE"), c.GetString("PE_FECHA"), c.GetString("PE_USUARIO"), c.GetString("PE_RUTA"), C.GetString("PE_COSTO_SIN"), c.GetString("PE_DESC"), c.GetString("PE_FOLIO"))
+ reqManager.ExecuteCommand(cmd , $"ins_pedidosPendientes_prods_${c.GetString("PE_CLIENTE")}"$)
+ Next
+ End If
+
+ 'ABONOS
+ Dim ab As Cursor = db.ExecQuery($"SELECT * from ABONOS where a_enviado is null"$)
+ If logger Then Log(ab.RowCount)
+ If ab.RowCount > 0 Then
+ For i = 0 To ab.RowCount - 1
+ ab.Position = i
+ Dim cmd As DBCommand
+ cmd.Initialize
+ cmd.Name = "insert_abono_MARDS"
+ 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") )
+ reqManager.ExecuteCommand(cmd , $"ins_abonosPendientes_${ab.GetString("a_cliente")}"$)
+ If logger Then Log($"ins_abonosPendientes_${ab.GetString("a_cliente")}"$)
+ Next
+ End If
+ ab.Close
+End Sub
+
+'Borra el pedido del cliente actual.
+'Borra los registros de la tabla "pedido" y "pedido_cliente"
+'Actualiza las tablas "cat_gunaprod" y "kmt_info".
+Sub borraPedidoClienteActual As String
+ Private thisC As Cursor
+ thisC=Starter.skmt.ExecQuery("select PE_PROID,PE_CANT FROM PEDIDO where pe_cliente in (Select CUENTA from cuentaa) ")
+ If thisC.RowCount>0 Then
+ For i=0 To thisC.RowCount -1
+ thisC.Position=i
+ Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_id = ?", Array As Object(thisC.GetString("PE_CANT"),thisC.GetString("PE_PROID")))
+ Starter.skmt.ExecNonQuery2("INSERT INTO INVENT_X_ENVIAR (ALMACEN , PROID , CANTIDAD ) VALUES(?,?,?) ", Array As Object (traeAlmacen, thisC.GetString("PE_PROID"),thisC.GetString("PE_CANT")* -1))
+ Next
+ End If
+ Starter.skmt.ExecNonQuery("delete from pedido_cliente where pc_cliente in (Select CUENTA from cuentaa)")
+ Starter.skmt.ExecNonQuery("delete from pedido where pe_cliente in (Select CUENTA from cuentaa)")
+ Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)")
+ Return 1
+End Sub
+
+'Regresa si se debe de usar el intent de importar la base d datos desde Whatsapp.
+Sub traeUsarIntentBDWA As Boolean 'ignore
+ Private BDWA As Boolean = False
+ Private x As Cursor = Starter.skmt.ExecQuery($"select CAT_VA_VALOR from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'IMPORTAR_BD_WA'"$)
+ If x.RowCount > 0 Then
+ x.Position = 0
+ If x.GetString("CAT_VA_VALOR") = "true" Then BDWA = True
+ End If
+' Log($"cb_importarBDWA = ${BDWA}"$)
+ Return BDWA
+End Sub
+
+' Se revisa si hay una intención (intent) de abrir una base de datos y si es así, entonces se importa esa base de datos.
+Sub importaBDDesdeWhatsApp
+ Private tmpBDWA As Boolean = traeUsarIntentBDWA
+ If Not(in.IsInitialized) Then in = B4XPages.GetNativeParent(B4XPages.MainPage).GetStartingIntent ' Si se usa esta funcion en Mainpage, se pone "Me" en lugar de B4XPages.MainPage.
+ If Not(intentUsado) And in <> Null Then
+' Log(in)
+ intentUsado = True
+' Log(in.As(String))
+ If in.GetData <> Null Then
+ Dim XmlData As String
+ XmlData = in.GetData
+ Try
+ Dim OutStr As OutputStream = File.OpenOutput(File.DirInternal,"kmt.db",False)
+ Dim InStr As InputStream = File.OpenInput("ContentDir",XmlData)
+ File.Copy2(InStr,OutStr)
+ LogColor("BD copiada a interna.", Colors.Blue)
+ OutStr.Close
+ If in.As(String).Contains("whatsapp") Then ToastMessageShow("BD cargada desde Whatsapp", False)
+ Catch
+ Log(LastException)
+ End Try
+' ExitApplication
+ db.ExecNonQuery("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'IMPORTAR_BD_WA'")
+ db.ExecNonQuery($"insert into CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) values ('IMPORTAR_BD_WA', '${tmpBDWA}')"$)
+ Private a As Cursor = db.ExecQuery($"select CAT_VA_VALOR from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'APP_NAME'"$)
+ If a.RowCount > 0 Then
+ a.Position = 0
+ ToastMessageShow($"BD de "${a.GetString("CAT_VA_VALOR")}" cargada."$, True)
+ End If
+ End If
+ End If
+End Sub
\ No newline at end of file