diff --git a/B4A/C_Productos.bas b/B4A/C_Productos.bas index e980e1d..a8a2b2b 100644 --- a/B4A/C_Productos.bas +++ b/B4A/C_Productos.bas @@ -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 diff --git a/B4A/KelloggsV4.b4a.meta b/B4A/KelloggsV4.b4a.meta index 60b7570..8703277 100644 --- a/B4A/KelloggsV4.b4a.meta +++ b/B4A/KelloggsV4.b4a.meta @@ -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 diff --git a/B4A/Promociones.bas b/B4A/Promociones.bas index 51863af..1ef286d 100644 --- a/B4A/Promociones.bas +++ b/B4A/Promociones.bas @@ -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) diff --git a/B4A/Subs.bas b/B4A/Subs.bas index f45ebb9..d9aa517 100644 --- a/B4A/Subs.bas +++ b/B4A/Subs.bas @@ -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.