- 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
c2.Position=i
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.
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
Next
Else

View File

@@ -17,7 +17,7 @@ ModuleBookmarks22=
ModuleBookmarks23=
ModuleBookmarks24=
ModuleBookmarks25=
ModuleBookmarks26=
ModuleBookmarks26=199
ModuleBookmarks27=
ModuleBookmarks28=
ModuleBookmarks29=
@@ -91,6 +91,6 @@ ModuleClosedNodes6=
ModuleClosedNodes7=
ModuleClosedNodes8=
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
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
Private EventName As String 'ignore
Private CallBack As Object 'ignore
Dim tablaProds As String
End Sub
'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
End Sub
Sub procesaPromocion(idPromo As String, cliente0 As String) As Map 'ignore
Private thisLog As Boolean = False 'Si es verdadero, muestra los logs de este sub.
Sub procesaPromocion(idPromo As String, cliente0 As String, tipoVenta As String) As Map 'ignore
Private thisLog As Boolean = True 'Si es verdadero, muestra los logs de este sub.
cliente = cliente0
Private inicioContador As String = DateTime.Now
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)
' Private d As List = traeListFromPromo("P_PRODSFIJOS", idPromo)
' Log(d.Get(0))
'Obtenemos el mapa con toda la info de la promoción.
' Private pm As Map = traePromo(idPromo, cliente)
traePromo(idPromo, cliente0)
' If thisLog Then LogColor(pm, Colors.Blue)
' If thisLog Then LogColor("|" & pm.Get("maxPromos") & "|", Colors.Blue)
' Log("|"&revisaMaxPromosProdsFijosPorInventario(pm)&"|")
If revisaMaxPromosProdsFijosPorInventario(idPromo) < 1 Then db.ExecNonQuery($"update PROMOCIONES_INFO set P_ESTATUS = 'ko' where P_ID = '${idPromo}'"$)
Log($"resultado = ${traeInfoFromPromo("P_ESTATUS", idPromo)}"$)
traePromo(idPromo, cliente0) ' Generamos la tabla con la información d la promoción.
maxPromosXFijos = revisaMaxPromosProdsFijosPorInventario(idPromo)
If maxPromosXFijos < 1 Then
Log(444)
db.ExecNonQuery($"update PROMOCIONES_INFO set P_ESTATUS = 'ko' where P_ID = '${idPromo}'"$)
End If
Private logColor1 As String
If traeInfoFromPromo("P_ESTATUS", idPromo) = "ok" Then logColor1 = Colors.RGB(0,143,0) Else logColor1 = Colors.Red
If thisLog And traeInfoFromPromo("P_ESTATUS", idPromo) = "ok" Then LogColor($"### MAX PROMOS X FIJOS = ${maxPromosXFijos}"$, logColor1)
If traeInfoFromPromo("P_ESTATUS", idPromo) = "ok" Then 'Si encontramos la promoción, entonces ...
'Buscamos el máximo de promociones permitidas.
maxPromos = traeMaxPromos(idPromo)
' If thisLog Then LogColor($"Promociones permitidas=${mp}"$, Colors.Blue)
' If thisLog Then Log("Promos vendidas: " & traePromosVendidas(idPromo, cliente))
maxPromos = traeMaxPromos(idPromo) ' Buscamos el máximo de promociones permitidas.
If thisLog Then LogColor($"Promociones permitidas=${maxPromos}"$, Colors.Blue)
If thisLog Then Log("Promos vendidas: " & traePromosVendidas(idPromo))
If maxPromos < 1 Then
If thisLog Then LogColor("Ya se vendieron las promos PERMITIDAS para el cliente", Colors.red)
Return CreateMap("status":"ko") ' , "mp":pm
End If
'Restamos del inventario (mapa) las piezas necesarias para los productos fijos.
Private inventarioSinFijos As Map = restaFijosPromo(idPromo, CreateMap())
If thisLog Then LogColor("inventariosfijos="&inventarioSinFijos, Colors.Magenta)
' If inventarioSinFijos.Get("resultado") = "ok" Then
' 'Revisamos que los productos variables requeridos sean menos que el inventario total (mapa).
' Private pv As Boolean = alcanzanLosVariablesParaPromo(pm, inventarioSinFijos)
' If thisLog Then Log("Alcanzan los variables? --> " & pv)
' If pv Then Return CreateMap("status":"ok", "mp":pm) Else Return CreateMap("status":"ko", "mp":pm)
' Else
' If thisLog Then LogColor("NO HAY INVENTARIO SUFICIENTE " & idPromo, Colors.red)
' Return CreateMap("status":"ko", "mp":pm)
' End If
Private inventarioSinFijos As Map = restaFijosPromo(idPromo)
If thisLog Then LogColor("inventarioSinFijos="&inventarioSinFijos, Colors.Magenta)
If inventarioSinFijos.Get("resultado") = "ok" Then
'Revisamos que los productos variables requeridos sean menos que el inventario total (mapa).
Private pv As Boolean = alcanzanLosVariablesParaPromo(idPromo, inventarioSinFijos)
If pv Then logColor1 = Colors.RGB(0,143,0) Else logColor1 = Colors.Red
If thisLog And pv Then
LogColor("### ALCANZAN LOS VARIABLES? --> " & pv, logColor1)
End If
If pv Then
Return CreateMap("status":"ok", "prodsFijosCant":traeInfoFromPromo("P_PRODSFIJOS_CANT", idPromo), "prodsVariablesCant":traeInfoFromPromo("P_PRODSVARIABLES_CANT", idPromo))
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
End If
' 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)
End Sub
'Regresa un mapa con la información de la promo.
'Regresa: {id, maxXcliente, maxRecurrente, maxPromos, historico,
' productos={idProducto={idProducto, preciosimptos, precio, almacen, tipo, piezas, usuario, fecha, regalo, clasif}} 'Mapa con los productos de la promo y los datos de cada uno.
' tipos={idProducto=tipo} 'Mapa con id y tipo del producto, 0 si es fijo y 1 si es variable.
' prodsFijos={idProducto,idProducto} 'Lista con los ids de los productos fijos.
' prodsVariables={idProducto,idProducto} 'Lista con los ids de los productos variables.
' resultado="OK" 'Ok si existe la promocion.
' prodsVariablesRequeridos=5} 'Cantidad de productos variables requeridos para la promoción.
'Genera una tabla (PROMOCIONES_INFO) con la información de la promo.
'Columnas: P_ID, P_MAXXCLIENTE, P_MAXRECURRENTE, P_MAXPROMOS, HISTORICO,
' P_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.
' P_PRODSVARIABLES=[idProducto,idProducto] 'Lista con los ids de los productos variables.
' P_ESTATUS="OK" 'Ok si existe la promocion.
' P_PRODSVARIABLES_REQUERIDOS=5 'Cantidad de productos variables requeridos para la promoción.
Sub traePromo(promo As String, cliente0 As String) As Map
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 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
@@ -108,23 +112,23 @@ Sub traePromo(promo As String, cliente0 As String) As Map
End If
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"))
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}'"$)
End If
'######### PROMOCIONES SEGMENTADAS ##########
' Si la promo esta en la lista, SOLO los clientes que la tengan la pueden ver.
Private ps As Cursor = Starter.skmt.ExecQuery($"select * from HIST_CLIENTE_CANT_PROMOS where HCCP_PROMO = '${promo}' and HCCP_CLIENTE = '${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
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.
' 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}'
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($"registros:${ps2.RowCount}"$)
If thisLog Then Log($"registros:${ps2.RowCount}"$)
If ps2.RowCount > 0 Then
ps2.Position = 0
' 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
c.Close
' 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("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
End Sub
'Regresa cuantas promos alcanzan con los productos FIJOS que hay en inventario.
Sub revisaMaxPromosProdsFijosPorInventario(id As String) As Int
' Private pm As Map = CreateMap() '' XXXXXXXX
Private thisLog As Boolean = True
Private invFijoXpromo As Map
' Private invFijoXpromo As Map
Private t As List
Private c As ResultSet = db.ExecQuery($"select P_PRODSFIJOS, P_PRODSFIJOS_PIEZAS from PROMOCIONES_INFO where P_ID = '${id}'"$)
t.Initialize
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)
Private invDispParaPromo As Map = traemosInventarioDisponibleParaPromo(id)
Private invDispParaPromo As Map = traemosInvDispParaPromo(id)
If thisLog Then Log(">>>>> " & $"invDispParaPromo=${invDispParaPromo}"$)
Private prodsFijosPiezas As List = traeListFromPromo("P_PRODSFIJOS_PIEZAS", 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).
Private thisInvDisp As Int = 0
Log($"|${invDispParaPromo.Get("3800025096")}|"$)
Private tmpId As String = idProdsFijos.Get(p)
Log($"### ThisP = |${idProdsFijos.Get(p)}| -> |${invDispParaPromo.Get(tmpId)}| -> |${invDispParaPromo.Get(idProdsFijos.Get(p).As(String))}|"$)
' Log($"|${invDispParaPromo.Get("3800025096")}|"$)
' Private tmpId As String = idProdsFijos.Get(p)
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
thisInvDisp = invDispParaPromo.Get(idProdsFijos.Get(p).As(String))
Log($"thisInvDisp = ${thisInvDisp}"$)
If thisLog Then Log($"thisInvDispFijos = ${thisInvDisp}"$)
End If
If thisLog Then Log($"id=${idProdsFijos.Get(p)}, inv=${thisInvDisp}, pzas=${prodsFijosPiezas.Get(p)}"$)
If thisLog Then Log($"${(thisInvDisp / 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))}"$)
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))
t.Add(x(0).As(Int)) 'Solo guardamos la parte del entero de la division.
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($"prodsFijosPiezasReq=${prodsFijosPiezas}"$, 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($"prodsFijosInv=${prodsFijosPiezas}"$, Colors.Blue)
' If thisLog Then LogColor($"invFijoXpromo=${invFijoXpromo}"$, Colors.Blue)
If thisLog Then LogColor("Max promos de prodsFijos POR inventario = " & t.Get(0), Colors.Magenta)
' LogColor(">>>>>> " & t.Get(0), Colors.red)
Return t.Get(0) 'Regresamos el resultado mas pequeño.
End Sub
@@ -243,7 +245,7 @@ End Sub
'promos por productos fijos llega al maximo, aunque se puedan mas de producos variables, solo se
'regresa el maximo por productos fijos. Ej. si las promos por variables es 10, pero el maximo por
'fijos es 5, entonces regresamos 5.
Sub revisaMaxPromosProdsVariablesPorInventario(pm As Map) As Int 'ignore
Sub revisaMaxPromosProdsVariablesPorInventarioXX(pm As Map) As Int 'ignore
Private thisLog As Boolean = True
If thisLog Then Log("======================================================")
If thisLog Then Log("======================================================")
@@ -251,7 +253,7 @@ Sub revisaMaxPromosProdsVariablesPorInventario(pm As Map) As Int 'ignore
invFijoXpromo.Initialize
Private totalProdsVariablesDisponibles As Int = 0
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}"$)
Private maxPromos As String = traeMaxPromos(pm)
Private maxPromosXFijos As Int = revisaMaxPromosProdsFijosPorInventario(pm)
@@ -301,9 +303,8 @@ Sub revisaMaxPromosProdsVariablesPorInventario(pm As Map) As Int 'ignore
Return maxPromosXVariables
End Sub
'Regresa un mapa con el inventario disponible por producto para la promoción (desde la base de datos).
Sub traemosInventarioDisponibleParaPromo(promo As String) As Map 'ignore
Sub traemosInvDispParaPromo(promo As String) As Map 'ignore
Private c As Cursor
c = Starter.skmt.ExecQuery2("SELECT CAT_GP_ID, CAT_GP_ALMACEN FROM CAT_GUNAPROD2 WHERE CAT_GP_ID IN (select CAT_DP_IDPROD FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID = ?)", Array As String(promo))
' Private prodInv As Map
@@ -321,61 +322,55 @@ Sub traemosInventarioDisponibleParaPromo(promo As String) As Map 'ignore
Return prods
End Sub
'Resta los productos fijos del inventario de la promoción (mapa) y regresa un mapa con el nuevo inventario.
'Hay que darle como parametro un mapa (traePromo(promo)) con toda la informacion de la promocion.
'Resta los productos fijos del inventario de la promoción y regresa un mapa con el nuevo inventario.
'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".
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 inventariosDisponiblesParaEstaPromo As Map = traemosInventarioDisponibleParaPromo(idPromo) 'Obtenemos un mapa con el inventario disponible para cada producto de la promocion desde la base de datos.
If thisLog Then LogColor(inventariosDisponiblesParaEstaPromo, Colors.red)
If thisLog Then LogColor("Inventario inicial antes de FIJOS: "&inventariosDisponiblesParaEstaPromo, Colors.Gray) 'Inventario inicial.
Private 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.
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 un a lista con los productos fijos de la promoción.
Private prodsFijos As List = traeListFromPromo("P_PRODSFIJOS", idPromo) 'Obtenemos una 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)
inventariosDisponiblesParaEstaPromo.Put("resultado", "No hay suficiente producto para la promocion.") 'Valor por default
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.
invDisponibleEstaPromo.Put("resultado", "No hay suficiente producto para la promocion.") 'Valor por DEFAULT.
If thisLog Then Log($"Prods fijos requeridos ${prodsFijos.Size}"$)
If prodsFijos.Size = 0 Then 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
Log(555)
Private t As String = prodsFijos.Get(p) 'Obtenemos el Id de este producto desde la lista de productos fijos.
Private p2 As Map = prodsmap.Get(t) 'Obtenemos un mapa con los datos de este producto (id, precio, almacen, tipo, piezas, etc.)
If thisLog Then Log($"T: ${t}, prod ${p2.Get("idProducto")}, piezas: ${p2.Get("piezas")}"$) 'Producto y piezas requeridas
If thisLog Then Log("inventariosDisponiblesParaEstaPromo="&inventariosDisponiblesParaEstaPromo)
If inventariosDisponiblesParaEstaPromo.ContainsKey(t) Then 'Si el mapa del inventario contiene el id del producto entonces ...
i = inventariosDisponiblesParaEstaPromo.get(t) 'Obtenemos del mapa el inventario de este producto.
Private nuevoInv As Int = NumberFormat2((i - promoMap.Get("prodsFijosPiezas").As(List).get(p)), 1, 0,0,False)
If thisLog Then Log($"Nuevo inventario de ${t}: ${i}-${promoMap.Get("prodsFijosPiezas").As(List).get(p)} = ${nuevoInv}"$) 'El nuevo inventario.
inventariosDisponiblesParaEstaPromo.Put(t, $"${nuevoInv}"$) 'Restamos del inventario las piezas requeridas para la promoción y guardamos el nuevo inventario en el mapa.
inventariosDisponiblesParaEstaPromo.Put("resultado", "ok")
If thisLog Then Log($"T: ${t}, Prod ${prodsFijos.Get(p)}, piezasReq: ${prodsFijosPiezas.Get(p)}"$) 'Producto y piezas requeridas
If thisLog Then Log("invDisponibleEstaPromo="&invDisponibleEstaPromo)
If invDisponibleEstaPromo.ContainsKey(t) Then 'Si el mapa del inventario contiene el id del producto entonces ...
Log(555)
i = invDisponibleEstaPromo.get(t) 'Obtenemos del mapa el inventario de este producto.
nuevoInv = NumberFormat2((i - prodsFijosPiezas.get(p)), 1, 0,0,False)
If thisLog Then Log($"Nuevo inventario de ${t}: ${i}-${prodsFijosPiezas.get(p)} = ${nuevoInv}"$) 'El nuevo inventario.
invDisponibleEstaPromo.Put(t, $"${nuevoInv}"$) 'Restamos del inventario las piezas requeridas para la promoción y guardamos el nuevo inventario en el mapa.
invDisponibleEstaPromo.Put("resultado", "ok")
Else 'Si en el mapa no esta el id del producto, entonces no tenemos inventario.
inventariosDisponiblesParaEstaPromo.Put("resultado", "No hay suficiente producto para la promocion.")
Log(777)
invDisponibleEstaPromo.Put("resultado", "No hay suficiente producto para la promocion.")
If thisLog Then LogColor("Sin suficiente inventario fijo: " & t, Colors.Blue)
Exit
End If
'Aqui necesitamos el inventario del produccto de "t"
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.
If nuevoInv < 0 Then
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.
Exit
End If
Next
If thisLog Then LogColor("Inventario final despues de FIJOS: "&inventariosDisponiblesParaEstaPromo, Colors.blue) 'Inventario final.
Return inventariosDisponiblesParaEstaPromo
If thisLog Then LogColor("Inventario final despues de FIJOS: "&invDisponibleEstaPromo, Colors.blue) 'Inventario final.
Return invDisponibleEstaPromo
End Sub
'Revisa si tenemos los productos variables requeridos para la promoción (mapa).
'Hay que darle como parametro un mapa (traePromo(promo)) con toda la informacion de la promocion.
Sub alcanzanLosVariablesParaPromo(promoMap As Map, inventarioSinFijos As Map) As Boolean 'ignore
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.
If thisLog Then LogColor("Inventario inicial: "&inventarioSinFijos, Colors.Gray) 'Inventario inicial.
Private totalProdsVariables As Int = 0
' Private prodsmap As Map = promoMap.Get("productos") 'Obtenemos un mapa con todos los productos de la promoción.
Private prodsVariables As List = promoMap.get("prodsVariables") 'Obtenemos un a lista con los productos variables de la promoción.
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
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 ...
@@ -384,9 +379,10 @@ Sub alcanzanLosVariablesParaPromo(promoMap As Map, inventarioSinFijos As Map) As
totalProdsVariables = totalProdsVariables + p2
End If
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
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
End Sub
@@ -397,7 +393,7 @@ Sub traeMaxPromos(idPromo As String) As Int
Private mp0, mp As String = "0"
maxPromos.Initialize
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)

View File

@@ -1002,7 +1002,7 @@ End Sub
' resultado="OK" 'Ok si existe la promocion.
' prodsVariablesRequeridos=5} 'Cantidad de productos variables requeridos para la promoción.
Sub traePromo(promo As String, cliente As String) As Map
Private thisLog As Boolean = False
Private thisLog As Boolean = True
If thisLog Then Log("traePromo:"&promo)
Private inicioContador As String = DateTime.Now
Private c As Cursor = Starter.skmt.ExecQuery("Select * from promos_comp where cat_pa_id = '"& promo&"'") 'Obtenemos las el maximo de promocioones a otorgar.