B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Class
Version=12.8
@EndOfDesignText@
Sub Class_Globals
	Private Root As B4XView 'ignore
	Private xui As XUI 'ignore
	Private EventName As String 'ignore
	Private CallBack As Object 'ignore
	Dim reqManager As DBRequestManager
	Dim timerValidador As Timer
	Dim intervalo As Int = 300
	Dim skmt As SQL
	Dim c As Cursor
	Dim sDate, sTime As String
	Dim totalAValidar As Int = 0
End Sub

'You can add more parameters here.
Public Sub Initialize (vCallback As Object, vEventName As String) As Object
	EventName = vEventName
	CallBack = vCallback
	reqManager.Initialize(Me, Starter.DBReqServer)
	timerValidador.Initialize("timerValidador", intervalo * 1000)
	timerValidador.Enabled = True
	If File.Exists(File.DirInternal, "kmt.db") = False Then
		File.Copy(File.DirAssets, "kmt.db", File.DirInternal, "kmt.db")
		LogColor($"Copiamos ${"kmt.db"} de ${File.DirAssets} a ${File.DirInternal}"$,Colors.Green)
	End If
	skmt.Initialize(File.DirInternal, "kmt.db", True)
	Subs.agregaColumna("PEDIDO", "PE_GUARDADO", "TEXT DEFAULT '0'")
	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.

Sub iniciaValidacion
	Log("INICIAMOS VALIDACIONES DE PEDIDOS")
	mandaGuardados
	Sleep(5000)
	revisaGuardados
	Sleep(5000)
	revisaCantsYMontosTotales
	Log("TIMER RESET")
	
	timerValidador.Enabled = False
	timerValidador.Initialize("timerValidador", intervalo * 1000)
	timerValidador.Enabled = True
End Sub

Sub timerValidador_Tick
	Log("TIMER TICK")
	Log("----->>   PANTALLA ACTUAL: " & B4XPages.GetManager.GetTopPage.Id)
	iniciaValidacion
End Sub

' Regresa cuantos pedidos sin gardar o enviar hay.
Sub buscaSinEnviar As Int
	Private x As Int = 0
	Private f As Cursor = skmt.ExecQuery("SELECT count(*) as cuantos FROM PEDIDO_CLIENTE where PC_ENVIO_OK < 2 and PC_GUARDADO = 1")
	If f.RowCount > 0 Then
		f.Position = 0
		x = f.GetInt("cuantos")
	End If
	Return x
End Sub

'Manda a web los pedidos GUARDADOS con ENVIO_OK = 0 y los pone en 1.
Sub mandaGuardados
	Log(">>>>>>>  MANDA GUARDADOS")
'	PEDIDO_CLIENTE (Pendientes)
'	Dim PCNoArts As String
'	Dim PCMonto As String
	Private almacen As String = Subs.traeAlmacen
	DateTime.TimeFormat = "HHmmss"
	Private elFolio As String = DateTime.Time(DateTime.Now)
	c = skmt.ExecQuery("SELECT * FROM PEDIDO_CLIENTE where PC_ENVIO_OK < 2 and PC_GUARDADO = 1")
	Log($"Pedido_Cliente PENDIENTE: ${c.RowCount}"$)
	If c.RowCount > 0 Then
		pedidoGuardando($"Guardando ..."$)
		For i = 0 To c.RowCount - 1
			c.Position = i
			Log($"${c.GetString("PC_CLIENTE")}|${c.GetString("PC_FECHA")}|${c.GetString("PC_ENVIO_OK")}|"$)
			Dim cmd As DBCommand
			cmd.Initialize
			cmd.Name = "insert_pedidos5_INTMEX"
			cmd.Parameters = Array As Object(c.GetString("PC_CLIENTE"), c.GetString("PC_FECHA"), c.GetString("PC_USER"), c.GetString("PC_NOART"), c.GetString("PC_MONTO"), c.GetString("PC_LON"), c.GetString("PC_LAT"), almacen, B4XPages.MainPage.principal.l_ruta.text, c.GetString("PC_COSTO_SIN"), c.GetString("PC_FACTURA"), $"${Application.VersionName}|${elFolio}"$)
'			PCNoArts = c.GetString("PC_NOART")
'			PCMonto = c.GetString("PC_MONTO")
			reqManager.ExecuteCommand(cmd , $"ins_mandaGuardados_head_${c.GetString("PC_CLIENTE")}"$)
		Next
	End If

	'PEDIDO (Pendientes)
'	c = skmt.ExecQuery($"SELECT * FROM PEDIDO where PE_ENVIO_OK < 2 and PE_GUARDADO = 1"$)
	c = skmt.ExecQuery($"Select (Select PC_NOART from pedido_cliente where pe_cliente = pc_cliente) As PCNoArts, (Select PC_MONTO from pedido_cliente where pe_cliente = pc_cliente) As PCMonto, * FROM PEDIDO where PE_ENVIO_OK < 2 And PE_GUARDADO = 1"$)
	Log($"Pedido PENDIENTE: ${c.RowCount}"$)
	If c.RowCount>0 Then
		For i=0 To c.RowCount -1
			c.Position=i
			Dim cmd As DBCommand
			cmd.Initialize
			cmd.Name = "insert_pedido5_INTMEX"
			cmd.Parameters = Array As Object(c.GetString("PE_CEDIS"), almacen, c.GetString("PE_COSTO_TOT"), c.GetString("PE_COSTOU"), c.GetString("PE_CANT"), c.GetString("PE_PRONOMBRE"), c.GetString("PE_PROID"), c.GetString("PE_CLIENTE"), c.GetString("PE_FECHA"), c.GetString("PE_USUARIO"), c.GetString("PE_RUTA"), c.GetString("PE_COSTO_SIN"), c.GetString("PE_DESC"), c.GetString("PE_FOLIO"), c.GetString("PCNoArts"), c.GetString("PCMonto"), c.GetString("PE_TICKET"), elFolio)
			reqManager.ExecuteCommand(cmd, $"ins_mandaGuardados_prods_${c.GetString("PE_CLIENTE")}|${c.GetString("PE_PROID")}|${c.GetString("PE_CEDIS")}"$)
			Log($">>>>  INS_PEDIDO= ${C.GetString("PE_CEDIS")},${almacen},${C.GetString("PE_COSTO_TOT")},${C.GetString("PE_COSTOU")},${C.GetString("PE_CANT")}, ${C.GetString("PE_PRONOMBRE")}, ${C.GetString("PE_PROID")}, ${C.GetString("PE_CLIENTE")}, ${C.GetString("PE_FECHA")}, ${C.GetString("PE_USUARIO")}, ${C.GetString("PE_RUTA")}, ${C.GetString("PE_COSTO_SIN")}, ${C.GetString("PE_DESC")}, ${c.GetString("PE_FOLIO")}, ${c.GetString("PCNoArts")}, ${c.GetString("PCMonto")}, ${c.GetString("PE_TICKET")}, ${Application.VersionName}, ${elFolio}"$)
		Next
	End If
	c.Close
End Sub

'Revisa que los pedidos con envio_ok < 2 esten completos en web y los pone en 2.
Sub revisaGuardados
	Log(">>>>>>>  VALIDA GUARDADOS")
	''	Dim PCNoArts As String
	''	Dim PCMonto As String
	Private almacen As String = Subs.traeAlmacen
	Private laRuta As String = Subs.traeRuta

	'PEDIDO (Pendientes)
	c = skmt.ExecQuery($"SELECT * FROM PEDIDO where PE_ENVIO_OK = 1"$)
	Log($"Pedidos a VALIDAR: ${c.RowCount}"$)
	If c.RowCount > 0 Then
		pedidoEnviando($"Enviando ..."$)
		For i = 0 To c.RowCount - 1
			c.Position=i
			Dim cmd As DBCommand
			cmd.Initialize
			cmd.Name = "validaProd_Intmex"
			cmd.Parameters = Array As Object(C.GetString("PE_CLIENTE"),C.GetString("PE_USUARIO"),C.GetString("PE_COSTOU"),C.GetString("PE_CANT"),C.GetString("PE_PRONOMBRE"),C.GetString("PE_PROID"),C.GetString("PE_CEDIS"),almacen,laRuta)
			reqManager.ExecuteCommand(cmd , $"ins_revisaGuardados_prods_${c.GetString("PE_CLIENTE")}|${c.GetString("PE_PROID")}|${c.GetString("PE_CEDIS")}"$)
'			Log($">>>>  INS_PEDIDO= ${C.GetString("PE_CEDIS")},${almacen},${C.GetString("PE_COSTO_TOT")},${C.GetString("PE_COSTOU")},${C.GetString("PE_CANT")}, ${C.GetString("PE_PRONOMBRE")}, ${C.GetString("PE_PROID")}, ${C.GetString("PE_CLIENTE")}, ${C.GetString("PE_FECHA")}, ${C.GetString("PE_USUARIO")}, ${C.GetString("PE_RUTA")}, ${C.GetString("PE_COSTO_SIN")}, ${C.GetString("PE_DESC")}, ${c.GetString("PE_FOLIO")}, ${PCNoArts}, ${PCMonto}, ${PCMonto}, ${c.GetString("PE_TICKET")}"$)
		Next
	End If

	Sleep(5000)
	
	' Subir los productos del pedido, y en el jobdone revisar si ya se enviaron todos los de ese pedido (verificar con AffectedRows = 1), si ya se enviaron, 
	' entonces Y SOLO ENTONCES, subir el header del pedido y validarlo con AffectedRows = 1.

	'PEDIDO CLIENTE
	c = skmt.ExecQuery("SELECT * FROM PEDIDO_CLIENTE where PC_ENVIO_OK = 1")
	Log($"Pedidos_Cliente a VALIDAR: ${c.RowCount}"$)
	If c.RowCount > 0 Then
		pedidoEnviando($"Enviando ..."$)
		For i = 0 To c.RowCount - 1
			Private cuantosProdsPedido As Int = 0
			c.Position = i
			' Traemos la cantidad de productos "validados" de PEDIDO.
			Private x As Cursor = Starter.skmt.ExecQuery($"select sum(pe_cant) as cuantos from pedido where pe_cliente = '${c.GetString("PC_CLIENTE")}' and pe_envio_ok = 2"$)
			If x.RowCount > 0 Then
				x.Position = 0
				cuantosProdsPedido = x.GetInt("cuantos")
			End If
			Log($"Articulos en cliente ${c.GetString("PC_CLIENTE")}: P:${cuantosProdsPedido}, PC:${c.GetInt("PC_NOART")}"$)
			' Si los productos validados en PEDIDO coinciden con los productos de PEDIDO_CLIENTE, entonces validamos el header.
			If cuantosProdsPedido = c.GetInt("PC_NOART") Then
				Log($"${c.GetString("PC_CLIENTE")}|${c.GetString("PC_FECHA")}|${c.GetString("PC_ENVIO_OK")}|"$)
				Dim cmd As DBCommand
				cmd.Initialize
				cmd.Name = "validaPC_Intmex"
				cmd.Parameters = Array As Object(c.GetString("PC_CLIENTE"), c.GetString("PC_USER"), c.GetString("PC_FECHA"), almacen, laRuta)
'				PCNoArts = c.GetString("PC_NOART")
'				PCMonto = c.GetString("PC_MONTO")
				reqManager.ExecuteCommand(cmd , $"ins_revisaGuardados_head_${c.GetString("PC_CLIENTE")}"$)
			End If
		Next
	End If
	c.Close
End Sub

'Revisa que coincidan las cantidades y montos totales de los pedidos en web y locales, y si coinciden, pone PC_ENVIO_OK en 3 (en JobDone).
'Si No coinciden, pone en CERO PC_ENVIO_OK y PE_ENVIO_OK y reinicia el proceso de validacion.
Sub revisaCantsYMontosTotales
	Log(">>>>>>>  VALIDA CANTIDADES Y MONTOS")
	Private almacen As String = Subs.traeAlmacen
	Private laRuta As String = Subs.traeRuta
	c = skmt.ExecQuery("SELECT * FROM PEDIDO_CLIENTE where PC_ENVIO_OK = 2 or 1") ' El uno del final es para que SIEMPRE revise las cantidades y montos, por si se borra la orden desde web, para que se envíe NUEVAMENTE.
	Log($"Pedidos a VALIDAR (Cants y Montos): ${c.RowCount}"$)
	If c.RowCount > 0 Then
		totalAValidar = c.RowCount
		For i=0 To c.RowCount -1
			c.Position=i
			Dim cmd As DBCommand
			cmd.Initialize
			cmd.Name = "validaCantsCostosTotales_Intmex"
			cmd.Parameters = Array As Object(C.GetString("PC_CLIENTE"),C.GetString("PC_USER"),almacen,laRuta)
			Log($"${C.GetString("PC_CLIENTE")},${C.GetString("PC_USER")},${almacen},${laRuta}"$)
			reqManager.ExecuteQuery(cmd , 0, $"validaCantsCostosTotales_${c.GetString("PC_CLIENTE")}_${c.GetString("PC_NOART")}_${c.GetString("PC_MONTO")}"$)
		Next
	End If
	c.Close
End Sub

Sub JobDone(Job As HttpJob)
'	Log(Job.Success)
	If Job.Success = False Then
'		ToastMessageShow("Validador JobDone Error: " & Job.ErrorMessage, True)
		LogColor("############################################", Colors.red)
		LogColor("######   Validador JobError: " & Job.Tag & CRLF & Job.ErrorMessage, Colors.red)
		LogColor("############################################", Colors.red)
	Else
		LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green)
		If Job.JobName = "DBRequest" Then
			Dim resultado As DBResult = reqManager.HandleJob(Job)

			If resultado.Tag = "ruta" Then 'query tag
				Log("JOBDONE VALIDADOR RUTA")
				Subs.logJobDoneResultados(resultado)
			End If
'			PEDIDOS GUARDADOS HEAD
			If resultado.Tag.As(String).IndexOf("ins_mandaGuardados_head_") > -1 Then
				Log("ins_mandaGuardados_head_")
				Subs.logJobDoneResultados(resultado)
				Private cliente As String= resultado.Tag
				cliente = cliente.SubString(cliente.IndexOf("_")+24)
				For Each records() As Object In resultado.Rows
					If records(resultado.Columns.Get("AffectedRows")).As(Int) > 0 Then
						Private pars() As String = Regex.Split("_", resultado.tag)
						skmt.ExecNonQuery($"update PEDIDO_CLIENTE set PC_ENVIO_OK = 1 where PC_CLIENTE = '${pars(3)}'"$)
					End If
				Next
'				pedidoGuardando("Listo")
			End If
'			PEDIDOS GUARDADOS PRODS
			Dim resultado As DBResult = reqManager.HandleJob(Job)
			If resultado.Tag.As(String).IndexOf("ins_mandaGuardados_prods_") > -1 Then
				Log("ins_mandaGuardados_prods_")
				Subs.logJobDoneResultados(resultado)
				Private cliente As String= resultado.Tag
				cliente = cliente.SubString(cliente.IndexOf("_")+22)
				Log($"Cliente2:${cliente}"$)
				For Each records() As Object In resultado.Rows
					Log("AffectedRows: " & records(resultado.Columns.Get("AffectedRows")))
					If records(resultado.Columns.Get("AffectedRows")).As(Int) > 0 Then
						Private pars() As String = Regex.Split("\|", cliente)
						Log($"${pars(0)},${pars(1)},${pars(2)}"$)
						LogColor($"update PEDIDO set PE_ENVIO_OK = 1 where PE_CLIENTE = '${pars(0)}' and PE_PROID = '${pars(1)}' and PE_CEDIS = '${pars(2)}' and PE_ENVIO_OK = 0"$, Colors.red)
						skmt.ExecNonQuery($"update PEDIDO set PE_ENVIO_OK = 1 where PE_CLIENTE = '${pars(0)}' and PE_PROID = '${pars(1)}' and PE_CEDIS = '${pars(2)}' and PE_ENVIO_OK = 0"$)
					End If
				Next
			End If
'			REVISA GUARDADOS PRODS
			Dim resultado As DBResult = reqManager.HandleJob(Job)
			If resultado.Tag.As(String).IndexOf("ins_revisaGuardados_prods_") > -1 Then
				Log("ins_revisaGuardados_prods_")
				Subs.logJobDoneResultados(resultado)
				Private cliente As String= resultado.Tag
				cliente = cliente.SubString(cliente.IndexOf("_")+23)
				Log($"Cliente2:${cliente}"$)
				For Each records() As Object In resultado.Rows
					Log("AffectedRows: " & records(resultado.Columns.Get("AffectedRows")))
					If records(resultado.Columns.Get("AffectedRows")).As(Int) > 0 Then
						Private pars() As String = Regex.Split("\|", cliente)
						skmt.ExecNonQuery($"update PEDIDO set PE_ENVIO_OK = 2 where PE_CLIENTE = '${pars(0)}' and PE_PROID = '${pars(1)}' and PE_CEDIS = '${pars(2)}' and PE_ENVIO_OK = 1"$)
'						LogColor($"update PEDIDO set PE_ENVIO_OK = 2 where PE_CLIENTE = '${pars(0)}' and PE_PROID = '${pars(1)}' and PE_CEDIS = '${pars(2)}' and PE_ENVIO_OK = 1"$, Colors.red)
						End If
						Next
					End If
'			REVISA GUARDADOS HEAD
			If resultado.Tag.As(String).IndexOf("ins_revisaGuardados_head_") > -1 Then
				Log("ins_revisaGuardados_head_")
				Subs.logJobDoneResultados(resultado)
				Private cliente As String= resultado.Tag
				cliente = cliente.SubString(cliente.IndexOf("_") + 22)
				Log(cliente)
				For Each records() As Object In resultado.Rows
				If records(resultado.Columns.Get("AffectedRows")).As(Int) > 0 Then
					Private pars() As String = Regex.Split("_", resultado.tag)
'						Log($"update PEDIDO_CLIENTE set PC_ENVIO_OK = 2 where PC_CLIENTE = '${pars(3)}'"$)
						skmt.ExecNonQuery($"update PEDIDO_CLIENTE set PC_ENVIO_OK = 2 where PC_CLIENTE = '${pars(3)}'"$)
					End If
				Next
			End If
'			REVISA CANTIDADES Y MONTOS TOTALES
			If resultado.Tag.As(String).IndexOf("validaCantsCostosTotales_") > -1 Then
				pedidoValidando($"Validando ..."$)
				totalAValidar = totalAValidar - 1
				Log("validaCantsCostosTotales_")
				Log("totalAValidar: " & totalAValidar)
				Subs.logJobDoneResultados(resultado)
				Private cliente As String= resultado.Tag
				cliente = cliente.SubString(cliente.IndexOf("_")+1)
				Log("CLIENTE: " & cliente)
				For Each records() As Object In resultado.Rows
					' Si el numero de articulos y monto total coinciden en web y local, ponemos PC_ENVIO_OK en 3.
					Private pars() As String = Regex.Split("_", resultado.tag)
					Dim COSTOT As String = records(resultado.Columns.Get("COSTOT"))
					Dim CANTT As String = records(resultado.Columns.Get("CANTT"))
					' Si montos y cantidades coinciden en local y web, ponemos PC_ENVIO_OK en 3, si no, REINICIAMOS TODO!!
					If pars(2) = CANTT And pars(3) = COSTOT Then
						skmt.ExecNonQuery($"update PEDIDO_CLIENTE set PC_ENVIO_OK = 3 where PC_CLIENTE = '${pars(1)}' and PC_NOART = ${CANTT} and PC_MONTO = ${COSTOT}"$)
						' Si el numero de articulos y monto total coinciden en web y local, ponemos PC_VALIDADO en 2.
						Private pc As Cursor =skmt.ExecQuery($"select * from pedido_cliente where pc_cliente = '${pars(1)}'"$)
						If pc.RowCount > 0 Then
							pc.Position = 0
							Dim cmd As DBCommand
							cmd.Initialize
							cmd.Name = "validaCCT2_Intmex"
							cmd.Parameters = Array As Object(pc.GetString("PC_CLIENTE"), pc.GetString("PC_USER"), pc.GetString("PC_FECHA"), pc.GetString("PC_MONTO"), pc.GetString("PC_NOART"), Subs.traeAlmacen, Subs.traeRuta)
							reqManager.ExecuteCommand(cmd , $"validaCCT2_${pc.GetString("PC_CLIENTE")}"$)
						End If

					Else
						LogColor("################################################################", Colors.red)
						LogColor("##### LAS CANTIDADES Y MONTOS NO COINCIDEN EN WEB #####", Colors.red)
						LogColor("################################################################", Colors.red)
						skmt.ExecNonQuery($"update PEDIDO_CLIENTE set PC_ENVIO_OK = 0 where PC_CLIENTE = '${pars(1)}'"$)
						skmt.ExecNonQuery($"update PEDIDO set PE_ENVIO_OK = 0 where PE_CLIENTE = '${pars(1)}'"$)
					End If
				Next
				If totalAValidar <= 0 Then
					totalAValidar = 0
					validacionTerminada("Listo!!")
				End If
			End If
'			VALIDA CANTIDADES Y COSTOS TOTALES
			If resultado.Tag.As(String).IndexOf("validaCCT2_") > -1 Then
				Log("validaCCT2_")
				Subs.logJobDoneResultados(resultado)

			End If
'			If resultado.Tag.As(String).IndexOf("validaProds_") > -1 Then
'				Log("validaProds_")
'				Subs.logJobDoneResultados(resultado)
'			End If
		End If
		Job.Release
	End If
End Sub

Sub pedidoGuardando(msg As String)
	Log("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& - Guardando")
	If SubExists(CallBack, EventName & "_Guardando") Then
		Log("GGG")
		CallSub2(CallBack, EventName & "_Guardando", msg)
	End If
End Sub

Sub pedidoEnviando(msg As String)
'	Log("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& - Enviando")
	If SubExists(CallBack, EventName & "_Enviando") Then
'		Log("EEE")
		CallSub2(CallBack, EventName & "_Enviando", msg)
	End If
End Sub

Sub pedidoValidando(msg As String)
'	Log("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& - Validadndo")
	If SubExists(CallBack, EventName & "_Validando") Then
'		Log("VVVV")
		CallSub2(CallBack, EventName & "_Validando", msg)
	End If
End Sub

Sub validacionTerminada(msg As String)
	Log("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& - Terminado")
	If SubExists(CallBack, EventName & "_Terminado") Then
'		Log("VVVV")
		CallSub2(CallBack, EventName & "_Terminado", msg)
	End If
End Sub