From 60aa115e24ace2323043ce6e82e4de6fdfea9846 Mon Sep 17 00:00:00 2001 From: Jose Alberto Guerra Ugalde Date: Thu, 5 Mar 2026 08:37:05 -0600 Subject: [PATCH] VERSION 6.02.03 --- B4A/B4XMainPage.bas | 5 +- B4A/C_Auditoria.bas | 28 +- B4A/C_Cliente.bas | 25 +- B4A/C_Principal.bas | 121 +++- B4A/C_Productos.bas | 54 +- B4A/C_Productos2.bas | 1331 ----------------------------------- B4A/C_Promociones.bas | 379 ++++++++++ B4A/C_Promos.bas | 3 +- B4A/C_Promos2.bas | 24 - B4A/C_TrendSpending.bas | 2 - B4A/DBRequestManager1.bas | 360 ---------- B4A/DBRequestManager2.bas | 201 ------ B4A/Files/detalle_promo.bal | Bin 3429 -> 3393 bytes B4A/Files/guardagestion.bal | Bin 13104 -> 13086 bytes B4A/Files/pedido.bal | Bin 11752 -> 11743 bytes B4A/Files/qr.bal | Bin 823 -> 0 bytes B4A/Files/telefonos.bal | Bin 8011 -> 8167 bytes B4A/KelloggsV4.b4a | 57 +- B4A/KelloggsV4.b4a.meta | 14 +- B4A/Promociones.bas | 592 ---------------- B4A/Starter.bas | 1 + B4A/Subs.bas | 2 +- B4A/_git_tag.ps1 | 167 +++-- B4A/_juntaBas.bat | 29 - B4A/_juntaBas.ps1 | 194 +++-- B4A/jRDCWrapper.bas | 166 ----- 26 files changed, 834 insertions(+), 2921 deletions(-) delete mode 100644 B4A/C_Productos2.bas create mode 100644 B4A/C_Promociones.bas delete mode 100644 B4A/C_Promos2.bas delete mode 100644 B4A/DBRequestManager1.bas delete mode 100644 B4A/DBRequestManager2.bas delete mode 100644 B4A/Files/qr.bal delete mode 100644 B4A/Promociones.bas delete mode 100644 B4A/_juntaBas.bat delete mode 100644 B4A/jRDCWrapper.bas diff --git a/B4A/B4XMainPage.bas b/B4A/B4XMainPage.bas index f374c45..d0f021d 100644 --- a/B4A/B4XMainPage.bas +++ b/B4A/B4XMainPage.bas @@ -12,6 +12,9 @@ Version=9.85 '###################### PULL ############################################################# 'Ctrl + click ide://run?file=%WINDIR%\System32\cmd.exe&Args=/c&Args=git&Args=pull '########################################################################################################### + '###################### PULL FORZADO ############################################################# + 'Ctrl + click Respaldar y Pull: ide://run?file=%WINDIR%\System32\cmd.exe&Args=/c&Args=start&Args=powershell.exe&Args=-ExecutionPolicy&Args=Bypass&Args=-File&Args=..\..\_sync_project.ps1 + '########################################################################################################### '###################### PUSH ############################################################# 'Ctrl + click ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=github&Args=..\..\ '########################################################################################################### @@ -545,7 +548,7 @@ Sub JobDone(Job As HttpJob) LogColor("Error: " & Job.tag & " : " & Subs.parseHTTPError(Job.ErrorMessage), Colors.red) ToastMessageShow("Error: " & Job.ErrorMessage, True) Else -' If logger Then LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211110 + If logger Then LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211110 If Job.JobName = "DBRequest" Then Dim result As DBResult = reqManager.HandleJob(Job) If result.Tag = "version" Then 'query tag diff --git a/B4A/C_Auditoria.bas b/B4A/C_Auditoria.bas index f007817..c6cf162 100644 --- a/B4A/C_Auditoria.bas +++ b/B4A/C_Auditoria.bas @@ -5,8 +5,6 @@ Type=Class Version=12.8 @EndOfDesignText@ Sub Class_Globals - Private Root As B4XView 'ignore - Private xui As XUI 'ignore Dim audb As SQL Dim ruta As String = File.DirInternal End Sub @@ -21,7 +19,7 @@ End Sub 'This event will be called once, before the page becomes visible. Private Sub B4XPage_Created (Root1 As B4XView) - Root = Root1 +' Root = Root1 'load the layout to Root End Sub @@ -35,10 +33,12 @@ End Sub 'Regresa el almacen actual de la base de datos. Sub traeAlmacen As String 'ignore Private c As Cursor - Private a As String + Private a As String = "" c = audb.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") - c.Position = 0 - a = C.GetString("ID_ALMACEN") + If c.RowCount > 0 Then + c.Position = 0 + a = C.GetString("ID_ALMACEN") + End If c.Close Return a End Sub @@ -50,7 +50,7 @@ Sub traeRuta As String 'ignore c = audb.ExecQuery("select CAT_CL_RUTA from kmt_info limit 1") r = "0" If c.RowCount > 0 Then - c.Position=0 + c.Position = 0 r = c.GetString("CAT_CL_RUTA") End If c.Close @@ -62,8 +62,10 @@ Sub traeUsuarioDeBD As String 'ignore Private c As Cursor Private u As String = "SinUsuario" c = audb.ExecQuery("select USUARIO from usuarioa") - c.Position=0 - If c.RowCount > 0 Then u = c.GetString("USUARIO") + If c.RowCount > 0 Then + c.Position = 0 + u = c.GetString("USUARIO") + End If c.Close Return u End Sub @@ -71,10 +73,12 @@ End Sub 'Trae el cliente de CUENTAA Sub traeCliente As String 'ignore Private c As Cursor - Private cl As String + Private cl As String = "" c = audb.ExecQuery("Select CUENTA from cuentaa") - c.Position = 0 - cl = c.GetString("CUENTA") + If c.RowCount > 0 Then + c.Position = 0 + cl = c.GetString("CUENTA") + End If c.Close Return cl End Sub \ No newline at end of file diff --git a/B4A/C_Cliente.bas b/B4A/C_Cliente.bas index b80d142..ed31e5e 100644 --- a/B4A/C_Cliente.bas +++ b/B4A/C_Cliente.bas @@ -1084,7 +1084,7 @@ Sub Guardar_Click b_inicioFinVenta.Text = "TERMINAR VENTA" Log("RESPALDO") kh.RD_respaldoBatch - + ' Subir_Pedido_Con_Integridad(clie_id) mandaPendientes @@ -3292,7 +3292,7 @@ Sub B_IMP_INVBAK_Click Printer1.WriteString("RESUMEN DIA" & CRLF) Printer1.WriteString(sDate & " " & sTime & CRLF) Printer1.WriteString("Vendedor:" & usuario & CRLF) - Printer1.WriteString("-------INVENTARIO A BORDO----------" & CRLF) + Printer1.WriteString("-------INVENTARIO ABORDO----------" & CRLF) Printer1.WriteString("---II---CD---IIT---VT---RMI---IF---" & CRLF) ' aqui es donde esta el pedo de julieta de los descuentos quitar el precio2 pero meter un if para saber si es ruta especial o es normal o que show. @@ -3587,7 +3587,7 @@ Sub B_IMP_INV_Click Printer1.WriteString("RESUMEN DIA" & CRLF) Printer1.WriteString(sDate & " " & sTime & CRLF) Printer1.WriteString("Vendedor:" & usuario & CRLF) - Printer1.WriteString("-------INVENTARIO A BORDO----------" & CRLF) + Printer1.WriteString("-------INVENTARIO ABORDO----------" & CRLF) ''' se cambia este Printer1.WriteString("---II---CD---IIT---VT---RMI---IF---" & CRLF) ------- sin RMI Printer1.WriteString("---II---CD---IIT---VT---------IF---" & CRLF) @@ -3596,11 +3596,11 @@ Sub B_IMP_INV_Click Log($"Reglones: ${s.RowCount}"$) If s.RowCount > 0 Then For i = 0 To S.RowCount - 1 - Log(i) +' Log(i) Try s.Position = i Printer1.WriteString(s.GetString("CAT_GP_NOMBRE") & CRLF) - Log("p"&i) +' Log("p"&i) Catch Log(LastException) If logger Then Log("Saliendo con Try/Catch") @@ -3795,14 +3795,14 @@ Sub B_IMP_INV_Click Printer1.WriteString(CRLF) End Try End If - + ' TOTALES DE LOS ARCHIVOS - + s.Close S = Starter.skmt.ExecQuery2("select SUM(CAT_GP_ALMACEN) AS CAT_GP_ALMACEN from cat_gunaprod2 WHERE CAT_GP_CLASIF <> ? ", Array As String("PROMOS")) S.Position = 0 a_final =s.GetString("CAT_GP_ALMACEN") - + S1.Close S1 = Starter.skmt.ExecQuery("select SUM(CAT_GP_ALMACEN) AS CAT_GP_ALMACEN from cat_gunaprod5 ") S1.Position = 0 @@ -3837,6 +3837,7 @@ Sub B_IMP_INV_Click Printer1.WriteString(Printer1.BOLD & "----RESUMEN TOTAL---- " & CRLF) '' se cambia por lo del rmi Printer1.WriteString("---" & a_inicial & "..." & ABORDO & "..." & a_total & "..." & a_venta & "..." & a_final & "..." & RMI & CRLF) Printer1.WriteString("---" & a_inicial & "..." & ABORDO & "..." & a_total & "..." & a_venta & "..." & a_final & "..." & CRLF) + Log("---" & a_inicial & "..." & ABORDO & "..." & a_total & "..." & a_venta & "..." & a_final & "..." & CRLF) Printer1.WriteString(Printer1.BOLD & "TOTAL VENTA " & Subs.sumaPedido(Subs.traeCliente) & CRLF) Printer1.WriteString("------------------------------" & CRLF) Printer1.WriteString("Nombre y Firma" & CRLF) @@ -4496,7 +4497,7 @@ End Sub ' Llama a esto desde tu botón Subir_Click ' Devuelve un ResumableSub que puedes esperar con Wait For Sub Subir_Pedido_Con_Integridad(cliente As String) As ResumableSub - + Log("--- Iniciando Envío Seguro para Cliente: " & cliente & " ---") ' 1. Generar ARCH (Identificador Único del Paquete) @@ -4564,13 +4565,11 @@ Sub Subir_Pedido_Con_Integridad(cliente As String) As ResumableSub Dim cmd As DBCommand cmd.Initialize cmd.Name = "insert_pedido_KELL_arch" - cmd.Parameters = Array As Object(cPed.GetString("PE_CEDIS"), Subs.traeAlmacen, cPed.GetString("PE_COSTO_TOT"), cPed.GetString("PE_COSTOU"), cPed.GetString("PE_CANT"), cPed.GetString("PE_PRONOMBRE"), cPed.GetString("PE_PROID"), cPed.GetString("PE_CLIENTE"), cPed.GetString("PE_FECHA"), cPed.GetString("PE_USUARIO"), cPed.GetString("PE_RUTA"), cPed.GetString("PE_COSTO_SIN"), cPed.GetString("PE_DESC"), cPed.GetString("PE_FOLIO"), cPed.GetString("PE_TIPO"), cPed.GetString("PE_ARCH")) - reqManagerW.ExecuteCommand(Starter.DBReqServer, cmd, Me, "detalle_envio") - + Wait For detalle_envio_Completed (ResultDet As TResultado) - + If ResultDet.Success = False Then Log("Error enviando producto " & cPed.GetString("PE_PRONOMBRE")) envioCorrecto = False diff --git a/B4A/C_Principal.bas b/B4A/C_Principal.bas index f74d77d..a587a77 100644 --- a/B4A/C_Principal.bas +++ b/B4A/C_Principal.bas @@ -1549,7 +1549,7 @@ Sub JobDone(Job As HttpJob) Dim CAT_GP_TIPOPROD As Int = records(RESULT.Columns.Get("CAT_GP_TIPOPROD")) ' Dim CAT_GP_DEV As String = records(RESULT.Columns.Get("CAT_GP_DEV")) Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD2(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG,CAT_GP_ALMACEN,CAT_GP_TIPOPROD,CAT_GP_DEV,CAT_GP_CODPROMO) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,0)", Array As Object (CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG, CAT_GP_ALMACEN,CAT_GP_TIPOPROD,"0")) - Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD5(CAT_GP_ID,CAT_GP_ALMACEN) VALUES (?,?)", Array As Object (CAT_GP_ID,CAT_GP_ALMACEN)) +' Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD5(CAT_GP_ID,CAT_GP_ALMACEN) VALUES (?,?)", Array As Object (CAT_GP_ID,CAT_GP_ALMACEN)) ' skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD2(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG,CAT_GP_ALMACEN,CAT_GP_TIPOPROD,CAT_GP_DEV,CAT_GP_CODPROMO) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,0)", Array As Object (CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG, CAT_GP_ALMACEN,CAT_GP_TIPOPROD,"0")) Next Starter.skmt.TransactionSuccessful @@ -1594,7 +1594,7 @@ Sub JobDone(Job As HttpJob) Dim CAT_GP_ALMACEN As Int = records(RESULT.Columns.Get("CAT_GP_ALMACEN")) Dim CAT_GP_TIPOPROD As Int = records(RESULT.Columns.Get("CAT_GP_TIPOPROD")) Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD2(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG,CAT_GP_ALMACEN,CAT_GP_TIPOPROD) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object (CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG, CAT_GP_ALMACEN,CAT_GP_TIPOPROD)) - Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD5(CAT_GP_ID,CAT_GP_ALMACEN) VALUES (?,?)", Array As Object (CAT_GP_ID,CAT_GP_ALMACEN)) +' Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD5(CAT_GP_ID,CAT_GP_ALMACEN) VALUES (?,?)", Array As Object (CAT_GP_ID,CAT_GP_ALMACEN)) ' skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD2(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG,CAT_GP_ALMACEN,CAT_GP_TIPOPROD) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object (CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG, CAT_GP_ALMACEN,CAT_GP_TIPOPROD)) Next Starter.skmt.TransactionSuccessful @@ -3521,7 +3521,122 @@ Sub SUBIR_INFO_PEDIDO DateTime.TimeFormat = "HH:mm:ss" End Sub +' 1. Recopila encabezados y detalles de pedidos locales (todos o solo los pendientes). +' 2. Genera un ID único (Arch) para vincular exactamente cada venta con sus productos. +' 3. Empaqueta todo en una lista de comandos (Batch) para enviarlo al servidor en una sola transacción. Sub enviaPedidoBatch(filtro As String) + ' Creamos una lista llamada BatchCommands. Aquí vamos a guardar todas las instrucciones + ' de base de datos que queremos mandar al servidor de un solo golpe (en lote o "batch"). + Dim BatchCommands As List + BatchCommands.Initialize + Log($"enviaPedidoBatch(${filtro})"$) + + ' Preparamos una variable para filtrar la consulta a la base de datos. + ' Si el filtro no dice "Todos", armamos la condición para traer solo los pedidos que no se han enviado (PC_ENVIADO = 0). + Private condicion As String = "" + If filtro <> "Todos" Then condicion = "where PC_ENVIADO = 0" + + ' Ejecutamos una consulta (Query) a la base de datos local de SQLite (skmt). + ' Buscamos los ENCABEZADOS de los pedidos en la tabla PEDIDO_CLIENTE usando la condición que armamos arriba. + ' El resultado se guarda en un Cursor llamado 'cx', que es como una tabla en memoria por la que podemos navegar. + Private cx As Cursor = Starter.skmt.ExecQuery($"SELECT PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT, PC_COSTO_SIN, PC_RUTA, PC_ALMACEN, PC_ENVIADO FROM PEDIDO_CLIENTE ${condicion}"$) + Log($"SELECT PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT, PC_COSTO_SIN, PC_RUTA, PC_ALMACEN, PC_ENVIADO FROM PEDIDO_CLIENTE ${condicion}"$) + Log("pedido_cliente: " & cx.RowCount) + + ' Reiniciamos la variable de condición para usarla ahora en el DETALLE de los pedidos. + Private condicion As String = "" + If filtro <> "Todos" Then condicion = "where PE_ENVIADO = 0" + + ' Verificamos si en la tabla de envíos históricos (HIST_ENVIOS) hay registros del tipo "ABORDO" (Ventas en ruta directa). + c = Starter.skmt.ExecQuery2("SELECT COUNT(*) as CANTIDAD FROM HIST_ENVIOS WHERE HE_TIPO = ?",Array As String("ABORDO") ) + c.Position = 0 + + ' Si encontramos que sí hay ventas a bordo... + If c.GetString("CANTIDAD") > 0 Then + Log($"pe_cedis_0"$) + ' Actualizamos la tabla PEDIDO para que los artículos del cliente "0" (que suele ser el inventario a bordo) + ' y que no tengan un número de folio, se marquen con el almacén/cedis "RECARGA". + Starter.skmt.ExecNonQuery2("update PEDIDO set PE_CEDIS = ? where PE_CLIENTE =? AND PE_FOLIO IS NULL ", Array As Object("RECARGA", "0")) + End If + + ' Hacemos una actualización rápida a los registros de PEDIDO que no tengan folio (folio 0 o 1). + ' Les asignamos temporalmente el 'rowid' (el número de fila interno de SQLite) como folio para identificarlos. + Starter.skmt.ExecNonQuery("UPDATE PEDIDO SET PE_FOLIO = rowid where PE_FOLIO = 0 or PE_FOLIO = 1") + + ' Revisamos si nuestro cursor 'cx' (los encabezados de pedido) trajo algún resultado. + If cx.RowCount > 0 Then ' Si hay pedido entonces lo enviamos. + + ' Iniciamos un bucle (For) para recorrer cada uno de los encabezados de pedido encontrados. + For j = 0 To cx.RowCount - 1 + Log("===== ENVIAMOS PRODUCTOS DE PEDIDO =====") + ' Movemos el cursor 'cx' a la posición 'j' actual del bucle. + cx.Position = j + + ' Generamos un identificador único (Arch) concatenando el almacén, la ruta, el cliente y la fecha/hora actual. + ' Esto sirve para agrupar en el servidor el encabezado con sus respectivos detalles. + Dim Arch As String = Subs.traeAlmacen & "_" & Subs.traeRuta & "_" & cx.GetString("PC_CLIENTE") & "_" & DateTime.Now + + ' Preparamos un comando de base de datos (DBCommand) para mandar al servidor. + Dim cmdHeader As DBCommand + cmdHeader.Initialize + ' Asignamos el nombre del procedimiento almacenado o query que está en el servidor (jRDC2). + cmdHeader.Name = "insert_pedidos_KELL_arch" + ' Pasamos los parámetros leyendo los datos del cursor 'cx' (encabezado) y le pasamos el ID único 'Arch'. + cmdHeader.Parameters = Array As Object(cx.GetString("PC_CLIENTE"),cx.GetString("PC_FECHA"),cx.GetString("PC_USER"),cx.GetString("PC_NOART"),cx.GetString("PC_MONTO"),cx.GetString("PC_LON"),cx.GetString("PC_LAT"),ALMACEN,l_ruta.text,cx.GetString("PC_COSTO_SIN"), Arch) + + ' Añadimos este comando a nuestra lista del lote (Batch). + BatchCommands.Add(cmdHeader) + + ' Ahora hacemos una consulta para buscar el DETALLE de este pedido (los productos individuales). + ' Filtramos por la condición (si se envió o no) y lo amarramos al cliente actual del bucle (PC_CLIENTE). + Private cPed As Cursor = Starter.skmt.ExecQuery($"SELECT PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_FECHA, PE_USUARIO, PE_COSTO_SIN, PE_RUTA, PE_DESC, PE_FOLIO, PE_TIPO, PE_ARCH FROM PEDIDO ${condicion} ${(IIf(condicion = "","where", "and"))} pe_cliente = '${cx.GetString("PC_CLIENTE")}' "$) + + ' Si hay detalles para este encabezado... + If cPed.RowCount > 0 Then + + ' Iniciamos un bucle interno para recorrer cada producto de este pedido. + For i = 0 To cPed.RowCount - 1 + Log("==== ENVIAMOS PRODS ====") + ' Movemos el cursor de detalles a la posición actual. + cPed.Position = i + + ' Preparamos el comando para enviar este producto al servidor. + Dim cmdDetail As DBCommand + cmdDetail.Initialize + + ' Si el perfil del vendedor es especial ("V-ESPECIAL")... + If PERFIL = "V-ESPECIAL" Then + Log("===== V-ESPECIAL =====") + ' Nota: Aquí el código original tiene un detalle, usa la variable global 'cmd' en lugar de 'cmdDetail' + ' que acaba de inicializar, pero la copiamos tal cual. Utiliza un query distinto para ventas especiales. + cmd.Name = "insert_pedido_esp_KELL" + cmd.Parameters = Array As Object(cPed.GetString("PE_CEDIS"),ALMACEN,cPed.GetString("PE_COSTO_TOT"),cPed.GetString("PE_COSTOU"),cPed.GetString("PE_CANT"),cPed.GetString("PE_PRONOMBRE"),cPed.GetString("PE_PROID"),cPed.GetString("PE_CLIENTE"),cPed.GetString("PE_FECHA"),cPed.GetString("PE_USUARIO"),cPed.GetString("PE_RUTA"),cPed.GetString("PE_COSTO_SIN"),cPed.GetString("PE_DESC"),cPed.GetString("PE_FOLIO"),cPed.GetString("PE_TIPO"),NUMERO_PEDIDO) + Else + ' Si es un vendedor normal, usa el comando estándar para insertar el detalle + ' y le pasa la misma variable 'Arch' para que en el servidor sepa de qué encabezado es. + cmdDetail.Name = "insert_pedido_KELL_arch" + cmdDetail.Parameters = Array As Object (cPed.GetString("PE_CEDIS"),ALMACEN,cPed.GetString("PE_COSTO_TOT"),cPed.GetString("PE_COSTOU"),cPed.GetString("PE_CANT"),cPed.GetString("PE_PRONOMBRE"),cPed.GetString("PE_PROID"),cPed.GetString("PE_CLIENTE"),cPed.GetString("PE_FECHA"),cPed.GetString("PE_USUARIO"),cPed.GetString("PE_RUTA"), cPed.GetString("PE_COSTO_SIN"),cPed.GetString("PE_DESC"),cPed.GetString("PE_FOLIO"), cPed.GetString("PE_TIPO"), Arch) + End If + + ' Añadimos la instrucción del producto al lote de envío. + BatchCommands.Add(cmdDetail) + Next + End If + Next + + ' Al terminar de empaquetar, enviamos toda la lista de instrucciones (BatchCommands) al servidor de un solo golpe. + ' Se le asigna un nombre de etiqueta (Tag) para saber qué responderá el JobDone ("pedido_completo_" + id de cliente). + ' (Ojo visual para el programador: Esta línea está dentro del 'If' general, pero también después de armar los batches en el bucle 'For'. Al procesar el último item del bucle cx, tomará el ID del último cliente para el Tag). + reqManager.ExecuteBatch(BatchCommands, "pedido_completo_" & cx.GetString("PC_CLIENTE")) + End If + + ' Por buena práctica y para evitar fugas de memoria (memory leaks), + ' cerramos siempre los cursores que abrimos hacia la base de datos local. + c.Close + cx.Close +End Sub + +Sub enviaPedidoBatch0(filtro As String) ' Crear una lista para almacenar TODAS las operaciones de UN pedido Dim BatchCommands As List BatchCommands.Initialize @@ -3544,7 +3659,7 @@ Sub enviaPedidoBatch(filtro As String) Starter.skmt.ExecNonQuery2("update PEDIDO set PE_CEDIS = ? where PE_CLIENTE =? AND PE_FOLIO IS NULL ", Array As Object("RECARGA", "0")) End If Starter.skmt.ExecNonQuery("UPDATE PEDIDO SET PE_FOLIO = rowid where PE_FOLIO = 0 or PE_FOLIO = 1") - + If cx.RowCount > 0 Then ' Si hay pedido entonces lo enviamos. For j = 0 To cx.RowCount - 1 Log("===== ENVIAMOS PRODUCTOS DE PEDIDO =====") diff --git a/B4A/C_Productos.bas b/B4A/C_Productos.bas index 170310e..e960baa 100644 --- a/B4A/C_Productos.bas +++ b/B4A/C_Productos.bas @@ -352,22 +352,58 @@ Sub lv_catalogos_ItemClick (Position As Int, Value As Object) ' Log($"Resultados : ${c2.RowCount}, ${Value}, ${marca}, ${tipo}"$) If c2.RowCount > 0 Then + LogColor("=== INICIO DIAGNÓSTICO DE PROMOS ===", Colors.Magenta) + LogColor($"Cliente: ${clienteId} | Total Candidatas en BD: ${c2.RowCount}"$, Colors.Magenta) + + Dim MotorNuevo As C_Promociones + MotorNuevo.Initialize(Starter.skmt, ts) + 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) - If tm.Get("status") = "ok" Then 'Solo muestrala si hay producto. - -' Log(c2.GetString("CAT_GP_ID")) -' Log(c2.GetString("CAT_PA_TIPO_PROMONTO")) -' Log(c2.GetString("CAT_PA_PORCENTAJE_PAQUETE")) - If c2.GetString("CAT_PA_TIPO_PROMONTO") = "0" Then ' Si NO es promo por monto entonces la mostamos. + Dim idPromo As String = c2.GetString("CAT_GP_ID") + Log($"[${i}] Revisando ID: ${idPromo} (${c2.GetString("CAT_GP_NOMBRE")})"$) + + ' --- 1. DIAGNÓSTICO MAPAS (VIEJO) --- + Dim tm As Map = Subs.procesaPromocion(idPromo, clienteId) + Dim statusViejo As String = tm.Get("status") + Dim maxViejo As Int = Subs.revisaMaxPromosProdsFijosPorInventario(tm.Get("mp")) + + If statusViejo <> "ok" Then + LogColor($" >> MAPA rechaza: Status='${statusViejo}'"$, Colors.Red) + Else + LogColor($" >> MAPA acepta: MaxFijos=${maxViejo}"$, Colors.Green) + End If + + ' --- 2. DIAGNÓSTICO TYPES (NUEVO) --- + Try + Dim tPromo As TPromoLegacy = MotorNuevo.TraePromo(idPromo, clienteId) + Dim maxNuevo As Int = MotorNuevo.RevisaMaxPromosProdsFijos(tPromo) + + Log($" >> TYPE Info Interna: Res='${tPromo.Resultado}', Msg='${tPromo.MensajeError}'"$) + Log($" >> TYPE Listas: Fijos=${tPromo.ProdsFijos.Size}, Vars=${tPromo.ProdsVariables.Size}"$) + + If tPromo.Resultado = "ok" And maxNuevo > 0 Then + LogColor($" >> TYPE acepta: MaxFijos=${maxNuevo}"$, Colors.Green) + Else + LogColor($" >> TYPE rechaza: Resultado='${tPromo.Resultado}' | MaxCalculado=${maxNuevo}"$, Colors.Red) + End If + + Catch + LogColor(" >> CRASH en Nuevo: " & LastException.Message, Colors.Red) + End Try + + Log("-") ' Separador + + ' --- 3. CODIGO VISUAL ORIGINAL --- + If tm.Get("status") = "ok" Then + If c2.GetString("CAT_PA_TIPO_PROMONTO") = "0" Then 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")) End If End If Next + LogColor("=== FIN DIAGNÓSTICO ===", Colors.Magenta) Else - ToastMessageShow("No hay promociones disponibles.", False) + ToastMessageShow("No hay promociones en la consulta inicial.", False) End If c2.Close entro = "4" diff --git a/B4A/C_Productos2.bas b/B4A/C_Productos2.bas deleted file mode 100644 index 6ac5a66..0000000 --- a/B4A/C_Productos2.bas +++ /dev/null @@ -1,1331 +0,0 @@ -B4A=true -Group=Default Group -ModulesStructureVersion=1 -Type=Class -Version=11.5 -@EndOfDesignText@ -Sub Class_Globals - Private Root As B4XView 'ignore - Private xui As XUI 'ignore - '// Process Gloals - Dim g As GPS - Dim ruta As String - Dim q_buscar As String - '// Globals - Dim c As Cursor - Dim c2 As Cursor - Dim ListView1 As ListView - Dim entro As String = 0 - Dim lfila As Label - Dim marca As String - Dim tipo As String - Private BUSCA As EditText - Dim ya_entro As String - Dim bmp As Bitmap - Dim c As Cursor - Dim e As Cursor - Dim f As Cursor - Dim h As Cursor - Dim CC As Cursor - Dim DD As Cursor - Dim l_tipo As Label - Dim l_sub As Label - Dim l_marca As Label - Dim l_desc As Label - Dim l_precio As Label - Dim l_bodega As Label - Dim cantidad As EditText - Dim guardar As Button - Dim Terminar As Button - Dim img_prod As ImageView - Dim IMG_PASO() As Byte - Dim L_PROID As Label - Dim clie_id As String - Dim sDate,sTime As String - Dim usuario As String - Dim lat_gps, lon_gps As String - Dim t_venta As Label - Dim PROMO_C As String - Dim i_fotol As ImageView - Private DESC_PROMO As Button - Private nopromo As Button - Dim TOT_ART_PROMO As String - Dim cambio As String - Dim COSTO_TOT As String - Dim ALMACEN As String - Dim preciosin As String - Dim cl_ruta As String - Dim d As Cursor - Dim TOT_ART_PROMOR As String - Dim PROMO_CR As String - Dim TOTAL_PROMO As String - Dim HCCP_CANT As String - Private Panel1 As Panel - Dim query As String - Private t_precio As Label - Private LV_PRECIOS As ListView - Private PERFIL As String - Private EXISTE_CAMBIO As String - Private QUERY2 As String - Dim CAMBIOS As String - Dim precio2 As String - Private B_MENOS As Button - Private B_MAS As Button - Private E_CAMBIO As EditText - Private B_MENOSC As Button - Private B_MASC As Button - Private limite_abordo As String - Private limite_anterior As String - Private cuenta As String - Private limite_actual As String - Private l_invact As Label - Private L_LINV As Label - Private L_CANT As Label - Private V_ANT_SALIR As String - Private L_CARGA As Label - Private DESC_SS As String - Private DESC_PING As String - Private DESC_RTEC As String - Private TIPO_CLIENTE As String - Private PROMOS_VENTAS As String - Private Label3 As Label - Private ImageView4 As ImageView - Dim PRECIO_CERO As String - Private SI_APLICA_PROMO As String - Private PROMO_ESP As String - Private TOTAL_PROMO_CLIE As String - Private INV_TOTAL_PROMO As String - Private YA_IMPRIMIO As String - Private HCCP_CANT_E As String - Dim lvClic As Map - Private TECLA_BACK As String = 0 - Private lv_producto2 As ListView - Private lv_subtipo As ListView - Dim logger As Boolean = True -End Sub - -'You can add more parameters here. -Public Sub Initialize As Object - Return Me -End Sub - -'This event will be called once, before the page becomes visible. -Private Sub B4XPage_Created (Root1 As B4XView) - If Not(Starter.Logger) Then logger = False - Root = Root1 - 'load the layout to Root - Root.LoadLayout("productos") - ruta = File.DirInternal - Panel1.Visible= False - lvClic.Initialize -End Sub - -'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. - -Sub B4XPage_Appear -' If Subs.traeUltimaActividadBD <> "Productos" Then Subs.iniciaActividad(Subs.traeUltimaActividadBD) - Terminar.Enabled = True - guardar.Enabled = True - If Subs.clienteActual <> "0" Then Starter.tipov = "VENTA" Else Starter.tipov = "ABORDO" - If logger Then Log(Subs.clienteActual & "|" &Starter.tipov) - If logger Then Log("Entro="&entro) - If logger Then Log("ya_entro="&ya_entro) - If Starter.tipov = "PREVENTA" Then - query = "cat_gunaprod" - QUERY2 = "COUNT_GUNAPROD" - Else IF Starter.tipov = "VENTA" Then - query = "cat_gunaprod2" - QUERY2= " COUNT_GUNAPROD2" - ELSE IF Starter.tipov = "ABORDO" Then - query = "cat_gunaprod" - QUERY2 = "COUNT_GUNAPROD" - Else - query = "cat_gunaprod" - QUERY2 = "COUNT_GUNAPROD" - End If - E_CAMBIO.Text = "0" - cantidad.Text = "0" - If ya_entro <> "1" Then - If entro=0 Then entro ="2" - ya_entro ="1" - Dim label1 As Label - label1 = ListView1.TwoLinesLayout.Label - label1.TextSize = 14 - label1.TextColor = Colors.Black - Dim label2 As Label - label2 = ListView1.TwoLinesLayout.SecondLabel - label2.TextSize = 14 - label2.TextColor = Colors.Black - c2=Starter.skmt.ExecQuery("select COUNT(*) AS CUANTOS, CAT_GP_TIPO from " & query & " where CAT_GP_ALMACEN > 0 AND CAT_GP_TIPOPROD <> 1 and (length(CAT_GP_CODPROMO) = 1 OR CAT_GP_CODPROMO = CAT_GP_ID) GROUP BY CAT_GP_TIPO ORDER BY CAT_GP_TIPO ASC") - ListView1.Clear - lfila.text = "TIPO" - lvClic.Put("PASO", "TIPO") - If c2.RowCount>0 Then - For i=0 To c2.RowCount -1 - c2.Position=i - ListView1.AddTwoLines(c2.GetString("CAT_GP_TIPO"),c2.GetString("CUANTOS")) - Next - End If - entro = "2" - Else - entro = "3" - If logger Then LogColor($"Entro=${entro}"$, Colors.Blue) - ListView1_ItemClick(1,V_ANT_SALIR) - End If - c=Starter.skmt.ExecQuery2("select CAT_VA_VALOR from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("PERFIL")) - c.Position =0 - PERFIL = c.GetString("CAT_VA_VALOR") - c.Close - If PERFIL = "V-COSTO" Then - Starter.skmt.ExecNonQuery("DELETE FROM CAT_GUNAPROD2 WHERE CAT_GP_ID IN (SELECT CAT_GP_ID FROM LISTA_PRECIOS WHERE NLISTA = '9' AND PRECIO = '0')") - End If - ListView1.Visible = True - If cuenta = "0" Then - B4XPages.mainpage.Cliente.CREDITO_DISPONIBLE = 10000000 - End If - - LogColor(ListView1.Visible,Colors.Red) -End Sub - -Sub ListView1_ItemClick (Position As Int, Value As Object) - Private l As List - l.Initialize - l.Add(Position) - l.Add(Value) - If lvClic.ContainsKey("ultimo") Then lvClic.Put("anterior", lvClic.get("ultimo")) - lvClic.Put("ultimo", l) -' If Logger Then Log($"lvClic=${lvClic}"$) - Private Subrutina As Map =CreateMap("nombre":"ListView1_ItemClick", "param1":Position, "param2":Value) - Starter.sesion = CreateMap("actividad":Me, "sub":Subrutina) -' If Logger Then LogColor($"Entro=${entro}, Value=${Value}"$, Colors.Blue) - If Value = "PROMOS" And B4XPages.mainpage.Cliente.cuenta <> "N" Then - entro = "3" - marca = "PROMOS" - tipo = "PROMOS" - Else if Value = "PROMOS" And B4XPages.mainpage.Cliente.cuenta = "N" Then - entro = "5" - Subs.iniciaActividad("Cliente") - End If - If entro = "1" Then - marca = Value - c2=Starter.skmt.ExecQuery2("select COUNT(*) AS CUANTOS, CAT_GP_TIPO from " & query & " where CAT_GP_ALMACEN > 0 and CAT_GP_CLASIF = ? AND CAT_GP_TIPOPROD <> 1 and (length(CAT_GP_CODPROMO) = 1 OR CAT_GP_CODPROMO = CAT_GP_ID) GROUP BY CAT_GP_TIPO ORDER BY CAT_GP_TIPO ASC", Array As String(Value)) - ListView1.Clear - lfila.text = "TIPO" - lvClic = CreateMap("PASO":0, "TIPO":0, "SUB-TIPO":0) - lvClic.Put("TIPO", l) - lvClic.Put("PASO", lfila.Text) - If logger Then Log("lvClic="&lvClic) - If c2.RowCount>0 Then - For i=0 To c2.RowCount -1 - c2.Position=i - ListView1.AddTwoLines(c2.GetString("CAT_GP_TIPO"),c2.GetString("CUANTOS")) - Next - End If - entro = "3" - Else If entro = "2" Then 'Or lvClic.Get("PASO") = "TIPO" Then - tipo = Value - c2=Starter.skmt.ExecQuery2("select COUNT(*) AS CUANTOS, CAT_GP_SUBTIPO from " & query & " where CAT_GP_ALMACEN > 0 and CAT_GP_TIPO = ? AND CAT_GP_TIPOPROD <> 1 and (length(CAT_GP_CODPROMO) = 1 OR CAT_GP_CODPROMO = CAT_GP_ID) GROUP BY CAT_GP_SUBTIPO ORDER BY CAT_GP_SUBTIPO ASC ", Array As String( Value)) - ListView1.Clear - lfila.text = "SUB-TIPO" - lvClic.Put("PASO", lfila.Text) - lvClic.Put("SUB-TIPO", l) -' If Logger Then Log("lvClic="&lvClic) - If c2.RowCount>0 Then - For i=0 To c2.RowCount -1 - c2.Position=i - ListView1.AddTwoLines(c2.GetString("CAT_GP_SUBTIPO"),c2.GetString("CUANTOS")) - Next - End If - entro = "3" -' If Logger Then LogColor($"Entro=${entro}, Value=${Value}"$, Colors.Blue) - Else If entro = "3" Then - TECLA_BACK = 0 - If tipo = "PROMOS" Then TECLA_BACK = 1 -' If Logger Then LogColor($"Entro=${entro}, Value=${Value}"$, Colors.Blue) - V_ANT_SALIR = Value - c2=Starter.skmt.ExecQuery2("select CAT_GP_NOMBRE, CAT_GP_PRECIO, CAT_GP_ALMACEN, CAT_GP_IMG from " & query & " where CAT_GP_ALMACEN > 0 AND CAT_GP_TIPO = ? AND CAT_GP_SUBTIPO =? AND CAT_GP_TIPOPROD <> 1 and (length(CAT_GP_CODPROMO) = 1 OR CAT_GP_CODPROMO = CAT_GP_ID) ", Array As String( tipo, Value)) - ListView1.Clear - lfila.text = "PRODUCTO" - lvClic.Put("PASO", lfila.Text) - lvClic.Put("PRODUCTO", l) -' If Logger Then Log("lvClic="&lvClic) - Dim ins As InputStream - Dim bmp As Bitmap - Dim jpeg() As Byte - If c2.RowCount>0 Then - For i=0 To c2.RowCount -1 - c2.Position=i - jpeg = c2.GetBlob("CAT_GP_IMG") - ins.InitializeFromBytesArray(jpeg, 0, jpeg.Length) - bmp.Initialize2(ins) - ListView1.AddTwoLines(c2.GetString("CAT_GP_NOMBRE"),"# " & c2.GetString("CAT_GP_ALMACEN") & " $ " & c2.GetString("CAT_GP_PRECIO")) - Next - End If - entro = "4" -' LogColor($"Entro=${entro}, Value=${Value}"$, Colors.Blue) - Else If entro = "4" Then -' If Logger Then LogColor($"Entro=${entro}, Value=${Value}"$, Colors.Blue) - Starter.skmt.ExecNonQuery("delete from PROID") - Starter.skmt.ExecNonQuery2("INSERT INTO PROID VALUES (?)", Array As Object(Value)) - HACER_PEDIDO - End If -End Sub - -Private Sub lv_subtipo_ItemClick (Position As Int, Value As Object) - -End Sub - -Private Sub lv_producto2_ItemClick (Position As Int, Value As Object) - -End Sub - -Sub B4XPage_CloseRequest As ResumableSub'ignore - ' BACK key pressed - If logger Then LogColor("BACK", Colors.Red) -' If Logger Then Log("entro=" & entro) -' If Logger Then Log("lvClic="&lvClic) - If TECLA_BACK = 1 Then entro ="2" -' If key=KeyCodes.KEYCODE_BACK Then - ya_entro ="0" - If entro = "4" Or entro = "3" Then - entro = "2" - TECLA_BACK = 1 - ListView1_ItemClick(1,tipo) - Return True - Else If entro = "2" Then 'Antes 3 - B4XPage_Appear - Return False - Else - If logger Then LogColor($"Entro=${entro} - BACK"$, Colors.Blue) - Return False - End If -' End If - ' Returning False signals the system to handle the key -End Sub - -Sub BUSCA_TextChanged (Old As String, New As String) - q_buscar = "%" & BUSCA.Text & "%" - c=Starter.skmt.ExecQuery2("select CAT_GP_NOMBRE, CAT_GP_ALMACEN, CAT_GP_PRECIO,CAT_GP_IMG from " & query & " where CAT_GP_PRECIO > 0 AND CAT_GP_ALMACEN > 0 and CAT_GP_NOMBRE like ? and CAT_GP_CLASIF <> ? AND CAT_GP_TIPOPROD <> 1 and (length(CAT_GP_CODPROMO) = 1 OR CAT_GP_CODPROMO = CAT_GP_ID) order by CAT_GP_NOMBRE asc", Array As String(q_buscar,"PROMOS")) - ListView1.Clear - Dim ins As InputStream - Dim bmp As Bitmap - Dim jpeg() As Byte - If c.RowCount>0 Then - For i=0 To c.RowCount -1 - c.Position=i - jpeg = c.GetBlob("CAT_GP_IMG") - ins.InitializeFromBytesArray(jpeg, 0, jpeg.Length) - bmp.Initialize2(ins) - ListView1.AddTwoLines(c.GetString("CAT_GP_NOMBRE"),"Existencia " & c.GetString("CAT_GP_ALMACEN") & " Precio $" & c.GetString("CAT_GP_PRECIO")) - Next - End If - c.Close - entro= "4" -End Sub - -Sub HACER_PEDIDO - ListView1.Visible = False - c=Starter.skmt.ExecQuery("Select SUBSTR(CUENTA,1,1) AS CUENTA from cuentaa") - c.Position=0 - clie_id = c.GetString("CUENTA") - c.Close - c=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") -' If Logger Then Log("+ + + "&c.RowCount) - c.Position=0 - cuenta = c.GetString("CUENTA") - c.Close - Panel1.Visible= True - cambio = "0" - cantidad.Text = "0" - c=Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") -' If Logger Then Log("+ + + "&c.RowCount) - C.Position =0 - ALMACEN = C.GetString("ID_ALMACEN") - C.Close - i_fotol.Visible = False - c=Starter.skmt.ExecQuery("select CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG,CAT_GP_ALMACEN,CAT_GP_DEV from " & query & " where CAT_GP_NOMBRE In (Select PDESC from PROID)") - c.Position=0 - L_PROID.Text = c.GetString("CAT_GP_ID") - l_tipo.Text = c.GetString("CAT_GP_TIPO") - l_sub.Text = c.GetString("CAT_GP_SUBTIPO") - l_marca.Text = c.GetString("CAT_GP_CLASIF") - l_desc.Text = c.GetString("CAT_GP_NOMBRE") - If PERFIL = "V-SUPER" Then - c2=Starter.skmt.ExecQuery("select PRECIO, NLISTA FROM LISTA_PRECIOS WHERE NLISTA = '10' AND CAT_GP_ID =" & "'" &L_PROID.TEXT&"' ORDER BY NLISTA ASC") - If logger Then Log("+ + + "&c.RowCount) - c2.Position=0 - l_precio.Text = c2.GetString("PRECIO") - c2.Close - Else - l_precio.Text = c.GetDouble("CAT_GP_PRECIO") - End If - l_bodega.Text = c.GetString("CAT_GP_ALMACEN") - PROMOS_VENTAS = c.GetString("CAT_GP_ALMACEN") - IMG_PASO = c.GetBlob("CAT_GP_IMG") - PROMO_C = c.GetString("CAT_GP_STS") - cambio = c.GetString("CAT_GP_DEV") - preciosin = c.GetString("CAT_GP_IMP2") - PROMO_CR = c.GetString("CAT_GP_IMP1") - precio2 = l_precio.Text - c=Starter.skmt.ExecQuery("select CAT_VA_VALOR from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'LIMITE'") -' If Logger Then Log("+ + + "&c.RowCount) - If c.RowCount > 0 Then - C.Position = 0 - limite_abordo = C.GetString("CAT_VA_VALOR") - End If - C.Close - c=Starter.skmt.ExecQuery2("select sum(cat_gp_precio * cat_gp_almacen) as MONTO from cat_gunaprod2 where cat_gp_almacen > 0 and cat_gp_clasif <> ? ", Array As String("PROMOS")) -' If Logger Then Log("+ + + "&c.RowCount) - c.Position = 0 - limite_anterior = c.GetString("MONTO") - c.Close - If clie_id = "0" Then - l_invact.Visible=True - L_LINV.Visible=True - L_CARGA.Visible = True - L_CANT.Text ="PEDIDO" - c2=Starter.skmt.ExecQuery("select count(*) as CUANTOS from cat_gunaprod2 where CAT_GP_NOMBRE In (Select PDESC from PROID)") -' If Logger Then Log("+ + + "&c2.RowCount) - c2.Position =0 - If c2.GetString("CUANTOS") > 0 Then - c=Starter.skmt.ExecQuery("select CAT_GP_ALMACEN from cat_gunaprod2 where CAT_GP_NOMBRE In (Select PDESC from PROID)") - C.Position =0 - l_invact.text = C.GetString("CAT_GP_ALMACEN") - C.Close - Else - l_invact.text = 0 - End If - Label3.Visible = False - ImageView4.Visible = False - E_CAMBIO.Visible = False - B_MENOSC.Visible = False - B_MASC.Visible = False - Else - l_invact.Visible=False - L_LINV.Visible=False - L_CARGA.Visible = False - L_CANT.Text ="VENTA" - Label3.Visible = True - ImageView4.Visible = True - E_CAMBIO.Visible = True - B_MENOSC.Visible = True - B_MASC.Visible = True - End If - DESC_SS = 0 - DESC_PING = 0 - DESC_RTEC = 0 - CC=Starter.skmt.ExecQuery("SELECT COUNT(*) AS CUANTOS FROM DESC_CLIENTES WHERE DC_CL_CLIENTE IN (Select cuenta from cuentaa) ") -' If Logger Then Log("+ + + "&CC.RowCount) - CC.Position =0 - If CC.GetString("CUANTOS") > 0 Then - DD=Starter.skmt.ExecQuery("SELECT DC_CL_CLIENTE , CAT_CL_DESCUENTO_SS , CAT_CL_DESCUENTO_RTEC , CAT_CL_DESCUENTO_PING, CAT_CL_TIPOCLIENTE FROM DESC_CLIENTES WHERE DC_CL_CLIENTE IN (Select cuenta from cuentaa) ") -' If Logger Then Log("+ + + "&DD.RowCount) - DD.Position =0 - DESC_SS = DD.GetString("CAT_CL_DESCUENTO_SS") - DESC_RTEC = DD.GetString("CAT_CL_DESCUENTO_RTEC") - DESC_PING = DD.GetString("CAT_CL_DESCUENTO_PING") - TIPO_CLIENTE = DD.GetString("CAT_CL_TIPOCLIENTE") - DD.Close - Else - DESC_SS = 0 - DESC_PING = 0 - DESC_RTEC = 0 - TIPO_CLIENTE = 0 - End If - CC.Close - '' esto es de las promos para activarlas despues - If l_marca.text = "PROMOS" And l_tipo.Text ="PROMOS" Then - DESC_PROMO.Visible = True - CC=Starter.skmt.ExecQuery2("select count(*) as CUANTOS FROM PROMOS_COMP WHERE CAT_PA_ID = ?", Array As String(L_PROID.Text)) - CC.Position =0 - If CC.GetString("CUANTOS") = 0 Then - l_bodega.Text = "1" - Else - CC.Close - CC=Starter.skmt.ExecQuery2("select CAT_PA_MAXPROM, CAT_PA_MAXPROMREC, CAT_PA_MAXPROMCLIE FROM PROMOS_COMP WHERE CAT_PA_ID = ?", Array As String(L_PROID.Text)) - CC.Position =0 - - DD=Starter.skmt.ExecQuery2("SELECT COUNT(*) AS CUANTOS FROM HIST_CLIENTE_CANT_PROMOS WHERE HCCP_CLIENTE IN (Select cuenta from cuentaa) AND HCCP_PROMO =?", Array As String(L_PROID.Text)) - DD.Position =0 - If DD.GetString("CUANTOS") = 0 Then - HCCP_CANT_E = 0 - Else - DD.Close - DD=Starter.skmt.ExecQuery2("SELECT HCCP_CANT FROM HIST_CLIENTE_CANT_PROMOS WHERE HCCP_CLIENTE IN (Select cuenta from cuentaa) AND HCCP_PROMO =?", Array As String(L_PROID.Text)) - DD.Position =0 - HCCP_CANT_E = DD.GetString("HCCP_CANT") - DD.Close - End If - DD=Starter.skmt.ExecQuery2("SELECT COUNT(*) AS CUANTOS FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select cuenta from cuentaa) AND HVD_PRONOMBRE =?", Array As String(l_desc.Text)) - DD.Position =0 - If DD.GetString("CUANTOS") = 0 Then - HCCP_CANT = 0 - Else - DD.Close - DD=Starter.skmt.ExecQuery2("SELECT SUM(HVD_CANT) AS HCCP_CANT FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select cuenta from cuentaa) AND HVD_PRONOMBRE =?", Array As String(l_desc.Text)) - DD.Position =0 - HCCP_CANT = DD.GetString("HCCP_CANT") - DD.Close - End If - HCCP_CANT_E = HCCP_CANT_E - HCCP_CANT - TOTAL_PROMO = CC.GetString("CAT_PA_MAXPROMCLIE") - HCCP_CANT - If HCCP_CANT = 0 Then - PROMOS_VENTAS = CC.GetString("CAT_PA_MAXPROM") - Else IF TOTAL_PROMO > CC.GetString("CAT_PA_MAXPROMREC") Then - PROMOS_VENTAS = CC.GetString("CAT_PA_MAXPROMREC") - Else - PROMOS_VENTAS = TOTAL_PROMO - End If - End If - Else - DESC_PROMO.Visible = False - End If - c.Close - c=Starter.skmt.ExecQuery("select CASE WHEN pe_costo_tot is null then 0 else sum( pe_costo_tot ) end as TOTAL_CLIE FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") - c.Position=0 - t_venta.Text = c.GetString("TOTAL_CLIE") - c.Close - Terminar.Visible = True - guardar.Visible = True - cantidad.Visible = True - If cambio = "1" Then - nopromo.Visible = True - Else - nopromo.Visible = False - End If - Dim out As OutputStream - out = File.OpenOutput(ruta, "1.jpg", False) - out.WriteBytes(IMG_PASO, 0, IMG_PASO.Length) - out.Close - img_prod.Bitmap = LoadBitmap(ruta,"1.jpg") - TOT_ART_PROMO = "0" - TOT_ART_PROMOR = "0" - If l_marca.text = "PROMOS" And l_tipo.Text ="PROMOS" And l_bodega.Text = "0" Then - MsgboxAsync("ALERTA","EL CLIENTE YA NO PUEDE TENER ESTA PROMOCION") 'ignore - Panel1.Visible= False - End If - If marca = "PROMOS" Then - DD=Starter.skmt.ExecQuery2("SELECT COUNT(*) AS CUANTOS FROM PROMOS_COMP WHERE CAT_PA_ID =?", Array As String(L_PROID.Text)) - DD.Position =0 - If DD.GetString("CUANTOS") > 0 Then - C=Starter.skmt.ExecQuery2("SELECT CAT_PA_MAXPROMCLIE FROM PROMOS_COMP WHERE CAT_PA_ID =?", Array As String(L_PROID.Text)) - C.Position =0 - TOTAL_PROMO_CLIE = c.GetString("CAT_PA_MAXPROMCLIE") - c.Close - Else - TOTAL_PROMO_CLIE = 0 - End If - DD.Close - Else - If TIPO_CLIENTE = "TDCK" Then - - c=Starter.skmt.ExecQuery("select PRECIO, NLISTA FROM LISTA_PRECIOS WHERE NLISTA ='10' AND CAT_GP_ID =" & "'" &L_PROID.TEXT&"' ORDER BY NLISTA ASC") - c.Position=0 - l_precio.Text = c.GetString("PRECIO") - c.Close - End If - End If - If l_tipo.Text = "SALTY SNACKS" Then - l_precio.Text = Round2(l_precio.Text -(l_precio.Text * DESC_SS/100),2) - ELSE IF l_tipo.Text = "PING" Then - l_precio.Text = Round2(l_precio.Text - (l_precio.Text * DESC_PING/100),2) - ELSE IF l_tipo.Text = "RTEC" Then - l_precio.Text = Round2(l_precio.Text - (l_precio.Text * DESC_RTEC/100),2) - End If - - If l_marca.text = "PROMOS" And l_tipo.Text ="PROMOS" And l_bodega.Text = "0" Then - MsgboxAsync("ALERTA","EL CLIENTE NO PUEDE TENER ESTA PROMOCION") 'ignore - Panel1.Visible= False - End If - DD=Starter.skmt.ExecQuery2("SELECT COUNT(*) AS CUANTOS FROM HIST_CLIENTE_CANT_PROMOS WHERE HCCP_CLIENTE IN (Select cuenta from cuentaa) AND HCCP_PROMO =?", Array As String(L_PROID.Text)) - DD.Position =0 - SI_APLICA_PROMO = DD.GetString("CUANTOS") - DD.Close - DD=Starter.skmt.ExecQuery2("SELECT COUNT(*) AS CUANTOS FROM HIST_CLIENTE_CANT_PROMOS WHERE HCCP_PROMO =?", Array As String(L_PROID.Text)) - DD.Position =0 - PROMO_ESP = DD.GetString("CUANTOS") - DD.Close - If PROMO_ESP > 0 And SI_APLICA_PROMO = 0 Then - MsgboxAsync("ALERTA","EL CLIENTE NO PUEDE TENER ESTA PROMOCION 1") 'ignore - Panel1.Visible= False - End If - If L_PROID.Text = "PROMO58" Then - l_bodega.Text = 1 - End If - If L_PROID.Text = "PROMO58" And HCCP_CANT_E < 1 Then - MsgboxAsync("ALERTA","EL CLIENTE NO PUEDE TENER ESTA PROMOCION <") - Panel1.Visible= False - End If - If HCCP_CANT_E = 0 And ( L_PROID.Text = "1000000001" Or L_PROID.Text = "PROMO243" Or L_PROID.Text = "PROMO244" Or L_PROID.Text = "PROMO245" )Then - MsgboxAsync("ALERTA","EL CLIENTE NO PUEDE TENER ESTA PROMOCION 0 " &HCCP_CANT & " "& L_PROID.Text) 'ignore - Panel1.Visible= False - Else IF L_PROID.Text = "1000000001" Or L_PROID.Text = "PROMO243" Or L_PROID.Text = "PROMO244" Or L_PROID.Text = "PROMO245" Then - l_bodega.Text = 1 - End If - If L_PROID.Text = "PROMO76" And HCCP_CANT = 0 Then - MsgboxAsync("ALERTA","EL CLIENTE NO PUEDE TENER ESTA PROMOCION 2") 'ignore - Panel1.Visible= False - Else IF L_PROID.Text = "PROMO76" Then - l_bodega.Text = 1 - End If - C=Starter.skmt.ExecQuery("SELECT COUNT(*) AS CUANTOS FROM CAT_DESCUENTOS_SKU WHERE CAT_DS_CLIENTE IN (Select cuenta from cuentaa) AND CAT_DS_PRODID = " & "'" &L_PROID.TEXT&"' ") - C.Position =0 - If c.GetString("CUANTOS") > 0 Then - DD=Starter.skmt.ExecQuery("SELECT CAT_DS_PORCENTAJE FROM CAT_DESCUENTOS_SKU WHERE CAT_DS_CLIENTE IN (Select cuenta from cuentaa) AND CAT_DS_PRODID = " & "'" &L_PROID.TEXT&"' ") - DD.Position =0 - l_precio.Text = Round2(l_precio.Text - (l_precio.Text * DD.GetString("CAT_DS_PORCENTAJE")/100),2) - End If - c.Close - '' ESTO ES PARA NO PASAR DE LAS PROMOS ABORDO Y MANDARLAS AL MINIMO INICIO - If l_marca.text = "PROMOS" And l_tipo.Text ="PROMOS" Then - e=Starter.skmt.ExecQuery2("select count(*) as CUANTOS FROM pedido WHERE PE_PROID = ? AND PE_CLIENTE IN (Select cuenta from cuentaa) ", Array As String(L_PROID.Text)) - e.Position =0 - If e.GetString("CUANTOS") = 0 Then - l_bodega.Text = PROMOS_VENTAS - e=Starter.skmt.ExecQuery2("select count(*) as CUANTOS FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID = ? and cat_dp_tipo = 0", Array As String(L_PROID.Text) ) - e.Position = 0 - If e.GetString("CUANTOS") > 0 Then - F=Starter.skmt.ExecQuery2("select CAT_DP_IDPROD, sum(CAT_DP_PZAS) as CAT_DP_PZAS FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID = ? and cat_dp_tipo = 0 GROUP BY CAT_DP_IDPROD", Array As String(L_PROID.Text) ) - 'se coloco el if por la mala promocion. - For i=0 To F.RowCount -1 - F.Position=i - c=Starter.skmt.ExecQuery2("select count(*) as CUANTOS from cat_gunaprod2 where CAT_GP_ID = ? and cat_gp_almacen > 0 ", Array As String(f.GetString("CAT_DP_IDPROD"))) - c.Position=0 - If c.GetString("CUANTOS") > 0 Then - h=Starter.skmt.ExecQuery2("select CAT_GP_NOMBRE, CAT_GP_ALMACEN from cat_gunaprod2 where CAT_GP_ID = ? ", Array As String(f.GetString("CAT_DP_IDPROD"))) - h.Position=0 - If TOTAL_PROMO_CLIE > l_bodega.Text Then - INV_TOTAL_PROMO = l_bodega.Text - Else - INV_TOTAL_PROMO = TOTAL_PROMO_CLIE - End If - If h.GetString("CAT_GP_ALMACEN") < INV_TOTAL_PROMO * f.GetString("CAT_DP_PZAS") Then - If h.GetString("CAT_GP_ALMACEN") < f.GetString("CAT_DP_PZAS") Then - l_bodega.Text = "0" - Else - l_bodega.Text = Round(h.GetString("CAT_GP_ALMACEN") / f.GetString("CAT_DP_PZAS")) - End If - End If - h.Close - else if c.GetString("CUANTOS") = 0 Then - l_bodega.Text = "0" - End If - c.Close - Next - f.Close - End If - e.Close - If l_bodega.Text = "0" Then - Msgbox ("PROMO LLEGO AL LIMITE PARA ESTE CLIENTE", "AVISO") 'ignore - Panel1.Visible= False - l_bodega.Text = "0" - Subs.iniciaActividad("Cliente") - End If - Else - Msgbox ("YA SE VENDIO LA PROMO.", "AVISO") 'ignore - Panel1.Visible= False - l_bodega.Text = "0" - Subs.iniciaActividad("Cliente") - End If - End If - If l_marca.text = "PROMOS" And B4XPages.MainPage.cliente.YA_IMPRIMIO2 = 1 Then - Msgbox ("YA SE IMPRIMIO EL TICKET.", "AVISO") 'ignore - Panel1.Visible= False - l_bodega.Text = "0" - Subs.iniciaActividad("Cliente") - End If -End Sub - -Sub guardar_Click - guardar.Enabled = False - Panel1.Visible=False - If cantidad.Text = "" Then - cantidad.Text = 0 - End If - limite_actual = t_venta.Text + (cantidad.Text * l_precio.Text) - Log($"Limite actual=${limite_actual}"$) - If cuenta = "0" Then - limite_actual = limite_actual + limite_anterior - End If - Log($"Limite actual=${limite_actual}"$) - If Starter.lat_gps = 0 Or Starter.lat_gps = Null Then - Private coords As List = Subs.traeCoordsDeBD - Starter.lat_gps = coords.Get(0) - Starter.lon_gps = coords.Get(1) - End If -' If Logger Then Log($"cuenta: ${cuenta}, limite_actual:${limite_actual}, limite_abordo:${limite_abordo}"$) - If limite_abordo = "" Then limite_abordo = 0 'Mod por CHV - 211213 - Para que si limite_abordo no tiene valor, no nos saque de la app. - If cuenta ="0" And limite_actual > limite_abordo And cantidad.Text <> 0 And cantidad.Text <> "" Then - Log($"${cuenta},${limite_actual > limite_abordo},${cantidad.text}"$) - Msgbox("Excede el limite abordo","limite") 'ignore - Else IF (cuenta <> "0" And limite_actual < B4XPages.MainPage.cliente.CREDITO_DISPONIBLE) Or (cuenta ="0" And limite_actual < limite_abordo) Then - If E_CAMBIO.Text = "" Or E_CAMBIO.Text = "0" Then - Panel1.Visible= False - entro = "3" - If BUSCA.Text = "" Then - ListView1_ItemClick(1,V_ANT_SALIR) - Else - BUSCA_TextChanged(1, BUSCA.Text) - End If - Else - If E_CAMBIO.Text = "" Then E_CAMBIO.Text = "0" - If E_CAMBIO.Text * l_precio.Text > t_venta.Text Then - Msgbox("Excede EL MONTO DE LA VENTA", "ADVERTENCIA") 'ignore - else if E_CAMBIO.Text + cantidad.Text > l_bodega.Text Then - Msgbox("Excede existencia", "ADVERTENCIA") 'ignore - Else - Subs.guardaCambiosDeProducto(E_CAMBIO.text, l_desc.text, L_PROID.Text, precio2, query) - E_CAMBIO.Text = "" - Panel1.Visible= False - entro = "3" - If BUSCA.Text = "" Then - ListView1_ItemClick(1,V_ANT_SALIR) - Else - BUSCA_TextChanged(1, BUSCA.Text) - End If - End If - End If - If cantidad.Text = "" Or cantidad.Text = "0.0" Or cantidad.Text = "0" Then - Panel1.Visible= False - entro = "3" - If BUSCA.Text = "" Then - ListView1_ItemClick(1,V_ANT_SALIR) - Else - BUSCA_TextChanged(1, BUSCA.Text) - End If - ELSE If cantidad.Text > l_bodega.Text Then - Msgbox("Excede la existencia", "ADVERTENCIA") 'ignore - Else If l_marca.text = "PROMOS" And l_tipo.Text ="PROMOS" And PROMO_C > 0 And cantidad.Text > 0 Then - Starter.skmt.ExecNonQuery("delete from PROIDID") - Starter.skmt.ExecNonQuery2("INSERT INTO PROIDID VALUES (?)", Array As Object(L_PROID.text)) - c=Starter.skmt.ExecQuery("Select count(*) as CUANTOSD from pedido where PE_CLIENTE IN (Select CUENTA from cuentaa) and PE_COSTOU > 0 and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND CAT_DP_TIPO = 1)") - c.Position =0 - If c.GetString("CUANTOSD") = 0 Then - Msgbox("No tiene venta el cliente para la promo", "ADVERTENCIA") 'ignore - Else - c=Starter.skmt.ExecQuery("Select sum(pe_cant) As TOT_ART_PROMO, sum(PE_COSTO_TOT) as COSTO_TOT from pedido where PE_CLIENTE IN (Select CUENTA from cuentaa) and PE_COSTOU > 0 and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND CAT_DP_TIPO = 1)") - C.Position =0 - TOT_ART_PROMO = C.GetString("TOT_ART_PROMO") - COSTO_TOT = C.GetString("COSTO_TOT") - C.Close - ' se agrego and PE_COSTOU > 0 para que no tome los cambios - c=Starter.skmt.ExecQuery("Select count(*) as CUANTOSD from pedido where PE_CLIENTE IN (Select CUENTA from cuentaa) and PE_COSTOU > 0 and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND (CAT_DP_PRECIO = 0.01 or CAT_DP_PRECIO = 1 OR CAT_DP_PRECIO = 0) AND CAT_DP_TIPO = 1)") - c.Position =0 - If c.GetString("CUANTOSD") = 0 Then - TOT_ART_PROMOR = "0" 'Msgbox("No tiene venta el cliente para la promo", "ADVERTENCIA") 'ignore - Else - c=Starter.skmt.ExecQuery("Select sum(pe_cant) As TOT_ART_PROMO, sum(PE_COSTO_TOT) as COSTO_TOT from pedido where PE_CLIENTE IN (Select CUENTA from cuentaa) and PE_COSTOU > 0 and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND (CAT_DP_PRECIO = 0.01 or CAT_DP_PRECIO = 1 OR CAT_DP_PRECIO = 0) AND CAT_DP_TIPO = 1)") - C.Position =0 - TOT_ART_PROMOR = C.GetString("TOT_ART_PROMO") - End If - C.Close - If PROMO_C = "" Then PROMO_C = "0" - PROMO_C = PROMO_C * cantidad.Text - If PROMO_CR = "" Then PROMO_CR = "0" - PROMO_CR = PROMO_CR * cantidad.Text - If TOT_ART_PROMO = PROMO_C And TOT_ART_PROMOR = PROMO_CR Then - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO SET PE_CEDIS = (?) WHERE PE_CEDIS not like 'PROMO%' and PE_CLIENTE IN (Select CUENTA from cuentaa) and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID))", Array As Object(L_PROID.text)) - D=Starter.skmt.ExecQuery("select CAT_DP_ID, CAT_DP_PRECIO, CAT_DP_PRECIO_SIMPTOS, CAT_DP_IDPROD FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) AND CAT_DP_PRECIO > 1 AND CAT_DP_TIPO = 1") ' MODIFCADO 05/05/2021 PARA QUE NO TOME LOS CAMBIOS - If D.RowCount>0 Then - For i=0 To D.RowCount -1 - D.Position=i - ' se agrega esta linea para que no tome los cambios - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO SET PE_COSTOU = (?), PE_COSTO_TOT = PE_CANT * (?) , PE_COSTO_SIN = (?) WHERE PE_PROID = (?) And PE_CLIENTE IN (Select CUENTA from cuentaa) and PE_COSTOU > 0 and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND CAT_DP_TIPO = 1 AND CAT_DP_PRECIO > 1) ",Array As Object( D.GetString("CAT_DP_PRECIO"), D.GetString("CAT_DP_PRECIO"), D.GetString("CAT_DP_PRECIO_SIMPTOS"),D.GetString("CAT_DP_IDPROD"))) - Next - End If - D.Close - D=Starter.skmt.ExecQuery("select CAT_DP_ID, CAT_DP_PRECIO, CAT_DP_PRECIO_SIMPTOS, CAT_DP_IDPROD FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) AND (CAT_DP_PRECIO = 0.01 or CAT_DP_PRECIO = 1 OR CAT_DP_PRECIO = 0) AND CAT_DP_TIPO = 1") - If D.RowCount>0 Then - For i=0 To D.RowCount -1 - D.Position=i - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO SET PE_COSTOU = (?), PE_COSTO_TOT = PE_CANT * (?) , PE_COSTO_SIN = (?) WHERE PE_PROID = (?) AND PE_CLIENTE IN (Select CUENTA from cuentaa) and PE_COSTOU > 0 and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND CAT_DP_TIPO = 1",Array As Object( D.GetString("CAT_DP_PRECIO"), D.GetString("CAT_DP_PRECIO"), D.GetString("CAT_DP_PRECIO_SIMPTOS"),D.GetString("CAT_DP_IDPROD"))) - Next - End If - D.Close - DateTime.DateFormat = "MM/dd/yyyy" - sDate=DateTime.Date(DateTime.Now) - sTime=DateTime.Time(DateTime.Now) - c=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") - c.Position=0 - clie_id = c.GetString("CUENTA") - c.Close - c=Starter.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)") - cl_ruta = "0" - If c.RowCount > 0 Then - c.Position=0 - cl_ruta = c.GetString("CAT_CL_RUTA") - End If - c.Close - c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") - usuario = "" - If c.RowCount > 0 Then - c.Position=0 - usuario = c.GetString("USUARIO") - End If - 'para insertar la promo de ades el de regalo en 0 - e=Starter.skmt.ExecQuery("select count(*) as CUANTOS FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) and CAT_DP_TIPO = 0 ") - e.Position =0 - If e.GetString("CUANTOS") > 0 Then - F=Starter.skmt.ExecQuery("select CAT_DP_IDPROD, CAT_DP_PZAS,CAT_DP_PRECIO FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) and CAT_DP_TIPO = 0 ") - 'meter el otro - If f.RowCount>0 Then - For i=0 To f.RowCount -1 - f.Position=i - 'F.Position =0 - PRECIO_CERO = f.GetString("CAT_DP_PRECIO") - h=Starter.skmt.ExecQuery2("select CAT_GP_NOMBRE from CAT_GUNAPROD2 where CAT_GP_ID = ? ", Array As String(f.GetString("CAT_DP_IDPROD"))) - h.Position=0 - Starter.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_TIPO,PE_PRECIO2) VALUES(?,?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (L_PROID.text,PRECIO_CERO * f.GetString("CAT_DP_PZAS") * cantidad.text, PRECIO_CERO, f.GetString("CAT_DP_PZAS") * cantidad.text, h.GetString("CAT_GP_NOMBRE"), f.GetString("CAT_DP_IDPROD"),clie_id, sDate & sTime, usuario,cl_ruta,Starter.tipov,precio2)) - 'ESTO LO CAMBIE POR QUE NO DESCUENTA EL INVENTARIO ABORDO CON LAS PROMOS - Starter.skmt.ExecNonQuery2("update " & query & " set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(f.GetString("CAT_DP_PZAS") * cantidad.text, f.GetString("CAT_DP_IDPROD"))) - h.Close - Next - End If - f.Close - End If - e.Close - Starter.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_TIPO,PE_PRECIO2) VALUES(?,?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (L_PROID.text,0, 0, cantidad.text, l_desc.text, L_PROID.Text,clie_id, sDate & sTime, usuario,cl_ruta,Starter.tipov,precio2)) - Starter.skmt.ExecNonQuery2("update " & query & " set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cantidad.Text, L_PROID.Text)) - Else - Msgbox("Tiene " & TOT_ART_PROMO & " " & TOT_ART_PROMOR & " y necesita " & PROMO_C & " " & PROMO_CR & " Para la Promo. " , "ADVERTENCIA") 'ignore - End If - End If - cantidad.Text = "" - Panel1.Visible= False - entro = "3" - If BUSCA.Text = "" Then - ListView1_ItemClick(1,V_ANT_SALIR) - Else - BUSCA_TextChanged(1, BUSCA.Text) - End If - - ''''' PROMOS QUE NO SON VARIABLE - else If l_marca.text = "PROMOS" And l_tipo.Text ="PROMOS" And PROMO_C = 0 Then - Starter.skmt.ExecNonQuery("delete from PROIDID") - Starter.skmt.ExecNonQuery2("INSERT INTO PROIDID VALUES (?)", Array As Object(L_PROID.text)) - c=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") - c.Position=0 - clie_id = c.GetString("CUENTA") - c.Close - DateTime.DateFormat = "MM/dd/yyyy" - sDate=DateTime.Date(DateTime.Now) - sTime=DateTime.Time(DateTime.Now) - c=Starter.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)") - c.Position=0 - cl_ruta = c.GetString("CAT_CL_RUTA") - c.Close - c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") - c.Position=0 - usuario = c.GetString("USUARIO") - 'para insertar la promo de ades el de regalo en 0 - e=Starter.skmt.ExecQuery("select count(*) as CUANTOS FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) ") - e.Position =0 - If e.GetString("CUANTOS") > 0 Then - F=Starter.skmt.ExecQuery("select CAT_DP_IDPROD, CAT_DP_PZAS, CAT_DP_PRECIO FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID)") - For i =0 To f.RowCount -1 - F.Position =i - h=Starter.skmt.ExecQuery2("select CAT_GP_NOMBRE from " & query & " where CAT_GP_ID = ? ", Array As String(f.GetString("CAT_DP_IDPROD"))) - h.Position=0 - Starter.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_TIPO,PE_PRECIO2) VALUES(?,?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (L_PROID.text,f.GetString("CAT_DP_PRECIO") * cantidad.text * f.GetString("CAT_DP_PZAS"), f.GetString("CAT_DP_PRECIO"), f.GetString("CAT_DP_PZAS") * cantidad.text, h.GetString("CAT_GP_NOMBRE"), f.GetString("CAT_DP_IDPROD"),clie_id, sDate & sTime, usuario,cl_ruta,Starter.tipov,precio2)) - 'ESTO LO CAMBIE POR QUE NO DESCUENTA EL INVENTARIO ABORDO CON LAS PROMOS - Starter.skmt.ExecNonQuery2("update " & query & " set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(f.GetString("CAT_DP_PZAS") * cantidad.text, f.GetString("CAT_DP_IDPROD"))) - h.Close - Next - f.Close - End If - e.Close - Starter.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_TIPO,PE_PRECIO2) VALUES(?,?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (L_PROID.text,0, 0, cantidad.text, l_desc.text, L_PROID.Text,clie_id, sDate & sTime, usuario,cl_ruta,Starter.tipov,precio2)) - Starter.skmt.ExecNonQuery2("update " & query & " set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cantidad.Text, L_PROID.Text)) - cantidad.Text = "" - c=Starter.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE, SUM(PE_COSTO_SIN) AS TOTAL_CLIE_SIN FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") - c.Position=0 - Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") - If logger Then LogColor($"Insertamos coordenadas en pedido: ${Starter.lon_gps}, ${Starter.lat_gps}"$, Colors.Magenta) - Starter.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT,PC_ALMACEN,PC_RUTA,PC_COSTO_SIN) VALUES (?,?,?,?,?,?,?,?,?,?)", Array As Object(clie_id, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), Starter.lon_gps, Starter.lat_gps,ALMACEN,cl_ruta,c.GetString("TOTAL_CLIE_SIN"))) - Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)") - Panel1.Visible= False - entro = "3" - If BUSCA.Text = "" Then - ListView1_ItemClick(1,V_ANT_SALIR) - Else - BUSCA_TextChanged(1, BUSCA.Text) - End If - Else - DateTime.DateFormat = "MM/dd/yyyy" - sDate=DateTime.Date(DateTime.Now) - sTime=DateTime.Time(DateTime.Now) - c=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") - c.Position=0 - clie_id = c.GetString("CUENTA") - c.Close - c=Starter.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)") - c.Position=0 - cl_ruta = c.GetString("CAT_CL_RUTA") - c.Close - c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") - c.Position=0 - usuario = c.GetString("USUARIO") - Starter.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_COSTO_SIN,PE_TIPO,PE_PRECIO2) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (ALMACEN,cantidad.Text * l_precio.Text, l_precio.text, cantidad.text, l_desc.text, L_PROID.Text,clie_id, sDate & sTime, usuario,cl_ruta,preciosin,Starter.tipov,precio2)) - Starter.skmt.ExecNonQuery2("update " & query & " set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cantidad.Text, L_PROID.Text)) - c=Starter.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE, SUM(PE_COSTO_SIN) AS TOTAL_CLIE_SIN FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") - c.Position=0 - Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") - If logger Then LogColor($"Insertamos coordenadas en pedido: ${Starter.lon_gps}, ${Starter.lat_gps}"$, Colors.Magenta) - Starter.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT,PC_ALMACEN,PC_RUTA,PC_COSTO_SIN) VALUES (?,?,?,?,?,?,?,?,?,?)", Array As Object(clie_id, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), Starter.lon_gps, Starter.lat_gps, ALMACEN,cl_ruta,c.GetString("TOTAL_CLIE_SIN"))) - Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)") - Panel1.Visible= False - entro = "3" - If BUSCA.Text = "" Then - ListView1_ItemClick(1,V_ANT_SALIR) - Else - BUSCA_TextChanged(1, BUSCA.Text) - End If - Starter.skmt.ExecNonQuery("delete from pedido3") - Starter.skmt.ExecNonQuery("UPDATE PEDIDO SET PE_FOLIO = 0 where PE_FOLIO IS NULL") - c=Starter.skmt.ExecQuery("SELECT SUM(PE_FOLIO) AS FOLIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") - c.Position = 0 - If c.GetString("FOLIO") <> Null And c.GetString("FOLIO") > 0 Then - YA_IMPRIMIO = 1 - Else - YA_IMPRIMIO = 0 - End If - c.Close - Starter.skmt.ExecNonQuery("INSERT INTO PEDIDO3 (PE_PRECIO2, PE_TIPO, PE_FECHA, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_USUARIO ) SELECT PE_PRECIO2, PE_TIPO, PE_FECHA, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, SUM(PE_COSTO_TOT) AS PE_COSTO_TOT, PE_COSTOU, SUM(PE_CANT) As PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_USUARIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) GROUP BY PE_PRECIO2, PE_TIPO, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, PE_COSTOU, PE_PRONOMBRE, PE_PROID, PE_CLIENTE ") 'Mod por CHV - 220302 - Agregué PE_FECHA al select/insert - c=Starter.skmt.ExecQuery("select PE_PRECIO2,PE_TIPO,PE_DESC,PE_COSTO_SIN,PE_RUTA,PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE, PE_FECHA,PE_USUARIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") - If c.RowCount>0 Then - For i=0 To c.RowCount -1 - c.Position=i - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO3 SET PE_FECHA= ? WHERE PE_CLIENTE = ? AND PE_PRONOMBRE = ? AND PE_PROID = ? AND PE_CEDIS = ? ", Array As Object(c.GetString("PE_FECHA"), c.GetString("PE_CLIENTE"),c.GetString("PE_PRONOMBRE"),c.GetString("PE_PROID"),c.GetString("PE_CEDIS"))) - Next - End If - c.Close - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO3 SET PE_FOLIO = ? WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)", Array As Object(YA_IMPRIMIO)) - Starter.skmt.ExecNonQuery("delete from pedido WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) ") - Starter.skmt.ExecNonQuery("INSERT INTO PEDIDO SELECT * FROM PEDIDO3") - 'StartActivity(fila) - End If - Starter.skmt.ExecNonQuery("delete from pedido3") - Starter.skmt.ExecNonQuery("UPDATE PEDIDO SET PE_FOLIO = 0 where PE_FOLIO IS NULL") - c=Starter.skmt.ExecQuery("SELECT SUM(PE_FOLIO) AS FOLIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") - c.Position = 0 - If c.GetString("FOLIO") <> Null And c.GetString("FOLIO") > 0 Then - YA_IMPRIMIO = 1 - Else - YA_IMPRIMIO = 0 - End If - c.Close - Starter.skmt.ExecNonQuery("INSERT INTO PEDIDO3 (PE_PRECIO2, PE_TIPO, PE_FECHA, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_USUARIO ) SELECT PE_PRECIO2, PE_TIPO, PE_FECHA, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, SUM(PE_COSTO_TOT) AS PE_COSTO_TOT, PE_COSTOU, SUM(PE_CANT) As PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_USUARIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) GROUP BY PE_PRECIO2, PE_TIPO, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, PE_COSTOU, PE_PRONOMBRE, PE_PROID, PE_CLIENTE ") 'Mod por CHV - 220302 - Agregue PE_FECHA al select/insert - c=Starter.skmt.ExecQuery("select PE_PRECIO2,PE_TIPO,PE_DESC,PE_COSTO_SIN,PE_RUTA,PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE, PE_FECHA,PE_USUARIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") - If c.RowCount>0 Then - For i=0 To c.RowCount -1 - c.Position=i - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO3 SET PE_FECHA= ? WHERE PE_CLIENTE = ? AND PE_PRONOMBRE = ? AND PE_PROID = ? AND PE_CEDIS = ? ", Array As Object(c.GetString("PE_FECHA"), c.GetString("PE_CLIENTE"),c.GetString("PE_PRONOMBRE"),c.GetString("PE_PROID"),c.GetString("PE_CEDIS"))) - Next - End If - c.Close - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO3 SET PE_FOLIO = ? WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)", Array As Object(YA_IMPRIMIO)) - Starter.skmt.ExecNonQuery("delete from pedido WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) ") - Starter.skmt.ExecNonQuery("INSERT INTO PEDIDO SELECT * FROM PEDIDO3") - Else - Log($"${cuenta},${limite_actual > limite_abordo},${cantidad.text},${B4XPages.MainPage.cliente.CREDITO_DISPONIBLE},${limite_actual},${limite_abordo}"$) - Msgbox("EXCEDE EL LIMITE DE CREDITO","AVISO") 'ignore - End If - Starter.skmt.ExecNonQuery("delete from pedido3") - Starter.skmt.ExecNonQuery("UPDATE PEDIDO SET PE_FOLIO = 0 where PE_FOLIO IS NULL") - If cuenta <> "0" Then - c=Starter.skmt.ExecQuery("SELECT SUM(PE_FOLIO) AS FOLIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") - c.Position = 0 - If c.GetString("FOLIO") <> Null And c.GetString("FOLIO") > 0 Then - YA_IMPRIMIO = 1 - Else - YA_IMPRIMIO = 0 - End If - c.Close - End If - Starter.skmt.ExecNonQuery("INSERT INTO PEDIDO3 (PE_PRECIO2, PE_TIPO, PE_FECHA, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_USUARIO ) SELECT PE_PRECIO2, PE_TIPO, PE_FECHA, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, SUM(PE_COSTO_TOT) AS PE_COSTO_TOT, PE_COSTOU, SUM(PE_CANT) As PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_USUARIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) GROUP BY PE_PRECIO2, PE_TIPO, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, PE_COSTOU, PE_PRONOMBRE, PE_PROID, PE_CLIENTE ") 'Mod por CHV - 220302 - Agregué PE_FECHA al select/insert - c=Starter.skmt.ExecQuery("select PE_PRECIO2,PE_TIPO,PE_DESC,PE_COSTO_SIN,PE_RUTA,PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE, PE_FECHA,PE_USUARIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") - If c.RowCount>0 Then - For i=0 To c.RowCount -1 - c.Position=i - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO3 SET PE_FECHA= ? WHERE PE_CLIENTE = ? AND PE_PRONOMBRE = ? AND PE_PROID = ? AND PE_CEDIS = ? ", Array As Object(c.GetString("PE_FECHA"), c.GetString("PE_CLIENTE"),c.GetString("PE_PRONOMBRE"),c.GetString("PE_PROID"),c.GetString("PE_CEDIS"))) - Next - End If - c.Close - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO3 SET PE_FOLIO = ? WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)", Array As Object(YA_IMPRIMIO)) - Starter.skmt.ExecNonQuery("delete from pedido WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) ") - Starter.skmt.ExecNonQuery("INSERT INTO PEDIDO SELECT * FROM PEDIDO3") - ListView1.Visible = True - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO SET PE_FECHA = ? WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) and PE_FECHA IS NULL", Array As Object(sDate & sTime)) - guardar.Enabled = True -End Sub - -Sub GPS_LocationChanged (Location1 As Location) -' lat_gps=Location1.ConvertToSeconds(Location1.Latitude) -' lon_gps=Location1.ConvertToSeconds(Location1.Longitude) -End Sub - -Sub Terminar_Click - Terminar.Enabled = False - Panel1.Visible=False - If cantidad.Text = "" Then - cantidad.Text = 0 - End If - If Starter.lat_gps = 0 Or Starter.lat_gps = Null Then - Private coords As List = Subs.traeCoordsDeBD - Starter.lat_gps = coords.Get(0) - Starter.lon_gps = coords.Get(1) - End If - limite_actual = t_venta.Text + (cantidad.Text * l_precio.Text) - Log($"Limite actual=${limite_actual}"$) - If cuenta = "0" Then - limite_actual = limite_actual + limite_anterior - End If - Log($"Limite actual=${limite_actual}"$) - If limite_abordo = "" Then limite_abordo = 0 'Mod por CHV - 211213 - Para que si limite_abordo no tiene valor, no nos saque de la app. - If cuenta ="0" And limite_actual > limite_abordo And cantidad.Text <> 0 And cantidad.Text <> "" Then - Msgbox("excede el limite abordo","limite") 'ignore - Else IF (cuenta <> "0" And limite_actual < B4XPages.MainPage.cliente.CREDITO_DISPONIBLE) Or (cuenta ="0" And limite_actual < limite_abordo) Then - If E_CAMBIO.Text = "" Or E_CAMBIO.Text = "0" Then - Panel1.Visible= False - Else - If E_CAMBIO.Text = "" Then E_CAMBIO.Text = "0" - If E_CAMBIO.Text * l_precio.Text > t_venta.Text Then - Msgbox("Excede EL MONTO DE LA VENTA", "ADVERTENCIA") 'ignore - else if E_CAMBIO.Text + cantidad.Text > l_bodega.Text Then - Msgbox("Excede existencia", "ADVERTENCIA") 'ignore - Else - Subs.guardaCambiosDeProducto(E_CAMBIO.text, l_desc.text, L_PROID.Text, precio2, query) - E_CAMBIO.Text = "" - Panel1.Visible= False - End If - End If - If cantidad.Text = "" Or cantidad.Text = "0.0" Or cantidad.Text = "0" Then - B4XPages.ShowPage("Cliente") - ELSE If cantidad.Text > l_bodega.Text Then - Msgbox("Excede la existencia", "ADVERTENCIA") 'ignore - Else If l_marca.text = "PROMOS" And l_tipo.Text ="PROMOS" And PROMO_C > 0 And cantidad.Text > 0 Then - Starter.skmt.ExecNonQuery("delete from PROIDID") - Starter.skmt.ExecNonQuery2("INSERT INTO PROIDID VALUES (?)", Array As Object(L_PROID.text)) - c=Starter.skmt.ExecQuery("Select count(*) as CUANTOSD from pedido where PE_CLIENTE IN (Select CUENTA from cuentaa) and PE_COSTOU > 0 and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND CAT_DP_TIPO = 1)") - c.Position =0 - If c.GetString("CUANTOSD") = 0 Then - Msgbox("No tiene venta el cliente para la promo", "ADVERTENCIA") 'ignore - Else - c=Starter.skmt.ExecQuery("Select sum(pe_cant) As TOT_ART_PROMO, sum(PE_COSTO_TOT) as COSTO_TOT from pedido where PE_CLIENTE IN (Select CUENTA from cuentaa) and PE_COSTOU > 0 and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND CAT_DP_TIPO = 1)") - TOT_ART_PROMO = 0 - COSTO_TOT = 0 - If c.RowCount > 0 Then - c.Position =0 - TOT_ART_PROMO = c.GetString("TOT_ART_PROMO") - COSTO_TOT = c.GetString("COSTO_TOT") - End If - C.Close - ' Se agrego and PE_COSTOU > 0 para que no tome los cambios - c=Starter.skmt.ExecQuery("Select count(*) as CUANTOSD from pedido where PE_CLIENTE IN (Select CUENTA from cuentaa) and PE_COSTOU > 0 and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND (CAT_DP_PRECIO = 0.01 or CAT_DP_PRECIO = 1 OR CAT_DP_PRECIO = 0) AND CAT_DP_TIPO = 1)") - c.Position =0 - If c.GetString("CUANTOSD") = 0 Then - TOT_ART_PROMOR = "0" 'Msgbox("No tiene venta el cliente para la promo", "ADVERTENCIA") 'ignore - Else - c=Starter.skmt.ExecQuery("Select sum(pe_cant) As TOT_ART_PROMO, sum(PE_COSTO_TOT) as COSTO_TOT from pedido where PE_CLIENTE IN (Select CUENTA from cuentaa) and PE_COSTOU > 0 and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND (CAT_DP_PRECIO = 0.01 or CAT_DP_PRECIO = 1 OR CAT_DP_PRECIO = 0) AND CAT_DP_TIPO = 1)") - TOT_ART_PROMOR = 0 - If c.RowCount > 0 Then - C.Position =0 - TOT_ART_PROMOR = C.GetString("TOT_ART_PROMO") - End If - End If - C.Close - If PROMO_C = "" Then PROMO_C = "0" - PROMO_C = PROMO_C * cantidad.Text - If PROMO_CR = "" Then PROMO_CR = "0" - PROMO_CR = PROMO_CR * cantidad.Text - If TOT_ART_PROMO = PROMO_C And TOT_ART_PROMOR = PROMO_CR Then - ' anterior a 29/06/2015 - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO SET PE_CEDIS = (?) WHERE PE_CEDIS not like 'PROMO%' and PE_CLIENTE IN (Select CUENTA from cuentaa) and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID))", Array As Object(L_PROID.text)) - D=Starter.skmt.ExecQuery("select CAT_DP_ID, CAT_DP_PRECIO, CAT_DP_PRECIO_SIMPTOS, CAT_DP_IDPROD FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) AND CAT_DP_PRECIO > 1 AND CAT_DP_TIPO = 1") ' MODIFCADO 05/05/2021 PARA QUE NO TOME LOS CAMBIOS - If D.RowCount>0 Then - For i=0 To D.RowCount -1 - D.Position=i - ' se agrega esta linea para que no tome los cambios - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO SET PE_COSTOU = (?), PE_COSTO_TOT = PE_CANT * (?) , PE_COSTO_SIN = (?) WHERE PE_PROID = (?) And PE_CLIENTE IN (Select CUENTA from cuentaa) and PE_COSTOU > 0 and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND CAT_DP_TIPO = 1 AND CAT_DP_PRECIO > 1) ",Array As Object( D.GetString("CAT_DP_PRECIO"), D.GetString("CAT_DP_PRECIO"), D.GetString("CAT_DP_PRECIO_SIMPTOS"),D.GetString("CAT_DP_IDPROD"))) - Next - End If - D.Close - D=Starter.skmt.ExecQuery("select CAT_DP_ID, CAT_DP_PRECIO, CAT_DP_PRECIO_SIMPTOS, CAT_DP_IDPROD FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) AND (CAT_DP_PRECIO = 0.01 or CAT_DP_PRECIO = 1 OR CAT_DP_PRECIO = 0) AND CAT_DP_TIPO = 1") - If D.RowCount>0 Then - For i=0 To D.RowCount -1 - D.Position=i - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO SET PE_COSTOU = (?), PE_COSTO_TOT = PE_CANT * (?) , PE_COSTO_SIN = (?) WHERE PE_PROID = (?) AND PE_CLIENTE IN (Select CUENTA from cuentaa) and PE_COSTOU > 0 and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND CAT_DP_TIPO = 1",Array As Object( D.GetString("CAT_DP_PRECIO"), D.GetString("CAT_DP_PRECIO"), D.GetString("CAT_DP_PRECIO_SIMPTOS"),D.GetString("CAT_DP_IDPROD"))) - Next - End If - D.Close - DateTime.DateFormat = "MM/dd/yyyy" - sDate=DateTime.Date(DateTime.Now) - sTime=DateTime.Time(DateTime.Now) - - c=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") - c.Position=0 - clie_id = c.GetString("CUENTA") - c.Close - c=Starter.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)") - cl_ruta = 0 - If c.RowCount > 0 Then - c.Position=0 - cl_ruta = c.GetString("CAT_CL_RUTA") - End If - c.Close - c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") - usuario = "0" - If c.RowCount > 0 Then - c.Position=0 - usuario = c.GetString("USUARIO") - End If - 'para insertar la promo de ades el de regalo en 0 - e=Starter.skmt.ExecQuery("select count(*) as CUANTOS FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) and CAT_DP_TIPO = 0 ") - e.Position =0 - If e.GetString("CUANTOS") > 0 Then - F=Starter.skmt.ExecQuery("select CAT_DP_IDPROD, CAT_DP_PZAS,CAT_DP_PRECIO FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) and CAT_DP_TIPO = 0 ") - 'meter el otro - If f.RowCount>0 Then - For i=0 To f.RowCount -1 - f.Position=i - PRECIO_CERO = f.GetString("CAT_DP_PRECIO") - h=Starter.skmt.ExecQuery2("select CAT_GP_NOMBRE from CAT_GUNAPROD2 where CAT_GP_ID = ? ", Array As String(f.GetString("CAT_DP_IDPROD"))) - h.Position=0 - Starter.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_TIPO,PE_PRECIO2) VALUES(?,?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (L_PROID.text,PRECIO_CERO * f.GetString("CAT_DP_PZAS") * cantidad.text, PRECIO_CERO, f.GetString("CAT_DP_PZAS") * cantidad.text, h.GetString("CAT_GP_NOMBRE"), f.GetString("CAT_DP_IDPROD"),clie_id, sDate & sTime, usuario,cl_ruta,Starter.tipov,precio2)) - 'ESTO LO CAMBIE POR QUE NO DESCUENTA EL INVENTARIO ABORDO CON LAS PROMOS - Starter.skmt.ExecNonQuery2("update " & query & " set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(f.GetString("CAT_DP_PZAS") * cantidad.text, f.GetString("CAT_DP_IDPROD"))) - h.Close - Next - End If - f.Close - End If - e.Close - Starter.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_TIPO,PE_PRECIO2) VALUES(?,?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (L_PROID.text,0, 0, cantidad.text, l_desc.text, L_PROID.Text,clie_id, sDate & sTime, usuario,cl_ruta,Starter.tipov,precio2)) - Starter.skmt.ExecNonQuery2("update " & query & " set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cantidad.Text, L_PROID.Text)) - Else - Msgbox("Tiene " & TOT_ART_PROMO & " " & TOT_ART_PROMOR & " y necesita " & PROMO_C & " " & PROMO_CR & " Para la Promo. " , "ADVERTENCIA") 'ignore - End If - End If - cantidad.Text = "" - Panel1.Visible= False - Subs.iniciaActividad("Cliente") - else If l_marca.text = "PROMOS" And l_tipo.Text ="PROMOS" And PROMO_C = 0 Then - Starter.skmt.ExecNonQuery("delete from PROIDID") - Starter.skmt.ExecNonQuery2("INSERT INTO PROIDID VALUES (?)", Array As Object(L_PROID.text)) - c=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") - clie_id = "0" - If c.RowCount > 0 Then - c.Position=0 - clie_id = c.GetString("CUENTA") - End If - c.Close - DateTime.DateFormat = "MM/dd/yyyy" - sDate=DateTime.Date(DateTime.Now) - sTime=DateTime.Time(DateTime.Now) - - c=Starter.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)") - c.Position=0 - cl_ruta = c.GetString("CAT_CL_RUTA") - c.Close - - c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") - c.Position=0 - usuario = c.GetString("USUARIO") - 'para insertar la promo de ades el de regalo en 0 - e=Starter.skmt.ExecQuery("select count(*) as CUANTOS FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) ") - e.Position =0 - If e.GetString("CUANTOS") > 0 Then - F=Starter.skmt.ExecQuery("select CAT_DP_IDPROD, CAT_DP_PZAS, CAT_DP_PRECIO FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID)") - For i =0 To f.RowCount -1 - F.Position =i - h=Starter.skmt.ExecQuery2("select CAT_GP_NOMBRE from " & query & " where CAT_GP_ID = ? ", Array As String(f.GetString("CAT_DP_IDPROD"))) - h.Position=0 - Starter.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_TIPO,PE_PRECIO2) VALUES(?,?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (L_PROID.text,f.GetString("CAT_DP_PRECIO") * cantidad.text * f.GetString("CAT_DP_PZAS"), f.GetString("CAT_DP_PRECIO"), f.GetString("CAT_DP_PZAS") * cantidad.text, h.GetString("CAT_GP_NOMBRE"), f.GetString("CAT_DP_IDPROD"),clie_id, sDate & sTime, usuario,cl_ruta,Starter.tipov,precio2)) - 'ESTO LO CAMBIE POR QUE NO DESCUENTA EL INVENTARIO ABORDO CON LAS PROMOS - Starter.skmt.ExecNonQuery2("update " & query & " set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(f.GetString("CAT_DP_PZAS") * cantidad.text, f.GetString("CAT_DP_IDPROD"))) - h.Close - Next - f.Close - End If - e.Close - Starter.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_TIPO,PE_PRECIO2) VALUES(?,?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (L_PROID.text,0, 0, cantidad.text, l_desc.text, L_PROID.Text,clie_id, sDate & sTime, usuario,cl_ruta,Starter.tipov,precio2)) - Starter.skmt.ExecNonQuery2("update " & query & " set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cantidad.Text, L_PROID.Text)) - cantidad.Text = "" - c=Starter.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE, SUM(PE_COSTO_SIN) AS TOTAL_CLIE_SIN FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") - c.Position=0 - Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") - If logger Then LogColor($"Insertamos coordenadas en pedido: ${Starter.lon_gps}, ${Starter.lat_gps}"$, Colors.Magenta) - Starter.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT,PC_ALMACEN,PC_RUTA,PC_COSTO_SIN) VALUES (?,?,?,?,?,?,?,?,?,?)", Array As Object(clie_id, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), Starter.lon_gps, Starter.lat_gps, ALMACEN,cl_ruta,c.GetString("TOTAL_CLIE_SIN"))) - Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)") - Subs.iniciaActividad("Cliente") - Else - DateTime.DateFormat = "MM/dd/yyyy" - sDate=DateTime.Date(DateTime.Now) - sTime=DateTime.Time(DateTime.Now) - c=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") - c.Position=0 - clie_id = c.GetString("CUENTA") - c.Close - c=Starter.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)") - c.Position=0 - cl_ruta = c.GetString("CAT_CL_RUTA") - c.Close - - c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") - c.Position=0 - usuario = c.GetString("USUARIO") - - Starter.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_COSTO_SIN,PE_TIPO,PE_PRECIO2) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (ALMACEN,cantidad.Text * l_precio.Text, l_precio.text, cantidad.text, l_desc.text, L_PROID.Text,clie_id, sDate & sTime, usuario,cl_ruta,preciosin,Starter.tipov,precio2)) - Starter.skmt.ExecNonQuery2("update " & query & " set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cantidad.Text, L_PROID.Text)) - c=Starter.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE, SUM(PE_COSTO_SIN) AS TOTAL_CLIE_SIN FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") - c.Position=0 - Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") - If logger Then LogColor($"Insertamos coordenadas en pedido: ${Starter.lon_gps}, ${Starter.lat_gps}"$, Colors.Magenta) - Starter.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT,PC_ALMACEN,PC_RUTA,PC_COSTO_SIN) VALUES (?,?,?,?,?,?,?,?,?,?)", Array As Object(clie_id, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), Starter.lon_gps, Starter.lat_gps, ALMACEN,cl_ruta,c.GetString("TOTAL_CLIE_SIN"))) - Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)") - Panel1.Visible= False - - Starter.skmt.ExecNonQuery("delete from pedido3") - Starter.skmt.ExecNonQuery("UPDATE PEDIDO SET PE_FOLIO = 0 where PE_FOLIO IS NULL") - c=Starter.skmt.ExecQuery("SELECT SUM(PE_FOLIO) AS FOLIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") - c.Position = 0 - If c.GetString("FOLIO") <> Null And c.GetString("FOLIO") > 0 Then - YA_IMPRIMIO = 1 - Else - YA_IMPRIMIO = 0 - End If - c.Close - Starter.skmt.ExecNonQuery("INSERT INTO PEDIDO3 (PE_PRECIO2, PE_TIPO, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_USUARIO ) SELECT PE_PRECIO2, PE_TIPO, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, SUM(PE_COSTO_TOT) AS PE_COSTO_TOT, PE_COSTOU, SUM(PE_CANT) As PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_USUARIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) GROUP BY PE_PRECIO2, PE_TIPO, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, PE_COSTOU, PE_PRONOMBRE, PE_PROID, PE_CLIENTE ") - c=Starter.skmt.ExecQuery("select PE_PRECIO2,PE_TIPO,PE_DESC,PE_COSTO_SIN,PE_RUTA,PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE, PE_FECHA,PE_USUARIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") - - If c.RowCount>0 Then - For i=0 To c.RowCount -1 - c.Position=i - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO3 SET PE_FECHA= ? WHERE PE_CLIENTE = ? AND PE_PRONOMBRE = ? AND PE_PROID = ? AND PE_CEDIS = ? ", Array As Object(c.GetString("PE_FECHA"), c.GetString("PE_CLIENTE"),c.GetString("PE_PRONOMBRE"),c.GetString("PE_PROID"),c.GetString("PE_CEDIS"))) - Next - End If - c.Close - - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO3 SET PE_FOLIO = ? WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)", Array As Object(YA_IMPRIMIO)) - Starter.skmt.ExecNonQuery("delete from pedido WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) ") - Starter.skmt.ExecNonQuery("INSERT INTO PEDIDO SELECT * FROM PEDIDO3") - Subs.iniciaActividad("Cliente") - End If - Starter.skmt.ExecNonQuery("delete from pedido3") - Starter.skmt.ExecNonQuery("UPDATE PEDIDO SET PE_FOLIO = 0 where PE_FOLIO IS NULL") - c=Starter.skmt.ExecQuery("SELECT SUM(PE_FOLIO) AS FOLIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") - c.Position = 0 - If c.GetString("FOLIO") <> Null And c.GetString("FOLIO") > 0 Then - YA_IMPRIMIO = 1 - Else - YA_IMPRIMIO = 0 - End If - c.Close - Starter.skmt.ExecNonQuery("INSERT INTO PEDIDO3 (PE_PRECIO2, PE_TIPO, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_USUARIO ) SELECT PE_PRECIO2, PE_TIPO, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, SUM(PE_COSTO_TOT) AS PE_COSTO_TOT, PE_COSTOU, SUM(PE_CANT) As PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_USUARIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) GROUP BY PE_PRECIO2, PE_TIPO, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, PE_COSTOU, PE_PRONOMBRE, PE_PROID, PE_CLIENTE ") - c=Starter.skmt.ExecQuery("select PE_PRECIO2,PE_TIPO,PE_DESC,PE_COSTO_SIN,PE_RUTA,PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE, PE_FECHA,PE_USUARIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") - If c.RowCount>0 Then - For i=0 To c.RowCount -1 - c.Position=i - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO3 SET PE_FECHA= ? WHERE PE_CLIENTE = ? AND PE_PRONOMBRE = ? AND PE_PROID = ? AND PE_CEDIS = ? ", Array As Object(c.GetString("PE_FECHA"), c.GetString("PE_CLIENTE"),c.GetString("PE_PRONOMBRE"),c.GetString("PE_PROID"),c.GetString("PE_CEDIS"))) - Next - End If - c.Close - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO3 SET PE_FOLIO = ? WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)", Array As Object(YA_IMPRIMIO)) - Starter.skmt.ExecNonQuery("delete from pedido WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) ") - Starter.skmt.ExecNonQuery("INSERT INTO PEDIDO SELECT * FROM PEDIDO3") - Else - Log($"${cuenta},${limite_actual > limite_abordo},${cantidad.text},${B4XPages.MainPage.cliente.CREDITO_DISPONIBLE},${limite_actual},${limite_abordo}"$) - Msgbox("EXCEDE EL LIMITE DE CREDITO","AVISO") 'ignore - End If - Starter.skmt.ExecNonQuery("delete from pedido3") - Starter.skmt.ExecNonQuery("UPDATE PEDIDO SET PE_FOLIO = 0 where PE_FOLIO IS NULL") - If cuenta <> "0" Then - c=Starter.skmt.ExecQuery("SELECT SUM(PE_FOLIO) AS FOLIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") - c.Position = 0 - If c.GetString("FOLIO") <> Null And c.GetString("FOLIO") > 0 Then - YA_IMPRIMIO = 1 - Else - YA_IMPRIMIO = 0 - End If - c.Close - End If - Starter.skmt.ExecNonQuery("INSERT INTO PEDIDO3 (PE_PRECIO2, PE_TIPO, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_USUARIO ) SELECT PE_PRECIO2, PE_TIPO, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, SUM(PE_COSTO_TOT) AS PE_COSTO_TOT, PE_COSTOU, SUM(PE_CANT) As PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_USUARIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) GROUP BY PE_PRECIO2, PE_TIPO, PE_DESC, PE_COSTO_SIN, PE_RUTA, PE_CEDIS, PE_COSTOU, PE_PRONOMBRE, PE_PROID, PE_CLIENTE ") - c=Starter.skmt.ExecQuery("select PE_PRECIO2,PE_TIPO,PE_DESC,PE_COSTO_SIN,PE_RUTA,PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE, PE_FECHA,PE_USUARIO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") - If c.RowCount>0 Then - For i=0 To c.RowCount -1 - c.Position=i - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO3 SET PE_FECHA= ? WHERE PE_CLIENTE = ? AND PE_PRONOMBRE = ? AND PE_PROID = ? AND PE_CEDIS = ? ", Array As Object(c.GetString("PE_FECHA"), c.GetString("PE_CLIENTE"),c.GetString("PE_PRONOMBRE"),c.GetString("PE_PROID"),c.GetString("PE_CEDIS"))) - Next - End If - c.Close - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO3 SET PE_FOLIO = ? WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)", Array As Object(YA_IMPRIMIO)) - Starter.skmt.ExecNonQuery("delete from pedido WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) ") - Starter.skmt.ExecNonQuery("INSERT INTO PEDIDO SELECT * FROM PEDIDO3") - ListView1.Visible = True - Starter.skmt.ExecNonQuery2("UPDATE PEDIDO SET PE_FECHA = ? where PE_CLIENTE IN (Select CUENTA from cuentaa) and PE_FECHA IS NULL", Array As Object(sDate & sTime)) - Terminar.Enabled = True - Subs.iniciaActividad("Cliente") -End Sub - -Sub i_fotol_Click - i_fotol.Visible = False -End Sub - -Sub DESC_PROMO_Click - Starter.skmt.ExecNonQuery("delete from PROIDID") - Starter.skmt.ExecNonQuery2("INSERT INTO PROIDID VALUES (?)", Array As Object(L_PROID.text)) - Subs.iniciaActividad("detalle_promo") -End Sub - -Sub nopromo_Click - If cantidad.Text = "" Then - Panel1.Visible= False - Else - If cantidad.Text * l_precio.Text > t_venta.Text Then - Msgbox("Excede EL MONTO DE LA VENTA", "ADVERTENCIA") 'ignore - Else - Subs.guardaCambiosDeProducto(cantidad.Text, l_desc.text, L_PROID.Text, precio2, query) - cantidad.Text = "" - Panel1.Visible= False - End If - End If -End Sub - -Sub LV_PRECIOS_ItemClick (Position As Int, Value As Object) - c=Starter.skmt.ExecQuery("select PRECIO, NLISTA FROM LISTA_PRECIOS WHERE NLISTA = " & "'" & Value &"' AND CAT_GP_ID =" & "'" &L_PROID.TEXT&"' ORDER BY NLISTA ASC") - c.Position=0 - l_precio.Text = c.GetString("PRECIO") - c.Close -End Sub - -Sub B_MENOS_Click - If cantidad.Text = "" Then - cantidad.Text = "" - Else IF cantidad.Text > 0 Then - cantidad.Text = cantidad.Text -1 - End If -End Sub - -Sub B_MAS_Click - If cantidad.Text = "" Then - cantidad.Text = 1 - Else - cantidad.Text = cantidad.Text + 1 - End If -End Sub - -Sub B_MENOSC_Click - If E_CAMBIO.Text = "" Then - E_CAMBIO.Text = "" - Else IF E_CAMBIO.Text > 0 Then - E_CAMBIO.Text = E_CAMBIO.Text -1 - End If -End Sub - -Sub B_MASC_Click - If E_CAMBIO.Text = "" Then - E_CAMBIO.Text = 1 - Else - E_CAMBIO.Text = E_CAMBIO.Text + 1 - End If -End Sub diff --git a/B4A/C_Promociones.bas b/B4A/C_Promociones.bas new file mode 100644 index 0000000..a2e7966 --- /dev/null +++ b/B4A/C_Promociones.bas @@ -0,0 +1,379 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=12.8 +@EndOfDesignText@ +'Class module: C_Promociones +Sub Class_Globals + Private sql As SQL + ' Referencia a tu clase de Trade Spending (ajusta el tipo si se llama diferente) + Private ts As Object ' Lo dejo como Object para que no te marque error si no has copiado esa clase aun + + ' Variable local para el cliente actual (para no depender de Subs.traeCliente) + Private mClienteActual As String + +End Sub + +' Inicializa la clase. +' db: La conexión SQL (Starter.skmt) +' tradeSpending: La instancia de tu clase de TradeSpending (B4XPages.MainPage.promos.ts) +Public Sub Initialize(db As SQL, tradeSpendingInstance As Object) + sql = db + ts = tradeSpendingInstance +End Sub + +' ============================================================================= +' CONTROLADOR PRINCIPAL: ORQUESTADOR DE VALIDACIONES +' ============================================================================= +Public Sub procesaPromocion(idPromo As String, cliente As String) As Map + Private thisLog As Boolean = True 'Si es verdadero, muestra los logs de este sub. + Private inicioContador As String = DateTime.Now + Private mp As Int = 0 + + If thisLog Then LogColor($"****************************************************************"$, Colors.RGB(142,0,255)) + If thisLog Then LogColor($"********* Iniciamos revision de Promo ${idPromo} *********"$, Colors.RGB(142,0,255)) + If thisLog Then LogColor($"****************************************************************"$, Colors.RGB(142,0,255)) + + Try + Private pm As TPromoLegacy = TraePromo(idPromo, cliente) + If thisLog Then LogColor(pm, Colors.Blue) + + Private maxPromosXprodsFijos As Int = RevisaMaxPromosProdsFijos(pm) + If maxPromosXprodsFijos < 1 Then pm.Resultado = "0" + + If thisLog Then LogColor($"***********************************************************************"$, Colors.Blue) + LogColor($"*** PROMOS DISPONIBLES X PRODS FIJOS (${idPromo}) = ${maxPromosXprodsFijos} ***"$, Colors.Blue) + If thisLog Then LogColor($"***********************************************************************"$, Colors.Blue) + + If pm.Resultado = "ok" Then 'Si encontramos la promoción, entonces ... + mp = TraeMaxPromos(pm) + If mp < 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 + + Private inventarioSinFijos As Map = restaFijosPromo(pm) + If thisLog Then LogColor("inventariosfijos="&inventarioSinFijos, Colors.Magenta) + + If inventarioSinFijos.Get("resultado") = "ok" Then + Private pv As Boolean = alcanzanLosVariablesParaPromo(pm, inventarioSinFijos) + + If thisLog Then LogColor($"****************************************************"$, Colors.Blue) + If thisLog Then LogColor($"***** ¿ALCANZAN LOS VARIABLES? ==> ${IIf(pv, "SI", "NO")} *****"$, Colors.Blue) + If thisLog Then LogColor($"****************************************************"$, Colors.Blue) + + 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 + Else + Return CreateMap("status":"ko", "mp":pm) + End If + + LogColor("TIEMPO DE PROCESO ESTA PROMO: " & ((DateTime.Now-inicioContador)/1000), Colors.Red) + + Catch + Log($"Promo ${idPromo} mal configurada"$) + ToastMessageShow($"Promo ${idPromo} mal configurada"$, True) + Log(LastException) + Return CreateMap("status":"ko", "mp":Null) + End Try +End Sub + +' ============================================================================= +' RUTINA PRINCIPAL: ARMA LA ESTRUCTURA (Clon de Subs.traePromo) +' ============================================================================= +Public Sub TraePromo(promo As String, cliente As String) As TPromoLegacy + mClienteActual = cliente ' Guardamos el cliente para uso interno + + Dim t As TPromoLegacy + t.Initialize + + ' Inicialización de Listas y Mapas (CRÍTICO para evitar Nulls) + t.ProdsFijos.Initialize + t.ProdsFijosPiezas.Initialize + t.ProdsFijosPrecios.Initialize + t.ProdsVariables.Initialize + t.ProdsVariablesPrecios.Initialize + t.Productos.Initialize + t.Tipos.Initialize + + t.Id = promo + t.MaxXCliente = 0 + t.MaxRecurrente = 0 + t.MaxPromos = 0 + + ' --- 1. LECTURA GENERAL --- + Dim c As Cursor = sql.ExecQuery("Select * from promos_comp where cat_pa_id = '"& promo&"'") + If c.RowCount > 0 Then + c.Position = 0 + t.MaxXCliente = c.GetString("CAT_PA_MAXPROMCLIE") + t.MaxRecurrente = c.GetString("CAT_PA_MAXPROMREC") + t.MaxPromos = c.GetString("CAT_PA_MAXPROM") + End If + c.Close + + ' --- 2. SEGMENTACIÓN --- + Dim ps As Cursor = sql.ExecQuery($"select * from HIST_CLIENTE_CANT_PROMOS where HCCP_PROMO = '${promo}'"$) + If ps.RowCount > 0 Then + ' Es segmentada -> Bloqueamos por defecto + t.MaxXCliente = "0" + t.MaxRecurrente = "0" + t.MaxPromos = "0" + + Dim ps2 As Cursor = sql.ExecQuery($"Select * from HIST_CLIENTE_CANT_PROMOS where HCCP_PROMO = '${promo}' and HCCP_CLIENTE = '${cliente}' and HCCP_CANT > HCCP_CANT_VENDIDA"$) + If ps2.RowCount > 0 Then + ps2.Position = 0 + t.MaxXCliente = (ps2.GetInt("HCCP_CANT") - ps2.GetInt("HCCP_CANT_VENDIDA")) + t.MaxRecurrente = ps2.GetString("HCCP_CANT") + t.MaxPromos = ps2.GetString("HCCP_CANT") + End If + ps2.Close + End If + ps.Close + + ' --- 3. HISTÓRICO --- + Dim siHistorico As String = "0" + c = sql.ExecQuery("Select count(*) as hist from HIST_PROMOS where HP_CLIENTE = '"& cliente & "' and HP_CODIGO_PROMOCION = '" & promo & "'") + c.Position = 0 + If c.GetInt("hist") > 0 Then siHistorico = "1" + t.Historico = siHistorico + c.Close + + ' --- 4. DETALLES Y PRODUCTOS --- + c = sql.ExecQuery("Select * from CAT_DETALLES_PAQ where CAT_DP_ID = '"& promo & "'") + If c.RowCount > 0 Then + t.Resultado = "ok" + For i = 0 To c.RowCount -1 + c.Position = i + Dim idProd As String = c.GetString("CAT_DP_IDPROD") + + ' Llenamos el mapa de productos (igual que el original para compatibilidad) + t.Productos.Put(idProd, CreateMap("idProducto":idProd, "precioSimptos":c.GetString("CAT_DP_PRECIO_SIMPTOS"), "precio":c.GetString("CAT_DP_PRECIO"), "tipo":c.GetString("CAT_DP_TIPO"), "piezas":c.GetString("CAT_DP_PZAS"), "regalo":c.GetString("CAT_DP_REGALO"), "clasif":c.GetString("CAT_DP_CLASIF"))) + t.Tipos.Put(idProd, c.GetString("CAT_DP_TIPO")) + + If c.GetString("CAT_DP_TIPO") = "0" Then + t.ProdsFijos.Add(idProd) + t.ProdsFijosPrecios.Add(c.GetString("CAT_DP_PRECIO")) + t.ProdsFijosPiezas.Add(c.GetString("CAT_DP_PZAS")) + End If + If c.GetString("CAT_DP_TIPO") = "1" Then + t.ProdsVariables.Add(idProd) + t.ProdsVariablesPrecios.Add(c.GetString("CAT_DP_PRECIO")) + End If + Next + Else + t.Resultado = "No hay datos de la promoción." + t.MensajeError = "Sin detalles" + End If + c.Close + + ' --- 5. VARIABLES REQUERIDAS --- + c = sql.ExecQuery("Select CAT_GP_STS, CAT_GP_NOMBRE from CAT_GUNAPROD2 where CAT_GP_ID = '"& promo & "'") + If c.RowCount > 0 Then + c.Position = 0 + t.ProdsVariablesRequeridos = c.GetInt("CAT_GP_STS") + t.Descripcion = c.GetString("CAT_GP_NOMBRE") + Else + t.ProdsVariablesRequeridos = 0 + End If + c.Close + + Return t +End Sub + +' ============================================================================= +' LÓGICA DE CÁLCULO 1: FIJOS (Clon de Subs.revisaMaxPromosProdsFijosPorInventario) +' ============================================================================= +Public Sub RevisaMaxPromosProdsFijos(pm As TPromoLegacy) As Int + Dim tLista As List + tLista.Initialize + + ' 1. Agregamos el máximo configurado + tLista.Add(TraeMaxPromos(pm)) + + ' 2. Obtenemos inventario real + Dim invDispParaPromo As Map = TraemosInventarioDisponibleParaPromo(pm.Id) + + Dim prodsFijosPiezas As List = pm.ProdsFijosPiezas + Dim idProdsFijos As List = pm.ProdsFijos + Dim idProdsFijosPrecios As List = pm.ProdsFijosPrecios + + ' 3. Iteramos sobre los fijos + For p = 0 To idProdsFijos.Size -1 + Dim thisInvDisp As Int = 0 + If invDispParaPromo.Get(idProdsFijos.Get(p)) <> Null Then + thisInvDisp = invDispParaPromo.Get(idProdsFijos.Get(p)) + End If + + Dim pzasReq As Int = prodsFijosPiezas.Get(p) + + If pzasReq > 0 Then + Dim division As Double = thisInvDisp / pzasReq + Dim x() As String = Regex.Split("\.", $"${division}"$) + tLista.Add(x(0).As(Int)) + + ' --- AQUI ESTA TU CAMBIO (DIRECTO Y SIN DOLOR) --- + ' Nota: Cambié pm.Get("id") por pm.Id porque ahora es un Type + + Dim maxTS As Int = B4XPages.MainPage.promos.ts.traeBonificacionesMaximas("bonificaciones", mClienteActual, idProdsFijos.Get(p), pzasReq, idProdsFijosPrecios.Get(p), pm.Id) + + tLista.Add(maxTS) + ' ------------------------------------------------- + + Else + Log($"Promo ${pm.Id} mal configurada (0 piezas requeridas en producto fijo)"$) + ToastMessageShow($"Promo ${pm.Id} mal configurada"$, True) + tLista.Add(0) + End If + Next + + tLista.Sort(True) + Return tLista.Get(0) +End Sub + +' ============================================================================= +' LÓGICA DE CÁLCULO 2: MÁXIMOS (Clon de Subs.traeMaxPromos) +' ============================================================================= +Public Sub TraeMaxPromos(pm As TPromoLegacy) As Int + Dim maxPromos As List + maxPromos.Initialize + + ' A. Histórico del Cliente (HCCP) + Dim hccp As Cursor = sql.ExecQuery($"select HCCP_CANT from HIST_CLIENTE_CANT_PROMOS where HCCP_CLIENTE = '${mClienteActual}' and HCCP_PROMO = '${pm.Id}'"$) + If hccp.RowCount > 0 Then + hccp.Position = 0 + maxPromos.Add(hccp.GetInt("HCCP_CANT")) + End If + hccp.Close + + ' B. Trade Spending Variables + If ts <> Null Then + Dim maxPromosXDescPV As String = B4XPages.MainPage.promos.ts.maxPromosPorProdsVariables(pm.ProdsVariables, pm.Id) + maxPromos.Add(maxPromosXDescPV.As(Int)) + End If + + ' C. Límites Generales + If pm.Historico = "1" And pm.MaxRecurrente <> "null" Then maxPromos.Add(pm.MaxRecurrente.As(Int)) + If pm.MaxPromos <> "null" Then maxPromos.Add(pm.MaxPromos.As(Int)) + If pm.MaxXCliente <> "null" Then maxPromos.Add(pm.MaxXCliente.As(Int)) + + maxPromos.Sort(True) + + Dim mp As Int = 0 + If maxPromos.Size > 0 Then + Dim mp0 As Int = maxPromos.Get(0) + ' Restamos lo ya vendido + mp = mp0 - TraePromosVendidas(pm.Id, mClienteActual) + End If + + Return mp +End Sub + +' ============================================================================= +' LÓGICA DE CÁLCULO 3: RESTA INVENTARIO FIJO (Clon de Subs.restaFijosPromo) +' ============================================================================= +Public Sub restaFijosPromo(pm As TPromoLegacy) As Map + Private thisLog As Boolean = False 'Si es verdadero, muestra los logs de este sub. + Private inventariosDisponiblesParaEstaPromo As Map = TraemosInventarioDisponibleParaPromo(pm.Id) '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 i As Int + Private prodsmap As Map = pm.productos 'Obtenemos un mapa con todos los productos de la promoción. + Private prodsFijos As List = pm.ProdsFijos 'Obtenemos una 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 + + If thisLog Then 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. + + For p = 0 To prodsFijos.Size - 1 + 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 - pm.ProdsFijosPiezas.Get(p)), 1, 0,0,False) + If thisLog Then Log($"Nuevo inventario de ${t}: ${i}-${pm.ProdsFijosPiezas.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") + 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.") + If thisLog Then LogColor("Sin suficiente inventario fijo: " & t, Colors.Blue) + Exit + End If + + 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. + Exit + End If + Next + + If thisLog Then LogColor("Inventario final despues de FIJOS: "&inventariosDisponiblesParaEstaPromo, Colors.blue) 'Inventario final. + Return inventariosDisponiblesParaEstaPromo +End Sub + +' ============================================================================= +' LÓGICA DE CÁLCULO 4: VARIABLES (Clon de Subs.alcanzanLosVariablesParaPromo) +' ============================================================================= +Public Sub alcanzanLosVariablesParaPromo(pm As TPromoLegacy, inventarioSinFijos As Map) As Boolean + 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 prodsVariables As List = pm.ProdsVariables 'Obtenemos la 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 ... + Private p2 As Int = inventarioSinFijos.Get(t) 'Obtenemos el inventario disponible este producto. + If thisLog Then Log($"prod ${t}, hay: ${p2}"$) 'Producto y piezas requeridas + totalProdsVariables = totalProdsVariables + p2 + End If + Next + + If thisLog Then Log("Total prods variables=" & totalProdsVariables & ", requeridos=" & pm.ProdsVariablesRequeridos) + + Private res As Boolean = False + If totalProdsVariables >= pm.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 + +' ============================================================================= +' HELPERS PRIVADOS (Para hacer la clase portable sin depender de Subs.bas) +' ============================================================================= + +Private Sub TraePromosVendidas(promo As String, cliente As String) As Int + Dim c As Cursor + Dim pv As Int = 0 + c = sql.ExecQuery($"select sum(PE_CANT) as cuantas from PEDIDO where PE_PROID = '${promo}' and PE_CLIENTE = '${cliente}'"$) + If c.RowCount > 0 Then + c.Position = 0 + If c.GetString("cuantas") <> Null Then pv = c.GetInt("cuantas") + End If + c.Close + Return pv +End Sub + +Private Sub TraemosInventarioDisponibleParaPromo(promo As String) As Map + Dim c As Cursor + c = sql.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)) + Dim prods As Map + prods.Initialize + If c.RowCount > 0 Then + For i=0 To c.RowCount -1 + c.Position=i + prods.Put(c.GetString("CAT_GP_ID"), c.GetString("CAT_GP_ALMACEN")) + Next + End If + c.Close + Return prods +End Sub \ No newline at end of file diff --git a/B4A/C_Promos.bas b/B4A/C_Promos.bas index 598fe56..280c85f 100644 --- a/B4A/C_Promos.bas +++ b/B4A/C_Promos.bas @@ -157,8 +157,8 @@ Sub B4XPage_Appear Log($"laPromo=${laPromo}, el cliente=${elCliente}"$) If laPromo <> "" Then muestraPromo(laPromo, elCliente) End Sub -'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. Sub muestraPromo(promo As String, cliente As String) LogColor($"****************************************************************"$, Colors.red) LogColor($"************ muestraPromo: ${promo} *************"$, Colors.red) @@ -168,6 +168,7 @@ Sub muestraPromo(promo As String, cliente As String) estaPromo = promo esteCliente = cliente Private mp As Map = Subs.traePromo(promo, cliente) + If thisLog Then LogColor(mp, Colors.blue) Private prodsPromo As Map = mp.Get("productos") 'Los productos de la promoción. ' Private invDispPromo As Map = Subs.traemosInventarioDisponibleParaPromo(promo) diff --git a/B4A/C_Promos2.bas b/B4A/C_Promos2.bas deleted file mode 100644 index 36fa8d1..0000000 --- a/B4A/C_Promos2.bas +++ /dev/null @@ -1,24 +0,0 @@ -B4A=true -Group=Default Group -ModulesStructureVersion=1 -Type=Class -Version=11.5 -@EndOfDesignText@ -Sub Class_Globals - Private Root As B4XView 'ignore - Private xui As XUI 'ignore -End Sub - -'You can add more parameters here. -Public Sub Initialize As Object - Return Me -End Sub - -'This event will be called once, before the page becomes visible. -Private Sub B4XPage_Created (Root1 As B4XView) - Root = Root1 - 'load the layout to Root - -End Sub - -'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. \ No newline at end of file diff --git a/B4A/C_TrendSpending.bas b/B4A/C_TrendSpending.bas index 1d78e71..6ecbdae 100644 --- a/B4A/C_TrendSpending.bas +++ b/B4A/C_TrendSpending.bas @@ -16,8 +16,6 @@ Version=12.8 ' Descuento es TODO lo que tenga un precio diferente al precio de lista y NO esta en promo. ' Bonificacion es lo que tiene precio diferente al orginal y esta en promo y NO es regalo o exhibidor. - - Sub Class_Globals Private EventName As String 'ignore Private CallBack As Object 'ignore diff --git a/B4A/DBRequestManager1.bas b/B4A/DBRequestManager1.bas deleted file mode 100644 index 3d2d3ad..0000000 --- a/B4A/DBRequestManager1.bas +++ /dev/null @@ -1,360 +0,0 @@ -B4A=true -Group=Default Group -ModulesStructureVersion=1 -Type=Class -Version=6.8 -@EndOfDesignText@ -''Class module -Sub Class_Globals - Private mTarget As Object - Type DBResult (Tag As Object, Columns As Map, Rows As List) - Type DBCommand (Name As String, Parameters() As Object) - Private link As String - Private bc As ByteConverter - Private T_NULL = 0, T_STRING = 1, T_SHORT = 2, T_INT = 3, T_LONG = 4, T_FLOAT = 5 _ - ,T_DOUBLE = 6, T_BOOLEAN = 7, T_BLOB = 8 As Byte - Private VERSION As Float = 0.9 - Private tempArray(1) As Object - Dim jobTagAnterior As String = "" 'Mod por CHV - 211109 - Dim reqsList, timesList As List - Dim inicioRequest As Long 'ignore - Dim inicioJobDone As Long 'ignore - Dim inicioRequestMap, inicioJobDoneMap As Map -End Sub - -'Target - The module that handles JobDone (usually Me). -'ConnectorLink - URL of the Java server. -Public Sub Initialize (Target As Object, ConnectorLink As String) - mTarget = Target - link = ConnectorLink -End Sub - -'Sends a query request. -'Command - Query name and parameters. -'Limit - Maximum rows to return or 0 for no limit. -'Tag - An object that will be returned in the result. -Public Sub ExecuteQuery(Command As DBCommand, Limit As Int, Tag As Object) - Dim j As HttpJob - Dim ms As OutputStream - Dim out2 As OutputStream = StartJob(j, ms, Tag) -' If reqsList.IsInitialized Then reqsList.Add(Tag) -' If timesList.IsInitialized Then timesList.Add(DateTime.now) - - WriteObject(Command.Name, out2) - WriteInt(Limit, out2) - WriteList(Command.Parameters, out2) - out2.Close - j.PostBytes(link & "?method=query", ms.ToBytesArray) -End Sub - -'Sends a query request. -'Command - Query name and parameters. -'Limit - Maximum rows to return or 0 for no limit. -'Tag - An object that will be returned in the result. -'Timeout - The http request timeout in ms, or 0 if default (30 secs) -Public Sub ExecuteQuery3(Command As DBCommand, Limit As Int, Tag As Object, Timeout As Int) 'Mod por CHV, agregué el parametro Timeout - 211229 - Dim j As HttpJob - Dim ms As OutputStream - Dim out2 As OutputStream = StartJob(j,ms, Tag) - WriteObject(Command.Name, out2) - WriteInt(Limit, out2) - WriteList(Command.Parameters, out2) - out2.Close - j.PostBytes(link & "?method=query", ms.ToBytesArray) - If Timeout <> 0 Then j.GetRequest.Timeout = Timeout -End Sub - -'Executes a batch of (non-select) commands. -'ListOfCommands - List of the commands that will be executes. -'Tag - An object that will be returned in the result. -Public Sub ExecuteBatch(ListOfCommands As List, Tag As Object) - Dim j As HttpJob - Dim ms As OutputStream - Dim out2 As OutputStream = StartJob(j, ms, Tag) - WriteInt(ListOfCommands.Size, out2) - For Each Command As DBCommand In ListOfCommands - WriteObject(Command.Name, out2) - WriteList(Command.Parameters, out2) - Next - out2.Close - j.PostBytes(link & "?method=batch", ms.ToBytesArray) -End Sub - -'Similar to ExecuteBatch. Sends a single command. -Public Sub ExecuteCommand(Command As DBCommand, Tag As Object) -' If reqsList.IsInitialized Then reqsList.Add(Tag) -' If timesList.IsInitialized Then timesList.Add(DateTime.now) - ExecuteBatch(Array As DBCommand(Command), Tag) -End Sub - -Private Sub StartJob(j As HttpJob, MemoryStream As OutputStream, Tag As Object) As OutputStream -' inicioRequest = DateTime.now - If reqsList.IsInitialized Then reqsList.Add(Tag) - If timesList.IsInitialized Then timesList.Add(DateTime.now) - j.Initialize("DBRequest", mTarget) - j.Tag = Tag - MemoryStream.InitializeToBytesArray(0) - Dim compress As CompressedStreams - Dim out As OutputStream = compress.WrapOutputStream(MemoryStream, "gzip") - WriteObject(VERSION, out) - Return out -End Sub - -Private Sub WriteList(Parameters As List, out As OutputStream) - Dim data() As Byte - If Parameters = Null Or Parameters.IsInitialized = False Then - Dim Parameters As List - Parameters.Initialize - End If - data = bc.IntsToBytes(Array As Int(Parameters.Size)) - out.WriteBytes(data, 0, data.Length) - For Each o As Object In Parameters - WriteObject(o, out) - Next -End Sub - -Private Sub WriteObject(o As Object, out As OutputStream) - Dim data() As Byte - tempArray(0) = o - If tempArray(0) = Null Then - out.WriteBytes(Array As Byte(T_NULL), 0, 1) - Else If tempArray(0) Is Short Then - out.WriteBytes(Array As Byte(T_SHORT), 0, 1) - data = bc.ShortsToBytes(Array As Short(o)) - Else If tempArray(0) Is Int Then - out.WriteBytes(Array As Byte(T_INT), 0, 1) - data = bc.IntsToBytes(Array As Int(o)) - Else If tempArray(0) Is Float Then - out.WriteBytes(Array As Byte(T_FLOAT), 0, 1) - data = bc.FloatsToBytes(Array As Float(o)) - Else If tempArray(0) Is Double Then - out.WriteBytes(Array As Byte(T_DOUBLE), 0, 1) - data = bc.DoublesToBytes(Array As Double(o)) - Else If tempArray(0) Is Long Then - out.WriteBytes(Array As Byte(T_LONG), 0, 1) - data = bc.LongsToBytes(Array As Long(o)) - Else If tempArray(0) Is Boolean Then - out.WriteBytes(Array As Byte(T_BOOLEAN), 0, 1) - Dim b As Boolean = 0 - Dim data(1) As Byte - If b Then data(0) = 1 Else data(0) = 0 - Else If GetType(tempArray(0)) = "[B" Then - data = o - out.WriteBytes(Array As Byte(T_BLOB), 0, 1) - WriteInt(data.Length, out) - Else 'If o Is String Then (treat all other values as string) - out.WriteBytes(Array As Byte(T_STRING), 0, 1) - data = bc.StringToBytes(o, "UTF8") - WriteInt(data.Length, out) - End If - If data.Length > 0 Then out.WriteBytes(data, 0, data.Length) -End Sub - -Private Sub ReadObject(In As InputStream) As Object - Dim data(1) As Byte - In.ReadBytes(data, 0, 1) - Select data(0) - Case T_NULL - Return Null - Case T_SHORT - Dim data(2) As Byte - Return bc.ShortsFromBytes(ReadBytesFully(In, data, data.Length))(0) - Case T_INT - Dim data(4) As Byte - Return bc.IntsFromBytes(ReadBytesFully(In, data, data.Length))(0) - Case T_LONG - Dim data(8) As Byte - Return bc.LongsFromBytes(ReadBytesFully(In, data, data.Length))(0) - Case T_FLOAT - Dim data(4) As Byte - Return bc.FloatsFromBytes(ReadBytesFully(In, data, data.Length))(0) - Case T_DOUBLE - Dim data(8) As Byte - Return bc.DoublesFromBytes(ReadBytesFully(In, data, data.Length))(0) - Case T_BOOLEAN - Dim b As Byte = ReadByte(In) - Return b = 1 - Case T_BLOB - Dim len As Int = ReadInt(In) - Dim data(len) As Byte - Return ReadBytesFully(In, data, data.Length) - Case Else - Dim len As Int = ReadInt(In) - Dim data(len) As Byte - ReadBytesFully(In, data, data.Length) - Return BytesToString(data, 0, data.Length, "UTF8") - End Select -End Sub - -Private Sub ReadBytesFully(In As InputStream, Data() As Byte, Len As Int) As Byte() - Dim count = 0, read As Int - Do While count < Len And read > -1 - read = In.ReadBytes(Data, count, Len - count) - count = count + read - Loop - Return Data -End Sub - -Private Sub WriteInt(i As Int, out As OutputStream) - Dim data() As Byte - data = bc.IntsToBytes(Array As Int(i)) - out.WriteBytes(data, 0, data.Length) -End Sub - -Private Sub ReadInt(In As InputStream) As Int - Dim data(4) As Byte - Return bc.IntsFromBytes(ReadBytesFully(In, data, data.Length))(0) -End Sub - -Private Sub ReadByte(In As InputStream) As Byte - Dim data(1) As Byte - In.ReadBytes(data, 0, 1) - Return data(0) -End Sub - -'Handles the Job result and returns a DBResult. -Public Sub HandleJob(Job As HttpJob) As DBResult - If jobTagAnterior <> Job.Tag Then -' inicioJobDone = DateTime.Now 'ignore - If inicioJobDoneMap.IsInitialized Then inicioJobDoneMap.Put(Job.Tag, DateTime.Now) -' tiempos.Put(Job.taskId, CreateMap("inicioJobDone":inicioJobDone)) -' Log(tiempos) -' Log("############# " & Job.taskId) - End If - Dim In As InputStream = Job.GetInputStream - Dim cs As CompressedStreams - In = cs.WrapInputStream(In, "gzip") - Dim serverVersion As Float = ReadObject(In) 'ignore - Dim method As String = ReadObject(In) - Dim table As DBResult - table.Initialize - table.Columns.Initialize - table.rows.Initialize - table.Tag = Job.Tag - If method = "query" Then - Dim numberOfColumns As Int = ReadInt(In) - For i = 0 To numberOfColumns - 1 - table.Columns.Put(ReadObject(In), i) - Next - Do While ReadByte(In) = 1 - Dim rowObjects(numberOfColumns) As Object - table.rows.Add(rowObjects) - For col = 0 To numberOfColumns - 1 - Dim o As Object = ReadObject(In) - rowObjects(col) = o - Next - Loop - Else If method = "batch" Then - table.Columns.Put("AffectedRows", 0) - Dim rows As Int = ReadInt(In) - For i = 0 To rows - 1 - table.rows.Add(Array As Object(ReadInt(In))) - Next - End If - In.Close -' Log("HandleJob: " & (DateTime.Now - start))'Comentado por CHV - 211112 - If jobTagAnterior <> table.Tag Then - LogColor("HandleJob: '"&table.Tag&"'" & " - Registros: " & table.Rows.Size, Colors.RGB(115, 0, 140)) 'Mod por CHV - 211109 - End If - jobTagAnterior = table.Tag 'Mod por CHV - 211109 - Return table -End Sub - -'Reads a file and returns the file as a bytes array. -Public Sub FileToBytes(Dir As String, FileName As String) As Byte() - Dim out As OutputStream - out.InitializeToBytesArray(0) - Dim In As InputStream = File.OpenInput(Dir, FileName) - File.Copy2(In, out) - out.Close - Return out.ToBytesArray -End Sub - -'Converts an image to a bytes array (for BLOB fields). -Public Sub ImageToBytes(Image As Bitmap) As Byte() - Dim out As OutputStream - out.InitializeToBytesArray(0) - Image.WriteToStream(out, 100, "JPEG") - out.Close - Return out.ToBytesArray -End Sub - -'Converts a bytes array to an image (for BLOB fields). -Public Sub BytesToImage(bytes() As Byte) As Bitmap - Dim In As InputStream - In.InitializeFromBytesArray(bytes, 0, bytes.Length) - Dim bmp As Bitmap - bmp.Initialize2(In) - Return bmp -End Sub - -'Prints the table to the logs. -Public Sub PrintTable(Table As DBResult) - Log("Tag: " & Table.Tag & ", Columns: " & Table.Columns.Size & ", Rows: " & Table.Rows.Size) - Dim sb As StringBuilder - sb.Initialize - For Each col In Table.Columns.Keys - sb.Append(col).Append(TAB) - Next - Log(sb.ToString) - For Each row() As Object In Table.Rows - Dim sb As StringBuilder - sb.Initialize - For Each record As Object In row - sb.Append(record).Append(TAB) - Next - Log(sb.ToString) - Next -End Sub - -Sub requestTimes(tag As String) As Map 'ignore - Private times As Map - times.Initialize -' Log("###### " & tag) -' Log(reqsList.IsInitialized) - If reqsList.IsInitialized Then -' Log(reqsList) -' Private pos As Int = reqsList.IndexOf(tag) - If inicioRequestMap.ContainsKey(tag) Then - inicioRequest = inicioRequestMap.Get(tag) -' Log(">>>>>>> From inicioRequestMap") - End If - If inicioJobDoneMap.ContainsKey(tag) Then - inicioJobDone = inicioJobDoneMap.Get(tag) -' Log(">>>>>>> From inicioJobDoneMap") - End If - End If -' Log($"${inicioJobDone} - ${inicioRequest}"$) - Private requestTime As String = NumberFormat2(((inicioJobDone - inicioRequest) / 1000),1,5,0,False) - Private JobDoneTime As String = NumberFormat2(((DateTime.Now - inicioJobDone) / 1000),1,5,0,False) - times.Put("requestTime", requestTime) - times.Put("jobDoneTime", JobDoneTime) - times.Put("totalTime", NumberFormat2((JobDoneTime + requestTime),1,5,0,False)) - Return times -End Sub - -'Initializes request tracking -Sub trackInit 'ignore - Log(">>>>>>>>> TRACKINIT ") - reqsList.Initialize - timesList.Initialize - inicioRequestMap.Initialize - inicioJobDoneMap.Initialize -End Sub - -Sub trackNext(job As HttpJob) - If reqsList.IsInitialized Then 'Si tenemos lista de requests, la procesamos. - Private quitamos As String = "" - If reqsList.IndexOf(job.tag) <> -1 Then - Private pos As Int = reqsList.IndexOf(job.tag) - If pos <> -1 Then - inicioRequestMap.Put(job.Tag, timesList.Get(pos)) - reqsList.RemoveAt(pos) - timesList.RemoveAt(pos) - End If - quitamos = $"Quitamos ${job.tag} - "$ - End If - LogColor(">>>>>> Requests: " & reqsList.Size & " - " & quitamos & reqsList, Colors.Blue) - LogColor(">>>>>> inicioRequestMap:" & inicioRequestMap.Size & " - " & inicioRequestMap, Colors.Magenta) - End If -End Sub \ No newline at end of file diff --git a/B4A/DBRequestManager2.bas b/B4A/DBRequestManager2.bas deleted file mode 100644 index 3dbcf14..0000000 --- a/B4A/DBRequestManager2.bas +++ /dev/null @@ -1,201 +0,0 @@ -B4A=true -Group=Default Group -ModulesStructureVersion=1 -Type=Class -Version=6.8 -@EndOfDesignText@ -'Requires support for resumable subs -'Class module - -Sub Class_Globals - Private mTarget As Object - Private link As String - Private VERSION As Float = 2 - Dim reqsList, timesList As List - Dim inicioRequest As Long 'ignore - Dim inicioJobDone As Long 'ignore - Dim inicioRequestMap, inicioJobDoneMap As Map -End Sub - -'Target - The module that handles JobDone (usually Me). -'ConnectorLink - URL of the Java server. -Public Sub Initialize (Target As Object, ConnectorLink As String) - mTarget = Target - link = ConnectorLink -End Sub - -'Sends a query request. -'Command - Query name and parameters. -'Limit - Maximum rows to return or 0 for no limit. -'Tag - An object that will be returned in the result. -Public Sub ExecuteQuery(Command As DBCommand, Limit As Int, Tag As Object) As HttpJob - Dim ser As B4XSerializator - Dim data() As Byte = ser.ConvertObjectToBytes(CreateMap("command": Command, "limit": Limit, "version": VERSION)) - Return SendJob(CreateJob, data, Tag, "query2") -End Sub - -Private Sub SendJob(j As HttpJob, Data() As Byte, Tag As Object, Method As String) As HttpJob - j.Tag = Tag - j.PostBytes(link & "?method=" & Method , Data) - Return j -End Sub - -Private Sub CreateJob As HttpJob - Dim j As HttpJob - j.Initialize("DBRequest", mTarget) - Return j -End Sub - -'Executes a batch of (non-select) commands. -'ListOfCommands - List of the commands that will be executes. -'Tag - An object that will be returned in the result. -Public Sub ExecuteBatch(ListOfCommands As List, Tag As Object) As HttpJob - Dim j As HttpJob = CreateJob - ExecuteBatchImpl(j, ListOfCommands, Tag) - Return j -End Sub - -Private Sub ExecuteBatchImpl(Job As HttpJob, ListOfCommands As List, Tag As Object) - Dim ser As B4XSerializator - ser.ConvertObjectToBytesAsync(CreateMap("commands": ListOfCommands, "version": VERSION), "ser") - Wait For (ser) ser_ObjectToBytes (Success As Boolean, Bytes() As Byte) - If Success = False Then - Log("Error building command: " & LastException) - Return - End If - Dim ser As B4XSerializator = Sender - SendJob(Job, Bytes, Tag, "batch2") -End Sub - - -'Similar to ExecuteBatch. Sends a single command. -Public Sub ExecuteCommand(Command As DBCommand, Tag As Object) As HttpJob - Return ExecuteBatch(Array As DBCommand(Command), Tag) -End Sub - -'Handles the Job result and returns a DBResult. -'It is recommended to use HandleJobAsync instead. -Public Sub HandleJob(Job As HttpJob) As DBResult - Dim ser As B4XSerializator - Dim data() As Byte = Bit.InputStreamToBytes(Job.GetInputStream) - Dim res As DBResult = ser.ConvertBytesToObject(data) - res.Tag = Job.Tag - Return res -End Sub -'Handles the Job result and raises the Result event when the data is ready. - -Public Sub HandleJobAsync(Job As HttpJob, EventName As String) - Dim ser As B4XSerializator - Dim data() As Byte = Bit.InputStreamToBytes(Job.GetInputStream) - ser.ConvertBytesToObjectAsync(data, "ser") - Wait For (ser) ser_BytesToObject (Success As Boolean, NewObject As Object) - If Success = False Then - Log("Error reading response: " & LastException) - Return - End If - Dim res As DBResult = NewObject - res.Tag = Job.Tag - CallSubDelayed2(mTarget, EventName & "_result", res) -End Sub - - - - -'Reads a file and returns the file as a bytes array. -Public Sub FileToBytes(Dir As String, FileName As String) As Byte() - Dim out As OutputStream - out.InitializeToBytesArray(0) - Dim In As InputStream = File.OpenInput(Dir, FileName) - File.Copy2(In, out) - out.Close - Return out.ToBytesArray -End Sub -#if Not(B4J) -'Converts an image to a bytes array (for BLOB fields). -Public Sub ImageToBytes(Image As Bitmap) As Byte() - Dim out As OutputStream - out.InitializeToBytesArray(0) - Image.WriteToStream(out, 100, "JPEG") - out.Close - Return out.ToBytesArray -End Sub -'Converts a bytes array to an image (for BLOB fields). -Public Sub BytesToImage(bytes() As Byte) As Bitmap - Dim In As InputStream - In.InitializeFromBytesArray(bytes, 0, bytes.Length) - Dim bmp As Bitmap - bmp.Initialize2(In) - Return bmp -End Sub -#End If - -'Prints the table to the logs. -Public Sub PrintTable(Table As DBResult) - Log("Tag: " & Table.Tag & ", Columns: " & Table.Columns.Size & ", Rows: " & Table.Rows.Size) - Dim sb As StringBuilder - sb.Initialize - For Each col In Table.Columns.Keys - sb.Append(col).Append(TAB) - Next - Log(sb.ToString) - For Each row() As Object In Table.Rows - Dim sb As StringBuilder - sb.Initialize - For Each record As Object In row - sb.Append(record).Append(TAB) - Next - Log(sb.ToString) - Next -End Sub - -Sub requestTimes(tag As String) As Map 'ignore - Private times As Map - times.Initialize -' Log("###### " & tag) -' Log(reqsList.IsInitialized) - If reqsList.IsInitialized Then -' Log(reqsList) -' Private pos As Int = reqsList.IndexOf(tag) - If inicioRequestMap.ContainsKey(tag) Then - inicioRequest = inicioRequestMap.Get(tag) -' Log(">>>>>>> From inicioRequestMap") - End If - If inicioJobDoneMap.ContainsKey(tag) Then - inicioJobDone = inicioJobDoneMap.Get(tag) -' Log(">>>>>>> From inicioJobDoneMap") - End If - End If -' Log($"${inicioJobDone} - ${inicioRequest}"$) - Private requestTime As String = NumberFormat2(((inicioJobDone - inicioRequest) / 1000),1,5,0,False) - Private JobDoneTime As String = NumberFormat2(((DateTime.Now - inicioJobDone) / 1000),1,5,0,False) - times.Put("requestTime", requestTime) - times.Put("jobDoneTime", JobDoneTime) - times.Put("totalTime", NumberFormat2((JobDoneTime + requestTime),1,5,0,False)) - Return times -End Sub - -'Initializes request tracking -Sub trackInit 'ignore - Log(">>>>>>>>> TRACKINIT ") - reqsList.Initialize - timesList.Initialize - inicioRequestMap.Initialize - inicioJobDoneMap.Initialize -End Sub - -Sub trackNext(job As HttpJob) - If reqsList.IsInitialized Then 'Si tenemos lista de requests, la procesamos. - Private quitamos As String = "" - If reqsList.IndexOf(job.tag) <> -1 Then - Private pos As Int = reqsList.IndexOf(job.tag) - If pos <> -1 Then - inicioRequestMap.Put(job.Tag, timesList.Get(pos)) - reqsList.RemoveAt(pos) - timesList.RemoveAt(pos) - End If - quitamos = $"Quitamos ${job.tag} - "$ - End If - LogColor(">>>>>> Requests: " & reqsList.Size & " - " & quitamos & reqsList, Colors.Blue) - LogColor(">>>>>> inicioRequestMap:" & inicioRequestMap.Size & " - " & inicioRequestMap, Colors.Magenta) - End If -End Sub \ No newline at end of file diff --git a/B4A/Files/detalle_promo.bal b/B4A/Files/detalle_promo.bal index c696d912a620523d7373e5fcdd04c1fa1de63596..349d9c65c3b06fc7290c6e2f63d8f6a16b199f5a 100644 GIT binary patch literal 3393 zcmb7G&65*V5TCf4mB=D~fZ``vMOa{o?4qdn0omOE3n4%@1yvrvNAflqnareSX0t+h zK)onx6;)JOmM5+9=n)Sd^x{QUZg}#fe}Q`Q7Jt86t5sKKOp*+F#a(-~RGres%NJ_0{Y9ZqHo* z>ep{Jee&t}uJY7)c(r)Bz2Q4+%jchMKL@`x5M!$cwM!lSB&7KZDzNK?c^%kISNnw% zI#lLWm`w<~w5Q_ZDA#VQ(DvN4SPADo#)%y4J9n1UoIW4ov$t&Ia=epXqO>2 z_%yl;vx;hK25&OwiKS)7S*-h7yL4~6b!WMuYj)^}<=d*Oh#@g@ahj-hln-AJq!vQe zWPl-0(4PpB1|#U&fsGJ&X;=BSa>KoJ<>;l5g%o-n9$sOZbluW+vla4SOS$!y=ZlX> zq~U>!b|YX_?R^X^?NO!P*Hr#=inV!{=qb+HVQWsX4a|nX=IE|~%jlxEVn`j;XxMJ^ zsT8-Ythk#~dwWO9DRXCG)(+dMW0qTBn$*nj9&uc<9ernmF}|j+IDGgXaV*mkxUYji zHwfYM-TJ~zlC()PG>Vwrk_tkUkLNh0sMzRw=5esJ*NMi;+L5y}#ol00SVVbi2lI~_ z6w?zhPC$`ehHUH^cEb*&@{NwQqnu7lZG_P83bRL5CxXSOqL+8Opfow3d&|468ix^bDzXA50X$MxSy~R1bC%n!XN|+8nZ#h1rGuf;~|;SFit1JLlURU z1Q;wLU?|A`ySQEMo`EJ0l4xR2P^>!~z+gSul7Lf<(Z`^B{?7!U*`v zpPfOr54xyKUVtQMya*vd<3F`Xuh)yqOogc#o6KnJ!Sc;>&oVNzym-C0x&;S2G#9I+OHw!i}@8+FWI6Vz0| zPJ+gI7*x^=e0f$y?lf4H!XnrNNWvMYk>O^7LDWoN!%k}CeP|?lW|s$vg9#(xJJ?6@ HGGqM%w#G49 literal 3429 zcmb_e&65*V5T9|A)yN`#fZ``Xaa~}E?4qdn0omQKEQA2r6jXTtAIaNfWHOVQnav92 z0rjG&Ra8-BS)R1Yqenb=(2EyYx#7u^{srpITm1ccGBXJ~Ye|)yJv- zFpQ5(!?+jU`>^i8D%Jz5YXukY2VaPUGoI>nv`4#zwrc9rmR^~9fEKaXH^~i}P$*k| zAm-vQlKR%XFj9?zKdBsT@81ZnAZ*_(8*S0PTAHtx7K>E|T$ou70@vxA(L<=<0sind z`P~INf|bGI9xd<2qCW=7hi$+b!{Y5cNB)AgZMWI<3mvEV7UXRo^921YR#$G`I5lx> zaB z!f_p_C@XwT0K2qQF*(Yy+A6SIXKvY(FN1G*YDJy5^>~W&x&B^Z*0o(Pk{*F&Av!j^ zMJ$!wX(@tt-t`*VlcR}v#%csDn$_u&nATkn52>n#wd~W*^(^fK5+Bo0E*-9&t1iqR zsWCy?VXO`2NOxgYQEkmvL=f=A(z0zY);+Bqy0@IVz1+|>E3n1#ZPir-lVCYGO?W%X zgD)^r6oG0oz!pAd6}TN9Ug0z8x}~jVE8xMF za_TMD6CWW#l&y=)(SD zNFCK^SWffF6t^s~xUEy0{JE4<(Vc}ED`=}uByNRiQarJk$`4RJu5FjXVx#Nn$3W7u6V8{lvu9_DeS|?_ z5#_CI3_@y9Opn7j0Y!Eha%9i28bWExArmT+zPU)~w(^-usdk)bbP&ZxwA!n>KocDPl*m9x+Qa8o*wtyN*vY9|dIV zvgK%2wjW%y<<6NCANdpy;|AN5F^AmMXPU z_1x)FwYD%@EHgodarxjOFu#R@k>i(RJ{Qe-^D0yfj0z*i@|S%U5pOqpRAY^j;ick= z!Ho8<|Ga}$DH^^#$BgrrVLVxrDax^W9u)B*p_{4XZCl82_hB-epKJqR*!8l-0vql9 z`FD@SkTqG#BkV@A0rFJDY>SwD#B3*nWjq}*6f)0%jO-wxn0ppPUONsZ0fCMC-$B^@ z#jO|w95gZ$AcW5t0D*-c$CQU){sbaW@NRh$;}T40ybEhgfFVLLF!E#?#_tM&5d`Qm zK?p*K5EK)JXUTm$P|{j0>a;52@Ktr z$EHLeucu#mJ-*@VX`H;CSnR{f-i85GsTi;>5)2rzK*oFv25*ANW0`!yIv8L_{sZ;N z3lPJ4c@dnTu^&u=#+@}yuh)y~W!aA9N){);0TtT(&{^FX`IA&~ziBJoxP&CP%eOo3U5bJUkW4r5_VOwPkIpx?Wb~Zx1#)y{)1WPjP4!0wFvzytuyk~+o@t(CLVM)Ha4R?`Tz`#B#>#AIrQ1JvT6!%w(Cbx$d_wId}-P`~3c4FsE_4Y!&YPRQJv`5~v&pRJC zR!Mk@FhmIR<;_f7CDvHuxeSAb$Yo0j9Xt_+yK2i6H?;4#7RD&Xm27h(Q`P8byQ2C? z^DbXY#LZ*G8-rNzFileJtP8X=aB2UCDmW#{Vh$1_$tNNTp-hvv#lQEAyI=1l$x^6= zP*t*|3X@JGmZeGT&gZ<~Xd7)Q%Em=xT$2_NRw5YQ!a)WZ(6hwWdXlU{=8_u2p#|5H zD{}`@iC8x_In9vVm63@d9Shlt4H9Fn!Z_7dUav=u}=0n}ap@?$4L%0b;hd+OVvogx}hiSr1RM-e+?+l#K7zIHTPwV3?&p9#< ug3tuP>P-@xUusOO_Pmxf(>i0*=z_6rJM22wRd1Vv&_ue zxK$+(FG$d;phhZ1NPXZT@K&j>JRl@c%LA+bYeCOPI?mDY!+Qn-$?OJ?qMcajzuLahk6)ay5dL$a0^NdDAc>`RZ_td;` z9am2^gTQs#*1`!&Q&l6dlw+zv;hysY4`Z`=Tqf0^*3 z0X3};jRsQ}H<6vLMRcx>rkm0Hm)q#UHkwXEJOucwXoQctBl^ZR`ldGeYi;z+ZS>dM z=vzQXHiOiDg|_=;T1-Fo{q&=2uNfWGn-5iAeJWr0;KNh>f4nmA-cP26Z~EJB)oZuy z-h1NH(r?c8z0kOv`|$M-ethe~$A>RHf8pcFy`K!;UaB9z_@}{4?azB4-&cS1v%0xw;`8yN{?LEl(ht4)i{-n1cICOhzWMsUOS@j%b>;V8+;aKC zyYF0nW8wJ9`Tuev?YFqV=W*hU8m6W8&0k6dLknvspY|EEYs(a*?$|l zPVtj7y5{tbcHoXe5Tbt03hLv6tsgBA-dWc(l_&1BhUaLmfNI-T!?%7U@JyGcb@~uq zAmpBNoglxYd^bd$LoySkdfrCPEdWQt!Kl$@WRwC(_GHafTRz=HE z1i}xNZ3)J7sXUc0O19!Yq*3|sq8u9KAi$(p&j>J|=Zu=7Q7P+%Jd^qOsyNLU$N#V8y)nxd2Ejk8tTIx??0BL^p&cPKLn82)80YQ(^(} zdTe*>Nh}Hc@*>mv9|CpNBJf=(?`Z@mFhvB8gFP963CwIO0u+!g0^h@qFajq)$r(5a zqICxH(ex=0{Oj+O&Er^D2g?GM;vA5yU`9$dp9CS<{0@j@Hd9~{OC2-W?m5j(A)>gD zBqa|cb+>{j4T=RM5vBF9KSLPE>A-h2r%!|G0iq8>%r+3El}SV?Fg2n~s3f9CwumSV z5=1E=9io%i8X`IjYKQOXN1$?@IBe~nrodzzy57@|f<1Xl)G@P_oF;@40SZV)fF+|_ zP8YF$)gmwj<=corKei`N0tKdsz%`IYel&OC+gMiSH_?-U0_ z5=UxG;`l?%tiDq+EP5T@-c?M8Xh!dp`!TaQG+zPd1+@0xKr~A*r5M4KT=Ldp*X?FE zu-+ZhS#b0Y(;B30gef(q#*{y!l9*0lrU#f(Ogc{o`N{v0h^b*AM08@%d zhv^)4bjNfa9KFMIGiRR~dw^*jVtRln#iYZOJGx_Pfn#SerN-2lK8;Puv;PuidVnd# zq{H+X?C6fE4UV0~lp0fGy7oTZe8ultqvE>1=^C}LA*L*Vy~EUnw2f*MHTD40ze7w9 z@|0rIPT$h*EM!%`SxB4F=QkwQZf}vyA literal 8011 zcmchbS!^3c7{}M-Xbs^m_t8L0IZ8v5-au*H*d?LPf$LHzhr97k;)Ttw*XU0<|4>FVd1c=m&?lSWc!4xCiDx~y07BzNALJv_@W2BVSe{UtS|$0Xg&;qV_h@ z+860D=dtPK)90Sk+m)%@Re0^uRQl9s``W)g+xf|}L+dX6`6KoERckly`F7;PLv7EO z&m=#4>(nz>PJX%la$<`eZ`rhAAfM>oypy^NB%nf zYugX&W`27Y9zBUf8bvQZQ&!hPN{{KDS?ozG&z!K8+cTtmJ&aJUgAcuh!j}AW+nhv5 zI(E9^%9qnNTzy&}v($zKjHl8`2U{$`r8 z)VR;c@g3Qj)288Dh5bv1d8p@UFREvj0cZ0Kn4dagOr>2$X1b|ue%%=rNDP4H|p5vw%l zA&e}QHEqRN<#U;IiXk+OJD0QD6&tjVVUf=C4+&6^CGjmgGuFJIxbBVwTlNowI-ZJqB8J1thII z6j*4#0a@FP%vemWLnd=u51~5co5Jd7%BavbAa!!?HzSGdCLnOz-ijo%yA1+NA5Cp! z&F#n{cVz-@*3H$Rdh7laqbOwjg!R8pnSZV(hw= zP1}%dr?3NAH>AdAtv$40VG~O zfDn(@y{L)9+lQKtdQnUD03ps83A*hF&ZQuvE0KXXLi!!eq#Ff^e|+bnwja{c5vI|5 z83^fI93c%hfiMI0IKmxEL`YWzAq_N#a6h`P^v1szW7Yw`w6m558!6P%Ll|^Bzf6B2ti)^53%M5 zvP&p%6nR$I5aI+mVw~W^sOiuiVVZ-Q)U<#p%{0e!3_Th%Eka{unR3Jy zFg*z~EnrGB%`r95qcKwjjn*+;%--jSEnr%LnHDgmndX>|qeo+=6VO;$rW~$_I|93}m z#1=691!h{nlxCV^YNJQMbR8slORa~%*I7_~Q&_zU!fGV>ZDLu!K{~K9f0gRI%ho_y z7J+Wb " & pv, logColor1) - End If -' LogColor("TIEMPO DE PROCESO ESTA PROMO: " & ((DateTime.Now-inicioContador)/1000), Colors.Red) - If pv Then - Return CreateMap("status":"ok", "prodsFijosCant":traeInfoDePromo("P_PRODSFIJOS_CANT", idPromo), "prodsVariablesCant":traeInfoDePromo("P_PRODSVARIABLES_CANT", idPromo)) - Else - If muestraLogs Then LogColor("NO HAY INVENTARIO SUFICIENTE " & idPromo, Colors.red) - Return CreateMap("status":"ko") - End If - Else - If muestraLogs Then LogColor("NO HAY INVENTARIO SUFICIENTE " & idPromo, Colors.red) -' LogColor("TIEMPO DE PROCESO ESTA PROMO: " & ((DateTime.Now-inicioContador)/1000), Colors.Red) - Return CreateMap("status":"ko") - End If - Else - If muestraLogs Then LogColor("NO HAY INVENTARIO SUFICIENTE " & idPromo, Colors.red) -' LogColor("TIEMPO DE PROCESO ESTA PROMO: " & ((DateTime.Now-inicioContador)/1000), Colors.Red) - Return CreateMap("status":"ko") ' , "mp":pm - End If - ' Si tenemos suficiente inventario para los variables mostramos la promocion, si no ... - ' break 'NO HAY INVENTARIO SUFICIENTE PARA LA PROMOCION. -End Sub - -'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 - '###################################################### - 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 prodsFijos, prodsFijosPrecios, prodsFijosReq, prodsVariables, prodsVariablesPrecios As List - promoMap.Initialize - prodsFijos.Initialize - prodsFijosPrecios.Initialize - prodsFijosReq.Initialize - prodsVariables.Initialize - prodsVariablesPrecios.Initialize - c.Position = 0 -' promoMap = CreateMap("id":promo, "maxXcliente":0, "maxRecurrente":0, "maxPromos":0) 'Ponemos el DEFAULT en CERO. - Private yaExistePromo As Cursor = db.ExecQuery($"SELECT P_ID from PROMOCIONES_INFO where P_ID = '${promo}'"$) - If yaExistePromo.RowCount > 0 Then - db.ExecNonQuery($"update PROMOCIONES_INFO set P_MAXXCLIENTE = 0, P_MAXRECURRENTE = 0, P_MAXPROMOS = 0 where P_ID = '${promo}'"$) - Else - db.ExecNonQuery($"insert into PROMOCIONES_INFO (P_ID, P_MAXXCLIENTE, P_MAXRECURRENTE, P_MAXPROMOS) values ('${promo}', 0, 0, 0)"$) - 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_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}' "$) - If muestraLogs 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. - If muestraLogs 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"$) - If muestraLogs 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")}"$) - db.ExecNonQuery($"update PROMOCIONES_INFO set P_MAXXCLIENTE = ${(ps2.getint("HCCP_CANT")-ps2.GetInt("HCCP_CANT_VENDIDA"))}, P_MAXRECURRENTE = ${ps2.GetString("HCCP_CANT")}, P_MAXPROMOS = ${ps2.GetString("HCCP_CANT")} where P_ID = '${promo}'"$) 'Si es segmentada SOLO le aparece a ciertos clientes. -' Log($"update PROMOCIONES_INFO set P_MAXXCLIENTE = ${(ps2.GetString("HCCP_CANT")-ps2.GetString("HCCP_CANT_VENDIDA"))}, P_MAXRECURRENTE = ${ps2.GetString("HCCP_CANT")}, P_MAXPROMOS = ${ps2.GetString("HCCP_CANT")} where P_ID = '${promo}'"$) -' promoMap = CreateMap("id":promo, "maxXcliente":(ps2.GetString("HCCP_CANT")-ps2.GetString("HCCP_CANT_VENDIDA")), "maxRecurrente":ps2.GetString("HCCP_CANT"), "maxPromos":ps2.GetString("HCCP_CANT")) 'Si es segmentada SOLO le aparece a ciertos clientes. - End If - End If -' Log(promoMap) -' Log($"P_MAXXCLIENTE = ${(ps2.GetString("HCCP_CANT")-ps2.GetString("HCCP_CANT_VENDIDA"))}, P_MAXRECURRENTE = ${ps2.GetString("HCCP_CANT")}, P_MAXPROMOS = ${ps2.GetString("HCCP_CANT")}'"$) -' ########## TERMINA PROMOS SEGMENTADAS ########## - c = Starter.skmt.ExecQuery("Select count(*) as hist from HIST_PROMOS where HP_CLIENTE = '"& cliente0 & "' and HP_CODIGO_PROMOCION = '" & promo & "'") 'Revisamos si hay historico de la promoción. - c.Position = 0 - If c.GetString("hist") > 0 Then siHistorico = 1 - db.ExecNonQuery($"update PROMOCIONES_INFO set HISTORICO = ${siHistorico} where P_ID = '${promo}'"$) -' promoMap.Put("historico", siHistorico) - c = Starter.skmt.ExecQuery("Select * from CAT_DETALLES_PAQ where CAT_DP_ID = '"& promo & "'") 'Obtenemos los detalles de la promoción. - c.Position = 0 - If c.RowCount > 0 Then - Private prods, tipos As Map - prods.Initialize - tipos.Initialize - For i = 0 To c.RowCount -1 - c.Position=i - prods.Put(c.GetString("CAT_DP_IDPROD"), CreateMap("idProducto":c.GetString("CAT_DP_IDPROD"), "precioSimptos":c.GetString("CAT_DP_PRECIO_SIMPTOS"), "precio":c.GetString("CAT_DP_PRECIO"), "tipo":c.GetString("CAT_DP_TIPO"), "piezas":c.GetString("CAT_DP_PZAS"), "regalo":c.GetString("CAT_DP_REGALO"), "clasif":c.GetString("CAT_DP_CLASIF"))) - tipos.Put(c.GetString("CAT_DP_IDPROD"), c.GetString("CAT_DP_TIPO")) - If c.GetString("CAT_DP_TIPO") = "0" Then - prodsFijos.Add(c.GetString("CAT_DP_IDPROD")) - prodsFijosPrecios.Add(c.GetString("CAT_DP_PRECIO")) - prodsFijosReq.Add(c.GetString("CAT_DP_PZAS")) - End If - If c.GetString("CAT_DP_TIPO") = "1" Then - prodsVariables.Add(c.GetString("CAT_DP_IDPROD")) - prodsVariablesPrecios.Add(c.GetString("CAT_DP_PRECIO")) - End If -' If muestraLogs Then Log($"id:${c.GetString("CAT_DP_IDPROD")}, tipo:${c.GetString("CAT_DP_TIPO")}"$) - Next - db.ExecNonQuery($"update PROMOCIONES_INFO set P_TIPOS = '${tipos}', P_PRODSFIJOS = '${prodsFijos}', P_PRODSFIJOS_CANT = ${prodsFijos.Size}, P_PRODSFIJOS_PRECIOS = '${prodsFijosPrecios}', P_PRODSFIJOS_PIEZAS = '${prodsFijosReq}', P_PRODSVARIABLES = '${prodsVariables}', P_PRODSVARIABLES_CANT = ${prodsVariables.Size}, P_PRODSVARIABLES_PRECIOS = '${prodsVariablesPrecios}', P_ESTATUS = 'ok' where P_ID = '${promo}'"$) -' promoMap.Put("productos", prods) 'Mapa con los productos de la promocion (id, precio, almacen, tipo, piezas, etc.) -' promoMap.Put("tipos", tipos) 'Mapa con los productos de la promoción y su tipo (fijo o variable). -' promoMap.Put("prodsFijos", prodsFijos) 'Lista de los productos fijos de la promoción. -' promoMap.Put("prodsFijosCant", prodsFijos.Size) -' promoMap.Put("prodsFijosPrecios", prodsFijosPrecios) -' promoMap.Put("prodsFijosReq", prodsFijosReq) -' promoMap.Put("prodsVariables", prodsVariables) 'Lista de los productos variables de la promoción. -' promoMap.Put("prodsVariablesCant", prodsVariables.Size) -' promoMap.Put("prodsVariablesPrecios", prodsVariablesPrecios) -' promoMap.Put("resultado", "ok") - Else -' promoMap.Put("resultado", "No hay datos de la promoción.") - db.ExecNonQuery($"update PROMOCIONES_INFO set P_ESTATUS = 'No hay datos de la promoción.' where P_ID = '${promo}'"$) - End If - c = Starter.skmt.ExecQuery($"Select CAT_GP_STS, CAT_GP_NOMBRE from ${tablaProds} where CAT_GP_ID = '"$& promo & "'") 'Obtenemos las piezas requeridas de productos variables para la promoción. - c.Position = 0 - Private pvr As String = 0 - If c.RowCount > 0 Then - 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")) - 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 -' If muestraLogs Then Log($"Inv variables: ${cuantosVariablesDisponiblesDB(promo)}"$) -' 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 -End Sub - -' Regresa cuantas promos alcanzan con los productos FIJOS que hay en inventario. -Sub revisaMaxPromosProdsFijosPorInventario(idPromo As String) As Int - If muestraLogs Then LogColor("> revisaMaxPromosProdsFijosPorInventario: " & idPromo, Colors.blue) - Private maxPromosPermitidas As List - Private promosDispEsteProd, InvDispEsteProd, pzasReqEsteProd As Int - Private esteColor As Double - Private esteMensaje As String - maxPromosPermitidas.Initialize - maxPromosPermitidas.Add(traeMaxPromos(idPromo)) ' Agregamos a la lista las promos maximas permitidas (por cliente, recurrentes y maxpromos). - ' 👇🏼 Traemos los productos fijos y piezas requeridas de la promoción. 👇🏼 - Private c As ResultSet = db.ExecQuery($"select CAT_DP_IDPROD, sum(CAT_DP_PZAS) as totalPzas from CAT_DETALLES_PAQ where CAT_DP_ID = '${idPromo}' and CAT_DP_TIPO = '0' group by CAT_DP_IDPROD"$) - Do While c.NextRow - InvDispEsteProd = traeInventario(c.GetString("CAT_DP_IDPROD")) - pzasReqEsteProd = c.GetString("totalPzas") - esteColor = Colors.green - esteMensaje = "INVENTARIO OK" - If pzasReqEsteProd > InvDispEsteProd Then - esteColor = Colors.red - esteMensaje = "INVENTARIO INSUFICIENTE" - End If - If muestraLogs Then LogColor($"PROD FIJO=${c.GetString("CAT_DP_IDPROD")}, INV=${InvDispEsteProd}, REQ=${pzasReqEsteProd} --> ${esteMensaje}"$, esteColor) - promosDispEsteProd = (InvDispEsteProd/pzasReqEsteProd).As(Int) 'Agregamos el as(int) para que solo nos regrese la parte entera de la division. - maxPromosPermitidas.Add(promosDispEsteProd) ' Agregamos a la lista las promociones permitidas por inventario de este producto. - Loop - maxPromosPermitidas.Sort(True) ' Ordenamos la lista para que el primer elemento sea el MAS pequeño. - If muestraLogs Then LogColor("Max promos de prodsFijos POR inventario = " & maxPromosPermitidas.Get(0), Colors.Magenta) - Return maxPromosPermitidas.Get(0) 'Regresamos el MENOR numero de promociones permitidas. -End Sub - -'Regresa cuantas promos alcanzan con los productos VARIABLES que hay en inventario. -'La cantidad de promos disponibles se calcula DESPUES de descontar los productos fijos, y si las -'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 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(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}"$) -' invDispParaPromo.Put( idEsteProd, (invEsteProd - (1)) ) - Next - If muestraLogs Then LogColor($"MaxPromos=${maxPromos}, promosXFijos=${maxPromosXFijos}"$, Colors.Blue) - If muestraLogs Then LogColor($"prodsFijos=${idProdsFijos}"$, 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("=====================================================") - For i = 0 To idProdsFijos.Size - 1 -' 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. - Private thisProdVariable As String = idProdsVariables.Get(i) - If invDispParaPromo.ContainsKey(thisProdVariable) Then - totalProdsVariablesDisponibles = totalProdsVariablesDisponibles + invDispParaPromo.Get(thisProdVariable) - End If - Next - 'Revisamos variables. - If muestraLogs Then Log($"Var disponibles - var requeridos : ${totalProdsVariablesDisponibles} - ${prodsVariablesRequeridos*x}"$) - totalProdsVariablesDisponibles = totalProdsVariablesDisponibles - (prodsVariablesRequeridos*x) - If muestraLogs Then Log("prodsVariables disponibles despues de promo = " & totalProdsVariablesDisponibles) - If totalProdsVariablesDisponibles < 0 Then Exit 'Ya no hay inventario disponible. - maxPromosXVariables = x - Next - 'Restamos fijos. -' LogColor("Max promos de prodsVariables POR inventario = " & maxPromosXVariables, Colors.red) - Return maxPromosXVariables -End Sub - -'Regresa un mapa con el inventario disponible por producto para la promoción (desde la base de datos). -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(idPromo)) -' Private prodInv As Map -' prodInv.Initialize - Private prods As Map - prods.Initialize - If c.RowCount > 0 Then - For i = 0 To c.RowCount -1 - c.Position = i - prods.Put(c.GetString("CAT_GP_ID"), c.GetString("CAT_GP_ALMACEN")) -' Log($"prod:${c.GetString("CAT_GP_ID")}, inventario:${c.GetString("CAT_GP_ALMACEN")}"$) - Next -' prodInv.Put("inventarios", prods) - End If - Return prods -End Sub - -'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 restaFijosDePromo(idPromo As String) As Map 'ignore - If muestraLogs Then LogColor("> restaFijosDePromo: " & idPromo, Colors.blue) - Private invDispEstaPromo As Map = traemosInvDispParaPromo(idPromo) 'Obtenemos un mapa con el inventario disponible para cada producto de la promocion desde la base de datos. - If muestraLogs Then LogColor("Inventario inicial antes de FIJOS: "&invDispEstaPromo, Colors.Magenta) 'Inventario inicial. - Private InvDispEsteProd, pzasReqEsteProd As Int - Private esteProd As String - invDispEstaPromo.Put("resultado", "No hay suficiente producto para la promocion.") 'Valor por DEFAULT. - Private nuevoInv As Int - ' 👇🏼 Traemos los productos fijos y piezas requeridas de la promoción. 👇🏼 - Private c As ResultSet = db.ExecQuery($"select CAT_DP_IDPROD, sum(CAT_DP_PZAS) as totalPzas from CAT_DETALLES_PAQ where CAT_DP_ID = '${idPromo}' and CAT_DP_TIPO = '0' group by CAT_DP_IDPROD"$) - Do While c.NextRow - esteProd = c.GetString("CAT_DP_IDPROD") - pzasReqEsteProd = c.GetString("totalPzas") - If muestraLogs Then Log($"esteProd ${esteProd}, piezasReq: ${pzasReqEsteProd}"$) 'Producto y piezas requeridas - If muestraLogs Then Log("invDispEstaPromo="&invDispEstaPromo) - If invDispEstaPromo.ContainsKey(esteProd) Then 'Si el mapa del inventario contiene el id del producto entonces ... - 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.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.") - If muestraLogs Then LogColor("Sin suficiente inventario fijo: " & esteProd, Colors.Blue) - Exit - End If - If nuevoInv < 0 Then - invDispEstaPromo.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 - Loop - If muestraLogs Then LogColor("Inventario final despues de FIJOS: "&invDispEstaPromo, Colors.blue) 'Inventario final. - Return invDispEstaPromo -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(idPromo As String, inventarioSinFijos As Map) As Boolean 'ignore - If muestraLogs Then LogColor("> alcanzanLosVariablesParaPromo: " & idPromo, Colors.blue) - If muestraLogs 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 = traeListaDePromo("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 ... - Private p2 As Int = inventarioSinFijos.Get(t) 'Obtenemos el inventario disponible este producto. - If muestraLogs Then Log($"prod ${t}, hay: ${p2}"$) 'Producto y piezas requeridas - totalProdsVariables = totalProdsVariables + p2 - End If - Next - Private prodsVariablesRequeridos As Int = traeInfoDePromo("P_PRODSVARIABLES_REQUERIDOS", idPromo) - If muestraLogs Then Log("Total prods variables=" & totalProdsVariables & ", requeridos=" & prodsVariablesRequeridos) - Private res As Boolean = False - 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 - -'Regresa el numero máximo de promociones permitidas, tomando en cuenta recurrentes, clientes y maxPromos. -Sub traeMaxPromos(idPromo As String) As Int - If muestraLogs Then LogColor("> traeMaxPromos: " & idPromo, Colors.blue) - Private maxPromos As List - 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 muestraLogs Then LogColor("Historico: "&traeInfoDePromo("HISTORICO", idPromo), Colors.Blue) -' If muestraLogs Then Log(pm) - If traeInfoDePromo("HISTORICO", idPromo) = "1" Then maxPromos.Add(traeInfoDePromo("P_MAXRECURRENTE", idPromo).As(Int)) 'Si hay historico, agregamos maxRecurrente - If traeInfoDePromo("P_MAXPROMOS", idPromo) <> "null" Then maxPromos.Add(traeInfoDePromo("P_MAXPROMOS", idPromo).As(Int)) 'Agregamos maxPromos - If traeInfoDePromo("P_MAXXCLIENTE", idPromo) <> "null" Then maxPromos.Add(traeInfoDePromo("P_MAXXCLIENTE", idPromo).As(Int)) 'Agregamos maxXcliente - If hccp.RowCount > 0 Then 'Agregamos promos HCCP - hccp.Position = 0 - maxPromos.Add(hccp.GetInt("HCCP_CANT")) - End If -' Log($"|${traeInfoDePromo("HISTORICO", idPromo)}|${traeInfoDePromo("P_MAXPROMOS", idPromo)}|${traeInfoDePromo("P_MAXXCLIENTE", idPromo)}|"$) -' Log(maxPromos) - maxPromos.Sort(True) -' If muestraLogs Then Log($"Max promos : ${maxPromos}"$) - mp = 0 - If maxPromos.Size > 0 Then - mp0 = maxPromos.Get(0) -' Log(mp0) - Private promosVendidas As Int = traePromosVendidas(idPromo) - mp = mp0 - promosVendidas - If muestraLogs Then Log($"Max Promos (${mp0}) - Promos Vendidas (${(promosVendidas)}) = Promos Disponibles (${mp})"$) - End If - Return mp 'Regresamos el numero mas pequeño de las opciones. -End Sub - -'Regresa la cantidad de promos que se le han vendido al cliente. -Sub traePromosVendidas(idPromo As String) As Int - If muestraLogs Then LogColor("> traePromosVendidas: " & idPromo, Colors.blue) - Private c As Cursor - Private pv As Int = 0 - c=db.ExecQuery($"select sum(PE_CANT) as cuantas from PEDIDO where PE_PROID = '${idPromo}' and PE_CLIENTE = '${cliente}'"$) - If c.RowCount > 0 Then - c.Position = 0 - If c.GetString("cuantas") <> Null Then pv = c.GetString("cuantas") - End If - Return pv -End Sub - -'Trae el valor de la columna especificada de la promo dada. -Sub traeInfoDePromo(col As String, idPromo As String) As String - Private res As String = "" - Private c As ResultSet = db.ExecQuery($"select ${col} from PROMOCIONES_INFO where P_ID = '${idPromo}'"$) -' Log($"select ${col} from PROMOCIONES_INFO where P_ID = '${idPromo}'"$) - Do While c.NextRow - res = c.GetString(col) - Loop - 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 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}'"$) - 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) - 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) - Else - res.Initialize - End If - Return res -End Sub - -'Regresa el inventario de un producto dado o CERO si no lo encuentra. -Sub traeInventario(id As String) As Int - Private inv As Int = 0 - Private c As ResultSet = db.ExecQuery($"select CAT_GP_ALMACEN from ${tablaProds} where CAT_GP_ID = ${id}"$) - Do While c.NextRow - inv = c.GetInt("CAT_GP_ALMACEN") - Loop - Return inv -End Sub - - - - - - -'Regresa cuantas promos alcanzan con los productos FIJOS que hay en inventario. -Sub revisaMaxPromosProdsFijosPorInventarioXXX(id As String) As Int - If muestraLogs Then LogColor("> revisaMaxPromosProdsFijosPorInventario: " & id, Colors.blue) -' Private invFijoXpromo As Map - Private t As List - t.Initialize - t.Add(traeMaxPromos(id)) ' Agregamos a la lista las promos maximas permitidas (recurrente, cliente y promo). -' invFijoXpromo.Initialize -' If muestraLogs Then LogColor($"pm=${pm}"$, Colors.Blue) - Private prodsFijosReq As List = traeListaDePromo("P_PRODSFIJOS_PIEZAS", id) - Private idProdsFijos As List = traeListaDePromo("P_PRODSFIJOS", id) - If muestraLogs Then Log($"ProdsFijos: ${idProdsFijos}, PiezasReq: ${prodsFijosReq}"$) - Private invDispParaPromo As Map = traemosInvDispParaPromo(id) - If muestraLogs Then Log(">>> " & $"invDispParaPromo=${invDispParaPromo}"$) - 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 - If invDispParaPromo.Get(idProdsFijos.Get(p).As(String)) <> Null Then - thisInvDisp = invDispParaPromo.Get(idProdsFijos.Get(p).As(String)) - End If - Private esteColor As Double = Colors.green - Private esteMensaje As String = "INVENTARIO OK" - If prodsFijosReq.Get(p) > thisInvDisp Then - esteColor = Colors.red - esteMensaje = "INVENTARIO INSUFICIENTE" - End If - If muestraLogs Then LogColor($"PROD=${idProdsFijos.Get(p)}, INV=${thisInvDisp}, REQ=${prodsFijosReq.Get(p)} - ${esteMensaje}"$, esteColor) -' If muestraLogs Then Log($"${(thisInvDisp / prodsFijosReq.Get(p))}"$) - Private x() As String = Regex.Split("\.", $"${(thisInvDisp / prodsFijosReq.Get(p))}"$) 'Separamos el resultado de la division por el punto decimal. -' If muestraLogs Then Log($"PROD: ${idProdsFijos.Get(p)}, INV: ${x(0)}, REQ: ${prodsFijosReq.Get(p)}"$) - 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 resultado mas pequeño. -' If muestraLogs Then LogColor($"prodsFijos=${idProdsFijos}"$, Colors.Blue) -' If muestraLogs Then LogColor($"prodsFijosReq=${prodsFijosReq}"$, Colors.Blue) -' If muestraLogs Then LogColor($"promosProdsFijosDisp=${t}"$, Colors.Blue) -' If muestraLogs Then LogColor($"invFijoXpromo=${invFijoXpromo}"$, Colors.Blue) - If muestraLogs Then LogColor("Max promos de prodsFijos POR inventario = " & t.Get(0), Colors.Magenta) - Return t.Get(0) 'Regresamos el resultado mas pequeño. -End Sub - -'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 restaFijosDePromoXXX(idPromo As String) As Map 'ignore - If muestraLogs Then LogColor("> restaFijosDePromo: " & idPromo, Colors.blue) - Private invDispEstaPromo As Map = traemosInvDispParaPromo(idPromo) 'Obtenemos un mapa con el inventario disponible para cada producto de la promocion desde la base de datos. - If muestraLogs Then LogColor("Inventario inicial antes de FIJOS: "&invDispEstaPromo, Colors.Magenta) 'Inventario inicial. - Private inv As Int - Private prodsFijos As List = traeListaDePromo("P_PRODSFIJOS", idPromo) 'Obtenemos una lista con los productos fijos de la promoción. - Private prodsFijosReq As List = traeListaDePromo("P_PRODSFIJOS_PIEZAS", idPromo) 'Obtenemos un a lista con los productos fijos de la promoción. - If muestraLogs Then LogColor("ProdsFijos -> " & prodsFijos, Colors.red) - invDispEstaPromo.Put("resultado", "No hay suficiente producto para la promocion.") 'Valor por DEFAULT. - If muestraLogs Then Log($"Prods fijos requeridos ${prodsFijos.Size}"$) - If prodsFijos.Size = 0 Then invDispEstaPromo.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 - Private esteProd As String = prodsFijos.Get(p) 'Obtenemos el Id de este producto desde la lista de productos fijos. - If muestraLogs Then Log($"esteProd ${esteProd}, piezasReq: ${prodsFijosReq.Get(p)}"$) 'Producto y piezas requeridas - If muestraLogs Then Log("invDispEstaPromo="&invDispEstaPromo) - If invDispEstaPromo.ContainsKey(esteProd) Then 'Si el mapa del inventario contiene el id del producto entonces ... - inv = invDispEstaPromo.get(esteProd) 'Obtenemos del mapa el inventario de este producto. - nuevoInv = NumberFormat2((inv - prodsFijosReq.get(p)), 1, 0,0,False) - If muestraLogs Then Log($"Nuevo inventario de ${esteProd}: ${inv}-${prodsFijosReq.get(p)} = ${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("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.") - If muestraLogs Then LogColor("Sin suficiente inventario fijo: " & esteProd, Colors.Blue) - Exit - End If - If nuevoInv < 0 Then - invDispEstaPromo.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 muestraLogs Then LogColor("Inventario final despues de FIJOS: "&invDispEstaPromo, Colors.blue) 'Inventario final. - Return invDispEstaPromo -End Sub \ No newline at end of file diff --git a/B4A/Starter.bas b/B4A/Starter.bas index b0477e6..5c3e20e 100644 --- a/B4A/Starter.bas +++ b/B4A/Starter.bas @@ -72,6 +72,7 @@ Sub Service_Create GPS.Initialize("GPS") ubicacionActual.Initialize Subs.revisaBD +' promociones.Initialize pe.Initialize("pe") 'Para obtener la bateria ' skmt = s.dbInit 'Inicializamos BD. DBReqServer = "http://keymon.net:1781" diff --git a/B4A/Subs.bas b/B4A/Subs.bas index a5264cd..54b2f0b 100644 --- a/B4A/Subs.bas +++ b/B4A/Subs.bas @@ -2065,7 +2065,7 @@ Sub revisaHora As Boolean Private hr As Int = h.GetString("CAT_VA_VALOR") DateTime.DateFormat = "HH" Private ahora As String = DateTime.Date(DateTime.Now) -' Log($"${hr} >= ${(ahora - 2)} and ${hr} <= ${(ahora + 2)}"$) + Log($"${hr} >= ${(ahora - 2)} and ${hr} <= ${(ahora + 2)}"$) If hr >= ahora - 2 And hr <= ahora + 2 Then horaCorrecta = True End If diff --git a/B4A/_git_tag.ps1 b/B4A/_git_tag.ps1 index 89e7105..e2a9d1e 100644 --- a/B4A/_git_tag.ps1 +++ b/B4A/_git_tag.ps1 @@ -1,110 +1,127 @@ -# --- SCRIPT DE AUTODESCUBRIMIENTO CON GUI MEJORADA --- +# --- SCRIPT DE COMMIT Y TAG (MODO IDE B4A) --- -# Cargar librería visual +# 0. CONFIGURACIÓN +$HacerPush = $true # Cambia a $true para que suba los cambios a GitHub + +# Cargar librería visual para el MessageBox (por si se necesita en el Push) Add-Type -AssemblyName System.Windows.Forms -Add-Type -AssemblyName System.Drawing # 1. AUTODESCUBRIMIENTO $projectPath = $PSScriptRoot -Write-Host "Ruta: $projectPath" +Write-Host "Ruta del proyecto: $projectPath" $b4aFileItem = Get-ChildItem -Path $projectPath -Filter "*.b4a" | Select-Object -First 1 if (-Not $b4aFileItem) { - [System.Windows.Forms.MessageBox]::Show("No hay archivo .b4a en esta carpeta.", "Error", "OK", "Error") + Write-Host "ERROR: No hay archivo .b4a en esta carpeta." return } -$b4aFile = $b4aFileItem.FullName $projectName = $b4aFileItem.BaseName -Write-Host "Proyecto: $projectName" +Write-Host "Proyecto detectado: $projectName" -# 2. LIMPIEZA -# $objectsPath = Join-Path $projectPath "Objects" -# if (Test-Path $objectsPath) { - # Write-Host "Limpiando Objects..." - # Remove-Item -Path "$objectsPath\*" -Recurse -Force -ErrorAction SilentlyContinue -# } - -# 3. LEER VERSIÓN -$versionLine = Get-Content $b4aFile | Select-String "#VersionName:" -if (-Not $versionLine) { Write-Error "Falta #VersionName"; return } +# 2. LEER VERSIÓN +$versionLine = Get-Content $b4aFileItem.FullName | Select-String "#VersionName:" +if (-Not $versionLine) { + Write-Host "ERROR: Falta #VersionName en el archivo .b4a" + return +} $version = ($versionLine -split ":")[1].Trim() -$tagName = "v$version" +# Reemplaza cualquier espacio en blanco por un guion bajo solo para el tag +$tagName = "$version".Replace(" ", "_") Set-Location $projectPath -# 4. COMMIT -$oldCommit = git rev-parse HEAD +# 3. COMMIT CON TORTOISEGIT +$oldCommit = git rev-parse HEAD 2>$null Write-Host "----------------------------------------" -Write-Host "Versión: $version" -Write-Host "Abriendo TortoiseGit..." +Write-Host "Version a etiquetar: $version" +Write-Host "Abriendo ventana de TortoiseGit..." -# Argumentos limpios $pathArg = '/path:"{0}"' -f $projectPath $msgArg = '/logmsg:"VERSION {0}"' -f $version $cmdArg = "/command:commit" -$process = Start-Process "TortoiseGitProc.exe" -ArgumentList $cmdArg, $pathArg, $msgArg -Wait -PassThru +Start-Process "TortoiseGitProc.exe" -ArgumentList $cmdArg, $pathArg, $msgArg -$newCommit = git rev-parse HEAD +Write-Host "Esperando a que termines el commit en TortoiseGit..." +# El freno de mano: espera a que cierres la ventana +while (Get-Process "TortoiseGitProc" -ErrorAction SilentlyContinue) { + Start-Sleep -Seconds 1 +} -# 5. VALIDACIÓN +$newCommit = git rev-parse HEAD 2>$null + +# 4. VALIDACIÓN if ($oldCommit -eq $newCommit) { - Write-Warning "Commit cancelado." - git tag -d $tagName 2>$null # Borra tag local previo si existe para actualizarlo al nuevo commit + Write-Host "WARNING: Commit cancelado o sin cambios detectados." return } -Write-Host ">> Commit detectado." +Write-Host "Commit registrado exitosamente: $newCommit" -# 6. GESTIÓN DE TAGS (VISUAL TOPMOST) -Write-Host "git ls-remote --tags origin $tagName" -$remoteTagInfo = git ls-remote --tags origin $tagName +# 5. GESTIÓN DE TAGS +$tagGenerado = $false -if ($remoteTagInfo) { - # --- TRUCO PARA QUE LA VENTANA SALGA AL FRENTE --- - # Creamos un formulario invisible que esté "Siempre Visible" (TopMost) - Write-Host "Recibimos remoteTagInfo" - $topForm = New-Object System.Windows.Forms.Form - $topForm.TopMost = $true - $topForm.Opacity = 0 # Invisible - $topForm.ShowInTaskbar = $false - $topForm.StartPosition = "CenterScreen" - $topForm.Show() - $topForm.Activate() - - [System.Console]::Beep(1000, 200) - [System.Console]::Beep(1000, 200) - - $msgBody = "El tag '$tagName' YA EXISTE en GitHub.`n`nDeseas SOBRESCRIBIRLO?`n`nSi = Borrar anterior y actualizar (Force Push).`nNo = Subir solo codigo (mantener tag viejo)." - $msgTitle = "⚠️ Conflicto de Versiones - $projectName" - - # El mensaje ahora es "hijo" del formulario invisible, heredando su propiedad TopMost - Write-Host "Preguntamos que hacer con el tag" - $respuesta = [System.Windows.Forms.MessageBox]::Show($topForm, $msgBody, $msgTitle, "YesNo", "Warning") - - $topForm.Dispose() # Limpiamos el formulario invisible - - if ($respuesta -eq "Yes") { - Write-Host "Sobrescribiendo..." - git tag -d $tagName 2>$null - git tag -a $tagName -m "Release version $version (Updated)" - - git push origin - git push origin $tagName --force - Write-Host ">> Tag actualizado (Force Push)." - } else { - Write-Host "Conservando tag anterior..." - git push origin - Write-Host ">> Código subido." - } -} else { - # Tag Nuevo - git tag -a $tagName -m "Release version $version" - git push origin --follow-tags - Write-Host ">> Versión publicada." +# Revisamos si el tag ya existe localmente y lo borramos para recrearlo con el nuevo commit +if (git tag -l $tagName) { + git tag -d $tagName 2>$null | Out-Null } -Write-Host "----------------------------------------" \ No newline at end of file +# Creamos el tag nuevo apuntando al commit que acabamos de hacer +git tag -a $tagName -m "Release version $version" +if ($?) { $tagGenerado = $true } + +# 6. LÓGICA DE PUSH +if ($HacerPush) { + Write-Host "Conectando con GitHub..." + $remoteTagInfo = git ls-remote --tags origin $tagName + + if ($remoteTagInfo) { + # Conflicto: Ya existe en remoto + $topForm = New-Object System.Windows.Forms.Form + $topForm.TopMost = $true + $topForm.Opacity = 0 + $topForm.ShowInTaskbar = $false + $topForm.StartPosition = "CenterScreen" + $topForm.Show() + $topForm.Activate() + + [System.Console]::Beep(1000, 200) + + $msgBody = "El tag '$tagName' YA EXISTE en GitHub.`n`nDeseas SOBRESCRIBIRLO?`n`nSi = Borrar anterior y actualizar (Force Push).`nNo = Subir solo codigo (mantener tag viejo)." + $msgTitle = "Conflicto de Versiones - $projectName" + + $respuesta = [System.Windows.Forms.MessageBox]::Show($topForm, $msgBody, $msgTitle, "YesNo", "Warning") + $topForm.Dispose() + + if ($respuesta -eq "Yes") { + Write-Host "Sobrescribiendo tag en GitHub (Force Push)..." + git push origin + git push origin $tagName --force + } else { + Write-Host "Conservando tag anterior en GitHub..." + git push origin + } + } else { + # Tag Nuevo + Write-Host "Subiendo codigo y tag nuevo a GitHub..." + git push origin --follow-tags + } +} else { + Write-Host "Push OMITIDO (Switch de control apagado)." +} + +# 7. REPORTE FINAL PARA EL IDE +$EstadoPush = if($HacerPush) { "SI" } else { "NO (Modo de prueba local)" } +$EstadoTag = if($tagGenerado) { "SI ($tagName)" } else { "NO (Error al generar)" } + +Write-Host "" +Write-Host "========================================" +Write-Host " REPORTE DE VERSION " +Write-Host "========================================" +Write-Host " PROYECTO : $projectName" +Write-Host " TAG CREADO : $EstadoTag" +Write-Host " PUSH GITHUB: $EstadoPush" +Write-Host "========================================" \ No newline at end of file diff --git a/B4A/_juntaBas.bat b/B4A/_juntaBas.bat deleted file mode 100644 index 4e4d4f5..0000000 --- a/B4A/_juntaBas.bat +++ /dev/null @@ -1,29 +0,0 @@ -@echo off -setlocal EnableDelayedExpansion - -:: Nombre del archivo de salida -set "OutputFile=TODOS_LOS_BAS.txt" - -:: Si existe una versión anterior, la elimina para no anexar datos duplicados -if exist "!OutputFile!" del "!OutputFile!" - -echo Iniciando proceso de fusion... - -:: Itera sobre todos los archivos .bas en el directorio actual -for %%F in (*.bas *.b4a *.b4j) do ( - echo Procesando: %%F - - :: Agrega un salto de linea y el encabezado al archivo de salida - echo. >> "!OutputFile!" - echo ====================================== >> "!OutputFile!" - echo ARCHIVO: %%F >> "!OutputFile!" - echo ====================================== >> "!OutputFile!" - echo. >> "!OutputFile!" - - :: Vuelca el contenido del archivo actual al archivo de salida - type "%%F" >> "!OutputFile!" -) - -echo. -echo Proceso terminado. Se ha creado el archivo: !OutputFile! -pause \ No newline at end of file diff --git a/B4A/_juntaBas.ps1 b/B4A/_juntaBas.ps1 index 4448a79..30e34be 100644 --- a/B4A/_juntaBas.ps1 +++ b/B4A/_juntaBas.ps1 @@ -1,81 +1,127 @@ -# SCRIPT: _juntaBas.ps1 - Versión SYSTEM PROMPT CONDICIONAL + Ultimate (Corregido) -$OutputFile="_CODIGO_COMPLETO_PARA_LLM.txt" +# SCRIPT: _juntaBas_Master_FinalIA.ps1 +# FIX: Corregida sintaxis de comillas y concatenación de tags XML. +# OBJETIVO: Fuente de verdad para IA con navegación ultra estructurada. -Remove-Item -Path $OutputFile -ErrorAction SilentlyContinue -Write-Host "Generando Código Maestro con Protocolo Condicional..." +$ErrorActionPreference = 'SilentlyContinue' +$Dir = Get-Location +$LT = [char]60; $GT = [char]62; $SL = [char]47 +$NL = [Environment]::NewLine -$files = Get-ChildItem -Path ".\*" -Include @("*.bas", "*.b4a", "*.j") +Write-Output '--- GENERANDO MASTER IA DEFINITIVO (FIX ESTRUCTURAL) ---' -# --- 0. INYECCIÓN DE INSTRUCCIONES DE SISTEMA (CONDICIONALES) --- -# Se han reemplazado paréntesis conflictivos y comillas internas para evitar errores de PowerShell -Add-Content -Path $OutputFile -Value "''' ======================================================================================" -Encoding UTF8 -Add-Content -Path $OutputFile -Value "''' INSTRUCCIONES CRÍTICAS PARA EL ASISTENTE (PROTOCOLO B4A)" -Encoding UTF8 -Add-Content -Path $OutputFile -Value "''' 1. CONTEXTO: Este archivo contiene el código fuente ACTUAL del proyecto." -Encoding UTF8 -Add-Content -Path $OutputFile -Value "''' 2. ANTI-ALUCINACION: Antes de sugerir propiedades, VERIFICA si existen" -Encoding UTF8 -Add-Content -Path $OutputFile -Value "''' en las secciones [Variables Globales] o [Estructuras Types] del Manifiesto abajo." -Encoding UTF8 -Add-Content -Path $OutputFile -Value "''' 3. DOCUMENTACION EXTERNA (CONDICIONAL):" -Encoding UTF8 -Add-Content -Path $OutputFile -Value "''' - SI el usuario adjunta archivos de referencia (ej. _B4X_Library... o _B4A_Library...)," -Encoding UTF8 -Add-Content -Path $OutputFile -Value "''' PRIORIZA esos métodos sobre tu conocimiento general." -Encoding UTF8 -Add-Content -Path $OutputFile -Value "''' - SI NO se adjuntan referencias, apóyate en el código existente en Subs.bas." -Encoding UTF8 -Add-Content -Path $OutputFile -Value "''' 4. SCOPE: Respeta la visibilidad (Public/Private)." -Encoding UTF8 -Add-Content -Path $OutputFile -Value "''' ======================================================================================`n" -Encoding UTF8 +# 1. PARSEO DEL PROYECTO .B4A +$b4a = Get-ChildItem -Path ".\*" -Include "*.b4a" -Recurse | Select-Object -First 1 +$Name = 'App'; $Ver = '0.0'; $ModulosValidos = @(); $Librerias = @() -# --- 1. GENERACIÓN DEL MANIFIESTO (TABLA DE CONTENIDO) --- -Add-Content -Path $OutputFile -Value "'======================================================================================" -Encoding UTF8 -Add-Content -Path $OutputFile -Value "' MANIFIESTO DEL PROYECTO - Generado el $(Get-Date -Format 'yyyy-MM-dd HH:mm')" -Encoding UTF8 -Add-Content -Path $OutputFile -Value "' Total de archivos: $($files.Count)" -Encoding UTF8 -Add-Content -Path $OutputFile -Value "'======================================================================================" -Encoding UTF8 - -foreach ($file in $files) { - $content = Get-Content $file.FullName - $ext = $file.Extension.ToLower() - $lines = $content.Count - - # Extraer (Subs, Globales, Types, Libs) - $subs = $content | Where-Object { $_ -match "^\s*Sub\s+" } | ForEach-Object { $_.Trim() -replace "'.*$", "" } - $globals = $content | Where-Object { $_ -match "^\s*(Private|Public|Dim)\s+\w+\s+As" } | ForEach-Object { $_.Trim() -replace "'.*$", "" } - $types = $content | Where-Object { $_ -match "^\s*Type\s+\w+" } | ForEach-Object { $_.Trim() } - - $libs = @() - if ($ext -eq ".b4a") { - $libs = $content | Where-Object { $_ -match "^Library\d+=" } | ForEach-Object { $_ -replace "^Library\d+=", "" } +if ($b4a) { + $lines = [System.IO.File]::ReadAllLines($b4a.FullName) + foreach ($L in $lines) { + if ($L -match '#ApplicationLabel:\s*(.*)') { $Name = $Matches[1].Trim() } + if ($L -match '#VersionName:\s*(.*)') { $Ver = $Matches[1].Trim() } + if ($L -match '^Module\d+=(.*)') { + $m = [System.IO.Path]::GetFileName($Matches[1].Trim()) + if (-not $m.EndsWith(".bas") -and $m -ne "Main") { $m += ".bas" } + $ModulosValidos += $m + } + if ($L -match '^Library\d+=(.*)') { $Librerias += $Matches[1].Trim() } } - - # Escribir Manifiesto - Add-Content -Path $OutputFile -Value "' [ ] Archivo: $($file.Name) ($lines líneas)" -Encoding UTF8 - - if ($libs) { - Add-Content -Path $OutputFile -Value "' --- Librerías Activas ---" -Encoding UTF8 - foreach ($l in $libs) { Add-Content -Path $OutputFile -Value "' [LIB] $l" -Encoding UTF8 } - } - if ($types) { - Add-Content -Path $OutputFile -Value "' --- Estructuras (Types) ---" -Encoding UTF8 - foreach ($t in $types) { Add-Content -Path $OutputFile -Value "' {TYPE} $t" -Encoding UTF8 } - } - if ($globals) { - Add-Content -Path $OutputFile -Value "' --- Variables Globales ---" -Encoding UTF8 - foreach ($g in $globals) { Add-Content -Path $OutputFile -Value "' . $g" -Encoding UTF8 } - } - if ($subs) { - Add-Content -Path $OutputFile -Value "' --- Subrutinas ---" -Encoding UTF8 - foreach ($s in $subs) { Add-Content -Path $OutputFile -Value "' > $s" -Encoding UTF8 } - } - Add-Content -Path $OutputFile -Value "' ------------------------------------------------------------------------------------" -Encoding UTF8 -} -Add-Content -Path $OutputFile -Value "' FINAL DEL MANIFIESTO`n" -Encoding UTF8 -Add-Content -Path $OutputFile -Value "'======================================================================================`n" -Encoding UTF8 - -# --- 2. VUELCO DE CONTENIDO --- -$files | ForEach-Object { - $currentFile = $_.Name - Write-Host "Procesando: $currentFile" - Add-Content -Path $OutputFile -Value "'======================================================================================" -Encoding UTF8 - Add-Content -Path $OutputFile -Value "// ARCHIVO_INICIO: ${currentFile}" -Encoding UTF8 - Add-Content -Path $OutputFile -Value "'======================================================================================`n" -Encoding UTF8 - Get-Content -Encoding UTF8 -Path $_.FullName -Raw | Add-Content -Path $OutputFile -Encoding UTF8 - Add-Content -Path $OutputFile -Value "`n'======================================================================================" -Encoding UTF8 - Add-Content -Path $OutputFile -Value "// ARCHIVO_FIN: ${currentFile}" -Encoding UTF8 - Add-Content -Path $OutputFile -Value "'======================================================================================`n" -Encoding UTF8 } -Write-Host "¡Listo! Archivo $OutputFile con Instrucciones Condicionales generado (Sin Errores)." \ No newline at end of file +$OutName = "_" + $Name + "_" + $Ver + "_IA.md" +$OutFile = Join-Path $Dir $OutName + +# 2. HEADER CON TUS INSTRUCCIONES CRÍTICAS +$CurrentDate = Get-Date -Format 'yyyy-MM-dd HH:mm' +$Header = @" +# PROYECTO: $Name +- Version: $Ver +- Fecha: $CurrentDate +- Librerias Activas: $($Librerias -join ", ") + +## INSTRUCCIONES CRITICAS (B4A / BASIC4ANDROID) +0. **Integridad del Contexto:** Antes de procesar peticiones, cuenta si el numero de modulos listados en el indice coincide con los detallados en el cuerpo. +1. **Source of Truth (Codigo):** Este archivo contiene el codigo fuente ACTUAL del proyecto. +2. **Source of Truth (Librerias):** Basa tus sugerencias en la lista de 'Librerias Activas'. +3. **Anti-Alucinacion:** Antes de sugerir, VERIFICA la 'Interfaz Pública' o el código fuente del módulo. +4. **Existencia Estricta:** Si una variable/Sub no está en el texto, NO EXISTE. +5. **Formato:** Usa bloques 'vb'. +6. **Navegacion Estructural:** Usa los tags , y para localizar codigo. +7. **Inferencia de Datos:** Deduce la BD solo de los strings SQL presentes. +"@ + +Set-Content -Path $OutFile -Value $Header -Encoding UTF8 + +# 3. LISTAR ARCHIVOS +$files = Get-ChildItem -Path $Dir -Include *.bas,*.b4a -Recurse | Where-Object { + $_.FullName -notmatch 'Objects' -and ($_.Extension -eq '.b4a' -or $ModulosValidos -contains $_.Name) +} + +# 4. INDICE DE MODULOS +Add-Content $OutFile ($NL + "## INDICE DE MODULOS" + $NL) -Encoding UTF8 +foreach ($f in $files) { + $Ref = $f.Name.Replace('.', '').Replace(' ', '-').ToLower() + Add-Content $OutFile ("- [" + $f.Name + "](#modulo-" + $Ref + ")") -Encoding UTF8 +} + +# 5. CODIGO FUENTE ESTRUCTURADO +Add-Content $OutFile ($NL + '## CODIGO FUENTE DETALLADO' + $NL) -Encoding UTF8 + +foreach ($f in $files) { + Write-Host " -> $($f.Name)... " -NoNewline + $txt = [System.IO.File]::ReadAllLines($f.FullName) + + # Pre-escaneo para + $Methods = @() + foreach ($line in $txt) { + if ($line.Trim() -match '^(?:Public\s+|Private\s+)?Sub\s+([\w\d_]+)') { + $Methods += $Matches[1] + } + } + + $Ref = $f.Name.Replace('.', '').Replace(' ', '-').ToLower() + Add-Content $OutFile "$NL" -Encoding UTF8 + + Add-Content $OutFile " " -Encoding UTF8 + foreach($m in $Methods) { + Add-Content $OutFile " " -Encoding UTF8 + } + Add-Content $OutFile " $NL" -Encoding UTF8 + + Add-Content $OutFile "```vb" -Encoding UTF8 + + $skip = ($f.Extension -eq '.b4a') + + foreach ($l in $txt) { + $trim = $l.Trim() + + if ($skip) { + if ($trim.StartsWith("#") -and -not $trim.StartsWith("#Region")) { Add-Content $OutFile $l -Encoding UTF8 } + if ($l.Contains("@EndOfDesignText@")) { $skip = $false } + continue + } + + # Inicio de Método + if ($trim -match '^(?:Public\s+|Private\s+)?Sub\s+([\w\d_]+)') { + Add-Content $OutFile "" -Encoding UTF8 + } + + # Limpieza de comentarios y escritura de línea + if ($trim.StartsWith("'")) { + if (-not ($trim.StartsWith("'#") -or ($trim -match 'TODO:') -or ($trim -match 'FIX:'))) { continue } + } + + if (-not [string]::IsNullOrWhiteSpace($trim)) { + Add-Content $OutFile $l -Encoding UTF8 + } + + # Fin de Método + if ($trim -eq "End Sub") { + Add-Content $OutFile "" -Encoding UTF8 + } + } + + Add-Content $OutFile "```$NL" -Encoding UTF8 + Write-Host "OK" -ForegroundColor Green +} + +Write-Output ("--- FINALIZADO: " + $OutName + " ---") \ No newline at end of file diff --git a/B4A/jRDCWrapper.bas b/B4A/jRDCWrapper.bas deleted file mode 100644 index 9a2f578..0000000 --- a/B4A/jRDCWrapper.bas +++ /dev/null @@ -1,166 +0,0 @@ -B4A=true -Group=Default Group -ModulesStructureVersion=1 -Type=Class -Version=12.8 -@EndOfDesignText@ -'Class module: jRDC1Wrapper -'Version 1.3 - Thread-Safe with ExecuteCommand support - -Public Sub Class_Globals - ' Public properties to be accessed after the wait for completes - Type TResultado(Tag As String, Success As Boolean, resultado As DBResult, ErrorMessage As String) -' Type TCommandResult(Tag As String, Success As Boolean, RowsAffected As Int, ErrorMessage As String) - - 'C <<< Definimos un tipo para almacenar la información de cada job - Type TJobInfo (Target As Object, EventName As String, IsQuery As Boolean) - - 'C <<< Un mapa para mantener un registro de los jobs activos - Private activeJobs As Map - - 'C <<< Un contador para generar tags únicos para cada job - Private jobCounter As Int - - Public reqManager As DBRequestManager - Public cmd As DBCommand - Public resultado As TResultado -' Public commandResult As TCommandResult - Private logger As Boolean = False -End Sub - -'Initializes the object. -Public Sub Initialize - 'C <<< Inicializamos el mapa y el contador - activeJobs.Initialize - jobCounter = 0 -End Sub - -'Executes the query using the old jRDC1 mechanism. -'Parameters: -' - rdcLink: The link for the reqManager initialization. -' - Command: The DBCommand to execute. -' - Target: The module (like 'Me') where the completed event should be raised. -' - Event: The name of the event to raise when the query completes (e.g., "WrapperEvent"). -Public Sub ExecuteQuery(rdcLink As String, Command As DBCommand, Target As Object, Event As String) - '<<< Incrementamos el contador para obtener un ID único - jobCounter = jobCounter + 1 - Dim currentJobTag As String = "jRDCWrapJob_" & jobCounter - - If logger Then Log($"ExecuteQuery (Tag: ${currentJobTag}): Command=${Command.Name}, Event=${Event}"$) - - '<<< Creamos una instancia de TJobInfo para guardar el target y el evento - Dim jobInfo As TJobInfo - jobInfo.Initialize - jobInfo.Target = Target - jobInfo.EventName = Event - jobInfo.IsQuery = True ' Mark as query job - - '<<< Guardamos la información del job en el mapa, usando el tag único como llave - activeJobs.Put(currentJobTag, jobInfo) - - reqManager.Initialize(Me, rdcLink) - cmd = Command - - '<<< Ejecutamos la consulta pasando nuestro TAG ÚNICO - reqManager.ExecuteQuery(cmd, 0, currentJobTag) -End Sub - -'Executes a command (INSERT, UPDATE, DELETE) using the old jRDC1 mechanism. -'Parameters: -' - rdcLink: The link for the reqManager initialization. -' - Command: The DBCommand to execute. -' - Target: The module (like 'Me') where the completed event should be raised. -' - Event: The name of the event to raise when the command completes (e.g., "WrapperEvent"). -Public Sub ExecuteCommand(rdcLink As String, Command As DBCommand, Target As Object, Event As String) - '<<< Incrementamos el contador para obtener un ID único - jobCounter = jobCounter + 1 - Dim currentJobTag As String = "jRDCWrapJob_" & jobCounter - - if logger then Log($"ExecuteCommand (Tag: ${currentJobTag}): Command=${Command.Name}, Event=${Event}"$) - - '<<< Creamos una instancia de TJobInfo para guardar el target y el evento - Dim jobInfo As TJobInfo - jobInfo.Initialize - jobInfo.Target = Target - jobInfo.EventName = Event - jobInfo.IsQuery = False ' Mark as command job - - '<<< Guardamos la información del job en el mapa, usando el tag único como llave - activeJobs.Put(currentJobTag, jobInfo) - - reqManager.Initialize(Me, rdcLink) - cmd = Command - - '<<< Ejecutamos el comando pasando nuestro TAG ÚNICO - reqManager.ExecuteCommand(cmd, currentJobTag) -End Sub - -'This sub will be called by the DBRequestManager when the job is done -Public Sub JobDone(job As HttpJob) - '<<< Obtenemos el Tag único que asignamos al job - Dim currentJobTag As String = job.Tag - - 'C <<< Verificamos si este job fue iniciado por nuestro wrapper - If activeJobs.ContainsKey(currentJobTag) = False Then - If logger Then Log($"JobDone: Se recibió un job con un tag desconocido: ${currentJobTag}"$) - job.Release - Return - End If - - '<<< Recuperamos la información específica de este job desde el mapa - Dim jobInfo As TJobInfo = activeJobs.Get(currentJobTag) - Try - If jobInfo.IsQuery Then - ' Handle query result - resultado.Initialize - resultado.Tag = jobInfo.EventName ' Usamos el nombre del evento original como Tag del resultado - - If job.Success Then - Dim dbResult As DBResult = reqManager.HandleJob(job) - resultado.Success = True - resultado.Resultado = dbResult - resultado.ErrorMessage = "" - Else - resultado.Success = False - resultado.Resultado = Null - resultado.ErrorMessage = job.ErrorMessage - End If - job.Release - - '<<< Usamos la información recuperada del mapa para llamar al Sub correcto - if logger then LogColor($"EVENTO: ${jobInfo.EventName}_Completed"$, Colors.Magenta) - CallSubDelayed2(jobInfo.Target, jobInfo.EventName & "_Completed", resultado) - Else - ' Handle command result - resultado.Initialize - resultado.Tag = jobInfo.EventName - - If job.Success Then - Dim dbResult As DBResult = reqManager.HandleJob(job) -' Dim rowsAffected As Int = reqManager.HandleCommandResult(job) -' For Each records() As Object In dbResult.Rows -' Dim rowsAffected As Int = records(dbResult.Columns.Get("AffectedRows")) -' Next - resultado.Success = True - resultado.resultado = dbResult - resultado.ErrorMessage = "" - Else - resultado.Success = False - resultado.resultado = Null - resultado.ErrorMessage = job.ErrorMessage - End If - job.Release - - '<<< Usamos la información recuperada del mapa para llamar al Sub correcto - If logger Then LogColor($"EVENTO: ${jobInfo.EventName}_Completed"$, Colors.Magenta) - CallSubDelayed2(jobInfo.Target, jobInfo.EventName & "_Completed", resultado) - End If - - 'C <<< Se remueve el job del mapa en caso de ÉXITO - activeJobs.Remove(currentJobTag) - Catch - if logger then LogColor("Error en jRDC1Wrapper.JobDone: " & LastException, Colors.Red) - '<<< MUY IMPORTANTE: Remover el job del mapa para no tener fugas de memoria - activeJobs.Remove(currentJobTag) - End Try -End Sub \ No newline at end of file