- Código de promociones "al parecer" completo.

This commit is contained in:
2024-05-12 23:20:29 -06:00
parent 33550e86c3
commit c4feba0a09
4 changed files with 131 additions and 67 deletions

View File

@@ -12,7 +12,8 @@ Sub Class_Globals
Private EventName As String 'ignore
Private CallBack As Object 'ignore
Dim tablaProds As String
Dim muestraLogs, releaseMode As Boolean
Dim muestraLogs As Boolean
Dim releaseMode As Boolean
End Sub
'Initializes the object. You can add parameters to this method if needed.
@@ -25,7 +26,7 @@ Public Sub Initialize (vCallback As Object, vEventName As String, db0 As SQL) As
db.ExecNonQuery("DELETE FROM PROMOCIONES_INFO")
#if RELEASE
releaseMode = true
#Else
#Else if DEBUG
releaseMode = False
#end if
Return Me
@@ -101,13 +102,17 @@ End Sub
' 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
'######################################################
muestraLogs = True ' Si es verdadero, se muestran los logs de la clase.
'######################################################
If releaseMode Then muestraLogs = False
If muestraLogs Then LogColor("> TraePromo: " & 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
' Private promoMap As Map
Private promoMap As Map
Private prodsFijos, prodsFijosPrecios, prodsFijosReq, prodsVariables, prodsVariablesPrecios As List
' promoMap.Initialize
promoMap.Initialize
prodsFijos.Initialize
prodsFijosPrecios.Initialize
prodsFijosReq.Initialize
@@ -199,7 +204,7 @@ Sub traePromo(promo As String, cliente0 As String) As Map
c.Position = 0
pvr = c.GetString("CAT_GP_STS")
' promoMap.Put("prodsVariablesRequeridos", pvr) 'Cantidad de productos variables requeridos para la promoción.
' promoMap.put("descripcion", c.GetString("CAT_GP_NOMBRE"))
promoMap.put("descripcion", c.GetString("CAT_GP_NOMBRE"))
db.ExecNonQuery($"update PROMOCIONES_INFO set P_PRODSVARIABLES_REQUERIDOS = ${pvr} where P_ID = '${promo}'"$) 'Cantidad de productos variables requeridos para la promoción.
End If
c.Close
@@ -207,7 +212,7 @@ Sub traePromo(promo As String, cliente0 As String) As Map
' If muestraLogs Then Log($"Inv dispo: ${traemosInvDispParaPromo(promo)}"$)
' If muestraLogs Then LogColor($"Promo ${promo}: ${promoMap}"$, Colors.Blue)
' If muestraLogs Then LogColor("TIEMPO para traePromo -=" & promo & "=- : " & ((DateTime.Now-inicioContador)/1000), Colors.Blue)
' Return promoMap
Return promoMap
End Sub
' Regresa cuantas promos alcanzan con los productos FIJOS que hay en inventario.
@@ -244,23 +249,26 @@ End Sub
'promos por productos fijos llegan 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 revisaMaxPromosProdsVariablesPorInventarioXX(pm As Map) As Int 'ignore
If muestraLogs Then Log("======================================================")
Sub revisaMaxPromosProdsVariablesPorInventario(idPromo As String) As Int 'ignore
If muestraLogs Then LogColor("> revisaMaxPromosProdsVariablesPorInventario: " & idPromo, Colors.blue)
Private invFijoXpromo As Map
invFijoXpromo.Initialize
Private totalProdsVariablesDisponibles As Int = 0
If muestraLogs Then LogColor($"pm=${pm}"$, Colors.Blue)
Private invDispParaPromo As Map = traemosInvDispParaPromo(pm.Get("id"))
If muestraLogs Then Log($"invDispParaPromo=${invDispParaPromo}"$)
Private maxPromos As String = traeMaxPromos(pm)
Private maxPromosXFijos As Int = revisaMaxPromosProdsFijosPorInventario(pm)
Private idProdsVariables As List = pm.Get("prodsVariables")
Private prodsVariablesRequeridos As Int = pm.Get("prodsVariablesRequeridos")
Private prodsFijosReq As List = pm.Get("prodsFijosReq")
Private idProdsFijos As List = pm.Get("prodsFijos")
' If muestraLogs Then LogColor($"pm=${pm}"$, Colors.Blue)
Private invDispParaPromo As Map = traemosInvDispParaPromo(idPromo)
' If muestraLogs Then
Log($"invDispParaPromo=${invDispParaPromo}"$)
Private maxPromos As String = traeMaxPromos(idPromo)
Private maxPromosXFijos As Int = revisaMaxPromosProdsFijosPorInventario(idPromo)
Private idProdsVariables As List = traeListaDePromo("P_PRODSVARIABLES", idPromo)
Private prodsVariablesRequeridos As Int = traeInfoDePromo("P_PRODSVARIABLES_REQUERIDOS", idPromo)
Private prodsFijosReq As List = traeListaDePromo("P_PRODSFIJOS_PIEZAS", idPromo)
Private idProdsFijos As List = traeListaDePromo("P_PRODSFIJOS", idPromo)
For p = 0 To idProdsFijos.Size -1 'Generamos mapa con los productos fijos y piezas requeridas por promo.
invFijoXpromo.Put(idProdsFijos.Get(p), prodsFijosReq.Get(p))
Log(idProdsFijos)
Private idEsteProd As String = idProdsFijos.Get(p)
Log(idEsteProd)
Private invEsteProd As Int = invDispParaPromo.Get(idEsteProd)
Private pzasReqEsteProd As Int = prodsFijosReq.Get(p)
If muestraLogs Then Log($"id=${idEsteProd}, inv=${invEsteProd}, pzas=${pzasReqEsteProd}"$)
@@ -268,24 +276,28 @@ Sub revisaMaxPromosProdsVariablesPorInventarioXX(pm As Map) As Int 'ignore
Next
If muestraLogs Then LogColor($"MaxPromos=${maxPromos}, promosXFijos=${maxPromosXFijos}"$, Colors.Blue)
If muestraLogs Then LogColor($"prodsFijos=${idProdsFijos}"$, Colors.Blue)
If muestraLogs Then LogColor($"prodsFijosReqReq=${prodsFijosReq}"$, Colors.Blue)
If muestraLogs Then LogColor($"prodsFijosReq=${prodsFijosReq}"$, Colors.Blue)
If muestraLogs Then LogColor($"prodsVariables=${idProdsVariables}${CRLF}Variables Req=${prodsVariablesRequeridos} "$, Colors.Blue)
If muestraLogs Then LogColor($"invFijoXpromo=${invFijoXpromo}"$, Colors.Blue)
If muestraLogs Then Log($"Prods variables disponibles = ${totalProdsVariablesDisponibles}"$)
Private maxPromosXVariables As Int = 0
If Not(releaseMode) Then muestraLogs = True
For x = 1 To maxPromosXFijos
If muestraLogs Then Log("=====================================================")
If muestraLogs Then Log("=====================================================")
For i = 0 To idProdsFijos.Size - 1
If muestraLogs Then Log($"FIJO - ${idProdsFijos.Get(i)}, ${invDispParaPromo.Get(idProdsFijos.Get(i))} - ${prodsFijosReq.Get(i).As(Int)*(i+1)}"$)
invDispParaPromo.Put(idProdsFijos.Get(i), invDispParaPromo.Get(idProdsFijos.Get(i)).As(Int) - prodsFijosReq.Get(i).As(Int)*(i+1)) 'Restamos las piezas de los productos fijos del inventario disponible.
' Log(prodsFijosReq.Get(i))
Private prodsFijosRequeridos As Int = prodsFijosReq.Get(i)
Private esteProdFijo As String = idProdsFijos.Get(i)
' Log(invDispParaPromo)
If muestraLogs Then Log($"FIJO - ${idProdsFijos.Get(i)}, ${invDispParaPromo.Get(esteProdFijo)} - ${prodsFijosRequeridos*(i+1)}"$)
invDispParaPromo.Put(esteProdFijo, invDispParaPromo.Get(esteProdFijo) - prodsFijosRequeridos*(i+1)) 'Restamos las piezas de los productos fijos del inventario disponible.
Next
If muestraLogs Then LogColor("Inv disponible despues de restar fijos = " & invDispParaPromo, Colors.Blue)
totalProdsVariablesDisponibles = 0
For i = 0 To idProdsVariables.Size - 1 'Obtenemos total de productos variables disponibes.
If invDispParaPromo.ContainsKey(idProdsVariables.Get(i)) Then
totalProdsVariablesDisponibles = totalProdsVariablesDisponibles + invDispParaPromo.Get(idProdsVariables.Get(i))
Private thisProdVariable As String = idProdsVariables.Get(i)
If invDispParaPromo.ContainsKey(thisProdVariable) Then
totalProdsVariablesDisponibles = totalProdsVariablesDisponibles + invDispParaPromo.Get(thisProdVariable)
End If
Next
'Revisamos variables.
@@ -301,10 +313,10 @@ Sub revisaMaxPromosProdsVariablesPorInventarioXX(pm As Map) As Int 'ignore
End Sub
'Regresa un mapa con el inventario disponible por producto para la promoción (desde la base de datos).
Sub traemosInvDispParaPromo(promo As String) As Map 'ignore
If muestraLogs Then LogColor("> traemosInvDispParaPromo: " & promo, Colors.blue)
Sub traemosInvDispParaPromo(idPromo As String) As Map 'ignore
If muestraLogs Then LogColor("> traemosInvDispParaPromo: " & idPromo, Colors.blue)
Private c As Cursor
c = Starter.skmt.ExecQuery2($"SELECT CAT_GP_ID, CAT_GP_ALMACEN FROM ${tablaProds} 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 ${tablaProds} WHERE CAT_GP_ID IN (select CAT_DP_IDPROD FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID = ?)"$, Array As String(idPromo))
' Private prodInv As Map
' prodInv.Initialize
Private prods As Map
@@ -342,7 +354,7 @@ Sub restaFijosDePromo(idPromo As String) As Map 'ignore
InvDispEsteProd = invDispEstaPromo.get(esteProd) 'Obtenemos del mapa el inventario de este producto.
nuevoInv = NumberFormat2((InvDispEsteProd - pzasReqEsteProd), 1, 0,0,False)
If muestraLogs Then Log($"Nuevo inventario de ${esteProd}: ${InvDispEsteProd}-${pzasReqEsteProd} = ${nuevoInv}"$) 'El nuevo inventario.
invDispEstaPromo.Put(esteProd, $"${nuevoInv}"$) 'Restamos del inventario las piezas requeridas para la promoción y guardamos el nuevo inventario en el mapa.
invDispEstaPromo.Put(esteProd.Trim, nuevoInv) 'Restamos del inventario las piezas requeridas para la promoción y guardamos el nuevo inventario en el mapa.
invDispEstaPromo.Put("resultado", "ok")
Else 'Si en el mapa no esta el id del producto, entonces no tenemos inventario.
invDispEstaPromo.Put("resultado", "No hay suficiente producto para la promocion.")
@@ -438,6 +450,7 @@ End Sub
'Regresa una lista de la BD, en la BD se guarda como string y esta funcion la convierte en lista nuevamente.
Sub traeListaDePromo(col As String, promo As String) As List
' Log($"${col}, ${promo}"$)
Private res As List
Private s As String
Private c As ResultSet = db.ExecQuery($"select ${col} from PROMOCIONES_INFO where P_ID = '${promo}'"$)
@@ -445,6 +458,31 @@ Sub traeListaDePromo(col As String, promo As String) As List
s = c.GetString(col)
Loop
If s.StartsWith("[") And s.EndsWith("]") Then
' Private j As JSONParser
' j.Initialize(s)
' res.Initialize2(j.NextArray)
res.Initialize
s = s.Replace("[", "")
s = s.Replace("]", "")
Private s2() As String = Regex.Split(",", s)
For i = 0 To s2.Length - 1
res.Add(s2(i).as(String).trim)
Next
Else
res.Initialize
End If
Return res
End Sub
'Regresa una lista de la BD, en la BD se guarda como string y esta funcion la convierte en lista nuevamente.
Sub traeMapaDePromo(col As String, promo As String) As List
Private res As List
Private s As String
Private c As ResultSet = db.ExecQuery($"select ${col} from PROMOCIONES_INFO where P_ID = '${promo}'"$)
Do While c.NextRow
s = c.GetString(col)
Loop
If s.StartsWith("{") And s.EndsWith("}") Then
Private j As JSONParser
j.Initialize(s)
res.Initialize2(j.NextArray)