Files
DBCheck/B4A/C_Kelloggs.bas

400 lines
19 KiB
QBasic

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
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
' 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
' El callback se maneja aquí, ya que 'Me' fue C_Kelloggs en la inicialización del reqManager
Sub JobDone(Job As HttpJob)
Log("JOBDONE KELLOGGS")
' Lógica para manejar errores y remover de reqsList
' reqManager.trackNext(Job)
If Not(Job.Success) Then
LogColor("Error: " & Job.tag & " : " & Subs.parseHTTPError(Job.ErrorMessage), Colors.red)
Else ' Si Job.Success es True
Dim RESULT As DBResult = reqManager.HandleJob(Job)
LogColor("JobDone: '" & RESULT.tag & "' - Registros: " & RESULT.Rows.Size, Colors.Green)
If Job.JobName = "DBRequest" Then
' Manejo de comandos de INSERCIÓN (Actualización de estados en DB local)
If RESULT.Tag.As(String).StartsWith("ins_pedido_") Then ' Procesa insert_pedido_KELL
Private temp() As String = Regex.Split("_", RESULT.Tag)
If temp.Length > 1 Then
B4XPages.MainPage.skmt.ExecNonQuery($"update pedido set pe_enviado = 1 where pe_cliente = '${temp(2)}'"$)
End If
Else If RESULT.Tag.As(String).StartsWith("ins_pedidos_") Then ' Procesa insert_pedidos_KELL (Cabeceras)
Private temp() As String = Regex.Split("_", RESULT.Tag)
If temp.Length > 1 Then
B4XPages.MainPage.skmt.ExecNonQuery($"update pedido_cliente set pc_enviado = 1 where pc_cliente = '${temp(2)}'"$)
End If
Else If RESULT.Tag = "valida_pedido" Then ' Procesa select_cuantos_pedido_KELL
' Lógica de validación de pedidos (productos)
For Each records() As Object In RESULT.Rows
Dim CUANTOSP As Int = records(RESULT.Columns.Get("CUANTOSP"))
If cuantos_pedido <= CUANTOSP Then
Log($"Validación Pedidos OK: ${CUANTOSP}/${cuantos_pedido}"$)
Else
LogColor($"Validación Pedidos FALLÓ: ${CUANTOSP}/${cuantos_pedido}. Se requiere reenvío."$, Colors.Red)
End If
Next
Else If RESULT.Tag = "valida_pedidoc" Then ' Procesa select_cuantos_pedidoc_KELL
' Lógica de validación de pedidos cliente (cabeceras)
For Each records() As Object In RESULT.Rows
Dim CUANTOSC As Int = records(RESULT.Columns.Get("CUANTOSC"))
If cuantos_pedidosc = CUANTOSC Then
Log($"Validación Pedidos Cliente OK: ${CUANTOSC}/${cuantos_pedidosc}"$)
Else
LogColor($"Validación Pedidos Cliente FALLÓ: ${CUANTOSC}/${cuantos_pedidosc}. Se requiere reenvío."$, Colors.Red)
End If
Next
Else If RESULT.Tag = "valida_noventa" Then ' Procesa select_cuantos_noventa_KELL
' Lógica de validación de no venta
For Each records() As Object In RESULT.Rows
Dim CUANTOSN As Int = records(RESULT.Columns.Get("CUANTOSN"))
If cuantos_noventa = CUANTOSN Then
Log($"Validación NoVenta OK: ${CUANTOSN}/${cuantos_noventa}"$)
Else
LogColor($"Validación NoVenta FALLÓ: ${CUANTOSN}/${cuantos_noventa}. Se requiere reenvío."$, Colors.Red)
End If
Next
End If
End If
End If
Job.Release
' Lógica de finalización: Inicia la validación al terminar todos los envíos
If reqManager.reqsList.Size = 0 Then
If PASO = "1" Then ' Si terminamos la fase de envío
PASO = "2"
Dim t1 As Timer
t1.Initialize("T1", 2000)
t1.Enabled = True
Log("Envío finalizado. Se inicia TIMER T1 para validación.")
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