From 4da2d431774fd38b9042e988f227f07186da9f77 Mon Sep 17 00:00:00 2001 From: Jose Alberto Guerra Ugalde Date: Sun, 18 Feb 2024 13:58:55 -0600 Subject: [PATCH] =?UTF-8?q?Se=20corrige=20un=20error=20que=20permit=C3=ADa?= =?UTF-8?q?=20meter=20promocijes=20de=20mas=20y=20dejaba=20inventario=20en?= =?UTF-8?q?=20negativo.=20=20-=20Cuando=20el=20producto=20fijo=20de=20una?= =?UTF-8?q?=20promocion=20tambien=20es=20parte=20de=20los=20productos=20va?= =?UTF-8?q?riables=20de=20la=20misma,=20al=20aumentar=20la=20cantidad=20de?= =?UTF-8?q?=20promociones=20a=20comprar,=20el=20invenatrio=20del=20product?= =?UTF-8?q?o=20variable=20no=20se=20actualizaba.=20=20=20ej.=20Si=20la=20p?= =?UTF-8?q?romo=20usa=203=20productos=20fijos=20y=20quedan=2010=20para=20l?= =?UTF-8?q?os=20variables,=20cuando=20pedimos=202=20promociones,=20en=20lu?= =?UTF-8?q?gar=20de=20usar=203=20para=20los=20fijos,=20ahora=20vamos=20a?= =?UTF-8?q?=20necesitar=206,=20y=20en=20lugar=20de=20quedar=2010=20para=20?= =?UTF-8?q?los=20variables,=20ahora=20solo=20quedan=207.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- B4A/C_Principal.bas | 30 ++++++++++--- B4A/C_Productos.bas | 16 ++++++- B4A/C_Promos.bas | 94 ++++++++++++++++++++++++++++++++++++----- B4A/KelloggsV4.b4a | 4 +- B4A/KelloggsV4.b4a.meta | 6 +-- B4A/Subs.bas | 41 +++++++++++++++--- 6 files changed, 162 insertions(+), 29 deletions(-) diff --git a/B4A/C_Principal.bas b/B4A/C_Principal.bas index 3865f8c..c9ce918 100644 --- a/B4A/C_Principal.bas +++ b/B4A/C_Principal.bas @@ -973,7 +973,7 @@ Sub JobDone(Job As HttpJob) Dim HCCP_PROMO As String = records(RESULT.Columns.Get("HCCP_PROMO")) Dim HCCP_CANT As String = records(RESULT.Columns.Get("HCCP_CANT")) Dim HCCP_CANT_VENDIDA As String = records(RESULT.Columns.Get("HCCP_CANT_VENDIDA")) - If HCCP_CANT_VENDIDA = Null or HCCP_CANT_VENDIDA = "null" Then HCCP_CANT_VENDIDA = 0 + If HCCP_CANT_VENDIDA = Null Or HCCP_CANT_VENDIDA = "null" Then HCCP_CANT_VENDIDA = 0 Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CLIENTE_CANT_PROMOS(HCCP_CLIENTE, HCCP_PROMO, HCCP_CANT, HCCP_CANT_VENDIDA) VALUES (?,?,?,?)", Array As Object (HCCP_CLIENTE, HCCP_PROMO, HCCP_CANT, HCCP_CANT_VENDIDA)) Next Starter.skmt.TransactionSuccessful @@ -2169,12 +2169,28 @@ Sub B_OK_PAS_Click End If P1.Visible = False trabajar.Visible = True -' B_PROXIMA.Visible =True -' NUEVO.Visible =True - BUSCA.Visible=True - connecta.Visible=True - Resumen.Visible= True - img2.Visible=False + B_PROXIMA.Visible =True + NUEVO.Visible = True + BUSCA.Visible = True + connecta.Visible = True + Resumen.Visible = True + img2.Visible = False + + +' B_PROXIMA.Visible =False +' NUEVO.Visible =False +' BUSCA.Visible=False +' connecta.Visible=False +' Subir.Visible=False +' cargar.Visible=False +' L_P_1.Visible = False +' S_CC.Visible = False +' L_P_3.Visible = False +' S_CH.Visible = False +' PB1.Visible = False +' Resumen.Visible= False + + P1.SendToBack Else If CARGA = "SUBIR" And S_CP.Text = "ERROR" Then Msgbox("Tiene que subir de nuevo la información","Atención") 'ignore diff --git a/B4A/C_Productos.bas b/B4A/C_Productos.bas index 5d403c1..4d3f61b 100644 --- a/B4A/C_Productos.bas +++ b/B4A/C_Productos.bas @@ -597,7 +597,7 @@ Sub b_prodMenos_Click i.Position = 0 invActualizado = i.GetString("CAT_GP_ALMACEN") End If - If Starter.tipov <> "ABORDO" Then lProdX.Text = cs.Color(Colors.red).append(nombreX).pop.append(CRLF).Append("Existencias: " & invActualizado).Color(0xFF017F01).Append($" $${numberformat2(precio, 1, 2, 2, False)}"$).Popall + If Starter.tipov <> "ABORDO" Then lProdX.Text = cs.Color(Colors.red).append(nombreX).pop.append(CRLF).Append("Existencias: " & invActualizado).Color(0xFF017F01).Append($" $${NumberFormat2(precio, 1, 2, 2, False)}"$).Popall End If If Subs.totalPedido < 1 Then laCant.Text = "0" ' Log($"Total Prods: ${totalProds}, Total Compra: $$1.2{totalCompra}"$) @@ -621,6 +621,13 @@ Sub b_prodMas_Click Private tmpMap As Map = clv_prods_ll.GetValue(index).As(Map) Private precio As String=clv_prods_ll.GetValue(index).As(Map).Get("precio") Private inv As Int = clv_prods_ll.GetValue(index).As(Map).Get("almacen") + + Private iq As Cursor = Starter.skmt.ExecQuery($"select cat_gp_almacen from ${Subs.traeTablaProds(Starter.tipov)} where cat_gp_id = '${clv_prods_ll.GetValue(index).As(Map).Get("id")}'"$) + If iq.RowCount > 0 Then + iq.Position = 0 + Log($"INV ${clv_prods_ll.GetValue(index).As(Map).Get("id")} = ${iq.GetString("CAT_GP_ALMACEN")}"$) + End If + Log(tmpMap) If buttonTag = "vendido" Then ' Log("VENDIDO") @@ -664,10 +671,17 @@ Sub b_prodMas_Click End If dispAbordo = kh.traeDisponibleAbordo If Subs.traeCliente = 0 And dispAbordo < 1 Then + ToastMessageShow("No hay mas disponible para el abordo", False) + Sender.As(EditText).TextColor = Colors.Red + Sender.As(EditText).TextSize = 14 Log("######### "& NumberFormat2((kh.traeLimiteAbordoWeb - (kh.traeLimiteAbordoXInventario - kh.traeVenta) - kh.traeVentaAbordo), 0, 2, 2, False)) laCant.Text = NumberFormat2((laCant.Text - 1), 1, 0, 0, False) Subs.actualizaProducto(almacenX, precioX, laCant.text, nombreX, id, clienteId, Subs.traeFecha, Subs.traeUsuarioDeBD, rutaUsuario, 0, Starter.tipov) Log("######### "& NumberFormat2((kh.traeLimiteAbordoWeb - (kh.traeLimiteAbordoXInventario - kh.traeVenta) - kh.traeVentaAbordo), 0, 2, 2, False)) + Sleep(400) + Sender.As(EditText).TextColor = Colors.black + Sender.As(EditText).TextSize = 10 +' Sender.As(EditText). End If cuentaProds If lfila.Text <> "RMI" Then diff --git a/B4A/C_Promos.bas b/B4A/C_Promos.bas index 2cf1b06..9f9858a 100644 --- a/B4A/C_Promos.bas +++ b/B4A/C_Promos.bas @@ -161,7 +161,10 @@ Sub muestraPromo(promo As String, cliente As String) Private estePrecio = listaPreciosPV.Get(indicePV) Private thisProd As Map = prodsPromo.Get(p) If thisLog Then Log(thisProd) - If existenciaProdVariable > 0 Then clv_prodsVariabes.Add(CreateListItem(Subs.traeProdNombre(p)&CRLF&"Hay " & invDispPromo.Get(p) & " $" & estePrecio, estePrecio, invDispPromo.Get(p), clv_prodsVariabes.AsView.Width, 50dip, Null, p), p) + If existenciaProdVariable > 0 Then + Log($">>>>> AGREGAMOS PROD VARIABLE ${p}"$) + clv_prodsVariabes.Add(CreateListItem(Subs.traeProdNombre(p)&CRLF&"Hay " & invDispPromo.Get(p) & " $" & estePrecio, estePrecio, invDispPromo.Get(p), clv_prodsVariabes.AsView.Width, 50dip, Null, p), p) + End If End If Next b_terminar1.Visible = False @@ -224,6 +227,7 @@ Sub CreateListItem(Text As String, precioU As String, inv As Int, Width As Int, et_pCant.Tag = precioU&"|"&inv&"|"&prodId et_pCant.BringToFront ' i_prod.Bitmap = img + p.Tag = prodId Return p End Sub @@ -272,8 +276,8 @@ Sub b_prodMas_Click ' Private inv As String = Regex.Split("\|", laCant.tag)(1) Private prodId As String = Regex.Split("\|", laCant.tag)(2) Private tmpMap As Map = CreateMap("precio":precio, "cant":laCant.Text, "almacen":estaPromo) -' Log(tmpMap) promosMap.Put(prodId, tmpMap) + Log("PRODMAS PROMOSMAP - " & promosMap) ' LogColor(promosMap, Colors.Magenta) End If ' Log($"Total Prods: ${totalProds}, Total Compra: $$1.2{totalCompra}"$) @@ -349,14 +353,14 @@ Sub cuentaProds ' Log($"Termina cuentaProds - ${Starter.cp_running}"$) 'Si la cantidad es mayor que los productos requeridos, entonces ponemos todos en CERO. - If totalProds > prodsVarReq + tpf Then - For i = 0 To clv_prodsVariabes.GetSize - 1 - Private p0 As B4XView = clv_prodsVariabes.GetPanel(i) - Private p As B4XView = p0.GetView(0) - Private cant1 As B4XView = p.GetView(2).GetView(4) - cant1.Text = 0 - Next - End If +' If totalProds > prodsVarReq + tpf Then +' For i = 0 To clv_prodsVariabes.GetSize - 1 +' Private p0 As B4XView = clv_prodsVariabes.GetPanel(i) +' Private p As B4XView = p0.GetView(0) +' Private cant1 As B4XView = p.GetView(2).GetView(4) +' cant1.Text = 0 +' Next +' End If End Sub Private Sub et_pCant_FocusChanged (HasFocus As Boolean) @@ -374,6 +378,24 @@ Private Sub b_promoMenos_Click tpf = tpf2 * et_promoCant.Text.As(Int) prodsVarReq = prodsVarReq2 * et_promoCant.Text.As(Int) Log($"Max promos=${et_promoCant.Text.As(Int)}, Prods fijos=${tpf}, "$) + + Private invVariableMod As Map = revisaInvProdsVariables 'Si se modifica el inventario de los prods variables, recargamos el CLV de prods variables. + If invVariableMod.Size > 0 Then + Private listProds As List + listProds.Initialize + For i = 0 To clv_prodsVariabes.Size - 1 'Generamos una lista con los productos del CLV. + Private pa1 As B4XView = clv_prodsVariabes.GetPanel(i).GetView(0).GetView(2).GetView(4) + Private elTag() As String = Regex.Split("\|", pa1.Tag) + Private elInv As Int = elTag(1) + If invVariableMod.ContainsKey(elTag(2)) Then elInv = invVariableMod.Get(elTag(2)) + listProds.Add(CreateListItem(Subs.traeProdNombre(elTag(2))&CRLF&"Hay " & elInv & " $" & elTag(0), elTag(0), elInv, clv_prodsVariabes.AsView.Width, 50dip, Null, elTag(2))) + Next + clv_prodsVariabes.Clear + For i = 0 To listProds.Size - 1 'Usamos la lista para poblar el CLV con los datos modificados. + clv_prodsVariabes.Add(listProds.Get(i), listProds.Get(i).As(Panel).tag) + Next + End If + cuentaProds End Sub @@ -387,9 +409,61 @@ Private Sub b_promoMas_Click Log($"Max promos=${et_promoCant.Text.As(Int)}, Prods fijos=${tpf}, "$) End If If et_promoCant.text > maxCantPromos Then et_promoCant.Text = maxCantPromos + + Private invVariableMod As Map = revisaInvProdsVariables 'Si se modifica el inventario de los prods variables, necesitamos recargar el CLV de prods variables. + If invVariableMod.Size > 0 Then + Private listProds As List + listProds.Initialize + For i = 0 To clv_prodsVariabes.Size - 1 'Generamos una lista con los productos del CLV. + Private pa1 As B4XView = clv_prodsVariabes.GetPanel(i).GetView(0).GetView(2).GetView(4) + Private elTag() As String = Regex.Split("\|", pa1.Tag) + Private elInv As Int = elTag(1) + If invVariableMod.ContainsKey(elTag(2)) Then elInv = invVariableMod.Get(elTag(2)) + listProds.Add(CreateListItem(Subs.traeProdNombre(elTag(2))&CRLF&"Hay " & elInv & " $" & elTag(0), elTag(0), elInv, clv_prodsVariabes.AsView.Width, 50dip, Null, elTag(2))) + Next + clv_prodsVariabes.Clear + For i = 0 To listProds.Size - 1 'Usamos la lista para poblar el CLV con los datos modificados. + clv_prodsVariabes.Add(listProds.Get(i), listProds.Get(i).As(Panel).tag) + Next + End If + cuentaProds End Sub +' Revisa si el inventario de un producto variable cambia cuando se modifica la cantidad de promociones que se van a ordenar. +' Esto pasa cuando el producto fijo de una promocion tambien es parte de los productos variables de la misma, asi que +' si la promo usa 3 productos fijos y quedan 10 para los variables, cuando pedimos 2 promociones, en lugar de usar +' 3 para los fijos, ahora vamos a necesitar 6, y en lugar de quedar 10 para los variables, ahora solo quedan 7. +' Regresa un mapa con el nuevo inventario de los productos variables afectados. +Sub revisaInvProdsVariables As Map + Private invVariablesModificados As Map = CreateMap() +' Private prodsFijosOriginales As Int = (tpf / et_promoCant.Text) +' LogColor($"Prods fijos originales = ${prodsFijosOriginales}"$, Colors.Red) + Private nuevoInvDisponible As Int + For f = 0 To prodsIds.Size - 1 +' Log(prodsIds.Get(f)) +' LogColor($"${prodsIds.Get(f)} -> ${prodsCants.Get(f)}"$, Colors.Red) + For i = 0 To clv_prodsVariabes.GetSize - 1 + Private pa0 As B4XView = clv_prodsVariabes.GetPanel(i).GetView(0).GetView(1) + Private pa1 As B4XView = clv_prodsVariabes.GetPanel(i).GetView(0).GetView(2).GetView(4) + Private pp As String = pa1.Tag +' Log($"EL TAG -> ${pp}"$) + Private elTag() As String = Regex.Split("\|", pp) + If elTag.Length > 1 Then + If elTag(2) = prodsIds.Get(f) Then + Private invDeBD As Int = Subs.traeInvDeBD(elTag(2)) +' Log($"XXX -> ${pa0.text} -> ${invDeBD}"$) + nuevoInvDisponible = invDeBD - tpf + LogColor($"Nuevo inv desponible = ${invDeBD} - ${tpf} = ${nuevoInvDisponible}"$, Colors.Red) + invVariablesModificados.Put(prodsIds.Get(f), nuevoInvDisponible) + End If + End If + Next + Next + Log($"INV MODIFICADOS: ${invVariablesModificados}"$) + Return invVariablesModificados +End Sub + Private Sub b_terminar1_Click cuentaProds ' Log("====================================================================") diff --git a/B4A/KelloggsV4.b4a b/B4A/KelloggsV4.b4a index b0ea519..d463ce7 100644 --- a/B4A/KelloggsV4.b4a +++ b/B4A/KelloggsV4.b4a @@ -864,12 +864,12 @@ Module9=C_NuevoCliente NumberOfFiles=401 NumberOfLibraries=29 NumberOfModules=29 -Version=12.5 +Version=12.8 @EndOfDesignText@ #Region Project Attributes #ApplicationLabel: Kelloggs Venta #VersionCode: 3000 - #VersionName: 4.02.07 + #VersionName: 4.02.16 #SupportedOrientations: portrait #CanInstallToExternalStorage: False #BridgeLogger:true diff --git a/B4A/KelloggsV4.b4a.meta b/B4A/KelloggsV4.b4a.meta index 2a5cc67..b36df70 100644 --- a/B4A/KelloggsV4.b4a.meta +++ b/B4A/KelloggsV4.b4a.meta @@ -67,7 +67,7 @@ ModuleClosedNodes13= ModuleClosedNodes14= ModuleClosedNodes15= ModuleClosedNodes16= -ModuleClosedNodes17=5,7,8,9,10,11,12,13,15,16,18 +ModuleClosedNodes17=5,7,8,10,11,12,13,15,16,18 ModuleClosedNodes18= ModuleClosedNodes19= ModuleClosedNodes2= @@ -88,6 +88,6 @@ ModuleClosedNodes6= ModuleClosedNodes7=3,11,12 ModuleClosedNodes8= ModuleClosedNodes9= -NavigationStack=Starter,Process_Globals,9,0,kms_helperSubs,RD_Init,62,0,Starter,ENVIA_ULTIMA_GPS,140,0,Subs,revisaBD,180,0,Starter,revisaBD,225,0,Starter,Service_Start,81,0,Starter,Service_Create,61,0,Main,Activity_Create,33,0,C_Productos,Busca_TextChanged,1201,0,B4XMainPage,b_importarBD_Click,757,0 +NavigationStack=Subs,traePromo,980,0,Subs,traeRuta,826,0,Starter,Service_Start,83,0,Subs,procesaPromocion,1176,1,Visual Designer,promociones.bal,-100,4,kms_helperSubs,traeVentaAbordo,780,0,Subs,traeInvDeBD,865,0,C_Promos,revisaInvProdsVariables,435,6,C_Promos,b_promoMenos_Click,375,0,C_Promos,b_promoMas_Click,422,6,C_Promos,cuentaProds,347,0 SelectedBuild=0 -VisibleModules=1,27,11,3,12,4,28,13,23 +VisibleModules=1,27,11,3,12,4,28,13,23,2 diff --git a/B4A/Subs.bas b/B4A/Subs.bas index 5ebc698..2e354c1 100644 --- a/B4A/Subs.bas +++ b/B4A/Subs.bas @@ -861,6 +861,18 @@ Sub traeUsuarioDeBD As String 'ignore Return u End Sub +'Trae el inventario de un producto desde la base de datos. +Sub traeInvDeBD(id As String) As Int + Private inv As Int = 0 + Private c As Cursor = Starter.skmt.ExecQuery($"select CAT_GP_ALMACEN from ${traeTablaProds(Starter.tipov)} where CAT_GP_ID = '${id}'"$) + If c.RowCount > 0 Then + c.Position = 0 + inv = c.GetInt("CAT_GP_ALMACEN") + End If +' Log(id) + Return inv +End Sub + 'Inserta un producto en la tabla "pedido" y "pedido_cliente". 'Actualiza "cat_gunaprod" y la columna "gestion" en la tabla "kmt_info". 'Sub guardaProducto(cedis As String, costoU As String, cant As String, nombre As String, prodId As String, clienteId As String, fecha As String, usuario As String, rutaV As String, precioSin As String, tipoVenta As String) @@ -979,16 +991,16 @@ Sub traePromo(promo As String, cliente As String) As Map '######### 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}'"$) - Log($"select * from HIST_CLIENTE_CANT_PROMOS where HCCP_PROMO = '${promo}'"$) +' Log($"select * from HIST_CLIENTE_CANT_PROMOS where HCCP_PROMO = '${promo}'"$) ' Log($"PROMOS SEGMENTADAS DISPONIBLES: ${ps.RowCount}"$) If ps.RowCount > 0 Then ps.Position = 0 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. - Log(">>> SEGMENTADA -> " & promo & " | " & ps.GetString("HCCP_CLIENTE")) + Log($">>> PROMO "${promo}" SEGMENTADA PARA EL CLIENTE ${ps.GetString("HCCP_CLIENTE")}"$) ' 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 = '${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}"$) +' 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 ps2.RowCount > 0 Then ps2.Position = 0 ' Log($"registros:${ps2.RowCount}, cant:${ps2.GetString("HCCP_CANT")}"$) @@ -1044,7 +1056,7 @@ Sub traePromo(promo As String, cliente As String) As Map promoMap.put("descripcion", c.GetString("CAT_GP_NOMBRE")) End If c.Close - If thisLog Then Log($"Inv variables: ${cuantosVariablesTengoBD(promo)}"$) + If thisLog Then Log($"Inv variables: ${cuantosVariablesDisponiblesDB(promo)}"$) If thisLog Then Log($"Inv dispo: ${traemosInventarioDisponibleParaPromo(promo)}"$) If thisLog Then LogColor($"Promo ${promo}: ${promoMap}"$, Colors.Blue) If thisLog Then LogColor("TIEMPO para traePromo -=" & promo & "=- : " & ((DateTime.Now-inicioContador)/1000), Colors.Red) @@ -1180,7 +1192,7 @@ End Sub '3799, 7226, 7228, 7230 Sub procesaPromocion(idPromo As String, cliente 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. Private inicioContador As String = DateTime.Now Private mp = 0 If thisLog Then LogColor($"********* Iniciamos revision de Promo ${idPromo} *********"$, Colors.red) @@ -1372,6 +1384,23 @@ Sub cuantosVariablesTengoBD(promo As String) As String 'ignore ' Return x End Sub +'Trae los produtos variables disponibles de la BD. +Sub cuantosVariablesDisponiblesDB(promo As String) + Private x As String = "0" + If promo <> "" Then + 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 = ? and cat_dp_tipo = 1 GROUP BY CAT_DP_IDPROD)", Array As String (promo)) + If c.RowCount > 0 Then + For i = 0 To c.RowCount - 1 + c.Position = i + Log(c.GetString("CAT_GP_ID") & ": " & c.GetString("CAT_GP_ALMACEN")) + If c.GetString("CAT_GP_ALMACEN") <> Null Then x = c.GetString("CAT_GP_ALMACEN") + Next + End If + End If + Return x +End Sub + 'Regresa un mapa con los datos del producto desde la base de datos. 'el mapa incluye: Id, nombre, tipo y subtipo del producto. Sub traeProdIdDeBD As Map 'ignore