mirror of
https://github.com/KeymonSoft/Kelloggs_v4.git
synced 2026-04-18 02:29:13 +00:00
Compare commits
24 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 10a2c84997 | |||
| af1f4b9ead | |||
| af9ea44b95 | |||
| 426e8b0c87 | |||
| 5124f6c5a1 | |||
| 4e69087ff2 | |||
| 4a5fc4dd05 | |||
| 64a80661e8 | |||
| 96838bf61b | |||
| 7e19a197a1 | |||
| 64e9e6b389 | |||
| 63df3fbf39 | |||
| e72a1381d5 | |||
| 367ff75966 | |||
| 2ec2e9acb3 | |||
| 246437fc98 | |||
| 67e0b906dc | |||
| d7e6643f15 | |||
| cc5261c67f | |||
| cc36c6c1da | |||
| 441fe0c5fb | |||
| 136df88646 | |||
| f0116e375d | |||
| 409c224820 |
@@ -18,8 +18,11 @@ Version=9.85
|
||||
'###################### PUSH TORTOISE GIT #########################################################
|
||||
'Ctrl + click ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=TortoiseGitProc&Args=/command:commit&Args=/path:"./../../"&Args=/closeonend:2
|
||||
'###########################################################################################################
|
||||
'###################### PUSH TORTOISE GIT CON TAG ##################################################
|
||||
'Ctrl + clic para Git: ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=-ExecutionPolicy&Args=Bypass&Args=-File&Args=..\_git_tag.ps1&Args=%22%PROJECT%%22&Args=%22%PROJECT_NAME%%22
|
||||
'###########################################################################################################
|
||||
#End Region
|
||||
|
||||
|
||||
'Ctrl + click ide://run?file=%WINDIR%\System32\cmd.exe&Args=/c&Args=github&Args=..\..\
|
||||
|
||||
Sub Class_Globals
|
||||
@@ -121,6 +124,7 @@ Sub Class_Globals
|
||||
Private Label4 As Label
|
||||
Private clicked As Int = 0
|
||||
Dim linker As C_deviceLinker
|
||||
Dim aud As C_Auditoria
|
||||
End Sub
|
||||
|
||||
Public Sub Initialize
|
||||
@@ -189,6 +193,10 @@ Private Sub B4XPage_Created (Root1 As B4XView)
|
||||
kh.agregaColumna(Starter.skmt, "CAT_GUNAPROD2", "CAT_GP_PROMOCION", "TEXT")
|
||||
kh.agregaColumna(Starter.skmt, "TREND_SPENDING", "TIPO", "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")
|
||||
aud.Initialize(Starter.skmt)
|
||||
Root = Root1
|
||||
' Root.LoadLayout("MainPage")
|
||||
Root.LoadLayout("login")
|
||||
@@ -406,6 +414,7 @@ End Sub
|
||||
|
||||
Sub B4XPage_Appear
|
||||
Log(">>>>>> APPEAR - INICIAMOS MAIN PAGE <<<<<<<<<")
|
||||
aud.guarda($"Entrada a Login"$)
|
||||
linker.Initialize(Me, "Linker", True)
|
||||
clicked = 0
|
||||
If Not(MES1.IsInitialized) Then MES1.Initialize(Me, "MES1")
|
||||
|
||||
80
B4A/C_Auditoria.bas
Normal file
80
B4A/C_Auditoria.bas
Normal file
@@ -0,0 +1,80 @@
|
||||
B4A=true
|
||||
Group=Default Group
|
||||
ModulesStructureVersion=1
|
||||
Type=Class
|
||||
Version=12.8
|
||||
@EndOfDesignText@
|
||||
Sub Class_Globals
|
||||
Private Root As B4XView 'ignore
|
||||
Private xui As XUI 'ignore
|
||||
Dim audb As SQL
|
||||
Dim ruta As String = File.DirInternal
|
||||
End Sub
|
||||
|
||||
'You can add more parameters here.
|
||||
Public Sub Initialize(db As SQL) As Object
|
||||
If Not(audb.IsInitialized) Then audb.Initialize(ruta,"kmt.db", True)
|
||||
audb = db
|
||||
audb.ExecNonQuery("CREATE TABLE IF NOT EXISTS auditoria(almacen text, ruta text, usuario text, cliente text, evento text, fecha text, lat text, lon text)")
|
||||
Return Me
|
||||
End Sub
|
||||
|
||||
'This event will be called once, before the page becomes visible.
|
||||
Private Sub B4XPage_Created (Root1 As B4XView)
|
||||
Root = Root1
|
||||
'load the layout to Root
|
||||
End Sub
|
||||
|
||||
'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.
|
||||
|
||||
Sub guarda(evento As String)
|
||||
DateTime.DateFormat = "yyyy-MM-dd HH:mm:ss"
|
||||
audb.ExecNonQuery2("insert into auditoria (almacen, ruta, usuario, cliente, evento, fecha, lat, lon) values (?, ?, ?, ?, ?, ?, ?, ?)", Array As String(traeAlmacen, traeRuta, traeUsuarioDeBD, traeCliente, evento, DateTime.Date(DateTime.Now)))
|
||||
End Sub
|
||||
|
||||
'Regresa el almacen actual de la base de datos.
|
||||
Sub traeAlmacen As String 'ignore
|
||||
Private c As Cursor
|
||||
Private a As String
|
||||
c = audb.ExecQuery("select ID_ALMACEN from CAT_ALMACEN")
|
||||
c.Position = 0
|
||||
a = C.GetString("ID_ALMACEN")
|
||||
c.Close
|
||||
Return a
|
||||
End Sub
|
||||
|
||||
'Regresa la ruta actual de la base de datos.
|
||||
Sub traeRuta As String 'ignore
|
||||
Private c As Cursor
|
||||
Private r As String
|
||||
c = audb.ExecQuery("select CAT_CL_RUTA from kmt_info limit 1")
|
||||
r = "0"
|
||||
If c.RowCount > 0 Then
|
||||
c.Position=0
|
||||
r = c.GetString("CAT_CL_RUTA")
|
||||
End If
|
||||
c.Close
|
||||
Return r
|
||||
End Sub
|
||||
|
||||
'Regresa el usuario de la tabla USUARIOA
|
||||
Sub traeUsuarioDeBD As String 'ignore
|
||||
Private c As Cursor
|
||||
Private u As String = "SinUsuario"
|
||||
c = audb.ExecQuery("select USUARIO from usuarioa")
|
||||
c.Position=0
|
||||
If c.RowCount > 0 Then u = c.GetString("USUARIO")
|
||||
c.Close
|
||||
Return u
|
||||
End Sub
|
||||
|
||||
'Trae el cliente de CUENTAA
|
||||
Sub traeCliente As String 'ignore
|
||||
Private c As Cursor
|
||||
Private cl As String
|
||||
c = audb.ExecQuery("Select CUENTA from cuentaa")
|
||||
c.Position = 0
|
||||
cl = c.GetString("CUENTA")
|
||||
c.Close
|
||||
Return cl
|
||||
End Sub
|
||||
@@ -300,6 +300,7 @@ Sub Class_Globals
|
||||
Private l_notificacionTexto As Label
|
||||
Private l_notificacionTitulo As Label
|
||||
Private b_notificacion As Button
|
||||
Dim reqManagerW As DBRequestManagerW
|
||||
End Sub
|
||||
|
||||
'You can add more parameters here.
|
||||
@@ -408,6 +409,7 @@ End Sub
|
||||
'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.
|
||||
|
||||
Sub B4XPage_Appear
|
||||
B4XPages.MainPage.aud.guarda($"Entrada a Cliente"$)
|
||||
indicePregunta = 0
|
||||
b_noVenta.Enabled = False
|
||||
Log("NoVenta False")
|
||||
@@ -416,7 +418,7 @@ Sub B4XPage_Appear
|
||||
clienteId = kh.traeCliente
|
||||
P_DOE.Visible = False
|
||||
dentroDeGeocerca = False
|
||||
|
||||
|
||||
' Log($"TOTAL VENTA: ${kh.traeTotalCliente}"$)
|
||||
B_VENTA.Visible = False
|
||||
b_noVenta.Visible = False
|
||||
@@ -426,11 +428,12 @@ Sub B4XPage_Appear
|
||||
' Log(Starter.rp.Check("android.permission.BLUETOOTH_CONNECT"))
|
||||
|
||||
reqManager.Initialize(Me, Starter.DBReqServer)
|
||||
reqManagerW.Initialize
|
||||
usarGeocerca = kh.traeUsarGeocerca
|
||||
|
||||
|
||||
'Para el almacen 12 (GDL) no se usa la geocerca
|
||||
' If kh.traeAlmacen = 12 Then usarGeocerca = False
|
||||
|
||||
|
||||
' Log(Subs.traeUltimaActividadBD)
|
||||
c = Starter.skmt.ExecQuery2("select CAT_VA_VALOR from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("MACIMP"))
|
||||
c.Position = 0
|
||||
@@ -499,10 +502,8 @@ Sub B4XPage_Appear
|
||||
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")
|
||||
l_atiende2.Text = c.GetString("CAT_CL_ATIENTE2")
|
||||
|
||||
l_segmento2.text = "N/A"
|
||||
If c.GetString("CAT_CL_SEGMENTO") <> Null Then l_segmento2.text = c.GetString("CAT_CL_SEGMENTO")
|
||||
|
||||
b_inicioFinVenta.Text = "INICIAR VENTA"
|
||||
b_inicioFinVenta.BringToFront
|
||||
' LogColor(">>>>>> EN VENTA: " & Starter.enVenta, Colors.red)
|
||||
@@ -514,7 +515,7 @@ Sub B4XPage_Appear
|
||||
b_inicioFinVenta.Visible = False
|
||||
End If
|
||||
' LogColor(">>>>>> EN VENTA: " & Starter.enVenta, Colors.red)
|
||||
|
||||
|
||||
' LONGITUD = 0
|
||||
' If c.GetString("CAT_CL_LONG") <> Null And c.GetString("CAT_CL_LONG") <> "null" And IsNumber(c.GetString("CAT_CL_LONG")) Then LONGITUD = c.GetString("CAT_CL_LONG")
|
||||
' LATITUD = 0
|
||||
@@ -845,6 +846,19 @@ Sub B4XPage_Appear
|
||||
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
|
||||
|
||||
Sub Printer1_Connected (Success As Boolean)
|
||||
@@ -1007,6 +1021,7 @@ Sub DATOS_Click
|
||||
End Sub
|
||||
|
||||
Sub Guardar_Click
|
||||
B4XPages.MainPage.aud.guarda($"Guarda Venta Cliente"$)
|
||||
DateTime.DateFormat = "MM/dd/yyyy"
|
||||
sDate=DateTime.Date(DateTime.Now)
|
||||
sTime=DateTime.Time(DateTime.Now)
|
||||
@@ -1027,7 +1042,7 @@ Sub Guardar_Click
|
||||
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)")
|
||||
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")
|
||||
Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)")
|
||||
End If
|
||||
@@ -1069,6 +1084,8 @@ Sub Guardar_Click
|
||||
b_inicioFinVenta.Text = "TERMINAR VENTA"
|
||||
Log("RESPALDO")
|
||||
kh.RD_respaldoBatch
|
||||
|
||||
' Subir_Pedido_Con_Integridad(clie_id)
|
||||
|
||||
mandaPendientes
|
||||
|
||||
@@ -1085,8 +1102,9 @@ Sub Guardar_Click
|
||||
End Sub
|
||||
|
||||
Sub mandaPendientes
|
||||
B4XPages.MainPage.principal.enviaPedido(Null)
|
||||
B4XPages.MainPage.principal.enviaPedidoCliente(Null)
|
||||
' B4XPages.MainPage.principal.enviaPedido(Null)
|
||||
' B4XPages.MainPage.principal.enviaPedidoCliente(Null)
|
||||
B4XPages.MainPage.principal.enviaPedidoBatch(Null)
|
||||
End Sub
|
||||
|
||||
Sub NUEVO_Click
|
||||
@@ -1202,7 +1220,7 @@ Sub B_IMP_Click
|
||||
a_VENTA_F = 0
|
||||
End If
|
||||
C4.Close
|
||||
|
||||
|
||||
C4=Starter.skmt.ExecQuery2("select count(*) as CUANTOS from pedido where substr(pe_pronombre,1,6) = ? AND PE_PROID = ? ", Array As String("CAMBIO", s.GetString("CAT_GP_ID")))
|
||||
C4.Position=0
|
||||
If C4.GetString("CUANTOS") > 0 Then
|
||||
@@ -4472,4 +4490,135 @@ Private Sub b_notificacion_Click
|
||||
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
|
||||
@@ -50,6 +50,7 @@ End Sub
|
||||
'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.
|
||||
|
||||
Sub B4XPage_Appear
|
||||
B4XPages.MainPage.aud.guarda("Entrada a Historico")
|
||||
L_CANT.Text =""
|
||||
L_TOTAL.Text=""
|
||||
c=Starter.skmt.ExecQuery("select count(*) as EXISTE from HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa)")
|
||||
|
||||
@@ -54,6 +54,7 @@ End Sub
|
||||
'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.
|
||||
|
||||
Sub B4XPage_Appear
|
||||
B4XPages.MainPage.aud.guarda("Entrada a Mapas")
|
||||
GPS.Initialize("GPS")
|
||||
Log(1)
|
||||
rp.CheckAndRequest(rp.PERMISSION_ACCESS_FINE_LOCATION)
|
||||
|
||||
@@ -46,6 +46,7 @@ End Sub
|
||||
'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.
|
||||
|
||||
Sub B4XPage_Appear
|
||||
B4XPages.MainPage.aud.guarda("Entrada a No Venta")
|
||||
e_comm.Text=""
|
||||
lat_gps = 0
|
||||
lon_gps = 0
|
||||
@@ -86,6 +87,7 @@ Sub GUARDA_Click
|
||||
Else
|
||||
motivo = "NO ESTA EL ENCARGADO"
|
||||
End If
|
||||
B4XPages.MainPage.aud.guarda($"Guarda No Venta: ${motivo}"$)
|
||||
usuario = Subs.traeUsuarioDeBD
|
||||
If B4XPages.MainPage.cliente.IsInitialized Then
|
||||
B4XPages.MainPage.cliente.motivoNoVenta = motivo
|
||||
|
||||
@@ -99,6 +99,7 @@ End Sub
|
||||
'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.
|
||||
|
||||
Sub B4XPage_Appear
|
||||
B4XPages.MainPage.aud.guarda("Entrada a Nota")
|
||||
If kh.clienteConDOE And l_tipoPedido.IsInitialized Then
|
||||
l_tipoPedido.Visible = True
|
||||
Else
|
||||
@@ -265,6 +266,7 @@ Sub borra_Click
|
||||
If folio = "0" Or 1 = 1 Then 'Si el folio es 0 o el cliente actual es "abordo", los deja borrar. - Mod por CHV 220512 'Para que el abordo borre siempre agregar -> " Or Subs.clienteActual = "0""
|
||||
result = Msgbox2($"¿Seguro que desea borrar el pedido${textoExtra}?"$,"Cancelar pedido", "Si", "", "No", LoadBitmap(File.DirAssets,"alert2.png")) 'ignore
|
||||
If result = DialogResponse.POSITIVE Then
|
||||
B4XPages.MainPage.aud.guarda($"Borrar Nota Ok"$)
|
||||
' c = Starter.skmt.ExecQuery("select PE_PROID, PE_CANT, PE_TIPO, PE_CEDIS FROM PEDIDO where pe_cliente in (Select CUENTA from cuentaa) ")
|
||||
' If c.RowCount>0 Then
|
||||
' For i=0 To c.RowCount -1
|
||||
|
||||
@@ -51,6 +51,7 @@ End Sub
|
||||
'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.
|
||||
|
||||
Sub B4XPage_Appear
|
||||
B4XPages.MainPage.aud.guarda("Entrada a NuevoCliente")
|
||||
b_guardar.Visible = False
|
||||
b_guardar.Enabled = False
|
||||
permitirCtesNuevos = True
|
||||
|
||||
@@ -309,6 +309,10 @@ Private Sub B4XPage_Created (Root1 As B4XView)
|
||||
kh.centraPanel(Panel2, Root.Width)
|
||||
kh.centraPanel(Panel1, Root.Width)
|
||||
kh.centraPanel(p_botonesResumen, Root.Width)
|
||||
p_transparente.Top = 0 : p_transparente.left = 0
|
||||
p_transparente.Height = Root.Height : p_transparente.Width = Root.Width
|
||||
' PNL_ACCESO.Top = 0 : PNL_ACCESO.left = 0
|
||||
' PNL_ACCESO.Height = Root.Height : PNL_ACCESO.Width = Root.Width
|
||||
' kh.centraPanel(Panel7, Root.Width)
|
||||
' kh.centraPanel(PNL_ACCESO, Root.Width)
|
||||
|
||||
@@ -324,6 +328,7 @@ End Sub
|
||||
'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.
|
||||
|
||||
Sub B4XPage_Appear
|
||||
B4XPages.MainPage.aud.guarda("Entrada a Principal")
|
||||
' Log(Subs.traeDiaSemana)
|
||||
linker.Initialize(Me, "Linker", True)
|
||||
Starter.errorConnDBReq = False
|
||||
@@ -564,7 +569,7 @@ Sub B4XPage_Appear
|
||||
NUEVO.Enabled = True
|
||||
B_PROXIMA.Enabled = True
|
||||
End If
|
||||
|
||||
|
||||
'############# Deshabilitamos botones para validacion de ruta y vinculo #########
|
||||
c = Starter.skmt.ExecQuery("select count(*) as cuantos from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = 'LIGADO' and CAT_VA_VALOR = 1")
|
||||
c.Position = 0
|
||||
@@ -1870,6 +1875,19 @@ Sub JobDone(Job As HttpJob)
|
||||
PB2.Progress = 100
|
||||
S_CP.Text = "VALIDANDO"
|
||||
End If
|
||||
|
||||
If RESULT.Tag.As(String).StartsWith("pedido_completo_") Then 'query tag
|
||||
For Each records() As Object In RESULT.Rows
|
||||
Private temp() As String = Regex.Split("_", RESULT.Tag)
|
||||
' Log(temp(2))
|
||||
If temp.Length > 1 Then
|
||||
Starter.skmt.ExecNonQuery($"update pedido_cliente set pc_enviado = 1 where pc_cliente = '${temp(2)}'"$)
|
||||
Log($"update pedido_cliente set pc_enviado = 1 where pc_cliente = '${temp(2)}'"$)
|
||||
Starter.skmt.ExecNonQuery($"update pedido set pe_enviado = 1 where pe_cliente = '${temp(2)}'"$)
|
||||
Log($"update pedido set pe_enviado = 1 where pe_cliente = '${temp(2)}'"$)
|
||||
End If
|
||||
Next
|
||||
End If
|
||||
|
||||
If RESULT.Tag = "version" Then 'query tag
|
||||
connecta.TextColor = Colors.White
|
||||
@@ -2508,6 +2526,7 @@ Private Sub connecta_LongClick
|
||||
'' End If
|
||||
' Log("MANDAMOS BITACORA")
|
||||
If e_ruta.Text = "KMTKLL1" Then Subs.deshabilitaValidaciones
|
||||
' B4XPages.MainPage.recordatorio.agregaPanelRecordatorio(Root)
|
||||
End Sub
|
||||
|
||||
Sub BUSCA_Click
|
||||
@@ -2559,6 +2578,7 @@ Sub e_ruta_EnterPressed
|
||||
Starter.skmt.ExecNonQuery("delete from TREND_SPENDING")
|
||||
Starter.skmt.ExecNonQuery("delete from HIST_TREND_SPENDING_SEMANAL")
|
||||
Starter.skmt.ExecNonQuery("delete from VERSIONES")
|
||||
Starter.skmt.ExecNonQuery("delete from auditoria")
|
||||
|
||||
Starter.skmt.ExecNonQuery2("INSERT INTO HIST_ENVIOS VALUES (?,0,?)", Array As Object(sTime, "PEDIDO"))
|
||||
Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("NUMERO_PEDIDO"))
|
||||
@@ -2811,6 +2831,7 @@ Sub B_OK_RES_Click
|
||||
End Sub
|
||||
|
||||
Sub Resumen_Click
|
||||
B4XPages.MainPage.aud.guarda("Entrada a resumenDia")
|
||||
Log("###############")
|
||||
L_ABORDO.Text = "0"
|
||||
P_RESUMEN.Visible = True
|
||||
@@ -3270,7 +3291,7 @@ Sub SUBIR_INFO_PEDIDO
|
||||
If d.GetString("MONTO") <> Null And d.GetString("MONTO") <> "" Then monto1 = d.GetString("MONTO")
|
||||
Private abordo1 As String = L_ABORDO.Text
|
||||
If abordo1 = "" Then abordo1 = "0"
|
||||
Log($"${monto1}, ${abordo1}"$)
|
||||
' Log($"${monto1}, ${abordo1}"$)
|
||||
monto1 = monto1 - abordo1
|
||||
|
||||
reqManager.trackInit
|
||||
@@ -3280,7 +3301,7 @@ Sub SUBIR_INFO_PEDIDO
|
||||
cmd.Name ="insert_drop2_KELL"
|
||||
cmd.Parameters = Array As Object(usuario, l_ruta.Text, fecha, l_porvisitar.Text, l_drop.Text, l_efectiva.Text, l_cuantosc.Text, l_cuantosn.Text, monto1, "ENVIO", ALMACEN, abordo1)
|
||||
reqManager.ExecuteCommand(cmd , "inst_noventa_ins_drop_kell")
|
||||
Log($"${usuario}, ${l_ruta.Text}, ${fecha}, ${l_porvisitar.Text}, ${l_drop.Text}, ${l_efectiva.Text}, ${l_cuantosc.Text}, ${l_cuantosn.Text}, ${monto1}, "ENVIO", ${ALMACEN}, ${abordo1}"$)
|
||||
' Log($"${usuario}, ${l_ruta.Text}, ${fecha}, ${l_porvisitar.Text}, ${l_drop.Text}, ${l_efectiva.Text}, ${l_cuantosc.Text}, ${l_cuantosn.Text}, ${monto1}, "ENVIO", ${ALMACEN}, ${abordo1}"$)
|
||||
Log("################## inst_noventa_ins_drop_kell")
|
||||
img2.Visible =True
|
||||
contador_env = contador_env + 1
|
||||
@@ -3383,7 +3404,7 @@ Sub SUBIR_INFO_PEDIDO
|
||||
PB2.Progress = 1
|
||||
|
||||
' PEDIO_CLIENTE
|
||||
enviaPedidoCliente("Todos")
|
||||
' enviaPedidoCliente("Todos")
|
||||
|
||||
d = Starter.skmt.ExecQuery("SELECT COUNT(*) as CUANTOS_PEDIDOSC FROM PEDIDO_CLIENTE ")
|
||||
d.Position=0
|
||||
@@ -3395,10 +3416,12 @@ Sub SUBIR_INFO_PEDIDO
|
||||
PORENVIAR = 0
|
||||
|
||||
' PEDIDO
|
||||
t3.Initialize("T3", 500) ' 1000 = 1 second
|
||||
t3.Enabled = True
|
||||
Wait For t3_tick
|
||||
enviaPedido("Todos")
|
||||
' t3.Initialize("T3", 500) ' 1000 = 1 second
|
||||
' t3.Enabled = True
|
||||
' Wait For t3_tick
|
||||
' enviaPedido("Todos")
|
||||
|
||||
enviaPedidoBatch("Todos") ' ****** AQUI VA PEDIDO_CLIENTE Y PEDIDO JUNTOS *****
|
||||
|
||||
d = Starter.skmt.ExecQuery("SELECT COUNT(*) as CUANTOS_PEDIDO FROM PEDIDO")
|
||||
d.Position=0
|
||||
@@ -3498,6 +3521,72 @@ Sub SUBIR_INFO_PEDIDO
|
||||
DateTime.TimeFormat = "HH:mm:ss"
|
||||
End Sub
|
||||
|
||||
Sub enviaPedidoBatch(filtro As String)
|
||||
' Crear una lista para almacenar TODAS las operaciones de UN pedido
|
||||
Dim BatchCommands As List
|
||||
BatchCommands.Initialize
|
||||
|
||||
' DE PEDIDO_CLIENTE
|
||||
Log($"enviaPedidoBatch(${filtro})"$)
|
||||
Private condicion As String = ""
|
||||
If filtro <> "Todos" Then condicion = "where PC_ENVIADO = 0"
|
||||
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 FROM PEDIDO_CLIENTE ${condicion}"$)
|
||||
Log($"SELECT PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT, PC_COSTO_SIN, PC_RUTA, PC_ALMACEN, PC_ENVIADO FROM PEDIDO_CLIENTE ${condicion}"$)
|
||||
Log("pedido_cliente: " & cx.RowCount)
|
||||
|
||||
' DE PEDIDO
|
||||
Private condicion As String = ""
|
||||
If filtro <> "Todos" Then condicion = "where PE_ENVIADO = 0"
|
||||
c = Starter.skmt.ExecQuery2("SELECT COUNT(*) as CANTIDAD FROM HIST_ENVIOS WHERE HE_TIPO = ?",Array As String("ABORDO") )
|
||||
c.Position = 0
|
||||
If c.GetString("CANTIDAD") > 0 Then
|
||||
Log($"pe_cedis_0"$)
|
||||
Starter.skmt.ExecNonQuery2("update PEDIDO set PE_CEDIS = ? where PE_CLIENTE =? AND PE_FOLIO IS NULL ", Array As Object("RECARGA", "0"))
|
||||
End If
|
||||
Starter.skmt.ExecNonQuery("UPDATE PEDIDO SET PE_FOLIO = rowid where PE_FOLIO = 0 or PE_FOLIO = 1")
|
||||
|
||||
If cx.RowCount > 0 Then ' Si hay pedido entonces lo enviamos.
|
||||
For j = 0 To cx.RowCount - 1
|
||||
Log("===== ENVIAMOS PRODUCTOS DE PEDIDO =====")
|
||||
cx.Position = j
|
||||
Dim Arch As String = Subs.traeAlmacen & "_" & Subs.traeRuta & "_" & cx.GetString("PC_CLIENTE") & "_" & DateTime.Now
|
||||
' 1. Agregar comando del Encabezado (PEDIDO_CLIENTE)
|
||||
Dim cmdHeader As DBCommand
|
||||
cmdHeader.Initialize
|
||||
cmdHeader.Name = "insert_pedidos_KELL_arch"
|
||||
cmdHeader.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"),ALMACEN,l_ruta.text,cx.GetString("PC_COSTO_SIN"), Arch)
|
||||
BatchCommands.Add(cmdHeader)
|
||||
|
||||
' 2. Agregar comandos del Detalle (PEDIDO) dentro del bucle
|
||||
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 ${condicion} ${(IIf(condicion = "","where", "and"))} pe_cliente = '${cx.GetString("PC_CLIENTE")}' "$)
|
||||
' Log($"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 ${condicion} ${(IIf(condicion = "","where ", "and"))} pe_cliente = '${cx.GetString("PC_CLIENTE")}' "$)
|
||||
If cPed.RowCount > 0 Then
|
||||
For i = 0 To cPed.RowCount - 1
|
||||
Log("==== ENVIAMOS PRODS ====")
|
||||
cPed.Position = i
|
||||
Dim cmdDetail As DBCommand
|
||||
cmdDetail.Initialize
|
||||
If PERFIL = "V-ESPECIAL" Then
|
||||
Log("===== V-ESPECIAL =====")
|
||||
cmd.Name = "insert_pedido_esp_KELL"
|
||||
cmd.Parameters = Array As Object(cPed.GetString("PE_CEDIS"),ALMACEN,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"),NUMERO_PEDIDO)
|
||||
Else
|
||||
cmdDetail.Name = "insert_pedido_KELL_arch"
|
||||
cmdDetail.Parameters = Array As Object (cPed.GetString("PE_CEDIS"),ALMACEN,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"), Arch)
|
||||
End If
|
||||
BatchCommands.Add(cmdDetail)
|
||||
Next
|
||||
End If
|
||||
Next
|
||||
|
||||
' 3. Enviar TODO junto en una sola petición HTTP
|
||||
' Si esto falla, no se guarda nada en Oracle y el pedido sigue pendiente en local.
|
||||
reqManager.ExecuteBatch(BatchCommands, "pedido_completo_" & cx.GetString("PC_CLIENTE"))
|
||||
End If
|
||||
c.Close
|
||||
cx.Close
|
||||
End Sub
|
||||
|
||||
'Envio de la tabla pedido
|
||||
Sub enviaPedido(filtro As String)
|
||||
Log($"enviaPedido(${filtro})"$)
|
||||
@@ -3510,11 +3599,11 @@ Sub enviaPedido(filtro As String)
|
||||
Starter.skmt.ExecNonQuery2("update PEDIDO set PE_CEDIS = ? where PE_CLIENTE =? AND PE_FOLIO IS NULL ", Array As Object("RECARGA", "0"))
|
||||
End If
|
||||
Starter.skmt.ExecNonQuery("UPDATE PEDIDO SET PE_FOLIO = rowid where PE_FOLIO = 0 or PE_FOLIO = 1")
|
||||
|
||||
|
||||
Log("####################################################")
|
||||
Log(PERFIL)
|
||||
Log("####################################################")
|
||||
|
||||
|
||||
If PERFIL = "V-ESPECIAL" Then
|
||||
Log($"pe_cedis_1"$)
|
||||
c = 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 FROM PEDIDO ${condicion} ORDER BY PE_CLIENTE"$)
|
||||
@@ -3535,7 +3624,7 @@ Sub enviaPedido(filtro As String)
|
||||
Else
|
||||
' Log($"pe_cedis_3"$)
|
||||
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 FROM PEDIDO ${condicion}"$)
|
||||
Log($"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 FROM PEDIDO ${condicion}"$)
|
||||
' Log($"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 FROM PEDIDO ${condicion}"$)
|
||||
' TIEMPO = 0
|
||||
S_CP.Text = "Envio de Pedidos"
|
||||
PB2.Progress = 1
|
||||
@@ -3990,6 +4079,7 @@ Sub IsConnectedToInternet As Boolean 'ignore
|
||||
End Sub
|
||||
|
||||
Private Sub b_motivoNoVisita_Click
|
||||
B4XPages.MainPage.aud.guarda("Entrada a motivoNoVisita")
|
||||
r_1.Checked = True
|
||||
r_razonNoVisita = "FALLA MECANICA"
|
||||
If Not(kh.motivoNoVisitaActivo) Then
|
||||
@@ -4015,6 +4105,7 @@ Private Sub b_noVisita_Click
|
||||
Msgbox2Async("Si se envia la información, ya NO se va a poder continuar con la ruta, los clientes por visitar se van a bloquear.", "AVISO", "Continuar", "Cancelar", "", LoadBitmap(File.DirAssets,"alert2.png"), False)
|
||||
Wait For Msgbox_Result (result As Int)
|
||||
If result = DialogResponse.POSITIVE Then
|
||||
B4XPages.MainPage.aud.guarda($"Se envió MotivoNoVisita: "${r_razonNoVisita}""$)
|
||||
ToastMessageShow("CONTINUAR", False)
|
||||
Starter.skmt.ExecNonQuery($"delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'NOVISITA_ACTIVA'"$)
|
||||
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("NOVISITA_ACTIVA", 1))
|
||||
|
||||
@@ -166,6 +166,7 @@ End Sub
|
||||
'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.
|
||||
|
||||
Sub B4XPage_Appear
|
||||
B4XPages.MainPage.aud.guarda("Entrada a Productos")
|
||||
If Starter.Logger Then Log("Entro: " & entro)
|
||||
' Log($"LIMITE ABORDO: ${limiteAbordo}"$)
|
||||
' clv_prods_ll.Initialize(Me, "clv_prods_ll")
|
||||
|
||||
@@ -142,6 +142,7 @@ Private Sub B4XPage_Created (Root1 As B4XView)
|
||||
End Sub
|
||||
|
||||
Sub B4XPage_Appear
|
||||
B4XPages.MainPage.aud.guarda("Entrada a Promos")
|
||||
B4XPages.MainPage.productos.entro = 3
|
||||
' LogColor(B4XPages.MainPage.productos.prodsMap, Colors.blue)
|
||||
prodsIds.Initialize
|
||||
|
||||
@@ -48,6 +48,7 @@ End Sub
|
||||
'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.
|
||||
|
||||
Sub B4XPage_Appear
|
||||
B4XPages.MainPage.aud.guarda("Entrada a TicketsDia")
|
||||
nombre_boton = "NOVENTA"
|
||||
c=Starter.skmt.ExecQuery("select PC_CLIENTE,PC_MONTO,PC_NOART,(select CAT_CL_NOMBRE from kmt_info where cat_cl_codigo = pc_cliente ) as NOMBRE FROM PEDIDO_CLIENTE ORDER BY PC_FECHA asc")
|
||||
ListView1.Clear
|
||||
@@ -90,9 +91,10 @@ Sub Activity_KeyPress (key As Int) As Boolean
|
||||
End Sub
|
||||
|
||||
Sub ListView1_ItemLongClick (Position As Int, Value As Object)
|
||||
Log(value)
|
||||
Log(Value)
|
||||
Starter.skmt.ExecNonQuery("delete from CUENTAA")
|
||||
Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object(Value))
|
||||
B4XPages.MainPage.aud.guarda($"Clic largo TicketsDia: ${Value}"$)
|
||||
Subs.iniciaActividad("Cliente")
|
||||
End Sub
|
||||
|
||||
|
||||
456
B4A/C_TrendSpending.bas
Normal file
456
B4A/C_TrendSpending.bas
Normal file
@@ -0,0 +1,456 @@
|
||||
B4A=true
|
||||
Group=Default Group
|
||||
ModulesStructureVersion=1
|
||||
Type=Class
|
||||
Version=12.8
|
||||
@EndOfDesignText@
|
||||
' Clase para las funciones de Trend Spending.
|
||||
' Trend spending son 3 presupuestos que tiene Kelloggs, que son bonificaciones, descuentos y RMIs, estos se calculan semanalmente
|
||||
' y se descargan de la tabla HIST_TRADE_SPENDING_SEMANAL, de ahi obtenemos el presupuesto de la semana y el acumulado hasta ayer
|
||||
' en la noche, a cada presupuesto le vamos sumando cada que agregamos a pedido un DESCUENTO (Precios diferentes al original que
|
||||
' NO están en PROMOS), una BONIFICACION (precios con descuento que estan en promociones) o un RMI (de estos sumamos al presupuesto
|
||||
' el precio del RMI seleccionado), de acuerdo al presupuesto disponible de cada tipo, se limitan los productos, es decir que si
|
||||
' 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.
|
||||
|
||||
' 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
|
||||
Private EventName As String 'ignore
|
||||
Private CallBack As Object 'ignore
|
||||
Dim tsMaximas As Int = 0
|
||||
Private tsdb As SQL
|
||||
Dim TS_RMI() As String
|
||||
Dim TS_DESCUENTOS() As String
|
||||
Dim TS_BONIFICACIONES() As String
|
||||
End Sub
|
||||
|
||||
'Initializes the object. You can add parameters to this method if needed.
|
||||
Public Sub Initialize (vCallback As Object, vEventName As String, db As SQL) As Object
|
||||
EventName = vEventName
|
||||
CallBack = vCallback
|
||||
tsdb = db
|
||||
Private mx As Map = traeInfoTrendSpending
|
||||
LogColor(mx, Colors.red)
|
||||
TS_RMI = Regex.Split(",", mx.Get("RMI"))
|
||||
TS_DESCUENTOS = Regex.Split(",", mx.Get("DESCUENTOS"))
|
||||
TS_BONIFICACIONES = Regex.Split(",", mx.Get("BONIFICACIONES"))
|
||||
LogColor(">>>>>>>>>>>>> TRENDSPENDING: " & mx, Colors.red)
|
||||
LogColor("RMI: " & TS_RMI(0) & "|" & TS_RMI(1), Colors.red)
|
||||
LogColor("DESCUENTOS: " & TS_DESCUENTOS(0) & "|" & TS_DESCUENTOS(1), Colors.red)
|
||||
LogColor("BONIFICACIONES: " & TS_BONIFICACIONES(0) & "|" & TS_BONIFICACIONES(1), Colors.red)
|
||||
Return Me
|
||||
End Sub
|
||||
|
||||
'Regresa la tabla de productos (cat_gunaprod o cat_gunaprod2) dependiendo del tipo de venta.
|
||||
Sub traeTablaProds(tipoventa As String) As String
|
||||
Private tablaProds As String = "cat_gunaprod2"
|
||||
If tipoventa = "ABORDO" Or tipoventa = "PREVENTA" Then tablaProds = "cat_gunaprod"
|
||||
' LogColor($"Tipo= ${tipoventa}, tabla=${tablaProds}"$, Colors.RGB(200,136,0))
|
||||
Return tablaProds
|
||||
End Sub
|
||||
|
||||
'Regresa el descuento de condiciones comerciales por SKU.
|
||||
Sub traeDescXSku(clienteId As String, prodId As String) As String 'ignore
|
||||
Private desc As String = "0"
|
||||
Private c As Cursor = tsdb.ExecQuery($"Select * from CAT_DESCUENTOS_SKU where CAT_DS_CLIENTE = '${clienteId}' and CAT_DS_PRODID = '${prodId}'"$)
|
||||
If c.RowCount > 0 Then
|
||||
c.Position = 0
|
||||
desc = c.GetString("CAT_DS_PORCENTAJE")
|
||||
End If
|
||||
Return desc
|
||||
End Sub
|
||||
|
||||
' Regresa un mapa con el tipo, monto permitido semanal y el acumulado hasta el día anterior:
|
||||
' ej:
|
||||
' - RMI=1500,0
|
||||
' - DESCUENTOS=1500,0
|
||||
' - BONIFICACIONES=1500,480
|
||||
Sub traeInfoTrendSpending As Map
|
||||
Private semana As Int = 0
|
||||
Private HIST_TSS_SEMANA As String = 0
|
||||
Private HIST_TSS_SEMANA_ACUM As String = 0
|
||||
Private m As Map = CreateMap("RMI": 10000000 & "," & 0, "DESCUENTOS": 10000000 & "," & 0, "BONIFICACIONES": 10000000 & "," & 0) ' El 100,000 es el default del presupuesto, por si NO HAY datos de trend spending.
|
||||
' m.Initialize
|
||||
Private c As Cursor = tsdb.ExecQuery($"select cat_va_valor from cat_variables where cat_va_descripcion = 'SEM_CAL_LABORAL'"$)
|
||||
If c.RowCount > 0 Then
|
||||
c.Position = 0
|
||||
semana = c.GetInt("CAT_VA_VALOR")
|
||||
End If
|
||||
If semana > 0 Then
|
||||
c = 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
|
||||
For i = 0 To c.RowCount - 1
|
||||
c.Position = i
|
||||
HIST_TSS_SEMANA = c.GetString($"HIST_TSS_SEMANA${semana}"$)
|
||||
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
|
||||
m.Put("RMI", HIST_TSS_SEMANA & "," & HIST_TSS_SEMANA_ACUM)
|
||||
else if c.GetString("HIST_TSS_TIPO") = "DESCUENTOS" Then
|
||||
m.Put("DESCUENTOS", HIST_TSS_SEMANA & "," & HIST_TSS_SEMANA_ACUM)
|
||||
else if c.GetString("HIST_TSS_TIPO") = "BONIFICACIONES" Then
|
||||
m.Put("BONIFICACIONES", HIST_TSS_SEMANA & "," & HIST_TSS_SEMANA_ACUM)
|
||||
End If
|
||||
Next
|
||||
End If
|
||||
End If
|
||||
Return m
|
||||
End Sub
|
||||
|
||||
' Modifica el acumulado del Trend Speding, le "suma" o "resta" al presupuesto especificado (RMI, BONIFICACIONES o DESCUENTOS)
|
||||
Sub modTrendSpending(accion As String, tipo As String, monto As String)
|
||||
LogColor($"#### ACCION: ${accion}, Tipo: ${tipo}, Monto: ${monto}"$, Colors.Blue)
|
||||
Private HIST_TSS_SEMANA As String
|
||||
Private HIST_TSS_SEMANA_ACUM As String
|
||||
Private acumulado As String = "0"
|
||||
If Starter.semana = 0 Then
|
||||
Private c As Cursor = tsdb.ExecQuery($"select cat_va_valor from cat_variables where cat_va_descripcion = 'SEM_CAL_LABORAL'"$)
|
||||
If c.RowCount > 0 Then
|
||||
c.Position = 0
|
||||
Starter.semana = c.GetInt("CAT_VA_VALOR")
|
||||
End If
|
||||
End If
|
||||
HIST_TSS_SEMANA = $"HIST_TSS_SEMANA${Starter.semana}"$
|
||||
HIST_TSS_SEMANA_ACUM = $"HIST_TSS_SEMANA${Starter.semana}_ACUM"$
|
||||
Private d As Cursor = tsdb.ExecQuery($"select ifnull(acumulado, 0) as ACUMULADO from TREND_SPENDING where tipo = '${tipo.ToUpperCase}'"$)
|
||||
If d.RowCount > 0 Then
|
||||
d.Position = 0
|
||||
acumulado = d.GetString("ACUMULADO")
|
||||
End If
|
||||
Log("acumulado:" & acumulado & " | monto: " & monto)
|
||||
Private c As Cursor = 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("---- " & c.RowCount)
|
||||
If accion.ToUpperCase = "RESTA" Then
|
||||
If c.RowCount > 0 Then
|
||||
c.Position = 0
|
||||
If tipo.ToUpperCase = "DESCUENTOS" Or tipo.ToUpperCase = "RMI" Or tipo.ToUpperCase = "BONIFICACIONES" Then
|
||||
Private nuevaBonificacion As String = NumberFormat2((acumulado + monto), 1, 2, 2, False)
|
||||
LogColor($"Nuevo acumulado ${tipo} = ${nuevaBonificacion}"$, Colors.Magenta)
|
||||
tsdb.ExecNonQuery($"delete from TREND_SPENDING where tipo = '${tipo.ToUpperCase}' "$)
|
||||
tsdb.ExecNonQuery($"insert into TREND_SPENDING (tipo, acumulado) values ('${tipo.ToUpperCase}', '${nuevaBonificacion}')"$)
|
||||
Log($"Insertamos en TRADE_SPENDING: ${nuevaBonificacion}"$)
|
||||
' else if tipo.ToUpperCase = "RMI" Then
|
||||
End If
|
||||
End If
|
||||
else if accion.ToUpperCase = "SUMA" Then
|
||||
If c.RowCount > 0 Then
|
||||
c.Position = 0
|
||||
If tipo.ToUpperCase = "DESCUENTOS" Or tipo.ToUpperCase = "RMI" Or tipo.ToUpperCase = "BONIFICACIONES" Then
|
||||
Private nuevaBonificacion As String = NumberFormat2((acumulado - monto), 1, 2, 2, False)
|
||||
LogColor($"Nueva bonificacion = ${nuevaBonificacion}"$, Colors.Magenta)
|
||||
tsdb.ExecNonQuery($"delete from TREND_SPENDING where tipo = '${tipo.ToUpperCase}' "$)
|
||||
tsdb.ExecNonQuery($"insert into TREND_SPENDING (tipo, acumulado) values ('${tipo.ToUpperCase}', '${nuevaBonificacion}')"$)
|
||||
End If
|
||||
End If
|
||||
End If
|
||||
End Sub
|
||||
|
||||
Sub traeAcumuladoHoyTS(tipo As String) As String
|
||||
' Private HIST_TSS_SEMANA As String
|
||||
' Private HIST_TSS_SEMANA_ACUM As String
|
||||
Private acumulado As String = "0"
|
||||
If Starter.semana = 0 Then
|
||||
Private c As Cursor = tsdb.ExecQuery($"select cat_va_valor from cat_variables where cat_va_descripcion = 'SEM_CAL_LABORAL'"$)
|
||||
If c.RowCount > 0 Then
|
||||
c.Position = 0
|
||||
Starter.semana = c.GetInt("CAT_VA_VALOR")
|
||||
End If
|
||||
End If
|
||||
' HIST_TSS_SEMANA = $"HIST_TSS_SEMANA${Starter.semana}"$
|
||||
' HIST_TSS_SEMANA_ACUM = $"HIST_TSS_SEMANA${Starter.semana}_ACUM"$
|
||||
Private d As Cursor = tsdb.ExecQuery($"select acumulado from TREND_SPENDING where tipo = '${tipo.ToUpperCase}'"$)
|
||||
If d.RowCount > 0 Then
|
||||
d.Position = 0
|
||||
acumulado = d.GetString("ACUMULADO")
|
||||
End If
|
||||
' LogColor($"Acumulado hoy de ${tipo}: "$ & acumulado, Colors.Blue)
|
||||
Return NumberFormat2(acumulado, 1, 2, 2, False)
|
||||
End Sub
|
||||
|
||||
'Trae el cliente de CUENTAA
|
||||
Sub traeCliente As String 'ignore
|
||||
Private c As Cursor
|
||||
Private cl As String
|
||||
c = Starter.skmt.ExecQuery("Select CUENTA from cuentaa")
|
||||
c.Position = 0
|
||||
cl = c.GetString("CUENTA")
|
||||
c.Close
|
||||
Return cl
|
||||
End Sub
|
||||
|
||||
Sub traePrecio(id As String) As String
|
||||
Private precio As String = "0"
|
||||
Private c As Cursor = tsdb.ExecQuery($"select cat_gp_precio from ${traeTablaProds(Starter.tipov)} where cat_gp_id = '${id}'"$)
|
||||
If c.RowCount > 0 Then
|
||||
c.Position = 0
|
||||
precio = c.GetString("CAT_GP_PRECIO")
|
||||
End If
|
||||
Return precio
|
||||
End Sub
|
||||
|
||||
Sub trendSpending(accion As String, tipo As String, clienteId As String, id As String, laCant As String, inv As Int) As String
|
||||
Private logger As Boolean = True
|
||||
LogColor("-------- > TRADE SPENDING < ---------", Colors.red)
|
||||
' Log("DescxSku: " & traeDescXSku(clienteId, id))
|
||||
Dim TS_RMI() As String
|
||||
Dim TS_DESCUENTOS() As String
|
||||
Dim TS_BONIFICACIONES() As String
|
||||
Private mx As Map = traeInfoTrendSpending
|
||||
TS_RMI = Regex.Split(",", mx.Get("RMI"))
|
||||
TS_DESCUENTOS = Regex.Split(",", mx.Get("DESCUENTOS"))
|
||||
TS_BONIFICACIONES = Regex.Split(",", mx.Get("BONIFICACIONES"))
|
||||
If tipo.ToUpperCase = "RMI" Then
|
||||
Private lasMaximas As Int = 0
|
||||
Log($"Acumulado de RMIs: ${traeAcumuladoHoyTS("rmi")}"$)
|
||||
Private elMonto As String = NumberFormat2(traePrecioRMI(id), 1, 2, 2, False)
|
||||
If logger Then Log($"elMonto: ${elMonto}"$)
|
||||
' If logger Then Log($"TS_RMI(0): ${TS_RMI(0)}"$)
|
||||
' If logger Then Log($"TS_RMI(1): ${TS_RMI(1)}"$)
|
||||
If logger Then Log($"LaCant: ${laCant}"$)
|
||||
Private tsRestantes As String = (TS_RMI(0) - TS_RMI(1) - traeAcumuladoHoyTS("rmi"))
|
||||
Log($"tsRestantes: ${tsRestantes}"$)
|
||||
If accion.ToUpperCase = "PRODMAS" Then 'Regresa lasMaximas y elMonto separadas por un "|"
|
||||
If elMonto > 0 Then
|
||||
lasMaximas = ((laCant * elMonto) + tsRestantes) / elMonto
|
||||
If logger Then Log("lasMaximas: " & lasMaximas)
|
||||
If logger Then Log("traeAcumuladoHoyTS: " & traeAcumuladoHoyTS("rmi"))
|
||||
End If
|
||||
' If laCant + 1 = lasMaximas Then
|
||||
' ToastMessageShow("El presupuesto de RMI no permite agregar mas productos!!", False)
|
||||
' End If
|
||||
If logger Then Log("EL RMI: " & elMonto)
|
||||
If logger Then Log($"lacant=${laCant} < lasMaximas=${lasMaximas} = ${laCant<lasMaximas}"$)
|
||||
If laCant < lasMaximas Then
|
||||
modTrendSpending("resta", "rmi", elMonto) ' Restamos al presupuesto de hoy (agregamos al acumulado).
|
||||
Log($"modTrendSpending("resta", "rmi", ${elMonto})"$)
|
||||
End If
|
||||
If logger Then LogColor("RMI RESTANTES: " & (TS_RMI(0) - TS_RMI(1) - traeAcumuladoHoyTS("rmi")), Colors.red)
|
||||
Return lasMaximas & "|" & elMonto
|
||||
else if accion.ToUpperCase = "PRODMENOS" Then
|
||||
If logger Then Log("LaCANT= " & laCant & ", elMonto= " & elMonto)
|
||||
If laCant >= 0 Then
|
||||
modTrendSpending("suma", "rmi", elMonto) ' Agregamos al presupuesto de hoy (restamos del acumulado).
|
||||
Log($"modTrendSpending("suma", "rmi", ${elMonto})"$)
|
||||
End If
|
||||
Return lasMaximas & "|" & elMonto
|
||||
End If
|
||||
else If tipo.ToUpperCase = "DESCUENTOS" Then
|
||||
Dim lasMaximas As Int = 0
|
||||
Dim elMonto As String = 0
|
||||
Private elMonto As String = NumberFormat2(traePrecio(id)*(traeDescXSku(clienteId, id)/100), 1, 2, 2, False)
|
||||
Private tsRestantes As String = (TS_DESCUENTOS(0) - TS_DESCUENTOS(1) - traeAcumuladoHoyTS("descuentos"))
|
||||
If logger Then Log("EL MONTO: " & elMonto)
|
||||
If logger Then LogColor("Monto del presupuesto disponible: " & tsRestantes, Colors.blue)
|
||||
If accion.ToUpperCase = "PRODMAS" Then 'Regresa lasMaximas y elMonto separadas por un "|"
|
||||
' If logger Then Log("PMAS")
|
||||
If elMonto > 0 Then
|
||||
lasMaximas = ((laCant * elMonto) + tsRestantes) / elMonto
|
||||
If logger Then Log("lasMaximas: " & lasMaximas)
|
||||
' If logger Then Log("lasMaximas2: " & traeMaximas("descuentos", clienteId, id, laCant, ""))
|
||||
If logger Then Log("Acumulado hoy: " & traeAcumuladoHoyTS("descuentos"))
|
||||
End If
|
||||
If laCant = lasMaximas Then
|
||||
ToastMessageShow("El presupuesto de DESCUENTOS no permite agregar mas productos!!", False)
|
||||
End If
|
||||
If logger Then Log("EL MONTO: " & elMonto)
|
||||
If inv > 0 And laCant < lasMaximas Then
|
||||
modTrendSpending("resta", "descuentos", elMonto) ' Restamos al presupuesto de hoy (agregamos al acumulado).
|
||||
End If
|
||||
If logger Then Log(">>>> MONTO RESTANTE PRESUPUESTO: " & (TS_DESCUENTOS(0) - TS_DESCUENTOS(1) - traeAcumuladoHoyTS("descuentos")))
|
||||
Return lasMaximas & "|" & elMonto
|
||||
else if accion.ToUpperCase = "PRODMENOS" Then 'Regresa descuentosMaximas y elMonto separadas por un "|"
|
||||
If logger Then Log("LaCANT= " & laCant & ", elMonto= " & elMonto)
|
||||
If laCant >= 0 Then
|
||||
modTrendSpending("suma", "descuentos", elMonto) ' Agregamos al presupuesto de hoy (restamos del acumulado).
|
||||
End If
|
||||
Return lasMaximas & "|" & elMonto
|
||||
else if accion.ToUpperCase = "TEXTCHANGED" Then
|
||||
If logger Then Log("TC")
|
||||
else if accion.ToUpperCase = "FOCUSCHANGED" Then 'Regresa descuentos maximas, SOLO correr esta parte si HASFOCUS es VERDADERO.
|
||||
If logger Then Log("FC")
|
||||
Private elMonto As String = traePrecio(id)*(traeDescXSku(clienteId, id)/100)
|
||||
If elMonto > 0 Then 'And HasFocus
|
||||
If logger Then Log("LA BONIFICACION: " & elMonto)
|
||||
Private tsRestantes As String = (TS_DESCUENTOS(0) - TS_DESCUENTOS(1) - traeAcumuladoHoyTS("descuentos"))
|
||||
If logger Then Log("Monto del PRESUPUESTO disponible: " & tsRestantes)
|
||||
lasMaximas = ((laCant * elMonto) + tsRestantes) / elMonto
|
||||
If logger Then Log("tsMaximas: " & lasMaximas)
|
||||
End If
|
||||
Return lasMaximas
|
||||
End If
|
||||
End If
|
||||
End Sub
|
||||
|
||||
' Trae el precio del RMI desde CAT_RMI.
|
||||
Sub traePrecioRMI(id As String) As String
|
||||
Private precio As String = "0"
|
||||
Private c As Cursor = tsdb.ExecQuery($"select cat_monto from cat_rmi where cat_id = '${id}'"$)
|
||||
If c.RowCount > 0 Then
|
||||
c.Position = 0
|
||||
precio = c.GetString("CAT_MONTO")
|
||||
End If
|
||||
Return precio
|
||||
End Sub
|
||||
|
||||
' Traemos el monto (descuento total) del producto actual.
|
||||
' Utiliza el descuento de condiciones comerciales por SKU (tabla CAT_DESCUENTOS).
|
||||
Sub traeMonto(clienteId As String, id As String) As String
|
||||
Private tsMonto As String
|
||||
tsMonto = NumberFormat2(traePrecio(id)*(traeDescXSku(clienteId, id)/100), 1, 2, 2, False)
|
||||
Return tsMonto
|
||||
End Sub
|
||||
|
||||
' Trae la cantidad máxima de rmis, bonificaciones o descuentos por presupuesto.
|
||||
Sub traeMaximas(tipo As String, clienteId As String, id As String, laCant As String, promoId As String) As Int
|
||||
Private tsMaximas As Int = 10000000
|
||||
Private tsRestantes As String = 0
|
||||
Private tsMonto As String '= traeMonto(clienteId, id)
|
||||
' If tsMonto > 0 Then
|
||||
If tipo.ToUpperCase = "DESCUENTOS" Then
|
||||
tsMonto = NumberFormat2(traePrecio(id)*(traeDescXSku(clienteId, id)/100), 1, 2, 2, False)
|
||||
tsRestantes = (TS_DESCUENTOS(0) - TS_DESCUENTOS(1) - traeAcumuladoHoyTS("descuentos")) ' Traemos monto restante de Trend Spending para descuentos.
|
||||
else If tipo.ToUpperCase = "RMI" Then
|
||||
tsMonto = NumberFormat2(traePrecioRMI(id), 1, 2, 2, False)
|
||||
tsRestantes = (TS_RMI(0) - TS_RMI(1) - traeAcumuladoHoyTS("rmi")) ' Traemos monto restante de Trend Spending para rmis.
|
||||
' else If tipo.ToUpperCase = "BONIFICACIONES" Then
|
||||
' tsMonto = NumberFormat2(traeMontoBonificacion(id, promoId), 1, 2, 2, False)
|
||||
' tsRestantes = (TS_BONIFICACIONES(0) - TS_BONIFICACIONES(1) - traeAcumuladoHoyTS("bonificaciones")) ' Traemos monto restante de Trend Spending para bonificaciones.
|
||||
End If
|
||||
' Log($"${TS_BONIFICACIONES(0)} - ${TS_BONIFICACIONES(1)} - ${traeAcumuladoHoyTS("bonificaciones")}"$)
|
||||
' Log($"((${laCant} * ${tsMonto}) + ${tsRestantes}) / ${tsMonto}"$)
|
||||
Log($"tsMonto: ${tsMonto}"$)
|
||||
Log($"tsRestantes: ${tsRestantes}"$)
|
||||
tsMaximas = ((laCant * tsMonto) + tsRestantes) / tsMonto
|
||||
' End If
|
||||
Return tsMaximas
|
||||
End Sub
|
||||
|
||||
' 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.
|
||||
Sub traeBonificacionesMaximas(tipo As String, clienteId As String, id As String, laCant As String, elPrecioVenta As String, promoId As String) As Int
|
||||
Private thisLog As Boolean = True
|
||||
Private tsMaximas As Int = 100000000
|
||||
Private tsRestantes As String = 0
|
||||
Private tsMonto As String
|
||||
|
||||
Private mx As Map = traeInfoTrendSpending
|
||||
TS_RMI = Regex.Split(",", mx.Get("RMI"))
|
||||
TS_DESCUENTOS = Regex.Split(",", mx.Get("DESCUENTOS"))
|
||||
TS_BONIFICACIONES = Regex.Split(",", mx.Get("BONIFICACIONES"))
|
||||
|
||||
If 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
|
||||
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.
|
||||
Log($" PresupuestoBonifs: ${TS_BONIFICACIONES(0)}, AcumuladoBonifs: ${TS_BONIFICACIONES(1)}, traeAcumuladoHoyTS('bonificaciones'): ${traeAcumuladoHoyTS("bonificaciones")}"$)
|
||||
' Log($" ${TS_BONIFICACIONES(0)} - ${TS_BONIFICACIONES(1)} - ${traeAcumuladoHoyTS("bonificaciones")}"$)
|
||||
End If
|
||||
If thisLog Then Log($" Monto de bonificacion: ${tsMonto}"$)
|
||||
If thisLog Then Log($" Presupuesto disponible: ${tsRestantes}"$)
|
||||
' If thisLog Then Log($"Cantidad: ${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
|
||||
tsMaximas = Floor(tsRestantes / (tsMonto * laCant))
|
||||
End If
|
||||
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
|
||||
End Sub
|
||||
|
||||
' 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 0, la bonificacion es: Precio original.
|
||||
Sub traeMontoBonificacion(id As String, precio As String, promoId As String) As String
|
||||
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 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 re.RowCount = 0 Then' No es regalo ni exhibidor.
|
||||
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}'"$)
|
||||
' 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}'"$)
|
||||
If thisLog Then Log($" Rowcount DP y CGP2: ${c.RowCount}"$)
|
||||
If c.RowCount > 0 Then
|
||||
c.Position = 0
|
||||
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"))
|
||||
If thisLog Then Log($" Precio normal: ${c.GetString("CAT_GP_PRECIO")}, Precio desc: ${c.GetString("CAT_DP_PRECIO")}, Monto bonificacion: ${tsMonto}"$)
|
||||
End If
|
||||
' Log("ROWCOUNT: " & c.RowCount)
|
||||
End If
|
||||
If thisLog Then LogColor($" ============ TERMINA MONTO BONIFICACION ========"$, Colors.RGB(151,0,171))
|
||||
Return tsMonto
|
||||
End Sub
|
||||
|
||||
' Recibe una lista con los ids de los productos variables, revisa cada id para traer los maximos por presupuesto para ese producto
|
||||
' y pone ese maximo en una lista, luego ordena esa lista para obtener el mas chico y regresa ese como maximo.
|
||||
' esta funcion se va a aplicar en la funcion maxpromos como un limite mas para que no muestre las promociones.
|
||||
' NOTA: hay que ver como y cuando dejar de mostrar promociones cuando quede poco presupuesto para bonificaciones.
|
||||
' NOTA: Talvez se pueda hacer que cuando se entre a PROMOS, si ya no hay presupuesto suficiente, mande un toast o msgbox diciendo que ya
|
||||
' se agoto el presupuesto.
|
||||
' Aunque si hay suficiente para mostrar algunas promos ... pues que si las muestre.
|
||||
Sub maxPromosPorProdsVariables(idProdsVariables As List, promo As String)As Int
|
||||
Private logger As Boolean = False
|
||||
Private Maxs As Int = 10000000
|
||||
Private prodsVariablesXPresupuestoBonificaciones As List
|
||||
Private prodsVariablesRequeridos As Int = traeProdsVariablesRequeridos(promo)
|
||||
prodsVariablesXPresupuestoBonificaciones.Initialize
|
||||
' LogColor("===========> Prods Variables: " & idProdsVariables.Size & " <==========", Colors.red)
|
||||
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)
|
||||
' Log($"Este invDisponible: ${invDispParaPromo.Get(idProdsVariables.Get(i))}"$)
|
||||
If logger Then Log(">> Monto Bonificacion: " & traeMontoBonificacion(idProdsVariables.Get(i), 1, promo))
|
||||
Private maxProds As Int = traeBonificacionesMaximas("bonificaciones", traeCliente, idProdsVariables.Get(i), prodsVariablesRequeridos, 1, promo)
|
||||
prodsVariablesXPresupuestoBonificaciones.Add(maxProds)
|
||||
Next
|
||||
prodsVariablesXPresupuestoBonificaciones.Sort(True)
|
||||
If prodsVariablesXPresupuestoBonificaciones.Size > 0 Then
|
||||
Maxs = prodsVariablesXPresupuestoBonificaciones.Get(0)
|
||||
End If
|
||||
If logger Then LogColor("=====>> Max prods variables x monto de bonificaciones: " & Maxs, Colors.blue)
|
||||
Return Maxs
|
||||
End Sub
|
||||
|
||||
' Regresa los productos variables requeridos de la promocion dada.
|
||||
Sub traeProdsVariablesRequeridos(promo As String) As Int
|
||||
Private pvr As Int = 0
|
||||
Private c As Cursor = 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.
|
||||
If c.RowCount > 0 Then
|
||||
c.Position = 0
|
||||
If c.RowCount > 0 Then
|
||||
c.Position = 0
|
||||
pvr = c.GetString("CAT_GP_STS")
|
||||
End If
|
||||
End If
|
||||
c.Close
|
||||
Return pvr
|
||||
End Sub
|
||||
|
||||
|
||||
'########################################################################################
|
||||
' Los productos fijos NO estan restando del presupuesto de BONIFICACIONES
|
||||
'########################################################################################
|
||||
|
||||
'Poner en una funcion (maxPromosPorProdsFijos) el codigo para traer las promos maximas por productos fijos, igual que la de productos
|
||||
' variables, y ponerla igual en "traeMaxPromos" en lugar de en "revisaMaxPromosProdsFijosPorInventario".
|
||||
|
||||
' Falta el codigo para el funcionamiento diferente de las bonificaciones:
|
||||
' Si CAT_DP_PRECIOB es 1 --> (Precio de original (cat_precio) - precio de venta) y se suma al acumulado de BONIFICACIONES
|
||||
' Si CAT_DP_PRECIOB es 0 --> precio orginal se suma al acumulado de BONIFICACIONES
|
||||
'Hay que traer desde web la columna "CAT_DP_PRECIOB" y gardarla en algun lado en movil!!
|
||||
@@ -99,6 +99,8 @@ End Sub
|
||||
|
||||
'This sub will be called by the DBRequestManager when the job is done
|
||||
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
|
||||
Dim currentJobTag As String = job.Tag
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -26,6 +26,7 @@ ModuleBookmarks30=
|
||||
ModuleBookmarks31=
|
||||
ModuleBookmarks32=
|
||||
ModuleBookmarks33=
|
||||
ModuleBookmarks34=
|
||||
ModuleBookmarks4=
|
||||
ModuleBookmarks5=
|
||||
ModuleBookmarks6=
|
||||
@@ -60,6 +61,7 @@ ModuleBreakpoints30=
|
||||
ModuleBreakpoints31=
|
||||
ModuleBreakpoints32=
|
||||
ModuleBreakpoints33=
|
||||
ModuleBreakpoints34=
|
||||
ModuleBreakpoints4=
|
||||
ModuleBreakpoints5=
|
||||
ModuleBreakpoints6=
|
||||
@@ -67,17 +69,17 @@ ModuleBreakpoints7=
|
||||
ModuleBreakpoints8=
|
||||
ModuleBreakpoints9=
|
||||
ModuleClosedNodes0=
|
||||
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
|
||||
ModuleClosedNodes1=
|
||||
ModuleClosedNodes10=
|
||||
ModuleClosedNodes11=
|
||||
ModuleClosedNodes12=
|
||||
ModuleClosedNodes13=8,9,11,12
|
||||
ModuleClosedNodes14=1,2
|
||||
ModuleClosedNodes13=
|
||||
ModuleClosedNodes14=
|
||||
ModuleClosedNodes15=
|
||||
ModuleClosedNodes16=3,8,17
|
||||
ModuleClosedNodes16=
|
||||
ModuleClosedNodes17=
|
||||
ModuleClosedNodes18=
|
||||
ModuleClosedNodes19=7,8,9,10,11,12,13,14
|
||||
ModuleClosedNodes19=
|
||||
ModuleClosedNodes2=
|
||||
ModuleClosedNodes20=
|
||||
ModuleClosedNodes21=
|
||||
@@ -85,21 +87,22 @@ ModuleClosedNodes22=
|
||||
ModuleClosedNodes23=
|
||||
ModuleClosedNodes24=
|
||||
ModuleClosedNodes25=
|
||||
ModuleClosedNodes26=24,26,31,32,33,35
|
||||
ModuleClosedNodes26=
|
||||
ModuleClosedNodes27=
|
||||
ModuleClosedNodes28=4
|
||||
ModuleClosedNodes29=
|
||||
ModuleClosedNodes3=3
|
||||
ModuleClosedNodes28=
|
||||
ModuleClosedNodes29=3
|
||||
ModuleClosedNodes3=
|
||||
ModuleClosedNodes30=
|
||||
ModuleClosedNodes31=
|
||||
ModuleClosedNodes32=116
|
||||
ModuleClosedNodes32=
|
||||
ModuleClosedNodes33=
|
||||
ModuleClosedNodes34=
|
||||
ModuleClosedNodes4=
|
||||
ModuleClosedNodes5=
|
||||
ModuleClosedNodes6=
|
||||
ModuleClosedNodes7=
|
||||
ModuleClosedNodes8=
|
||||
ModuleClosedNodes9=
|
||||
NavigationStack=C_Principal,B4XPage_Appear,595,0,Subs,revisaMaxPromosProdsFijosPorInventario,1393,1,Subs,procesaPromocion,1256,1,C_TrendSpending,traeMontoBonificacion,370,1,C_TrendSpending,traeBonificacionesMaximas,363,0,kms_helperSubs,RD_Init,105,0,C_Productos,B4XPage_Appear,235,6,MAPA_RUTAS,CreateBitmapWithNumber,363,0,MAPA_RUTAS,MapFragment1_Ready,223,0,B4XMainPage,B4XPage_Created,128,0
|
||||
NavigationStack=B4XMainPage,B4XPage_Appear,484,0,B4XMainPage,B4XPage_Created,392,0,B4XMainPage,Initialize,123,0,C_Principal,B4XPage_Appear,333,0,C_Principal,connecta_LongClick,2504,0,C_Principal,connecta3,2503,0,C_Principal,connecta2,2488,0,C_Principal,b_motivoNoVisita_Click,4075,0,Diseñador Visual,principal.bal,-100,6,C_Principal,B4XPage_Created,311,0
|
||||
SelectedBuild=0
|
||||
VisibleModules=31,1,12,3,32,13,14,19,16,26,28
|
||||
VisibleModules=32,1,13,4,33,15,34,14,29
|
||||
|
||||
@@ -115,6 +115,7 @@ Sub Activity_Create(FirstTime As Boolean)
|
||||
End Sub
|
||||
|
||||
Sub Activity_Resume
|
||||
B4XPages.MainPage.aud.guarda("Entrada a MapaRutas")
|
||||
If GPS.GPSEnabled = False Then
|
||||
ToastMessageShow("Debe Activar el GPS del Equipo.", True)
|
||||
StartActivity(GPS.LocationSettingsIntent)
|
||||
@@ -232,6 +233,7 @@ Sub OnInfoWindowClickListener1_click(Marker1 As Marker)
|
||||
Starter.skmt.ExecNonQuery("delete from CUENTAA")
|
||||
Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?) ", Array As Object(Marker1.Title))
|
||||
Activity.Finish
|
||||
B4XPages.MainPage.aud.guarda($"Clic Tooltip Mapas Ruta: ${Marker1.Title}"$)
|
||||
Subs.iniciaActividad("Cliente")
|
||||
End Sub
|
||||
|
||||
|
||||
59
B4A/Subs.bas
59
B4A/Subs.bas
@@ -2214,7 +2214,7 @@ Sub modTrendSpending(accion As String, tipo As String, monto As String)
|
||||
acumulado = d.GetString("ACUMULADO")
|
||||
End If
|
||||
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 c.RowCount > 0 Then
|
||||
c.Position = 0
|
||||
@@ -2498,32 +2498,51 @@ Public Sub RecalcularInventario
|
||||
' 3. FILTRA (Ignora) los RMIs usando PE_CEDIS <> 'DUR' y el nombre '%CAMBIO%'.
|
||||
' 4. Actualiza CAT_GUNAPROD2 masivamente.
|
||||
|
||||
' Dim sql As String = _
|
||||
' "UPDATE CAT_GUNAPROD2 " & _
|
||||
' "SET CAT_GP_ALMACEN = ( " & _
|
||||
' " SELECT (IFNULL(T5.CAT_GP_ALMACEN, 0) - IFNULL(Ventas.CantidadVendida, 0)) " & _
|
||||
' " FROM CAT_GUNAPROD5 T5 " & _
|
||||
' " LEFT JOIN ( " & _
|
||||
' " SELECT PE_PROID, SUM(PE_CANT) AS CantidadVendida " & _
|
||||
' " FROM PEDIDO " & _
|
||||
' " WHERE PE_CLIENTE <> '0' " & _
|
||||
' " AND PE_CEDIS <> 'DUR' " & _
|
||||
' " AND PE_PRONOMBRE NOT LIKE '%CAMBIO%' " & _
|
||||
' " GROUP BY PE_PROID " & _
|
||||
' " ) Ventas ON T5.CAT_GP_ID = Ventas.PE_PROID " & _
|
||||
' " WHERE T5.CAT_GP_ID = CAT_GUNAPROD2.CAT_GP_ID " & _
|
||||
' ") " & _
|
||||
' "WHERE EXISTS ( " & _ '<-- ESTA ES LA CLAVE QUE EVITA LOS NULLS
|
||||
' " SELECT 1 FROM CAT_GUNAPROD5 T5 " & _
|
||||
' " WHERE T5.CAT_GP_ID = CAT_GUNAPROD2.CAT_GP_ID " & _
|
||||
' ")"
|
||||
|
||||
Dim sql As String = _
|
||||
"UPDATE CAT_GUNAPROD2 " & _
|
||||
"SET CAT_GP_ALMACEN = ( " & _
|
||||
" SELECT (IFNULL(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 " & _
|
||||
")"
|
||||
"UPDATE CAT_GUNAPROD2 " & _
|
||||
"SET CAT_GP_ALMACEN = ( " & _
|
||||
" SELECT (IFNULL(INV.CI_INVENTARIO, 0) - IFNULL(Ventas.CantidadVendida, 0)) " & _
|
||||
" FROM CAT_INVENTARIO INV " & _
|
||||
" LEFT JOIN ( " & _
|
||||
" SELECT PE_PROID, SUM(PE_CANT) AS CantidadVendida " & _
|
||||
" FROM PEDIDO " & _
|
||||
" WHERE PE_CLIENTE <> '0' " & _
|
||||
" AND PE_CEDIS <> 'DUR' " & _
|
||||
" AND PE_PRONOMBRE NOT LIKE '%CAMBIO%' " & _
|
||||
" GROUP BY PE_PROID " & _
|
||||
" ) Ventas ON INV.CI_IDPROD = Ventas.PE_PROID " & _
|
||||
" WHERE INV.CI_IDPROD = CAT_GUNAPROD2.CAT_GP_ID " & _
|
||||
") " & _
|
||||
"WHERE EXISTS ( " & _
|
||||
" SELECT 1 FROM CAT_INVENTARIO INV " & _
|
||||
" WHERE INV.CI_IDPROD = CAT_GUNAPROD2.CAT_GP_ID " & _
|
||||
")"
|
||||
|
||||
' Ejecutamos el cálculo masivo
|
||||
Starter.skmt.ExecNonQuery(sql)
|
||||
|
||||
Starter.skmt.TransactionSuccessful
|
||||
If Starter.Logger Then Log("Inventario Sincronizado (Excluyendo RMIs)")
|
||||
|
||||
Catch
|
||||
Log("Error al recalcular inventario: " & LastException)
|
||||
End Try
|
||||
|
||||
110
B4A/_git_tag.ps1
Normal file
110
B4A/_git_tag.ps1
Normal file
@@ -0,0 +1,110 @@
|
||||
# --- SCRIPT DE AUTODESCUBRIMIENTO CON GUI MEJORADA ---
|
||||
|
||||
# Cargar librería visual
|
||||
Add-Type -AssemblyName System.Windows.Forms
|
||||
Add-Type -AssemblyName System.Drawing
|
||||
|
||||
# 1. AUTODESCUBRIMIENTO
|
||||
$projectPath = $PSScriptRoot
|
||||
Write-Host "Ruta: $projectPath"
|
||||
|
||||
$b4aFileItem = Get-ChildItem -Path $projectPath -Filter "*.b4a" | Select-Object -First 1
|
||||
|
||||
if (-Not $b4aFileItem) {
|
||||
[System.Windows.Forms.MessageBox]::Show("No hay archivo .b4a en esta carpeta.", "Error", "OK", "Error")
|
||||
return
|
||||
}
|
||||
|
||||
$b4aFile = $b4aFileItem.FullName
|
||||
$projectName = $b4aFileItem.BaseName
|
||||
Write-Host "Proyecto: $projectName"
|
||||
|
||||
# 2. LIMPIEZA
|
||||
# $objectsPath = Join-Path $projectPath "Objects"
|
||||
# if (Test-Path $objectsPath) {
|
||||
# Write-Host "Limpiando Objects..."
|
||||
# Remove-Item -Path "$objectsPath\*" -Recurse -Force -ErrorAction SilentlyContinue
|
||||
# }
|
||||
|
||||
# 3. LEER VERSIÓN
|
||||
$versionLine = Get-Content $b4aFile | Select-String "#VersionName:"
|
||||
if (-Not $versionLine) { Write-Error "Falta #VersionName"; return }
|
||||
$version = ($versionLine -split ":")[1].Trim()
|
||||
$tagName = "v$version"
|
||||
|
||||
Set-Location $projectPath
|
||||
|
||||
# 4. COMMIT
|
||||
$oldCommit = git rev-parse HEAD
|
||||
|
||||
Write-Host "----------------------------------------"
|
||||
Write-Host "Versión: $version"
|
||||
Write-Host "Abriendo TortoiseGit..."
|
||||
|
||||
# Argumentos limpios
|
||||
$pathArg = '/path:"{0}"' -f $projectPath
|
||||
$msgArg = '/logmsg:"VERSION {0}"' -f $version
|
||||
$cmdArg = "/command:commit"
|
||||
|
||||
$process = Start-Process "TortoiseGitProc.exe" -ArgumentList $cmdArg, $pathArg, $msgArg -Wait -PassThru
|
||||
|
||||
$newCommit = git rev-parse HEAD
|
||||
|
||||
# 5. VALIDACIÓN
|
||||
if ($oldCommit -eq $newCommit) {
|
||||
Write-Warning "Commit cancelado."
|
||||
git tag -d $tagName 2>$null # Borra tag local previo si existe para actualizarlo al nuevo commit
|
||||
return
|
||||
}
|
||||
|
||||
Write-Host ">> Commit detectado."
|
||||
|
||||
# 6. GESTIÓN DE TAGS (VISUAL TOPMOST)
|
||||
Write-Host "git ls-remote --tags origin $tagName"
|
||||
$remoteTagInfo = git ls-remote --tags origin $tagName
|
||||
|
||||
if ($remoteTagInfo) {
|
||||
# --- TRUCO PARA QUE LA VENTANA SALGA AL FRENTE ---
|
||||
# Creamos un formulario invisible que esté "Siempre Visible" (TopMost)
|
||||
Write-Host "Recibimos remoteTagInfo"
|
||||
$topForm = New-Object System.Windows.Forms.Form
|
||||
$topForm.TopMost = $true
|
||||
$topForm.Opacity = 0 # Invisible
|
||||
$topForm.ShowInTaskbar = $false
|
||||
$topForm.StartPosition = "CenterScreen"
|
||||
$topForm.Show()
|
||||
$topForm.Activate()
|
||||
|
||||
[System.Console]::Beep(1000, 200)
|
||||
[System.Console]::Beep(1000, 200)
|
||||
|
||||
$msgBody = "El tag '$tagName' YA EXISTE en GitHub.`n`nDeseas SOBRESCRIBIRLO?`n`nSi = Borrar anterior y actualizar (Force Push).`nNo = Subir solo codigo (mantener tag viejo)."
|
||||
$msgTitle = "⚠️ Conflicto de Versiones - $projectName"
|
||||
|
||||
# El mensaje ahora es "hijo" del formulario invisible, heredando su propiedad TopMost
|
||||
Write-Host "Preguntamos que hacer con el tag"
|
||||
$respuesta = [System.Windows.Forms.MessageBox]::Show($topForm, $msgBody, $msgTitle, "YesNo", "Warning")
|
||||
|
||||
$topForm.Dispose() # Limpiamos el formulario invisible
|
||||
|
||||
if ($respuesta -eq "Yes") {
|
||||
Write-Host "Sobrescribiendo..."
|
||||
git tag -d $tagName 2>$null
|
||||
git tag -a $tagName -m "Release version $version (Updated)"
|
||||
|
||||
git push origin
|
||||
git push origin $tagName --force
|
||||
Write-Host ">> Tag actualizado (Force Push)."
|
||||
} else {
|
||||
Write-Host "Conservando tag anterior..."
|
||||
git push origin
|
||||
Write-Host ">> Código subido."
|
||||
}
|
||||
} else {
|
||||
# Tag Nuevo
|
||||
git tag -a $tagName -m "Release version $version"
|
||||
git push origin --follow-tags
|
||||
Write-Host ">> Versión publicada."
|
||||
}
|
||||
|
||||
Write-Host "----------------------------------------"
|
||||
29
B4A/_juntaBas.bat
Normal file
29
B4A/_juntaBas.bat
Normal file
@@ -0,0 +1,29 @@
|
||||
@echo off
|
||||
setlocal EnableDelayedExpansion
|
||||
|
||||
:: Nombre del archivo de salida
|
||||
set "OutputFile=TODOS_LOS_BAS.txt"
|
||||
|
||||
:: Si existe una versión anterior, la elimina para no anexar datos duplicados
|
||||
if exist "!OutputFile!" del "!OutputFile!"
|
||||
|
||||
echo Iniciando proceso de fusion...
|
||||
|
||||
:: Itera sobre todos los archivos .bas en el directorio actual
|
||||
for %%F in (*.bas *.b4a *.b4j) do (
|
||||
echo Procesando: %%F
|
||||
|
||||
:: Agrega un salto de linea y el encabezado al archivo de salida
|
||||
echo. >> "!OutputFile!"
|
||||
echo ====================================== >> "!OutputFile!"
|
||||
echo ARCHIVO: %%F >> "!OutputFile!"
|
||||
echo ====================================== >> "!OutputFile!"
|
||||
echo. >> "!OutputFile!"
|
||||
|
||||
:: Vuelca el contenido del archivo actual al archivo de salida
|
||||
type "%%F" >> "!OutputFile!"
|
||||
)
|
||||
|
||||
echo.
|
||||
echo Proceso terminado. Se ha creado el archivo: !OutputFile!
|
||||
pause
|
||||
@@ -101,6 +101,8 @@ Sub RD_Init
|
||||
agregaColumna(rkmt, "CAT_DETALLES_PAQ", "CAT_DP_PRECIOB", "TEXT")
|
||||
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_RMI") Then rkmt.ExecNonQuery($"create table if not exists CAT_RMI (${getTableColumnList(khdb, "CAT_RMI")}, FECHA TEXT)"$)
|
||||
DateTime.DateFormat = "yyyyMMdd"
|
||||
|
||||
@@ -82,11 +82,12 @@ Sub traeInfoTrendSpending As Map
|
||||
End If
|
||||
If semana > 0 Then
|
||||
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"$)
|
||||
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
|
||||
For i = 0 To c.RowCount - 1
|
||||
c.Position = i
|
||||
HIST_TSS_SEMANA = c.GetString($"HIST_TSS_SEMANA${semana}"$)
|
||||
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
|
||||
@@ -124,7 +125,7 @@ Sub modTrendSpending(accion As String, tipo As String, monto As String)
|
||||
acumulado = d.GetString("ACUMULADO")
|
||||
End If
|
||||
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("---- " & c.RowCount)
|
||||
If accion.ToUpperCase = "RESTA" Then
|
||||
|
||||
Reference in New Issue
Block a user