Files
Kelloggs_v4/B4A/Subs.bas
Jose Alberto Guerra Ugalde f5fe4c4a52 VERSION 6.03.15
- Se corrige un error en el calculo del trade spending para que en algunos casos no calculaba bien en presupuesto.
- Se hace un cambio en subs.actualizaProducto, porque no ponia en 0 la bandera de pc_enviado.
2026-03-17 09:58:32 -06:00

2551 lines
124 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 'Usa la libreria CompressStrings
Private su As StringUtils 'Usa la libreria StringUtils
Dim phn As Phone
Dim devModel As String
Dim 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 = ""
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
' if starter.logger then 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
' if starter.logger then Log("Leemos id de "&File.DirInternal&"/phnId.txt")
' if starter.logger then Log(devModel)
End If
Return devModel
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)
' Dim base64 As String = su.EncodeBase64(compressed)
' if starter.logger then Log($"Comprimido: ${base64.Length}"$)
' 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)
' if starter.logger then Log($"decompressedbytesLength: ${decompressedbytes.Length}"$)
Dim bc As ByteConverter
Dim uncompressed As String = bc.StringFromBytes(decompressedbytes,"UTF8")
Log($"Descomprimido: ${uncompressed.Length}"$)
' if starter.logger then Log($"Decompressed String = ${uncompressed}"$)
Return uncompressed
End Sub
'Convierte una fecha al formato yyMMddHHmmss
Sub fechaKMT(fecha As String) As String 'ignore
' if starter.logger then 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
' if starter.logger then Log(nuevaFecha)
Return nuevaFecha
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)
' if starter.logger then 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)
If Starter.logger Then Log("notiLowReturn: "&title)
notification.Icon = "icon"
notification.Sound = False
notification.Vibrate = False
notification.SetInfo(title, Body, Main)
notification.Notify(id)
' if starter.logger then 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
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(Starter.skmt.IsInitialized) Then revisaBD
Starter.skmt.ExecNonQuery2("INSERT INTO RUTA_GPS(fecha, lat, lon) VALUES (?,?,?)", Array As Object (latlon(2),latlon(0),latlon(1)))
Catch
If Starter.logger Then Log(LastException)
End Try
End Sub
'Regresa la ruta gps solicitada comprimida y en base64
Sub dameRutaGPS(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 Starter.skmt.IsInitialized = False Then Starter.skmt.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 = Starter.skmt.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")
Starter.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
Starter.skmt.ExecNonQuery("delete from RUTA_GPS")
Starter.skmt.ExecNonQuery("vacuum;")
End Sub
'Limpiamos la tabla errorLog de la BD
Sub deleteErrorLog_DB 'ignore
If Not(Starter.errorLog.IsInitialized) Then revisaBD
Starter.errorLog.ExecNonQuery("delete from errores")
Starter.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 starter.logger then Log("subs.revisaBD")
Starter.ruta = File.DirInternal
If Not(File.Exists(Starter.ruta, "kmt.db")) Then File.Copy(File.DirAssets, "kmt.db", Starter.ruta, "kmt.db")
If Not(Starter.skmt.IsInitialized) Then Starter.skmt.Initialize(Starter.ruta, "kmt.db", True)
Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS RUTA_GPS(fecha INTEGER, lat TEXT, lon TEXT)")
Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_ENCUESTA2(HE_CLIENTE TEXT)")
' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS UUC(fecha INTEGER, lat TEXT, lon TEXT)") 'LastKnownLocation
Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS bitacora(fecha INTEGER, texto TEXT)") 'Bitacora
Try 'Si no existe la columna CAT_CL_CATEGORIA la agregamos.
Starter.skmt.ExecQuery("select count(CAT_CL_CATEGORIA) from kmt_info")
Catch
Try
Starter.skmt.ExecNonQuery("ALTER TABLE kmt_info ADD COLUMN CAT_CL_CATEGORIA TEXT")
Catch
If Starter.logger Then LogColor("No pudimos agregar la columna CAT_CL_CATEGORIA.", Colors.Red)
If Starter.logger Then LogColor(LastException, Colors.Red)
End Try
End Try
Try 'Si no existe la columna CAT_GP_TIPOPROD2 la agregamos.
Starter.skmt.ExecQuery("select count(CAT_GP_TIPOPROD2) from CAT_GUNAPROD")
Catch
Try
Starter.skmt.ExecNonQuery("ALTER TABLE CAT_GUNAPROD ADD COLUMN CAT_GP_TIPOPROD2 TEXT")
Catch
If Starter.logger Then LogColor("No pudimos agregar la columna CAT_GP_TIPOPROD2.", Colors.Red)
If Starter.logger Then LogColor(LastException, Colors.Red)
End Try
End Try
Try 'Si no existe la columna CAT_CL_SEGMENTO la agregamos.
Starter.skmt.ExecQuery("select count(CAT_CL_SEGMENTO) from kmt_info")
Catch
Try
Starter.skmt.ExecNonQuery("ALTER TABLE kmt_info ADD COLUMN CAT_CL_SEGMENTO TEXT")
Catch
If Starter.logger Then LogColor("No pudimos agregar la columna CAT_CL_SEGMENTO.", Colors.Red)
If Starter.logger Then LogColor(LastException, Colors.Red)
End Try
End Try
'Tabla para la bitacora de errores
If Not(Starter.errorLog.IsInitialized) Then Starter.errorLog.Initialize(File.DirInternal, "errorLog.db", True)
Starter.errorLog.ExecNonQuery("CREATE TABLE IF NOT EXISTS errores(fecha TEXT, error TEXT)")
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
'Mandamos "coords" en un mensaje a "Sprvsr"
Sub mandamosLoc(coords As String) 'ignore
'' Log("Iniciamos mandamosLoc "&coords)
'' if starter.logger then 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
If Starter.logger Then Log("Hoy="&h)
Return h
End Sub
'Guardamos "texto" a la bitacora
Sub log2DB(texto As String) 'ignore
If Starter.logger Then LogColor(fechaKMT(DateTime.Now)&" - log2BD: '"&texto&"'", Colors.Magenta)
If Starter.skmt.IsInitialized Then Starter.skmt.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
' if starter.logger then 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
' if starter.logger then Log("+++ +++ "&fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute) & " < " & fechaKMT(DateTime.Now))
Return True
Else
' if starter.logger then 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
If Starter.logger Then LogColor("Borramos BD de log", Colors.Magenta)
Starter.skmt.ExecNonQuery("delete from bitacora")
Starter.skmt.ExecNonQuery("vacuum;")
End Sub
'Monitoreamos los servicios PushService y Tracker para ver si estan activos (No pausados), y si no, los reniciamos
Sub Monitor 'ignore
' Private monitorStatus As Boolean = True
' if starter.logger then 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 ...
Starter.skmt.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
If Starter.logger Then 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
'' if starter.logger then 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(Starter.errorLog.IsInitialized) Then revisaBD
If Starter.logger Then LogColor("Recortamos la tabla de Errores, limite de 100", Colors.Magenta)
Starter.errorLog.ExecNonQuery("DELETE FROM errores WHERE fecha NOT in (SELECT fecha FROM errores ORDER BY fecha desc LIMIT 99 )")
Starter.errorLog.ExecNonQuery("vacuum;")
' if starter.logger then Log("Borramos mas de 100 de errorLog")
End Sub
'Borramos renglones extra de la tabla de bitacora
Sub borraArribaDe600RenglonesBitacora 'ignore
revisaBD
If Starter.logger Then LogColor("Recortamos la tabla de la Bitacora, limite de 600", Colors.Magenta)
Private c As Cursor
c = Starter.skmt.ExecQuery("select fecha from bitacora")
c.Position = 0
If c.RowCount > 650 Then
Starter.skmt.ExecNonQuery("DELETE FROM bitacora WHERE fecha NOT in (SELECT fecha FROM bitacora ORDER BY fecha desc LIMIT 599 )")
Starter.skmt.ExecNonQuery("vacuum;")
' if starter.logger then 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(Starter.errorLog.IsInitialized) Then revisaBD
Log("insertamos 50 renglones a errorLog")
For x = 1 To 50
Starter.errorLog.ExecNonQuery2("INSERT INTO errores(fecha, error) VALUES (?,?)", Array As Object (fechaKMT(DateTime.now), "abc"))
If Starter.logger Then 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
If Starter.logger Then 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)
If Starter.logger Then 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)
If Starter.logger Then 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
Dim safeDir As String = Starter.rp.GetSafeDirDefaultExternal("erroresDir")
p = Starter.ruta
Dim theDir As String
Try
File.MakeDir(p,"kmts")
theDir = "/kmts"
Catch
theDir = ""
End Try
Try
Private nombreDB As String = $"kell_${Starter.rutaPreventa}_kmt.db"$
File.Copy(p,"kmt.db",File.DirInternal&theDir, nombreDB)
File.Copy(p,"errorLog.db",File.DirInternal&theDir,"kell_errorLog.db")
ToastMessageShow("BD copiada a " & File.DirInternal&theDir, False)
Catch
Try
Private nombreDB As String = $"kell_${Starter.rutaPreventa}_kmt.db"$
File.Copy(p,"kmt.db", safeDir, nombreDB)
File.Copy(p,"errorLog.db", safeDir,"kell_errorLog.db")
ToastMessageShow("BD copiada a " & safeDir, False)
Catch
ToastMessageShow("No se puedo copiar la base de datos.", False)
End Try
' ToastMessageShow("No se pudo hacer la copia: "&LastException, True)
End Try
If Starter.logger Then Log("rootExternal="&p)
If Starter.logger Then Log("safe="&safeDir)
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
'Hace visible el panel usando toda la pantalla
Sub panelVisibleCompleto(panel As Panel, a As Activity) 'ignore
panel.BringToFront
panel.Visible = True
panel.Top = 0
panel.Left = 0
panel.Width = a.Width
panel.Height = a.Height
End Sub
'Oculta el panel especificado y lo manda al fondo
Sub panelOculto(panel As Panel) 'ignore
panel.SendToBack
panel.Visible = False
End Sub
'Centra una etiqueta dentro de un elemento superior
Sub centraEtiqueta(elemento As Label, anchoElementoSuperior As Int) 'ignore
elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2)
End Sub
'Centra un panel dentro de un elemento superior
Sub centraPanel(elemento As Panel, anchoElementoSuperior As Int) 'ignore
elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2)
End Sub
Sub centraEditText(elemento As EditText, anchoElementoSuperior As Int) 'ignore
elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2)
End Sub
'Centra una barra de progreso dentro de un elemento superior
Sub centraProgressBar(elemento As ProgressBar, anchoElementoSuperior As Int) 'ignore
elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2)
End Sub
Sub insertaEnErrores(error As String) 'ignore
If Not(Starter.errorLog.IsInitialized) Then revisaBD
Starter.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(Starter.skmt.IsInitialized) Then revisaBD
c=Starter.skmt.ExecQuery("select USUARIO from usuarioa")
c.Position=0
If c.RowCount > 0 Then u = c.GetString("USUARIO")
c.Close
Return u
End Sub
'Regresa el tiempo transcurrido entre la primera vez que se llama (paso 1) y la segunda (paso 2), usa el mapa global "Main.tiempos"
Sub cronoX(thisCrono As String, paso As Int) As String 'ignore
If paso = 1 Then
Starter.tiempos.Put(thisCrono, DateTime.Now)
Else
Return $"Tiempo transcurrido ${thisCrono}: ${DateTime.Now-Starter.tiempos.Get(thisCrono)} "$
End If
End Sub
'Cierra todas las actividades y sale de la aplicacion (Android 4.1+ - API 16+)
Sub cierraActividades
If Starter.logger Then Log("closing activities")
Dim jo As JavaObject
jo.InitializeContext
jo.RunMethod("finishAffinity", Null)
End Sub
'Regresa el cliente actual de CUENTAA como un string, y si no encuenta nada regresa "".
Sub clienteActual As String
Private x As String = ""
Private c As Cursor = Starter.skmt.ExecQuery("Select CUENTA from cuentaa")
If c.RowCount > 0 Then
c.Position = 0
x = c.GetString("CUENTA")
End If
c.Close
Return x
End Sub
'Marca un cliente como impreso, lo agrega a la tabla "CLIENTE_IMPRESO" y lo actualiza en "kmt_info" (IMPRESION).
Sub ponImpreso (cliente As String)
' LogColor("PON IMPRESO", Colors.red)
Starter.skmt.ExecNonQuery2("UPDATE kmt_info set IMPRESION = 1 where CAT_CL_CODIGO = ?", Array As String(cliente))
Starter.skmt.ExecNonQuery2("insert into CLIENTE_IMPRESO (CI_CUENTA) values (?)",Array As String(cliente))
If Starter.logger Then Log($"Cliente ${cliente} agegado a CLIENTE_IMPRESO y actualizado en kmt_info."$)
End Sub
'Guarda el nombre de la ultima actividad mostrada "ultimaActividad(Me)".
Sub ultimaActividad(ea As String)
' Private x() As String = Regex.Split("\.", ea)
' Starter.ultimaActividad = ""
' If x.Length = 4 Then
' Starter.ultimaActividad = x(3)
' File.WriteString(File.DirInternal, "ua.txt", Starter.ultimaActividad)
' End If
End Sub
'Guarda el nombre de la ultima actividad en base de datos "ultimaActividad(Me)".
Sub guardaUltimaActividadBD(ua As String)
' if starter.logger then LogColor($"Guardamos ultima actividad '${ua}'"$, Colors.Blue)
Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("ULTIMOMODULO"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("ULTIMOMODULO", ua))
End Sub
'Regresa la ultima actividad guardada en base de datos.
Sub traeUltimaActividadBD As String
' If Starter.logger Then LogColor("Buscamos ultima actividad en BD", Colors.Magenta)
Private c As Cursor
Private x As String
c = Starter.skmt.ExecQuery("select CAT_VA_VALOR from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'ULTIMOMODULO'")
If c.RowCount > 0 Then
c.Position = 0
x = c.GetString("CAT_VA_VALOR")
' If Starter.logger Then Log("Encontramos: " & x)
End If
c.Close
Return x
End Sub
'Guarda el nombre de la pagina en base de datos la muestra.
Sub iniciaActividad(ia As String)
If ia <> "" And ia <> Null Then
' If Starter.logger Then LogColor($"Guardamos en BD '${ia}'"$, Colors.Yellow)
Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("ULTIMOMODULO"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("ULTIMOMODULO", ia))
B4XPages.ShowPage(ia)
' If Starter.logger Then LogColor("Iniciamos --> " & ia, Colors.Blue)
End If
End Sub
'Guarda el nombre de la actividad en base de datos e inicia la actividad.
Sub iniciaActividad2(ia As String)
' if starter.logger then LogColor($"Guardamos en BD '${ia}'"$, Colors.Yellow)
Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("ULTIMOMODULO"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("ULTIMOMODULO", ia))
StartActivity(ia)
' B4XPages.ShowPage(ia)
' if starter.logger then LogColor("Iniciamos --> " & ia, Colors.Blue)
End Sub
'Agrega la variable al mapa de sesion.
Sub agregaASesion(nombre As String, valor As String) 'ignore
Starter.sesion.put(nombre, valor)
' if starter.logger then Log(Starter.sesion)
End Sub
'Regresa una lista con las coordenadas ( latitud y longitud) guardadas en BD.
Sub traeCoordsDeBD As List
Private c As Cursor
c=Starter.skmt.ExecQuery("SELECT HGLAT as HGLAT, HGLON as HGLON FROM HIST_GPS")
c.Position=0
Private lon As String = c.GetString("HGLON")
Private lat As String = c.GetString("HGLAT")
c.Close
Private coords As List
coords.Initialize
coords.Add(lat)
coords.Add(lon)
Return coords
End Sub
'Modifica el ancho y alto de un panel dado con el ancho y alto proporcionados y los pone en top 0 y left 0.
Sub panelAnchoAlto(p As Panel, w As Int, h As Int)
' If Starter.logger Then Log($"panel:${p}, alncho=${w}, alto=${h}"$)
p.Top = 0
p.Left = 0
p.Width = w
p.Height = h
End Sub
'Regresa el dia de HOY como string, en español y mayusculas.
Sub dameDiaSemana As String
Private ds As String = DateTime.GetDayOfWeek(DateTime.Now)
If ds = "1" Then
ds = "DOMINGO"
else if ds = "2" Then
ds = "LUNES"
else if ds = "3" Then
ds = "MARTES"
else if ds = "4" Then
ds = "MIERCOLES"
else if ds = "5" Then
ds = "JUEVES"
else if ds = "6" Then
ds = "VIERNES"
Else
ds = "SABADO"
End If
Return ds
End Sub
'Regresa cuentos clientes fuera de frecuencia hay con venta.
Sub dameClientesFueraDeFrecuencia As String
Private dia_visita As String = dameDiaSemana
Private f As Cursor = Starter.skmt.ExecQuery("SELECT CAT_VA_VALOR as dia_visita FROM CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = 'DIA_VISITA'")
If f.RowCount > 0 Then
f.Position=0
dia_visita = f.GetString("dia_visita")
End If
' Log("-> "&dia_visita)
f = Starter.skmt.ExecQuery("Select count(distinct PE_CLIENTE) as cff FROM kmt_info INNER JOIN PEDIDO ON kmt_info.CAT_CL_CODIGO = PEDIDO.PE_CLIENTE WHERE kmt_info.CAT_CL_DIAS_VISITA <> '"&dia_visita&"'")
f.Position=0
' Log(f.GetString("cff"))
Private cff As String = f.GetString("cff")
f.Close
Return cff
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
'Regresa el nombre del producto desde CAT_GUNAPROD
Sub traeProdNombre(id As String) As String
Private h As Cursor
Private n As String
h=Starter.skmt.ExecQuery($"select CAT_GP_NOMBRE from CAT_GUNAPROD where CAT_GP_ID = '${id.Trim}' union select CAT_GP_NOMBRE from CAT_GUNAPROD2 where CAT_GP_ID = '${id.Trim}'"$)
' Log($"select CAT_GP_NOMBRE from CAT_GUNAPROD where CAT_GP_ID = '${id.Trim}' union select CAT_GP_NOMBRE from CAT_GUNAPROD2 where CAT_GP_ID = '${id.Trim}'"$)
If h.RowCount > 0 Then
h.Position = 0
n = h.GetString("CAT_GP_NOMBRE")
' Log(h.RowCount&"|"&id&"|"&n&"|")
End If
h.Close
If n = Null Or n="" Then n = "N/A"
' Log(h.RowCount&"|"&id&"|"&n&"|")
' Log(n)
Return n
End Sub
'Regresa el nombre del RMI desde CAT_RMI
Sub traeRMINombre(id As String) As String
Private h As Cursor
Private n As String
h=Starter.skmt.ExecQuery2("select CAT_DESCRIPCION from CAT_RMI where CAT_ID = ? ", Array As String(id.Trim))
If h.RowCount > 0 Then
h.Position = 0
n = h.GetString("CAT_DESCRIPCION")
' Log(h.RowCount&"|"&id&"|"&n&"|")
End If
h.Close
If n = Null Or n="" Then n = "N/A"
' Log(h.RowCount&"|"&id&"|"&n&"|")
Return n
End Sub
'Regresa la ruta actual de la base de datos.
Sub traeRuta As String 'ignore
Private c As Cursor
Private r As String
c=Starter.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info limit 1")
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 el cliente de CUENTAA
Sub traeCliente As String 'ignore
Private c As Cursor
Private cl As String
c = Starter.skmt.ExecQuery("Select CUENTA from cuentaa")
c.Position = 0
cl = c.GetString("CUENTA")
c.Close
Return cl
End Sub
'Regresa el nombre del cliente del id dado.
Sub traeNombreCliente(id As String) As String
Private c As ResultSet = Starter.skmt.ExecQuery($"select CAT_CL_NOMBRE from kmt_info where CAT_CL_CODIGO = '${id}'"$)
Private n As String = "N/A"
Do While c.NextRow
n = c.GetString("CAT_CL_NOMBRE")
Loop
c.Close
Return n
End Sub
Sub traeFecha As String 'ignore
DateTime.DateFormat = "MM/dd/yyyy"
Private sDate As String =DateTime.Date(DateTime.Now)
Private sTime As String =DateTime.Time(DateTime.Now)
Return sDate & sTime
End Sub
'Regresa el usuario de la tabla USUARIOA
Sub traeUsuarioDeBD As String 'ignore
Private c As Cursor
Private u As String = "SinUsuario"
If Not(Starter.skmt.IsInitialized) Then revisaBD
c=Starter.skmt.ExecQuery("select USUARIO from usuarioa")
c.Position=0
If c.RowCount > 0 Then u = c.GetString("USUARIO")
c.Close
Return u
End Sub
'Trae el inventario de un producto desde la base de datos.
Sub traeInvDeBD(id As String) As Int
Private inv As Int = 0
Private c As Cursor = Starter.skmt.ExecQuery($"select CAT_GP_ALMACEN from ${traeTablaProds(Starter.tipov)} where CAT_GP_ID = '${id}'"$)
If c.RowCount > 0 Then
c.Position = 0
inv = c.GetInt("CAT_GP_ALMACEN")
End If
' Log(id)
Return inv
End Sub
'Inserta un producto en la tabla "PEDIDO"
Sub guardaProducto(cedis As String, costoTot As String, costoU As String, cant As String, nombre As String, prodId As String, clienteId As String, fecha As String, usuario As String, tipoV As String, precio2 As String, query As String) 'ignore
If nombre.Length < 6 Then ToastMessageShow("(guardaProducto) El nombre del producto no es valido " & nombre, True)
precio2 = NumberFormat2(precio2, 1, 2, 2, False)
costoU = NumberFormat2(costoU, 1, 2, 2, False)
costoTot = NumberFormat2(costoTot, 1, 2, 2, False)
LogColor("guardaProducto", Colors.Magenta)
Log($"Guardamos producto ${prodId}"$)
LogColor("TIPO VENTA="&tipoV, Colors.Magenta)
Starter.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_FECHA, PE_USUARIO, PE_TIPO, PE_PRECIO2, PE_RUTA, PE_ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,0) ", Array As Object (cedis, costoTot, costoU, cant, nombre, prodId, clienteId, fecha, usuario, tipoV, precio2, Starter.rutaV))
Starter.skmt.ExecNonQuery2("update " & query & " set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cant, prodId))
ToastMessageShow("guardaProd", False)
End Sub
'Inserta un producto en la tabla "pedido" y "pedido_cliente" y actualiza "cat_gunaprod".
'NO ACTUALIZA LA BANDERA DE GESTION EN LA TABLA "kmt_info".
'Si "gestion=2" entonces el sistema considera que el pedido ya se guardó y ya no se debe modificar.
Sub guardaProductoSinGestion(cedis As String, costoU As String, cant As String, nombre As String, prodId As String, clienteId As String, fecha As String, usuario As String, rutaV As String, precioSin As String, tipoVenta As String)
Log($"Guarda producto ${nombre}, cant: ${cant}, cedis: ${cedis}"$)
If nombre.Length < 6 Then ToastMessageShow("(guardaProductoSinGestion) El nombre del producto no es valido " & nombre, True)
precioSin = NumberFormat2(precioSin, 1, 2, 2, False)
costoU = NumberFormat2(costoU, 1, 2, 2, False)
LogColor("guardaProductoSinGestion: "&prodId&", cant="&cant&", tipo="&tipoVenta, Colors.Magenta)
Private c As Cursor
' Private tablaProds As String = "cat_gunaprod2"
' If tipoVenta = "ABORDO" Then tablaProds = "cat_gunaprod"
Starter.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_FECHA, PE_USUARIO, PE_RUTA, PE_COSTO_SIN, PE_TIPO, PE_ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,0) ", Array As Object (cedis, (cant * costoU), costoU, cant, nombre, prodId, clienteId, fecha, usuario, rutaV, precioSin, tipoVenta))
'Actualizamos el inventario en cat_gunaprod solo si no es RMI
If cedis <> "DUR" Then
Starter.skmt.ExecNonQuery2($"update ${traeTablaProds(tipoVenta)} set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? "$, Array As Object(cant, prodId))
Log($"update ${traeTablaProds(tipoVenta)} set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? -- ${cant}, ${prodId}"$)
End If
c=Starter.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE, SUM(PE_COSTO_SIN) AS TOTAL_CLIE_SIN FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)")
c.Position=0
' Log("###### delete from pedido_cliente - " & traeCliente & "|" & clienteId)
' Log($"delete from pedido_cliente where PC_CLIENTE = '${traeCliente}'"$)
Starter.skmt.ExecNonQuery($"delete from pedido_cliente where PC_CLIENTE = '${traeCliente}'"$)
Starter.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT,PC_ALMACEN,PC_RUTA,PC_COSTO_SIN,PC_ENVIADO) VALUES (?,?,?,?,?,?,?,?,?,?,0)", Array As Object(clienteId, fecha, usuario, c.GetString("CANT_CLIE"), c.GetString("TOTAL_CLIE"), B4XPages.MainPage.lon_gps, B4XPages.MainPage.lat_gps, cedis, rutaV, c.GetString("TOTAL_CLIE_SIN")))
End Sub
Sub guardaProductoSin(cedis As String, costoTot As String, costoU As String, cant As String, nombre As String, prodId As String, clienteId As String, fecha As String, usuario As String, rutaV As String, precioSin As String, tipoV As String, precio2 As String, query As String) 'ignore
If nombre.Length < 6 Then ToastMessageShow("(guardaProductoSin) El nombre del producto no es valido " & nombre, True)
precioSin = NumberFormat2(precioSin, 1, 2, 2, False)
precio2 = NumberFormat2(precio2, 1, 2, 2, False)
costoU = NumberFormat2(costoU, 1, 2, 2, False)
costoTot = NumberFormat2(costoTot, 1, 2, 2, False)
LogColor("guardaProductoSin", Colors.Magenta)
Starter.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_FECHA, PE_USUARIO, PE_RUTA, PE_COSTO_SIN, PE_TIPO, PE_PRECIO2, PE_ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,0) ", Array As Object (cedis, costoTot, costoU, cant, nombre, prodId, clienteId, fecha, usuario, rutaV, precioSin, tipoV, precio2))
Starter.skmt.ExecNonQuery2("update " & query & " set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cant, prodId))
DateTime.DateFormat = "MM/dd/yyyy"
Private sDate As String =DateTime.Date(DateTime.Now)
Private sTime As String =DateTime.Time(DateTime.Now)
Private c As Cursor = Starter.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE, SUM(PE_COSTO_SIN) AS TOTAL_CLIE_SIN FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)")
c.Position=0
Log("###### delete from pedido_cliente - " & traeCliente & "|" & clienteId)
Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)")
Starter.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT,PC_ALMACEN,PC_RUTA,PC_COSTO_SIN,PC_ENVIADO) VALUES (?,?,?,?,?,?,?,?,?,?,0)", Array As Object(clienteId, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), Starter.lon_gps, Starter.lat_gps, cedis, rutaV, c.GetString("TOTAL_CLIE_SIN")))
Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)")
c.Close
' ToastMessageShow("guardaProdSin", False)
End Sub
Sub actualizaProducto(cedis As String, costoU As String, cant As String, nombre As String, prodId As String, clienteId As String, fecha As String, usuario As String, rutaV As String, precioSin As String, tipoVenta As String)
If revisaHora Then
If nombre.Length < 6 Then ToastMessageShow("(actualizaProducto) El nombre del producto no es valido " & nombre, True)
precioSin = NumberFormat2(precioSin, 1, 2, 2, False)
costoU = NumberFormat2(costoU, 1, 2, 2, False)
LogColor($"actualizaProducto, c=${clienteId}, p=${prodId}, nombre=${nombre}, cant=${cant}, precio=${costoU}, cedis=${cedis}, tipo=${tipoVenta}"$, Colors.Magenta)
' Private tablaProds As String = "cat_gunaprod2"
' If tipoVenta = "ABORDO" Then tablaProds = "cat_gunaprod"
Private c As Cursor=Starter.skmt.ExecQuery($"select * from pedido where pe_cedis = '${cedis}' and pe_proid = '${prodId}' and pe_cliente = '${clienteId}'"$)
If c.RowCount > 0 Then
LogColor("ACTUALIZAMOS PROD - " & traeTablaProds(tipoVenta), Colors.Blue)
c.Position = 0
Private antCant As Int = 0
If IsNumber(c.GetInt("PE_CANT")) Then antCant=c.GetInt("PE_CANT")
Private difCant As Int = cant - antCant
Starter.skmt.ExecNonQuery($"update pedido set pe_cant = ${cant}, pe_costou = ${costoU}, pe_costo_tot = ${NumberFormat2((cant*c.GetString("PE_COSTOU")), 1, 2, 2, False)}, pe_tipo = '${tipoVenta}', pe_enviado = 0 where pe_cedis = '${cedis}' and pe_proid = '${prodId}' and pe_cliente = '${clienteId}' "$)
If cedis <> "DUR" Then Starter.skmt.ExecNonQuery($"update ${traeTablaProds(tipoVenta)} set cat_gp_almacen = cat_gp_almacen - (${difCant}) where cat_gp_id = '${prodId}' "$)
If cant = 0 Then
LogColor($"BORRAMOS PRODUCTO - ${prodId}"$, Colors.Red)
Starter.skmt.ExecNonQuery($"delete from pedido where pe_cedis = '${cedis}' and pe_proid = '${prodId}' and pe_cliente = '${clienteId}' "$)
Log($"Borramos pe_cedis='${cedis}' and pe_proid='${prodId}' and pe_cliente='${clienteId}'"$)
Private pe As Cursor = Starter.skmt.ExecQuery("select count(pe_cliente) as cuantosPedidos from pedido where pe_cliente In (select cuenta from cuentaa)")
pe.Position=0
If pe.GetString("cuantosPedidos") = 0 Then
Log("###### delete from pedido_cliente - " & traeCliente & "|" & clienteId)
Log($"delete from pedido_cliente where PC_CLIENTE = '${traeCliente}'"$)
Starter.skmt.ExecNonQuery($"delete from pedido_cliente where PC_CLIENTE = '${traeCliente}'"$)
End If
End If
Else
'INSERTAMOS
' LogColor("INSERTAMOS PROD", Colors.red)
If cant > 0 Then guardaProductoSinGestion(cedis, costoU, cant, nombre, prodId, clienteId, fecha, usuario, rutaV, precioSin, tipoVenta)
End If
c.Close
Else
Msgbox("La hora del equipo NO coincide con la hora del servidor, el producto NO se agregó al pedido", "AVISO IMPORTANTE")
End If
End Sub
'Regresa un mapa con la información de la promo.
'Regresa: {id, maxXcliente, maxRecurrente, maxPromos, historico,
' productos={idProducto={idProducto, preciosimptos, precio, almacen, tipo, piezas, usuario, fecha, regalo, clasif}} 'Mapa con los productos de la promo y los datos de cada uno.
' tipos={idProducto=tipo} 'Mapa con id y tipo del producto, 0 si es fijo y 1 si es variable.
' prodsFijos={idProducto,idProducto} 'Lista con los ids de los productos fijos.
' prodsVariables={idProducto,idProducto} 'Lista con los ids de los productos variables.
' resultado="OK" 'Ok si existe la promocion.
' prodsVariablesRequeridos=5} 'Cantidad de productos variables requeridos para la promoción.
Sub traePromo(promo As String, cliente As String) As Map
Private thisLog As Boolean = false
If thisLog Then Log("traePromo:"&promo)
Private inicioContador As String = DateTime.Now
Private c As Cursor = Starter.skmt.ExecQuery("Select * from promos_comp where cat_pa_id = '"& promo&"'") 'Obtenemos el maximo de promociones a otorgar.
Private siHistorico As String = 0
Private promoMap As Map
Private prodsFijos, prodsFijosPrecios, prodsFijosPiezas, prodsVariables, prodsVariablesPrecios As List
promoMap.Initialize
prodsFijos.Initialize
prodsFijosPrecios.Initialize
prodsFijosPiezas.Initialize
prodsVariables.Initialize
prodsVariablesPrecios.Initialize
c.Position = 0
promoMap = CreateMap("id":promo, "maxXcliente":0, "maxRecurrente":0, "maxPromos":0) 'Ponemos el DEFAULT en CERO.
If c.RowCount > 0 Then
promoMap = CreateMap("id":promo, "maxXcliente":c.GetString("CAT_PA_MAXPROMCLIE"), "maxRecurrente":c.GetString("CAT_PA_MAXPROMREC"), "maxPromos":c.GetString("CAT_PA_MAXPROM"))
End If
'######### PROMOCIONES SEGMENTADAS ##########
' Si la promo esta en la lista, SOLO los clientes que la tengan la pueden ver.
Private ps As Cursor = Starter.skmt.ExecQuery($"select * from HIST_CLIENTE_CANT_PROMOS where HCCP_PROMO = '${promo}'"$) ' and HCCP_CLIENTE = '${cliente}'
' Log($"select * from HIST_CLIENTE_CANT_PROMOS where HCCP_PROMO = '${promo}'"$)
If thisLog Then Log($"PROMOS SEGMENTADAS ENCONTRADAS: ${ps.RowCount}"$)
If thisLog Then Log(promoMap)
If ps.RowCount > 0 Then
ps.Position = 0
promoMap = CreateMap("id":promo, "maxXcliente":0, "maxRecurrente":0, "maxPromos":0) 'Si es segmentada la ponemos en cero, porque SOLO le debe de aparecer a ciertos clientes.
If thisLog Then Log($">>> PROMO "${promo}" SEGMENTADA PARA EL CLIENTE ${ps.GetString("HCCP_CLIENTE")}"$)
' Select hccp_cliente As valido from HIST_CLIENTE_CANT_PROMOS where HCCP_PROMO = '${promo}' and HCCP_CLIENTE = '${traecliente}'
Private ps2 As Cursor = Starter.skmt.ExecQuery($"Select * from HIST_CLIENTE_CANT_PROMOS where HCCP_PROMO = '${promo}' and HCCP_CLIENTE = '${traeCliente}' and HCCP_CANT > HCCP_CANT_VENDIDA"$)
Log($"Select * from HIST_CLIENTE_CANT_PROMOS where HCCP_PROMO = '${promo}' and HCCP_CLIENTE = '${traeCliente}' and HCCP_CANT > HCCP_CANT_VENDIDA"$)
Log($"registros:${ps2.RowCount}"$)
If ps2.RowCount > 0 Then
ps2.Position = 0
If thisLog Then Log($"registros:${ps2.RowCount}, cliente: ${ps2.GetString("HCCP_CLIENTE")} cant:${ps2.GetString("HCCP_CANT")}"$)
promoMap = CreateMap("id":promo, "maxXcliente":(ps2.GetString("HCCP_CANT")-ps2.GetString("HCCP_CANT_VENDIDA")), "maxRecurrente":ps2.GetString("HCCP_CANT"), "maxPromos":ps2.GetString("HCCP_CANT")) 'Si es segmentada SOLO le aparece a ciertos clientes.
End If
ps2.Close
End If
ps.Close
If thisLog Then Log(promoMap)
' ########## TERMINA PROMOS SEGMENTADAS ##########
c = Starter.skmt.ExecQuery("Select count(*) as hist from HIST_PROMOS where HP_CLIENTE = '"& cliente & "' and HP_CODIGO_PROMOCION = '" & promo & "'") 'Revisamos si hay historico de la promoción.
c.Position = 0
If c.GetString("hist") > 0 Then siHistorico = 1
promoMap.Put("historico", siHistorico)
c.Close
c = Starter.skmt.ExecQuery("Select * from CAT_DETALLES_PAQ where CAT_DP_ID = '"& promo & "'") 'Obtenemos los detalles de la promoción.
c.Position = 0
If c.RowCount > 0 Then
Private prods, tipos As Map
prods.Initialize
tipos.Initialize
For i = 0 To c.RowCount -1
c.Position=i
prods.Put(c.GetString("CAT_DP_IDPROD"), CreateMap("idProducto":c.GetString("CAT_DP_IDPROD"), "precioSimptos":c.GetString("CAT_DP_PRECIO_SIMPTOS"), "precio":c.GetString("CAT_DP_PRECIO"), "tipo":c.GetString("CAT_DP_TIPO"), "piezas":c.GetString("CAT_DP_PZAS"), "regalo":c.GetString("CAT_DP_REGALO"), "clasif":c.GetString("CAT_DP_CLASIF")))
tipos.Put(c.GetString("CAT_DP_IDPROD"), c.GetString("CAT_DP_TIPO"))
If c.GetString("CAT_DP_TIPO") = "0" Then
prodsFijos.Add(c.GetString("CAT_DP_IDPROD"))
prodsFijosPrecios.Add(c.GetString("CAT_DP_PRECIO"))
prodsFijosPiezas.Add(c.GetString("CAT_DP_PZAS"))
End If
If c.GetString("CAT_DP_TIPO") = "1" Then
prodsVariables.Add(c.GetString("CAT_DP_IDPROD"))
prodsVariablesPrecios.Add(c.GetString("CAT_DP_PRECIO"))
End If
If thisLog Then Log($"id:${c.GetString("CAT_DP_IDPROD")}, tipo:${c.GetString("CAT_DP_TIPO")}"$)
Next
promoMap.Put("productos", prods) 'Mapa con los productos de la promocion (id, precio, almacen, tipo, piezas, etc.)
promoMap.Put("tipos", tipos) 'Mapa con los productos de la promoción y su tipo (fijo o variable).
promoMap.Put("prodsFijos", prodsFijos) 'Lista de los productos fijos de la promoción.
promoMap.Put("prodsVariables", prodsVariables) 'Lista de los productos variables de la promoción.
promoMap.Put("prodsFijosCant", prodsFijos.Size)
promoMap.Put("prodsFijosPrecios", prodsFijosPrecios)
promoMap.Put("prodsFijosPiezas", prodsFijosPiezas)
promoMap.Put("prodsVariablesCant", prodsVariables.Size)
promoMap.Put("prodsVariablesPrecios", prodsVariablesPrecios)
promoMap.Put("resultado", "ok")
' LogColor($"****************************************************************"$, Colors.red)
LogColor("*********** Prods Fijos: " & prodsFijos.Size & " Prods Variables: " & prodsVariables.Size & " ************", Colors.red)
' LogColor("***************** Prods Variables: " & prodsVariables.Size & " *************", Colors.red)
LogColor($"****************************************************************"$, Colors.red)
Else
promoMap.Put("resultado", "No hay datos de la promoción.")
End If
c.Close
c = Starter.skmt.ExecQuery("Select CAT_GP_STS, CAT_GP_NOMBRE from CAT_GUNAPROD2 where CAT_GP_ID = '"& promo & "'") 'Obtenemos las piezas requeridas de productos variables para la promoción.
c.Position = 0
Private pvr As String = 0
If c.RowCount > 0 Then
c.Position = 0
pvr = c.GetString("CAT_GP_STS")
promoMap.Put("prodsVariablesRequeridos", pvr) 'Cantidad de productos variables requeridos para la promoción.
promoMap.put("descripcion", c.GetString("CAT_GP_NOMBRE"))
End If
c.Close
If thisLog Then Log($"Inv variables: ${cuantosVariablesDisponiblesDB(promo)}"$)
If thisLog Then Log($"Inv dispo: ${traemosInventarioDisponibleParaPromo(promo)}"$)
If thisLog Then LogColor($"Promo ${promo}: ${promoMap}"$, Colors.Blue)
' If thisLog Then LogColor("TIEMPO para traePromo -=" & promo & "=- : " & ((DateTime.Now-inicioContador)/1000), Colors.Red)
Return promoMap
End Sub
'Regresa un mapa con el inventario disponible por producto para la promoción (desde la base de datos).
Sub traemosInventarioDisponibleParaPromo(promo As String) As Map 'ignore
Private thisLog As Boolean = False
Private c As Cursor
c = Starter.skmt.ExecQuery2("SELECT CAT_GP_ID, CAT_GP_ALMACEN FROM CAT_GUNAPROD2 WHERE CAT_GP_ID IN (select CAT_DP_IDPROD FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID = ?)", Array As String(promo))
' Private prodInv As Map
' prodInv.Initialize
Private prods As Map
prods.Initialize
If c.RowCount > 0 Then
For i=0 To c.RowCount -1
c.Position=i
prods.Put(c.GetString("CAT_GP_ID"), c.GetString("CAT_GP_ALMACEN"))
' Log($"prod:${c.GetString("CAT_GP_ID")}, inventario:${c.GetString("CAT_GP_ALMACEN")}"$)
If thisLog Then LogColor($"#### prod:${c.GetString("CAT_GP_ID")}, inventario:${c.GetString("CAT_GP_ALMACEN")}, inv2: ${traeExistenciasPorId(c.GetString("CAT_GP_ID"))}"$, Colors.Magenta)
If c.GetString("CAT_GP_ALMACEN") <> traeExistenciasPorId(c.GetString("CAT_GP_ID")) Then
If thisLog Then LogColor("#### ERROR DE INVENTARIO ####" , Colors.red)
End If
Next
' prodInv.Put("inventarios", prods)
End If
c.Close
Return prods
End Sub
'Select CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_PRECIO, CAT_GP_ALMACEN, CAT_GP_TIPO, CAT_GP_IMG from cat_gunaprod2 where CAT_GP_NOMBRE like '%pro%' and CAT_GP_ALMACEN > 0 AND CAT_GP_TIPO = 'PROMOS' AND CAT_GP_SUBTIPO = 'PROMOS' AND CAT_GP_TIPOPROD <> 1 and (length(CAT_GP_CODPROMO) = 1 OR CAT_GP_CODPROMO = CAT_GP_ID ORDER BY CAT_GP_TIPOPROD2 DESC, CAT_GP_NOMBRE)
'Resta los productos fijos del inventario de la promoción (mapa) y regresa un mapa con el nuevo inventario.
'Hay que darle como parametro un mapa (traePromo(promo)) con toda la informacion de la promocion.
'Regresa en el mapa la llave "resultado" que nos da "ok" o "No hay suficiente producto para la promocion".
Sub restaFijosPromo(promoMap As Map) As Map 'ignore
Private thisLog As Boolean = False 'Si es verdadero, muestra los logs de este sub.
Private inventariosDisponiblesParaEstaPromo As Map = traemosInventarioDisponibleParaPromo(promoMap.Get("id")) 'Obtenemos un mapa con el inventario disponible para cada producto de la promocion desde la base de datos.
If thisLog Then LogColor(inventariosDisponiblesParaEstaPromo, Colors.red)
If thisLog Then LogColor("Inventario inicial antes de FIJOS: "&inventariosDisponiblesParaEstaPromo, Colors.Gray) 'Inventario inicial.
Private i As Int
Private prodsmap As Map = promoMap.Get("productos") 'Obtenemos un mapa con todos los productos de la promoción.
Private prodsFijos As List = promoMap.get("prodsFijos") 'Obtenemos un a lista con los productos fijos de la promoción.
If thisLog Then LogColor("ProdsFijos -> " & prodsFijos, Colors.red)
inventariosDisponiblesParaEstaPromo.Put("resultado", "No hay suficiente producto para la promocion.") 'Valor por default
If thisLog Then Log($"Prods fijos requeridos ${prodsFijos.Size}"$)
If prodsFijos.Size = 0 Then inventariosDisponiblesParaEstaPromo.Put("resultado", "ok") 'Si no lleva prods fijos la promo, entonces ponemos FIJOS OK.
For p = 0 To prodsFijos.Size - 1
Private t As String = prodsFijos.Get(p) 'Obtenemos el Id de este producto desde la lista de productos fijos.
Private p2 As Map = prodsmap.Get(t) 'Obtenemos un mapa con los datos de este producto (id, precio, almacen, tipo, piezas, etc.)
If thisLog Then Log($"T: ${t}, prod ${p2.Get("idProducto")}, piezas: ${p2.Get("piezas")}"$) 'Producto y piezas requeridas
If thisLog Then Log("inventariosDisponiblesParaEstaPromo="&inventariosDisponiblesParaEstaPromo)
If inventariosDisponiblesParaEstaPromo.ContainsKey(t) Then 'Si el mapa del inventario contiene el id del producto entonces ...
i = inventariosDisponiblesParaEstaPromo.get(t) 'Obtenemos del mapa el inventario de este producto.
Private nuevoInv As Int = NumberFormat2((i - promoMap.Get("prodsFijosPiezas").As(List).get(p)), 1, 0,0,False)
If thisLog Then Log($"Nuevo inventario de ${t}: ${i}-${promoMap.Get("prodsFijosPiezas").As(List).get(p)} = ${nuevoInv}"$) 'El nuevo inventario.
inventariosDisponiblesParaEstaPromo.Put(t, $"${nuevoInv}"$) 'Restamos del inventario las piezas requeridas para la promoción y guardamos el nuevo inventario en el mapa.
inventariosDisponiblesParaEstaPromo.Put("resultado", "ok")
Else 'Si en el mapa no esta el id del producto, entonces no tenemos inventario.
inventariosDisponiblesParaEstaPromo.Put("resultado", "No hay suficiente producto para la promocion.")
If thisLog Then LogColor("Sin suficiente inventario fijo: " & t, Colors.Blue)
Exit
End If
If i - p2.Get("piezas") < 0 Then
inventariosDisponiblesParaEstaPromo.Put("resultado", "No hay suficiente producto para la promocion.") 'Si el inventario de este producto sale negativo, quiere decir que no tenemos suficiente inventario para la promoción.
Exit
End If
Next
If thisLog Then LogColor("Inventario final despues de FIJOS: "&inventariosDisponiblesParaEstaPromo, Colors.blue) 'Inventario final.
Return inventariosDisponiblesParaEstaPromo
End Sub
'Revisa si tenemos los productos variables requeridos para la promoción (mapa).
'Hay que darle como parametro un mapa (traePromo(promo)) con toda la informacion de la promocion.
Sub alcanzanLosVariablesParaPromo(promoMap As Map, inventarioSinFijos As Map) As Boolean 'ignore
Private thisLog As Boolean = False 'Si es verdadero, muestra los logs de este sub.
If thisLog Then LogColor("Inventario inicial: "&inventarioSinFijos, Colors.Gray) 'Inventario inicial.
Private totalProdsVariables As Int = 0
' Private prodsmap As Map = promoMap.Get("productos") 'Obtenemos un mapa con todos los productos de la promoción.
Private prodsVariables As List = promoMap.get("prodsVariables") 'Obtenemos un a lista con los productos variables de la promoción.
For p = 0 To prodsVariables.Size - 1
Private t As String = prodsVariables.Get(p) 'Obtenemos el Id de este producto desde la lista de productos fijos.
If inventarioSinFijos.ContainsKey(t) Then 'Si existe el producto en la lista del inventario, entonces ...
Private p2 As Int = inventarioSinFijos.Get(t) 'Obtenemos el inventario disponible este producto.
If thisLog Then Log($"prod ${t}, hay: ${p2}"$) 'Producto y piezas requeridas
totalProdsVariables = totalProdsVariables + p2
End If
Next
If thisLog Then Log("Total prods variables=" & totalProdsVariables & ", requeridos=" & promoMap.Get("prodsVariablesRequeridos"))
Private res As Boolean = False
If totalProdsVariables >= promoMap.Get("prodsVariablesRequeridos") Then res = True 'Si el total de inventario de productos variables (totalProdsVariables) es mayor o igual a los productos requeridos entonces regresamos TRUE
Return res
End Sub
'Regresa el numero máximo de promociones permitidas, tomando en cuenta recurrentes, clientes y maxPromos.
Sub traeMaxPromos(pm As Map) As Int
Private thisLog As Boolean = True 'Si es verdadero, muestra los logs de este sub.
Private maxPromos As List
Private mp0, mp As String = "0"
maxPromos.Initialize
Private hccp As Cursor = Starter.skmt.ExecQuery($"select HCCP_CANT from HIST_CLIENTE_CANT_PROMOS where HCCP_CLIENTE = '${traeCliente}' and HCCP_PROMO = '${pm.Get("id")}'"$)
' Log($"select HCCP_CANT from HIST_CLIENTE_CANT_PROMOS where HCCP_CLIENTE = '${traeCliente}' and HCCP_PROMO = '${pm.Get("id")}'"$)
' If hccp.RowCount > 0 Then
' hccp.Position = 0
' LogColor(hccp.GetString("HCCP_CANT"), Colors.Magenta)
' Else
' LogColor("SIN HCCP CANT", Colors.Magenta)
' End If
' If thisLog Then LogColor("==== Historico: "&pm.Get("historico"), Colors.Red)
' Log("### PRODS VARIABLES: " & pm.Get("prodsVariables"))
Private maxPromosXDescPV As String = B4XPages.MainPage.promos.ts.maxPromosPorProdsVariables(pm.Get("prodsVariables"), pm.Get("id"))
Logcolor("########### maxPromosXDescPV " & maxPromosXDescPV, Colors.Yellow)
' If thisLog Then Log(pm)
maxPromos.Add(maxPromosXDescPV.As(Int))
If pm.Get("historico") = "1" Then maxPromos.Add(pm.Get("maxRecurrente")) 'Si hay historico, agregamos maxRecurrente
If pm.Get("maxPromos") <> "null" Then maxPromos.Add(pm.Get("maxPromos").As(Int)) 'Agregamos maxPromos
If pm.Get("maxXcliente") <> "null" Then maxPromos.Add(pm.Get("maxXcliente").As(Int)) 'Agregamos maxXcliente
If hccp.RowCount > 0 Then 'Agregamos promos HCCP
hccp.Position = 0
maxPromos.Add(hccp.GetInt("HCCP_CANT"))
End If
maxPromos.Sort(True)
If thisLog Then Log($" >>>>> MAX PROMOS X CONF : ${maxPromos} <==> ${maxPromos.Get(0)}"$)
mp = 0
If maxPromos.Size > 0 Then
mp0 = maxPromos.Get(0)
' Log(mp0)
mp = mp0 - traePromosVendidas(pm.Get("id"), traeCliente)
If thisLog Then Log($" >>>>> MAX PROMOS - PROMOS VENDIDAS <==> ${mp0} - ${(traePromosVendidas(pm.Get("id"), traeCliente)).As(Int)} = ${mp}"$)
End If
hccp.Close
Return mp 'Regresamos el numero mas pequeño de las opciones.
End Sub
'Regresa la cantidad de promos que se le han vendido al cliente.
Sub traePromosVendidas(promo As String, cliente As String) As Int
Private c As Cursor
Private pv As Int = 0
c=Starter.skmt.ExecQuery($"select sum(PE_CANT) as cuantas from PEDIDO where PE_PROID = '${promo}' and PE_CLIENTE = '${cliente}'"$)
If c.RowCount > 0 Then
c.Position = 0
If c.GetString("cuantas") <> Null Then pv = c.GetString("cuantas")
End If
c.Close
Return pv
End Sub
Sub procesaPromocion(idPromo As String, cliente As String) As Map 'ignore
Private thisLog As Boolean = True 'Si es verdadero, muestra los logs de este sub.
Private inicioContador As String = DateTime.Now
Private mp As Int = 0
If thisLog Then LogColor($"****************************************************************"$, Colors.RGB(142,0,255))
If thisLog Then LogColor($"********* Iniciamos revision de Promo ${idPromo} *********"$, Colors.RGB(142,0,255))
If thisLog Then LogColor($"****************************************************************"$, Colors.RGB(142,0,255))
Try
'Obtenemos el mapa con toda la info de la promoción.
Private pm As Map = traePromo(idPromo, cliente)
' B4XPages.MainPage.productos.promosC.traePromo(idPromo, cliente)
If thisLog Then LogColor(pm, Colors.Blue)
' If thisLog Then LogColor("|" & pm.Get("maxPromos") & "|", Colors.Blue)
' Log("|"&revisaMaxPromosProdsFijosPorInventario(pm)&"|")
Private maxPromosXprodsFijos As Int = revisaMaxPromosProdsFijosPorInventario(pm)
If maxPromosXprodsFijos < 1 Then pm.Put("resultado", 0)
If thisLog Then LogColor($"***********************************************************************"$, Colors.Blue)
LogColor($"*** PROMOS DISPONIBLES X PRODS FIJOS (${idPromo}) = ${maxPromosXprodsFijos} ***"$, Colors.Blue)
If thisLog Then LogColor($"***********************************************************************"$, Colors.Blue)
If pm.Get("resultado") = "ok" Then 'Si encontramos la promoción, entonces ...
'Buscamos el máximo de promociones permitidas.
mp = traeMaxPromos(pm)
' If thisLog Then LogColor($"Promociones permitidas=${mp}"$, Colors.Blue)
' If thisLog Then Log("Promos vendidas: " & traePromosVendidas(idPromo, cliente))
If mp < 1 Then
If thisLog Then LogColor("Ya se vendieron las promos PERMITIDAS para el cliente", Colors.red)
Return CreateMap("status":"ko", "mp":pm)
End If
'Restamos del inventario (mapa) las piezas necesarias para los productos fijos.
Private inventarioSinFijos As Map = restaFijosPromo(pm)
If thisLog Then LogColor("inventariosfijos="&inventarioSinFijos, Colors.Magenta)
If inventarioSinFijos.Get("resultado") = "ok" Then
'Revisamos que los productos variables requeridos sean menos que el inventario total (mapa).
Private pv As Boolean = alcanzanLosVariablesParaPromo(pm, inventarioSinFijos)
If thisLog Then LogColor($"****************************************************"$, Colors.Blue)
If thisLog Then LogColor($"***** ¿ALCANZAN LOS VARIABLES? ==> ${IIf(pv, "SI", "NO")} *****"$, Colors.Blue)
If thisLog Then LogColor($"****************************************************"$, Colors.Blue)
If pv Then Return CreateMap("status":"ok", "mp":pm) Else Return CreateMap("status":"ko", "mp":pm)
Else
If thisLog Then LogColor("NO HAY INVENTARIO SUFICIENTE " & idPromo, Colors.red)
Return CreateMap("status":"ko", "mp":pm)
End If
Else
Return CreateMap("status":"ko", "mp":pm)
End If
' Si tenemos suficiente inventario para los variables mostramos la promocion, si no ...
' break 'NO HAY INVENTARIO SUFICIENTE PARA LA PROMOCION.
LogColor("TIEMPO DE PROCESO ESTA PROMO: " & ((DateTime.Now-inicioContador)/1000), Colors.Red)
Catch
Log($"Promo ${idPromo} mal configurada"$)
ToastMessageShow($"Promo ${idPromo} mal configurada"$, True)
Log(LastException)
' Agregamos esta línea para evitar el NullPointerException
Return CreateMap("status":"ko", "mp":Null)
End Try
End Sub
'Regresa cuantas promos alcanzan con los productos FIJOS que hay en inventario.
Sub revisaMaxPromosProdsFijosPorInventario2(pm As Map) As Int 'ignore
Private thisLog As Boolean = False
If thisLog Then Log($"pm=${pm}"$)
' Private prodsFijos As List = pm.get("prodsFijos")
Private invDispParaPromo As Map = traemosInventarioDisponibleParaPromo(pm.Get("id"))
If thisLog Then Log($"invDispParaPromo=${invDispParaPromo}"$)
Private maxPromos As String = traeMaxPromos(pm)
Private maxPromosFijosXinv As Int = 1
Private fpf2, pdp2 As Int
Private salir As Boolean = False
Private pf As List = pm.Get("prodsFijos")
Private pfp As List = pm.Get("prodsFijosPiezas")
If thisLog Then Log($"maxPromos=${maxPromos}, prodsFijos=${pf}, piezas=${pfp}"$)
If thisLog Then LogColor($"InvFijo disponible=${invDispParaPromo}"$, Colors.Blue)
Private invFijoXpromo As Map
invFijoXpromo.Initialize
For p = 0 To pf.Size -1 'Generamos mapa con los productos fijo y piezas requeridos por promo.
invFijoXpromo.Put(pf.Get(p), pfp.Get(p))
Next
If thisLog Then LogColor("Inv req. de prods fijos x promo" & invFijoXpromo, Colors.Green)
For i = 1 To maxPromos 'Revisamos cuantas promociones alcanzan, hasta llegar al máximo de promos permitadas.
If thisLog Then LogColor("Prods para promo " & (i+1), Colors.Magenta)
For q = 0 To pf.Size - 1
Private q2 As String = pf.Get(q)
If thisLog Then Log("q="&q2)
' fpf2 = invFijoXpromo.Get(q2) * i 'Multiplicamos las piezas requeridas por la cantidad de promos.
fpf2 = pfp.Get(q) * i 'Multiplicamos las piezas requeridas por la cantidad de promos.
pdp2 = invDispParaPromo.Get(q2)
If thisLog Then Log($"pf=${q2}, Actual=${(i)}, max promos: ${pdp2}-${fpf2}=${pdp2 - fpf2}"$)
If pdp2 - fpf2 < 0 Then 'Si el inventario es negativo, entonces ya no alcanza para este producto.
salir=True
Exit
End If
Next
If salir Then Exit
maxPromosFijosXinv = i
Next
If thisLog Then LogColor("InvFijo requerido x promo="&invFijoXpromo, Colors.blue)
LogColor("Maximo de promociones de prodsFijos POR inventario = " & maxPromosFijosXinv, Colors.Red)
Return maxPromosFijosXinv
End Sub
'Regresa cuantas promos alcanzan con los productos FIJOS que hay en inventario.
Sub revisaMaxPromosProdsFijosPorInventario(pm As Map) As Int
Private thisLog As Boolean = False
Private invFijoXpromo As Map
Private t As List
t.Initialize
t.Add(traeMaxPromos(pm)) ' Agregamos a la lista las promos maximas permitidas (recurrente, cliente y promo).
If thisLog Then LogColor($"============ INICIA MAX PROMOS X PRODS FIJOS X INV ========"$, Colors.RGB(176,0,0))
If thisLog Then LogColor($" ### MAX PROMOS (recurrente, cliente y promo): ${t}"$, Colors.Green)
invFijoXpromo.Initialize
If thisLog Then LogColor($" pm=${pm}"$, Colors.Blue)
Private invDispParaPromo As Map = traemosInventarioDisponibleParaPromo(pm.Get("id"))
If thisLog Then Log($" invDispParaPromo=${invDispParaPromo}"$)
Private prodsFijosPiezas As List = pm.Get("prodsFijosPiezas")
Private idProdsFijos As List = pm.Get("prodsFijos")
Private idProdsFijosPrecios As List = pm.Get("prodsFijosPrecios")
For p = 0 To idProdsFijos.Size -1 'Generamos una lista con las promos disponibles por producto (dividimos el inventario total entre las piezas requeridas).
Private thisInvDisp As Int = 0
If invDispParaPromo.Get(idProdsFijos.Get(p)) <> Null Then thisInvDisp = invDispParaPromo.Get(idProdsFijos.Get(p))
If thisLog Then Log($" id=${idProdsFijos.Get(p)}, inv=${thisInvDisp}, pzasReq=${prodsFijosPiezas.Get(p)}"$)
' LogColor($" ====== ${idProdsFijos.Get(p)} - Inv1:${thisInvDisp}, inv2: ${traeExistenciasPorId(idProdsFijos.Get(p))}"$, Colors.Magenta)
' If thisInvDisp <> traeExistenciasPorId(idProdsFijos.Get(p)) Then
' LogColor(" #### ERROR DE INVENTARIO ####" , Colors.red)
' End If
' If thisLog Then Log($"${(thisInvDisp / prodsFijosPiezas.Get(p))}"$)
Private x() As String = Regex.Split("\.", $"${(thisInvDisp / prodsFijosPiezas.Get(p))}"$) 'Separamos el resultado de la division por el punto decimal.
t.Add(x(0).As(Int)) 'Solo guardamos la parte del entero de la division. (promos por inventario)
' If thisLog Then LogColor($" ### T: ${t}"$, Colors.Green) 'promos por inventario
If thisLog Then LogColor($" >>>>> PROMOS X PRODS FIJOS (${idProdsFijos.Get(p)}): ${x(0)} <<<<<"$, Colors.red)
Log($" >>>>> Monto Bonificacion FIJOS (${idProdsFijos.Get(p)}): "$ & B4XPages.MainPage.promos.ts.traeMontoBonificacion(idProdsFijos.Get(p), idProdsFijosPrecios.Get(p), pm.Get("id"),"LOG_revisaMaxPromosProdsFijosPorInventario"))
If thisLog Then LogColor(" >> MAX PRODS FIJOS X BONIFICACIONES: " & B4XPages.MainPage.promos.ts.traeBonificacionesMaximas("bonificaciones", clienteActual, idProdsFijos.Get(p), prodsFijosPiezas.Get(p), idProdsFijosPrecios.Get(p), pm.Get("id")), Colors.blue)
t.Add(B4XPages.MainPage.promos.ts.traeBonificacionesMaximas("bonificaciones", clienteActual, idProdsFijos.Get(p), prodsFijosPiezas.Get(p), idProdsFijosPrecios.Get(p), pm.Get("id"))) 'Agregamos las promos disponibles por Trade Spending
If thisLog Then LogColor($" ### PROMOS X INV: ${t}"$, Colors.Green) 'promos por inventario
Next
t.Sort(True) 'Ordenamos la lista para que en el lugar 0 este el resultao mas pequeño.
If thisLog Then LogColor($" prodsFijos=${idProdsFijos}"$, Colors.Blue)
If thisLog Then LogColor($" prodsFijosPiezasReq=${prodsFijosPiezas}"$, Colors.Blue)
' If thisLog Then LogColor($" invFijoXpromo=${invFijoXpromo}"$, Colors.Blue)
If thisLog Then LogColor(" >>>>>> T: " & t, Colors.Magenta)
LogColor(" ***********************************************************************", Colors.RGB(156,0,0))
LogColor($" ****** MAX PROMOS X INV DE PRODS FIJOS (${pm.get("id")}): "$ & t.Get(0) & " ******", Colors.RGB(156,0,0))
LogColor(" ***********************************************************************", Colors.RGB(156,0,0))
If thisLog Then LogColor($"============ TERMINA MAX PROMOS X PRODS FIJOS X INV ========"$, Colors.RGB(176,0,0))
Return t.Get(0) 'Regresamos el resultado mas pequeño.
End Sub
'Regresa cuantas promos alcanzan con los productos VARIABLES que hay en inventario.
'La cantidad de promos disponibles se calcula DESPUES de descontar los productos fijos, y si las
'promos por productos fijos llega al maximo, aunque se puedan mas de producos variables, solo se
'regresa el maximo por productos fijos. Ej. si las promos por variables es 10, pero el maximo por
'fijos es 5, entonces regresamos 5.
Sub revisaMaxPromosProdsVariablesPorInventario(pm As Map) As Int 'ignore
Private thisLog As Boolean = False
If thisLog Then LogColor("==================revisaMaxPromosProdsVariablesPorInventario====================", Colors.red)
If thisLog Then Log("======================================================")
Private invFijoXpromo As Map
invFijoXpromo.Initialize
Private totalProdsVariablesDisponibles As Int = 0
If thisLog Then LogColor($"pm=${pm}"$, Colors.Blue)
Private invDispParaPromo As Map = traemosInventarioDisponibleParaPromo(pm.Get("id"))
If thisLog Then Log($"invDispParaPromo=${invDispParaPromo}"$)
Private maxPromos As String = traeMaxPromos(pm)
Private maxPromosXFijos As Int = revisaMaxPromosProdsFijosPorInventario(pm)
Private idProdsVariables As List = pm.Get("prodsVariables")
Private prodsVariablesPrecios As List = pm.Get("prodsVariablesPrecios")
Private prodsVariablesRequeridos As Int = pm.Get("prodsVariablesRequeridos")
Private prodsFijosPiezas As List = pm.Get("prodsFijosPiezas")
Private idProdsFijos As List = pm.Get("prodsFijos")
' For p = 0 To idProdsFijos.Size -1 'Generamos mapa con los productos fijos y piezas requeridas por promo.
' invFijoXpromo.Put(idProdsFijos.Get(p), prodsFijosPiezas.Get(p))
' Private idEsteProd As String = idProdsFijos.Get(p)
' Private invEsteProd As Int = invDispParaPromo.Get(idEsteProd)
' Private pzasReqEsteProd As Int = prodsFijosPiezas.Get(p)
' If thisLog Then Log($"id=${idEsteProd}, inv=${invEsteProd}, pzas=${pzasReqEsteProd}"$)
' invDispParaPromo.Put( idEsteProd, (invEsteProd - (1)) )
' Next
If thisLog Then LogColor($"MaxPromos=${maxPromos}, promosXFijos=${maxPromosXFijos}"$, Colors.Blue)
If thisLog Then LogColor($"prodsFijos=${idProdsFijos}"$, Colors.Blue)
If thisLog Then LogColor($"prodsFijosPiezasReq=${prodsFijosPiezas}"$, Colors.Blue)
If thisLog Then LogColor($"prodsVariables=${idProdsVariables}${CRLF}Variables Req=${prodsVariablesRequeridos} "$, Colors.Blue)
' If thisLog Then LogColor($"invFijoXpromo=${invFijoXpromo}"$, Colors.Blue)
If thisLog Then Log($"Prods variables disponibles = ${totalProdsVariablesDisponibles}"$)
Private maxPromosXVariables As Int = 0
'Si prodsFijosCant = 0 entonces no debemos de hacemos el loop, solo sumamos las existencias de los variables / cant de variables requeridos y ese seria el maximo.
Private revisiones As Int = maxPromosXFijos
If pm.Get("prodsFijos").As(List).Size = 0 Then
revisiones = 1
Log(pm.Get("prodsVariables"))
End If
' Log(pm.Get("prodsFijos").As(List).Size)
' Log(maxPromosXFijos)
For x = 1 To maxPromosXFijos
If thisLog Then Log("==================== maxPromosXFijos "& x &" ========================")
If thisLog Then Log("=====================================================")
Log("FIJOS: " & idProdsFijos.Size)
For i = 0 To idProdsFijos.Size - 1
If thisLog Then Log($"FIJO - ${idProdsFijos.Get(i)}, ${invDispParaPromo.Get(idProdsFijos.Get(i))} - ${prodsFijosPiezas.Get(i).As(Int)*(i+1)}"$)
invDispParaPromo.Put(idProdsFijos.Get(i), invDispParaPromo.Get(idProdsFijos.Get(i)).As(Int) - prodsFijosPiezas.Get(i).As(Int)*(i+1)) 'Restamos las piezas de los productos fijos del inventario disponible.
Next
If thisLog Then LogColor("Inv disponible despues de restar fijos = " & invDispParaPromo, Colors.Blue)
totalProdsVariablesDisponibles = 0
Private prodsVariablesXPresupuestoBonificaciones As List
prodsVariablesXPresupuestoBonificaciones.Initialize
For i = 0 To idProdsVariables.Size - 1 'Obtenemos total de productos variables disponibes.
If invDispParaPromo.ContainsKey(idProdsVariables.Get(i)) Then
Log($"Este prodVariable: ${idProdsVariables.Get(i)}"$)
Log($"Este invDisponible: ${invDispParaPromo.Get(idProdsVariables.Get(i))}"$)
' Log(">> Monto Bonificacion: " & B4XPages.MainPage.promos.ts.traeMontoBonificacion(idProdsVariables.Get(i), pm.Get("id")))
prodsVariablesXPresupuestoBonificaciones.Add(B4XPages.MainPage.promos.ts.traeBonificacionesMaximas("bonificaciones", clienteActual, idProdsVariables.Get(i), prodsVariablesRequeridos, prodsVariablesPrecios.Get(i), pm.Get("id")))
' If thisLog Then LogColor(">> Max prods fijos x Bonificaciones: " & B4XPages.MainPage.promos.ts.traeBonificacionesMaximas("bonificaciones", clienteActual, idProdsVariables.Get(i), prodsVariablesRequeridos, pm.Get("id")), Colors.blue)
totalProdsVariablesDisponibles = totalProdsVariablesDisponibles + invDispParaPromo.Get(idProdsVariables.Get(i))
End If
Next
If thisLog Then Log($"1924: ${prodsVariablesXPresupuestoBonificaciones}"$)
'Revisamos variables.
If thisLog Then Log($"Var disponibles - var requeridos : ${totalProdsVariablesDisponibles} - ${prodsVariablesRequeridos*x}"$)
totalProdsVariablesDisponibles = totalProdsVariablesDisponibles - (prodsVariablesRequeridos*x)
If thisLog Then Log("prodsVariables disponibles despues de promo = " & totalProdsVariablesDisponibles)
If totalProdsVariablesDisponibles < 0 Then Exit 'Ya no hay inventario disponible.
maxPromosXVariables = x
Next
'Restamos fijos.
LogColor("Max promos de prodsVariables POR inventario = " & maxPromosXVariables, Colors.red)
If thisLog Then Log("=====================================================")
If thisLog Then LogColor("=================TERMINA MAXPROMOSPRODSVARIABLES===================", Colors.red)
Return maxPromosXVariables
End Sub
'Regresa la suma del inventario de los productos variables de la promoción dada desde la base de datos.
Sub cuantosVariablesTengoBD(promo As String) As String 'ignore
' Private x As String = "0"
' If promo <> "" Then
' Private c As Cursor
' c = Starter.skmt.ExecQuery2("Select SUM(CAT_GP_ALMACEN) as variables FROM CAT_GUNAPROD2 WHERE CAT_GP_ID IN (Select CAT_DP_IDPROD FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID = ? and cat_dp_tipo = 1 GROUP BY CAT_DP_IDPROD)", Array As String (promo))
' If c.RowCount > -1 Then
' c.Position = 0
' If c.GetString("variables") <> Null Then x = c.GetString("variables")
' End If
' End If
' Return x
End Sub
'Trae los produtos variables disponibles de la BD.
Sub cuantosVariablesDisponiblesDB(promo As String)
Private x As String = "0"
If promo <> "" Then
Private c As Cursor
c = Starter.skmt.ExecQuery2("Select CAT_GP_ID, CAT_GP_ALMACEN FROM CAT_GUNAPROD2 WHERE CAT_GP_ID IN (Select CAT_DP_IDPROD FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID = ? and cat_dp_tipo = 1 GROUP BY CAT_DP_IDPROD)", Array As String (promo))
If c.RowCount > 0 Then
For i = 0 To c.RowCount - 1
c.Position = i
' Log(c.GetString("CAT_GP_ID") & ": " & c.GetString("CAT_GP_ALMACEN"))
If c.GetString("CAT_GP_ALMACEN") <> Null Then x = c.GetString("CAT_GP_ALMACEN")
Next
End If
c.Close
End If
Return x
End Sub
'Regresa un mapa con los datos del producto desde la base de datos.
'el mapa incluye: Id, nombre, tipo y subtipo del producto.
Sub traeProdIdDeBD As Map 'ignore
Private c As Cursor
Private m As Map
c=Starter.skmt.ExecQuery("select CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_TIPO,CAT_GP_SUBTIPO from CAT_GUNAPROD2 where CAT_GP_NOMBRE In (Select PDESC from PROID)")
If c.RowCount > 0 Then
c.Position = 0
m = CreateMap("id":c.GetString("CAT_GP_ID"), "nombre":c.GetString("CAT_GP_NOMBRE"), "tipo":c.GetString("CAT_GP_TIPO"), "subtipo":c.GetString("CAT_GP_SUBTIPO"))
Else
m = CreateMap("id":"N/A", "nombre":"N/A", "tipo":"N/A", "subtipo":"N/A")
End If
c.Close
Return m
End Sub
'Guarda en la base de datos la hora inicial y final de la vista.
Sub guardaClienteHoraInicio(cliente As String) 'ignore
Starter.skmt.ExecNonQuery2("insert into PEDIDO_INICIO_FINAL(PIF_CLIENTE, PIF_HORA_INICIO, PIF_HORA_FINAL) VALUES(?,?,?) ", Array As Object (cliente, DateTime.Now, 0))
' LogColor($"insertamos ${cliente}, hora_inicio=${DateTime.Now}, hora_final=0"$,Colors.Red)
End Sub
'Actualizamos el tiempo que el vendedor estuvo en la tienda, desde que entra a la pantalla del cliente hasta que hace clic en "Guardar".
Sub actualizaTET(cliente As String) 'ignore
Dim c As Cursor = Starter.skmt.Execquery2("select * from PEDIDO_INICIO_FINAL where PIF_CLIENTE = ?", Array As String(cliente))
Dim total As Long = 0
If c.RowCount > 0 Then
c.Position=0
For i = 0 To c.RowCount-1
c.Position=i
' LogColor($"cliente=${c.GetString("PIF_CLIENTE")}, inicio=${c.GetString("PIF_HORA_INICIO")}, final=${c.GetString("PIF_HORA_FINAL")}"$, Colors.Magenta)
Dim subtotal As Long = c.GetString("PIF_HORA_FINAL") - c.GetString("PIF_HORA_INICIO")
total = total + subtotal
' Log($" Subtotal=${subtotal}, total=${total}"$)
Next
' Log($"Total=${(total/1000)/60}"$)
Starter.skmt.ExecNonQuery2("update PEDIDO_CLIENTE set PC_TIEMPO_TIENDA = ? where PC_CLIENTE = ?", Array As String(((total/1000)/60), cliente))
End If
End Sub
'Regresa el total de productos y monto del pedido del cliente actual.
Sub traeTotalesClienteActual As Map
Private m As Map
m.Initialize
Private c_prodsX As Cursor=Starter.skmt.ExecQuery("select ifnull(sum(PE_CANT), 0) as cantProds, ifnull(sum(PE_COSTO_TOT), 0) as costoTotal FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) order by PE_PRONOMBRE asc")
c_prodsX.Position=0
' LogColor($"Productos de la orden: ${c_prodsX.GetString("cantProds")}, Total: ${c_prodsX.GetString("costoTotal")}"$, Colors.red)
m = CreateMap("productos": c_prodsX.GetString("cantProds"), "monto" : c_prodsX.GetString("costoTotal"))
Return m
End Sub
'Borra el pedido del cliente actual.
'Borra los registros de la tabla "pedido" y "pedido_cliente"
'Actualiza las tablas "cat_gunaprod" o "cat_gunaprod2" y "kmt_info".
Sub borraPedidoClienteActual As String
Log($"Borramos pedido del cliente ${traeCliente}"$)
Private thisC As Cursor
' Private tablaProds As String = "cat_gunaprod2"
thisC = Starter.skmt.ExecQuery("select PE_PROID, PE_CANT, PE_CEDIS, PE_COSTOU FROM PEDIDO where pe_cliente in (Select CUENTA from cuentaa) and PE_CEDIS <> 'DOE'")
Log($"Registros = ${thisC.RowCount}"$)
If thisC.RowCount > 0 Then
For i = 0 To thisC.RowCount - 1
thisC.Position = i
Log($"Posicion: ${i}, PE_CEDIS=${thisC.GetString("PE_CEDIS")}"$)
If thisC.GetString("PE_CEDIS") <> "DUR" Then
Log("No DUR")
'Codigo para regresar dinero al presupuesto de BONIFICACIONES (Trend Spending)
Private precio0 As String = traePrecio(thisC.GetString("PE_PROID"))
Private precioConDesc As String = (B4XPages.MainPage.cliente.kh.traeDescXSku(traeCliente, thisC.GetString("PE_PROID"))/100)*precio0
Log("precioConDesc: " & precioConDesc)
Log(">>>>>>>>>>>>> " & (precioConDesc * thisC.GetString("PE_CANT")))
If Not(IsNumber(thisC.GetString("PE_CEDIS"))) Then ' Si es promo, entonces es bonificacion.
Private desc As String = B4XPages.MainPage.promos.ts.traeMontoBonificacion(thisC.GetString("PE_PROID"), thisC.GetString("PE_COSTOU"), thisC.GetString("PE_CEDIS"),"borraPedidoClienteActual")
desc = desc * thisC.GetString("PE_CANT")
Log("Regresamos bonificaciones " & thisC.GetString("PE_PROID") & "=" & desc)
modTrendSpending("suma", "bonificaciones", desc)
Else ' Si no es promo, entonces es descuento.
Log("Regresamos descuentos " & thisC.GetString("PE_PROID") & "=" & (precioConDesc * thisC.GetString("PE_CANT")))
modTrendSpending("suma", "descuentos", (precioConDesc * thisC.GetString("PE_CANT")))
End If
'Termina Trend Spending
Starter.skmt.ExecNonQuery2($"update ${traeTablaProds(Starter.tipov)} set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_id = ?"$, Array As Object(thisC.GetString("PE_CANT"), thisC.GetString("PE_PROID")))
End If
' Starter.skmt.ExecNonQuery2("INSERT INTO INVENT_X_ENVIAR (ALMACEN , PROID , CANTIDAD ) VALUES(?,?,?) ", Array As Object (traeAlmacen, thisC.GetString("PE_PROID"),thisC.GetString("PE_CANT")* -1))
Next
End If
Starter.skmt.ExecNonQuery("delete from pedido where pe_cliente in (Select CUENTA from cuentaa) and PE_CEDIS <> 'DOE'")
'la intencion es que al borrar el pedido, y queda doe o normal, no se borre el cliente de pedido_cliente
thisC = Starter.skmt.ExecQuery($"select pe_cedis from pedido where pe_cliente in (Select CUENTA from cuentaa)"$)
If thisC.RowCount < 1 Then Starter.skmt.ExecNonQuery("delete from pedido_cliente where pc_cliente in (Select CUENTA from cuentaa)")
Log("###### delete from pedido_cliente - " & traeCliente)
Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)")
Return 1
End Sub
'Borra el pedido DOE del cliente actual.
'Borra los registros de la tabla "pedido" y "pedido_cliente"
'Actualiza las tablas "cat_gunaprod" o "cat_gunaprod2" y "kmt_info".
Sub borraPedidoDOEClienteActual As String
Log($"Borramos pedido DOE de ${traeCliente}"$)
Private thisC As Cursor
' Private tablaProds As String = "cat_gunaprod2"
thisC = Starter.skmt.ExecQuery("select PE_PROID, PE_CANT, PE_CEDIS FROM PEDIDO where pe_cliente in (Select CUENTA from cuentaa) and PE_CEDIS = 'DOE'")
Log($"Registros = ${thisC.RowCount}"$)
If thisC.RowCount > 0 Then
For i = 0 To thisC.RowCount - 1
thisC.Position=i
If thisC.GetString("PE_CEDIS") <> "DUR" Then
Starter.skmt.ExecNonQuery2($"update ${traeTablaProds(Starter.tipov)} set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_id = ?"$, Array As Object(thisC.GetString("PE_CANT"), thisC.GetString("PE_PROID")))
End If
' Starter.skmt.ExecNonQuery2("INSERT INTO INVENT_X_ENVIAR (ALMACEN , PROID , CANTIDAD ) VALUES(?,?,?) ", Array As Object (traeAlmacen, thisC.GetString("PE_PROID"),thisC.GetString("PE_CANT")* -1))
Next
End If
thisC = Starter.skmt.ExecQuery($"select pe_cedis from pedido where pe_cliente in (Select CUENTA from cuentaa)"$)
Log("###### delete from pedido_cliente - " & traeCliente)
If thisC.RowCount < 1 Then Starter.skmt.ExecNonQuery("delete from pedido_cliente where pc_cliente in (Select CUENTA from cuentaa)")
Starter.skmt.ExecNonQuery("delete from pedido where pe_cliente in (Select CUENTA from cuentaa) and PE_CEDIS = 'DOE'")
Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)")
Return 1
End Sub
'Regresa verdadero si la columna gestion en la tabla "kmt_info" tene valor 2.
'si no, entonces regresa falso.
Sub pedidoGuardado As Boolean 'ignore
Private guardado As Boolean = False
Private g As Cursor = Starter.skmt.ExecQuery("select gestion from kmt_info where CAT_CL_CODIGO in (Select CUENTA from cuentaa)")
If g.RowCount > 0 Then
g.Position=0
If g.GetString("gestion") = "2" Then guardado = True
End If
Log($"Guardado=${guardado}"$)
Return guardado
End Sub
'Regresa verdadero si hay pedido en la tabla "PEDIDO" del cliente actual.
Sub hayPedido As Boolean
Private thisC As Cursor=Starter.skmt.ExecQuery($"select count(PE_CLIENTE) as hayPedido from PEDIDO where PE_CLIENTE = '${traeCliente}'"$)
thisC.Position=0
Private hay As Boolean = False
If thisC.GetString("hayPedido") > 0 Then hay = True
' Log($"Cliente actual=${traeCliente}, hayPedido=${hay}"$)
thisC.Close
Return hay
End Sub
'Regresa el total del pedido en la tabla "PEDIDO" del cliente actual.
'Utiliza la columna PE_COSTO_TOT para hacer la suma.
Sub totalPedido As String
Private cT As Cursor = Starter.skmt.ExecQuery($"select sum(PE_COSTO_TOT) as total from PEDIDO where PE_CLIENTE = '${traeCliente}'"$)
Log($"select sum(PE_COSTO_TOT) as total from PEDIDO where PE_CLIENTE = '${traeCliente}'"$)
Private pTotal As String = "0"
If cT.RowCount > 0 Then
cT.Position = 0
' Log("|"&cT.GetLong("total")&"|"&pTotal)
Private tempT As String = cT.GetLong("total")
If tempT <> "null" And tempT <> Null Then
' Log("|"&cT.GetLong("total")&"|")
pTotal = tempT
End If
' Log($"Cliente actual=${traeCliente}, hayPedido=${hay}"$)
End If
cT.Close
Return pTotal
End Sub
'Regresa verdadero si el usuario actual ya imprimio su venta
Sub revisaImpresa As Boolean
Dim imp As Boolean = False
' Dim i As Cursor = Starter.skmt.ExecQuery("select count(*) as CUANTOS from CLIENTE_IMPRESO where CI_CUENTA in (Select CUENTA from cuentaa)")
Dim i As Cursor = Starter.skmt.ExecQuery("select count(*) as CUANTOS from kmt_info where (impresion = 1 or cat_cl_codigo in (select ci_cuenta from cliente_impreso)) and CAT_CL_CODIGO in (Select CUENTA from cuentaa)")
i.Position = 0
If i.GetString("CUANTOS") > 0 Then imp = True Else imp = False
Return imp
End Sub
'Guarda RMI's (Cambios) en la base de datos
Sub guardaCambiosDeProducto(cantidad, prodNombre, prodId, precio2, query) 'ignore
Log($"${cantidad}, ${prodNombre}, ${prodId}, ${precio2}"$)
Dim sDate, sTime, clie_id, usuario As String
DateTime.DateFormat = "MM/dd/yyyy"
sDate = DateTime.Date(DateTime.Now)
sTime = DateTime.Time(DateTime.Now)
Private a As Cursor = Starter.skmt.ExecQuery("Select CUENTA from cuentaa")
a.Position=0
clie_id = a.GetString("CUENTA")
a = Starter.skmt.ExecQuery("select USUARIO from usuarioa")
a.Position=0
usuario = a.GetString("USUARIO")
Starter.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_FECHA, PE_USUARIO, PE_TIPO, PE_PRECIO2, PE_ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,0) ", Array As Object ("DUR", (precio2 * -1), ((precio2/cantidad) * -1), cantidad, "CAMBIO" & prodNombre, prodId, clie_id, sDate & sTime, usuario, Starter.tipov, precio2))
Starter.skmt.ExecNonQuery2("update " & query & " set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cantidad, prodId))
End Sub
'Regresa la fecha guardada en la base de datos con el formato "YYYYMMDD"
'La fecha es de la última vez que se haya cargado día.
Sub traeFechaDeBD As String 'ignore
Private f As String
Private cf As Cursor = Starter.skmt.ExecQuery2("select CAT_VA_VALOR from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("FECHA"))
If cf.RowCount > 0 Then
cf.Position = 0
f = cf.GetString("CAT_VA_VALOR")
End If
cf.Close
Return f
End Sub
'Regresa la tabla de productos (cat_gunaprod o cat_gunaprod2) dependiendo del tipo de venta.
Sub traeTablaProds(tipoventa As String) As String
Private tablaProds As String = "cat_gunaprod2"
If tipoventa = "ABORDO" Or tipoventa = "PREVENTA" Then tablaProds = "cat_gunaprod"
' LogColor($"Tipo= ${tipoventa}, tabla=${tablaProds}"$, Colors.RGB(200,136,0))
Return tablaProds
End Sub
Sub agrupador()
Private c As Cursor
Private YA_IMPRIMIO As String
If traeCliente <> "0" Then
c=Starter.skmt.ExecQuery("SELECT SUM(PE_FOLIO) AS FOLIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)")
c.Position = 0
If c.GetString("FOLIO") <> Null And c.GetString("FOLIO") > 0 Then
YA_IMPRIMIO = 1
Else
YA_IMPRIMIO = 0
End If
c.Close
End If
' Log($"Ya imprimio=${YA_IMPRIMIO}"$)
Starter.skmt.ExecNonQuery("delete from pedido3")
Starter.skmt.ExecNonQuery("UPDATE PEDIDO SET PE_FOLIO = 0 where PE_FOLIO IS NULL")
Starter.skmt.ExecNonQuery("INSERT INTO PEDIDO3 (PE_PRECIO2, PE_TIPO, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_USUARIO, PE_ENVIADO) SELECT PE_PRECIO2, PE_TIPO, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, SUM(PE_COSTO_TOT) AS PE_COSTO_TOT, PE_COSTOU, SUM(PE_CANT) As PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_USUARIO, PE_ENVIADO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) GROUP BY PE_PRECIO2, PE_TIPO, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, PE_COSTOU, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_ENVIADO")
' Log("update pedido3")
Starter.skmt.ExecNonQuery2("UPDATE PEDIDO3 SET PE_FOLIO = ? WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)", Array As Object(YA_IMPRIMIO))
Starter.skmt.ExecNonQuery("delete from pedido WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)")
Starter.skmt.ExecNonQuery("INSERT INTO PEDIDO SELECT * FROM PEDIDO3")
Starter.skmt.ExecNonQuery2("UPDATE PEDIDO SET PE_FECHA = ? where PE_CLIENTE IN (Select CUENTA from cuentaa) and PE_FECHA IS NULL", Array As Object(traeFecha))
End Sub
Sub esPromo(promoId) As Boolean
Private hay As Boolean = False
Private c_ep As Cursor = Starter.skmt.ExecQuery($"select count(CAT_DP_ID) as cuantos from CAT_DETALLES_PAQ where CAT_DP_ID = '${promoId}'"$)
If c_ep.RowCount > 0 Then
c_ep.Position = 0
If c_ep.GetInt("cuantos") > 0 Then hay = True
End If
Return hay
End Sub
Sub fechanormal(fecha As String) As String 'ignore
' Log(fecha)
Dim OrigFormat As String = DateTime.DateFormat 'save orig date format
DateTime.DateFormat = "YYYY/MM/dd HH:mm:ss"
Dim nuevaFecha As String=DateTime.Date(fecha)
DateTime.DateFormat = OrigFormat 'return to orig date format
' Log(nuevaFecha)
Return nuevaFecha
End Sub
Sub fechanormal2(fecha As String) As String 'ignore
' Log(fecha)
Dim OrigFormat As String = DateTime.DateFormat 'save orig date format
DateTime.DateFormat = "YYYY/MMM/dd"
Dim nuevaFecha As String=DateTime.Date(fecha)
DateTime.DateFormat = OrigFormat 'return to orig date format
' Log(nuevaFecha)
Return nuevaFecha
End Sub
Sub horaNormal(fecha As String) As String 'ignore
' Log(fecha)
Dim OrigFormat As String = DateTime.DateFormat 'save orig date format
DateTime.TimeFormat = "HH:mm"
Dim nuevaFecha As String=DateTime.time(fecha)
DateTime.DateFormat = OrigFormat 'return to orig date format
' Log(nuevaFecha)
Return nuevaFecha
End Sub
'Guarda en la tabla BitacoraGPS el evento espcificado en eventob, junto con coordenadas y otros datos.
'En precision,si metio contraseña para brincar la geocerca, poner 0 gps, si esta dentro de los 50 mts poner 1 y 2 para eventos que no lo ocupen.
'Mandar fecha de sync(sysdate)
Sub bitacora(fechab As String, usuariob As String, almacenb As String, rutab As String, eventob As String, clienteb As String, iniciob As String, finb As String, latitudb As String, longitudb As String, precision As String, motivonoventa As String, motivonovisita As String )
Log(motivonovisita)
If Starter.Logger Then Log("bitacora")
Private cmd As DBCommand
cmd.Initialize
cmd.Name = "mandaBitacora3"
If Starter.Logger Then Log("BITACORA3")
Private nombreCliente As String = traeNombreCliente(clienteb)
If eventob = "Llega a almacen" Then
nombreCliente = "BOLETA"
clienteb = ""
finb = iniciob
End If
If eventob = "Salida almacen" Then nombreCliente = "CHECKLIST"
If eventob = "Fin Día" Then nombreCliente = "FIN DIA"
If eventob = "Carga día" Then nombreCliente = "CARGA DIA"
If eventob <> "Termina Venta" And eventob <> "No Venta" Then
Starter.skmt.ExecNonQuery($"INSERT INTO BITACORAGPS (fechab, usuariob , almacenb , rutab , eventob , clienteb , iniciob , finb , latitudb, longitudb , precision , motivonoventa , motivonovisita) VALUES ('${fechab}' ,'${usuariob}' , '${almacenb}' , '${rutab}' , '${eventob}' , '${clienteb}' , '${iniciob}' , '${finb}' , '${latitudb}' , '${longitudb}' , '${precision}' , '${motivonoventa}' , '${motivonovisita}')"$)
' Log($"'${almacenb}', '${usuariob}', '${rutab}', '${eventob}', '${clienteb}', '${nombreCliente}','${ iniciob}', '${finb}','${ latitudb}','${ longitudb}', '${precision}', '${motivonoventa}', '${motivonovisita}', '${fechab}'"$)
' TMP_ALMACEN, TMP_USUARIO, TMP_RUTA, TMP_EVENTO, TMP_ID_CLIENTE, TMP_NOMBRE_CLIENTE, TMP_INICIO, TMP_FINAL, TMP_LATITUD, TMP_LONGITUD, TMP_PRESICION, TMP_MOTIVO_NO_VENTA, TMP_MOTIVO_NO_VISITA, TMP_FECHA_SINC, TMP_FECHA_MOVIL
' cmd.Parameters = Array As Object(almacenb, usuariob, rutab, eventob, clienteb, nombreCliente, iniciob, finb, latitudb, longitudb, precision, motivonoventa, motivonovisita, fechab)
' Starter.reqManager.ExecuteCommand(cmd , "mandaBitacora")
Else
Private e As Cursor = Starter.skmt.ExecQuery($"select fechab from BITACORAGPS where usuariob = '${usuariob}' and almacenb = '${almacenb}' and rutab = '${rutab}' and clienteb = '${clienteb}' and eventob = 'Inicia Venta' order by fechab desc"$)
' TMP_RUTA = (?) And tmp_almacen = (?) And tmp_usuario = (?) And tmp_id_cliente = (?) And tmp_evento = (?) And tmp_fecha_movil = to_date((?),'YYYY/MM/DD HH24:MI:ss')
If e.RowCount > 0 Then
e.Position = 0
Log("ACTUALIZA BITACORA")
If eventob = "Termina Venta" Then
Starter.skmt.ExecNonQuery($"update BITACORAGPS set finb = '${finb}' where rutab = '${rutab}' and almacenb = '${almacenb}' and usuariob = '${usuariob}' and clienteb = '${clienteb}' and fechab = '${e.GetString("fechab")}' "$)
' cmd.Name = "actualizaSalidaBitacora"
' TMP_FINAL = to_date((?),'YYYY/MM/DD HH24:MI:ss') where TMP_RUTA = (?) and tmp_almacen = (?) and tmp_usuario = (?) and tmp_id_cliente = (?) and tmp_evento = (?) and tmp_fecha_movil = to_date((?),'YYYY/MM/DD HH24:MI:ss');
cmd.Parameters = Array As Object(finb, rutab, almacenb, usuariob, clienteb, "Inicia Venta", e.GetString("fechab"))
' Log($"${finb}, ${rutab}, ${almacenb}, ${usuariob}, ${clienteb}, 'Inicia Venta', ${e.GetString("fechab")}, "$)
' Starter.reqManager.ExecuteCommand(cmd , "mandaBitacora")
else if eventob = "No Venta" Then
Starter.skmt.ExecNonQuery($"update BITACORAGPS set finb = '${finb}', motivonoventa = '${motivonoventa}', motivonovisita = '${motivonovisita}' where rutab = '${rutab}' and almacenb = '${almacenb}' and usuariob = '${usuariob}' and clienteb = '${clienteb}' and fechab = '${e.GetString("fechab")}' "$)
' cmd.Name = "actualizaNoVentaBitacora"
' TMP_FINAL = to_date((?),'YYYY/MM/DD HH24:MI:ss'), TMP_MOTIVO_NO_VENTA = (?), TMP_MOTIVO_NO_VISITA = (?) where TMP_RUTA = (?) and tmp_almacen = (?) and tmp_usuario = (?) and tmp_id_cliente = (?) and tmp_evento = (?) and tmp_fecha_movil = to_date((?),'YYYY/MM/DD HH24:MI:ss')
cmd.Parameters = Array As Object(finb, motivonoventa, motivonovisita, rutab, almacenb, usuariob, clienteb, "Inicia Venta", e.GetString("fechab"))
' Log($"${finb}, ${rutab}, ${almacenb}, ${usuariob}, ${clienteb}, 'Inicia Venta', ${e.GetString("fechab")}, "$)
' Starter.reqManager.ExecuteCommand(cmd , "mandaBitacora")
End If
End If
End If
If eventob <> "Inicia Venta" Then
Private c As Cursor = Starter.skmt.ExecQuery($"select * from BITACORAGPS where usuariob = '${usuariob}' and almacenb = '${almacenb}' and rutab = '${rutab}' and clienteb = '${clienteb}' order by fechab desc"$)
If c.RowCount > 0 Then
c.Position = 0
cmd.Parameters = Array As Object(c.GetString("almacenb"), c.GetString("usuariob"), c.GetString("rutab"), c.GetString("eventob"), c.GetString("clienteb"), nombreCliente, c.GetString("iniciob"), c.GetString("finb"), c.GetString("latitudb"), c.GetString("longitudb"), c.GetString("precision"), c.GetString("motivonoventa"), c.GetString("motivonovisita"), c.GetString("fechab"))
Starter.reqManager.ExecuteCommand(cmd , "mandaBitacora")
End If
End If
If Starter.Logger Then Log("Mandamos bitacora")
End Sub
'En geocerca si mete la contraseña poner 0 en precision gps y si esta dentro de los 50 mts poner 1 y 2 para eventos que no lo ocupen
'Mandar fecha de sync(sysdate)
Sub bitacoraX(fechab As String, usuariob As String, almacenb As String, rutab As String, eventob As String, clienteb As String, iniciob As String, finb As String, latitudb As String, longitudb As String, precision As String, motivonoventa As String, motivonovisita As String )
Log("bitacora")
Starter.skmt.ExecNonQuery($"INSERT INTO BITACORAGPS (fechab, usuariob , almacenb , rutab , eventob , clienteb , iniciob , finb , latitudb, longitudb , precision , motivonoventa , motivonovisita) VALUES ('${fechab}' ,'${usuariob}' , '${almacenb}' , '${rutab}' , '${eventob}' , '${clienteb}' , '${iniciob}' , '${finb}' , '${latitudb}' , '${longitudb}' , '${precision}' , '${motivonoventa}' , '${motivonovisita}')"$)
Private cmd As DBCommand
cmd.Initialize
If eventob <> "Termina Venta" And eventob <> "No Venta" Then
cmd.Name = "mandaBitacora3"
Log("BITACORA3")
Private nombreCliente As String = traeNombreCliente(clienteb)
If eventob = "Llega a almacen" Then
nombreCliente = "BOLETA"
clienteb = ""
finb = iniciob
End If
If eventob = "Salida almacen" Then nombreCliente = "CHECKLIST"
If eventob = "Fin Día" Then nombreCliente = "FIN DIA"
If eventob = "Carga día" Then nombreCliente = "CARGA DIA"
Log($"'${almacenb}', '${usuariob}', '${rutab}', '${eventob}', '${clienteb}', '${nombreCliente}','${ iniciob}', '${finb}','${ latitudb}','${ longitudb}', '${precision}', '${motivonoventa}', '${motivonovisita}', '${fechab}'"$)
' TMP_ALMACEN, TMP_USUARIO, TMP_RUTA, TMP_EVENTO, TMP_ID_CLIENTE, TMP_NOMBRE_CLIENTE, TMP_INICIO, TMP_FINAL, TMP_LATITUD, TMP_LONGITUD, TMP_PRESICION, TMP_MOTIVO_NO_VENTA, TMP_MOTIVO_NO_VISITA, TMP_FECHA_SINC, TMP_FECHA_MOVIL
cmd.Parameters = Array As Object(almacenb, usuariob, rutab, eventob, clienteb, nombreCliente, iniciob, finb, latitudb, longitudb, precision, motivonoventa, motivonovisita, fechab)
Starter.reqManager.ExecuteCommand(cmd , "mandaBitacora")
Else
Private e As Cursor = Starter.skmt.ExecQuery($"select fechab from BITACORAGPS where usuariob = '${usuariob}' and almacenb = '${almacenb}' and rutab = '${rutab}' and clienteb = '${clienteb}' and eventob = 'Inicia Venta' order by fechab desc"$)
If e.RowCount > 0 Then
e.Position = 0
Log("ACTUALIZA BITACORA")
If eventob = "Termina Venta" Then
cmd.Name = "actualizaSalidaBitacora"
' TMP_FINAL = to_date((?),'YYYY/MM/DD HH24:MI:ss') where TMP_RUTA = (?) and tmp_almacen = (?) and tmp_usuario = (?) and tmp_id_cliente = (?) and tmp_evento = (?) and tmp_fecha_movil = to_date((?),'YYYY/MM/DD HH24:MI:ss');
cmd.Parameters = Array As Object(finb, rutab, almacenb, usuariob, clienteb, "Inicia Venta", e.GetString("fechab"))
Log($"${finb}, ${rutab}, ${almacenb}, ${usuariob}, ${clienteb}, 'Inicia Venta', ${e.GetString("fechab")}, "$)
Starter.reqManager.ExecuteCommand(cmd , "mandaBitacora")
else if eventob = "No Venta" Then
cmd.Name = "actualizaNoVentaBitacora"
' TMP_FINAL = to_date((?),'YYYY/MM/DD HH24:MI:ss') where TMP_RUTA = (?) and tmp_almacen = (?) and tmp_usuario = (?) and tmp_id_cliente = (?) and tmp_evento = (?) and tmp_fecha_movil = to_date((?),'YYYY/MM/DD HH24:MI:ss');
cmd.Parameters = Array As Object(finb, motivonoventa, motivonovisita, rutab, almacenb, usuariob, clienteb, "Inicia Venta", e.GetString("fechab"))
Log($"${finb}, ${rutab}, ${almacenb}, ${usuariob}, ${clienteb}, 'Inicia Venta', ${e.GetString("fechab")}, "$)
Starter.reqManager.ExecuteCommand(cmd , "mandaBitacora")
End If
End If
End If
Log("Mandamos bitacora")
End Sub
'Trae la sumatoria del pedido del cliente especificado de la tabla PEDIDO.
'A veces hace el SUM() REDONDEA el monto, con esta función no se redondea nada.
Sub sumaPedido(cliente As String) As String 'ignore
Dim x As Cursor = Starter.skmt.ExecQuery($"select PE_COSTO_TOT from pedido where PE_CEDIS <> PE_PROID and PE_CEDIS <> "DOE" and PE_CLIENTE <> 0"$)
Private total As String = 0
For i = 0 To x.RowCount - 1
x.Position = i
' LogColor(x.GetString("PE_COSTO_TOT"), Colors.Red)
total = total + x.GetString("PE_COSTO_TOT")
' total = NumberFormat2(total, 0, 2, 2, False)
' LogColor(total, Colors.Blue)
Next
x.Close
Return NumberFormat2(total, 1, 2, 2, False)
End Sub
'Regresa el dia de la semana como string.
Sub traeDiaSemana As String
Private hoyNum As Int = DateTime.GetDayOfWeek(DateTime.Now)
Private diaSemana As String = ""
Select Case hoyNum
Case 1
diaSemana = "DOMINGO"
Case 2
diaSemana = "LUNES"
Case 3
diaSemana = "MARTES"
Case 4
diaSemana = "MIERCOLES"
Case 5
diaSemana = "JUEVES"
Case 6
diaSemana = "VIERNES"
Case 7
diaSemana = "SABADO"
End Select
Return diaSemana
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
Sub traeinventario(id As String) As Int
Dim c As Cursor
Dim inventario As String = "0"
c=Starter.skmt.ExecQuery($"select CAT_GP_ALMACEN from ${traeTablaProds(Starter.tipov)} where CAT_GP_ID = '${id}'"$)
' Log($"select CAT_GP_ALMACEN from ${Starter.tabla} where CAT_GP_NOMBRE = '${id}'"$)
If c.RowCount > 0 Then
c.Position = 0
inventario = c.GetString("CAT_GP_ALMACEN")
End If
c.Close
Return inventario
End Sub
'Regresa el TOTAL de la venta del cliente
Sub traeTotalCliente As Double
Private sumaTotal As Double
Private cursorprueba As Cursor = Starter.skmt.ExecQuery2("select PE_COSTO_TOT from pedido where PE_CEDIS <> PE_PROID and pe_cliente in (Select CUENTA from cuentaa) AND PE_CEDIS <> ?", Array As String("DOE"))
For i= 0 To cursorprueba.RowCount -1
cursorprueba.Position = i
' LogColor(cursorprueba.GetString("PE_COSTO_TOT"),Colors.Red)
sumaTotal = sumaTotal + cursorprueba.GetString("PE_COSTO_TOT")
sumaTotal = NumberFormat2(sumaTotal, 0, 2, 2, False)
' Log(NumberFormat2(sumaTotal, 0, 2, 2, False))
Next
cursorprueba.Close
Return sumaTotal
End Sub
'Genera un GUID (globally unique identifier)
Sub GUID As String
Dim sb As StringBuilder
sb.Initialize
For Each stp As Int In Array(8, 4, 4, 4, 12)
If sb.Length > 0 Then sb.Append("-")
For n = 1 To stp
Dim c As Int = Rnd(0, 16)
If c < 10 Then c = c + 48 Else c = c + 55
sb.Append(Chr(c))
Next
Next
Return sb.ToString
End Sub
'Revisa si ya se genera el GUID de la aplicacion y si no lo genera, pone el valor en Starter.GUID
Sub generaGUID_EnExterno
File.MakeDir(File.DirRootExternal,"/Android/kmts")
' Wait For (File.ListFilesAsync(File.DirRootExternal & "/Android/kmts")) Complete (Success As Boolean, Files As List)
Private Files As List = File.ListFiles(File.DirRootExternal & "/Android/kmts")
' Log(Files)
Starter.GUID = ""
For i = 0 To Files.Size - 1
If Files.Get(i).As(String).StartsWith("GUID_") Then Starter.GUID = Files.Get(i)
Next
If Starter.GUID = "" Then
Starter.GUID = GUID
File.WriteString(File.DirRootExternal,$"/Android/kmts/GUID_${Starter.GUID}"$, "0")
End If
Log($"##### GUID: ${Starter.GUID} #####"$)
End Sub
Sub parseHTTPError(error As String) As String
Private nuevoError As String = error
Private inicio As Int = error.IndexOf("<title>")
Private final As Int = error.IndexOf("</title>")
Log("|" & inicio & "|" & final & "|")
If inicio > 0 And final > 0 Then
nuevoError = error.SubString2(inicio + 17, final)
' LogColor(error.SubString2(inicio + 17, final), Colors.Blue)
End If
Return nuevoError
End Sub
'Regresa un mapa con la promocion por monto, siempre y cuando esta tenga existencias y no exista en el pedido del cliente.
Sub revisaPromoPorMonto As Map
Private m As Map
Private rangoMin As String = "0"
Private promoId As String = ""
m.Initialize
Private pm As Cursor = Starter.skmt.ExecQuery($"select CAT_PA_ID,
ifNull(CAT_PA_PORCENTAJE_PAQUETE, 0) As CAT_PA_PORCENTAJE_PAQUETE,
ifNull(CAT_PA_PRECIO1, 0) As CAT_PA_PRECIO1,
ifNull(CAT_PA_PRECIO2, 0) As CAT_PA_PRECIO2 from promos_comp
where CAT_PA_TIPO_PROMONTO = '1' and
CAT_PA_ID Not in (Select PE_CEDIS from PEDIDO where PE_CEDIS = PE_PROID And PE_CLIENTE = '${traeCliente}')"$) 'Traemos las "promos por monto" que no existen en el "PEDIDO" del cliente.
If pm.RowCount > 0 Then
Private clienteId As String = traeCliente
For i = 0 To pm.RowCount - 1
pm.Position = i
Private tm As Map = procesaPromocion(pm.GetString("CAT_PA_ID"), clienteId)
Log(pm.GetString("CAT_PA_ID"))
Log("STATUS PROMO: " & tm.Get("status"))
If tm.Get("status") = "ok" And pm.GetString("CAT_PA_PORCENTAJE_PAQUETE") <> "0" And pm.GetString("CAT_PA_PRECIO2") <> "0" Then
rangoMin = pm.GetString("CAT_PA_PRECIO1") - ((pm.GetString("CAT_PA_PORCENTAJE_PAQUETE") / 100) * pm.GetString("CAT_PA_PRECIO1"))
promoId = pm.GetString("CAT_PA_ID")
m.Put("id", promoId)
m.Put("rangoMin", rangoMin)
m.Put("precio1", pm.GetString("CAT_PA_PRECIO1"))
m.Put("precio2", pm.GetString("CAT_PA_PRECIO2"))
End If
Next
End If
Return m
End Sub
Sub revisaHora As Boolean
Private horaCorrecta As Boolean = False
Private h As Cursor = Starter.skmt.ExecQuery("select CAT_VA_VALOR from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'HORA'")
If h.RowCount > 0 Then
h.Position = 0
Private hr As Int = h.GetString("CAT_VA_VALOR")
DateTime.DateFormat = "HH"
Private ahora As String = DateTime.Date(DateTime.Now)
Log($"${hr} >= ${(ahora - 2)} and ${hr} <= ${(ahora + 2)}"$)
If hr >= ahora - 2 And hr <= ahora + 2 Then
horaCorrecta = True
End If
End If
Return horaCorrecta
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
' Compara dos versiones en formato "X.YY.ZZ"
' Devuelve:
' -1 si versionActual es MENOR que versionMinima
' 0 si son IGUALES
' 1 si versionActual es MAYOR que versionMinima
Sub comparaVersionesOriginal(versionMinima As String, versionActual As String) As Int
' Dividir las versiones en partes
Dim partesMin() As String = Regex.Split("\.", versionMinima)
Dim partesAct() As String = Regex.Split("\.", versionActual)
' Asegurarse que ambas tienen 3 partes
If partesMin.Length <> 3 Or partesAct.Length <> 3 Then
Log("Formato de versión incorrecto")
Return -1 ' Por seguridad, asumimos que no cumple
End If
' Comparar parte por parte
For i = 0 To 2
Dim numMin As Int = partesMin(i)
Dim numAct As Int = partesAct(i)
If numAct < numMin Then
Return -1 ' Actual es menor
Else If numAct > numMin Then
Return 1 ' Actual es mayor
End If
' Si son iguales, continuar con la siguiente parte
Next
' Si llegamos aquí, todas las partes son iguales
Return 0
End Sub
' Compara dos versiones en formato "X.YY.ZZ"
' Devuelve:
' -1 si versionActual es MENOR que versionMinima
' 0 si son IGUALES
' 1 si versionActual es MAYOR que versionMinima
Sub comparaVersiones(versionMinima As String, versionActual As String) As Int
Dim Pattern As String = "[^0-9.]"
Log(versionMinima)
If versionMinima = "NA" Then Return 0 ' Si version minima es igal a "NA" regresamos "Version valida"
versionMinima = Regex.Replace(Pattern, versionMinima, "") ' Quitamos todo lo que no sea numero o punto.
versionActual = Regex.Replace(Pattern, versionActual, "") ' Quitamos todo lo que no sea numero o punto.
Log($"${versionMinima}|${versionActual}"$)
Dim partesMin() As String = Regex.Split("\.", versionMinima)
Dim partesAct() As String = Regex.Split("\.", versionActual)
If partesMin.Length < 2 Then
' ToastMessageShow("Version incorrecta", False)
LogColor("VERSION INCORRECTA", Colors.red)
Return -1 ' ← Actual no cumple el formato mínimo
End If
' Si la actual tiene MENOS partes que la mínima, es inválida (opcional)
If partesAct.Length < partesMin.Length Then
' ToastMessageShow("Version incorrecta", False)
LogColor("VERSION INCORRECTA", Colors.red)
Return -1 ' ← Actual no cumple el formato mínimo
End If
' Compara solo las partes que existen en la versión mínima
For i = 0 To partesMin.Length - 1
Dim numMin As Int = partesMin(i)
Dim numAct As Int = partesAct(i)
If numAct < numMin Then
ToastMessageShow("Versión descontinuada, por favor actualizar!", False)
Return -1 ' Actual es menor
Else If numAct > numMin Then
Return 1 ' Actual es mayor
End If
' Si son iguales, sigue comparando
Next
' Si todas las partes comparadas son iguales:
Return 0
End Sub
'' Regresa un mapa con el tipo, monto permitido semanal y el acumulado hasta el día anterior:
'' ej:
'' - RMI=1500,0
'' - DESCUENTOS=1500,0
'' - BONIFICACIONES=1500,480
'Sub traeInfoTrendSpending As Map
' Private semana As Int = 0
' Private HIST_TSS_SEMANA As String
' Private HIST_TSS_SEMANA_ACUM As String
' Private m As Map
' m.Initialize
' Private c As Cursor = Starter.skmt.ExecQuery($"select cat_va_valor from cat_variables where cat_va_descripcion = 'SEM_CAL_LABORAL'"$)
' If c.RowCount > 0 Then
' c.Position = 0
' semana = c.GetInt("CAT_VA_VALOR")
' End If
' If semana > 0 Then
' c = Starter.skmt.ExecQuery($"select HIST_TSS_TIPO, HIST_TSS_SEMANA${semana}, HIST_TSS_SEMANA${semana}_ACUM from HIST_TREND_SPENDING_SEMANAL"$)
' If c.RowCount > 0 Then
' For i = 0 To c.RowCount - 1
' c.Position = i
' HIST_TSS_SEMANA = c.GetString($"HIST_TSS_SEMANA${semana}"$)
' HIST_TSS_SEMANA_ACUM = c.GetString($"HIST_TSS_SEMANA${semana}_ACUM"$)
' If c.GetString("HIST_TSS_TIPO") = "RMI" Then
' m.Put("RMI", HIST_TSS_SEMANA & "," & HIST_TSS_SEMANA_ACUM)
' else if c.GetString("HIST_TSS_TIPO") = "DESCUENTOS" Then
' m.Put("DESCUENTOS", HIST_TSS_SEMANA & "," & HIST_TSS_SEMANA_ACUM)
' else if c.GetString("HIST_TSS_TIPO") = "BONIFICACIONES" Then
' m.Put("BONIFICACIONES", HIST_TSS_SEMANA & "," & HIST_TSS_SEMANA_ACUM)
' End If
' Next
' End If
' End If
' Return m
'End Sub
' Modifica el acumulado del Trend Speding, le "suma" o "resta" al presupuesto especificado (RMI, BONIFICACIONES o DESCUENTOS)
Sub modTrendSpending(accion As String, tipo As String, monto As String)
Private HIST_TSS_SEMANA As String
Private HIST_TSS_SEMANA_ACUM As String
Private acumulado As String = "0"
If Starter.semana = 0 Then
Private c As Cursor = Starter.skmt.ExecQuery($"select cat_va_valor from cat_variables where cat_va_descripcion = 'SEM_CAL_LABORAL'"$)
If c.RowCount > 0 Then
c.Position = 0
Starter.semana = c.GetInt("CAT_VA_VALOR")
End If
End If
HIST_TSS_SEMANA = $"HIST_TSS_SEMANA${Starter.semana}"$
HIST_TSS_SEMANA_ACUM = $"HIST_TSS_SEMANA${Starter.semana}_ACUM"$
Private d As Cursor = Starter.skmt.ExecQuery($"select acumulado from TREND_SPENDING where tipo = '${tipo.ToUpperCase}'"$)
If d.RowCount > 0 Then
d.Position = 0
acumulado = d.GetString("ACUMULADO")
End If
Log("acumulado: " & acumulado & " | monto: " & monto)
Private c As Cursor = Starter.skmt.ExecQuery($"select HIST_TSS_TIPO, ifnull(${HIST_TSS_SEMANA},0) as disponible, ifnull(${HIST_TSS_SEMANA_ACUM},0) as acumulado from HIST_TREND_SPENDING_SEMANAL where HIST_TSS_TIPO = '${tipo.ToUpperCase}'"$)
If accion.ToUpperCase = "RESTA" Then
If c.RowCount > 0 Then
c.Position = 0
If tipo.ToUpperCase = "BONIFICACIONES" Or tipo.ToUpperCase = "RMI" Or tipo.ToUpperCase = "DESCUENTOS" Then
Private nuevaBonificacion As String = NumberFormat2((acumulado + monto), 1, 2, 2, False)
LogColor($"Nuevo acumulado ${tipo} = ${nuevaBonificacion}"$, Colors.Magenta)
Starter.skmt.ExecNonQuery($"delete from TREND_SPENDING where tipo = '${tipo.ToUpperCase}' "$)
Starter.skmt.ExecNonQuery($"insert into TREND_SPENDING (tipo, acumulado) values ('${tipo.ToUpperCase}', '${nuevaBonificacion}')"$)
' else if tipo.ToUpperCase = "RMI" Then
End If
End If
else if accion.ToUpperCase = "SUMA" Then
If c.RowCount > 0 Then
c.Position = 0
If tipo.ToUpperCase = "BONIFICACIONES" Or tipo.ToUpperCase = "RMI" Or tipo.ToUpperCase = "DESCUENTOS" Then
Private nuevaBonificacion As String = NumberFormat2((acumulado - monto), 1, 2, 2, False)
LogColor($"Nueva ${tipo} = ${nuevaBonificacion}"$, Colors.Magenta)
Starter.skmt.ExecNonQuery($"delete from TREND_SPENDING where tipo = '${tipo.ToUpperCase}' "$)
Starter.skmt.ExecNonQuery($"insert into TREND_SPENDING (tipo, acumulado) values ('${tipo.ToUpperCase}', '${nuevaBonificacion}')"$)
End If
End If
End If
End Sub
'Sub traeAcumuladoHoyTS(tipo As String) As String
' Private HIST_TSS_SEMANA As String
' Private HIST_TSS_SEMANA_ACUM As String
' Private acumulado As String = "0"
' If Starter.semana = 0 Then
' Private c As Cursor = Starter.skmt.ExecQuery($"select cat_va_valor from cat_variables where cat_va_descripcion = 'SEM_CAL_LABORAL'"$)
' If c.RowCount > 0 Then
' c.Position = 0
' Starter.semana = c.GetInt("CAT_VA_VALOR")
' End If
' End If
' HIST_TSS_SEMANA = $"HIST_TSS_SEMANA${Starter.semana}"$
' HIST_TSS_SEMANA_ACUM = $"HIST_TSS_SEMANA${Starter.semana}_ACUM"$
' Private d As Cursor = Starter.skmt.ExecQuery($"select acumulado from TREND_SPENDING where tipo = '${tipo.ToUpperCase}'"$)
' If d.RowCount > 0 Then
' d.Position = 0
' acumulado = d.GetString("ACUMULADO")
' End If
' LogColor($"Acumulado hoy de ${tipo}: "$ & acumulado, Colors.Blue)
' Return NumberFormat2(acumulado, 1, 2, 2, False)
'End Sub
Sub traePrecio(id As String) As String
Private precio As String = "0"
Private c As Cursor = Starter.skmt.ExecQuery($"select cat_gp_precio from ${traeTablaProds(Starter.tipov)} where cat_gp_id = '${id}'"$)
If c.RowCount > 0 Then
c.Position = 0
precio = c.GetString("CAT_GP_PRECIO")
End If
Return precio
End Sub
'
'Sub trendSpendingFuncs(accion As String, tipo As String, clienteId As String, id As String, laCant As String, inv As Int) As String
' Private logger As Boolean = True
' Dim kh As kms_helperSubs
' kh.Initialize("kh", "kh", Starter.skmt)
' Dim TS_RMI() As String
' Dim TS_DESCUENTOS() As String
' Dim TS_BONIFICACIONES() As String
' Private mx As Map = traeInfoTrendSpending
' TS_RMI = Regex.Split(",", mx.Get("RMI"))
' TS_DESCUENTOS = Regex.Split(",", mx.Get("DESCUENTOS"))
' TS_BONIFICACIONES = Regex.Split(",", mx.Get("BONIFICACIONES"))
'
' If tipo.ToUpperCase = "RMI" Then
' Private lasMaximas As Int = 0
' Log($"Acumulado de RMIs: ${traeAcumuladoHoyTS("rmi")}"$)
' Private elMonto As String = NumberFormat2(traePrecioRMI(id), 1, 2, 2, False)
' Log($"elMonto: ${elMonto}"$)
' Log($"TS_RMI(0): ${TS_RMI(0)}"$)
' Log($"TS_RMI(1): ${TS_RMI(1)}"$)
' Log($"LaCant: ${laCant}"$)
' Private rmisRestantes As String = (TS_RMI(0) - TS_RMI(1) - traeAcumuladoHoyTS("rmi"))
' Log($"rmisRestantes: ${rmisRestantes}"$)
'
' If accion.ToUpperCase = "PRODMAS" Then 'Regresa lasMaximas y elMonto separadas por un "|"
' If elMonto > 0 Then
' lasMaximas = ((laCant * elMonto) + rmisRestantes) / elMonto
' If logger Then Log("lasMaximas: " & lasMaximas)
' If logger Then Log(traeAcumuladoHoyTS("rmi"))
' End If
'' If laCant + 1 = lasMaximas Then
'' ToastMessageShow("El presupuesto de RMI no permite agregar mas productos!!", False)
'' End If
' If logger Then Log("EL RMI: " & elMonto)
' Log($"lacant=${laCant} < lasMaximas=${lasMaximas} = ${laCant<lasMaximas}"$)
' If laCant < lasMaximas Then
' modTrendSpending("resta", "rmi", elMonto) ' Restamos al presupuesto de hoy (agregamos al acumulado).
' End If
' If logger Then Log("RMI RESTANTES: " & (TS_RMI(0) - TS_RMI(1) - traeAcumuladoHoyTS("rmi")))
' Return lasMaximas & "|" & elMonto
' else if accion.ToUpperCase = "PRODMENOS" Then
' If logger Then Log("LaCANT= " & laCant & ", elMonto= " & elMonto)
' If laCant >= 0 Then
' modTrendSpending("suma", "rmi", elMonto) ' Agregamos al presupuesto de hoy (restamos del acumulado).
' End If
' Return lasMaximas & "|" & elMonto
' End If
' else If tipo.ToUpperCase = "BONIFICACIONES" Then
' Dim lasMaximas As Int = 0
' Dim elMonto As String = 0
' Private elMonto As String = NumberFormat2(kh.traePrecio(id)*(kh.traeDescXSku(clienteId, id)/100), 1, 2, 2, False)
' Private BonsRestantes As String = (TS_BONIFICACIONES(0) - TS_BONIFICACIONES(1) - traeAcumuladoHoyTS("bonificaciones"))
' If logger Then Log("EL MONTO: " & elMonto)
' Log("Monto del presupuesto disponible: " & BonsRestantes)
' If accion.ToUpperCase = "PRODMAS" Then 'Regresa lasMaximas y elMonto separadas por un "|"
' Log("PMAS")
' If elMonto > 0 Then
' lasMaximas = ((laCant * elMonto) + BonsRestantes) / elMonto
' If logger Then Log("lasMaximas: " & lasMaximas)
' If logger Then Log(traeAcumuladoHoyTS("bonificaciones"))
' End If
' If laCant = lasMaximas Then
' ToastMessageShow("El presupuesto de BONIFICACIONES no permite agregar mas productos!!", False)
' End If
' If logger Then Log("EL MONTO: " & elMonto)
' If inv > 0 And laCant < lasMaximas Then
' modTrendSpending("resta", "bonificaciones", elMonto) ' Restamos al presupuesto de hoy (agregamos al acumulado).
' End If
' If logger Then Log(">>>> MONTO RESTANTE PRESUPUESTO: " & (TS_BONIFICACIONES(0) - TS_BONIFICACIONES(1) - traeAcumuladoHoyTS("bonificaciones")))
' Return lasMaximas & "|" & elMonto
' else if accion.ToUpperCase = "PRODMENOS" Then 'Regresa bonificacionesMaximas y elMonto separadas por un "|"
' If logger Then Log("LaCANT= " & laCant & ", elMonto= " & elMonto)
' If laCant >= 0 Then
' modTrendSpending("suma", "bonificaciones", elMonto) ' Agregamos al presupuesto de hoy (restamos del acumulado).
' End If
' Return lasMaximas & "|" & elMonto
' else if accion.ToUpperCase = "TEXTCHANGED" Then
' Log("TC")
'' Private laBonificacion As String = NumberFormat2(kh.traePrecio(id)*(kh.traeDescXSku(clienteId, id)/100), 1, 2, 2, False)
'' Log("LA BONIFICACION: " & laBonificacion)
'' Private BonsRestantes As String = (TS_BONIFICACIONES(0) - TS_BONIFICACIONES(1) - traeAcumuladoHoyTS("bonificaciones"))
'' Log("Monto de BONIFICACIONES disponible: " & BonsRestantes)
'' Private maxDispPorBonificaciones As Int = (BonsRestantes/laBonificacion).As(Int)
'' Log($"Max disponibles por bonificaciones: ${maxDispPorBonificaciones}"$)
'' If laBonificacion > 0 Then
'' If New > bonificacionesMaximas Then
'' If inv > bonificacionesMaximas Then
'' laCant = bonificacionesMaximas
'' Else
'' laCant = inv
'' End If
'' End If
'' Else if laBonificacion = 0 Then
'' If laCant > inv Or New > inv Then
''' Log("Se pasa!!")
''' Log($"Ponemos laCant en: ${inv}"$)
'' laCant = inv
'' End If
'' End If
'' modTrendSpending("resta", "bonificaciones", ((New * laBonificacion) - (Old * laBonificacion)))
'' Log(traeAcumuladoHoyTS("bonificaciones"))
'' Return bonificacionesMaximas & "|" & laBonificacion
' else if accion.ToUpperCase = "FOCUSCHANGED" Then 'Regresa bonificaciones maximas, SOLO correr esta parte si HASFOCUS es VERDADERO.
' Log("FC")
' Private elMonto As String = kh.traePrecio(id)*(kh.traeDescXSku(clienteId, id)/100)
' If elMonto > 0 Then 'And HasFocus
' If logger Then Log("LA BONIFICACION: " & elMonto)
' Private BonsRestantes As String = (TS_BONIFICACIONES(0) - TS_BONIFICACIONES(1) - traeAcumuladoHoyTS("bonificaciones"))
' If logger Then Log("Monto del PRESUPUESTO disponible: " & BonsRestantes)
' lasMaximas = ((laCant * elMonto) + BonsRestantes) / elMonto
' If logger Then Log("bonificacionesMaximas: " & lasMaximas)
' End If
' Return lasMaximas
' End If
' End If
'End Sub
'
'' Trae el precio del RMI desde CAT_RMI.
'Sub traePrecioRMI(id As String) As String
' Private precio As String = "0"
' Private c As Cursor = Starter.skmt.ExecQuery($"select cat_monto from cat_rmi where cat_id = '${id}'"$)
' If c.RowCount > 0 Then
' c.Position = 0
' precio = c.GetString("CAT_MONTO")
' End If
' Return precio
'End Sub
' Revisa que la contraseña sea la correcta: pass1 + dia (sin ceros) + hora (24 hrs sin ceros)
Sub revisaContrasenaHoy
Private pass1 As String = "KMT"
Private contrasenaHoy As String = pass1 & DateTime.GetDayOfMonth(DateTime.Now) & DateTime.GetHour(DateTime.now)
Log($"${contrasenaHoy}"$)
' Log(New)
' If New = contrasenaHoy Then
' p_login.Visible = False
' Sleep(80)
' et_usuario.Text = ""
' If Not(versionOk) Then ExitApplication 'Si la version no es correcta, salimos de la aplicacion.
' kb.HideKeyboard
' End If
End Sub
' Trae las existencias de un producto dado desde CAT_GUNAPROD5 (inventario original) menos el total de producto en PEDIDO.
Sub traeExistenciasPorId(id As String) As Int
' Private inv As Cursor = Starter.skmt.ExecQuery($"Select
' inv.cat_gp_id, inv.cat_gp_almacen - IFNULL(ventas.total_vendido, 0) As inventario_final
' FROM ${traeTablaProds(Starter.tipov)} As inv
' LEFT JOIN
' (Select pe_proid, SUM(pe_cant) As total_vendido FROM pedido
' WHERE pe_tipo = 'VENTA' GROUP BY pe_proid) As ventas
' ON inv.cat_gp_id = ventas.pe_proid
' WHERE inv.cat_gp_id = '${id}'"$)
Dim vendido As Int = 0
Dim existencias As Int = 0
Private inv As Cursor = Starter.skmt.ExecQuery($"select cat_gp_almacen from cat_gunaprod5 where cat_gp_id = '${id}'"$)
If inv.RowCount > 0 Then
inv.position = 0
existencias = inv.GetString("CAT_GP_ALMACEN").As(Int)
End If
' Log("ex:" & existencias)
inv = Starter.skmt.ExecQuery($"Select ifnull(SUM(pe_cant),0) As total_vendido FROM pedido WHERE pe_tipo = 'VENTA' and pe_proid = '${id}'"$)
inv.Position = 0
vendido = inv.GetInt("total_vendido")
' Log("ven:" & vendido)
existencias = (existencias - vendido)
inv.Close
Return existencias
End Sub
' Devuelve True si la hora actual está entre las 5:00 AM y las 22:30 PM
Sub EstaEnHorarioPermitido As Boolean
' Obtener la hora y el minuto actual
Dim HoraActual As Int = DateTime.GetHour(DateTime.Now)
Dim MinutoActual As Int = DateTime.GetMinute(DateTime.Now)
' Convertir la hora actual a minutos totales desde la medianoche para una comparación simple
Dim TiempoActualEnMinutos As Int = (HoraActual * 60) + MinutoActual
' Definir los límites del horario permitido en minutos
Dim InicioEnMinutos As Int = (5 * 60) + 0 ' 5:00 AM = 300 minutos
Dim FinEnMinutos As Int = (22 * 60) + 30 ' 22:30 PM = 1350 minutos
' Comprobar si la hora actual está dentro del rango
If TiempoActualEnMinutos >= InicioEnMinutos And TiempoActualEnMinutos <= FinEnMinutos Then
Return True
Else
Return False
End If
End Sub
'Desahabilita validaciones de Ruta y Version
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
' Recalcula en inventario actual, utiliza la tabla CAT_GUNAPROD5 que tiene el inventario INICIAL y le resta
' lo que hay en PEDIDO, y actualiza CAT_GUNAPROD2 con el valor calculado.
Public Sub RecalcularInventario
Private inicial As Long = DateTime.Now
' 1. Índices: ESTO ES CRUCIAL. Si no tienes estos índices, ningún query será rápido.
' Ejecuta esto una sola vez al crear la BD o al iniciar la app, no en cada cálculo.
' skmt.ExecNonQuery("CREATE INDEX IF NOT EXISTS idx_pedido_proid ON PEDIDO(PE_PROID)")
' skmt.ExecNonQuery("CREATE INDEX IF NOT EXISTS idx_pedido_cliente ON PEDIDO(PE_CLIENTE)")
' skmt.ExecNonQuery("CREATE INDEX IF NOT EXISTS idx_cat5_id ON CAT_GUNAPROD5(CAT_GP_ID)")
Starter.skmt.BeginTransaction
Try
' Lógica del Query:
' 1. Toma el inventario inicial del día desde CAT_GUNAPROD5 (T5).
' 2. Le resta SOLO las ventas reales de la tabla PEDIDO.
' 3. FILTRA (Ignora) los RMIs usando PE_CEDIS <> 'DUR' y el nombre '%CAMBIO%'.
' 4. Actualiza CAT_GUNAPROD2 masivamente.
' Dim sql As String = _
' "UPDATE CAT_GUNAPROD2 " & _
' "SET CAT_GP_ALMACEN = ( " & _
' " SELECT (IFNULL(T5.CAT_GP_ALMACEN, 0) - IFNULL(Ventas.CantidadVendida, 0)) " & _
' " FROM CAT_GUNAPROD5 T5 " & _
' " LEFT JOIN ( " & _
' " SELECT PE_PROID, SUM(PE_CANT) AS CantidadVendida " & _
' " FROM PEDIDO " & _
' " WHERE PE_CLIENTE <> '0' " & _
' " AND PE_CEDIS <> 'DUR' " & _
' " AND PE_PRONOMBRE NOT LIKE '%CAMBIO%' " & _
' " GROUP BY PE_PROID " & _
' " ) Ventas ON T5.CAT_GP_ID = Ventas.PE_PROID " & _
' " WHERE T5.CAT_GP_ID = CAT_GUNAPROD2.CAT_GP_ID " & _
' ") " & _
' "WHERE EXISTS ( " & _ '<-- ESTA ES LA CLAVE QUE EVITA LOS NULLS
' " SELECT 1 FROM CAT_GUNAPROD5 T5 " & _
' " WHERE T5.CAT_GP_ID = CAT_GUNAPROD2.CAT_GP_ID " & _
' ")"
Dim sql As String = _
"UPDATE CAT_GUNAPROD2 " & _
"SET CAT_GP_ALMACEN = ( " & _
" SELECT (IFNULL(INV.CI_INVENTARIO, 0) - IFNULL(Ventas.CantidadVendida, 0)) " & _
" FROM CAT_INVENTARIO INV " & _
" LEFT JOIN ( " & _
" SELECT PE_PROID, SUM(PE_CANT) AS CantidadVendida " & _
" FROM PEDIDO " & _
" WHERE PE_CLIENTE <> '0' " & _
" AND PE_CEDIS <> 'DUR' " & _
" AND PE_PRONOMBRE NOT LIKE '%CAMBIO%' " & _
" GROUP BY PE_PROID " & _
" ) Ventas ON INV.CI_IDPROD = Ventas.PE_PROID " & _
" WHERE INV.CI_IDPROD = CAT_GUNAPROD2.CAT_GP_ID " & _
") " & _
"WHERE EXISTS ( " & _
" SELECT 1 FROM CAT_INVENTARIO INV " & _
" WHERE INV.CI_IDPROD = CAT_GUNAPROD2.CAT_GP_ID " & _
")"
' Ejecutamos el cálculo masivo
Starter.skmt.ExecNonQuery(sql)
Starter.skmt.TransactionSuccessful
If Starter.Logger Then Log("Inventario Sincronizado (Excluyendo RMIs)")
Catch
Log("Error al recalcular inventario: " & LastException)
End Try
Starter.skmt.EndTransaction
LogColor(">>>>> Tiempo de RecalcularInventario: " & ((DateTime.Now - inicial)/1000), Colors.red)
End Sub