13 Commits

Author SHA1 Message Date
136df88646 - VERSION 5.12.15
- Se agregga codigo para que si hay nulos en los datos de Trade Spending no truene la aplicacion.
2025-12-19 23:36:33 -06:00
f0116e375d - VERSION 5.12.14
- Se agrego codigo para que el label de la notificacion tenga scroll vertical y se vaya al inicio del texto
2025-12-19 20:12:14 -06:00
409c224820 - VERSION 5.12.10
- Codigo de prueba para envio de pedido en BATCH
- Se amplio el panel de las notificaciones
- Si no hay presupuesto para bonificaciones NO se muestra la opcion de PROMOS en "Productos"
2025-12-10 16:58:51 -06:00
72ce7c8806 - VERSION 5.12.5
- Se agregó que si no hay presupuesto de bonificaciones, el apartado de PROMOS no aparezca al entrar a productos.
- Se agrego en MAPA_RUTAS que ponga los globitos dinamicamente (faltaba el rojo)
2025-12-08 13:47:05 -06:00
7a88acaf4c - VERSOIN 5.11.26
- Se agregó le descripcion del "flujo" de las promociones en C_Promos
2025-11-30 02:33:43 -06:00
749cf6e7fe - VERSION 5.11.01
- Se cambio como se guarda la informacion del registro del dispositivo, antes en KeyValueStore y ahora en una base de datos propia, esto es porque al parecer en android 10 y 12 no se esta guardando la informacion.
2025-11-05 18:24:48 -06:00
bca0d31469 - VERSION 5.10.20
- Correcciones en el envio de informacion despues de agregar el mandaPendientes, no se estaba enviando el pedido cuando se enviaba informacion desde la pantalla principal (por un timer que no funciona bien).
2025-10-24 00:47:32 -06:00
6fc81fcf0d - VERSION 5.10.16
- Se corrigieron errores en resumen dia e impresion de inventario
2025-10-21 20:03:51 -06:00
ceaa5246e5 - VERSION 5.10.15
- Se pusieron los regalos y exhibidores como categorias exentas de bonificacion.
2025-10-20 16:20:47 -06:00
7a547503b9 - VERSION 5.10.15
- Se hicieron correcciones al codigo de Trade Spending.
- Se cambio la tabla de donde lee los datos para dar de alta clientes nuevos, antes en CLIENTES_NUEVOS_X_RUTA, ahora CAT_RUTAS.
2025-10-16 16:07:41 -06:00
6446187478 - VERSION 5.10.01
- Se cambio el query de conectar (select_ruta4_KELL) a nueva version (select_ruta5_KELL) para preveeer cuando se quiera bloquear la conexion de versiones viejas.
2025-10-03 10:32:23 -06:00
48a1221ef9 - VERSION 5.10.01
- Se agregó el mandaPendientes en el boton de "Guardar" de "Cliente"
2025-10-02 23:47:22 -06:00
e6455d8147 - VERSION 5.09.10.2
- Se corrigio que Trade Spending no consideraba los productos fijos de las promos a la hora de afectar el presupuesto.
- Se agregó la validacion de la version de la app desde cat_rutas (CAT_RU_VERSION_REQUERIDA).
- Se agregó el ligar el telefono a una ruta desde cat_rutas (CAT_RU_IDTELEFONO).
2025-09-23 18:28:06 -06:00
22 changed files with 1561 additions and 390 deletions

View File

@@ -165,9 +165,19 @@ Private Sub B4XPage_Created (Root1 As B4XView)
Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_TREND_SPENDING_SEMANAL (HIST_TSS_RUTA TEXT, HIST_TSS_IDALMACEN TEXT, HIST_TSS_TIPO TEXT, HIST_TSS_SEMANA1 TEXT, HIST_TSS_SEMANA1_ACUM TEXT, HIST_TSS_SEMANA2 TEXT, HIST_TSS_SEMANA2_ACUM TEXT, HIST_TSS_SEMANA3 TEXT, HIST_TSS_SEMANA3_ACUM TEXT, HIST_TSS_SEMANA4 TEXT, HIST_TSS_SEMANA4_ACUM TEXT, HIST_TSS_SEMANA5 TEXT, HIST_TSS_SEMANA5_ACUM TEXT, HIST_TSS_SEMANA6 TEXT, HIST_TSS_SEMANA6_ACUM TEXT, HIST_TSS_GRUPO TEXT)") Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_TREND_SPENDING_SEMANAL (HIST_TSS_RUTA TEXT, HIST_TSS_IDALMACEN TEXT, HIST_TSS_TIPO TEXT, HIST_TSS_SEMANA1 TEXT, HIST_TSS_SEMANA1_ACUM TEXT, HIST_TSS_SEMANA2 TEXT, HIST_TSS_SEMANA2_ACUM TEXT, HIST_TSS_SEMANA3 TEXT, HIST_TSS_SEMANA3_ACUM TEXT, HIST_TSS_SEMANA4 TEXT, HIST_TSS_SEMANA4_ACUM TEXT, HIST_TSS_SEMANA5 TEXT, HIST_TSS_SEMANA5_ACUM TEXT, HIST_TSS_SEMANA6 TEXT, HIST_TSS_SEMANA6_ACUM TEXT, HIST_TSS_GRUPO TEXT)")
Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS TREND_SPENDING (TIPO TEXT, MONTO_SEMANA TEXT, ACUMULADO TEXT)") Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS TREND_SPENDING (TIPO TEXT, MONTO_SEMANA TEXT, ACUMULADO TEXT)")
Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS VERSIONES (VERSION TEXT, FECHA TEXT)") Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS VERSIONES (VERSION TEXT, FECHA TEXT)")
Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CAT_INVENTARIO(CI_IDPROD TEXT, CI_INVENTARIO TEXT)")
''' FIN DOE ''' FIN DOE
Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CAT_NOTIFICACIONES(CN_CODIGO TEXT, CN_ID TEXT,CN_CLIENTE TEXT, CN_NOTIFICACION TEXT)")
Starter.skmt.ExecNonQuery("CREATE TABLE If Not EXISTS HIST_NOTIFICACIONES (HN_CODIGO TEXT, HN_ID TEXT, HN_FECHA TEXT)")
Starter.skmt.ExecNonQuery("CREATE TABLE If Not EXISTS CAT_GUNAPROD5 (CAT_GP_ID TEXT, CAT_GP_ALMACEN TEXT)")
Starter.skmt.ExecNonQuery("CREATE INDEX IF NOT EXISTS idx_pedido_proid ON PEDIDO(PE_PROID)")
Starter.skmt.ExecNonQuery("CREATE INDEX IF NOT EXISTS idx_pedido_cliente ON PEDIDO(PE_CLIENTE)")
Starter.skmt.ExecNonQuery("CREATE INDEX IF NOT EXISTS idx_cat5_id ON CAT_GUNAPROD5(CAT_GP_ID)")
kh.agregaColumna(Starter.skmt, "kmt_info", "IMPRESION", "INTEGER") kh.agregaColumna(Starter.skmt, "kmt_info", "IMPRESION", "INTEGER")
kh.agregaColumna(Starter.skmt, "kmt_info", "CREDITO", "INTEGER") kh.agregaColumna(Starter.skmt, "kmt_info", "CREDITO", "INTEGER")
kh.agregaColumna(Starter.skmt, "PEDIDO", "PE_ENVIADO", "INTEGER DEFAULT 0")
kh.agregaColumna(Starter.skmt, "PEDIDO3", "PE_ENVIADO", "INTEGER DEFAULT 0")
kh.agregaColumna(Starter.skmt, "PEDIDO_CLIENTE", "PC_ENVIADO", "INTEGER DEFAULT 0")
kh.agregaColumna(Starter.skmt, "USUARIOA", "FECHA", "TEXT") kh.agregaColumna(Starter.skmt, "USUARIOA", "FECHA", "TEXT")
kh.agregaColumna(Starter.skmt, "PROMOS_COMP", "CAT_PA_PORCENTAJE_PAQUETE", "TEXT") kh.agregaColumna(Starter.skmt, "PROMOS_COMP", "CAT_PA_PORCENTAJE_PAQUETE", "TEXT")
kh.agregaColumna(Starter.skmt, "PROMOS_COMP", "CAT_PA_PRECIO1", "TEXT") kh.agregaColumna(Starter.skmt, "PROMOS_COMP", "CAT_PA_PRECIO1", "TEXT")
@@ -179,6 +189,9 @@ Private Sub B4XPage_Created (Root1 As B4XView)
kh.agregaColumna(Starter.skmt, "CAT_GUNAPROD2", "CAT_GP_PROMOCION", "TEXT") kh.agregaColumna(Starter.skmt, "CAT_GUNAPROD2", "CAT_GP_PROMOCION", "TEXT")
kh.agregaColumna(Starter.skmt, "TREND_SPENDING", "TIPO", "TEXT") kh.agregaColumna(Starter.skmt, "TREND_SPENDING", "TIPO", "TEXT")
kh.agregaColumna(Starter.skmt, "CAT_DETALLES_PAQ", "CAT_DP_PRECIOB", "TEXT") kh.agregaColumna(Starter.skmt, "CAT_DETALLES_PAQ", "CAT_DP_PRECIOB", "TEXT")
kh.agregaColumna(Starter.skmt, "PEDIDO", "PE_ARCH", "TEXT")
kh.agregaColumna(Starter.skmt, "PEDIDO_CLIENTE", "PC_ARCH", "TEXT")
kh.agregaColumna(Starter.skmt, "PEDIDO3", "PE_ARCH", "TEXT")
Root = Root1 Root = Root1
' Root.LoadLayout("MainPage") ' Root.LoadLayout("MainPage")
Root.LoadLayout("login") Root.LoadLayout("login")
@@ -258,7 +271,7 @@ Log(111)
End If End If
' reqManager.Initialize(Me, Starter.server) ' reqManager.Initialize(Me, Starter.server)
' Activity.LoadLayout("login") ' Activity.LoadLayout("login")
Label1.Text = Application.VersionName Label1.Text = Application.VersionName & " "
' Log("Pedimos permisos de almacenamiento externo") ' Log("Pedimos permisos de almacenamiento externo")
' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_WRITE_EXTERNAL_STORAGE) ' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
@@ -491,8 +504,8 @@ Sub Entrar_Click
Starter.skmt.ExecNonQuery2("INSERT INTO USUARIOA VALUES (?,?,?)", Array As Object(user.Text, pass.Text, DateTime.Date(DateTime.Now))) Starter.skmt.ExecNonQuery2("INSERT INTO USUARIOA VALUES (?,?,?)", Array As Object(user.Text, pass.Text, DateTime.Date(DateTime.Now)))
Starter.skmt.ExecNonQuery("delete from cat_almacen") Starter.skmt.ExecNonQuery("delete from cat_almacen")
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_ALMACEN(ID_ALMACEN) VALUES (?)", Array As Object (pass.Text)) Starter.skmt.ExecNonQuery2("INSERT INTO CAT_ALMACEN(ID_ALMACEN) VALUES (?)", Array As Object (pass.Text))
Starter.skmt.ExecNonQuery("delete from VERSION") ' Starter.skmt.ExecNonQuery("delete from VERSION")
Starter.skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object ("2.95")) ' Starter.skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object ("2.95"))
B4XPages.ShowPage("Principal") B4XPages.ShowPage("Principal")
End If End If
' c=Starter.skmt.ExecQuery2("select count(*) as EXISTE1 from usuarioa where usuario = ?", Array As String(user.Text)) ' c=Starter.skmt.ExecQuery2("select count(*) as EXISTE1 from usuarioa where usuario = ?", Array As String(user.Text))
@@ -508,10 +521,11 @@ Sub Entrar_Click
cmd.Name = "select_usuario_guna_KELL" cmd.Name = "select_usuario_guna_KELL"
cmd.Parameters = Array As Object(user.Text, pass.Text) cmd.Parameters = Array As Object(user.Text, pass.Text)
reqManager.ExecuteQuery(cmd , 0, "usuario") reqManager.ExecuteQuery(cmd , 0, "usuario")
Dim cmd As DBCommand
cmd.Initialize ' Dim cmd As DBCommand
cmd.Name = "select_version_KELL" ' cmd.Initialize
reqManager.ExecuteQuery(cmd , 0, "version") ' cmd.Name = "select_version_KELL"
' reqManager.ExecuteQuery(cmd , 0, "version")
Else Else
Subs.iniciaActividad("Principal") Subs.iniciaActividad("Principal")
' B4XPages.ShowPage("Principal") ' B4XPages.ShowPage("Principal")
@@ -555,6 +569,7 @@ Sub JobDone(Job As HttpJob)
Dim result As DBResult = reqManager.HandleJob(Job) Dim result As DBResult = reqManager.HandleJob(Job)
If result.Tag = "usuario" Then 'query tag If result.Tag = "usuario" Then 'query tag
Subs.logJobDoneResultados(result)
For Each records() As Object In result.Rows For Each records() As Object In result.Rows
Dim name As String = records(result.Columns.Get("USUARIO")) Dim name As String = records(result.Columns.Get("USUARIO"))
Dim ID_ALMACEN As String = records(result.Columns.Get("CAT_LO_AGENCIA")) Dim ID_ALMACEN As String = records(result.Columns.Get("CAT_LO_AGENCIA"))
@@ -592,6 +607,11 @@ Sub JobDone(Job As HttpJob)
p_importarBDWA.Visible = False p_importarBDWA.Visible = False
End If End If
End If End If
If result.Tag = "prueba" Then
Subs.logJobDoneResultados(result)
End If
If result.tag = "traeConexion" Then If result.tag = "traeConexion" Then
Subs.logJobDoneResultados(result) Subs.logJobDoneResultados(result)
End If End If
@@ -856,6 +876,13 @@ Private Sub b_cargaLocalOk_Click
p_cargaLocal.Visible = False p_cargaLocal.Visible = False
' Log(et_cargaLocal.Text.Length > pass1.Length) ' Log(et_cargaLocal.Text.Length > pass1.Length)
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(et_cargaLocal.text) Log(et_cargaLocal.text)
If et_cargaLocal.Text.Length = pass1.Length Then ' Si no se especifica nada, la fecha es hoy MENOS un día. If et_cargaLocal.Text.Length = pass1.Length Then ' Si no se especifica nada, la fecha es hoy MENOS un día.
et_cargaLocal.text = et_cargaLocal.text & "-1" et_cargaLocal.text = et_cargaLocal.text & "-1"
@@ -938,12 +965,7 @@ Private Sub cb_cartaPorte_CheckedChange(Checked As Boolean)
Starter.skmt.ExecNonQuery($"insert into CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) values ('CARTAPORTE', '${Checked}')"$) Starter.skmt.ExecNonQuery($"insert into CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) values ('CARTAPORTE', '${Checked}')"$)
End Sub End Sub
Private Sub et_maxClientesNuevos_TextChanged (Old As String, New As String)
If IsNumber(New) Then
Starter.skmt.ExecNonQuery("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'MAXCTESNUEVOS'")
Starter.skmt.ExecNonQuery($"insert into CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) values ('MAXCTESNUEVOS', '${New}')"$)
End If
End Sub
private Sub l_geocerca_Click private Sub l_geocerca_Click
If cb_geocerca.Enabled = False Then ToastMessageShow("Ingrese la contraseña para modificar", True) If cb_geocerca.Enabled = False Then ToastMessageShow("Ingrese la contraseña para modificar", True)
@@ -954,6 +976,8 @@ Private Sub et_geocerca_TextChanged (Old As String, New As String)
Log(New & "|" & Starter.passSupervisor) Log(New & "|" & Starter.passSupervisor)
If x.RowCount > 0 Then If x.RowCount > 0 Then
x.Position = 0 x.Position = 0
Log("Pass FinDia: |" & x.GetString("CAT_VA_VALOR")&"|"&New&"|")
Log(New.Trim = x.GetString("CAT_VA_VALOR").Trim)
If New = x.GetString("CAT_VA_VALOR") Or New = Starter.passSupervisor Then If New = x.GetString("CAT_VA_VALOR") Or New = Starter.passSupervisor Then
cb_geocerca.Enabled = True cb_geocerca.Enabled = True
cb_cartaPorte.Enabled = True cb_cartaPorte.Enabled = True
@@ -1038,15 +1062,25 @@ Private Sub ImageView1_LongClick
' Log("traeConexion") ' Log("traeConexion")
' Private reqManagerX As DBRequestManager ' Private reqManagerX As DBRequestManager
' reqManagerX.Initialize(Me, "http://keymon.net:9010/DB2") ' reqManagerX.Initialize(Me, "http://keymon.net:9010")
' Private cmdX As DBCommand ' Private cmdX As DBCommand
' cmdX.Initialize ' cmdX.Initialize
' cmdX.Name = "traeConexion" ' cmdX.Name = "update_usuario_guna_nobajas"
' cmdX.Parameters = Array As Object() ' cmdX.Parameters = Array As Object("CDAZA")
' reqManagerX.ExecuteQuery(cmdX, 0, "traeConexion") ' reqManagerX.Executequery(cmdX, 0, "traeConexion")
If Subs.traeAlmacen <> "" Then
linker.VerifyAndLinkDevice(Subs.traeAlmacen, Subs.traeRuta) Log("traeConexion")
End If Private reqManagerX As DBRequestManager
reqManagerX.Initialize(Me, "http://keymon.net:9010/SALMA")
Private cmdX As DBCommand
cmdX.Initialize
cmdX.Name = "update_usuario_guna_nobajas"
cmdX.Parameters = Array As Object("CDAZA", 2, 3, 4)
reqManagerX.ExecuteQuery(cmdX, 0, "prueba")
' If Subs.traeAlmacen <> "" Then
' linker.VerifyDevice(Subs.traeAlmacen, Subs.traeRuta)
' End If
End Sub End Sub
Sub ponUsuario Sub ponUsuario
@@ -1070,27 +1104,29 @@ Sub Linker_Response(Status As String) ' << AÑADE ESTE SUB [New Query]
If Starter.Logger Then LogColor($"Respuesta de DeviceLinker para la verificación del dispositivo: ${Status}"$, Colors.Magenta) ' If Starter.Logger Then LogColor($"Respuesta de DeviceLinker para la verificación del dispositivo: ${Status}"$, Colors.Magenta) '
Select Status Select Status
Case "UUID_ERROR" Case "UUID_ERROR"
Log("Error interno al obtener el identificador único del dispositivo.")
ToastMessageShow("Error interno al obtener el identificador único del dispositivo.", True) ToastMessageShow("Error interno al obtener el identificador único del dispositivo.", True)
Case "HTTP_ERROR" Case "HTTP_ERROR"
LogColor("Error HTTP al verificar el dispositivo: " & linker.lastJobDoneError, Colors.Red) LogColor("Error HTTP al verificar el dispositivo: " & linker.lastJobDoneError, Colors.Red)
ToastMessageShow("Error de conexión al servidor durante la verificación del dispositivo.", True) ToastMessageShow("Error de conexión al servidor durante la verificación del dispositivo.", True)
Case "SERVER_LOGIC_ERROR" Case "SERVER_LOGIC_ERROR"
Log("El servidor no proporcionó un estado de verificación válido. Contacte a soporte.")
ToastMessageShow("El servidor no proporcionó un estado de verificación válido. Contacte a soporte.", True) ToastMessageShow("El servidor no proporcionó un estado de verificación válido. Contacte a soporte.", True)
Case "OK" Case "OK"
If Starter.Logger Then Log("Dispositivo ligado y verificado exitosamente.") Log("Dispositivo vinculado y verificado exitosamente.")
ToastMessageShow("Dispositivo verificado y ligado correctamente.", False) ToastMessageShow("Dispositivo verificado y vinculado correctamente.", False)
' Aquí puedes añadir lógica adicional si la verificación es exitosa, por ejemplo, habilitar ciertos botones o continuar con el flujo normal. ' Aquí puedes añadir lógica adicional si la verificación es exitosa, por ejemplo, habilitar ciertos botones o continuar con el flujo normal.
Case "NO_REGISTRADO" Case "NO_REGISTRADO"
If Starter.Logger Then Log("Dispositivo NO registrado.") Log("Dispositivo NO registrado.")
ToastMessageShow("Dispositivo NO registrado.", False) ToastMessageShow("Dispositivo NO registrado.", False)
Case "REGISTRO_NUEVO" Case "REGISTRO_NUEVO"
If Starter.Logger Then Log("¡¡Registro nuevo!!") Log("¡¡Registro nuevo!!")
ToastMessageShow("¡¡Registro nuevo!!", False) ToastMessageShow("¡¡Registro nuevo!!", False)
Case "ALREADY_REGISTERED" Case "YA_REGISTRADO"
If Starter.Logger Then Log("¡¡El dispositivo ya esta registrado con otra ruta!!") Log("¡¡El dispositivo ya esta registrado con otra ruta!!")
ToastMessageShow("¡¡El dispositivo ya esta registrado con otra ruta!!", True) ToastMessageShow("¡¡El dispositivo ya esta registrado con otra ruta!!", True)
Case Else ' Otros estados que tu servidor pueda devolver (ej. "UNAUTHORIZED", "PENDING_APPROVAL") Case Else ' Otros estados que tu servidor pueda devolver (ej. "UNAUTHORIZED", "PENDING_APPROVAL")
If Starter.Logger Then Log($"Estado de verificación del dispositivo: ${Status}"$) Log($"Estado de verificación del dispositivo: ${Status}"$)
ToastMessageShow($"Verificación del dispositivo: ${Status}"$, True) ToastMessageShow($"Verificación del dispositivo: ${Status}"$, True)
' Puedes decidir si bloquear la funcionalidad o mostrar un mensaje específico según el estado. ' Puedes decidir si bloquear la funcionalidad o mostrar un mensaje específico según el estado.
End Select End Select

View File

@@ -11,6 +11,7 @@ Sub Class_Globals
Dim g As GPS Dim g As GPS
Dim kh As kms_helperSubs Dim kh As kms_helperSubs
Dim reqManager As DBRequestManager Dim reqManager As DBRequestManager
Dim cmd As DBCommand
Dim ruta As String Dim ruta As String
Dim clie_id As String Dim clie_id As String
Dim sDate,sTime As String Dim sDate,sTime As String
@@ -48,6 +49,8 @@ Sub Class_Globals
Dim C1 As Cursor Dim C1 As Cursor
Dim C3 As Cursor Dim C3 As Cursor
Dim C4, C5, C6, C8 As Cursor Dim C4, C5, C6, C8 As Cursor
Dim c2 As Cursor
Dim S2 As Cursor
Dim RMI As String Dim RMI As String
Dim ListView1 As ListView Dim ListView1 As ListView
Dim la_cuenta As Label Dim la_cuenta As Label
@@ -79,9 +82,6 @@ Sub Class_Globals
Dim Guardar As Button Dim Guardar As Button
' Dim NUEVO As Button ' Dim NUEVO As Button
Dim l_total As Label Dim l_total As Label
Dim c2 As Cursor
Dim S2 As Cursor
Private s As Cursor
Dim res As String Dim res As String
Private HIST As Button Private HIST As Button
Private MONTO_COMPRA As String Private MONTO_COMPRA As String
@@ -295,6 +295,12 @@ Sub Class_Globals
Private e_comm As EditText Private e_comm As EditText
Private p_infoGral2 As Panel Private p_infoGral2 As Panel
Dim indicePregunta As Int Dim indicePregunta As Int
Private p_transparenciaNoti As Panel
Private p_Notificacion As Panel
Private l_notificacionTexto As Label
Private l_notificacionTitulo As Label
Private b_notificacion As Button
Dim reqManagerW As DBRequestManagerW
End Sub End Sub
'You can add more parameters here. 'You can add more parameters here.
@@ -375,6 +381,7 @@ Private Sub B4XPage_Created (Root1 As B4XView)
Else Else
RutaBoleta=Starter.rutaV RutaBoleta=Starter.rutaV
End If End If
If s.IsInitialized Then s.Close
End If End If
c=Starter.skmt.ExecQuery2("select CAT_VA_VALOR from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("MACIMP")) c=Starter.skmt.ExecQuery2("select CAT_VA_VALOR from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("MACIMP"))
c.Position = 0 c.Position = 0
@@ -390,7 +397,6 @@ Private Sub B4XPage_Created (Root1 As B4XView)
c.Close c.Close
Panel_INV_A.Left = 0 : Panel_INV_A.top = 0 Panel_INV_A.Left = 0 : Panel_INV_A.top = 0
Panel10.Left = 0 : Panel10.top = 0 Panel10.Left = 0 : Panel10.top = 0
If s.IsInitialized Then s.Close
' Log("################# PERMISOS BT: " & Starter.rp.Check("android.permission.BLUETOOTH_CONNECT")) ' Log("################# PERMISOS BT: " & Starter.rp.Check("android.permission.BLUETOOTH_CONNECT"))
' Log("Permisos BT: " & Starter.rp.Check("android.permission.BLUETOOTH_CONNECT")) ' Log("Permisos BT: " & Starter.rp.Check("android.permission.BLUETOOTH_CONNECT"))
' Log("REVISAMOS PERMISOS DE BT") ' Log("REVISAMOS PERMISOS DE BT")
@@ -421,6 +427,7 @@ Sub B4XPage_Appear
' Log(Starter.rp.Check("android.permission.BLUETOOTH_CONNECT")) ' Log(Starter.rp.Check("android.permission.BLUETOOTH_CONNECT"))
reqManager.Initialize(Me, Starter.DBReqServer) reqManager.Initialize(Me, Starter.DBReqServer)
reqManagerW.Initialize
usarGeocerca = kh.traeUsarGeocerca usarGeocerca = kh.traeUsarGeocerca
'Para el almacen 12 (GDL) no se usa la geocerca 'Para el almacen 12 (GDL) no se usa la geocerca
@@ -494,10 +501,8 @@ Sub B4XPage_Appear
l_atiende.Text = "N/A" l_atiende.Text = "N/A"
If c.GetString("CAT_CL_ATIENDE1") <> Null And c.GetString("CAT_CL_ATIENDE1") <> "null" Then l_atiende.Text = c.GetString("CAT_CL_ATIENDE1") If c.GetString("CAT_CL_ATIENDE1") <> Null And c.GetString("CAT_CL_ATIENDE1") <> "null" Then l_atiende.Text = c.GetString("CAT_CL_ATIENDE1")
l_atiende2.Text = c.GetString("CAT_CL_ATIENTE2") l_atiende2.Text = c.GetString("CAT_CL_ATIENTE2")
l_segmento2.text = "N/A" l_segmento2.text = "N/A"
If c.GetString("CAT_CL_SEGMENTO") <> Null Then l_segmento2.text = c.GetString("CAT_CL_SEGMENTO") If c.GetString("CAT_CL_SEGMENTO") <> Null Then l_segmento2.text = c.GetString("CAT_CL_SEGMENTO")
b_inicioFinVenta.Text = "INICIAR VENTA" b_inicioFinVenta.Text = "INICIAR VENTA"
b_inicioFinVenta.BringToFront b_inicioFinVenta.BringToFront
' LogColor(">>>>>> EN VENTA: " & Starter.enVenta, Colors.red) ' LogColor(">>>>>> EN VENTA: " & Starter.enVenta, Colors.red)
@@ -772,8 +777,9 @@ Sub B4XPage_Appear
'PROMOS POR MONTO 'PROMOS POR MONTO
Private mPromoXMonto As Map = Subs.revisaPromoPorMonto Private mPromoXMonto As Map = Subs.revisaPromoPorMonto
Private elMontoTSDeLaVenta As String = 0
' LogColor("PROMOXMONTO:" & mPromoXMonto, Colors.Blue) ' LogColor("PROMOXMONTO:" & mPromoXMonto, Colors.Blue)
If mPromoXMonto.Size > 0 And clienteId <> 0 Then ' El "clienteId <> 0" es para que no la promo cuando se pida ABORDO If mPromoXMonto.Size > 0 And clienteId <> 0 Then ' El "clienteId <> 0" es para que no de la promo cuando sea ABORDO
If l_total.Text > mPromoXMonto.Get("rangoMin") And l_total.Text < mPromoXMonto.Get("precio1") Then If l_total.Text > mPromoXMonto.Get("rangoMin") And l_total.Text < mPromoXMonto.Get("precio1") Then
Log("Eres candidato a una promocion") Log("Eres candidato a una promocion")
MsgboxAsync($"Si agregas venta para que supere los $${mPromoXMonto.Get("precio1")}, la promoción "${Subs.traeProdNombre(mPromoXMonto.Get("id"))}" se agregará automáticamente."$, "AGREGA VENTA") MsgboxAsync($"Si agregas venta para que supere los $${mPromoXMonto.Get("precio1")}, la promoción "${Subs.traeProdNombre(mPromoXMonto.Get("id"))}" se agregará automáticamente."$, "AGREGA VENTA")
@@ -781,16 +787,24 @@ Sub B4XPage_Appear
'Agregamos la promocion y sus productos FIJOS. 'Agregamos la promocion y sus productos FIJOS.
Private dp As Cursor = Starter.skmt.ExecQuery($"select * from cat_detalles_paq where cat_dp_id = '${mPromoXMonto.Get("id")}'"$) Private dp As Cursor = Starter.skmt.ExecQuery($"select * from cat_detalles_paq where cat_dp_id = '${mPromoXMonto.Get("id")}'"$)
If dp.RowCount > 0 Then If dp.RowCount > 0 Then
Log(">>>> GUARDAMOS PROMOXMONTO HEADER")
Subs.guardaProductoSinGestion(mPromoXMonto.Get("id"), 0, 1, Subs.traeProdNombre(mPromoXMonto.Get("id")), mPromoXMonto.Get("id"), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, Starter.tipov) Subs.guardaProductoSinGestion(mPromoXMonto.Get("id"), 0, 1, Subs.traeProdNombre(mPromoXMonto.Get("id")), mPromoXMonto.Get("id"), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, Starter.tipov)
For i = 0 To dp.RowCount - 1 For i = 0 To dp.RowCount - 1
dp.Position = i dp.Position = i
If dp.GetString("CAT_DP_TIPO") = "0" Then If dp.GetString("CAT_DP_TIPO") = "0" Then
Log(">>>> GUARDAMOS PROMOXMONTO PRODS")
Subs.guardaProductoSinGestion(mPromoXMonto.Get("id"), dp.GetString("CAT_DP_PRECIO"), dp.GetString("CAT_DP_PZAS"), Subs.traeProdNombre(dp.GetString("CAT_DP_IDPROD")), dp.GetString("CAT_DP_IDPROD"), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, Starter.tipov) Subs.guardaProductoSinGestion(mPromoXMonto.Get("id"), dp.GetString("CAT_DP_PRECIO"), dp.GetString("CAT_DP_PZAS"), Subs.traeProdNombre(dp.GetString("CAT_DP_IDPROD")), dp.GetString("CAT_DP_IDPROD"), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, Starter.tipov)
' Traemos el monto de las bonificacionos a guardar. -- Trade Spending
Log("Monto Bonificacion -->> " & B4XPages.MainPage.promos.ts.traeMontoBonificacion(dp.GetString("CAT_DP_IDPROD"), dp.GetString("CAT_DP_PRECIO"), mPromoXMonto.Get("id")))
elMontoTSDeLaVenta = elMontoTSDeLaVenta + (B4XPages.MainPage.promos.ts.traeMontoBonificacion(dp.GetString("CAT_DP_IDPROD"), dp.GetString("CAT_DP_PRECIO"), mPromoXMonto.Get("id")) * dp.GetString("CAT_DP_PZAS"))
End If End If
Next Next
B4XPages.MainPage.promos.ts.modTrendSpending("RESTA", "BONIFICACIONES", elMontoTSDeLaVenta)
Log($"### modTrendSpending("RESTA", "BONIFICACIONES", ${elMontoTSDeLaVenta})"$)
MsgboxAsync($"Promo por monto "${Subs.traeProdNombre(mPromoXMonto.Get("id"))}" agregada."$,"AVISO") MsgboxAsync($"Promo por monto "${Subs.traeProdNombre(mPromoXMonto.Get("id"))}" agregada."$,"AVISO")
B4XPage_Appear B4XPage_Appear
End If End If
dp.Close
End If End If
End If End If
Private ppm As Cursor = Starter.skmt.ExecQuery($"select (select ifnull(sum(PE_COSTO_TOT),0) from pedido where CAT_PA_ID <> pe_cedis) as CT, ifnull((select pe_cedis from pedido where pe_cedis = CAT_PA_ID), 0) as existe, * from PROMOS_COMP where CAT_PA_TIPO_PROMONTO = '1' and CT < cast(cat_pa_precio1 as integer)"$) 'Traemos las promos por monto donde la venta es menor al precio1 para borrarlas. Private ppm As Cursor = Starter.skmt.ExecQuery($"select (select ifnull(sum(PE_COSTO_TOT),0) from pedido where CAT_PA_ID <> pe_cedis) as CT, ifnull((select pe_cedis from pedido where pe_cedis = CAT_PA_ID), 0) as existe, * from PROMOS_COMP where CAT_PA_TIPO_PROMONTO = '1' and CT < cast(cat_pa_precio1 as integer)"$) 'Traemos las promos por monto donde la venta es menor al precio1 para borrarlas.
@@ -809,10 +823,41 @@ Sub B4XPage_Appear
B4XPage_Appear B4XPage_Appear
End If End If
End If End If
ppm.Close
If Not(Subs.revisaHora) Then If Not(Subs.revisaHora) Then
Log("***************** HORA INCORRECTA") Log("***************** HORA INCORRECTA")
MsgboxAsync("La hora del equipo NO coincide con la hora del servidor, es necesario corregirla", "AVISO IMPORTANTE") MsgboxAsync("La hora del equipo NO coincide con la hora del servidor, es necesario corregirla", "AVISO IMPORTANTE")
End If End If
c = Starter.skmt.ExecQuery($"select * from cat_notificaciones where CN_CLIENTE = '${Subs.traeCliente}'"$)
Log("###############################################################")
Log(c.RowCount)
Log("###############################################################")
If c.RowCount > 0 Then
c.Position = 0
l_notificacionTexto.Text = c.GetString("CN_NOTIFICACION")
p_transparenciaNoti.Top = 0 : p_transparenciaNoti.Left = 0
p_transparenciaNoti.Height = Root.Height
p_transparenciaNoti.Width = Root.Width
Subs.centraPanel(p_Notificacion, Root.Width)
p_transparenciaNoti.Visible = True
Log(c.GetString("CN_ID") & "|" & c.GetString("CN_CODIGO"))
b_notificacion.Tag = c.GetString("CN_ID") & "|" & c.GetString("CN_CODIGO")
p_transparenciaNoti.BringToFront
End If
c.Close
' Este codigo es para hacer que el Label de las notificaciones tenga SCROLLVERTICAL.
Dim labeljo, scrollerjo As JavaObject
labeljo = l_notificacionTexto
scrollerjo.InitializeNewInstance("android.text.method.ScrollingMovementMethod", Null)
labeljo.RunMethod("setMovementMethod", Array(scrollerjo)) ' Asigna el método de movimiento para permitir scroll
labeljo.RunMethod("setHorizontallyScrolling", Array(False)) ' CAMBIO: Para scroll vertical, esto DEBE ser False
labeljo.RunMethod("setVerticalScrollBarEnabled", Array(True)) ' Opcional: Forzar a que el scroll sea vertical explícitamente si el contenido es grande
' Forzar el scroll al inicio (0,0)
Sleep(0)
' El primer 0 es la posición X (horizontal), el segundo es la posición Y (vertical)
labeljo.RunMethod("scrollTo", Array(0, 0))
'Termina codigo de label horzontal
End Sub End Sub
Sub Printer1_Connected (Success As Boolean) Sub Printer1_Connected (Success As Boolean)
@@ -888,7 +933,7 @@ Sub GPS_LocationChanged (Location1 As Location)
If c.RowCount > 0 Then If c.RowCount > 0 Then
gps_boton_doe = c.GetString("CAT_CL_EMAIL") gps_boton_doe = c.GetString("CAT_CL_EMAIL")
End If End If
c.Close
' gest.Visible = True ' gest.Visible = True
' gps_boton_doe ="1" ' gps_boton_doe ="1"
' LogColor($"Distancia actual: ${distance}"$, Colors.Blue) ' LogColor($"Distancia actual: ${distance}"$, Colors.Blue)
@@ -901,6 +946,7 @@ Sub GPS_LocationChanged (Location1 As Location)
clienteConPromo = x.GetString("clienteConPromo") clienteConPromo = x.GetString("clienteConPromo")
' Log($"${x.GetString("clienteConPromo")}"$) ' Log($"${x.GetString("clienteConPromo")}"$)
End If End If
x.Close
' If pgs_boton_noventa = "1" Then b_noVenta.Visible = True ' If pgs_boton_noventa = "1" Then b_noVenta.Visible = True
' If gps_boton_doe ="1" Then b_whats.Visible = True ' If gps_boton_doe ="1" Then b_whats.Visible = True
@@ -910,12 +956,12 @@ Sub GPS_LocationChanged (Location1 As Location)
If Not(clienteDeudor) Then B_VENTA.Visible = True 'Si el cliente no tiene adeudo, habilitamos el boton de venta If Not(clienteDeudor) Then B_VENTA.Visible = True 'Si el cliente no tiene adeudo, habilitamos el boton de venta
If Not(clienteId.StartsWith("N")) And la_cuenta.Text <> "0" Then If Not(clienteId.StartsWith("N")) And la_cuenta.Text <> "0" Then
b_noVenta.Visible = True 'Ni cliente nuevo, ni abordo. b_noVenta.Visible = True 'Ni cliente nuevo, ni abordo.
Log("NoVenta False") ' Log("NoVenta False")
End If End If
If Not(p_rechazoDOE.Visible) Then pedido_doe_muestra If Not(p_rechazoDOE.Visible) Then pedido_doe_muestra
Else Else
b_noVenta.Visible = False b_noVenta.Visible = False
Log("NoVenta False") ' Log("NoVenta False")
B_VENTA.Visible = False B_VENTA.Visible = False
b_whats.Visible = False b_whats.Visible = False
End If End If
@@ -994,7 +1040,7 @@ Sub Guardar_Click
Starter.skmt.ExecNonQuery("delete from NOVENTA where NV_CLIENTE In (select cuenta from cuentaa)") Starter.skmt.ExecNonQuery("delete from NOVENTA where NV_CLIENTE In (select cuenta from cuentaa)")
Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)")
If logger Then LogColor($"Insertamos coordenadas en pedido: ${Starter.lon_gps}, ${Starter.lat_gps}"$, Colors.Magenta) If logger Then LogColor($"Insertamos coordenadas en pedido: ${Starter.lon_gps}, ${Starter.lat_gps}"$, Colors.Magenta)
Starter.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT) VALUES (?,?,?,?,?,?,?)", Array As Object(clie_id, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), Starter.lon_gps, Starter.lat_gps)) Starter.skmt.ExecNonQuery2("insert into pedido_cliente(PC_RUTA, PC_ALMACEN, PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT) VALUES (?,?,?,?,?,?,?,?,?)", Array As Object(Subs.traeAlmacen, Subs.traeRuta, clie_id, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), Starter.lon_gps, Starter.lat_gps))
Log("Actualizamos gestion") Log("Actualizamos gestion")
Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)") Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)")
End If End If
@@ -1006,8 +1052,8 @@ Sub Guardar_Click
End If End If
s.Close s.Close
Starter.skmt.ExecNonQuery("delete from pedido3") Starter.skmt.ExecNonQuery("delete from pedido3")
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 ) 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 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 ") 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")
c=Starter.skmt.ExecQuery("select 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_FECHA,PE_USUARIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") c=Starter.skmt.ExecQuery("select 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_FECHA,PE_USUARIO,PE_ENVIADO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)")
If c.RowCount>0 Then If c.RowCount>0 Then
For i=0 To c.RowCount -1 For i=0 To c.RowCount -1
c.Position=i c.Position=i
@@ -1036,6 +1082,11 @@ Sub Guardar_Click
b_inicioFinVenta.Text = "TERMINAR VENTA" b_inicioFinVenta.Text = "TERMINAR VENTA"
Log("RESPALDO") Log("RESPALDO")
kh.RD_respaldoBatch kh.RD_respaldoBatch
' Subir_Pedido_Con_Integridad(clie_id)
mandaPendientes
If la_cuenta.Text <> "0" Then 'Si es ABORDO, no mostramos el boton b_inicioFinVenta y regresamos a Principal. If la_cuenta.Text <> "0" Then 'Si es ABORDO, no mostramos el boton b_inicioFinVenta y regresamos a Principal.
b_inicioFinVenta.Visible = True b_inicioFinVenta.Visible = True
Else Else
@@ -1048,6 +1099,12 @@ Sub Guardar_Click
End If End If
End Sub End Sub
Sub mandaPendientes
' B4XPages.MainPage.principal.enviaPedido(Null)
' B4XPages.MainPage.principal.enviaPedidoCliente(Null)
B4XPages.MainPage.principal.enviaPedidoBatch(Null)
End Sub
Sub NUEVO_Click Sub NUEVO_Click
' Subs.iniciaActividad("nuevocliente") ' Subs.iniciaActividad("nuevocliente")
End Sub End Sub
@@ -1096,16 +1153,16 @@ End Sub
Sub B_IMP_Click Sub B_IMP_Click
' Buscamos los clientes que tienen pedido y NO estan impresos. ' Buscamos los clientes que tienen pedido y NO estan impresos.
Private t As Cursor = Starter.skmt.ExecQuery("Select cat_cl_codigo from kmt_info where impresion = 0 and cat_cl_codigo not in (select ci_cuenta from cliente_impreso) and cat_cl_codigo in (select distinct pe_cliente from pedido)") ' Private t As Cursor = Starter.skmt.ExecQuery("Select cat_cl_codigo from kmt_info where impresion = 0 and cat_cl_codigo not in (select ci_cuenta from cliente_impreso) and cat_cl_codigo in (select distinct pe_cliente from pedido)")
If t.RowCount > 0 Then ' If t.RowCount > 0 Then
For i = 0 To t.RowCount - 1 ' For i = 0 To t.RowCount - 1
t.Position = i ' Y los BORRAMOS. ' t.Position = i ' Y los BORRAMOS.
Log(t.GetString("CAT_CL_CODIGO")) ' Log(t.GetString("CAT_CL_CODIGO"))
Starter.skmt.ExecNonQuery($"update CUENTAA set CUENTA = '${t.GetString("CAT_CL_CODIGO")}'"$) ' Starter.skmt.ExecNonQuery($"update CUENTAA set CUENTA = '${t.GetString("CAT_CL_CODIGO")}'"$)
Subs.borraPedidoClienteActual ' Subs.borraPedidoClienteActual
' Msgbox2Async($"El pedido del cliente ${t.GetString("CAT_CL_CODIGO")} no está impreso, se va a borrar"$, "PEDIDO NO IMPRESO", "Aceptar", "", "", Null, True) '' Msgbox2Async($"El pedido del cliente ${t.GetString("CAT_CL_CODIGO")} no está impreso, se va a borrar"$, "PEDIDO NO IMPRESO", "Aceptar", "", "", Null, True)
Next ' Next
End If ' End If
Sleep(1000) Sleep(1000)
@@ -1114,6 +1171,8 @@ Sub B_IMP_Click
Panel_INV_A.Visible = True Panel_INV_A.Visible = True
P_INF_GENERAL.Visible = False P_INF_GENERAL.Visible = False
If logger Then Log("Panel general="&P_INF_GENERAL.Visible) If logger Then Log("Panel general="&P_INF_GENERAL.Visible)
L_INVA.Left = 5dip
L_INVA.Width = Root.Width * 0.98
L_INVA.Clear L_INVA.Clear
Dim label1 As Label Dim label1 As Label
label1 = L_INVA.TwoLinesLayout.Label label1 = L_INVA.TwoLinesLayout.Label
@@ -1125,10 +1184,10 @@ Sub B_IMP_Click
label2.TextColor = Colors.Black label2.TextColor = Colors.Black
' Aqui es donde esta el pedo de julieta de los descuentos, quitar el precio2 pero meter un if para saber si es ruta especial o es normal o que show. ' Aqui es donde esta el pedo de julieta de los descuentos, quitar el precio2 pero meter un if para saber si es ruta especial o es normal o que show.
s=Starter.skmt.ExecQuery2 ("select CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_ALMACEN from cat_gunaprod2 where CAT_GP_CLASIF <> ? ORDER BY CAT_GP_NOMBRE ", Array As String("PROMOS")) s=Starter.skmt.ExecQuery2 ("select CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_ALMACEN from cat_gunaprod2 where CAT_GP_CLASIF <> ? ORDER BY CAT_GP_NOMBRE ", Array As String("PROMOS"))
If s.RowCount>0 Then If s.RowCount > 0 Then
For i=0 To S.RowCount -1 For i = 0 To S.RowCount - 1
s.Position=i s.Position=i
S1=Starter.skmt.ExecQuery2("select CAT_GP_ALMACEN from cat_gunaprod5 where CAT_GP_ID = ?", Array As String(s.GetString("CAT_GP_ID"))) S1=Starter.skmt.ExecQuery2("select CAT_GP_ALMACEN from cat_gunaprod2 where CAT_GP_ID = ?", Array As String(s.GetString("CAT_GP_ID")))
S1.Position=0 S1.Position=0
S3=Starter.skmt.ExecQuery2("select count(*) as CUANTOS from HIST_ABORDO where HIST_PROID = ?", Array As String(s.GetString("CAT_GP_ID"))) S3=Starter.skmt.ExecQuery2("select count(*) as CUANTOS from HIST_ABORDO where HIST_PROID = ?", Array As String(s.GetString("CAT_GP_ID")))
S3.Position=0 S3.Position=0
@@ -1153,6 +1212,7 @@ Sub B_IMP_Click
C3.Position=0 C3.Position=0
a_venta = C3.GetString("CANTIDAD") a_venta = C3.GetString("CANTIDAD")
a_VENTA_F = C3.GetString("TOTAL") a_VENTA_F = C3.GetString("TOTAL")
C3.Close
Else Else
a_venta = 0 a_venta = 0
a_VENTA_F = 0 a_VENTA_F = 0
@@ -1175,6 +1235,10 @@ Sub B_IMP_Click
Next Next
End If End If
s.Close s.Close
If S1.IsInitialized Then S1.Close
If S3.IsInitialized Then S3.Close
If S2.IsInitialized Then S2.Close
If C4.IsInitialized Then C4.Close
End Sub End Sub
Sub B_IMP2_Click Sub B_IMP2_Click
@@ -1299,6 +1363,7 @@ Sub Imprime_ticket
cr.Position = 0 cr.Position = 0
If cr.GetInt("CREDITO") = 1 Then formaPago = "Crédito" If cr.GetInt("CREDITO") = 1 Then formaPago = "Crédito"
End If End If
cr.Close
If la_cuenta.Text = "0" Then If la_cuenta.Text = "0" Then
LogColor(123, Colors.red) LogColor(123, Colors.red)
Try Try
@@ -3927,6 +3992,7 @@ Sub revisaPromoEspecial As Map
y.Position = 0 y.Position = 0
nombreProd = y.GetString("nombreProd") nombreProd = y.GetString("nombreProd")
End If End If
y.Close
Log("El cliente tiene asignada la promo especial.") Log("El cliente tiene asignada la promo especial.")
Private p As Cursor Private p As Cursor
p=Starter.skmt.ExecQuery("select count(*) as hayInventario from CAT_GUNAPROD where CAT_GP_ALMACEN > 0 and CAT_GP_ID = " & x.GetString("CPM_PROID")) p=Starter.skmt.ExecQuery("select count(*) as hayInventario from CAT_GUNAPROD where CAT_GP_ALMACEN > 0 and CAT_GP_ID = " & x.GetString("CPM_PROID"))
@@ -4402,3 +4468,155 @@ Sub revisaExistenciasDOE As Boolean 'ignore
' 1, "LECHE CHOCO MELVIN 236ML", "1008013799" ' 1, "LECHE CHOCO MELVIN 236ML", "1008013799"
Return suficiente Return suficiente
End Sub End Sub
Private Sub p_transparenciaNoti_Click
End Sub
Private Sub b_notificacion_Click
Private tag As String = Sender.As(Button).Tag
Log("-" & tag & "-")
Private tag1() As String = Regex.Split("\|", tag)
Log(tag1.Length & "-" & tag1(0) & "-" & tag1(1))
Private CODIGO As String = tag1(0)
Private ID As String = tag1(1)
p_transparenciaNoti.Visible = False
DateTime.DateFormat = "yyyy-MM-dd HH:mm:ss"
Starter.skmt.ExecNonQuery($"insert into HIST_NOTIFICACIONES (HN_CODIGO, HN_ID, HN_FECHA) values ('${CODIGO}', '${ID}', '${DateTime.Date(DateTime.Now)}')"$)
Log(123)
cmd.Initialize
cmd.Name = "updateHistNotificacionesMotivo"
cmd.Parameters = Array As Object("", DateTime.Date(DateTime.Now), Subs.traeRuta, usuario, Subs.traeAlmacen, clienteId)
reqManager.ExecuteCommand(cmd , "updateHistNotificacionesMotivo")
End Sub
' Subrutina principal para subir pedidos con validación de integridad ARCH
' Llama a esto desde tu botón Subir_Click
' Devuelve un ResumableSub que puedes esperar con Wait For
Sub Subir_Pedido_Con_Integridad(cliente As String) As ResumableSub
Log("--- Iniciando Envío Seguro para Cliente: " & cliente & " ---")
' 1. Generar ARCH (Identificador Único del Paquete)
Dim Arch As String = Subs.traeAlmacen & "_" & Subs.traeRuta & "_" & cliente & "_" & DateTime.Now
' 2. Marcar registros pendientes con este ARCH localmente
' CORRECCIÓN CRÍTICA: El orden es (Valor_a_Asignar, Filtro) -> (Arch, cliente)
Starter.skmt.ExecNonQuery2($"UPDATE PEDIDO SET PE_ARCH = ? WHERE PE_CLIENTE = ? AND PE_ENVIADO = 0"$, Array As Object(Arch, cliente))
Starter.skmt.ExecNonQuery2($"UPDATE PEDIDO_CLIENTE SET PC_ARCH = ? WHERE PC_CLIENTE = ? AND PC_ENVIADO = 0"$, Array As Object(Arch, cliente))
' 3. Contar qué vamos a enviar
Dim cCheck As Cursor = Starter.skmt.ExecQuery($"SELECT COUNT(*) as total FROM PEDIDO WHERE PE_ARCH = '${Arch}'"$)
cCheck.Position = 0
Dim TotalProductosLocal As Int = cCheck.GetInt("total")
cCheck.Close
If TotalProductosLocal = 0 Then
Log("Nada pendiente para enviar con este ARCH.")
Return "Vacio"
End If
Log($"Total a enviar: ${TotalProductosLocal} productos. ID Paquete: ${Arch}"$)
Dim envioCorrecto As Boolean = True
' 4. Enviar Encabezados (PEDIDO_CLIENTE)
Log("Enviando encabezado con ARCH: " & Arch)
Private cx As Cursor = Starter.skmt.ExecQuery($"SELECT PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT, PC_COSTO_SIN, PC_RUTA, PC_ALMACEN, PC_ENVIADO, PC_ARCH FROM PEDIDO_CLIENTE WHERE PC_ARCH = '${Arch}'"$)
If cx.RowCount > 0 Then
For i = 0 To cx.RowCount - 1
cx.Position = i
Dim cmd As DBCommand
cmd.Initialize
cmd.Name = "insert_pedidos_KELL_arch"
cmd.Parameters = Array As Object(cx.GetString("PC_CLIENTE"), cx.GetString("PC_FECHA"), cx.GetString("PC_USER"), cx.GetString("PC_NOART"), cx.GetString("PC_MONTO"), cx.GetString("PC_LON"), cx.GetString("PC_LAT"), cx.GetString("PC_ALMACEN"), cx.GetString("PC_RUTA"), cx.GetString("PC_COSTO_SIN"), cx.GetString("PC_ARCH"))
Log($"insert_pedidos_KELL_arch: ${cx.GetString("PC_CLIENTE")}, ${cx.GetString("PC_FECHA")}, ${cx.GetString("PC_USER")}, ${cx.GetString("PC_NOART")}, ${cx.GetString("PC_MONTO")}, ${cx.GetString("PC_LON")}, ${cx.GetString("PC_LAT")}, ${cx.GetString("PC_ALMACEN")}, ${cx.GetString("PC_RUTA")}, ${cx.GetString("PC_COSTO_SIN")}, ${cx.GetString("PC_ARCH")}"$)
reqManagerW.ExecuteCommand(Starter.DBReqServer, cmd, Me, "header_envio")
Wait For header_envio_Completed (ResultHeader As TResultado)
If ResultHeader.Success = False Then
Log("Error crítico enviando encabezado: " & ResultHeader.ErrorMessage)
envioCorrecto = False
Exit
End If
Next
cx.Close
End If
If envioCorrecto = False Then
Msgbox("Error al enviar encabezado del pedido. Intente nuevamente.", "Error de Conexión")
Return "Error PC"
End If
' 5. Enviar Detalles (PEDIDO)
Log("Enviando detalle con ARCH: " & Arch)
Private cPed As Cursor = Starter.skmt.ExecQuery($"SELECT PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_FECHA, PE_USUARIO, PE_COSTO_SIN, PE_RUTA, PE_DESC, PE_FOLIO, PE_TIPO, PE_ARCH FROM PEDIDO WHERE PE_ARCH = '${Arch}'"$)
If cPed.RowCount > 0 Then
For i = 0 To cPed.RowCount - 1
cPed.Position = i
Dim cmd As DBCommand
cmd.Initialize
cmd.Name = "insert_pedido_KELL_arch"
cmd.Parameters = Array As Object(cPed.GetString("PE_CEDIS"), Subs.traeAlmacen, cPed.GetString("PE_COSTO_TOT"), cPed.GetString("PE_COSTOU"), cPed.GetString("PE_CANT"), cPed.GetString("PE_PRONOMBRE"), cPed.GetString("PE_PROID"), cPed.GetString("PE_CLIENTE"), cPed.GetString("PE_FECHA"), cPed.GetString("PE_USUARIO"), cPed.GetString("PE_RUTA"), cPed.GetString("PE_COSTO_SIN"), cPed.GetString("PE_DESC"), cPed.GetString("PE_FOLIO"), cPed.GetString("PE_TIPO"), cPed.GetString("PE_ARCH"))
reqManagerW.ExecuteCommand(Starter.DBReqServer, cmd, Me, "detalle_envio")
Wait For detalle_envio_Completed (ResultDet As TResultado)
If ResultDet.Success = False Then
Log("Error enviando producto " & cPed.GetString("PE_PRONOMBRE"))
envioCorrecto = False
Exit
End If
Next
cPed.Close
End If
If envioCorrecto = False Then
Return "Error PE"
End If
' 6. VALIDACIÓN FINAL
Log("Validando integridad con Oracle...")
Dim cmdVal As DBCommand
cmdVal.Initialize
cmdVal.Name = "validar_integridad_arch"
cmdVal.Parameters = Array As Object(Arch, TotalProductosLocal)
reqManagerW.ExecuteQuery(Starter.DBReqServer, cmdVal, Me, "validacion_integridad")
Wait For validacion_integridad_Completed (ResultVal As TResultado)
If ResultVal.Success Then
Dim estado As String = ""
For Each row() As Object In ResultVal.resultado.Rows
estado = row(ResultVal.resultado.Columns.Get("ESTADO"))
Next
If estado = "COMPLETO" Then
Log("¡Validación Exitosa! Marcando pedido como enviado.")
' Marcamos como enviado localmente usando el ARCH
Starter.skmt.ExecNonQuery2("UPDATE PEDIDO SET PE_ENVIADO = 1 WHERE PE_ARCH = ?", Array As Object(Arch))
Starter.skmt.ExecNonQuery2("UPDATE PEDIDO_CLIENTE SET PC_ENVIADO = 1 WHERE PC_ARCH = ?", Array As Object(Arch))
ToastMessageShow("Pedido enviado y verificado correctamente", False)
Return "Validado OK"
Else
Log("ERROR DE INTEGRIDAD: El servidor reporta " & estado)
Msgbox("El servidor recibió datos incompletos. El pedido NO se marcó como enviado. Por favor intente subir de nuevo.", "Error de Integridad")
Return "Error Validacion"
End If
Else
Log("Error al ejecutar query de validación: " & ResultVal.ErrorMessage)
Msgbox("No se pudo verificar el pedido por error de red. Intente de nuevo.", "Error de Red")
Return "Error Validacion (Red)"
End If
End Sub

View File

@@ -101,6 +101,7 @@ Private Sub B4XPage_CloseRequest As ResumableSub
End Sub End Sub
Sub ListView1_ItemClick (Position As Int, Value As Object) Sub ListView1_ItemClick (Position As Int, Value As Object)
Log(Value)
' If Logger Then Log(Regex.Split("\.",Me)(Regex.Split("\.",Me).Length-1)) ' If Logger Then Log(Regex.Split("\.",Me)(Regex.Split("\.",Me).Length-1))
Private Subrutina As Map =CreateMap("nombre":"ListView1_ItemClick", "param1":Position, "param2":Value) Private Subrutina As Map =CreateMap("nombre":"ListView1_ItemClick", "param1":Position, "param2":Value)
Starter.sesion = CreateMap("actividad":Me, "sub":Subrutina) Starter.sesion = CreateMap("actividad":Me, "sub":Subrutina)

View File

@@ -445,11 +445,11 @@ End Sub
Private Sub clv_pedidos_ItemLongClick (position As Int, Value As Object) Private Sub clv_pedidos_ItemLongClick (position As Int, Value As Object)
Private thisLog As Boolean = False Private thisLog As Boolean = False
c = Starter.skmt.ExecQuery("select count(*) as hayImpresos from CLIENTE_IMPRESO where CI_CUENTA in (Select CUENTA from cuentaa)") ' c = Starter.skmt.ExecQuery("select count(*) as hayImpresos from CLIENTE_IMPRESO where CI_CUENTA in (Select CUENTA from cuentaa)")
c.Position = 0 ' c.Position = 0
If thisLog Then Log("lista prods="&list_prodsPedido.Get(position)) If thisLog Then Log("lista prods="&list_prodsPedido.Get(position))
Private m As Map = list_prodsPedido.Get(position) Private m As Map = list_prodsPedido.Get(position)
If c.GetString("hayImpresos") = 0 Then 'Si la venta no está impresa o es abordo entonces continuamos ... 'Para que el abordo borre siempre " Or Subs.clienteActual = "0"" If kh.revisaImpresa = False Then 'Si la venta no está impresa o es abordo entonces continuamos ... 'Para que el abordo borre siempre " Or Subs.clienteActual = "0""
c=Starter.skmt.ExecQuery2("select count(*) as CUANTOS FROM PEDIDO WHERE PE_CEDIS = ? AND PE_CLIENTE IN (Select CUENTA from cuentaa)", Array As String("DUR")) c=Starter.skmt.ExecQuery2("select count(*) as CUANTOS FROM PEDIDO WHERE PE_CEDIS = ? AND PE_CLIENTE IN (Select CUENTA from cuentaa)", Array As String("DUR"))
c.Position = 0 c.Position = 0
CAMBIOS = c.GetString("CUANTOS") CAMBIOS = c.GetString("CUANTOS")

File diff suppressed because it is too large Load Diff

View File

@@ -13,10 +13,7 @@ Sub Class_Globals
Dim q_buscar As String Dim q_buscar As String
Dim forzarBusqueda As Boolean = False Dim forzarBusqueda As Boolean = False
Dim skmt As SQL Dim skmt As SQL
Dim c As Cursor Dim ab, c, c2, c3, c_prods, pPromo, p1, prod, pPromos, s, s1 As Cursor
Dim c2 As Cursor
Dim C3 As Cursor
Dim s As Cursor
Dim lv_catalogos As ListView Dim lv_catalogos As ListView
Dim lv_promos As ListView Dim lv_promos As ListView
Dim entro As String Dim entro As String
@@ -29,7 +26,6 @@ Sub Class_Globals
Dim ya_entro As String Dim ya_entro As String
Dim TIENE_PROMOS As String Dim TIENE_PROMOS As String
Dim RES As String Dim RES As String
Dim S1 As Cursor
Dim bmp As Bitmap Dim bmp As Bitmap
Dim ciclo As String Dim ciclo As String
Private b_qr As Button Private b_qr As Button
@@ -113,6 +109,9 @@ End Sub
Public Sub Initialize As Object Public Sub Initialize As Object
kh.Initialize(Me, "kh", Starter.skmt) kh.Initialize(Me, "kh", Starter.skmt)
ts.Initialize(Me, "ts", Starter.skmt) ts.Initialize(Me, "ts", Starter.skmt)
Log(TS_RMI)
Log(TS_DESCUENTOS)
Log(TS_BONIFICACIONES)
' promosC.Initialize(Me, "promosC", Starter.skmt) ' promosC.Initialize(Me, "promosC", Starter.skmt)
Return Me Return Me
End Sub End Sub
@@ -240,10 +239,24 @@ Sub B4XPage_Appear
' Log(Starter.tipov) ' Log(Starter.tipov)
c = Starter.skmt.ExecQuery("select count(*) as hayPromos from promos_comp") c = Starter.skmt.ExecQuery("select count(*) as hayPromos from promos_comp")
c.Position = 0 c.Position = 0
Private mx As Map = ts.traeInfoTrendSpending
TS_RMI = Regex.Split(",", mx.Get("RMI"))
TS_DESCUENTOS = Regex.Split(",", mx.Get("DESCUENTOS"))
TS_BONIFICACIONES = Regex.Split(",", mx.Get("BONIFICACIONES"))
Dim bonificacionesDisp As String = TS_BONIFICACIONES(0)
Log(">>>>>>>>>>>>> TRADESPENDING: " & mx)
Log("RMI: " & TS_RMI(0) & "|" & TS_RMI(1))
Log("DESCUENTOS: " & TS_DESCUENTOS(0) & "|" & TS_DESCUENTOS(1))
Log("BONIFICACIONES: " & TS_BONIFICACIONES(0) & "|" & TS_BONIFICACIONES(1))
Log("revisaImpresa: " & Subs.revisaImpresa) Log("revisaImpresa: " & Subs.revisaImpresa)
If c.GetInt("hayPromos") > 0 And Subs.traeCliente <> 0 And Subs.revisaImpresa = False Then Log("bonificacionesDisp: " & bonificacionesDisp)
If bonificacionesDisp = 0 Then ToastMessageShow("¡No hay presupuesto para promociones!", False)
If bonificacionesDisp > 0 And c.GetInt("hayPromos") > 0 And Subs.traeCliente <> 0 And Subs.revisaImpresa = False Then
lv_catalogos.AddSingleLine("PROMOS") lv_catalogos.AddSingleLine("PROMOS")
End If End If
c.Close
Sleep(100) Sleep(100)
' l_total.Visible = False ' l_total.Visible = False
' l_totProds.Visible = False ' l_totProds.Visible = False
@@ -286,14 +299,6 @@ Sub B4XPage_Appear
End If End If
If B4XPages.MainPage.cliente.la_cuenta.text = "0" Then b_rmi.Visible = False If B4XPages.MainPage.cliente.la_cuenta.text = "0" Then b_rmi.Visible = False
' Log(Starter.tipov) ' Log(Starter.tipov)
Private mx As Map = ts.traeInfoTrendSpending
TS_RMI = Regex.Split(",", mx.Get("RMI"))
TS_DESCUENTOS = Regex.Split(",", mx.Get("DESCUENTOS"))
TS_BONIFICACIONES = Regex.Split(",", mx.Get("BONIFICACIONES"))
Log(">>>>>>>>>>>>> TRADESPENDING: " & mx)
Log("RMI: " & TS_RMI(0) & "|" & TS_RMI(1))
Log("DESCUENTOS: " & TS_DESCUENTOS(0) & "|" & TS_DESCUENTOS(1))
Log("BONIFICACIONES: " & TS_BONIFICACIONES(0) & "|" & TS_BONIFICACIONES(1))
End Sub End Sub
Sub PCLV_AddProds Sub PCLV_AddProds
@@ -342,7 +347,7 @@ Sub lv_catalogos_ItemClick (Position As Int, Value As Object)
c2 = Starter.skmt.ExecQuery($"select CAT_PA_TIPO_PROMONTO, CAT_PA_PORCENTAJE_PAQUETE, CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_TIPOPROD2, CAT_GP_PRECIO, CAT_GP_ALMACEN, CAT_GP_IMG from ${Subs.traeTablaProds(Starter.tipov)} left join PROMOS_COMP on CAT_GP_ID = CAT_PA_ID where CAT_GP_ALMACEN > 0 AND CAT_GP_TIPO = '${Value}' AND CAT_GP_SUBTIPO = '${Value}' 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"$) c2 = Starter.skmt.ExecQuery($"select CAT_PA_TIPO_PROMONTO, CAT_PA_PORCENTAJE_PAQUETE, CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_TIPOPROD2, CAT_GP_PRECIO, CAT_GP_ALMACEN, CAT_GP_IMG from ${Subs.traeTablaProds(Starter.tipov)} left join PROMOS_COMP on CAT_GP_ID = CAT_PA_ID where CAT_GP_ALMACEN > 0 AND CAT_GP_TIPO = '${Value}' AND CAT_GP_SUBTIPO = '${Value}' 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"$)
Log($"select CAT_PA_TIPO_PROMONTO, CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_TIPOPROD2, CAT_GP_PRECIO, CAT_GP_ALMACEN, CAT_GP_IMG from ${Subs.traeTablaProds(Starter.tipov)} left join PROMOS_COMP on CAT_GP_ID = CAT_PA_ID where CAT_GP_ALMACEN > 0 AND CAT_GP_TIPO = '${Value}' AND CAT_GP_SUBTIPO = '${Value}' 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"$) ' Log($"select CAT_PA_TIPO_PROMONTO, CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_TIPOPROD2, CAT_GP_PRECIO, CAT_GP_ALMACEN, 1 as CAT_GP_IMG from ${Subs.traeTablaProds(Starter.tipov)} left join PROMOS_COMP on CAT_GP_ID = CAT_PA_ID where CAT_GP_ALMACEN > 0 AND CAT_GP_TIPO = '${Value}' AND CAT_GP_SUBTIPO = '${Value}' 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"$)
' Log($"Resultados : ${c2.RowCount}, ${Value}, ${marca}, ${tipo}"$) ' Log($"Resultados : ${c2.RowCount}, ${Value}, ${marca}, ${tipo}"$)
If c2.RowCount > 0 Then If c2.RowCount > 0 Then
@@ -352,9 +357,9 @@ Sub lv_catalogos_ItemClick (Position As Int, Value As Object)
' promosC.procesaPromocion(c2.GetString("CAT_GP_ID"), clienteId) ' promosC.procesaPromocion(c2.GetString("CAT_GP_ID"), clienteId)
If tm.Get("status") = "ok" Then 'Solo muestrala si hay producto. If tm.Get("status") = "ok" Then 'Solo muestrala si hay producto.
Log(c2.GetString("CAT_GP_ID")) ' Log(c2.GetString("CAT_GP_ID"))
Log(c2.GetString("CAT_PA_TIPO_PROMONTO")) ' Log(c2.GetString("CAT_PA_TIPO_PROMONTO"))
Log(c2.GetString("CAT_PA_PORCENTAJE_PAQUETE")) ' Log(c2.GetString("CAT_PA_PORCENTAJE_PAQUETE"))
If c2.GetString("CAT_PA_TIPO_PROMONTO") = "0" Then ' Si NO es promo por monto entonces la mostamos. If c2.GetString("CAT_PA_TIPO_PROMONTO") = "0" Then ' Si NO es promo por monto entonces la mostamos.
lv_promos.AddTwoLines(c2.GetString("CAT_GP_NOMBRE"),"# " & c2.GetString("CAT_GP_ALMACEN") & " $ " & c2.GetString("CAT_GP_PRECIO") & " F:" & tm.Get("mp").As(Map).Get("prodsFijosCant") & " V:" & tm.Get("mp").As(Map).Get("prodsVariablesCant")) lv_promos.AddTwoLines(c2.GetString("CAT_GP_NOMBRE"),"# " & c2.GetString("CAT_GP_ALMACEN") & " $ " & c2.GetString("CAT_GP_PRECIO") & " F:" & tm.Get("mp").As(Map).Get("prodsFijosCant") & " V:" & tm.Get("mp").As(Map).Get("prodsVariablesCant"))
End If End If
@@ -492,6 +497,11 @@ Sub llenaCatalogo(subtipo1 As String)
End Sub End Sub
Private Sub B4XPage_CloseRequest As ResumableSub Private Sub B4XPage_CloseRequest As ResumableSub
If c.IsInitialized Then c.Close
If c2.IsInitialized Then c2.Close
If c3.IsInitialized Then c3.Close
If s.IsInitialized Then s.Close
If s1.IsInitialized Then s1.Close
' BACK key pressed ' BACK key pressed
' Return True To close, False To cancel ' Return True To close, False To cancel
If p_rmi.Visible Then p_rmi.Visible = False If p_rmi.Visible Then p_rmi.Visible = False
@@ -658,6 +668,7 @@ Sub b_prodMenos_Click
invActualizado = i.GetString("CAT_GP_ALMACEN") invActualizado = i.GetString("CAT_GP_ALMACEN")
End If End If
If Starter.tipov <> "ABORDO" Then lProdX.Text = cs.Color(Colors.red).append(nombreX).pop.append(CRLF).Append("Existencias: " & invActualizado).Color(0xFF017F01).Append($" $${NumberFormat2(precio, 1, 2, 2, False)}"$).Popall If Starter.tipov <> "ABORDO" Then lProdX.Text = cs.Color(Colors.red).append(nombreX).pop.append(CRLF).Append("Existencias: " & invActualizado).Color(0xFF017F01).Append($" $${NumberFormat2(precio, 1, 2, 2, False)}"$).Popall
i.Close
End If End If
If kh.totalPedido < 1 Then laCant.Text = "0" If kh.totalPedido < 1 Then laCant.Text = "0"
' Log($"Total Prods: ${totalProds}, Total Compra: $$1.2{totalCompra}"$) ' Log($"Total Prods: ${totalProds}, Total Compra: $$1.2{totalCompra}"$)
@@ -714,11 +725,12 @@ Sub b_prodMas_Click
' Subs.modTrendSpending("resta", "bonificaciones", laBonificacion) ' Subs.modTrendSpending("resta", "bonificaciones", laBonificacion)
' Log(Subs.traeAcumuladoHoyTS("bonificaciones")) ' Log(Subs.traeAcumuladoHoyTS("bonificaciones"))
' End If ' End If
' Log("BONIFCACIONES RESTANTES: " & (TS_BONIFICACIONES(0) - TS_BONIFICACIONES(1) - Subs.traeAcumuladoHoyTS("bonificaciones"))) Log("BONIFCACIONES RESTANTES: " & (TS_BONIFICACIONES(0) - TS_BONIFICACIONES(1) - ts.traeAcumuladoHoyTS("bonificaciones")))
Private tsMonto As String = 0 Private tsMonto As String = 0
Private tsMaximas As Int = 0 Private tsMaximas As Int = 0
If lfila.Text = "PRODUCTOS" Then If lfila.Text = "PRODUCTOS" Then
Log(">>>>>>>>>> PRODUCTOS <<<<<<<<<<<<<<") Log(">>>>>>>>>> PRODUCTOS <<<<<<<<<<<<<<")
Log($"${TS_DESCUENTOS(0)} - ${TS_DESCUENTOS(1)} - ${ts.traeAcumuladoHoyTS("descuentos")}"$)
Private tsRestantes As String = (TS_DESCUENTOS(0) - TS_DESCUENTOS(1) - ts.traeAcumuladoHoyTS("descuentos")) ' Traemos monto restante de Trend Spending para bonificaciones. Private tsRestantes As String = (TS_DESCUENTOS(0) - TS_DESCUENTOS(1) - ts.traeAcumuladoHoyTS("descuentos")) ' Traemos monto restante de Trend Spending para bonificaciones.
tsMonto = NumberFormat2(ts.traePrecio(id)*(ts.traeDescXSku(clienteId, id)/100), 1, 2, 2, False) ' Traemos el monto (descuento total) del producto actual. tsMonto = NumberFormat2(ts.traePrecio(id)*(ts.traeDescXSku(clienteId, id)/100), 1, 2, 2, False) ' Traemos el monto (descuento total) del producto actual.
tsMaximas = ((laCant.text * tsMonto) + tsRestantes) / tsMonto ' Traemos la cantidad maxima de descuentos por presupuesto de Trend Spending. tsMaximas = ((laCant.text * tsMonto) + tsRestantes) / tsMonto ' Traemos la cantidad maxima de descuentos por presupuesto de Trend Spending.
@@ -841,6 +853,7 @@ Sub b_prodMas_Click
invActualizado = i.GetString("CAT_GP_ALMACEN") invActualizado = i.GetString("CAT_GP_ALMACEN")
End If End If
If Starter.tipov <> "ABORDO" Then lProdX.Text = cs.Color(Colors.red).append(nombreX).pop.append(CRLF).Append("Existencias: " & invActualizado).Color(0xFF017F01).Append($" $${NumberFormat2(precio, 1, 2, 2, False)}"$).Popall If Starter.tipov <> "ABORDO" Then lProdX.Text = cs.Color(Colors.red).append(nombreX).pop.append(CRLF).Append("Existencias: " & invActualizado).Color(0xFF017F01).Append($" $${NumberFormat2(precio, 1, 2, 2, False)}"$).Popall
i.Close
End If End If
Log($"Total Prods: ${totalProds}, Total Compra: $$1.2{totalCompra}"$) Log($"Total Prods: ${totalProds}, Total Compra: $$1.2{totalCompra}"$)
Sleep(300) Sleep(300)
@@ -1113,6 +1126,7 @@ Sub b_terminar1_Click
If Subs.revisaImpresa Then b_rechazar.Visible = False Else b_rechazar.Visible = True If Subs.revisaImpresa Then b_rechazar.Visible = False Else b_rechazar.Visible = True
p_vistaPrevia.Visible=True p_vistaPrevia.Visible=True
p_vistaPreviaTrans.Visible=True p_vistaPreviaTrans.Visible=True
Subs.RecalcularInventario
End Sub End Sub
Private Sub b_continuar_Click Private Sub b_continuar_Click
@@ -1141,6 +1155,7 @@ Private Sub b_continuar_Click
montoPedidoActual = m.Get("monto") montoPedidoActual = m.Get("monto")
' LlenaProdsLL(Null) ' LlenaProdsLL(Null)
' BUSCA.Text = " " ' BUSCA.Text = " "
Subs.RecalcularInventario
End Sub End Sub
Private Sub l_info_Click Private Sub l_info_Click
@@ -1150,13 +1165,14 @@ End Sub
Private Sub lv_promos_ItemLongClick (Position As Int, Value As Object) Private Sub lv_promos_ItemLongClick (Position As Int, Value As Object)
Log("Promo longclic = "&Value) Log("Promo longclic = "&Value)
Private id As String = "" Private id As String = ""
Dim c As Cursor = Starter.skmt.ExecQuery($"select CAT_GP_ID from ${Subs.traeTablaProds(starter.tipov)} where CAT_GP_TIPO = 'PROMOS' and CAT_GP_NOMBRE = '${Value}'"$) Dim c As Cursor = Starter.skmt.ExecQuery($"select CAT_GP_ID from ${Subs.traeTablaProds(Starter.tipov)} where CAT_GP_TIPO = 'PROMOS' and CAT_GP_NOMBRE = '${Value}'"$)
If c.RowCount > 0 Then If c.RowCount > 0 Then
c.Position = 0 c.Position = 0
id = c.GetString("CAT_GP_ID") id = c.GetString("CAT_GP_ID")
End If End If
l_info.Text = $"ID: ${id}${CRLF}${Value}"$ l_info.Text = $"ID: ${id}${CRLF}${Value}"$
l_info.Visible = True l_info.Visible = True
c.Close
End Sub End Sub
Private Sub b_buscar_Click Private Sub b_buscar_Click
@@ -1237,6 +1253,7 @@ Private Sub b_aceptar_Click
' LogColor(p.GetString("total"), Colors.red) ' LogColor(p.GetString("total"), Colors.red)
If p.GetString("total") < 1 Then LlenaProdsLL(Null, Null) If p.GetString("total") < 1 Then LlenaProdsLL(Null, Null)
p_vistaPreviaTrans.Visible=False p_vistaPreviaTrans.Visible=False
p.Close
Subs.iniciaActividad("Cliente") Subs.iniciaActividad("Cliente")
' B4XPages.ShowPage("Cliente") ' B4XPages.ShowPage("Cliente")
End Sub End Sub
@@ -1334,6 +1351,7 @@ Sub l_prodX_Click
Log(Sender.as(Label).tag) Log(Sender.as(Label).tag)
l_info.BringToFront l_info.BringToFront
l_info.Visible = True l_info.Visible = True
i.Close
' Dim index As Int = clv_prods_ll.GetItemFromView(Sender) ' Dim index As Int = clv_prods_ll.GetItemFromView(Sender)
' Private p0 As B4XView = clv_prods_ll.GetPanel(index) ' Private p0 As B4XView = clv_prods_ll.GetPanel(index)
' Private p As B4XView = p0.GetView(0) ' Private p As B4XView = p0.GetView(0)
@@ -1406,6 +1424,7 @@ Private Sub clv_prods_ll_VisibleRangeChanged (FirstIndex As Int, LastIndex As In
prioridad = p1.GetInt("CAT_GP_TIPOPROD2") prioridad = p1.GetInt("CAT_GP_TIPOPROD2")
' Log(prioridad) ' Log(prioridad)
End If End If
p1.Close
' Log("NIVEL: " & lfila.Text) ' Log("NIVEL: " & lfila.Text)
If lfila.Text = "RMI" Then ' Si es RMI, la cantidad solo se puede cambiar con los botones. If lfila.Text = "RMI" Then ' Si es RMI, la cantidad solo se puede cambiar con los botones.
et_pCant.Enabled = False et_pCant.Enabled = False
@@ -1434,6 +1453,14 @@ Private Sub clv_prods_ll_VisibleRangeChanged (FirstIndex As Int, LastIndex As In
Else Else
l_prodX.Text = cs.Color(Colors.red).append(clv_prods_ll.GetValue(i).As(Map).Get("prod")).pop.append(CRLF).Append("Almacen: " & clv_prods_ll.GetValue(i).As(Map).Get("almacen")).color(Colors.RGB(48,99,192)).Append(" Abordo: " & clv_prods_ll.GetValue(i).As(Map).Get("abordo")).Color(0xFF017F01).Append($" $${NumberFormat2(precio,1,2,2,False)}"$).Popall l_prodX.Text = cs.Color(Colors.red).append(clv_prods_ll.GetValue(i).As(Map).Get("prod")).pop.append(CRLF).Append("Almacen: " & clv_prods_ll.GetValue(i).As(Map).Get("almacen")).color(Colors.RGB(48,99,192)).Append(" Abordo: " & clv_prods_ll.GetValue(i).As(Map).Get("abordo")).Color(0xFF017F01).Append($" $${NumberFormat2(precio,1,2,2,False)}"$).Popall
End If End If
'#######################################################
If clv_prods_ll.GetValue(i).As(Map).Get("almacen").As(Int) = Subs.traeExistenciasPorId(clv_prods_ll.GetValue(i).As(Map).Get("id")) Then
' Log("|"&clv_prods_ll.GetValue(i).As(Map).Get("almacen") & "|" & Subs.traeExistenciasPorId(clv_prods_ll.GetValue(i).As(Map).Get("id"))&"|")
Else
' LogColor("|"&clv_prods_ll.GetValue(i).As(Map).Get("almacen") & "|" & Subs.traeExistenciasPorId(clv_prods_ll.GetValue(i).As(Map).Get("id"))&"|"&clv_prods_ll.GetValue(i).As(Map).Get("prod")&"|", Colors.red)
' LogColor("#### ERROR DE INVENTARIO ####" , Colors.red)
End If
'#######################################################
l_prodX.Tag = clv_prods_ll.GetValue(i).As(Map).Get("id") l_prodX.Tag = clv_prods_ll.GetValue(i).As(Map).Get("id")
l_pCant.Tag = clv_prods_ll.GetValue(i).As(Map).Get("id") l_pCant.Tag = clv_prods_ll.GetValue(i).As(Map).Get("id")
@@ -1546,6 +1573,7 @@ Sub LlenaProdsLL(p As ResultSet, extra As String)
invAbordo = ab.GetString("CAT_GP_ALMACEN") invAbordo = ab.GetString("CAT_GP_ALMACEN")
' Log(invAbordo) ' Log(invAbordo)
End If End If
ab.Close
End If End If
Private precio As String = NumberFormat2(p.GetDouble("CAT_GP_PRECIO"),1,2,2,False) Private precio As String = NumberFormat2(p.GetDouble("CAT_GP_PRECIO"),1,2,2,False)
'Descuentos de condiciones comerciales por TIPO 'Descuentos de condiciones comerciales por TIPO

View File

@@ -4,6 +4,74 @@ ModulesStructureVersion=1
Type=Class Type=Class
Version=11.5 Version=11.5
@EndOfDesignText@ @EndOfDesignText@
Sub Descripcion
' *** FLUJO DE LAS PROMOCIONES ***
' Aquí está el desglose del flujo actual de decisión para mostrar una promoción, calculando los máximos y aplicando las restricciones de Segmentación, Inventario y Trade Spending (Bonificaciones).
'
' ### Flujo Maestro: ¿Se muestra la promo y cuántas alcanzan?
'
' El proceso se ejecuta secuencialmente. Si en algún punto el resultado es 0, la promoción no se muestra o se marca como agotada.
'
' #### 1. Cálculo de Límites Administrativos (La Base)
'
' Lo primero que hace el sistema es determinar el "Techo Teórico" de cuántas promociones se pueden vender Sin mirar inventario ni dinero aún.
' * **Paso A: Datos Generales:** Se obtienen los límites configurados en `PROMOS_COMP`: Máximo por Cliente, Máximo Recurrente y Máximo Global.
' * **Paso B: Lógica de Promociones Segmentadas:** Aquí entra el filtro crítico.
' * El sistema consulta `HIST_CLIENTE_CANT_PROMOS`.
' * **Si la promo es segmentada:**
' * Si el cliente **NO** está en la lista: Se establecen todos los máximos a 0. La promo se oculta.
' * Si el cliente **SÍ** está en la lista: Se ignoran los límites generales y se usan los específicos asignados al cliente.
' * **Fórmula:** `MaxDisponible = Asignado - Vendido`.
' * **Paso C: Cálculo del Mínimo:** Se comparan todos los límites (Global, Recurrente, Cliente/Segmentado) y se toma el **valor más pequeño** como el `MaxPromos` inicial.
'
' #### 2. Restricción por Inventario de Productos FIJOS
'
' Una vez que sabemos cuántas *podríamos* vender administrativamente, revisamos si tenemos los productos obligatorios (Fijos).
' * El sistema itera sobre cada producto fijo de la promoción.
' * **Cálculo:** `InventarioDisponible / PiezasRequeridasPorPromo`.
' * **Resultado:** El `MaxPromos` se actualiza al **mínimo** entre el valor del Paso 1 y lo que permite el inventario de cada producto fijo.
' * *Nota Crítica:* Si este valor es 0, la promo se marca como "KO" (No disponible).
'
' #### 3. El Cruce de Inventarios (La Resta)
'
' Este es el punto que mencionaste y es vital en el flujo actual. Antes de evaluar si alcanzan los productos variables, el código **simula la venta de los productos fijos**.
' * Se toma el mapa de inventario actual.
' * Se ejecuta `restaFijosDePromo`.
' * **Acción:** Para cada producto fijo, se resta: `(MaxPromosCalculado * PiezasRequeridas)`.
' * **Resultado:** Se genera un *Nuevo Mapa de Inventario Virtual* que contiene solo lo que sobró después de apartar lo necesario para la parte fija. Este mapa es el que se pasa a la siguiente etapa.
'
' #### 4. Cálculo de Variables y Restricción de Trade Spending (TS)
'
' Aquí es donde la lógica se vuelve compleja y utiliza los bucles iterativos para validar tanto existencia física como presupuesto financiero (Bonificaciones).
' Se ejecuta `revisaMaxPromosProdsVariablesPorInventario`, que usa el *Inventario Virtual* del paso anterior.
' **El Bucle de Validación (Paso a Paso):**
' El código prueba vender 1 promo, luego 2, hasta llegar al `MaxPromos` calculado en el paso 2.
' 1. **Iteración `x` (Número de promos a probar):**
' 2. **Consumo de Fijos en Variables:** Si un producto variable *también* es fijo, el código descuenta (otra vez) el inventario necesario para la parte fija dentro de este bucle para asegurar integridad.
' 3. **Suma de Inventario Variable:** Se suman las existencias de todos los productos que califican como variables para esta promo.
' 4. **Validación de Trade Spending (El Presupuesto):**
' * Dentro del bucle, para cada producto variable disponible, se llama a `ts.traeBonificacionesMaximas`.
' * **La Lógica de ts:** El sistema verifica si el producto actual califica como bonificación (precio especial/cero).
' * **Si califica:** Verifica si hay saldo en el presupuesto de "BONIFICACIONES". Si no hay saldo, este producto variable **no se cuenta** como disponible para armar la promo en esta iteración.
' * **Si NO califica:** (Es un producto de precio normal dentro de la promo), no consume presupuesto y se cuenta libremente según su inventario físico.
' 5. **Prueba de Fuego:**
' * Se compara: `InventarioVariableValidado (Físico + Financiero)` vs `(PiezasVariablesRequeridas * x)`.
' * Si alcanza, el ciclo continúa para probar `x + 1`.
' * Si no alcanza, el ciclo se rompe y se define el máximo posible.
'
' ### Resumen del Factor TS en el Flujo
'
' El presupuesto de ts no bloquea la promo "per se", sino que **filtra qué productos variables están disponibles**.
' * Si la promo pide 3 variables.
' * Tienes 5 opciones en inventario físico.
' * 2 opciones son "Bonificación" (consumen presupuesto) y 3 son venta normal.
' * **Escenario Sin Presupuesto:** Al iterar, `ts.traeBonificacionesMaximas` devolverá 0 para los 2 productos de bonificación. El sistema solo verá 3 productos disponibles (los normales).
' * **Resultado:** Como la promo pide 3 y el sistema "ve" 3 disponibles, la promo **SÍ SE MUESTRA**.
' * **Bloqueo:** Solo se bloquearía si la promo pidiera 4 variables, ya que Sin presupuesto ts solo "vemos" 3 productos disponibles, insuficientes para armar el paquete.
'
' ### Este flujo garantiza que la promo se muestre siempre que sea *físicamente* posible armarla, restringiendo la parte financiera solo a los ítems que realmente cuestan dinero al presupuesto de bonificaciones.
End Sub
Sub Class_Globals Sub Class_Globals
Private Root As B4XView 'ignore Private Root As B4XView 'ignore
Private xui As XUI Private xui As XUI
@@ -44,12 +112,18 @@ Sub Class_Globals
Dim montoPedidoActual As String Dim montoPedidoActual As String
Dim promosMap As Map Dim promosMap As Map
Dim ts As C_TrendSpending Dim ts As C_TrendSpending
Dim TS_RMI() As String
Dim TS_DESCUENTOS() As String
Dim TS_BONIFICACIONES() As String
End Sub End Sub
'You can add more parameters here. 'You can add more parameters here.
Public Sub Initialize As Object Public Sub Initialize As Object
' promosC.Initialize(Me, "promosC", Starter.skmt) ' promosC.Initialize(Me, "promosC", Starter.skmt)
ts.Initialize("ts", "ts", Starter.skmt) ts.Initialize("ts", "ts", Starter.skmt)
Log(TS_RMI)
Log(TS_DESCUENTOS)
Log(TS_BONIFICACIONES)
Return Me Return Me
End Sub End Sub
@@ -476,20 +550,38 @@ Private Sub b_terminar1_Click
cuentaProds cuentaProds
Private elMontoTSDeLaVenta As String = 0 Private elMontoTSDeLaVenta As String = 0
' Log("====================================================================") ' Log("====================================================================")
' Log($"${prodsIds}${CRLF}${prodsCants}${CRLF}${prodsPrecios}"$) Log($"${prodsIds}${CRLF}${prodsCants}${CRLF}${prodsPrecios}"$)
For t = 0 To prodsIds.Size - 1 'Guardamos los productos fijos de la promocion en pedido. For t = 0 To prodsIds.Size - 1 'Guardamos los productos fijos de la promocion en pedido.
Private pn As String = Subs.traeProdNombre(prodsIds.Get(t)) Private pn As String = Subs.traeProdNombre(prodsIds.Get(t))
Private idProdFijo As String = prodsIds.Get(t)
Private cantProdFijo As Int = prodsCants.Get(t)
Private prodsPrecio As String = prodsPrecios.Get(t)
Log($"#### idProdFijo: ${idProdFijo}, ${cantProdFijo}, ${prodsPrecio}"$)
' ' Asumimos que el índice 0 es el encabezado de la promoción (estaPromo) y no tiene bonificación de producto.
If t > 0 Then
Private bonificacion_monto As String = ts.traeMontoBonificacion(idProdFijo, prodsPrecio, estaPromo)
Log(bonificacion_monto)
Log("elMontoTSDeLaVenta=" & elMontoTSDeLaVenta)
Log($"${elMontoTSDeLaVenta} + (${bonificacion_monto} * ${cantProdFijo})"$)
elMontoTSDeLaVenta = elMontoTSDeLaVenta + (bonificacion_monto * cantProdFijo)
Log($"TS Fijo Acumulado: ${elMontoTSDeLaVenta}, Prod: ${idProdFijo}"$)
End If
If prodsCants.Get(t) > 0 Then Subs.guardaProductoSinGestion(estaPromo, prodsPrecios.Get(t), prodsCants.Get(t), pn, prodsIds.Get(t), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, Starter.tipov) If prodsCants.Get(t) > 0 Then Subs.guardaProductoSinGestion(estaPromo, prodsPrecios.Get(t), prodsCants.Get(t), pn, prodsIds.Get(t), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, Starter.tipov)
Next Next
For t = 0 To prodsIds2.Size - 1 'Guardamos los productos variables de la promocion en pedido. For t = 0 To prodsIds2.Size - 1 'Guardamos los productos variables de la promocion en pedido.
Private pn As String = Subs.traeProdNombre(prodsIds2.Get(t)) Private pn As String = Subs.traeProdNombre(prodsIds2.Get(t))
Subs.guardaProductoSinGestion(estaPromo, prodsPrecios2.Get(t), prodsCants2.Get(t), pn, prodsIds2.Get(t), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, Starter.tipov) Subs.guardaProductoSinGestion(estaPromo, prodsPrecios2.Get(t), prodsCants2.Get(t), pn, prodsIds2.Get(t), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, Starter.tipov)
' Traemos el monto de las bonificacionos a guardar. -- Trade Spending ' Traemos el monto de las bonificacionos a guardar. -- Trade Spending
Log("Monto Bonificacion -->> " & ts.traeMontoBonificacion(prodsIds2.Get(t), estaPromo)) Log("Monto Bonificacion -->> " & ts.traeMontoBonificacion(prodsIds2.Get(t), prodsPrecios2.Get(t), estaPromo))
elMontoTSDeLaVenta = elMontoTSDeLaVenta + (ts.traeMontoBonificacion(prodsIds2.Get(t), estaPromo) * prodsCants2.Get(t)) elMontoTSDeLaVenta = elMontoTSDeLaVenta + (ts.traeMontoBonificacion(prodsIds2.Get(t), prodsPrecios2.Get(t), estaPromo) * prodsCants2.Get(t))
Log("Acumulado: " & elMontoTSDeLaVenta) Log("Acumulado: " & elMontoTSDeLaVenta)
Next Next
ts.modTrendSpending("RESTA", "BONIFICACIONES", elMontoTSDeLaVenta) ts.modTrendSpending("RESTA", "BONIFICACIONES", elMontoTSDeLaVenta)
Log($"### modTrendSpending("RESTA", "BONIFICACIONES", ${elMontoTSDeLaVenta})"$)
lv_prodsFijos.Clear lv_prodsFijos.Clear
B4XPages.MainPage.bTerminarClicked = True B4XPages.MainPage.bTerminarClicked = True
B4XPages.ShowPage("productos") B4XPages.ShowPage("productos")
@@ -503,17 +595,35 @@ Private Sub b_continuar_Click
Log($"${prodsIds}${CRLF}${prodsCants}${CRLF}${prodsPrecios}"$) Log($"${prodsIds}${CRLF}${prodsCants}${CRLF}${prodsPrecios}"$)
For t = 0 To prodsIds.Size - 1 'Guardamos los productos fijos de la promocion en pedido. For t = 0 To prodsIds.Size - 1 'Guardamos los productos fijos de la promocion en pedido.
Private pn As String = Subs.traeProdNombre(prodsIds.Get(t)) Private pn As String = Subs.traeProdNombre(prodsIds.Get(t))
Subs.guardaProductoSinGestion(estaPromo, prodsPrecios.Get(t), prodsCants.Get(t), pn, prodsIds.Get(t), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, Starter.tipov)
Private idProdFijo As String = prodsIds.Get(t)
Private cantProdFijo As Int = prodsCants.Get(t)
Private prodsPrecio As String = prodsPrecios.Get(t)
Log($"#### idProdFijo: ${idProdFijo}, ${cantProdFijo}, ${prodsPrecio}"$)
' ' Asumimos que el índice 0 es el encabezado de la promoción (estaPromo) y no tiene bonificación de producto.
If t > 0 Then
Private bonificacion_monto As String = ts.traeMontoBonificacion(idProdFijo, prodsPrecio, estaPromo)
Log(bonificacion_monto)
Log("elMontoTSDeLaVenta=" & elMontoTSDeLaVenta)
Log($"${elMontoTSDeLaVenta} + (${bonificacion_monto} * ${cantProdFijo})"$)
elMontoTSDeLaVenta = elMontoTSDeLaVenta + (bonificacion_monto * cantProdFijo)
Log($"TS Fijo Acumulado: ${elMontoTSDeLaVenta}, Prod: ${idProdFijo}"$)
End If
If prodsCants.Get(t) > 0 Then Subs.guardaProductoSinGestion(estaPromo, prodsPrecios.Get(t), prodsCants.Get(t), pn, prodsIds.Get(t), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, Starter.tipov)
Next Next
For t = 0 To prodsIds2.Size - 1 'Guardamos los productos variables de la promocion en pedido. For t = 0 To prodsIds2.Size - 1 'Guardamos los productos variables de la promocion en pedido.
Private pn As String = Subs.traeProdNombre(prodsIds2.Get(t)) Private pn As String = Subs.traeProdNombre(prodsIds2.Get(t))
Subs.guardaProductoSinGestion(estaPromo, prodsPrecios2.Get(t), prodsCants2.Get(t), pn, prodsIds2.Get(t), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, Starter.tipov) Subs.guardaProductoSinGestion(estaPromo, prodsPrecios2.Get(t), prodsCants2.Get(t), pn, prodsIds2.Get(t), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, Starter.tipov)
' Traemos el monto de las bonificacionos a guardar. -- Trade Spending ' Traemos el monto de las bonificacionos a guardar. -- Trade Spending
Log("Monto Bonificacion -->> " & ts.traeMontoBonificacion(prodsIds2.Get(t), estaPromo)) Log("Monto Bonificacion -->> " & ts.traeMontoBonificacion(prodsIds2.Get(t), prodsPrecios2.Get(t), estaPromo))
elMontoTSDeLaVenta = elMontoTSDeLaVenta + (ts.traeMontoBonificacion(prodsIds2.Get(t), estaPromo) * prodsCants2.Get(t)) elMontoTSDeLaVenta = elMontoTSDeLaVenta + (ts.traeMontoBonificacion(prodsIds2.Get(t), prodsPrecios2.Get(t), estaPromo) * prodsCants2.Get(t))
Log("Acumulado: " & elMontoTSDeLaVenta) Log("Acumulado: " & elMontoTSDeLaVenta)
Next Next
ts.modTrendSpending("RESTA", "BONIFICACIONES", elMontoTSDeLaVenta) ts.modTrendSpending("RESTA", "BONIFICACIONES", elMontoTSDeLaVenta)
Log($"### modTrendSpending("RESTA", "BONIFICACIONES", ${elMontoTSDeLaVenta})"$)
lv_prodsFijos.Clear lv_prodsFijos.Clear
' Activity_KeyPress(KeyCodes.KEYCODE_BACK) ' Activity_KeyPress(KeyCodes.KEYCODE_BACK)
' CallSubDelayed2(productos, "Activity_KeyPress", KeyCodes.KEYCODE_BACK) ' CallSubDelayed2(productos, "Activity_KeyPress", KeyCodes.KEYCODE_BACK)

View File

@@ -90,6 +90,7 @@ Sub Activity_KeyPress (key As Int) As Boolean
End Sub End Sub
Sub ListView1_ItemLongClick (Position As Int, Value As Object) Sub ListView1_ItemLongClick (Position As Int, Value As Object)
Log(value)
Starter.skmt.ExecNonQuery("delete from CUENTAA") Starter.skmt.ExecNonQuery("delete from CUENTAA")
Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object(Value)) Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object(Value))
Subs.iniciaActividad("Cliente") Subs.iniciaActividad("Cliente")

View File

@@ -9,6 +9,41 @@ Version=12.8
' Propósito: Gestionar el GUID del dispositivo y verificar/ligar el dispositivo ' Propósito: Gestionar el GUID del dispositivo y verificar/ligar el dispositivo
' a un almacén y ruta en el servidor de forma segura. ' a un almacén y ruta en el servidor de forma segura.
'----------------------------------------------------------------------------------- '-----------------------------------------------------------------------------------
' Ejemplo de uso:
' ==== En config.properties ====
' sql.verify_device=Select nvl(CAT_RU_IDTELEFONO, 0) As CAT_RU_IDTELEFONO from kelloggs.CAT_RUTAS where cat_ru_idalmacen = ? And cat_ru_ruta = ?
' sql.registarMovil=update kelloggs.CAT_RUTAS set CAT_RU_IDTELEFONO = ? where cat_ru_idalmacen = ? And cat_ru_ruta = ?
' ==== En Class_Globals ====
' Dim linker As C_deviceLinker '<<<< Class_Globals
' ==== En B4XPage_Created ====
' linker.Initialize(Me, "Linker", True) '<<<<<< B4XPage_Created
' ==== En donde se quiera llamar ====
' linker.VerifyDevice(Subs.traeAlmacen, Subs.traeRuta)
' Sub Linker_Response(Status As String) ' << AÑADE ESTE SUB [New Query]
' If Starter.Logger Then LogColor($"Respuesta de DeviceLinker para la verificación del dispositivo: ${Status}"$, Colors.Magenta) '
' Select Status
' Case "OK"
' Log("########################################################")
' ToastMessageShow("Dispositivo verificado y vinculado correctamente.", False)
' ' Aquí puedes añadir lógica adicional si la verificación es exitosa, por ejemplo, habilitar ciertos botones o continuar con el flujo normal.
' Case "REGISTRO_COMPLETO"
' Log("########################################################")
' ToastMessageShow("¡Registro completo!", False)
' Case "SIN_REGISTRO"
' Log("########################################################")
' ToastMessageShow("¡Dispositivo sin registro!", False)
' linker.linkDevice(Subs.traeAlmacen, e_ruta.text) '<<<<<<<<< Si no esta registrado lo registramos.
' Case "REGISTRANDO"
' ToastMessageShow("¡Registro en proceso!", True)
' Case "YA_REGISTRADO"
' Log("########################################################")
' ToastMessageShow("¡¡El dispositivo ya esta registrado con otra ruta!!", True)
' Case Else ' Otros estados que tu servidor pueda devolver (ej. "UNAUTHORIZED", "PENDING_APPROVAL")
' Log("########################################################")
' ToastMessageShow($"Verificación del dispositivo: ${Status}"$, True)
' ' Puedes decidir si bloquear la funcionalidad o mostrar un mensaje específico según el estado.
' End Select
' End Sub
Sub Class_Globals Sub Class_Globals
' Configuración del servidor y comandos ' Configuración del servidor y comandos
@@ -28,6 +63,7 @@ Sub Class_Globals
' - KeyValueStore2 ' - KeyValueStore2
' - DBRequestManager ' - DBRequestManager
' - XUI ' - XUI
Dim dlDB As SQL
End Sub End Sub
' Inicializa la clase DeviceLinker. ' Inicializa la clase DeviceLinker.
@@ -43,10 +79,15 @@ Public Sub Initialize (PageObject As Object, NameOfEvent As String, AppLogger As
kvs.Initialize(File.DirInternal, "DeviceKeyStore.b4xkey") kvs.Initialize(File.DirInternal, "DeviceKeyStore.b4xkey")
If logger Then Log("B4XKeyStore 'DeviceKeyStore' inicializado.") If logger Then Log("B4XKeyStore 'DeviceKeyStore' inicializado.")
dlDB.Initialize(File.DirInternal, "deviceLink.db", True)
dlDB.ExecNonQuery("CREATE TABLE IF NOT EXISTS Registro (GUID_KEY_ALIAS TEXT)") ' Creamos la tabla si no existe
' Inicializamos el DBRequestManager para las comunicaciones con el servidor. ' Inicializamos el DBRequestManager para las comunicaciones con el servidor.
' 'Me' indica que el evento JobDone de esta clase se encargará de las respuestas de reqManager. ' 'Me' indica que el evento JobDone de esta clase se encargará de las respuestas de reqManager.
' reqManager.Initialize(Me, Starter.DBReqServer) ' reqManager.Initialize(Me, Starter.DBReqServer)
reqManager.Initialize(Me, "http://keymon.net:9010/DB2") 'Servidor de pruebas ' reqManager.Initialize(Me, "http://keymon.net:9010/DB2") 'Servidor de pruebas
' reqManager.Initialize(Me, "http://keymon.net:1781") 'Servidor productivo
reqManager.Initialize(Me, Starter.DBReqServer) 'Servidor productivo
If logger Then Log("DBRequestManager para DeviceLinker inicializado.") If logger Then Log("DBRequestManager para DeviceLinker inicializado.")
If logger Then Log("DeviceLinker inicializado y listo para operar.") If logger Then Log("DeviceLinker inicializado y listo para operar.")
@@ -55,43 +96,87 @@ End Sub
' Verifica y liga el dispositivo con un almacén y una ruta en el servidor. ' Verifica y liga el dispositivo con un almacén y una ruta en el servidor.
' Almacen: El identificador del almacén. ' Almacen: El identificador del almacén.
' Ruta: El identificador de la ruta. ' Ruta: El identificador de la ruta.
Public Sub VerifyAndLinkDevice(Almacen_ As String, Ruta_ As String) Public Sub verifyDevice(Almacen_ As String, Ruta_ As String)
Dim DeviceId_ As String = GetDeviceGUID ' Obtenemos o generamos el GUID del dispositivo. Private verificar As Boolean = True ' La verificacion se realiza por default
almacen = Almacen_ Private tv As Cursor = Starter.skmt.ExecQuery("select * from cat_variables where CAT_VA_DESCRIPCION = 'VERIFY_DEVICE'")
ruta = Ruta_ If tv.RowCount > 0 Then
deviceId = DeviceId_ tv.Position = 0
If DeviceId_ = "" Then If tv.GetString("CAT_VA_VALOR") = 0 Then verificar = False
If logger Then LogColor("Error: GUID del dispositivo no pudo ser obtenido o generado.", Colors.Red)
' Enviar una respuesta de error al callback si no se pudo obtener el GUID.
If SubExists(CallBack, EventName & "_Response") Then ' [New Query]
CallSub2(CallBack, EventName & "_Response", "GUID_ERROR")
End If
Return
End If End If
If verificar Then ' Si VERIFY_DEVICE no está en CERO ... verificamos.
Dim DeviceId_ As String = GetDeviceGUID ' Obtenemos o generamos el GUID del dispositivo.
LogColor(DeviceId_, Colors.red)
almacen = Almacen_
ruta = Ruta_
deviceId = DeviceId_
If DeviceId_ = "" Then
If logger Then LogColor("Error: GUID del dispositivo no pudo ser obtenido o generado.", Colors.Red)
' Enviar una respuesta de error al callback si no se pudo obtener el GUID.
If SubExists(CallBack, EventName & "_Response") Then ' [New Query]
CallSub2(CallBack, EventName & "_Response", "GUID_ERROR") ' Dispara el evento Linker_Response("GUID_ERROR")
End If
Return
End If
If logger Then Log($"Enviando solicitud de verificación para DeviceId: ${DeviceId_}, Almacen: ${Almacen_}, Ruta: ${Ruta_}"$) If logger Then Log($"Enviando solicitud de verificación para DeviceId: ${DeviceId_}, Almacen: ${Almacen_}, Ruta: ${Ruta_}"$)
Dim cmd As DBCommand ' Creamos un comando para enviar al servidor.
cmd.Initialize
cmd.Name = "verify_device"
' Pasamos el almacén, la ruta y el GUID del dispositivo como parámetros.
cmd.Parameters = Array As Object(Almacen_, Ruta_) ', DeviceId_
Log($"Enviamos almacen: ${Almacen_} y ruta: ${Ruta_}"$)
' Ejecutamos el comando en el servidor. 'Me' indica que DBRequestManager_JobDone en esta clase manejará la respuesta.
reqManager.ExecuteQuery(cmd, 0, "verify_device")
Else ' Si está en CERO (Verificacion deshabilitada), regresamos "OK".
CallSub2(CallBack, EventName & "_Response", "OK")
End If
End Sub
Sub linkDevice(Almacen_ As String, Ruta_ As String)
Dim deviceId As String = GetDeviceGUID ' Obtenemos o generamos el GUID del dispositivo.
Log("########################################################")
Log("REGISTRANDO")
Dim cmd As DBCommand ' Creamos un comando para enviar al servidor. Dim cmd As DBCommand ' Creamos un comando para enviar al servidor.
cmd.Initialize cmd.Initialize
cmd.Name = "verify_device" cmd.Name = "registarMovil"
' Pasamos el almacén, la ruta y el GUID del dispositivo como parámetros. ' Pasamos el almacén, la ruta y el GUID del dispositivo como parámetros.
cmd.Parameters = Array As Object(Almacen_, Ruta_) ', DeviceId_ cmd.Parameters = Array As Object(deviceId, Almacen_, Ruta_)
reqManager.ExecuteCommand(cmd, "registramosGUID")
' Ejecutamos el comando en el servidor. 'Me' indica que DBRequestManager_JobDone en esta clase manejará la respuesta. If SubExists(CallBack, EventName & "_Response") Then
reqManager.ExecuteQuery(cmd, 0, "verify_device") CallSub2(CallBack, EventName & "_Response", "REGISTRANDO") ' Dispara el evento Linker_Response("REGISTRANDO")
End If
End Sub End Sub
'244500
' Obtiene el GUID único del dispositivo desde B4XKeyStore. ' Obtiene el GUID único del dispositivo desde B4XKeyStore.
' Si no existe, lo genera y lo guarda utilizando Subs.GUID. ' Si no existe, lo genera y lo guarda utilizando Subs.GUID.
Private Sub GetDeviceGUID As String Private Sub GetDeviceGUID As String
If kvs.ContainsKey(GUID_KEY_ALIAS) = False Then ' If kvs.ContainsKey(GUID_KEY_ALIAS) = False Then
' ' Corrección: Usamos la función GUID ya existente en el módulo Subs [1].
' Dim NewGUID As String = generaGUID
' kvs.Put(GUID_KEY_ALIAS, NewGUID) ' Lo guardamos de forma segura en el KeyStore.
' If logger Then LogColor($"Nuevo GUID generado y guardado: ${NewGUID}"$, Colors.Blue)
' Return NewGUID
' Else
' Dim ExistingGUID As String = kvs.Get(GUID_KEY_ALIAS) ' Recuperamos el GUID existente.
' If logger Then LogColor($"GUID existente cargado: ${ExistingGUID}"$, Colors.Blue)
' Return ExistingGUID
' End If
If deviceLinked = False Then
' Corrección: Usamos la función GUID ya existente en el módulo Subs [1]. ' Corrección: Usamos la función GUID ya existente en el módulo Subs [1].
Dim NewGUID As String = generaGUID Dim NewGUID As String = generaGUID
kvs.Put(GUID_KEY_ALIAS, NewGUID) ' Lo guardamos de forma segura en el KeyStore. dlDB.ExecNonQuery($"insert into registro ('GUID_KEY_ALIAS') values ('${NewGUID}')"$) ' Guardamos nuevo registro
If logger Then LogColor($"Nuevo GUID generado y guardado: ${NewGUID}"$, Colors.Blue) If logger Then LogColor($"Nuevo GUID generado y guardado: ${NewGUID}"$, Colors.Blue)
Return NewGUID Return NewGUID
Else Else
Dim ExistingGUID As String = kvs.Get(GUID_KEY_ALIAS) ' Recuperamos el GUID existente. Dim ExistingGUID As String
Private e As Cursor = dlDB.ExecQuery("select GUID_KEY_ALIAS from registro")
e.Position = 0
ExistingGUID = e.GetString("GUID_KEY_ALIAS")
If logger Then LogColor($"GUID existente cargado: ${ExistingGUID}"$, Colors.Blue) If logger Then LogColor($"GUID existente cargado: ${ExistingGUID}"$, Colors.Blue)
Return ExistingGUID Return ExistingGUID
End If End If
@@ -110,11 +195,11 @@ Public Sub JobDone(Job As HttpJob) ' El nombre del sub debe ser 'JobDone' o el q
If Job.Success = False Then If Job.Success = False Then
lastJobDoneError = Job.ErrorMessage lastJobDoneError = Job.ErrorMessage
LogColor("############################################", Colors.red) LogColor("############################################", Colors.red)
LogColor("###### JobError: " & Job.Tag & CRLF & Job.ErrorMessage, Colors.red) LogColor("###### JobError: " & Job.Tag & " ######" & CRLF & "#### " & Job.ErrorMessage, Colors.red)
LogColor("############################################", Colors.red) LogColor("############################################", Colors.red)
' Enviar una respuesta de error HTTP al callback. ' Enviar una respuesta de error HTTP al callback.
If SubExists(CallBack, EventName & "_Response") Then If SubExists(CallBack, EventName & "_Response") Then
CallSub2(CallBack, EventName & "_Response", "HTTP_ERROR") CallSub2(CallBack, EventName & "_Response", "HTTP_ERROR") ' Dispara el evento Linker_Response("HTTP_ERROR")
End If End If
Else 'If Job Success then ... Else 'If Job Success then ...
lastJobDoneError = "" lastJobDoneError = ""
@@ -125,50 +210,72 @@ Public Sub JobDone(Job As HttpJob) ' El nombre del sub debe ser 'JobDone' o el q
If logger Then LogColor($"Petición exitosa al servidor. Registros devueltos: ${result.Rows.Size}"$, Colors.Green) If logger Then LogColor($"Petición exitosa al servidor. Registros devueltos: ${result.Rows.Size}"$, Colors.Green)
If result.Tag = "hist_cliente_promos" Then 'query tag ' If result.Tag = "hist_cliente_promos" Then 'query tag
Starter.skmt.BeginTransaction ' Starter.skmt.BeginTransaction
For Each records() As Object In result.Rows ' For Each records() As Object In result.Rows
Dim HCCP_CLIENTE As String = records(result.Columns.Get("HCCP_CLIENTE")) ' Dim HCCP_CLIENTE As String = records(result.Columns.Get("HCCP_CLIENTE"))
Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CLIENTE_CANT_PROMOS(HCCP_CLIENTE, HCCP_PROMO, HCCP_CANT, HCCP_CANT_VENDIDA) VALUES (?,?,?,?)", Array As Object (HCCP_CLIENTE)) ' Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CLIENTE_CANT_PROMOS(HCCP_CLIENTE, HCCP_PROMO, HCCP_CANT, HCCP_CANT_VENDIDA) VALUES (?,?,?,?)", Array As Object (HCCP_CLIENTE))
Next ' Next
Starter.skmt.TransactionSuccessful ' Starter.skmt.TransactionSuccessful
Starter.skmt.EndTransaction ' Starter.skmt.EndTransaction
' ToastMessageShow(" Historico Clientes Promociones Actualizado." , True) ' ' ToastMessageShow(" Historico Clientes Promociones Actualizado." , True)
End If ' End If
If result.Tag = "verify_device" Then 'query tag If result.Tag = "verify_device" Then 'query tag
' Aquí es donde la lógica de la aplicación interpreta el éxito/falla de la operación en el servidor. ' Aquí es donde la lógica de la aplicación interpreta el éxito/falla de la operación en el servidor.
' No usamos result.Success porque DBResult no tiene esa propiedad.
' En su lugar, comprobamos si se devolvieron filas y el campo 'status' dentro de los datos.
If result.Rows.Size > 0 Then If result.Rows.Size > 0 Then
Subs.logJobDoneResultados(result) Subs.logJobDoneResultados(result)
For Each records() As Object In result.Rows For Each records() As Object In result.Rows
Dim Status As String = records(result.Columns.Get("ESTATUS")) Dim Status As String = "" 'records(result.Columns.Get("ESTATUS"))
Dim GUID As String = records(result.Columns.Get("GUID")) Dim CAT_RU_IDTELEFONO As String = records(result.Columns.Get("CAT_RU_IDTELEFONO"))
If deviceId <> GUID Then Status = "ALREADY_REGISTERED" ' Ya existe OTRO registro. deviceId = GetDeviceGUID
' Invocamos el callback en el módulo principal con el estado. Log($"|${deviceId}|${CAT_RU_IDTELEFONO}|"$)
If SubExists(CallBack, EventName & "_Response") Then ' If deviceId <> CAT_RU_IDTELEFONO Then Status = "YA_REGISTRADO" ' Ya existe OTRO registro.
CallSub2(CallBack, EventName & "_Response", Status) If CAT_RU_IDTELEFONO = 0 Or CAT_RU_IDTELEFONO.Length < 5 Then
Status = "SIN_REGISTRO"
' Log("########################################################")
' Log("REGISTRANDO")
' Dim cmd As DBCommand ' Creamos un comando para enviar al servidor.
' cmd.Initialize
' cmd.Name = "registarMovil"
' ' Pasamos el almacén, la ruta y el GUID del dispositivo como parámetros.
' cmd.Parameters = Array As Object(deviceId, almacen, ruta)
' reqManager.ExecuteCommand(cmd, "registramosGUID")
If SubExists(CallBack, EventName & "_Response") Then
CallSub2(CallBack, EventName & "_Response", "SIN_REGISTRO")
End If
else if CAT_RU_IDTELEFONO = deviceId Then
Status = "OK"
Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("LIGADO"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("LIGADO", 1))
Log("OK")
LogColor("######### GUARDAMOS ###########", Colors.red)
Else
Status = "YA_REGISTRADO"
Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("LIGADO"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("LIGADO", 0))
Log("YA_REGISTRADO")
LogColor("######### GUARDAMOS ###########", Colors.red)
End If End If
' Invocamos el callback en el módulo principal con el estado.
Next Next
Else Else
If logger Then LogColor($"El servidor respondió con éxito, pero no encontró registros.${CRLF}Quiere decir que la ruta NO esta registrada en el servidor."$, Colors.Red) Status = "NO_EXISTE_RUTA"
Dim cmd As DBCommand ' Creamos un comando para enviar al servidor. End If
cmd.Initialize If SubExists(CallBack, EventName & "_Response") Then
cmd.Name = "registarMovil" CallSub2(CallBack, EventName & "_Response", Status) ' Dispara el evento Linker_Response("OK") o Linker_Response("YA_REGISTRADO")
' Pasamos el almacén, la ruta y el GUID del dispositivo como parámetros.
cmd.Parameters = Array As Object(almacen, ruta, deviceId)
reqManager.ExecuteCommand(cmd, "registramosGUID")
If SubExists(CallBack, EventName & "_Response") Then
CallSub2(CallBack, EventName & "_Response", "NO_REGISTRADO")
End If
End If End If
End If End If
If result.Tag = "registramosGUID" Then If result.Tag = "registramosGUID" Then
Log("########################################################")
Log("REGISTRO_COMPLETO")
LogColor("######### GUARDAMOS ###########", Colors.red)
Subs.logJobDoneResultados(result) Subs.logJobDoneResultados(result)
Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("LIGADO"))
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("LIGADO", 1))
If SubExists(CallBack, EventName & "_Response") Then If SubExists(CallBack, EventName & "_Response") Then
CallSub2(CallBack, EventName & "_Response", "REGISTRO_NUEVO") CallSub2(CallBack, EventName & "_Response", "REGISTRO_COMPLETO") ' Dispara el evento Linker_Response("REGISTRO_COMPLETO")
End If End If
End If End If
End If End If
@@ -191,3 +298,13 @@ Sub generaGUID As String
Next Next
Return sb.ToString Return sb.ToString
End Sub End Sub
'Regresa true si existe registro
Sub deviceLinked As Boolean
Private e As Cursor = dlDB.ExecQuery("select * from registro")
If e.RowCount > 0 Then
Return True
Else
Return False
End If
End Sub

View File

@@ -99,6 +99,8 @@ End Sub
'This sub will be called by the DBRequestManager when the job is done 'This sub will be called by the DBRequestManager when the job is done
Public Sub JobDone(job As HttpJob) Public Sub JobDone(job As HttpJob)
Log("===== JDDBRW =====")
LogColor("JobDone: '" & reqManager.HandleJob(job).tag & "' - Registros: " & reqManager.HandleJob(job).Rows.Size, Colors.Green) 'Mod por CHV - 211110
'<<< Obtenemos el Tag único que asignamos al job '<<< Obtenemos el Tag único que asignamos al job
Dim currentJobTag As String = job.Tag Dim currentJobTag As String = job.Tag

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -917,7 +917,7 @@ Version=12.8
#Region Project Attributes #Region Project Attributes
#ApplicationLabel: Kelloggs Venta #ApplicationLabel: Kelloggs Venta
#VersionCode: 3000 #VersionCode: 3000
#VersionName: 5.09.10 #VersionName: 5.12.15
#SupportedOrientations: portrait #SupportedOrientations: portrait
#CanInstallToExternalStorage: False #CanInstallToExternalStorage: False
#BridgeLogger:true #BridgeLogger:true
@@ -933,6 +933,8 @@ Version=12.8
#IncludeTitle: False #IncludeTitle: False
#End Region #End Region
'222543
' Version que estaba en la tabla CAT_VERSION antes -> 2.95 ' Version que estaba en la tabla CAT_VERSION antes -> 2.95
' 5.08.30 --> corrige que en la barra de busqeda en productos no hacia nada! ' 5.08.30 --> corrige que en la barra de busqeda en productos no hacia nada!

View File

@@ -67,32 +67,32 @@ ModuleBreakpoints7=
ModuleBreakpoints8= ModuleBreakpoints8=
ModuleBreakpoints9= ModuleBreakpoints9=
ModuleClosedNodes0= ModuleClosedNodes0=
ModuleClosedNodes1=6,8,46,47 ModuleClosedNodes1=2,3,6,10,11,12,13,14,15,16,18,19,20,21,22,23,24,25,26,27,28,29,31,33,34,35,37,38,39,40,41,42,43,45,46,47
ModuleClosedNodes10= ModuleClosedNodes10=
ModuleClosedNodes11= ModuleClosedNodes11=
ModuleClosedNodes12=3,5,6 ModuleClosedNodes12=
ModuleClosedNodes13=7,8,9,10,11,12 ModuleClosedNodes13=8,9,11,12
ModuleClosedNodes14=6,7,8,9,12,13 ModuleClosedNodes14=1,2
ModuleClosedNodes15= ModuleClosedNodes15=
ModuleClosedNodes16=3,7,8,15,17 ModuleClosedNodes16=3,8,17
ModuleClosedNodes17= ModuleClosedNodes17=
ModuleClosedNodes18= ModuleClosedNodes18=
ModuleClosedNodes19=7,8,9,10,11,12,13,14 ModuleClosedNodes19=7,8,9,10,11,12,13,14
ModuleClosedNodes2= ModuleClosedNodes2=
ModuleClosedNodes20= ModuleClosedNodes20=3,4
ModuleClosedNodes21= ModuleClosedNodes21=
ModuleClosedNodes22= ModuleClosedNodes22=
ModuleClosedNodes23= ModuleClosedNodes23=
ModuleClosedNodes24= ModuleClosedNodes24=
ModuleClosedNodes25= ModuleClosedNodes25=
ModuleClosedNodes26=24,26,27,31,32,33,35 ModuleClosedNodes26=24,26,31,32,33,35
ModuleClosedNodes27= ModuleClosedNodes27=
ModuleClosedNodes28=4 ModuleClosedNodes28=4
ModuleClosedNodes29= ModuleClosedNodes29=
ModuleClosedNodes3=1,3,5,6 ModuleClosedNodes3=
ModuleClosedNodes30= ModuleClosedNodes30=
ModuleClosedNodes31= ModuleClosedNodes31=
ModuleClosedNodes32=114,116 ModuleClosedNodes32=116
ModuleClosedNodes33= ModuleClosedNodes33=
ModuleClosedNodes4= ModuleClosedNodes4=
ModuleClosedNodes5= ModuleClosedNodes5=
@@ -100,6 +100,6 @@ ModuleClosedNodes6=
ModuleClosedNodes7= ModuleClosedNodes7=
ModuleClosedNodes8= ModuleClosedNodes8=
ModuleClosedNodes9= ModuleClosedNodes9=
NavigationStack=C_Cliente,GPS_LocationChanged,906,0,C_Cliente,B4XPage_Appear,552,6,Diseñador Visual,cliente.bal,-100,6,Diseñador Visual,principal.bal,-100,2,C_Principal,cargar_Click,837,0,C_Principal,B4XPage_Appear,539,6,kms_helperSubs,traeRuta,748,0,C_deviceLinker,Initialize,43,0,C_deviceLinker,VerifyAndLinkDevice,64,0,B4XMainPage,ImageView1_LongClick,1041,0 NavigationStack=C_Cliente,B4XPage_Appear,841,0,B4XMainPage,Class_Globals,118,0,B4XMainPage,Initialize,126,0,C_Principal,cargar_Click,1031,0,Subs,modTrendSpending,2210,3,C_TrendSpending,modTrendSpending,112,2,C_Productos,B4XPage_Appear,236,0,C_TrendSpending,traeDescXSku,59,0,C_TrendSpending,traeInfoTrendSpending,73,2,C_Principal,JobDone,2240,0
SelectedBuild=0 SelectedBuild=0
VisibleModules=31,1,12,5,16,26,3,32,13,14,8,33,10,28 VisibleModules=31,1,12,3,32,13,14,20,19,33,16

View File

@@ -200,7 +200,8 @@ Sub MapFragment1_Ready
CODIGO=c3.GetString("CAT_CL_CODIGO") CODIGO=c3.GetString("CAT_CL_CODIGO")
Tienda= c3.GetString("CAT_CL_NOMBRE") Tienda= c3.GetString("CAT_CL_NOMBRE")
NumSerie=c3.GetInt("CAT_CL_NUM_SERIEFISICO") NumSerie=c3.GetInt("CAT_CL_NUM_SERIEFISICO")
MARK_ROJO = gmap.AddMarker3(LatitudRU,LongitudRU,CODIGO, LoadBitmap(File.DirAssets, "marker-rojo-" & NumSerie &".png")) ' MARK_ROJO = gmap.AddMarker3(LatitudRU,LongitudRU,CODIGO, LoadBitmap(File.DirAssets, "marker-rojo-" & NumSerie &".png"))
MARK_ROJO = gmap.AddMarker3(LatitudRU, LongitudRU, CODIGO, CreateBitmapWithNumber(LoadBitmap(File.DirAssets, "marker-rojo.png"), NumSerie))
MARK_ROJO.Snippet = Tienda MARK_ROJO.Snippet = Tienda
Next Next
c3.Close c3.Close

View File

@@ -4,6 +4,11 @@ ModulesStructureVersion=1
Type=Class Type=Class
Version=12.8 Version=12.8
@EndOfDesignText@ @EndOfDesignText@
'##############################################################################################
' CODIGO DE PRUEBA, NO HABILITADO, NO TERMINADO
' PRETENDE UTILIZAR MENOS MAPAS Y MAS QUERIES PARA EL CALCULO DE LAS PROMOCIONES
'##############################################################################################
Sub Class_Globals Sub Class_Globals
Dim ruta As String Dim ruta As String
Dim almacen As String Dim almacen As String

View File

@@ -56,7 +56,7 @@ Sub Process_Globals
Dim pingShell As Boolean = False Dim pingShell As Boolean = False
Dim errorConnDBReq As Boolean = False Dim errorConnDBReq As Boolean = False
Dim GUID As String = "" Dim GUID As String = ""
Dim passSupervisor As String = "13X#X$X46" ' Valor predeterminado DIFERENTE a "" Dim passSupervisor As String = "135###" ' Valor predeterminado DIFERENTE a ""
Dim semana As Int = 0 Dim semana As Int = 0
End Sub End Sub
@@ -189,16 +189,19 @@ Sub ENVIA_ULTIMA_GPS
If i = "SALTY SNACKS" Then salty = x If i = "SALTY SNACKS" Then salty = x
Next Next
h.Close h.Close
Dim cmd As DBCommand
cmd.Initialize
cmd.Name = "UPDATE_KELL_ACTUAL3_GPS"
cmd.Parameters = Array As Object(montoActual, clientesVisitaHoy, clientesVenta, clientesVisitados, lat_gps, lon_gps, batt, 0, 0, 0, Application.VersionName, rtec, ping, salty, Subs.dameClientesFueraDeFrecuencia, almacen, rutaPreventa)
' If Logger Then LogColor(montoActual&","&clientesVisitaHoy&","&clientesVenta&","&clientesVisitados&","&lat_gps&","&lon_gps&","&batt&","&0&","&0&","&0&","&Application.VersionName&","&rtec&","&ping&","&salty&","& Subs.dameClientesFueraDeFrecuencia&","&almacen&","&rutaPreventa, Colors.Magenta)
reqManager.ExecuteCommand(cmd,"updateKell_UTR")
cmd.Name = "select_hora" If Subs.EstaEnHorarioPermitido Then
reqManager.ExecuteQuery(cmd , 0, "hora") Dim cmd As DBCommand
cmd.Initialize
cmd.Name = "UPDATE_KELL_ACTUAL3_GPS"
cmd.Parameters = Array As Object(montoActual, clientesVisitaHoy, clientesVenta, clientesVisitados, lat_gps, lon_gps, batt, 0, 0, 0, Application.VersionName, rtec, ping, salty, Subs.dameClientesFueraDeFrecuencia, almacen, rutaPreventa)
' If Logger Then LogColor(montoActual&","&clientesVisitaHoy&","&clientesVenta&","&clientesVisitados&","&lat_gps&","&lon_gps&","&batt&","&0&","&0&","&0&","&Application.VersionName&","&rtec&","&ping&","&salty&","& Subs.dameClientesFueraDeFrecuencia&","&almacen&","&rutaPreventa, Colors.Magenta)
reqManager.ExecuteCommand(cmd,"updateKell_UTR")
cmd.Name = "select_hora"
reqManager.ExecuteQuery(cmd , 0, "hora")
' log(subs.revisaHora) ' log(subs.revisaHora)
End If
' If Logger Then Log(reqManager) ' If Logger Then Log(reqManager)
' If Logger Then Log("++ ++ ++ Envia_Ultima GPS - Inst_visitas - server: "& server) ' If Logger Then Log("++ ++ ++ Envia_Ultima GPS - Inst_visitas - server: "& server)

View File

@@ -863,6 +863,7 @@ Sub traeNombreCliente(id As String) As String
Do While c.NextRow Do While c.NextRow
n = c.GetString("CAT_CL_NOMBRE") n = c.GetString("CAT_CL_NOMBRE")
Loop Loop
c.Close
Return n Return n
End Sub End Sub
@@ -906,7 +907,7 @@ Sub guardaProducto(cedis As String, costoTot As String, costoU As String, cant A
LogColor("guardaProducto", Colors.Magenta) LogColor("guardaProducto", Colors.Magenta)
Log($"Guardamos producto ${prodId}"$) Log($"Guardamos producto ${prodId}"$)
LogColor("TIPO VENTA="&tipoV, Colors.Magenta) 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) VALUES(?,?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (cedis, costoTot, costoU, cant, nombre, prodId, clienteId, fecha, usuario, tipoV, precio2, Starter.rutaV)) 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)) Starter.skmt.ExecNonQuery2("update " & query & " set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cant, prodId))
ToastMessageShow("guardaProd", False) ToastMessageShow("guardaProd", False)
End Sub End Sub
@@ -915,22 +916,26 @@ End Sub
'NO ACTUALIZA LA BANDERA DE GESTION EN LA TABLA "kmt_info". '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. '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) 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) If nombre.Length < 6 Then ToastMessageShow("(guardaProductoSinGestion) El nombre del producto no es valido " & nombre, True)
precioSin = NumberFormat2(precioSin, 1, 2, 2, False) precioSin = NumberFormat2(precioSin, 1, 2, 2, False)
costoU = NumberFormat2(costoU, 1, 2, 2, False) costoU = NumberFormat2(costoU, 1, 2, 2, False)
' LogColor("guardaProductoSinGestion: "&prodId&", cant="&cant&", tipo="&tipoVenta, Colors.Magenta) LogColor("guardaProductoSinGestion: "&prodId&", cant="&cant&", tipo="&tipoVenta, Colors.Magenta)
Private c As Cursor Private c As Cursor
' Private tablaProds As String = "cat_gunaprod2" ' Private tablaProds As String = "cat_gunaprod2"
' If tipoVenta = "ABORDO" Then tablaProds = "cat_gunaprod" ' 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) VALUES(?,?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (cedis, (cant * costoU), costoU, cant, nombre, prodId, clienteId, fecha, usuario, rutaV, precioSin, tipoVenta)) 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 '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)) 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=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 c.Position=0
' Log("###### delete from pedido_cliente - " & traeCliente & "|" & clienteId) ' Log("###### delete from pedido_cliente - " & traeCliente & "|" & clienteId)
' Log($"delete from pedido_cliente where PC_CLIENTE = '${traeCliente}'"$) ' Log($"delete from pedido_cliente where PC_CLIENTE = '${traeCliente}'"$)
Starter.skmt.ExecNonQuery($"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) VALUES (?,?,?,?,?,?,?,?,?,?)", 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"))) 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 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 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
@@ -940,7 +945,7 @@ Sub guardaProductoSin(cedis As String, costoTot As String, costoU As String, can
costoU = NumberFormat2(costoU, 1, 2, 2, False) costoU = NumberFormat2(costoU, 1, 2, 2, False)
costoTot = NumberFormat2(costoTot, 1, 2, 2, False) costoTot = NumberFormat2(costoTot, 1, 2, 2, False)
LogColor("guardaProductoSin", Colors.Magenta) 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) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (cedis, costoTot, costoU, cant, nombre, prodId, clienteId, fecha, usuario, rutaV, precioSin, tipoV, precio2)) 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)) 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" DateTime.DateFormat = "MM/dd/yyyy"
Private sDate As String =DateTime.Date(DateTime.Now) Private sDate As String =DateTime.Date(DateTime.Now)
@@ -949,7 +954,7 @@ Sub guardaProductoSin(cedis As String, costoTot As String, costoU As String, can
c.Position=0 c.Position=0
Log("###### delete from pedido_cliente - " & traeCliente & "|" & clienteId) Log("###### delete from pedido_cliente - " & traeCliente & "|" & clienteId)
Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") 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) VALUES (?,?,?,?,?,?,?,?,?,?)", 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.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)") Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)")
c.Close c.Close
' ToastMessageShow("guardaProdSin", False) ' ToastMessageShow("guardaProdSin", False)
@@ -1004,10 +1009,10 @@ End Sub
' resultado="OK" 'Ok si existe la promocion. ' resultado="OK" 'Ok si existe la promocion.
' prodsVariablesRequeridos=5} 'Cantidad de productos variables requeridos para la promoción. ' prodsVariablesRequeridos=5} 'Cantidad de productos variables requeridos para la promoción.
Sub traePromo(promo As String, cliente As String) As Map Sub traePromo(promo As String, cliente As String) As Map
Private thisLog As Boolean = False Private thisLog As Boolean = false
If thisLog Then Log("traePromo:"&promo) If thisLog Then Log("traePromo:"&promo)
Private inicioContador As String = DateTime.Now Private inicioContador As String = DateTime.Now
Private c As Cursor = Starter.skmt.ExecQuery("Select * from promos_comp where cat_pa_id = '"& promo&"'") 'Obtenemos las el maximo de promocioones a otorgar. 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 siHistorico As String = 0
Private promoMap As Map Private promoMap As Map
Private prodsFijos, prodsFijosPrecios, prodsFijosPiezas, prodsVariables, prodsVariablesPrecios As List Private prodsFijos, prodsFijosPrecios, prodsFijosPiezas, prodsVariables, prodsVariablesPrecios As List
@@ -1019,32 +1024,38 @@ Sub traePromo(promo As String, cliente As String) As Map
prodsVariablesPrecios.Initialize prodsVariablesPrecios.Initialize
c.Position = 0 c.Position = 0
promoMap = CreateMap("id":promo, "maxXcliente":0, "maxRecurrente":0, "maxPromos":0) 'Ponemos el DEFAULT en CERO. 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")) 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 ########## '######### PROMOCIONES SEGMENTADAS ##########
' Si la promo esta en la lista, SOLO los clientes que la tengan la pueden ver. ' 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}'"$) 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}'"$) ' Log($"select * from HIST_CLIENTE_CANT_PROMOS where HCCP_PROMO = '${promo}'"$)
If thisLog Then Log($"PROMOS SEGMENTADAS DISPONIBLES: ${ps.RowCount}"$) If thisLog Then Log($"PROMOS SEGMENTADAS ENCONTRADAS: ${ps.RowCount}"$)
If thisLog Then Log(promoMap)
If ps.RowCount > 0 Then If ps.RowCount > 0 Then
ps.Position = 0 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. 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")}"$) 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}' ' 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"$) 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($"Select * from HIST_CLIENTE_CANT_PROMOS where HCCP_PROMO = '${promo}' and HCCP_CLIENTE = '${traeCliente}' and HCCP_CANT > HCCP_CANT_VENDIDA"$)
' Log($"registros:${ps2.RowCount}"$) Log($"registros:${ps2.RowCount}"$)
If ps2.RowCount > 0 Then If ps2.RowCount > 0 Then
ps2.Position = 0 ps2.Position = 0
If thisLog Then Log($"registros:${ps2.RowCount}, cliente: ${ps2.GetString("HCCP_CLIENTE")} cant:${ps2.GetString("HCCP_CANT")}"$) 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. 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 End If
ps2.Close
End If End If
ps.Close
If thisLog Then Log(promoMap) If thisLog Then Log(promoMap)
' ########## TERMINA PROMOS SEGMENTADAS ########## ' ########## 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 = 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 c.Position = 0
If c.GetString("hist") > 0 Then siHistorico = 1 If c.GetString("hist") > 0 Then siHistorico = 1
promoMap.Put("historico", siHistorico) 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 = Starter.skmt.ExecQuery("Select * from CAT_DETALLES_PAQ where CAT_DP_ID = '"& promo & "'") 'Obtenemos los detalles de la promoción.
c.Position = 0 c.Position = 0
If c.RowCount > 0 Then If c.RowCount > 0 Then
@@ -1083,6 +1094,7 @@ Sub traePromo(promo As String, cliente As String) As Map
Else Else
promoMap.Put("resultado", "No hay datos de la promoción.") promoMap.Put("resultado", "No hay datos de la promoción.")
End If 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 = 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 c.Position = 0
Private pvr As String = 0 Private pvr As String = 0
@@ -1096,12 +1108,13 @@ Sub traePromo(promo As String, cliente As String) As Map
If thisLog Then Log($"Inv variables: ${cuantosVariablesDisponiblesDB(promo)}"$) If thisLog Then Log($"Inv variables: ${cuantosVariablesDisponiblesDB(promo)}"$)
If thisLog Then Log($"Inv dispo: ${traemosInventarioDisponibleParaPromo(promo)}"$) If thisLog Then Log($"Inv dispo: ${traemosInventarioDisponibleParaPromo(promo)}"$)
If thisLog Then LogColor($"Promo ${promo}: ${promoMap}"$, Colors.Blue) If thisLog Then LogColor($"Promo ${promo}: ${promoMap}"$, Colors.Blue)
If thisLog Then LogColor("TIEMPO para traePromo -=" & promo & "=- : " & ((DateTime.Now-inicioContador)/1000), Colors.Red) ' If thisLog Then LogColor("TIEMPO para traePromo -=" & promo & "=- : " & ((DateTime.Now-inicioContador)/1000), Colors.Red)
Return promoMap Return promoMap
End Sub End Sub
'Regresa un mapa con el inventario disponible por producto para la promoción (desde la base de datos). '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 Sub traemosInventarioDisponibleParaPromo(promo As String) As Map 'ignore
Private thisLog As Boolean = False
Private c As Cursor 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)) 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 ' Private prodInv As Map
@@ -1113,9 +1126,15 @@ Sub traemosInventarioDisponibleParaPromo(promo As String) As Map 'ignore
c.Position=i c.Position=i
prods.Put(c.GetString("CAT_GP_ID"), c.GetString("CAT_GP_ALMACEN")) 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")}"$) ' 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 Next
' prodInv.Put("inventarios", prods) ' prodInv.Put("inventarios", prods)
End If End If
c.Close
Return prods Return prods
End Sub End Sub
@@ -1134,7 +1153,7 @@ Sub restaFijosPromo(promoMap As Map) As Map 'ignore
Private prodsFijos As List = promoMap.get("prodsFijos") 'Obtenemos un a lista con los productos fijos 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) If thisLog Then LogColor("ProdsFijos -> " & prodsFijos, Colors.red)
inventariosDisponiblesParaEstaPromo.Put("resultado", "No hay suficiente producto para la promocion.") 'Valor por default inventariosDisponiblesParaEstaPromo.Put("resultado", "No hay suficiente producto para la promocion.") 'Valor por default
Log($"Prods fijos requeridos ${prodsFijos.Size}"$) 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. 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 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 t As String = prodsFijos.Get(p) 'Obtenemos el Id de este producto desde la lista de productos fijos.
@@ -1164,7 +1183,7 @@ End Sub
'Revisa si tenemos los productos variables requeridos para la promoción (mapa). '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. '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 Sub alcanzanLosVariablesParaPromo(promoMap As Map, inventarioSinFijos As Map) As Boolean 'ignore
Private thisLog As Boolean = True 'Si es verdadero, muestra los logs de este sub. 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. If thisLog Then LogColor("Inventario inicial: "&inventarioSinFijos, Colors.Gray) 'Inventario inicial.
Private totalProdsVariables As Int = 0 Private totalProdsVariables As Int = 0
' Private prodsmap As Map = promoMap.Get("productos") 'Obtenemos un mapa con todos los productos de la promoción. ' Private prodsmap As Map = promoMap.Get("productos") 'Obtenemos un mapa con todos los productos de la promoción.
@@ -1211,14 +1230,15 @@ Sub traeMaxPromos(pm As Map) As Int
maxPromos.Add(hccp.GetInt("HCCP_CANT")) maxPromos.Add(hccp.GetInt("HCCP_CANT"))
End If End If
maxPromos.Sort(True) maxPromos.Sort(True)
If thisLog Then Log($">>>>> Max promos : ${maxPromos}"$) If thisLog Then Log($" >>>>> MAX PROMOS X CONF : ${maxPromos} <==> ${maxPromos.Get(0)}"$)
mp = 0 mp = 0
If maxPromos.Size > 0 Then If maxPromos.Size > 0 Then
mp0 = maxPromos.Get(0) mp0 = maxPromos.Get(0)
' Log(mp0) ' Log(mp0)
mp = mp0 - traePromosVendidas(pm.Get("id"), traeCliente) mp = mp0 - traePromosVendidas(pm.Get("id"), traeCliente)
If thisLog Then Log($"Max Promos (${mp0}) - promos vendidas (${(traePromosVendidas(pm.Get("id"), traeCliente)).As(Int)}) = ${mp}"$) If thisLog Then Log($" >>>>> MAX PROMOS - PROMOS VENDIDAS <==> ${mp0} - ${(traePromosVendidas(pm.Get("id"), traeCliente)).As(Int)} = ${mp}"$)
End If End If
hccp.Close
Return mp 'Regresamos el numero mas pequeño de las opciones. Return mp 'Regresamos el numero mas pequeño de las opciones.
End Sub End Sub
@@ -1231,16 +1251,17 @@ Sub traePromosVendidas(promo As String, cliente As String) As Int
c.Position = 0 c.Position = 0
If c.GetString("cuantas") <> Null Then pv = c.GetString("cuantas") If c.GetString("cuantas") <> Null Then pv = c.GetString("cuantas")
End If End If
c.Close
Return pv Return pv
End Sub End Sub
Sub procesaPromocion(idPromo As String, cliente As String) As Map 'ignore 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 thisLog As Boolean = True 'Si es verdadero, muestra los logs de este sub.
Private inicioContador As String = DateTime.Now Private inicioContador As String = DateTime.Now
Private mp As Int = 0 Private mp As Int = 0
If thisLog Then LogColor($"****************************************************************"$, Colors.red) If thisLog Then LogColor($"****************************************************************"$, Colors.RGB(142,0,255))
If thisLog Then LogColor($"********* Iniciamos revision de Promo ${idPromo} *********"$, Colors.red) If thisLog Then LogColor($"********* Iniciamos revision de Promo ${idPromo} *********"$, Colors.RGB(142,0,255))
If thisLog Then LogColor($"****************************************************************"$, Colors.red) If thisLog Then LogColor($"****************************************************************"$, Colors.RGB(142,0,255))
Try Try
'Obtenemos el mapa con toda la info de la promoción. 'Obtenemos el mapa con toda la info de la promoción.
Private pm As Map = traePromo(idPromo, cliente) Private pm As Map = traePromo(idPromo, cliente)
@@ -1250,7 +1271,9 @@ Sub procesaPromocion(idPromo As String, cliente As String) As Map 'ignore
' Log("|"&revisaMaxPromosProdsFijosPorInventario(pm)&"|") ' Log("|"&revisaMaxPromosProdsFijosPorInventario(pm)&"|")
Private maxPromosXprodsFijos As Int = revisaMaxPromosProdsFijosPorInventario(pm) Private maxPromosXprodsFijos As Int = revisaMaxPromosProdsFijosPorInventario(pm)
If maxPromosXprodsFijos < 1 Then pm.Put("resultado", 0) If maxPromosXprodsFijos < 1 Then pm.Put("resultado", 0)
LogColor($">>> Promos disponibles por productos fijos = ${maxPromosXprodsFijos}"$, Colors.Magenta) 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 ... If pm.Get("resultado") = "ok" Then 'Si encontramos la promoción, entonces ...
'Buscamos el máximo de promociones permitidas. 'Buscamos el máximo de promociones permitidas.
mp = traeMaxPromos(pm) mp = traeMaxPromos(pm)
@@ -1266,7 +1289,9 @@ Sub procesaPromocion(idPromo As String, cliente As String) As Map 'ignore
If inventarioSinFijos.Get("resultado") = "ok" Then If inventarioSinFijos.Get("resultado") = "ok" Then
'Revisamos que los productos variables requeridos sean menos que el inventario total (mapa). 'Revisamos que los productos variables requeridos sean menos que el inventario total (mapa).
Private pv As Boolean = alcanzanLosVariablesParaPromo(pm, inventarioSinFijos) Private pv As Boolean = alcanzanLosVariablesParaPromo(pm, inventarioSinFijos)
If thisLog Then Log("Alcanzan los variables? --> " & pv) 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) If pv Then Return CreateMap("status":"ok", "mp":pm) Else Return CreateMap("status":"ko", "mp":pm)
Else Else
If thisLog Then LogColor("NO HAY INVENTARIO SUFICIENTE " & idPromo, Colors.red) If thisLog Then LogColor("NO HAY INVENTARIO SUFICIENTE " & idPromo, Colors.red)
@@ -1283,6 +1308,8 @@ Sub procesaPromocion(idPromo As String, cliente As String) As Map 'ignore
Log($"Promo ${idPromo} mal configurada"$) Log($"Promo ${idPromo} mal configurada"$)
ToastMessageShow($"Promo ${idPromo} mal configurada"$, True) ToastMessageShow($"Promo ${idPromo} mal configurada"$, True)
Log(LastException) Log(LastException)
' Agregamos esta línea para evitar el NullPointerException
Return CreateMap("status":"ko", "mp":Null)
End Try End Try
End Sub End Sub
@@ -1331,35 +1358,47 @@ End Sub
'Regresa cuantas promos alcanzan con los productos FIJOS que hay en inventario. 'Regresa cuantas promos alcanzan con los productos FIJOS que hay en inventario.
Sub revisaMaxPromosProdsFijosPorInventario(pm As Map) As Int Sub revisaMaxPromosProdsFijosPorInventario(pm As Map) As Int
Private thisLog As Boolean = True Private thisLog As Boolean = False
Private invFijoXpromo As Map Private invFijoXpromo As Map
Private t As List Private t As List
t.Initialize t.Initialize
t.Add(traeMaxPromos(pm)) ' Agregamos a la lista las promos maximas permitidas (recurrente, cliente y promo). 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 invFijoXpromo.Initialize
If thisLog Then LogColor($"pm=${pm}"$, Colors.Blue) If thisLog Then LogColor($" pm=${pm}"$, Colors.Blue)
Private invDispParaPromo As Map = traemosInventarioDisponibleParaPromo(pm.Get("id")) Private invDispParaPromo As Map = traemosInventarioDisponibleParaPromo(pm.Get("id"))
If thisLog Then Log($"invDispParaPromo=${invDispParaPromo}"$) If thisLog Then Log($" invDispParaPromo=${invDispParaPromo}"$)
Private prodsFijosPiezas As List = pm.Get("prodsFijosPiezas") Private prodsFijosPiezas As List = pm.Get("prodsFijosPiezas")
Private idProdsFijos As List = pm.Get("prodsFijos") 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). 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 Private thisInvDisp As Int = 0
If invDispParaPromo.Get(idProdsFijos.Get(p)) <> Null Then thisInvDisp = invDispParaPromo.Get(idProdsFijos.Get(p)) 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)}"$) 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))}"$) ' 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. 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. t.Add(x(0).As(Int)) 'Solo guardamos la parte del entero de la division. (promos por inventario)
If thisLog Then Log(">> Promos x Prods Fijos: " & x(0)) ' If thisLog Then LogColor($" ### T: ${t}"$, Colors.Green) 'promos por inventario
Log(">>>>> Monto Bonificacion: " & B4XPages.MainPage.promos.ts.traeMontoBonificacion(idProdsFijos.Get(p), pm.Get("id"))) If thisLog Then LogColor($" >>>>> PROMOS X PRODS FIJOS (${idProdsFijos.Get(p)}): ${x(0)} <<<<<"$, Colors.red)
If thisLog Then LogColor(">> Max prods fijos x Bonificaciones: " & B4XPages.MainPage.promos.ts.traeBonificacionesMaximas("bonificaciones", clienteActual, idProdsFijos.Get(p), prodsFijosPiezas.Get(p), pm.Get("id")), Colors.blue) Log($" >>>>> Monto Bonificacion FIJOS (${idProdsFijos.Get(p)}): "$ & B4XPages.MainPage.promos.ts.traeMontoBonificacion(idProdsFijos.Get(p), idProdsFijosPrecios.Get(p), pm.Get("id")))
t.Add(B4XPages.MainPage.promos.ts.traeBonificacionesMaximas("bonificaciones", clienteActual, idProdsFijos.Get(p), prodsFijosPiezas.Get(p), pm.Get("id"))) 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 Next
t.Sort(True) 'Ordenamos la lista para que en el lugar 0 este el resultao mas pequeño. 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($" prodsFijos=${idProdsFijos}"$, Colors.Blue)
If thisLog Then LogColor($"prodsFijosPiezasReq=${prodsFijosPiezas}"$, Colors.Blue) If thisLog Then LogColor($" prodsFijosPiezasReq=${prodsFijosPiezas}"$, Colors.Blue)
' If thisLog Then LogColor($"invFijoXpromo=${invFijoXpromo}"$, Colors.Blue) ' If thisLog Then LogColor($" invFijoXpromo=${invFijoXpromo}"$, Colors.Blue)
' LogColor(">>>>>> T: " & t, Colors.red) If thisLog Then LogColor(" >>>>>> T: " & t, Colors.Magenta)
If thisLog Then LogColor("Max promos x inv de prodsFijos = " & t.Get(0), Colors.red) 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. Return t.Get(0) 'Regresamos el resultado mas pequeño.
End Sub End Sub
@@ -1381,6 +1420,7 @@ Sub revisaMaxPromosProdsVariablesPorInventario(pm As Map) As Int 'ignore
Private maxPromos As String = traeMaxPromos(pm) Private maxPromos As String = traeMaxPromos(pm)
Private maxPromosXFijos As Int = revisaMaxPromosProdsFijosPorInventario(pm) Private maxPromosXFijos As Int = revisaMaxPromosProdsFijosPorInventario(pm)
Private idProdsVariables As List = pm.Get("prodsVariables") Private idProdsVariables As List = pm.Get("prodsVariables")
Private prodsVariablesPrecios As List = pm.Get("prodsVariablesPrecios")
Private prodsVariablesRequeridos As Int = pm.Get("prodsVariablesRequeridos") Private prodsVariablesRequeridos As Int = pm.Get("prodsVariablesRequeridos")
Private prodsFijosPiezas As List = pm.Get("prodsFijosPiezas") Private prodsFijosPiezas As List = pm.Get("prodsFijosPiezas")
Private idProdsFijos As List = pm.Get("prodsFijos") Private idProdsFijos As List = pm.Get("prodsFijos")
@@ -1430,12 +1470,12 @@ Sub revisaMaxPromosProdsVariablesPorInventario(pm As Map) As Int 'ignore
Log($"Este prodVariable: ${idProdsVariables.Get(i)}"$) Log($"Este prodVariable: ${idProdsVariables.Get(i)}"$)
Log($"Este invDisponible: ${invDispParaPromo.Get(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"))) ' 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, 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) ' 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)) totalProdsVariablesDisponibles = totalProdsVariablesDisponibles + invDispParaPromo.Get(idProdsVariables.Get(i))
End If End If
Next Next
If thisLog Then Log($"prodsVariablesXPresupuestoBonificaciones: ${prodsVariablesXPresupuestoBonificaciones}"$) If thisLog Then Log($"1924: ${prodsVariablesXPresupuestoBonificaciones}"$)
'Revisamos variables. 'Revisamos variables.
If thisLog Then Log($"Var disponibles - var requeridos : ${totalProdsVariablesDisponibles} - ${prodsVariablesRequeridos*x}"$) If thisLog Then Log($"Var disponibles - var requeridos : ${totalProdsVariablesDisponibles} - ${prodsVariablesRequeridos*x}"$)
totalProdsVariablesDisponibles = totalProdsVariablesDisponibles - (prodsVariablesRequeridos*x) totalProdsVariablesDisponibles = totalProdsVariablesDisponibles - (prodsVariablesRequeridos*x)
@@ -1477,6 +1517,7 @@ Sub cuantosVariablesDisponiblesDB(promo As String)
If c.GetString("CAT_GP_ALMACEN") <> Null Then x = c.GetString("CAT_GP_ALMACEN") If c.GetString("CAT_GP_ALMACEN") <> Null Then x = c.GetString("CAT_GP_ALMACEN")
Next Next
End If End If
c.Close
End If End If
Return x Return x
End Sub End Sub
@@ -1539,7 +1580,7 @@ Sub borraPedidoClienteActual As String
Log($"Borramos pedido del cliente ${traeCliente}"$) Log($"Borramos pedido del cliente ${traeCliente}"$)
Private thisC As Cursor Private thisC As Cursor
' Private tablaProds As String = "cat_gunaprod2" ' 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'") 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}"$) Log($"Registros = ${thisC.RowCount}"$)
If thisC.RowCount > 0 Then If thisC.RowCount > 0 Then
For i = 0 To thisC.RowCount - 1 For i = 0 To thisC.RowCount - 1
@@ -1553,7 +1594,8 @@ Sub borraPedidoClienteActual As String
Log("precioConDesc: " & precioConDesc) Log("precioConDesc: " & precioConDesc)
Log(">>>>>>>>>>>>> " & (precioConDesc * thisC.GetString("PE_CANT"))) Log(">>>>>>>>>>>>> " & (precioConDesc * thisC.GetString("PE_CANT")))
If Not(IsNumber(thisC.GetString("PE_CEDIS"))) Then ' Si es promo, entonces es bonificacion. 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_CEDIS")) Private desc As String = B4XPages.MainPage.promos.ts.traeMontoBonificacion(thisC.GetString("PE_PROID"), thisC.GetString("PE_COSTOU"), thisC.GetString("PE_CEDIS"))
desc = desc * thisC.GetString("PE_CANT")
Log("Regresamos bonificaciones " & thisC.GetString("PE_PROID") & "=" & desc) Log("Regresamos bonificaciones " & thisC.GetString("PE_PROID") & "=" & desc)
modTrendSpending("suma", "bonificaciones", desc) modTrendSpending("suma", "bonificaciones", desc)
Else ' Si no es promo, entonces es descuento. Else ' Si no es promo, entonces es descuento.
@@ -1668,7 +1710,7 @@ Sub guardaCambiosDeProducto(cantidad, prodNombre, prodId, precio2, query) 'ignor
a = Starter.skmt.ExecQuery("select USUARIO from usuarioa") a = Starter.skmt.ExecQuery("select USUARIO from usuarioa")
a.Position=0 a.Position=0
usuario = a.GetString("USUARIO") 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) VALUES(?,?,?,?,?,?,?,?,?,?,?) ", Array As Object ("DUR", (precio2 * -1), ((precio2/cantidad) * -1), cantidad, "CAMBIO" & prodNombre, prodId, clie_id, sDate & sTime, usuario, Starter.tipov, precio2)) 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)) Starter.skmt.ExecNonQuery2("update " & query & " set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cantidad, prodId))
End Sub End Sub
@@ -1709,7 +1751,7 @@ Sub agrupador()
' Log($"Ya imprimio=${YA_IMPRIMIO}"$) ' Log($"Ya imprimio=${YA_IMPRIMIO}"$)
Starter.skmt.ExecNonQuery("delete from pedido3") Starter.skmt.ExecNonQuery("delete from pedido3")
Starter.skmt.ExecNonQuery("UPDATE PEDIDO SET PE_FOLIO = 0 where PE_FOLIO IS NULL") 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 ) 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 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 ") 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") ' 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.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("delete from pedido WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)")
@@ -2081,11 +2123,23 @@ End Sub
' 0 si son IGUALES ' 0 si son IGUALES
' 1 si versionActual es MAYOR que versionMinima ' 1 si versionActual es MAYOR que versionMinima
Sub comparaVersiones(versionMinima As String, versionActual As String) As Int 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 partesMin() As String = Regex.Split("\.", versionMinima)
Dim partesAct() As String = Regex.Split("\.", versionActual) 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) ' Si la actual tiene MENOS partes que la mínima, es inválida (opcional)
If partesAct.Length < partesMin.Length Then If partesAct.Length < partesMin.Length Then
ToastMessageShow("Version incorrecta", False) ' ToastMessageShow("Version incorrecta", False)
LogColor("VERSION INCORRECTA", Colors.red)
Return -1 ' ← Actual no cumple el formato mínimo Return -1 ' ← Actual no cumple el formato mínimo
End If End If
' Compara solo las partes que existen en la versión mínima ' Compara solo las partes que existen en la versión mínima
@@ -2093,7 +2147,7 @@ Sub comparaVersiones(versionMinima As String, versionActual As String) As Int
Dim numMin As Int = partesMin(i) Dim numMin As Int = partesMin(i)
Dim numAct As Int = partesAct(i) Dim numAct As Int = partesAct(i)
If numAct < numMin Then If numAct < numMin Then
ToastMessageShow("Versión vieja, por favor actualizar!", False) ToastMessageShow("Versión descontinuada, por favor actualizar!", False)
Return -1 ' Actual es menor Return -1 ' Actual es menor
Else If numAct > numMin Then Else If numAct > numMin Then
Return 1 ' Actual es mayor Return 1 ' Actual es mayor
@@ -2160,7 +2214,7 @@ Sub modTrendSpending(accion As String, tipo As String, monto As String)
acumulado = d.GetString("ACUMULADO") acumulado = d.GetString("ACUMULADO")
End If End If
Log("acumulado: " & acumulado & " | monto: " & monto) Log("acumulado: " & acumulado & " | monto: " & monto)
Private c As Cursor = Starter.skmt.ExecQuery($"select HIST_TSS_TIPO, ${HIST_TSS_SEMANA} as disponible, ${HIST_TSS_SEMANA_ACUM} as acumulado from HIST_TREND_SPENDING_SEMANAL where HIST_TSS_TIPO = '${tipo.ToUpperCase}'"$) 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 accion.ToUpperCase = "RESTA" Then
If c.RowCount > 0 Then If c.RowCount > 0 Then
c.Position = 0 c.Position = 0
@@ -2359,3 +2413,120 @@ Sub revisaContrasenaHoy
' kb.HideKeyboard ' kb.HideKeyboard
' End If ' End If
End Sub 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 " & _
")"
' 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

28
B4A/_juntaBas.ps1 Normal file
View File

@@ -0,0 +1,28 @@
# SCRIPT: _juntaBas.ps1 - Versión Saneada y Optimizada para LLM
$OutputFile="_CODIGO_COMPLETO_PARA_LLM.txt"
# Eliminar el archivo anterior si existe (IMPORTANTE)
Remove-Item -Path $OutputFile -ErrorAction SilentlyContinue
Write-Host "Iniciando fusion para LLM..."
# Itera sobre los archivos .bas, .b4a, .b4j
Get-ChildItem -Path ".\*" -Include @("*.bas", "*.b4a", "*.b4j") | ForEach-Object {
$currentFile = $_.Name
Write-Host "Procesando: $currentFile"
# --- ENCABEZADO ESTRUCTURADO Y COMENTADO EN B4X (Agregado al archivo) ---
Add-Content -Path $OutputFile -Value "`n'======================================================================================"
Add-Content -Path $OutputFile -Value $"// ARCHIVO_INICIO: ${currentFile}"
Add-Content -Path $OutputFile -Value "'======================================================================================`n"
# Vuelca el contenido del archivo
Get-Content -Encoding UTF8 -Path $_.FullName -Raw | Add-Content -Path $OutputFile
# --- DELIMITADOR DE FIN DE ARCHIVO (Agregado al archivo) ---
Add-Content -Path $OutputFile -Value "`n'======================================================================================"
Add-Content -Path $OutputFile -Value $"// ARCHIVO_FIN: ${currentFile}"
Add-Content -Path $OutputFile -Value "'======================================================================================`n"
}
Write-Host "`nProceso terminado. Se ha creado el archivo: $OutputFile"

View File

@@ -100,6 +100,9 @@ Sub RD_Init
agregaColumna(rkmt, "PROMOS_COMP", "CAT_PA_PRECIO1", "TEXT") agregaColumna(rkmt, "PROMOS_COMP", "CAT_PA_PRECIO1", "TEXT")
agregaColumna(rkmt, "CAT_DETALLES_PAQ", "CAT_DP_PRECIOB", "TEXT") agregaColumna(rkmt, "CAT_DETALLES_PAQ", "CAT_DP_PRECIOB", "TEXT")
agregaColumna(rkmt, "kmt_info", "CREDITO", "INTEGER") agregaColumna(rkmt, "kmt_info", "CREDITO", "INTEGER")
agregaColumna(rkmt, "PEDIDO", "PE_ENVIADO", "INTEGER")
agregaColumna(rkmt, "PEDIDO", "PE_ARCH", "TEXT")
agregaColumna(rkmt, "PEDIDO_CLIENTE", "PC_ARCH", "TEXT")
If chkIfTableExists(khdb, "CAT_VARIABLES") Then rkmt.ExecNonQuery($"create table if not exists CAT_VARIABLES (${getTableColumnList(khdb, "CAT_VARIABLES")}, FECHA TEXT)"$) If chkIfTableExists(khdb, "CAT_VARIABLES") Then rkmt.ExecNonQuery($"create table if not exists CAT_VARIABLES (${getTableColumnList(khdb, "CAT_VARIABLES")}, FECHA TEXT)"$)
If chkIfTableExists(khdb, "CAT_RMI") Then rkmt.ExecNonQuery($"create table if not exists CAT_RMI (${getTableColumnList(khdb, "CAT_RMI")}, FECHA TEXT)"$) If chkIfTableExists(khdb, "CAT_RMI") Then rkmt.ExecNonQuery($"create table if not exists CAT_RMI (${getTableColumnList(khdb, "CAT_RMI")}, FECHA TEXT)"$)
DateTime.DateFormat = "yyyyMMdd" DateTime.DateFormat = "yyyyMMdd"
@@ -118,9 +121,7 @@ Sub revisaSiExisteRespaldo
If File.size(File.DirInternal&"/kmts", $"${name(0)}.rkmt.km"$) < 43000 And File.Exists(File.DirRootExternal & extDir, $"${name(0)}.rkmt.km"$) Then If File.size(File.DirInternal&"/kmts", $"${name(0)}.rkmt.km"$) < 43000 And File.Exists(File.DirRootExternal & extDir, $"${name(0)}.rkmt.km"$) Then
LogColor("Copiamos el respaldo desde la tarjeta!!", Colors.red) LogColor("Copiamos el respaldo desde la tarjeta!!", Colors.red)
File.Copy(File.DirRootExternal & extDir, $"${name(0)}.rkmt.km"$, File.DirInternal&"/kmts", $"${name(0)}.rkmt.km"$) File.Copy(File.DirRootExternal & extDir, $"${name(0)}.rkmt.km"$, File.DirInternal&"/kmts", $"${name(0)}.rkmt.km"$)
RD_Init RD_Init
Else Else
LogColor("No hay respaldo en tarjeta externa!", Colors.red) LogColor("No hay respaldo en tarjeta externa!", Colors.red)
End If End If
@@ -1072,6 +1073,7 @@ Sub revisaImpresa As Boolean
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)") 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 i.Position = 0
If i.GetString("CUANTOS") > 0 Then imp = True Else imp = False If i.GetString("CUANTOS") > 0 Then imp = True Else imp = False
Log($"Impresa: ${imp}"$)
Return imp Return imp
End Sub End Sub

View File

@@ -13,6 +13,11 @@ Version=12.8
' el presupuesto de bonificaciones ya se agoto, ya no aparecen promociones, o si el de descuentos se agoto, ya no se pueden agregar ' el presupuesto de bonificaciones ya se agoto, ya no aparecen promociones, o si el de descuentos se agoto, ya no se pueden agregar
' mas productos con descuento. ' mas productos con descuento.
' Descuento es TODO lo que tenga un precio diferente al precio de lista y NO esta en promo.
' Bonificacion es lo que tiene precio diferente al orginal y esta en promo y NO es regalo o exhibidor.
Sub Class_Globals Sub Class_Globals
Private EventName As String 'ignore Private EventName As String 'ignore
Private CallBack As Object 'ignore Private CallBack As Object 'ignore
@@ -29,7 +34,7 @@ Public Sub Initialize (vCallback As Object, vEventName As String, db As SQL) As
CallBack = vCallback CallBack = vCallback
tsdb = db tsdb = db
Private mx As Map = traeInfoTrendSpending Private mx As Map = traeInfoTrendSpending
' LogColor(mx, Colors.red) LogColor(mx, Colors.red)
TS_RMI = Regex.Split(",", mx.Get("RMI")) TS_RMI = Regex.Split(",", mx.Get("RMI"))
TS_DESCUENTOS = Regex.Split(",", mx.Get("DESCUENTOS")) TS_DESCUENTOS = Regex.Split(",", mx.Get("DESCUENTOS"))
TS_BONIFICACIONES = Regex.Split(",", mx.Get("BONIFICACIONES")) TS_BONIFICACIONES = Regex.Split(",", mx.Get("BONIFICACIONES"))
@@ -76,12 +81,16 @@ Sub traeInfoTrendSpending As Map
semana = c.GetInt("CAT_VA_VALOR") semana = c.GetInt("CAT_VA_VALOR")
End If End If
If semana > 0 Then If semana > 0 Then
c = tsdb.ExecQuery($"select HIST_TSS_TIPO, HIST_TSS_SEMANA${semana}, HIST_TSS_SEMANA${semana}_ACUM from HIST_TREND_SPENDING_SEMANAL"$) c = tsdb.ExecQuery($"select HIST_TSS_TIPO, HIST_TSS_SEMANA${semana}, ifnull(HIST_TSS_SEMANA${semana}_ACUM,0) as HIST_TSS_SEMANA${semana}_ACUM from HIST_TREND_SPENDING_SEMANAL"$)
Log($"select HIST_TSS_TIPO, HIST_TSS_SEMANA${semana}, ifnull(HIST_TSS_SEMANA${semana}_ACUM,0) as HIST_TSS_SEMANA${semana}_ACUM from HIST_TREND_SPENDING_SEMANAL"$)
If c.RowCount > 0 Then If c.RowCount > 0 Then
For i = 0 To c.RowCount - 1 For i = 0 To c.RowCount - 1
c.Position = i c.Position = i
HIST_TSS_SEMANA = c.GetString($"HIST_TSS_SEMANA${semana}"$) HIST_TSS_SEMANA = c.GetString($"HIST_TSS_SEMANA${semana}"$)
HIST_TSS_SEMANA_ACUM = c.GetString($"HIST_TSS_SEMANA${semana}_ACUM"$) If Not(IsNumber(HIST_TSS_SEMANA)) Then HIST_TSS_SEMANA = 0
Private xx As String = c.GetString($"HIST_TSS_SEMANA${semana}_ACUM"$)
If xx = "null" Then xx = 0
HIST_TSS_SEMANA_ACUM = xx
If c.GetString("HIST_TSS_TIPO") = "RMI" Then If c.GetString("HIST_TSS_TIPO") = "RMI" Then
m.Put("RMI", HIST_TSS_SEMANA & "," & HIST_TSS_SEMANA_ACUM) m.Put("RMI", HIST_TSS_SEMANA & "," & HIST_TSS_SEMANA_ACUM)
else if c.GetString("HIST_TSS_TIPO") = "DESCUENTOS" Then else if c.GetString("HIST_TSS_TIPO") = "DESCUENTOS" Then
@@ -97,7 +106,7 @@ End Sub
' Modifica el acumulado del Trend Speding, le "suma" o "resta" al presupuesto especificado (RMI, BONIFICACIONES o DESCUENTOS) ' 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) Sub modTrendSpending(accion As String, tipo As String, monto As String)
LogColor($"Accion: ${accion}, Tipo: ${tipo}, Monto: ${monto}"$, Colors.Blue) LogColor($"#### ACCION: ${accion}, Tipo: ${tipo}, Monto: ${monto}"$, Colors.Blue)
Private HIST_TSS_SEMANA As String Private HIST_TSS_SEMANA As String
Private HIST_TSS_SEMANA_ACUM As String Private HIST_TSS_SEMANA_ACUM As String
Private acumulado As String = "0" Private acumulado As String = "0"
@@ -110,13 +119,13 @@ Sub modTrendSpending(accion As String, tipo As String, monto As String)
End If End If
HIST_TSS_SEMANA = $"HIST_TSS_SEMANA${Starter.semana}"$ HIST_TSS_SEMANA = $"HIST_TSS_SEMANA${Starter.semana}"$
HIST_TSS_SEMANA_ACUM = $"HIST_TSS_SEMANA${Starter.semana}_ACUM"$ HIST_TSS_SEMANA_ACUM = $"HIST_TSS_SEMANA${Starter.semana}_ACUM"$
Private d As Cursor = tsdb.ExecQuery($"select acumulado from TREND_SPENDING where tipo = '${tipo.ToUpperCase}'"$) Private d As Cursor = tsdb.ExecQuery($"select ifnull(acumulado, 0) as ACUMULADO from TREND_SPENDING where tipo = '${tipo.ToUpperCase}'"$)
If d.RowCount > 0 Then If d.RowCount > 0 Then
d.Position = 0 d.Position = 0
acumulado = d.GetString("ACUMULADO") acumulado = d.GetString("ACUMULADO")
End If End If
Log("acumulado:" & acumulado & " | monto: " & monto) Log("acumulado:" & acumulado & " | monto: " & monto)
Private c As Cursor = tsdb.ExecQuery($"select HIST_TSS_TIPO, ${HIST_TSS_SEMANA} as disponible, ${HIST_TSS_SEMANA_ACUM} as acumulado from HIST_TREND_SPENDING_SEMANAL where HIST_TSS_TIPO = '${tipo.ToUpperCase}'"$) Private c As Cursor = tsdb.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}'"$)
' Log(($"select HIST_TSS_TIPO, ${HIST_TSS_SEMANA} as disponible, ${HIST_TSS_SEMANA_ACUM} as acumulado from HIST_TREND_SPENDING_SEMANAL where HIST_TSS_TIPO = '${tipo.ToUpperCase}'"$)) ' Log(($"select HIST_TSS_TIPO, ${HIST_TSS_SEMANA} as disponible, ${HIST_TSS_SEMANA_ACUM} as acumulado from HIST_TREND_SPENDING_SEMANAL where HIST_TSS_TIPO = '${tipo.ToUpperCase}'"$))
Log("---- " & c.RowCount) Log("---- " & c.RowCount)
If accion.ToUpperCase = "RESTA" Then If accion.ToUpperCase = "RESTA" Then
@@ -221,6 +230,7 @@ Sub trendSpending(accion As String, tipo As String, clienteId As String, id As S
If logger Then Log($"lacant=${laCant} < lasMaximas=${lasMaximas} = ${laCant<lasMaximas}"$) If logger Then Log($"lacant=${laCant} < lasMaximas=${lasMaximas} = ${laCant<lasMaximas}"$)
If laCant < lasMaximas Then If laCant < lasMaximas Then
modTrendSpending("resta", "rmi", elMonto) ' Restamos al presupuesto de hoy (agregamos al acumulado). modTrendSpending("resta", "rmi", elMonto) ' Restamos al presupuesto de hoy (agregamos al acumulado).
Log($"modTrendSpending("resta", "rmi", ${elMonto})"$)
End If End If
If logger Then LogColor("RMI RESTANTES: " & (TS_RMI(0) - TS_RMI(1) - traeAcumuladoHoyTS("rmi")), Colors.red) If logger Then LogColor("RMI RESTANTES: " & (TS_RMI(0) - TS_RMI(1) - traeAcumuladoHoyTS("rmi")), Colors.red)
Return lasMaximas & "|" & elMonto Return lasMaximas & "|" & elMonto
@@ -228,6 +238,7 @@ Sub trendSpending(accion As String, tipo As String, clienteId As String, id As S
If logger Then Log("LaCANT= " & laCant & ", elMonto= " & elMonto) If logger Then Log("LaCANT= " & laCant & ", elMonto= " & elMonto)
If laCant >= 0 Then If laCant >= 0 Then
modTrendSpending("suma", "rmi", elMonto) ' Agregamos al presupuesto de hoy (restamos del acumulado). modTrendSpending("suma", "rmi", elMonto) ' Agregamos al presupuesto de hoy (restamos del acumulado).
Log($"modTrendSpending("suma", "rmi", ${elMonto})"$)
End If End If
Return lasMaximas & "|" & elMonto Return lasMaximas & "|" & elMonto
End If End If
@@ -324,44 +335,66 @@ End Sub
' Trae la cantidad máxima de productos con bonificacion por presupuesto. ' Trae la cantidad máxima de productos con bonificacion por presupuesto.
' Si el presupuesto es 10 y la bonificacion del producto es 2, el máximo es 5 productos. ' Si el presupuesto es 10 y la bonificacion del producto es 2, el máximo es 5 productos.
Sub traeBonificacionesMaximas(tipo As String, clienteId As String, id As String, laCant As String, promoId As String) As Int Sub traeBonificacionesMaximas(tipo As String, clienteId As String, id As String, laCant As String, elPrecioVenta As String, promoId As String) As Int
Private tsMaximas As Int = 10000000 Private thisLog As Boolean = True
Private tsMaximas As Int = 100000000
Private tsRestantes As String = 0 Private tsRestantes As String = 0
Private tsMonto As String Private tsMonto As String
LogColor($"Presupuesto: ${TS_BONIFICACIONES(0)} - Acumulado ayer: ${TS_BONIFICACIONES(1)} - Hoy: ${traeAcumuladoHoyTS("bonificaciones")}"$, Colors.Red)
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 thisLog Then LogColor($" ============ INICIA BONIFICACIONES MAXIMAS (${id}) ========"$, Colors.RGB(0,197,110))
If thisLog Then LogColor($" Presupuesto: ${TS_BONIFICACIONES(0)} - Acumulado ayer: ${TS_BONIFICACIONES(1)} - Hoy: ${traeAcumuladoHoyTS("bonificaciones")}"$, Colors.Magenta)
If tipo.ToUpperCase = "BONIFICACIONES" Then If tipo.ToUpperCase = "BONIFICACIONES" Then
tsMonto = NumberFormat2(traeMontoBonificacion(id, promoId), 1, 2, 2, False) tsMonto = NumberFormat2(traeMontoBonificacion(id, elPrecioVenta, promoId), 1, 2, 2, False)
tsRestantes = (TS_BONIFICACIONES(0) - TS_BONIFICACIONES(1) - traeAcumuladoHoyTS("bonificaciones")) ' Traemos monto restante de Trend Spending para bonificaciones. tsRestantes = (TS_BONIFICACIONES(0) - TS_BONIFICACIONES(1) - traeAcumuladoHoyTS("bonificaciones")) ' Traemos monto restante de Trend Spending para bonificaciones.
Log($" PresupuestoBonifs: ${TS_BONIFICACIONES(0)}, AcumuladoBonifs: ${TS_BONIFICACIONES(1)}, traeAcumuladoHoyTS('bonificaciones'): ${traeAcumuladoHoyTS("bonificaciones")}"$)
' Log($" ${TS_BONIFICACIONES(0)} - ${TS_BONIFICACIONES(1)} - ${traeAcumuladoHoyTS("bonificaciones")}"$)
End If End If
Log($"Monto de bonificacion: ${tsMonto}"$) If thisLog Then Log($" Monto de bonificacion: ${tsMonto}"$)
Log($"Presupuesto disponible: ${tsRestantes}"$) If thisLog Then Log($" Presupuesto disponible: ${tsRestantes}"$)
Log($"Cantidad: ${laCant}"$) ' If thisLog Then Log($"Cantidad: ${laCant}"$)
Log($"Floor(tsRestantes / (tsMonto * laCant))= ${Floor(tsRestantes / (tsMonto * laCant))}"$) If thisLog Then Log($" Floor(tsRestantes / (tsMonto * laCant)) <==> Floor(${tsRestantes} / (${tsMonto} * ${laCant})) = ${Floor(tsRestantes / (tsMonto * laCant))}"$)
' If thisLog Then Log($"Floor(${tsRestantes} / (${tsMonto} * ${laCant}))= ${Floor(tsRestantes / (tsMonto * laCant))}"$)
If tsMonto > 0 Then If tsMonto > 0 Then
tsMaximas = Floor(tsRestantes / (tsMonto * laCant)) tsMaximas = Floor(tsRestantes / (tsMonto * laCant))
End If End If
Log(">>> tsMaximas: " & tsMaximas) If thisLog Then LogColor(" ************************************************", Colors.red)
If thisLog Then LogColor(" ***** BONIFICACIONES MAXIMAS: " & tsMaximas & " *****", Colors.red)
If thisLog Then LogColor(" ************************************************", Colors.red)
If thisLog Then LogColor(" ============ TERMINA BONIFICACIONNES MAXIMAS ========", Colors.RGB(0,197,110))
Return tsMaximas Return tsMaximas
End Sub End Sub
' Trae el monto de la bonificacion, que es el precio original MENOS el precio de venta con descuento. ' Trae el monto de la bonificacion, que es el precio original MENOS el precio de venta con descuento.
' - Si CAT_DP_PRECIOB es 1, la bonificacion es: Precio original - precio de venta. ' - Si CAT_DP_PRECIOB es 1, la bonificacion es: Precio original - precio de venta.
' - Si CAT_DP_PRECIOB es 0, la bonificacion es: Precio original. ' - Si CAT_DP_PRECIOB es 0, la bonificacion es: Precio original.
Sub traeMontoBonificacion(id As String, promoId As String) As String Sub traeMontoBonificacion(id As String, precio As String, promoId As String) As String
' Log(promoId) Private thisLog As Boolean = True
If thisLog Then LogColor($" ============ INICIA MONTO BONIFICACION (${id}) ========"$, Colors.RGB(151,0,171))
If thisLog Then LogColor($" ###### ${promoId}, ${precio}, ${id}"$, Colors.Magenta)
Private tsMonto As String = 0 Private tsMonto As String = 0
Private c As Cursor = tsdb.ExecQuery($"SELECT CAT_DP_ID, CAT_DP_IDPROD, CAT_DP_PRECIO, CAT_DP_TIPO, CAT_GP_PRECIO, CAT_DP_PRECIOB FROM CAT_DETALLES_PAQ join ${traeTablaProds(Starter.tipov)} on CAT_GP_ID = CAT_DP_IDPROD where CAT_GP_ID = '${id}' and CAT_DP_ID = '${promoId}'"$) Private re As Cursor = Starter.skmt.ExecQuery($"select cat_gp_id from cat_gunaprod2 where (cat_gp_tipo like 'REGALO%' or cat_gp_tipo like 'EXHIBIDOR%') and cat_gp_id = '${id}'"$) ' Revisamos si el producto es regalo o exhibidor.
If c.RowCount > 0 Then If re.RowCount = 0 Then' No es regalo ni exhibidor.
c.Position = 0 Private c As Cursor = tsdb.ExecQuery($"SELECT CAT_DP_ID, CAT_DP_IDPROD, CAT_DP_PRECIO, CAT_DP_TIPO, CAT_GP_PRECIO, CAT_DP_PRECIOB FROM CAT_DETALLES_PAQ join ${traeTablaProds(Starter.tipov)} on CAT_GP_ID = CAT_DP_IDPROD where CAT_GP_ID = '${id}' and CAT_DP_PRECIO = '${precio}' and CAT_DP_ID = '${promoId}'"$)
If c.GetInt("CAT_DP_PRECIOB") = 1 Then ' Log($"SELECT CAT_DP_ID, CAT_DP_IDPROD, CAT_DP_PRECIO, CAT_DP_TIPO, CAT_GP_PRECIO, CAT_DP_PRECIOB FROM CAT_DETALLES_PAQ join ${traeTablaProds(Starter.tipov)} on CAT_GP_ID = CAT_DP_IDPROD where CAT_GP_ID = '${id}' and CAT_DP_PRECIO = '${precio}' and CAT_DP_ID = '${promoId}'"$)
tsMonto = c.GetString("CAT_GP_PRECIO") - c.GetString("CAT_DP_PRECIO") ' Precio original - precio de venta. If thisLog Then Log($" Rowcount DP y CGP2: ${c.RowCount}"$)
Else If c.RowCount > 0 Then
tsMonto = c.GetString("CAT_GP_PRECIO") ' Precio original. c.Position = 0
End If If c.GetInt("CAT_DP_PRECIOB") = 1 Or (c.GetInt("CAT_DP_PRECIOB") = 0 And c.GetString("CAT_GP_PRECIO") = c.GetString("CAT_DP_PRECIO")) Then
tsMonto = c.GetString("CAT_GP_PRECIO") - c.GetString("CAT_DP_PRECIO") ' Precio original - precio de venta.
Else
tsMonto = c.GetString("CAT_GP_PRECIO") ' Precio original.
End If
' Log("PRECIOB: " & c.GetInt("CAT_DP_PRECIOB")) ' Log("PRECIOB: " & c.GetInt("CAT_DP_PRECIOB"))
' Log($"Precio normal: ${c.GetString("CAT_GP_PRECIO")}, Precio desc: ${c.GetString("CAT_DP_PRECIO")}, Monto bonificacion: ${tsMonto}"$) If thisLog Then Log($" Precio normal: ${c.GetString("CAT_GP_PRECIO")}, Precio desc: ${c.GetString("CAT_DP_PRECIO")}, Monto bonificacion: ${tsMonto}"$)
End If End If
' Log("ROWCOUNT: " & c.RowCount) ' Log("ROWCOUNT: " & c.RowCount)
End If
If thisLog Then LogColor($" ============ TERMINA MONTO BONIFICACION ========"$, Colors.RGB(151,0,171))
Return tsMonto Return tsMonto
End Sub End Sub
@@ -373,7 +406,7 @@ End Sub
' se agoto el presupuesto. ' se agoto el presupuesto.
' Aunque si hay suficiente para mostrar algunas promos ... pues que si las muestre. ' Aunque si hay suficiente para mostrar algunas promos ... pues que si las muestre.
Sub maxPromosPorProdsVariables(idProdsVariables As List, promo As String)As Int Sub maxPromosPorProdsVariables(idProdsVariables As List, promo As String)As Int
Private logger As Boolean = True Private logger As Boolean = False
Private Maxs As Int = 10000000 Private Maxs As Int = 10000000
Private prodsVariablesXPresupuestoBonificaciones As List Private prodsVariablesXPresupuestoBonificaciones As List
Private prodsVariablesRequeridos As Int = traeProdsVariablesRequeridos(promo) Private prodsVariablesRequeridos As Int = traeProdsVariablesRequeridos(promo)
@@ -382,8 +415,8 @@ Sub maxPromosPorProdsVariables(idProdsVariables As List, promo As String)As Int
For i = 0 To idProdsVariables.Size - 1 'Obtenemos total de productos variables disponibes. For i = 0 To idProdsVariables.Size - 1 'Obtenemos total de productos variables disponibes.
If logger Then LogColor($"=>> prodVariable ${i} : ${idProdsVariables.Get(i)}, ${Subs.traeProdNombre(idProdsVariables.Get(i))} <<=="$, Colors.blue) If logger Then LogColor($"=>> prodVariable ${i} : ${idProdsVariables.Get(i)}, ${Subs.traeProdNombre(idProdsVariables.Get(i))} <<=="$, Colors.blue)
' Log($"Este invDisponible: ${invDispParaPromo.Get(idProdsVariables.Get(i))}"$) ' Log($"Este invDisponible: ${invDispParaPromo.Get(idProdsVariables.Get(i))}"$)
If logger Then Log(">> Monto Bonificacion: " & traeMontoBonificacion(idProdsVariables.Get(i), promo)) If logger Then Log(">> Monto Bonificacion: " & traeMontoBonificacion(idProdsVariables.Get(i), 1, promo))
Private maxProds As Int = traeBonificacionesMaximas("bonificaciones", traeCliente, idProdsVariables.Get(i), prodsVariablesRequeridos, promo) Private maxProds As Int = traeBonificacionesMaximas("bonificaciones", traeCliente, idProdsVariables.Get(i), prodsVariablesRequeridos, 1, promo)
prodsVariablesXPresupuestoBonificaciones.Add(maxProds) prodsVariablesXPresupuestoBonificaciones.Add(maxProds)
Next Next
prodsVariablesXPresupuestoBonificaciones.Sort(True) prodsVariablesXPresupuestoBonificaciones.Sort(True)