diff --git a/B4A/C_Productos.bas b/B4A/C_Productos.bas index 6afaba5..e94d0ca 100644 --- a/B4A/C_Productos.bas +++ b/B4A/C_Productos.bas @@ -1080,9 +1080,6 @@ Sub B4XPage_Appear PCLV.B4XSeekBar1.mBase.Height=clv_prods_ll.AsView.Height PCLV.pnlOverlay.Height = clv_prods_ll.AsView.Height PCLV.B4XSeekBar1.Update - - - End Sub Sub PCLV_AddProds diff --git a/B4A/C_Promos.bas b/B4A/C_Promos.bas index e7f5e99..4a33c97 100644 --- a/B4A/C_Promos.bas +++ b/B4A/C_Promos.bas @@ -997,6 +997,9 @@ Private Sub b_terminar1_Click ' B4XPages.MainPage.productos.prodsMap.Put(estaPromo&"|"&prodsIds2.Get(o), tmpMap) ' Next ' LogColor(B4XPages.MainPage.productos.prodsMap, Colors.red) + + Subs.agrupaProdsPromo(Subs.traeCliente) + lv_prodsFijos.Clear B4XPages.MainPage.bTerminarClicked = True B4XPages.ShowPage("productos") @@ -1035,6 +1038,9 @@ Private Sub b_continuar_Click prodspage.lv_promos.Visible = False prodspage.clv_productos.AsView.Visible = False End If + + Subs.agrupaProdsPromo(Subs.traeCliente) + B4XPages.MainPage.bTerminarClicked = True B4XPages.ShowPage("productos") End Sub diff --git a/B4A/Guna Vistas V3.1.b4a.meta b/B4A/Guna Vistas V3.1.b4a.meta index a7ecc7f..b7df309 100644 --- a/B4A/Guna Vistas V3.1.b4a.meta +++ b/B4A/Guna Vistas V3.1.b4a.meta @@ -82,6 +82,6 @@ ModuleClosedNodes6= ModuleClosedNodes7=6,8,9,10,11 ModuleClosedNodes8= ModuleClosedNodes9= -NavigationStack=C_Cliente,Guardar_Click,2438,6,C_Principal,Subir_Click,601,0,C_Cliente,B4XPage_Appear,1106,0,C_Promos,muestraPromo,495,0,C_Promos,b_promoMas_Click,935,0,C_Productos,lv_catalogos_ItemClick,1188,0,Starter,ENVIA_ULTIMA_GPS,110,0,C_Principal,resdia_Click,2774,0,C_Principal,B4XPage_Appear,457,1,C_Principal,B4XPage_Created,331,0 +NavigationStack=C_Productos,B4XPage_Appear,1064,0,Diseñador Visual,promociones.bal,-100,1,C_Promos,b_promoMas_Click,953,0,C_Promos,b_continuar_Click,1035,5,C_Promos,b_terminar1_Click,994,0,Subs,traeTablaProds,1810,0,Subs,guardaProductoSinGestion,1794,0,Subs,revisaMaxPromosProdsVariablesPorInventario,2130,0,Subs,agrupaProdsPromo,2199,6 SelectedBuild=0 -VisibleModules=25,2,14,26,5,10,11,20,19,16 +VisibleModules=25,2,14,26,5,10,11,16,15 diff --git a/B4A/Subs.bas b/B4A/Subs.bas index 50fdb8c..eb113d3 100644 --- a/B4A/Subs.bas +++ b/B4A/Subs.bas @@ -1814,7 +1814,7 @@ End Sub 'Regresa la tabla de productos (cat_gunaprod o cat_gunaprod2) dependiendo del tipo de venta. Sub traeTablaProds(tipoventa As String) As String - Log(tipoventa) +' Log(tipoventa) Private tablaProds As String = "cat_gunaprod2" If tipoventa = "ABORDO" Or tipoventa = "PREVENTA" Then tablaProds = "cat_gunaprod" ' LogColor($"Tipo= ${tipoventa}, tabla=${tablaProds}"$, Colors.RGB(200,136,0)) @@ -2189,4 +2189,118 @@ Sub alcanzanLosVariablesParaPromo(promoMap As Map, inventarioSinFijos As Map) As End If ' Log(res) Return res +End Sub + + +' Agrupa los productos de las promociones, porque si tenemos un producto fijo a precio x y un producto variabe al mismo precio +' y las mismas cantidades, el pasarInfoMovil las detecta como duplicados y las tira, con esta funcion en lugar de dos registros, +' solo va uno con cantidades y totales sumados. +Sub agrupaProdsPromo(cliente As String) + ' Obtener la estructura de la tabla pedido con tipos de datos + Dim rs As ResultSet = Starter.skmt.ExecQuery("PRAGMA table_info(pedido)") + Dim columns As List + columns.Initialize + Dim columnTypes As Map + columnTypes.Initialize + + ' Obtener nombres y tipos de columnas + Do While rs.NextRow + Dim colName As String = rs.GetString("name") + Dim colType As String = rs.GetString("type") + columns.Add(colName) + columnTypes.Put(colName, colType) + Loop + rs.Close + + ' Construir la sentencia CREATE TABLE dinámica con tipos correctos + Dim createTableSQL As StringBuilder + createTableSQL.Initialize + createTableSQL.Append("CREATE TEMP TABLE IF NOT EXISTS PEDIDO_AGRUPADOR (") + + For i = 0 To columns.Size - 1 + Dim columnName As String = columns.Get(i) + If i > 0 Then createTableSQL.Append(", ") + createTableSQL.Append(columnName).Append(" ") + + ' Determinar el tipo de dato adecuado + Dim detectedType As String = columnTypes.Get(columnName) + If detectedType.Contains("INT") Then + createTableSQL.Append("INTEGER") + Else If detectedType.Contains("CHAR") Or detectedType.Contains("TEXT") Then + createTableSQL.Append("TEXT") + Else If detectedType.Contains("REAL") Or detectedType.Contains("FLOA") Or detectedType.Contains("DOUB") Then + createTableSQL.Append("REAL") + Else If detectedType.Contains("BLOB") Then + createTableSQL.Append("BLOB") + Else + ' Por defecto usar TEXT si no se reconoce el tipo + createTableSQL.Append("TEXT") + End If + Next + + createTableSQL.Append(")") + + ' Crear la tabla temporal con los tipos correctos + Starter.skmt.ExecNonQuery(createTableSQL.ToString) + + Log("########################################################################") + Log(createTableSQL.ToString) + Log("########################################################################") + + ' Identificar columnas que deben sumarse (basado en nombre o tipo) + Dim sumColumns As List + sumColumns.Initialize + sumColumns.Add("PE_CANT") ' Estas son las que sabemos que deben sumarse + sumColumns.Add("PE_COSTO_TOT") + + ' Construir la lista de columnas para el GROUP BY (excluyendo las que se sumarán) + Dim groupByColumns As List + groupByColumns.Initialize + For Each col As String In columns + If sumColumns.IndexOf(col) = -1 Then ' Si no es una columna a sumar + groupByColumns.Add(col) + End If + Next + + ' Construir la consulta SELECT dinámica + Dim selectSQL As StringBuilder + selectSQL.Initialize + selectSQL.Append("INSERT INTO PEDIDO_AGRUPADOR SELECT ") + + For i = 0 To columns.Size - 1 + Dim columnName As String = columns.Get(i) + If i > 0 Then selectSQL.Append(", ") + + If sumColumns.IndexOf(columnName) > -1 Then + ' Columnas que requieren SUM() + selectSQL.Append("SUM(").Append(columnName).Append(") As ").Append(columnName) + Else + ' Otras columnas + selectSQL.Append(columnName) + End If + Next + + selectSQL.Append(" FROM pedido WHERE PE_CLIENTE = '").Append(cliente).Append("' GROUP BY ") + + For i = 0 To groupByColumns.Size - 1 + If i > 0 Then selectSQL.Append(", ") + selectSQL.Append(groupByColumns.Get(i)) + Next + + ' Ejecutar la transacción + Starter.skmt.BeginTransaction + + ' Vaciar la tabla temporal + Starter.skmt.ExecNonQuery("DELETE FROM PEDIDO_AGRUPADOR") + + ' Insertar datos agrupados + Starter.skmt.ExecNonQuery(selectSQL.ToString) + + ' Reemplazar los datos originales + Starter.skmt.ExecNonQuery($"DELETE FROM PEDIDO WHERE PE_CLIENTE = '${cliente}'"$) + Starter.skmt.ExecNonQuery("INSERT INTO PEDIDO SELECT * FROM PEDIDO_AGRUPADOR") + + Starter.skmt.TransactionSuccessful + Starter.skmt.EndTransaction + Log("LISTO!!") End Sub \ No newline at end of file