- Cambios en el codigo de promociones.

This commit is contained in:
2024-05-11 02:20:10 -06:00
parent faf9143d25
commit 99bf32b3fd
4 changed files with 110 additions and 113 deletions

View File

@@ -327,9 +327,10 @@ Sub lv_catalogos_ItemClick (Position As Int, Value As Object)
For i=0 To c2.RowCount -1 For i=0 To c2.RowCount -1
c2.Position=i c2.Position=i
Private tm As Map = Subs.procesaPromocion(c2.GetString("CAT_GP_ID"), clienteId) Private tm As Map = Subs.procesaPromocion(c2.GetString("CAT_GP_ID"), clienteId)
promosC.procesaPromocion(c2.GetString("CAT_GP_ID"), clienteId) ' Private tm As Map = promosC.procesaPromocion(c2.GetString("CAT_GP_ID"), clienteId, Starter.tipov)
' Log(tm)
If tm.Get("status") = "ok" Then 'Solo muestrala si hay producto. If tm.Get("status") = "ok" Then 'Solo muestrala si hay producto.
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("prodsFijosCant") & " V:" & tm.Get("prodsVariablesCant"))
End If End If
Next Next
Else Else

View File

@@ -17,7 +17,7 @@ ModuleBookmarks22=
ModuleBookmarks23= ModuleBookmarks23=
ModuleBookmarks24= ModuleBookmarks24=
ModuleBookmarks25= ModuleBookmarks25=
ModuleBookmarks26= ModuleBookmarks26=199
ModuleBookmarks27= ModuleBookmarks27=
ModuleBookmarks28= ModuleBookmarks28=
ModuleBookmarks29= ModuleBookmarks29=
@@ -91,6 +91,6 @@ ModuleClosedNodes6=
ModuleClosedNodes7= ModuleClosedNodes7=
ModuleClosedNodes8= ModuleClosedNodes8=
ModuleClosedNodes9= ModuleClosedNodes9=
NavigationStack=C_Productos,lv_catalogos_ItemClick,323,5,Promociones,restaFijosPromo,363,6,C_Principal,SUBIR_INFO_PEDIDO,2841,0,C_CheckList,Bt_GuardarCheck_Click,558,0,C_Principal,B4XPage_Appear,304,0,C_Principal,e_ruta_EnterPressed,2131,3,Main,Globals,24,0,Main,Activity_KeyPress,42,0,B4XMainPage,B4XPage_Created,127,0,Subs,bitacora,1698,5 NavigationStack=C_Cliente,Guardar_Click,966,0,Promociones,restaFijosPromo,346,6,Promociones,revisaMaxPromosProdsVariablesPorInventarioXX,240,0,Promociones,procesaPromocion,32,6,Promociones,revisaMaxPromosProdsFijosPorInventario,203,6,Subs,traePromo,1030,0,Subs,traeMaxPromos,1188,0,Promociones,traeMaxPromos,392,2,Promociones,traePromo,98,6,C_Productos,lv_catalogos_ItemClick,322,2
SelectedBuild=0 SelectedBuild=0
VisibleModules=1,28,11,3,12,4,29,8,26,13,2 VisibleModules=1,28,11,3,26,12,4,29,8,13,2

View File

@@ -11,6 +11,7 @@ Sub Class_Globals
Dim db As SQL Dim db As SQL
Private EventName As String 'ignore Private EventName As String 'ignore
Private CallBack As Object 'ignore Private CallBack As Object 'ignore
Dim tablaProds As String
End Sub End Sub
'Initializes the object. You can add parameters to this method if needed. 'Initializes the object. You can add parameters to this method if needed.
@@ -24,51 +25,55 @@ Public Sub Initialize (vCallback As Object, vEventName As String, db0 As SQL) As
Return Me Return Me
End Sub End Sub
Sub procesaPromocion(idPromo As String, cliente0 As String, tipoVenta As String) As Map 'ignore
Sub procesaPromocion(idPromo As String, cliente0 As String) As Map '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.
cliente = cliente0 cliente = cliente0
Private inicioContador As String = DateTime.Now Private inicioContador As String = DateTime.Now
Private maxPromos As Int = 0 Private maxPromos As Int = 0
If thisLog Then LogColor($"********* Iniciamos revision de Promo ${idPromo} *********"$, Colors.red) Private maxPromosXFijos As Int = 0
tablaProds = "cat_gunaprod2"
If tipoVenta = "ABORDO" Or tipoVenta = "PREVENTA" Then tablaProds = "cat_gunaprod"
If thisLog Then LogColor($"********* Iniciamos revision de Promo ${idPromo} *********"$, Colors.Blue)
' LogColor("**************************** " & traeInfoFromPromo("P_PRODSFIJOS", idPromo), Colors.blue) ' LogColor("**************************** " & traeInfoFromPromo("P_PRODSFIJOS", idPromo), Colors.blue)
' Private d As List = traeListFromPromo("P_PRODSFIJOS", idPromo) traePromo(idPromo, cliente0) ' Generamos la tabla con la información d la promoción.
' Log(d.Get(0)) maxPromosXFijos = revisaMaxPromosProdsFijosPorInventario(idPromo)
If maxPromosXFijos < 1 Then
'Obtenemos el mapa con toda la info de la promoción. Log(444)
' Private pm As Map = traePromo(idPromo, cliente) db.ExecNonQuery($"update PROMOCIONES_INFO set P_ESTATUS = 'ko' where P_ID = '${idPromo}'"$)
traePromo(idPromo, cliente0) End If
' If thisLog Then LogColor(pm, Colors.Blue) Private logColor1 As String
' If thisLog Then LogColor("|" & pm.Get("maxPromos") & "|", Colors.Blue) If traeInfoFromPromo("P_ESTATUS", idPromo) = "ok" Then logColor1 = Colors.RGB(0,143,0) Else logColor1 = Colors.Red
' Log("|"&revisaMaxPromosProdsFijosPorInventario(pm)&"|") If thisLog And traeInfoFromPromo("P_ESTATUS", idPromo) = "ok" Then LogColor($"### MAX PROMOS X FIJOS = ${maxPromosXFijos}"$, logColor1)
If revisaMaxPromosProdsFijosPorInventario(idPromo) < 1 Then db.ExecNonQuery($"update PROMOCIONES_INFO set P_ESTATUS = 'ko' where P_ID = '${idPromo}'"$)
Log($"resultado = ${traeInfoFromPromo("P_ESTATUS", idPromo)}"$)
If traeInfoFromPromo("P_ESTATUS", idPromo) = "ok" Then 'Si encontramos la promoción, entonces ... If traeInfoFromPromo("P_ESTATUS", idPromo) = "ok" Then 'Si encontramos la promoción, entonces ...
'Buscamos el máximo de promociones permitidas. maxPromos = traeMaxPromos(idPromo) ' Buscamos el máximo de promociones permitidas.
maxPromos = traeMaxPromos(idPromo) If thisLog Then LogColor($"Promociones permitidas=${maxPromos}"$, Colors.Blue)
' If thisLog Then LogColor($"Promociones permitidas=${mp}"$, Colors.Blue) If thisLog Then Log("Promos vendidas: " & traePromosVendidas(idPromo))
' If thisLog Then Log("Promos vendidas: " & traePromosVendidas(idPromo, cliente))
If maxPromos < 1 Then If maxPromos < 1 Then
If thisLog Then LogColor("Ya se vendieron las promos PERMITIDAS para el cliente", Colors.red) If thisLog Then LogColor("Ya se vendieron las promos PERMITIDAS para el cliente", Colors.red)
Return CreateMap("status":"ko") ' , "mp":pm Return CreateMap("status":"ko") ' , "mp":pm
End If End If
'Restamos del inventario (mapa) las piezas necesarias para los productos fijos. 'Restamos del inventario (mapa) las piezas necesarias para los productos fijos.
Private inventarioSinFijos As Map = restaFijosPromo(idPromo)
Private inventarioSinFijos As Map = restaFijosPromo(idPromo, CreateMap()) If thisLog Then LogColor("inventarioSinFijos="&inventarioSinFijos, Colors.Magenta)
If thisLog Then LogColor("inventariosfijos="&inventarioSinFijos, Colors.Magenta) 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(idPromo, inventarioSinFijos)
' Private pv As Boolean = alcanzanLosVariablesParaPromo(pm, inventarioSinFijos) If pv Then logColor1 = Colors.RGB(0,143,0) Else logColor1 = Colors.Red
' If thisLog Then Log("Alcanzan los variables? --> " & pv) If thisLog And pv Then
' If pv Then Return CreateMap("status":"ok", "mp":pm) Else Return CreateMap("status":"ko", "mp":pm) LogColor("### ALCANZAN LOS VARIABLES? --> " & pv, logColor1)
' Else End If
' If thisLog Then LogColor("NO HAY INVENTARIO SUFICIENTE " & idPromo, Colors.red) If pv Then
' Return CreateMap("status":"ko", "mp":pm) Return CreateMap("status":"ok", "prodsFijosCant":traeInfoFromPromo("P_PRODSFIJOS_CANT", idPromo), "prodsVariablesCant":traeInfoFromPromo("P_PRODSVARIABLES_CANT", idPromo))
' End If
Else Else
If thisLog Then LogColor("NO HAY INVENTARIO SUFICIENTE " & idPromo, Colors.red)
Return CreateMap("status":"ko")
End If
Else
If thisLog Then LogColor("NO HAY INVENTARIO SUFICIENTE " & idPromo, Colors.red)
Return CreateMap("status":"ko")
End If
Else
If thisLog Then LogColor("NO HAY INVENTARIO SUFICIENTE " & idPromo, Colors.red)
Return CreateMap("status":"ko") ' , "mp":pm Return CreateMap("status":"ko") ' , "mp":pm
End If End If
' Si tenemos suficiente inventario para los variables mostramos la promocion, si no ... ' Si tenemos suficiente inventario para los variables mostramos la promocion, si no ...
@@ -76,17 +81,16 @@ Sub procesaPromocion(idPromo As String, cliente0 As String) As Map 'ignore
LogColor("TIEMPO DE PROCESO ESTA PROMO: " & ((DateTime.Now-inicioContador)/1000), Colors.Red) LogColor("TIEMPO DE PROCESO ESTA PROMO: " & ((DateTime.Now-inicioContador)/1000), Colors.Red)
End Sub End Sub
'Regresa un mapa con la información de la promo. 'Genera una tabla (PROMOCIONES_INFO) con la información de la promo.
'Regresa: {id, maxXcliente, maxRecurrente, maxPromos, historico, 'Columnas: P_ID, P_MAXXCLIENTE, P_MAXRECURRENTE, P_MAXPROMOS, HISTORICO,
' productos={idProducto={idProducto, preciosimptos, precio, almacen, tipo, piezas, usuario, fecha, regalo, clasif}} 'Mapa con los productos de la promo y los datos de cada uno. ' P_TIPOS={idProducto=tipo} 'Mapa con id y tipo del producto, 0 si es fijo y 1 si es variable.
' tipos={idProducto=tipo} 'Mapa con id y tipo del producto, 0 si es fijo y 1 si es variable. ' P_PRODSFIJOS=[idProducto,idProducto] 'Lista con los ids de los productos fijos.
' prodsFijos={idProducto,idProducto} 'Lista con los ids de los productos fijos. ' P_PRODSVARIABLES=[idProducto,idProducto] 'Lista con los ids de los productos variables.
' prodsVariables={idProducto,idProducto} 'Lista con los ids de los productos variables. ' P_ESTATUS="OK" 'Ok si existe la promocion.
' resultado="OK" 'Ok si existe la promocion. ' P_PRODSVARIABLES_REQUERIDOS=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, cliente0 As String) As Map Sub traePromo(promo As String, cliente0 As String) As Map
Private thisLog As Boolean = True Private thisLog As Boolean = True
If thisLog Then LogColor("############# traePromoC: "&promo, Colors.red) If thisLog Then LogColor("################## TraePromoC: " & promo & " ##################", Colors.blue)
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 las el maximo de promocioones a otorgar.
Private siHistorico As String = 0 Private siHistorico As String = 0
@@ -108,23 +112,23 @@ Sub traePromo(promo As String, cliente0 As String) As Map
End If End If
If c.RowCount > 0 Then 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")) ' promoMap = CreateMap("id":promo, "maxXcliente":c.GetString("CAT_PA_MAXPROMCLIE"), "maxRecurrente":c.GetString("CAT_PA_MAXPROMREC"), "maxPromos":c.GetString("CAT_PA_MAXPROM"))
db.ExecNonQuery($"update PROMOCIONES_INFO set P_MAXXCLIENTE = ${c.GetInt("CAT_PA_MAXPROMREC")}, P_MAXRECURRENTE = ${c.GetInt("CAT_PA_MAXPROMREC")}, P_MAXPROMOS = ${c.GetInt("CAT_PA_MAXPROM")} where P_ID = '${promo}'"$) db.ExecNonQuery($"update PROMOCIONES_INFO set P_MAXXCLIENTE = ${c.GetInt("CAT_PA_MAXPROMCLIE")}, P_MAXRECURRENTE = ${c.GetInt("CAT_PA_MAXPROMREC")}, P_MAXPROMOS = ${c.GetInt("CAT_PA_MAXPROM")} where P_ID = '${promo}'"$)
' Log($"update PROMOCIONES_INFO set P_MAXXCLIENTE = ${c.GetInt("CAT_PA_MAXPROMREC")}, P_MAXRECURRENTE = ${c.GetInt("CAT_PA_MAXPROMREC")}, P_MAXPROMOS = ${c.GetInt("CAT_PA_MAXPROM")} where P_ID = '${promo}'"$) ' Log($"update PROMOCIONES_INFO set P_MAXXCLIENTE = ${c.GetInt("CAT_PA_MAXPROMREC")}, P_MAXRECURRENTE = ${c.GetInt("CAT_PA_MAXPROMREC")}, P_MAXPROMOS = ${c.GetInt("CAT_PA_MAXPROM")} where P_ID = '${promo}'"$)
End If 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 = '${cliente0}' "$) Private ps As Cursor = Starter.skmt.ExecQuery($"select * from HIST_CLIENTE_CANT_PROMOS where HCCP_PROMO = '${promo}' and HCCP_CLIENTE = '${cliente0}' "$)
' Log($"select * from HIST_CLIENTE_CANT_PROMOS where HCCP_PROMO = '${promo}' and HCCP_CLIENTE = '${cliente0}' "$) ' Log($"select * from HIST_CLIENTE_CANT_PROMOS where HCCP_PROMO = '${promo}' and HCCP_CLIENTE = '${cliente0}' "$)
Log($"PROMOS SEGMENTADAS DISPONIBLES: ${ps.RowCount}"$) If thisLog Then Log($"PROMOS SEGMENTADAS DISPONIBLES: ${ps.RowCount}"$)
If ps.RowCount > 0 Then If ps.RowCount > 0 Then
ps.Position = 0 ps.Position = 0
db.ExecNonQuery($"update PROMOCIONES_INFO set P_MAXXCLIENTE = 0, P_MAXRECURRENTE = 0, P_MAXPROMOS = 0 where P_ID = '${promo}'"$) 'Si es segmentada la ponemos en cero, porque SOLO le debe de aparecer a ciertos clientes. db.ExecNonQuery($"update PROMOCIONES_INFO set P_MAXXCLIENTE = 0, P_MAXRECURRENTE = 0, P_MAXPROMOS = 0 where P_ID = '${promo}'"$) '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. ' 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.
LogColor($">>> PROMO "${promo}" SEGMENTADA PARA EL CLIENTE ${ps.GetString("HCCP_CLIENTE")}"$, Colors.Magenta) If thisLog Then LogColor($">>> PROMO "${promo}" SEGMENTADA PARA EL CLIENTE ${ps.GetString("HCCP_CLIENTE")}"$, Colors.Magenta)
' 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 = '${cliente0}' 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 = '${cliente0}' 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}"$) If thisLog Then Log($"registros:${ps2.RowCount}"$)
If ps2.RowCount > 0 Then If ps2.RowCount > 0 Then
ps2.Position = 0 ps2.Position = 0
' Log($"registros:${ps2.RowCount}, cliente: ${ps2.GetString("HCCP_CLIENTE")} cant:${ps2.GetString("HCCP_CANT")}, Vendidas: ${ps2.GetString("HCCP_CANT_VENDIDA")}"$) ' Log($"registros:${ps2.RowCount}, cliente: ${ps2.GetString("HCCP_CLIENTE")} cant:${ps2.GetString("HCCP_CANT")}, Vendidas: ${ps2.GetString("HCCP_CANT_VENDIDA")}"$)
@@ -189,51 +193,49 @@ Sub traePromo(promo As String, cliente0 As String) As Map
End If End If
c.Close c.Close
' 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: ${traemosInvDispParaPromo(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.Blue)
' Return promoMap ' Return promoMap
End Sub 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(id As String) As Int Sub revisaMaxPromosProdsFijosPorInventario(id As String) As Int
' Private pm As Map = CreateMap() '' XXXXXXXX
Private thisLog As Boolean = True Private thisLog As Boolean = True
Private invFijoXpromo As Map ' Private invFijoXpromo As Map
Private t As List Private t As List
Private c As ResultSet = db.ExecQuery($"select P_PRODSFIJOS, P_PRODSFIJOS_PIEZAS from PROMOCIONES_INFO where P_ID = '${id}'"$) Private c As ResultSet = db.ExecQuery($"select P_PRODSFIJOS, P_PRODSFIJOS_PIEZAS from PROMOCIONES_INFO where P_ID = '${id}'"$)
t.Initialize t.Initialize
t.Add(traeMaxPromos(id)) ' Agregamos a la lista las promos maximas permitidas (recurrente, cliente y promo). t.Add(traeMaxPromos(id)) ' Agregamos a la lista las promos maximas permitidas (recurrente, cliente y promo).
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(id) Private invDispParaPromo As Map = traemosInvDispParaPromo(id)
If thisLog Then Log(">>>>> " & $"invDispParaPromo=${invDispParaPromo}"$) If thisLog Then Log(">>>>> " & $"invDispParaPromo=${invDispParaPromo}"$)
Private prodsFijosPiezas As List = traeListFromPromo("P_PRODSFIJOS_PIEZAS", id) Private prodsFijosPiezas As List = traeListFromPromo("P_PRODSFIJOS_PIEZAS", id)
Private idProdsFijos As List = traeListFromPromo("P_PRODSFIJOS", id) Private idProdsFijos As List = traeListFromPromo("P_PRODSFIJOS", id)
Log($"${idProdsFijos},${prodsFijosPiezas}"$) If thisLog Then Log($"${idProdsFijos},${prodsFijosPiezas}"$)
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
Log($"|${invDispParaPromo.Get("3800025096")}|"$) ' Log($"|${invDispParaPromo.Get("3800025096")}|"$)
Private tmpId As String = idProdsFijos.Get(p) ' Private tmpId As String = idProdsFijos.Get(p)
Log($"### ThisP = |${idProdsFijos.Get(p)}| -> |${invDispParaPromo.Get(tmpId)}| -> |${invDispParaPromo.Get(idProdsFijos.Get(p).As(String))}|"$) If thisLog Then Log($"### esteFijo = ${idProdsFijos.Get(p)} InvDisp = ${invDispParaPromo.Get(idProdsFijos.Get(p).As(String))}"$)
If invDispParaPromo.Get(idProdsFijos.Get(p).As(String)) <> Null Then If invDispParaPromo.Get(idProdsFijos.Get(p).As(String)) <> Null Then
thisInvDisp = invDispParaPromo.Get(idProdsFijos.Get(p).As(String)) thisInvDisp = invDispParaPromo.Get(idProdsFijos.Get(p).As(String))
Log($"thisInvDisp = ${thisInvDisp}"$) If thisLog Then Log($"thisInvDispFijos = ${thisInvDisp}"$)
End If End If
If thisLog Then Log($"id=${idProdsFijos.Get(p)}, inv=${thisInvDisp}, pzas=${prodsFijosPiezas.Get(p)}"$) If thisLog Then Log($"idFijo=${idProdsFijos.Get(p)}, inv=${thisInvDisp}, pzas=${prodsFijosPiezas.Get(p)}"$)
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.
If thisLog Then Log(x(0)) If thisLog Then Log(x(0))
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.
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 resultado mas pequeño.
If thisLog Then LogColor($"promosProdsFijosDisp=${t}"$, Colors.Blue)
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($"prodsFijosInv=${prodsFijosPiezas}"$, Colors.Blue)
If thisLog Then LogColor($"invFijoXpromo=${invFijoXpromo}"$, Colors.Blue) ' If thisLog Then LogColor($"invFijoXpromo=${invFijoXpromo}"$, Colors.Blue)
If thisLog Then LogColor("Max promos de prodsFijos POR inventario = " & t.Get(0), Colors.red) If thisLog Then LogColor("Max promos de prodsFijos POR inventario = " & t.Get(0), Colors.Magenta)
' LogColor(">>>>>> " & t.Get(0), Colors.red) ' LogColor(">>>>>> " & t.Get(0), Colors.red)
Return t.Get(0) 'Regresamos el resultado mas pequeño. Return t.Get(0) 'Regresamos el resultado mas pequeño.
End Sub End Sub
@@ -243,7 +245,7 @@ End Sub
'promos por productos fijos llega al maximo, aunque se puedan mas de producos variables, solo se 'promos por productos fijos llega al maximo, aunque se puedan mas de producos variables, solo se
'regresa el maximo por productos fijos. Ej. si las promos por variables es 10, pero el maximo por 'regresa el maximo por productos fijos. Ej. si las promos por variables es 10, pero el maximo por
'fijos es 5, entonces regresamos 5. 'fijos es 5, entonces regresamos 5.
Sub revisaMaxPromosProdsVariablesPorInventario(pm As Map) As Int 'ignore Sub revisaMaxPromosProdsVariablesPorInventarioXX(pm As Map) As Int 'ignore
Private thisLog As Boolean = True Private thisLog As Boolean = True
If thisLog Then Log("======================================================") If thisLog Then Log("======================================================")
If thisLog Then Log("======================================================") If thisLog Then Log("======================================================")
@@ -251,7 +253,7 @@ Sub revisaMaxPromosProdsVariablesPorInventario(pm As Map) As Int 'ignore
invFijoXpromo.Initialize invFijoXpromo.Initialize
Private totalProdsVariablesDisponibles As Int = 0 Private totalProdsVariablesDisponibles As Int = 0
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 = traemosInvDispParaPromo(pm.Get("id"))
If thisLog Then Log($"invDispParaPromo=${invDispParaPromo}"$) If thisLog Then Log($"invDispParaPromo=${invDispParaPromo}"$)
Private maxPromos As String = traeMaxPromos(pm) Private maxPromos As String = traeMaxPromos(pm)
Private maxPromosXFijos As Int = revisaMaxPromosProdsFijosPorInventario(pm) Private maxPromosXFijos As Int = revisaMaxPromosProdsFijosPorInventario(pm)
@@ -301,9 +303,8 @@ Sub revisaMaxPromosProdsVariablesPorInventario(pm As Map) As Int 'ignore
Return maxPromosXVariables Return maxPromosXVariables
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 traemosInvDispParaPromo(promo As String) As Map 'ignore
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
@@ -321,61 +322,55 @@ Sub traemosInventarioDisponibleParaPromo(promo As String) As Map 'ignore
Return prods Return prods
End Sub End Sub
'Resta los productos fijos del inventario de la promoción (mapa) y regresa un mapa con el nuevo inventario. 'Resta los productos fijos del inventario de la promoción y regresa un mapa con el nuevo inventario.
'Hay que darle como parametro un mapa (traePromo(promo)) con toda la informacion de la promocion. 'Hay que darle como parametro el Id de la promocion.
'Regresa en el mapa la llave "resultado" que nos da "ok" o "No hay suficiente producto para la promocion". 'Regresa en el mapa la llave "resultado" que nos da "ok" o "No hay suficiente producto para la promocion".
Sub restaFijosPromo(idPromo As String, promoMap As Map) As Map 'ignore Sub restaFijosPromo(idPromo 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 inventariosDisponiblesParaEstaPromo As Map = traemosInventarioDisponibleParaPromo(idPromo) 'Obtenemos un mapa con el inventario disponible para cada producto de la promocion desde la base de datos. Private invDisponibleEstaPromo As Map = traemosInvDispParaPromo(idPromo) 'Obtenemos un mapa con el inventario disponible para cada producto de la promocion desde la base de datos.
If thisLog Then LogColor("Inventario inicial antes de FIJOS: "&invDisponibleEstaPromo, Colors.Magenta) 'Inventario inicial.
If thisLog Then LogColor(inventariosDisponiblesParaEstaPromo, Colors.red)
If thisLog Then LogColor("Inventario inicial antes de FIJOS: "&inventariosDisponiblesParaEstaPromo, Colors.Gray) 'Inventario inicial.
Private i As Int Private i As Int
Private prodsmap As Map = promoMap.Get("productos") 'Obtenemos un mapa con todos los productos de la promoción. Private prodsFijos As List = traeListFromPromo("P_PRODSFIJOS", idPromo) 'Obtenemos una lista con los productos fijos de la promoción.
Private prodsFijos As List = traeListFromPromo("P_PRODSFIJOS", idPromo) 'Obtenemos un a lista con los productos fijos de la promoción. Private prodsFijosPiezas As List = traeListFromPromo("P_PRODSFIJOS_PIEZAS", idPromo) '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 invDisponibleEstaPromo.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 invDisponibleEstaPromo.Put("resultado", "ok") 'Si no lleva prods fijos la promo, entonces ponemos FIJOS OK.
Private nuevoInv As Int
For p = 0 To prodsFijos.Size - 1 For p = 0 To prodsFijos.Size - 1
Log(555)
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.
Private p2 As Map = prodsmap.Get(t) 'Obtenemos un mapa con los datos de este producto (id, precio, almacen, tipo, piezas, etc.) If thisLog Then Log($"T: ${t}, Prod ${prodsFijos.Get(p)}, piezasReq: ${prodsFijosPiezas.Get(p)}"$) 'Producto y piezas requeridas
If thisLog Then Log($"T: ${t}, prod ${p2.Get("idProducto")}, piezas: ${p2.Get("piezas")}"$) 'Producto y piezas requeridas If thisLog Then Log("invDisponibleEstaPromo="&invDisponibleEstaPromo)
If thisLog Then Log("inventariosDisponiblesParaEstaPromo="&inventariosDisponiblesParaEstaPromo) If invDisponibleEstaPromo.ContainsKey(t) Then 'Si el mapa del inventario contiene el id del producto entonces ...
If inventariosDisponiblesParaEstaPromo.ContainsKey(t) Then 'Si el mapa del inventario contiene el id del producto entonces ... Log(555)
i = inventariosDisponiblesParaEstaPromo.get(t) 'Obtenemos del mapa el inventario de este producto. i = invDisponibleEstaPromo.get(t) 'Obtenemos del mapa el inventario de este producto.
Private nuevoInv As Int = NumberFormat2((i - promoMap.Get("prodsFijosPiezas").As(List).get(p)), 1, 0,0,False) nuevoInv = NumberFormat2((i - prodsFijosPiezas.get(p)), 1, 0,0,False)
If thisLog Then Log($"Nuevo inventario de ${t}: ${i}-${promoMap.Get("prodsFijosPiezas").As(List).get(p)} = ${nuevoInv}"$) 'El nuevo inventario. If thisLog Then Log($"Nuevo inventario de ${t}: ${i}-${prodsFijosPiezas.get(p)} = ${nuevoInv}"$) 'El nuevo inventario.
inventariosDisponiblesParaEstaPromo.Put(t, $"${nuevoInv}"$) 'Restamos del inventario las piezas requeridas para la promoción y guardamos el nuevo inventario en el mapa. invDisponibleEstaPromo.Put(t, $"${nuevoInv}"$) 'Restamos del inventario las piezas requeridas para la promoción y guardamos el nuevo inventario en el mapa.
inventariosDisponiblesParaEstaPromo.Put("resultado", "ok") invDisponibleEstaPromo.Put("resultado", "ok")
Else 'Si en el mapa no esta el id del producto, entonces no tenemos inventario. Else 'Si en el mapa no esta el id del producto, entonces no tenemos inventario.
inventariosDisponiblesParaEstaPromo.Put("resultado", "No hay suficiente producto para la promocion.") Log(777)
invDisponibleEstaPromo.Put("resultado", "No hay suficiente producto para la promocion.")
If thisLog Then LogColor("Sin suficiente inventario fijo: " & t, Colors.Blue) If thisLog Then LogColor("Sin suficiente inventario fijo: " & t, Colors.Blue)
Exit Exit
End If End If
If nuevoInv < 0 Then
'Aqui necesitamos el inventario del produccto de "t" invDisponibleEstaPromo.Put("resultado", "No hay suficiente producto para la promocion.") 'Si el inventario de este producto sale negativo, quiere decir que no tenemos suficiente inventario para la promoción.
traeInventario(t, "CAT_GUNAPROD2") 'Hay que poner codigo para seleccionar la tabla dependiendo de si es venta o abordo
If i - p2.Get("piezas") < 0 Then
inventariosDisponiblesParaEstaPromo.Put("resultado", "No hay suficiente producto para la promocion.") 'Si el inventario de este producto sale negativo, quiere decir que no tenemos suficiente inventario para la promoción.
Exit Exit
End If End If
Next Next
If thisLog Then LogColor("Inventario final despues de FIJOS: "&inventariosDisponiblesParaEstaPromo, Colors.blue) 'Inventario final. If thisLog Then LogColor("Inventario final despues de FIJOS: "&invDisponibleEstaPromo, Colors.blue) 'Inventario final.
Return inventariosDisponiblesParaEstaPromo Return invDisponibleEstaPromo
End Sub 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(idPromo As String, inventarioSinFijos As Map) As Boolean 'ignore
Private thisLog As Boolean = False '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.
Private prodsVariables As List = promoMap.get("prodsVariables") 'Obtenemos un a lista con los productos variables de la promoción. Private prodsVariables As List = traeListFromPromo("P_PRODSVARIABLES", idPromo) ' promoMap.get("prodsVariables") 'Obtenemos un a lista con los productos variables de la promoción.
For p = 0 To prodsVariables.Size - 1 For p = 0 To prodsVariables.Size - 1
Private t As String = prodsVariables.Get(p) 'Obtenemos el Id de este producto desde la lista de productos fijos. Private t As String = prodsVariables.Get(p) 'Obtenemos el Id de este producto desde la lista de productos fijos.
If inventarioSinFijos.ContainsKey(t) Then 'Si existe el producto en la lista del inventario, entonces ... If inventarioSinFijos.ContainsKey(t) Then 'Si existe el producto en la lista del inventario, entonces ...
@@ -384,9 +379,10 @@ Sub alcanzanLosVariablesParaPromo(promoMap As Map, inventarioSinFijos As Map) As
totalProdsVariables = totalProdsVariables + p2 totalProdsVariables = totalProdsVariables + p2
End If End If
Next Next
If thisLog Then Log("Total prods variables=" & totalProdsVariables & ", requeridos=" & promoMap.Get("prodsVariablesRequeridos")) Private prodsVariablesRequeridos As Int = traeInfoFromPromo("P_PRODSVARIABLES_REQUERIDOS", idPromo)
If thisLog Then Log("Total prods variables=" & totalProdsVariables & ", requeridos=" & prodsVariablesRequeridos)
Private res As Boolean = False Private res As Boolean = False
If totalProdsVariables >= promoMap.Get("prodsVariablesRequeridos") Then res = True 'Si el total de inventario de productos variables (totalProdsVariables) es mayor o igual a los productos requeridos entonces regresamos TRUE If totalProdsVariables >= prodsVariablesRequeridos Then res = True 'Si el total de inventario de productos variables (totalProdsVariables) es mayor o igual a los productos requeridos entonces regresamos TRUE
Return res Return res
End Sub End Sub
@@ -397,7 +393,7 @@ Sub traeMaxPromos(idPromo As String) As Int
Private mp0, mp As String = "0" Private mp0, mp As String = "0"
maxPromos.Initialize maxPromos.Initialize
Private hccp As Cursor = db.ExecQuery($"select HCCP_CANT from HIST_CLIENTE_CANT_PROMOS where HCCP_CLIENTE = '${cliente}' and HCCP_PROMO = '${idPromo}'"$) Private hccp As Cursor = db.ExecQuery($"select HCCP_CANT from HIST_CLIENTE_CANT_PROMOS where HCCP_CLIENTE = '${cliente}' and HCCP_PROMO = '${idPromo}'"$)
If thisLog Then LogColor("==== HISTORICO:"&traeInfoFromPromo("HISTORICO", idPromo), Colors.Red) If thisLog Then LogColor("==== HISTORICO: "&traeInfoFromPromo("HISTORICO", idPromo), Colors.Blue)
' If thisLog Then Log(pm) ' If thisLog Then Log(pm)

View File

@@ -1002,7 +1002,7 @@ 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 = True
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 las el maximo de promocioones a otorgar.