B4A=true Group=Default Group ModulesStructureVersion=1 Type=Class Version=12.8 @EndOfDesignText@ Sub Class_Globals ' Declarada como Dim para ser accesible desde B4XMainPage (según patrón B4A) Dim reqManager As DBRequestManager Dim c, d, b As Cursor Dim usuario, almacen As String Dim cuantos_pedido, cuantos_noventa, cuantos_pedidosc As String Dim foto1(), foto2(), foto3(), foto4() As Byte Dim PORCENTAJE, PASO, PERFIL, NUMERO_PEDIDO, l_ruta As String Dim contador_env, contador_strem, reqTotales As Int Dim enviando As Boolean = False Dim validando As Boolean = False Dim datos_iguales As String End Sub ' Initializes the object. Public Sub Initialize l_ruta = "" PASO = "1" End Sub ' Método de entrada de DBCheck: Configura el Manager y llama a la subrutina de envío. Public Sub ConfigurarYEnviar(ServidorURL As String) ' Inicializa el Manager con el Target correcto (Me = C_Kelloggs) reqManager.Initialize(Me, ServidorURL) ' Obtener valores necesarios de forma centralizada almacen = Subs.traeAlmacen usuario = Subs.traeUsuarioDeBD ' Iniciar el flujo de envío estandarizado envia ' Iniciar el temporizador para la validación si la lista de peticiones no está vacía reqTotales = reqManager.reqsList.Size If reqTotales > 0 Then Dim t1 As Timer ' t1.Initialize("T1", 20000) ' t1.Enabled = True End If End Sub ' **FUNCIÓN ESTANDARIZADA:** Ejecuta la subida de datos (equivalente a Subir_Click -> SUBIR_INFO_PEDIDO) Public Sub envia enviando = True ' 1. Limpieza y preparación inicial (lógica de Subir_Click) SUBIR_INFO_PREPARACION ' 2. Lógica principal de ejecución de comandos (Extraída del SUBIR_INFO_PEDIDO original) SUBIR_INFO_EJECUTAR_COMANDOS End Sub Private Sub SUBIR_INFO_PREPARACION ' Limpieza y obtención de datos antes de enviar. ' 1. Borrar pedidos no impresos (lógica de B4XPage_Appear/Subir_Click) Dim t As Cursor = B4XPages.MainPage.skmt.ExecQuery("Select cat_cl_codigo from kmt_info where impresion = 0 and cat_cl_codigo not in (select ci_cuenta from cliente_impreso) and cat_cl_codigo in (select distinct pe_cliente from pedido)") If t.RowCount > 0 Then For i = 0 To t.RowCount - 1 t.Position = i Log($"Cliente con pedido no impreso (BORRADO TEÓRICO): ${t.GetString("CAT_CL_CODIGO")}"$) Next t.Close End If ' 2. Obtener valores para el envío l_ruta = Subs.traeRuta ' 3. Limpieza de tablas (similar a la lógica en Subir_Click) B4XPages.MainPage.skmt.ExecNonQuery2("delete from PEDIDO WHERE PE_PRONOMBRE = ? ", Array As Object("N/A")) B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE not In (select PE_CLIENTE from pedido)") ' 4. Actualizar la ruta en la tabla PEDIDO (Lógica de Subir_Click) c = B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_CODIGO, CAT_CL_RUTA from kmt_info") If c.RowCount > 0 Then For i = 0 To c.RowCount - 1 c.Position=i B4XPages.MainPage.skmt.ExecNonQuery2("update PEDIDO set PE_RUTA = ? where PE_CLIENTE = ?", Array As Object(c.GetString("CAT_CL_RUTA"),c.GetString("CAT_CL_CODIGO"))) Next End If c.Close ' 5. Obtener PERFIL y NUMERO_PEDIDO c = B4XPages.MainPage.skmt.ExecQuery2("select CAT_VA_VALOR from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("PERFIL")) PERFIL = "0" If c.RowCount > 0 Then c.Position = 0: PERFIL = c.GetString("CAT_VA_VALOR") c.Close c = B4XPages.MainPage.skmt.ExecQuery2("select CAT_VA_VALOR from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("NUMERO_PEDIDO")) NUMERO_PEDIDO = "0" If c.RowCount > 0 Then c.Position = 0: NUMERO_PEDIDO = c.GetString("CAT_VA_VALOR") c.Close ' 6. Cargar fotos para el Checklist (si existen) If File.Exists(File.DirInternal,"FOTO1.jpg") Then foto1 = Bit.InputStreamToBytes(File.OpenInput(File.DirInternal,"FOTO1.jpg")) If File.Exists(File.DirInternal,"FOTO2.jpg") Then foto2 = Bit.InputStreamToBytes(File.OpenInput(File.DirInternal,"FOTO2.jpg")) If File.Exists(File.DirInternal,"FOTO3.jpg") Then foto3 = Bit.InputStreamToBytes(File.OpenInput(File.DirInternal,"FOTO3.jpg")) If File.Exists(File.DirInternal,"FOTO4.jpg") Then foto4 = Bit.InputStreamToBytes(File.OpenInput(File.DirInternal,"FOTO4.jpg")) End Sub Private Sub SUBIR_INFO_EJECUTAR_COMANDOS ' Lógica extraída de SUBIR_INFO_PEDIDO (el core de la subida original) Dim PEDIDO_TOT As String = "0" Dim L_ABORDO_VAL As String = "0" Dim monto1 As String = "0" Dim fecha As String = Subs.traeFecha ' --- OBTENCIÓN DE TOTALES --- b = B4XPages.MainPage.skmt.ExecQuery("Select count(*) as CUANTOS from pedido where pe_cliente <> 0") If b.GetString("CUANTOS") > 0 Then c = B4XPages.MainPage.skmt.ExecQuery("Select sum(PE_COSTO_TOT) AS TOTAL from pedido where pe_cliente <> 0") PEDIDO_TOT = c.GetString("TOTAL") c.Close End If b.Close b = B4XPages.MainPage.skmt.ExecQuery("Select count(*) as CUANTOS from pedido where pe_cliente = 0") If b.GetString("CUANTOS") > 0 Then c = B4XPages.MainPage.skmt.ExecQuery("Select sum(PE_COSTO_TOT) AS TOTAL from pedido where pe_cliente = 0") L_ABORDO_VAL = c.GetString("TOTAL") c.Close End If b.Close d = B4XPages.MainPage.skmt.ExecQuery("SELECT SUM(PE_COSTO_TOT) as MONTO FROM PEDIDO") If d.GetString("MONTO") <> Null And d.GetString("MONTO") <> "" Then monto1 = d.GetString("MONTO") monto1 = monto1 - L_ABORDO_VAL ' --- 1. ENVIO DEL DROP (cabecera) --- Dim cmd As DBCommand cmd.Initialize cmd.Name ="insert_drop2_KELL" cmd.Parameters = Array As Object(usuario, l_ruta, Subs.traeFecha, 0, 0, 0, 0, 0, monto1, "ENVIO", almacen, L_ABORDO_VAL) reqManager.ExecuteCommand(cmd , "inst_noventa_ins_drop_kell") contador_env = contador_env + 1 ' --- 2. UPDATE DE INFO_E --- cmd.Initialize cmd.Name ="UPDATE_INFO_E_KELL" cmd.Parameters = Array As Object(PEDIDO_TOT, L_ABORDO_VAL, d.GetDouble("MONTO"), l_ruta, almacen) reqManager.ExecuteCommand(cmd , "inst_noventa_Upd_Info_e_Kell") contador_env = contador_env + 1 d.Close ' --- 3. BITACORA GPS --- Private h As ResultSet = B4XPages.MainPage.skmt.ExecQuery($"select * from bitacoraGPS"$) Do While h.nextrow cmd.Initialize cmd.Name = "mandaBitacora3" cmd.Parameters = Array As Object(h.GetString("almacenb"), h.GetString("usuariob"), h.GetString("rutab"), h.GetString("eventob"), h.GetString("clienteb"), h.GetString("clienteb"), h.GetString("iniciob"), h.GetString("finb"), h.GetString("latitudb"), h.GetString("longitudb"), h.GetString("precision"), h.GetString("motivonoventa"), h.GetString("motivonovisita"), h.GetString("fechab")) reqManager.ExecuteCommand(cmd , "mandaBitacora") Loop h.Close ' --- 4. ENCUESTA --- c = B4XPages.MainPage.skmt.ExecQuery("SELECT HE_CLIE, HE_RES, HE_FECHA, HE_TIPO FROM HIST_ENCUESTA") If c.RowCount > 0 Then For i = 0 To c.RowCount - 1 c.Position=i cmd.Initialize cmd.Name = "insert_encuesta_KELL" cmd.Parameters = Array As Object(c.GetString("HE_CLIE"),c.GetString("HE_RES"),c.GetString("HE_FECHA"), c.GetString("HE_TIPO"),l_ruta ) reqManager.ExecuteCommand(cmd , "inst_noventa_ins_enc_kell_"&i) contador_env = contador_env + 1 Next End If c.Close ' --- 5. CLIENTES NUEVOS --- c = B4XPages.MainPage.skmt.ExecQuery2("SELECT CAT_CL_CODIGO, CAT_CL_NOMBRE FROM kmt_info where CAT_CL_ATIENDE1 = ?", Array As String("new")) If c.RowCount > 0 Then For i = 0 To c.RowCount - 1 c.Position = i cmd.Initialize cmd.Name = "insert_clie_new_KELL" cmd.Parameters = Array As Object(c.GetString("CAT_CL_CODIGO"),c.GetString("CAT_CL_NOMBRE"),l_ruta,almacen ) reqManager.ExecuteCommand(cmd , "inst_noventa_ins_clie_new_kell") contador_env = contador_env + 1 Next End If c.Close ' --- 6. PEDIDO_CLIENTE (Cabeceras) --- enviaPedidoCliente("Todos") d = B4XPages.MainPage.skmt.ExecQuery("SELECT COUNT(*) as CUANTOS_PEDIDOSC FROM PEDIDO_CLIENTE ") cuantos_pedidosc = D.GetString("CUANTOS_PEDIDOSC") d.Close ' --- 7. PEDIDO (Detalle de Productos) --- enviaPedido("Todos") d = B4XPages.MainPage.skmt.ExecQuery("SELECT COUNT(*) as CUANTOS_PEDIDO FROM PEDIDO") cuantos_pedido = D.GetString("CUANTOS_PEDIDO") d.Close ' --- 8. NOVENTA --- c = B4XPages.MainPage.skmt.ExecQuery("SELECT NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON FROM NOVENTA") D = B4XPages.MainPage.skmt.ExecQuery("SELECT COUNT(*) AS CUANTOS_NOVENTA FROM NOVENTA") If c.RowCount > 0 Then For i = 0 To c.RowCount - 1 c.Position = i cmd.Initialize cmd.Name = "insert_noventa_KELL" cmd.Parameters = Array As Object(c.GetString("NV_CLIENTE"),c.GetString("NV_FECHA"),c.GetString("NV_USER"),c.GetString("NV_MOTIVO"),c.GetString("NV_COMM"),c.GetString("NV_LAT"),c.GetString("NV_LON"), almacen, l_ruta) reqManager.ExecuteCommand(cmd , "inst_noventa_ins_noventa_kell") contador_env = contador_env + 1 Next c.Close End If D.Position=0 cuantos_noventa = D.GetString("CUANTOS_NOVENTA") D.Close ' --- 9. ENTREGA DOE --- c=B4XPages.MainPage.skmt.ExecQuery("SELECT PC_CLIENTE, PC_ENTREGA FROM PEDIDOS_DOE_ENTREGA") If c.RowCount>0 Then For i=0 To c.RowCount -1 c.Position=i cmd.Initialize cmd.Name = "UPDATE_PEDIDOS_DOE_ENTREGA" cmd.Parameters = Array As Object(C.GetString("PC_CLIENTE"),C.GetString("PC_ENTREGA"), almacen, l_ruta) reqManager.ExecuteCommand(cmd , "UPDATE_PEDIDOS_DOE_ENTREGA") Next c.Close End If ' --- 10. CHECK LIST VEHÍCULO --- c = B4XPages.MainPage.skmt.ExecQuery("SELECT * FROM TMP_INSPECCION_AUTO_DIARIA") If c.RowCount > 0 Then For i = 0 To c.RowCount - 1 c.Position = i cmd.Initialize cmd.Name = "INSERT_TMP_INSPECCION_AUTO_DIARIA" cmd.Parameters = Array As Object(C.GetString("TMP_AUTO_RUTA"), C.GetString("TMP_AUTO_PLACA"), C.GetString("TMP_AUTO_CEDIS"), C.GetString("TMP_AUTO_IDALMACEN"), C.GetString("TMP_AUTO_FECHA"), C.GetString("TMP_AUTO_KILOMETRAJE"), C.GetString("TMP_AUTO_COMBUSTIBLE"), C.GetString("TMP_AUTO_TABLERO"), C.GetString("TMP_AUTO_CLAXON"), C.GetString("TMP_AUTO_PARABRISAS"), C.GetString("TMP_AUTO_CINTURON"), C.GetString("TMP_AUTO_ESPEJOS"), C.GetString("TMP_AUTO_LICENCIA"), C.GetString("TMP_AUTO_LIB_OBJETOSINE"), C.GetString("TMP_AUTO_LIB_OBJETOTMPERVI"), C.GetString("TMP_AUTO_ORDEN_HERRA"), C.GetString("TMP_AUTO_UNILIMPIA"), C.GetString("TMP_AUTO_LIMPIO"), C.GetString("TMP_AUTO_BASURA"), C.GetString("TMP_AUTO_RESPONSABILIDAD"), C.GetString("TMP_AUTO_AUDITORIA"), C.GetString("TMP_AUTO_HABITUAL"), C.GetString("TMP_AUTO_HERRAMIENTAS"), C.GetString("TMP_AUTO_CONOS"), C.GetString("TMP_AUTO_EDO_CARROCERIA"), C.GetString("TMP_AUTO_FUN_LUCES"), C.GetString("TMP_AUTO_PLACAS_CIRCU"), C.GetString("TMP_AUTO_COND_LLANTAS"), C.GetString("TMP_AUTO_ACEITEMOTOR"), C.GetString("TMP_AUTO_ACEITEDIREC"), C.GetString("TMP_AUTO_NVL_REFRIGERANTE"), C.GetString("TMP_AUTO_NVL_LIQUIDBRISAS"), C.GetString("TMP_AUTO_COND_BANMOTOR"), C.GetString("TMP_AUTO_FUGASGRAL"), C.GetString("TMP_AUTO_FRENOS"), C.GetString("TMP_AUTO_COMENTARIOS"), foto1, foto2, foto3, foto4) reqManager.ExecuteCommand(cmd , "inst_noventa_ins_tmp_insp_auto") contador_env = contador_env + 1 Next c.Close End If End Sub Private Sub enviaPedidoCliente(filtro As String) ' PEDIO_CLIENTE Private condicion As String = "" If filtro <> "Todos" Then condicion = "where PC_ENVIADO = 0" Private cx As Cursor = B4XPages.MainPage.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}"$) If cx.RowCount > 0 Then For i = 0 To cx.RowCount - 1 cx.Position = i Dim cmd As DBCommand cmd.Initialize cmd.Name = "insert_pedidos_KELL" cmd.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,cx.GetString("PC_COSTO_SIN") ) reqManager.ExecuteCommand(cmd , $"ins_pedidos_${cx.GetString("PC_CLIENTE")}"$) contador_env = contador_env + 1 Next cx.Close End If End Sub Private Sub enviaPedido(filtro As String) ' PEDIDO Private condicion As String = "" If filtro <> "Todos" Then condicion = "where PE_ENVIADO = 0" ' PE_CEDIS = RECARGA para cliente 0 (ABORDO) B4XPages.MainPage.skmt.ExecNonQuery2("update PEDIDO set PE_CEDIS = ? where PE_CLIENTE =? AND PE_FOLIO IS NULL ", Array As Object("RECARGA", "0")) ' Asegura que PE_FOLIO no esté en 0 o 1 (se usa el rowid) B4XPages.MainPage.skmt.ExecNonQuery("UPDATE PEDIDO SET PE_FOLIO = rowid where PE_FOLIO = 0 or PE_FOLIO = 1") Private cPed As Cursor = B4XPages.MainPage.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 FROM PEDIDO ${condicion}"$) If cPed.RowCount > 0 Then For i = 0 To cPed.RowCount - 1 cPed.Position = i Dim cmd As DBCommand cmd.Initialize If PERFIL = "V-ESPECIAL" Then ' Lógica específica para V-ESPECIAL 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 cmd.Name = "insert_pedido_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")) End If reqManager.ExecuteCommand(cmd , $"ins_pedido_${cPed.GetString("PE_CLIENTE")}"$) contador_env = contador_env + 1 Next cPed.Close End If End Sub Sub JobDone(Job As HttpJob) Log("JOBDONE - " & almacen) ' 1. Tachamos el request de la lista If reqManager.reqsList.IsInitialized Then Dim index As Int = reqManager.reqsList.IndexOf(Job.tag) If index <> -1 Then reqManager.reqsList.RemoveAt(index) End If If Not(Job.Success) Then LogColor("Error en red: " & Job.tag & " : " & Subs.parseHTTPError(Job.ErrorMessage), Colors.Red) Else ' 2. Procesamos validaciones Dim RESULT As DBResult = reqManager.HandleJob(Job) If Job.JobName = "DBRequest" Then If RESULT.Tag = "valida_pedido" Then Subs.logJobDoneResultados(RESULT) For Each records() As Object In RESULT.Rows Dim CUANTOSP As Int = records(RESULT.Columns.Get("CUANTOSP")) B4XPages.MainPage.l_vProds2.Text = $"${CUANTOSP}/${cuantos_pedido}"$ ' Mantenemos tu lógica permisiva If cuantos_pedido <= CUANTOSP Then datos_iguales = "ok" Else LogColor("Faltan pedidos. Envíe nuevamente: " & CUANTOSP & "/" & cuantos_pedido, Colors.Red) End If Next Else If RESULT.Tag = "valida_pedidoc" Then Subs.logJobDoneResultados(RESULT) For Each records() As Object In RESULT.Rows Dim CUANTOSC As Int = records(RESULT.Columns.Get("CUANTOSC")) B4XPages.MainPage.l_vPedidos2.Text = $"${CUANTOSC}/${cuantos_pedidosc}"$ Next Else If RESULT.Tag = "valida_noventa" Then Subs.logJobDoneResultados(RESULT) For Each records() As Object In RESULT.Rows Dim CUANTOSN As Int = records(RESULT.Columns.Get("CUANTOSN")) B4XPages.MainPage.l_vNoVenta2.Text = $"${CUANTOSN}/${cuantos_noventa}"$ Next End If End If End If Job.Release ' 3. Control de flujo seguro If reqManager.reqsList.size = 0 Then B4XPages.MainPage.p_progressDialog.Visible = False If enviando Then enviando = False B4XPages.MainPage.l_progressDialog.Text = "Validando " B4XPages.MainPage.p_progressDialog.Visible = True Sleep(200) valida Else If validando Then validando = False Sleep(300) B4XPages.MainPage.p_validacion.Visible = True End If End If End Sub ' Lógica de validación forzada (simula T1_Tick) Private Sub T1_Tick valida ' t1.Enabled = False End Sub Sub valida Dim cmd As DBCommand cmd.Initialize cmd.Name = "select_cuantos_pedido_KELL" cmd.Parameters = Array As Object(almacen,l_ruta) reqManager.ExecuteQuery(cmd , 0, "valida_pedido") cmd.Initialize cmd.Name = "select_cuantos_noventa_KELL" cmd.Parameters = Array As Object(almacen,l_ruta) reqManager.ExecuteQuery(cmd , 0, "valida_noventa") cmd.Initialize cmd.Name = "select_cuantos_pedidoc_KELL" cmd.Parameters = Array As Object(almacen,l_ruta) reqManager.ExecuteQuery(cmd , 0, "valida_pedidoc") End Sub