mirror of
https://github.com/KeymonSoft/Profina-Reparto_V2.git
synced 2026-04-17 12:56:08 +00:00
Se cambia el cargar a carga se cambia el l_ruta por e_ruta y se agrega el deshabilitar validaciones con el KMTP
1190 lines
48 KiB
QBasic
1190 lines
48 KiB
QBasic
B4A=true
|
|
Group=Default Group
|
|
ModulesStructureVersion=1
|
|
Type=StaticCode
|
|
Version=11
|
|
@EndOfDesignText@
|
|
'Code module
|
|
'Subs in this code module will be accessible from all modules.
|
|
Sub Process_Globals
|
|
'These global variables will be declared once when the application starts.
|
|
'These variables can be accessed from all modules.
|
|
Public GZip As GZipStrings
|
|
Private su As StringUtils
|
|
Dim phn As Phone
|
|
Dim devModel As String
|
|
Dim kmt, errorLog As SQL 'Requiere la libreria "SQL"
|
|
' Dim wifi As MLwifi
|
|
Dim ssid As String 'ignore
|
|
Dim rutaMaxPoints As Int = 3000
|
|
Dim rutaHrsAtras As Int = 48
|
|
' Dim rutaInicioHoy As String = ""
|
|
Dim in As Intent
|
|
Dim intentUsado As Boolean = False
|
|
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
|
|
|
|
' 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
|
|
Log("Revisamos intent de importar desde whatsapp")
|
|
Log(B4XPages.MainPage.intentUsado)
|
|
Log(in)
|
|
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(B4XPages.MainPage.intentUsado) And in <> Null Then
|
|
' Log(in)
|
|
LogColor("Importamos base de datos desde Whatsapp.", Colors.blue)
|
|
B4XPages.MainPage.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
|
|
' 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', '${tmpBDWA}')"$)
|
|
Private a As Cursor = Starter.skmt.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
|
|
a = Starter.skmt.ExecQuery($"select * from usuarioa"$)
|
|
If a.RowCount > 0 Then
|
|
a.Position = 0
|
|
B4XPages.MainPage.user.Text = a.GetString("USUARIO")
|
|
B4XPages.MainPage.pass.Text = a.GetString("PASS")
|
|
End If
|
|
End If
|
|
End If
|
|
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
|
|
|
|
|
|
'Comprime y regresa un texto (str) en base64
|
|
Sub compress(str As String) As String 'ignore
|
|
'Requiere la libreria "CompressStrings"
|
|
Dim compressed() As Byte = GZip.compress(str)
|
|
' Log($"UncompressedBytesLength: ${str.Length}"$)
|
|
' Log($"CompressedBytesLength: ${compressed.Length}"$)
|
|
Dim base64 As String = su.EncodeBase64(compressed)
|
|
Log($"Comprimido: ${base64.Length}"$)
|
|
' Log($"CompressedBytes converted to base64: ${base64}"$)
|
|
Return base64
|
|
End Sub
|
|
|
|
'Descomprime y regresa un texto en base64
|
|
Sub decompress(base64 As String) As String 'ignore
|
|
Dim decompressedbytes() As Byte = su.DecodeBase64(base64)
|
|
' Log($"decompressedbytesLength: ${decompressedbytes.Length}"$)
|
|
Dim bc As ByteConverter
|
|
Dim uncompressed As String = bc.StringFromBytes(decompressedbytes,"UTF8")
|
|
Log($"Descomprimido: ${uncompressed.Length}"$)
|
|
' Log($"Decompressed String = ${uncompressed}"$)
|
|
Return uncompressed
|
|
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
|
|
|
|
'Trae un string con hora, minutos y segundos - HHmmss
|
|
Sub hmsKMT As String 'ignore
|
|
' Log(fecha)
|
|
Dim OrigFormat As String = DateTime.DateFormat 'save orig date format
|
|
DateTime.DateFormat="HHmmss"
|
|
Private nuevaHora As String=DateTime.Date(DateTime.Now)
|
|
DateTime.DateFormat=OrigFormat 'return to orig date format
|
|
' Log(nuevaFecha)
|
|
Return nuevaHora
|
|
End Sub
|
|
|
|
'Genera una notificacion con importancia alta
|
|
Sub notiHigh(title As String, body As String, activity As Object) 'ignore
|
|
Private notif As Notification
|
|
notif.Initialize2(notif.IMPORTANCE_HIGH)
|
|
notif.Icon = "icon"
|
|
notif.Vibrate = False
|
|
notif.Sound = False
|
|
notif.AutoCancel = True
|
|
Log("notiHigh: "&title)
|
|
notif.SetInfo(title, body, activity)
|
|
' Log("notiHigh SetInfo")
|
|
notif.Notify(777)
|
|
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
|
|
|
|
'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
|
|
If Starter.logger Then 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 Main.Logger Then Log("LatLon="&latlon)
|
|
If Not(kmt.IsInitialized) Then revisaBD
|
|
kmt.ExecNonQuery2("INSERT INTO RUTA_GPS(fecha, lat, lon) VALUES (?,?,?)", Array As Object (latlon(2),latlon(0),latlon(1)))
|
|
Catch
|
|
Log(LastException)
|
|
End Try
|
|
End Sub
|
|
|
|
|
|
'Regresa la ruta solicitada comprimida y en base64
|
|
Sub dameRuta(inicioRuta As String, origenRuta As String) As String 'ignore
|
|
'Requiere la libreria "SQL"
|
|
Dim fechaInicio As String
|
|
Try 'incioRuta es numero
|
|
inicioRuta = inicioRuta * 1
|
|
' Log("fechaInicio numerica="&fechaInicio)
|
|
fechaInicio = fechaKMT(DateTime.Now - (DateTime.TicksPerHour * inicioRuta))
|
|
Catch 'inicioRuta es string
|
|
fechaInicio = fechaInicioHoy
|
|
' Log("fechaInicio string="&fechaInicio)
|
|
End Try
|
|
If Starter.logger Then Log("fechaInicio: "&fechaInicio&" | rutaHrsAtras="&rutaHrsAtras) 'fechaKMT(DateTime.Now)
|
|
Dim c As Cursor
|
|
If kmt.IsInitialized = False Then kmt.Initialize(Starter.ruta, "kmt.db", True)
|
|
If Starter.logger Then Log("select FECHA, LAT, LON from "& origenRuta &" where FECHA > " & fechaInicio & " order by FECHA desc limit " & rutaMaxPoints)
|
|
c = kmt.ExecQuery("select FECHA, LAT, LON from "& origenRuta &" where FECHA > " & fechaInicio & " order by FECHA desc limit " & rutaMaxPoints)
|
|
c.Position = 0
|
|
Dim ruta2 As String = ""
|
|
If c.RowCount>0 Then
|
|
For i=0 To c.RowCount -1
|
|
c.Position=i
|
|
ruta2=ruta2&CRLF&c.GetString("LAT")&","&c.GetString("LON")&","&c.GetString("FECHA")
|
|
B4XPages.MainPage.fechaRuta = c.GetString("FECHA")
|
|
Next
|
|
End If
|
|
c.Close
|
|
Return compress(ruta2)
|
|
End Sub
|
|
|
|
'Limpiamos la tabla RUTA_GPS de la BD
|
|
Sub deleteGPS_DB 'ignore
|
|
kmt.ExecNonQuery("delete from RUTA_GPS")
|
|
kmt.ExecNonQuery("vacuum;")
|
|
End Sub
|
|
|
|
'Limpiamos la tabla errorLog de la BD
|
|
Sub deleteErrorLog_DB 'ignore
|
|
If Not(errorLog.IsInitialized) Then revisaBD
|
|
errorLog.ExecNonQuery("delete from errores")
|
|
errorLog.ExecNonQuery("vacuum;")
|
|
ToastMessageShow("Borrada", False)
|
|
End Sub
|
|
|
|
'Borramos el archio "gps.txt"
|
|
Sub borramosArchivoGPS 'ignore
|
|
Dim out As OutputStream = File.OpenOutput(File.DirInternal, "gps.txt", False)
|
|
Dim s As String = ""
|
|
Dim t() As Byte = s.GetBytes("UTF-8")
|
|
out.WriteBytes(t, 0, t.Length)
|
|
out.Close
|
|
End Sub
|
|
|
|
'Revisa que exista la BD y si es necesario crea algunas tablas dentro de ella
|
|
Sub revisaBD 'ignore
|
|
If Not(File.Exists(Starter.ruta, "kmt.db")) Then File.Copy(File.DirAssets, "kmt.db", Starter.ruta, "kmt.db")
|
|
If Not(kmt.IsInitialized) Then kmt.Initialize(Starter.ruta, "kmt.db", True)
|
|
kmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS RUTA_GPS(FECHA INTEGER, LAT TEXT, LON TEXT)")
|
|
' kmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS UUC(fecha INTEGER, lat TEXT, lon TEXT)") 'LastKnownLocation
|
|
kmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS bitacora(fecha INTEGER, texto TEXT)") 'Bitacora
|
|
' kmt.ExecNonQuery("DROP TABLE IF EXISTS CAT_FOLIOS")
|
|
kmt.ExecNonQuery("DROP TABLE IF EXISTS CAT_FOLIOS")
|
|
kmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS REPARTO_GEO (CLIENTE TEXT, USUARIO TEXT, FECHA_PUNTEO TEXT, LATITUD TEXT, LONGITUD TEXT, ALMACEN TEXT, RUTA_REPARTO TEXT, RUTA_PREV TEXT, FECHA_PREVENTA TEXT, MOTIVO TEXT, COMENTARIO TEXT, TIPO TEXT, ENVIO TEXT)")
|
|
'Tabla para la bitacora de errores
|
|
If Not(errorLog.IsInitialized) Then errorLog.Initialize(Starter.ruta, "errorLog.db", True)
|
|
errorLog.ExecNonQuery("CREATE TABLE IF NOT EXISTS errores(fecha INTEGER, error TEXT)")
|
|
|
|
Try 'Intentamos usar "pragma_table_info" para revisar si existe la columna "reprogramar" en la tabla
|
|
Dim c As Cursor=kmt.ExecQuery("SELECT COUNT(*) AS fCol FROM pragma_table_info('noventa') WHERE name='NV_REPROGRAMAR'")
|
|
c.Position = 0
|
|
If c.GetString("fCol") = 0 Then 'Si no esta la columna REPROGRAMAR la agregamos
|
|
kmt.ExecNonQuery("ALTER TABLE noventa ADD COLUMN NV_REPROGRAMAR TEXT")
|
|
End If
|
|
Catch 'Si no funciona "pragma_table_info" lo hacemos con try/catch
|
|
Try
|
|
kmt.ExecNonQuery("ALTER TABLE noventa ADD COLUMN NV_REPROGRAMAR TEXT")
|
|
Catch
|
|
Log(LastException)
|
|
End Try
|
|
End Try
|
|
End Sub
|
|
|
|
'Obtiene el ssid al que esta conectado el telefono
|
|
Sub getSSID 'ignore
|
|
' 'Requiere la libreria "MLWifi400"
|
|
' If wifi.isWifiConnected Then
|
|
' ssid = wifi.WifiSSID
|
|
' End If
|
|
End Sub
|
|
|
|
'Convierte un texto en formato JSON a un objeto "Map"
|
|
Sub JSON2Map(theJson As String) As Map 'ignore
|
|
'Requiere la libreria "JSON"
|
|
Try
|
|
Private json As JSONParser
|
|
json.Initialize(theJson)
|
|
Return json.NextObject
|
|
Catch
|
|
Log(LastException)
|
|
log2DB("JSON2Map: "&LastException)
|
|
Private m As Map = CreateMap("title":"Error generating JSON", "t":"Error", "Message":LastException, "text" : LastException)
|
|
Return m
|
|
End Try
|
|
End Sub
|
|
|
|
'Convierte un mapa a formato JSON
|
|
Sub map2JSON(m As Map) As String 'ignore
|
|
'Requiere la libreria "JSON"
|
|
'Convierte un objecto "Map" a JSON
|
|
Dim jg As JSONGenerator
|
|
jg.Initialize(m)
|
|
Dim t As String = jg.ToString
|
|
Return t
|
|
End Sub
|
|
|
|
'Regresa el usuario de la tabla USUARIOA
|
|
Sub traeUsuarioDeBD As String 'ignore
|
|
Private c As Cursor
|
|
Private u As String = "SinUsuario"
|
|
If Not(kmt.IsInitialized) Then revisaBD
|
|
c=kmt.ExecQuery("select USUARIO from usuarioa")
|
|
c.Position=0
|
|
If c.RowCount > 0 Then u = c.GetString("USUARIO")
|
|
c.Close
|
|
Return u
|
|
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)
|
|
' 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.Magenta)
|
|
If kmt.IsInitialized Then 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
|
|
' 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
|
|
|
|
'Compara la UUG (Ultima Ubicacion Guardada) con FLP.LastKnowLocation y si
|
|
'cumple con los requisitos de distancia y precision la guardamos en la BD.
|
|
Sub revisaUUG 'ignore
|
|
revisaFLP
|
|
If Tracker.FLP.GetLastKnownLocation.IsInitialized Then
|
|
Dim daa As Int = Tracker.UUGCoords.DistanceTo(Tracker.FLP.GetLastKnownLocation) 'Distancia de la UUG a la actual de Tracker.FLP.GetLastKnownLocation
|
|
If Starter.logger Then LogColor($"**** UUC "${fechaKMT(Tracker.FLP.GetLastKnownLocation.Time)}|$0.2{Tracker.FLP.GetLastKnownLocation.Accuracy}|$0.8{Tracker.FLP.GetLastKnownLocation.Latitude}|$0.8{Tracker.FLP.GetLastKnownLocation.Longitude}|$0.2{Tracker.FLP.GetLastKnownLocation.Speed}|"$, Colors.RGB(255,112,35))
|
|
If daa > 40 And Tracker.FLP.GetLastKnownLocation.Accuracy < 35 Then 'Si la distancia de la ubicacion anterior es mayor de XX y la precision es menor de XX, la guardamos ...
|
|
kmt.ExecNonQuery2("INSERT INTO RUTA_GPS(fecha, lat, lon) VALUES (?,?,?)", Array As Object (fechaKMT(Tracker.FLP.GetLastKnownLocation.Time),Tracker.FLP.GetLastKnownLocation.Latitude,Tracker.FLP.GetLastKnownLocation.Longitude))
|
|
If Starter.logger Then Log("++++ Distancia a anterior="&daa&"|"&"Precision="&Tracker.FLP.GetLastKnownLocation.Accuracy)
|
|
End If
|
|
Tracker.UUGCoords = Tracker.FLP.GetLastKnownLocation
|
|
End If
|
|
End Sub
|
|
|
|
'Revisamos que el FLP (FusedLocationProvider) este inicializado y activo
|
|
Sub revisaFLP 'ignore
|
|
LogColor($"**** **** Revisamos FLP - ${fechaKMT(DateTime.Now)}**** ****"$, Colors.RGB(78,0,227))
|
|
Private todoBienFLP As Boolean = True
|
|
If Not(Tracker.FLP.IsInitialized) Then
|
|
log2DB("revisaFLP: No esta inicializado ... 'Reinicializando FLP'")
|
|
Tracker.FLP.Initialize("flp")
|
|
todoBienFLP = False
|
|
End If
|
|
If Tracker.FLP.IsInitialized Then
|
|
If Not(Tracker.FLP.IsConnected) Then
|
|
log2DB("revisaFLP: No esta conectado ... 'Reconectando FLP'")
|
|
' Tracker.FLP.Connect
|
|
CallSubDelayed(Tracker,"StartFLP")
|
|
todoBienFLP = False
|
|
End If
|
|
If Tracker.FLP.IsConnected And _
|
|
Tracker.FLP.GetLastKnownLocation.IsInitialized And _
|
|
Tracker.FLP.GetLastKnownLocation.DistanceTo(Tracker.UUGCoords) > 500 Then
|
|
log2DB("revisaFLP: 'No se esta actualizando, lo reiniciamos ...'")
|
|
StartService(Tracker)
|
|
todoBienFLP = False
|
|
End If
|
|
End If
|
|
If todoBienFLP Then LogColor(" +++ +++ Sin errores en FLP", Colors.Green)
|
|
' revisar hora de lastKnownlocation y si es mayor de 10 minutos llamar StartFLP
|
|
End Sub
|
|
|
|
'Revisamos que el servicio "PushService" este inicializado y activo
|
|
Sub revisaPushService 'ignore
|
|
' Private todoBienPS As Boolean = True
|
|
'' LogColor("**** **** Revisamos PushService **** ****", Colors.RGB(78,0,227))
|
|
' Try
|
|
' If Not(PushService.wsh.IsInitialized) Then 'Si no esta inicializado ...
|
|
' log2DB("revisaPushService: No esta inicializado ... 'Reinicializando PushService'")
|
|
' CallSubDelayed(PushService, "Connect")
|
|
' todoBienPS = False
|
|
' End If
|
|
' Catch
|
|
' Log(LastException)
|
|
' insertaEnErrores("Subs.revisaPushService: Reiniciando - "&LastException)
|
|
' End Try
|
|
' Try
|
|
' If Not(PushService.wsh.ws.Connected) Then 'Si no esta conectado ...
|
|
' log2DB("revisaPushService: No esta conectado ... 'Reconectando PushService'")
|
|
' CallSubDelayed(PushService, "Connect")
|
|
' todoBienPS = False
|
|
' End If
|
|
' Catch
|
|
' Log(LastException)
|
|
' insertaEnErrores("Subs.revisaPushService: Reconectando - "&LastException)
|
|
' End Try
|
|
' Try
|
|
' If masDeXXMinsKMT(Starter.pushServiceActividad, 5) Then 'Si mas de xx minutos de la ultima actividad entonces ...
|
|
' PushService.wsh.Close
|
|
' CallSubDelayed(PushService, "Connect")
|
|
' ' StartService(PushService)
|
|
' ' If Main.Logger Then Log("Ultima act: "&Starter.pushServiceActividad)
|
|
' log2DB("revisaPushService: 'Reconectamos 'PushService' por inactividad")
|
|
' Starter.pushServiceActividad = fechaKMT(DateTime.Now)
|
|
' todoBienPS = False
|
|
' End If
|
|
' Catch
|
|
' Log(LastException)
|
|
' insertaEnErrores("Subs.revisaPushService: Reconectando por inactividad - "&LastException)
|
|
' End Try
|
|
' If todoBienPS Then LogColor(" +++ +++ Sin errores en PushService", Colors.Green)
|
|
End Sub
|
|
|
|
'Borramos renglones extra de la tabla de errores
|
|
Sub borraArribaDe100Errores 'ignore
|
|
If Not(errorLog.IsInitialized) Then revisaBD
|
|
LogColor("Recortamos la tabla de Errores, limite de 100", Colors.Magenta)
|
|
errorLog.ExecNonQuery("DELETE FROM errores WHERE fecha NOT in (SELECT fecha FROM errores ORDER BY fecha desc LIMIT 99 )")
|
|
errorLog.ExecNonQuery("vacuum;")
|
|
' Log("Borramos mas de 100 de errorLog")
|
|
End Sub
|
|
|
|
'Borramos renglones extra de la tabla de bitacora
|
|
Sub borraArribaDe600RenglonesBitacora 'ignore
|
|
revisaBD
|
|
LogColor("Recortamos la tabla de la Bitacora, limite de 600", Colors.Magenta)
|
|
Private c As Cursor
|
|
c = kmt.ExecQuery("select fecha from bitacora")
|
|
c.Position = 0
|
|
If c.RowCount > 650 Then
|
|
kmt.ExecNonQuery("DELETE FROM bitacora WHERE fecha NOT in (SELECT fecha FROM bitacora ORDER BY fecha desc LIMIT 599 )")
|
|
kmt.ExecNonQuery("vacuum;")
|
|
' Log("Borramos mas de 600 de bitacora")
|
|
End If
|
|
c.Close
|
|
End Sub
|
|
|
|
'Inserta 50 renglones de prueba a la tabla "errores"
|
|
Sub insertaRenglonesPruebaEnErrorLog 'ignore
|
|
If Not(errorLog.IsInitialized) Then revisaBD
|
|
Log("insertamos 50 renglones a errorLog")
|
|
For x = 1 To 50
|
|
errorLog.ExecNonQuery2("INSERT INTO errores(fecha, error) VALUES (?,?)", Array As Object (fechaKMT(DateTime.now), "abc"))
|
|
Log(x)
|
|
Next
|
|
End Sub
|
|
|
|
'Regresa la tabla "errores" en una lista de mapas convertida a JSON
|
|
Sub dameErroresJSON(SQL As SQL, maxErrores As Int, comprimido As Boolean) As String 'ignore
|
|
Log("dameErroresJSON")
|
|
Private j As JSONGenerator
|
|
Private lim As String
|
|
Private cur As ResultSet
|
|
Private l As List
|
|
Private i As Int = 0
|
|
l.Initialize
|
|
Dim m, m2 As Map
|
|
m2.Initialize
|
|
If maxErrores = 0 Then lim = "" Else lim = "limit "&maxErrores
|
|
cur = SQL.ExecQuery("select * from errores order by fecha desc "&lim)
|
|
Do While cur.NextRow
|
|
m.Initialize
|
|
m.Put("fecha", cur.GetString("fecha"))
|
|
m.Put("error", cur.GetString("error"))
|
|
m2.Put(i,m)
|
|
i = i + 1
|
|
Loop
|
|
cur.Close
|
|
j.Initialize(m2)
|
|
Log(j.ToString)
|
|
If comprimido Then
|
|
Return compress(j.ToString)
|
|
Else
|
|
Return j.ToString
|
|
End If
|
|
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)
|
|
' Log(" +++ +++ pFecha:"&parteFecha&" | pHora:"&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
|
|
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,"PROFINA_rep_kmt.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 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
|
|
|
|
Sub insertaEnErrores(error As String) 'ignore
|
|
If Not(errorLog.IsInitialized) Then revisaBD
|
|
errorLog.ExecNonQuery2("INSERT INTO errores(fecha, error) VALUES (?,?)", Array As Object (fechaKMT(DateTime.now), error))
|
|
End Sub
|
|
|
|
'Saca el usuario de la tabla USUARIOA
|
|
Sub dameUsuarioDeDB As String 'ignore
|
|
Private c As Cursor
|
|
Private u As String = "SinUsuario"
|
|
If Not(kmt.IsInitialized) Then revisaBD
|
|
c=kmt.ExecQuery("select USUARIO from usuarioa")
|
|
c.Position=0
|
|
If c.RowCount > 0 Then u = c.GetString("USUARIO")
|
|
c.Close
|
|
Return u
|
|
End Sub
|
|
|
|
Sub SetDivider(lv As ListView, Color As Int, Height As Int) 'ignore
|
|
Dim r As Reflector
|
|
r.Target = lv
|
|
Dim CD As ColorDrawable
|
|
CD.Initialize(Color, 0)
|
|
r.RunMethod4("setDivider", Array As Object(CD), Array As String("android.graphics.drawable.Drawable"))
|
|
r.RunMethod2("setDividerHeight", Height, "java.lang.int")
|
|
End Sub
|
|
|
|
'Centra un listview dentro de un elemento superior
|
|
Sub centraListView(elemento As ListView, anchoElementoSuperior As Int) 'ignore
|
|
elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2)
|
|
End Sub
|
|
|
|
'Centra un panel 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 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 boton dentro de un elemento superior
|
|
Sub centraBoton(elemento As Button, anchoElementoSuperior As Int) 'ignore
|
|
elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2)
|
|
End Sub
|
|
|
|
'Trae el nombre del producto con ID dado, desde HIST_VENTAS.
|
|
Sub traeNombre(id As String) As String
|
|
Private nombre As String
|
|
Private idc As Cursor = kmt.ExecQuery($"select HVD_PRONOMBRE from HIST_VENTAS where HVD_PROID = '${id}'"$)
|
|
idc.Position=0
|
|
If idc.RowCount > 0 Then nombre = idc.GetString("HVD_PRONOMBRE")
|
|
idc.Close
|
|
' Log("NOMBRE=" & nombre)
|
|
Return nombre
|
|
End Sub
|
|
|
|
'Trae el precio del ID dado, desde CAT_GUNAPROD o HIST_VENTAS, dependiendo de si es promoción o no.
|
|
Sub traePrecio(id As String, quePromo As String) As String
|
|
Private pu As String = "0"
|
|
' Log(id & ", "& quePromo)
|
|
If quePromo = traeAlmacen Then
|
|
Private idc As Cursor = kmt.ExecQuery($"select CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${id}'"$)
|
|
If idc.RowCount > 0 Then
|
|
idc.Position=0
|
|
If idc.RowCount > 0 And IsNumber(idc.GetString("CAT_GP_PRECIO")) Then pu = idc.GetString("CAT_GP_PRECIO")
|
|
' Log("id=" & id & "|p=" & x & "|" & idc.GetString("CAT_GP_PRECIO"))
|
|
End If
|
|
idc.Close
|
|
Else 'Si es una promo, entonces sacamos el costo total del producto en la promo de HIST_VENTAS2 y lo dividimos entre la cantidad.
|
|
Private pc As Cursor = Starter.skmt.ExecQuery($"select HVD_CANT, HVD_COSTO_TOT from HIST_VENTAS2 where HVD_CLIENTE in (select cuenta from cuentaa) and HVD_PROID = '${id}' and HVD_CODPROMO = '${quePromo}'"$)
|
|
If pc.RowCount > 0 Then
|
|
pc.Position = 0
|
|
' Log(pc.GetString("HVD_COSTO_TOT")&", "& pc.GetString("HVD_CANT"))
|
|
If pc.GetString("HVD_COSTO_TOT")<> Null And pc.GetString("HVD_CANT") <> Null Then
|
|
pu = pc.GetString("HVD_COSTO_TOT") / pc.GetString("HVD_CANT")
|
|
End If
|
|
End If
|
|
' Log("x cosa")
|
|
pc.Close
|
|
End If
|
|
' Log(pu)
|
|
Return pu
|
|
|
|
End Sub
|
|
|
|
'Trae el precio del ID dado, desde CAT_GUNAPROD o HIST_VENTAS, dependiendo de si es promoción o no.
|
|
Sub traePrecio2(id As String, quePromo As String, consecutivo As String) As String
|
|
Private pu As String = "0"
|
|
' Log(id & ", "& quePromo)
|
|
If quePromo = traeAlmacen Then
|
|
Private idc As Cursor = kmt.ExecQuery($"select CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${id}'"$)
|
|
If idc.RowCount > 0 Then
|
|
idc.Position=0
|
|
If idc.RowCount > 0 And IsNumber(idc.GetString("CAT_GP_PRECIO")) Then pu = idc.GetString("CAT_GP_PRECIO")
|
|
' Log("id=" & id & "|p=" & x & "|" & idc.GetString("CAT_GP_PRECIO"))
|
|
End If
|
|
idc.Close
|
|
Else 'Si es una promo, entonces sacamos el costo total del producto en la promo de HIST_VENTAS2 y lo dividimos entre la cantidad.
|
|
Private pc As Cursor = Starter.skmt.ExecQuery($"select HVD_CANT, HVD_COSTO_TOT from HIST_VENTAS where HVD_CLIENTE in (select cuenta from cuentaa) and HVD_PROID = '${id}' and HVD_CODPROMO = '${quePromo}' AND CONSECUTIVO = '${consecutivo}'"$)
|
|
If pc.RowCount > 0 Then
|
|
pc.Position = 0
|
|
' Log(pc.GetString("HVD_COSTO_TOT")&", "& pc.GetString("HVD_CANT"))
|
|
If pc.GetString("HVD_COSTO_TOT")<> Null And pc.GetString("HVD_CANT") <> Null Then
|
|
pu = pc.GetString("HVD_COSTO_TOT") / pc.GetString("HVD_CANT")
|
|
End If
|
|
End If
|
|
' Log("x cosa")
|
|
pc.Close
|
|
End If
|
|
' Log(pu)
|
|
Return pu
|
|
|
|
End Sub
|
|
|
|
'Trae el precio del ID dado, desde CAT_GUNAPROD o HIST_VENTAS, dependiendo de si es promoción o no Y CAJAS.
|
|
Sub traePrecioC(id As String) As String
|
|
Private pu As String = "0"
|
|
Private idc As Cursor = kmt.ExecQuery($"select PRECIOCONVER from CAT_GUNAPROD where CAT_GP_ID = '${id}'"$)
|
|
If idc.RowCount > 0 Then
|
|
idc.Position=0
|
|
If idc.RowCount > 0 And IsNumber(idc.GetString("PRECIOCONVER")) Then pu = idc.GetString("PRECIOCONVER")
|
|
' Log("id=" & id & "|p=" & x & "|" & idc.GetString("CAT_GP_PRECIO"))
|
|
End If
|
|
idc.Close
|
|
Return pu
|
|
End Sub
|
|
|
|
'Trae el precio del ID dado, desde CAT_GUNAPROD o HIST_VENTAS, dependiendo de si es promoción o no Y CAJAS.
|
|
Sub traeConversion(id As String) As String
|
|
Private pu As String = "0"
|
|
|
|
Private idc As Cursor = kmt.ExecQuery($"select CONVERSION from CAT_GUNAPROD where CAT_GP_ID = '${id}'"$)
|
|
If idc.RowCount > 0 Then
|
|
idc.Position=0
|
|
If idc.RowCount > 0 And IsNumber(idc.GetString("CONVERSION")) Then pu = idc.GetString("CONVERSION")
|
|
' Log("id=" & id & "|p=" & x & "|" & idc.GetString("CAT_GP_PRECIO"))
|
|
End If
|
|
idc.Close
|
|
|
|
Return pu
|
|
End Sub
|
|
|
|
'Trae el cliente desde la BD.
|
|
Sub traeCliente As String 'ignore
|
|
Private cli As Cursor = Starter.skmt.ExecQuery("Select CUENTA from cuentaa")
|
|
cli.Position = 0
|
|
Private cl As String = cli.GetString("CUENTA")
|
|
cli.Close
|
|
Log("Algo paso..."& cl)
|
|
Return cl
|
|
End Sub
|
|
|
|
Sub traeFechaReparto As String
|
|
Private fe As Cursor = Starter.skmt.ExecQuery("select HVD_FECHA from HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa)")
|
|
Private f As String = "-"
|
|
If fe.RowCount > 0 Then
|
|
fe.Position = 0
|
|
f = fe.GetString("HVD_FECHA")
|
|
End If
|
|
fe.Close
|
|
Return f
|
|
End Sub
|
|
|
|
'Regresa la ruta actual de la base de datos.
|
|
Sub traeRuta (cliente As String) As String 'ignore
|
|
Private c As Cursor
|
|
Private r As String
|
|
c=Starter.skmt.ExecQuery($"select CAT_CL_RUTA from kmt_info where CAT_CL_CODIGO = '${cliente}'"$)
|
|
r = "0"
|
|
If c.RowCount > 0 Then
|
|
c.Position=0
|
|
r = c.GetString("CAT_CL_RUTA")
|
|
End If
|
|
c.Close
|
|
Return r
|
|
End Sub
|
|
|
|
'Trae de la tabla Reparto,la cantidad rechazada de un producto dado de un cliente dado.
|
|
Sub traeCantidadRechazada(cliente As String, prodId As String) As Int
|
|
Private cant As Int = 0
|
|
Private cr As Cursor = Starter.skmt.ExecQuery($"Select rep_cliente, rep_prodid, REP_CANT, REP_RECHAZO from reparto where rep_cliente = '${cliente}' and rep_prodid = '${prodId}' and REP_RECHAZO = 1"$)
|
|
If cr.RowCount > 0 Then
|
|
cr.Position = 0
|
|
cant = cr.GetString("REP_CANT")
|
|
End If
|
|
Log($"${cliente}, ${prodId}, rowcont:${cr.RowCount}, cant: ${cant}"$)
|
|
Return cant
|
|
End Sub
|
|
|
|
'Trae de la tabla Reparto,la cantidad vendida de un producto dado de un cliente dado.
|
|
Sub traeCantidadVendida(cliente As String, prodId As String) As Int
|
|
Private cant As Int = 0
|
|
Private cr As Cursor = Starter.skmt.ExecQuery($"Select rep_cliente, rep_prodid, REP_CANT, REP_RECHAZO from reparto where rep_cli_orig = '${cliente}' and rep_prodid = '${prodId}' and REP_RECHAZO = 0 and REP_CANT > 0"$)
|
|
' Log($"${cliente}, ${prodId}, rowcont:${cr.RowCount}"$)
|
|
If cr.RowCount > 0 Then
|
|
cr.Position = 0
|
|
cant = cr.GetString("REP_CANT")
|
|
End If
|
|
Return cant
|
|
End Sub
|
|
|
|
'Trae la cantidad desde la tabla hist_ventas2, del producto dado, del cliente dado.
|
|
Sub traeMaxCantidad(cliente As String, prodId As String) As Int
|
|
Private cant As Int = 0
|
|
Private cr As Cursor = Starter.skmt.ExecQuery($"Select hvd_cant from hist_ventas2 where hvd_cliente = '${cliente}' and hvd_proid = '${prodId}'"$)
|
|
' Log($"${cliente}, ${prodId}, rowcont:${cr.RowCount}"$)
|
|
If cr.RowCount > 0 Then
|
|
cr.Position = 0
|
|
cant = cr.GetString("HVD_CANT")
|
|
End If
|
|
Return cant
|
|
End Sub
|
|
|
|
'Ponemos venta de producto en la tabla de Reparto.
|
|
Sub prodVenta(clienteOriginal As String, prodId As String)
|
|
' Log("RECHAZO VENTA")
|
|
Private precio As String = traePrecio(prodId, traeAlmacen)
|
|
Starter.skmt.ExecNonQuery($"update reparto set REP_CANT = REP_CANT - 1 where REP_CLIENTE = '${clienteOriginal}' and REP_CLI_ORIG = '${clienteOriginal}' and REP_RECHAZO = 1 and REP_PRODID = '${prodId}'"$)
|
|
Starter.skmt.ExecNonQuery($"update reparto set REP_CANT = REP_CANT + 1 where REP_CLIENTE in (Select CUENTA from cuentaa) and REP_CLI_ORIG = '${clienteOriginal}' and REP_RECHAZO = 0 and REP_PRODID = '${prodId}'"$)
|
|
Log($"update reparto set REP_CANT = REP_CANT - 1 where REP_CLIENTE = '${clienteOriginal}' and REP_CLI_ORIG = '${clienteOriginal}' and REP_RECHAZO = 1 and REP_PRODID = '${prodId}'"$)
|
|
Log($"update reparto set REP_CANT = REP_CANT + 1 where REP_CLIENTE in (Select CUENTA from cuentaa) and REP_CLI_ORIG = '${clienteOriginal}' and REP_RECHAZO = 0 and REP_PRODID = '${prodId}'"$)
|
|
Starter.skmt.ExecNonQuery($"update reparto set REP_COSTO_TOT = REP_CANT * ${precio}, REP_PRECIO = '${precio}' where REP_CLIENTE in (Select CUENTA from cuentaa) and REP_CLI_ORIG = '${clienteOriginal}' and REP_RECHAZO = 0 and REP_PRODID = '${prodId}'"$)
|
|
|
|
' Private pu As String = 0
|
|
' Private cant As Int = 0
|
|
' Private pc As Cursor = Starter.skmt.ExecQuery($"select (HVD_COSTO_TOT / HVD_CANT) as PU, HVD_CANT from HIST_VENTAS2 where HVD_CLIENTE = '${clienteOriginal}' and HVD_PROID = '${prodId}'"$)
|
|
' Log($"PU ROWCOUNT = ${pc.RowCount}"$)
|
|
' If pc.RowCount > 0 Then
|
|
' pc.Position = 0
|
|
' pu = pc.GetString("PU")
|
|
' End If
|
|
' pc.Close
|
|
' Private pc As Cursor = Starter.skmt.ExecQuery($"select HVD_CANT from HIST_VENTAS where HVD_CLIENTE = '${clienteOriginal}' and HVD_PROID = '${prodId}'"$)
|
|
' If pc.RowCount > 0 Then
|
|
' pc.Position = 0
|
|
' cant = pc.GetString("HVD_CANT")
|
|
' End If
|
|
' pc.Close
|
|
'' Starter.skmt.ExecNonQuery($"update hist_ventas set HVD_CANT = '${cant - 1}' where HVD_CLIENTE in (Select CUENTA from cuentaa) and HVD_PROID = '${prodId}'"$)
|
|
' Starter.skmt.ExecNonQuery($"update hist_ventas set HVD_COSTO_TOT = '${cant * pu}' where HVD_CLIENTE in (Select CUENTA from cuentaa) and HVD_PROID = '${prodId}'"$)
|
|
'' Log($"update hist_ventas set HVD_CANT = '${cant - 1}' where HVD_CLIENTE in (Select CUENTA from cuentaa) and HVD_PROID = '${prodId}'"$)
|
|
' Log($"update hist_ventas set HVD_COSTO_TOT = '${cant * pu}' where HVD_CLIENTE in (Select CUENTA from cuentaa) and HVD_PROID = '${prodId}'"$)
|
|
End Sub
|
|
|
|
'Ponemos rechazo de producto en la tabla de Reparto.
|
|
Sub prodRechazo(clienteOriginal As String, prodId As String)
|
|
Log("RECHAZO DEVOLUCION")
|
|
Private rr As Cursor = Starter.skmt.ExecQuery($"select count(REP_CLIENTE) as hayRechazo from REPARTO where rep_prodid = '${prodId}' and REP_CLIENTE in (Select CUENTA from cuentaa)"$)
|
|
rr.Position = 0
|
|
If rr.GetString("hayRechazo") = 0 Then
|
|
Log("INSERTAMOS EN REPARTO")
|
|
' Log($"select * from hist_ventas where hvd_cliente in (select cuenta from cuentaa) and hvd_proid = '${prodId}'"$)
|
|
Private chv As Cursor = Starter.skmt.ExecQuery($"select * from hist_ventas where hvd_cliente in (select cuenta from cuentaa) and hvd_proid = '${prodId}'"$)
|
|
' Log(chv.RowCount)
|
|
If chv.RowCount > 0 Then
|
|
chv.Position = 0
|
|
' Log($"CANT=${chv.GetString("HVD_CANT")}"$)
|
|
Private precio As String = traePrecio(prodId, traeAlmacen)
|
|
Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT, REP_FECHA, REP_RECHAZO, REP_PRODID, REP_PRECIO, REP_CLI_ORIG) VALUES (?,?,?,?,?,1,?,?,?) ", Array As String(traeCliente, chv.GetString("HVD_PRONOMBRE"), 1, precio, chv.GetString("HVD_FECHA"), prodId, precio, traeCliente))
|
|
Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT, REP_FECHA, REP_RECHAZO, REP_PRODID, REP_PRECIO, REP_CLI_ORIG) VALUES (?,?,?,?,?,0,?,?,?) ", Array As String(traeCliente, chv.GetString("HVD_PRONOMBRE"), chv.GetString("HVD_CANT") - 1, (chv.GetString("HVD_CANT") - 1) * precio, chv.GetString("HVD_FECHA"), prodId, precio, traeCliente))
|
|
Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_PARCIAL = 1, HVD_CANT = 0, HVD_COSTO_TOT = '0' where HVD_PROID = '${prodId}' and HVD_CLIENTE in (Select CUENTA from cuentaa)"$)
|
|
End If
|
|
Else
|
|
Log($"ACTUALIZAMOS REPARTO"$)
|
|
Private precio As String = traePrecio(prodId, traeAlmacen)
|
|
Starter.skmt.ExecNonQuery2("update HIST_VENTAS set HVD_PARCIAL = 1, HVD_CANT = 0, HVD_COSTO_TOT = '0' WHERE HVD_PROID = ? and HVD_CLIENTE in (Select CUENTA from cuentaa)", Array As String(prodId))
|
|
Starter.skmt.ExecNonQuery($"update reparto set REP_CANT = REP_CANT + 1 where REP_CLIENTE = '${clienteOriginal}' and REP_CLI_ORIG = '${clienteOriginal}' and REP_RECHAZO = 1 and REP_PRODID = '${prodId}'"$)
|
|
Starter.skmt.ExecNonQuery($"update reparto set REP_CANT = REP_CANT - 1 where REP_CLIENTE in (Select CUENTA from cuentaa) and REP_CLI_ORIG = '${clienteOriginal}' and REP_RECHAZO = 0 and REP_PRODID = '${prodId}'"$)
|
|
' Log($"update reparto set REP_CANT = REP_CANT + 1 where REP_CLIENTE = '${clienteOriginal}' and REP_CLI_ORIG = '${clienteOriginal}' and REP_RECHAZO = 1 and REP_PRODID = '${prodId}'"$)
|
|
' Log($"update reparto set REP_CANT = REP_CANT - 1 where REP_CLIENTE in (Select CUENTA from cuentaa) and REP_CLI_ORIG = '${clienteOriginal}' and REP_RECHAZO = 0 and REP_PRODID = '${prodId}'"$)
|
|
Starter.skmt.ExecNonQuery($"update reparto set REP_COSTO_TOT = REP_CANT * ${precio}, REP_PRECIO = '${precio}' where REP_CLIENTE in (Select CUENTA from cuentaa) and REP_CLI_ORIG = '${clienteOriginal}' and REP_PRODID = '${prodId}'"$)
|
|
End If
|
|
End Sub
|
|
|
|
Sub traemosCantYMonto(clv As CustomListView) As Map
|
|
' Log("TRAEMOS CANT Y MONTO")
|
|
Private cant As Int = 0
|
|
Private monto As Float = 0
|
|
For i = 0 To clv.GetSize - 1
|
|
Private p0 As B4XView = clv.GetPanel(i)
|
|
Private p As B4XView = p0.GetView(0)
|
|
Private cant1 As B4XView = p.GetView(2).GetView(3)
|
|
Private cant2 As B4XView = p.GetView(3).GetView(3)
|
|
' Log("|"&cant1.Text&"|")
|
|
If cant1.text <> "" Then
|
|
If cant1.Text = "" Then cant1.Text = 0
|
|
Private esteTag As List = Regex.Split("\|", cant1.Tag)
|
|
' Log($"CANT:${cant1.text}, esteTag=${esteTag}"$)
|
|
If esteTag.Get(2) <> esteTag.Get(3) Then cant = cant + cant1.Text 'Si el ID es diferente de la promo, lo sumamos, si no, no lo sumamos porque es el encabezado de la promo en 0.
|
|
monto = monto + (esteTag.Get(0) * cant1.Text)
|
|
Else
|
|
If cant2.Text = "" Then cant2.Text = 0
|
|
Private esteTag As List = Regex.Split("\|", cant2.Tag)
|
|
' Log($"CANT:${cant2.text}, esteTag=${esteTag}"$)
|
|
If esteTag.Get(2) <> esteTag.Get(3) Then cant = cant + cant2.Text 'Si el ID es diferente de la promo, lo sumamos, si no, no lo sumamos porque es el encabezado de la promo en 0.
|
|
monto = monto + (esteTag.Get(0) * cant2.Text)
|
|
End If
|
|
Next
|
|
' Log($"CANT=${cant}, MONTO=${monto}"$)
|
|
Return CreateMap("cantidad":cant, "monto":monto)
|
|
End Sub
|
|
|
|
Sub traeCantYMonto2(cliente As String) As Map
|
|
' Log("TRAE CANT Y MONTO2")
|
|
Private cant As Int = 0
|
|
Private monto As Float = 0
|
|
Private ccym As Cursor = Starter.skmt.ExecQuery($"Select hvd_codpromo, hvd_proid, HVD_CANT, (Select CAT_GP_PRECIO from cat_gunaprod where cat_gp_id = hvd_proid) As precio from HIST_VENTAS where HVD_CLIENTE = '${cliente}'"$)
|
|
If ccym.RowCount > 0 Then
|
|
For i=0 To ccym.RowCount -1
|
|
ccym.Position = i
|
|
If ccym.GetString("HVD_CODPROMO") <> ccym.GetString("HVD_PROID") And ccym.GetString("precio") <> Null Then 'Si no es el header de una promo...
|
|
cant = cant + ccym.GetString("HVD_CANT")
|
|
' Log($"${ccym.GetString("HVD_CANT")} * ${ccym.GetString("precio")}"$)
|
|
monto = monto + (ccym.GetString("HVD_CANT") * traePrecio(ccym.GetString("HVD_PROID"), ccym.GetString("HVD_CODPROMO")))
|
|
End If
|
|
Next
|
|
' Log($"CANT=${cant}, MONTO=${monto}"$)
|
|
End If
|
|
|
|
ccym = Starter.skmt.ExecQuery($"Select rep_prodid, iFNULL(REP_CANT, 0) AS REP_CANT, iFNULL((Select CAT_GP_PRECIO from cat_gunaprod where cat_gp_id = rep_prodid),0) As precio from REPARTO where REP_CLIENTE in (Select cuenta from cuentaa) And REP_RECHAZO = '0' and REP_CANT > 0"$)
|
|
If ccym.RowCount > 0 Then
|
|
For i=0 To ccym.RowCount -1
|
|
ccym.Position = i
|
|
If ccym.GetString("REP_CANT") <> Null Then cant = cant + ccym.GetString("REP_CANT")
|
|
monto = monto + (ccym.GetString("REP_CANT") * ccym.GetString("precio"))
|
|
Next
|
|
Log($"CANT=${cant}, MONTO=${monto}"$)
|
|
End If
|
|
|
|
ccym.Close
|
|
Return CreateMap("cantidad":cant, "monto":monto)
|
|
End Sub
|
|
|
|
'Regresa la cantidad entregada desde HIST_VENTAS.
|
|
Sub traeEntregados As Map
|
|
Private m As Map
|
|
Private cant As Int = 0
|
|
Private monto As String = 0
|
|
Private rc As Cursor = Starter.skmt.ExecQuery($"select sum(HVD_CANT) as CUANTOS, sum(HVD_COSTO_TOT) as CUANTO from HIST_VENTAS where HVD_ESTATUS = '1' and HVD_COSTO_TOT <> '0'"$)
|
|
If rc.RowCount > 0 Then
|
|
rc.Position = 0
|
|
If rc.GetString("CUANTOS") <> Null Then
|
|
cant = cant + rc.GetString("CUANTOS")
|
|
monto = monto + rc.GetString("CUANTO")
|
|
End If
|
|
End If
|
|
' LogColor($"CANTIDAD ENTREGADA = ${cant}"$, Colors.red)
|
|
Return CreateMap("cantidad": cant, "monto": monto)
|
|
End Sub
|
|
|
|
'Regresa la cantidad rechazada desde REPARTO.
|
|
Sub traeRechazados As Map
|
|
Private m As Map
|
|
Private cant As Int = 0
|
|
Private monto As String = 0
|
|
Private rc As Cursor = Starter.skmt.ExecQuery($"select sum(REP_CANT) as CUANTOS, sum(REP_CANT * REP_PRECIO) as CUANTO from REPARTO where REP_RECHAZO = '1' and REP_CANT <> '0'"$)
|
|
If rc.RowCount > 0 Then
|
|
rc.Position = 0
|
|
If rc.GetString("CUANTOS") <> Null Then
|
|
cant = cant + rc.GetString("CUANTOS")
|
|
monto = monto + rc.GetString("CUANTO")
|
|
End If
|
|
End If
|
|
' LogColor($"CANTIDAD RECHAZADA = ${cant}"$, Colors.red)
|
|
Return CreateMap("cantidad": cant, "monto": monto)
|
|
End Sub
|
|
|
|
'Regresa la cantidad vendida desde REPARTO.
|
|
Sub traeVendidos As Map
|
|
Private m As Map
|
|
Private cant As Int = 0
|
|
Private monto As String = 0
|
|
Private rc As Cursor = Starter.skmt.ExecQuery($"select sum(REP_CANT) as CUANTOS, sum(REP_CANT * REP_PRECIO) as CUANTO from REPARTO where REP_RECHAZO = '0' and REP_CANT <> '0'"$)
|
|
If rc.RowCount > 0 Then
|
|
rc.Position = 0
|
|
If rc.GetString("CUANTOS") <> Null Then
|
|
cant = cant + rc.GetString("CUANTOS")
|
|
monto = monto + rc.GetString("CUANTO")
|
|
End If
|
|
End If
|
|
' LogColor($"CANTIDAD VENDIDA = ${cant}"$, Colors.red)
|
|
Return CreateMap("cantidad": cant, "monto": monto)
|
|
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)
|
|
Try 'Intentamos usar "pragma_table_info" para revisar si existe la columna en la tabla
|
|
Private c As Cursor = Starter.skmt.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
|
|
Starter.skmt.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
|
|
Starter.skmt.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 la ruta actual de la base de datos.
|
|
Sub traeRutaReparto As String 'ignore
|
|
Private c As Cursor
|
|
Private r As String
|
|
c=Starter.skmt.ExecQuery("select RUTAA from RUTAA")
|
|
r = "0"
|
|
If c.RowCount > 0 Then
|
|
c.Position=0
|
|
r = c.GetString("RUTAA")
|
|
End If
|
|
c.Close
|
|
Return r
|
|
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 = Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN")
|
|
c.Position = 0
|
|
a = C.GetString("ID_ALMACEN")
|
|
c.Close
|
|
Return a
|
|
End Sub
|
|
|
|
Sub traeUsuario As String 'ignore
|
|
Private c As Cursor
|
|
Private a As String
|
|
c = Starter.skmt.ExecQuery("select USUARIO from USUARIOA")
|
|
c.Position = 0
|
|
a = C.GetString("USUARIO")
|
|
c.Close
|
|
Return a
|
|
End Sub
|
|
|
|
|
|
Sub traefECHAPREV As String 'ignore
|
|
Private c As Cursor
|
|
Private a As String
|
|
Private clienteasing As Cursor = Starter.skmt.ExecQuery("SELECT CUENTA FROM CUENTAA")
|
|
clienteasing.Position = 0
|
|
If clienteasing.GetString("CUENTA") <> "63403" Then
|
|
c = Starter.skmt.ExecQuery("select HVD_FECHA from HIST_VENTAS where HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)")
|
|
c.Position = 0
|
|
Dim fecha() As String = Regex.Split(" ", c.GetString("HVD_FECHA"))
|
|
Dim fecha3 As String = fecha(0)
|
|
Log(fecha3)
|
|
Dim hora() As String = Regex.Split("\.", fecha(1))
|
|
a = fecha3 & " " & hora(0)
|
|
c.Close
|
|
Else If clienteasing.GetString("CUENTA") = "63403" Then
|
|
c = Starter.skmt.ExecQuery("select HVD_FECHA from HIST_VENTAS")
|
|
c.Position = 0
|
|
Dim fecha() As String = Regex.Split(" ", c.GetString("HVD_FECHA"))
|
|
Dim fecha3 As String = fecha(0)
|
|
Log(fecha3)
|
|
Dim hora() As String = Regex.Split("\.", fecha(1))
|
|
a = fecha3 & " " & hora(0)
|
|
c.Close
|
|
End If
|
|
Return a
|
|
End Sub
|
|
|
|
Sub traerUTAPREV As String 'ignore
|
|
Private c As Cursor
|
|
Private a As String
|
|
c = Starter.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info where CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)")
|
|
c.Position = 0
|
|
a = C.GetString("CAT_CL_RUTA")
|
|
c.Close
|
|
Return a
|
|
End Sub
|
|
|
|
|
|
'Sub CreateBitmapWithNumber(OriginalBitmap As Bitmap, Number As Int) As Bitmap
|
|
' Dim NewBitmap As Bitmap
|
|
' NewBitmap.InitializeMutable(OriginalBitmap.Width, OriginalBitmap.Height)
|
|
'
|
|
' Dim Canvas As Canvas
|
|
' Canvas.Initialize2(NewBitmap)
|
|
'
|
|
' ' Definir el rectángulo donde se dibujará el Bitmap
|
|
' Dim DestRect As Rect
|
|
' DestRect.Initialize(0, 0, OriginalBitmap.Width, OriginalBitmap.Height)
|
|
'
|
|
' ' Dibujar la imagen original
|
|
' Canvas.DrawBitmap(OriginalBitmap, Null, DestRect)
|
|
'
|
|
' ' Dibujar el número en el centro del Bitmap y configurar el estilo del texto
|
|
' Canvas.DrawText(Number, (OriginalBitmap.Width / 2), (OriginalBitmap.Height / 2.4), Typeface.DEFAULT, 20, Colors.White, "CENTER")
|
|
'
|
|
' Return NewBitmap
|
|
'End Sub
|
|
|
|
Sub CreateBitmapWithNumber(OriginalBitmap As Bitmap, Number As Int) As Bitmap 'ignore
|
|
Dim NewBitmap As Bitmap
|
|
NewBitmap.InitializeMutable(OriginalBitmap.Width, OriginalBitmap.Height)
|
|
Dim Canvas As Canvas
|
|
Canvas.Initialize2(NewBitmap)
|
|
' Definir el rectángulo donde se dibujará el Bitmap
|
|
Dim DestRect As Rect
|
|
DestRect.Initialize(0, 0, OriginalBitmap.Width, OriginalBitmap.Height)
|
|
' Dibujar la imagen original
|
|
Canvas.DrawBitmap(OriginalBitmap, Null, DestRect)
|
|
' Dibujar el número en el centro del Bitmap y configurar el estilo del texto
|
|
Canvas.DrawText(Number, (OriginalBitmap.Width / 2), (OriginalBitmap.Height / 2.4), Typeface.DEFAULT, 15, Colors.White, "CENTER")
|
|
Return NewBitmap
|
|
End Sub
|
|
|
|
'Muestra en el Log los campos y valores que regresan en el JobDone.
|
|
Sub logJobDoneResultados(resultado As DBResult)
|
|
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
|
|
|
|
'Guarda el nombre y version de la app en CAT_VARIABLES.
|
|
Sub guardaAppInfo 'ignore
|
|
Starter.skmt.ExecNonQuery("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'EMPRESA' or CAT_VA_DESCRIPCION = 'APP_NAME' or CAT_VA_DESCRIPCION = 'APP_VERSION'")
|
|
Starter.skmt.ExecNonQuery($"insert into CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) values ('APP_NAME', '${Application.LabelName}')"$)
|
|
Starter.skmt.ExecNonQuery($"insert into CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) values ('APP_VERSION', '${Application.VersionName}')"$)
|
|
End Sub
|
|
|
|
Sub deshabilitaValidaciones
|
|
Log("Deshabilitamos VERIFY_DEVICE")
|
|
Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("VERIFY_DEVICE"))
|
|
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("VERIFY_DEVICE", 0))
|
|
Log("Deshabilitamos VALIDA_VERSION")
|
|
' Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("VALIDA_VERSION"))
|
|
' Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("VALIDA_VERSION", 0))
|
|
Log("Espeificamos LIGADO")
|
|
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))
|
|
' B4XPages.MainPage.principal.Btn_CheckList.Enabled = True
|
|
' B4XPages.MainPage.principal.trabajar.Enabled = True
|
|
' B4XPages.MainPage.principal.Resumen.Enabled = True
|
|
' B4XPages.MainPage.principal.BUSCA.Enabled = True
|
|
ToastMessageShow("REALIZADO", False)
|
|
End Sub
|