Files
Guna_Reparto_BAT/B4A/Subs.bas
cvaldes1201 2f3449e347 6.02.16
2026-03-10 10:47:14 -06:00

1174 lines
47 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 B4XPages.MainPage.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 B4XPages.MainPage.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 B4XPages.MainPage.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 B4XPages.MainPage.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 B4XPages.MainPage.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,"guna_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