B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Service
Version=9.85
@EndOfDesignText@
#Region  Service Attributes 
	#StartAtBoot: False
	#ExcludeFromLibrary: True
#End Region

Sub Process_Globals
	'These global variables will be declared once when the application starts.
	'These variables can be accessed from all modules.
	Public rp As RuntimePermissions
	Dim reqManager As DBRequestManager
	Dim skmt, errorLog As SQL
	Dim ruta As String
	Public BluetoothState As Boolean
	Dim btAdmin As BluetoothAdmin
	Dim intentosImpresora As Int = 0
	Dim revisandoImpresora As Boolean = False
	Public FLP As FusedLocationProvider
	Dim GPS As GPS
	'Para ENVIA_ULTIMA_GPS
	Dim Timer1 As Timer
	Dim Interval As Int = 300
	Dim server As String
	Dim pe As PhoneEvents
	Dim ph As Phone
	Dim marcaCel As String = ph.manufacturer
	Dim rutaTipo As String = "TRADICIONAL"
	'Para los Logs
	Dim logs As StringBuilder
	Private logcat As LogCat
	Dim rutaV As String = ""
	Dim montoActual, clientesTotal, clientesVenta, clientesVisitados, almacen, rutaPreventa, CANTIDADPROD As String 'ignore
	Dim lat_gps, lon_gps As String
	Dim ubicacionActual As Location
	Dim FECHA_HOY As String
	Dim usuario As String
	Dim tipov As String
	Dim MAC_IMPRESORA As String
	Dim batt As Int
	Dim ultimaActualizacionGPS As String = 235959 '
	Dim fechaRuta As String 'ignore
	Dim tiempos As Map
	Dim Logger As Boolean
	Dim ultimaActividad As String = ""
	Dim boleta As String = 0
	Dim sesion As Map
	Dim ultima_back_productos As String = 0
End Sub

Sub Service_Create
	'This is the program entry point.
	'This is a good place to load resources that are not specific to a single activity.
	If Logger Then LogColor("'/////////////////////////////////////////////////////////////////////////////////////////////", Colors.Green)
	If Logger Then LogColor("'/////////////////////////////////////   Iniciamos Starter  /////////////////////////////////", Colors.Green)
	If Logger Then LogColor("'/////////////////////////////////////////////////////////////////////////////////////////////", Colors.Green)
	Timer1.Initialize("Timer1", Interval * 1000)
	Timer1.Enabled = True
	GPS.Initialize("GPS")
	ubicacionActual.Initialize
	pe.Initialize("pe") 'Para obtener la bateria
	ruta = File.DirInternal
	If File.Exists(ruta, "kmt.db") = False Then
		File.Copy(File.DirAssets, "kmt.db", ruta, "kmt.db")
	End If
	skmt.Initialize(ruta,"kmt.db", True)
	'Para los Logs
	#if RELEASE
	logcat.LogCatStart(Array As String("-v","raw","*:F","B4A:v"), "logcat")
	#end if
	logs.Initialize
	server = "http://keymon.lat:1782"
'	server = "http://10.0.0.205:1782"
'	server = "http://11.0.0.29:1782"
	If Logger Then Log($"Starter reqManager server: ${server}"$)
	Logger = True
	sesion.Initialize
End Sub

Sub Service_Start (StartingIntent As Intent)
	Service.StopAutomaticForeground 'Starter service can start in the foreground state in some edge cases.
	reqManager.Initialize(Me, server)
	Subs.revisaBD
	#if DEBUG
		Logger = True
	#else
		Logger = False
	#End If
	
End Sub

Sub Service_TaskRemoved
	'This event will be raised when the user removes the app from the recent apps list.
	Timer1.Enabled=False
End Sub

'Return true to allow the OS default exceptions handler to handle the uncaught exception. 'Para los Logs
Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
	'wait for 500ms to allow the logs to be updated.
	Dim jo As JavaObject
	Dim l As Long = 500: jo.InitializeStatic("java.lang.Thread").RunMethod("sleep", Array(l)) 'Sleep 500ms
	logcat.LogCatStop
	logs.Initialize
	logs.Append("Ver " & Application.VersionName & CRLF)
	logs.Append("R:" & rutaV & CRLF)
	logs.Append(StackTrace)
	Subs.revisaBD
	Subs.errorLog.ExecNonQuery2("INSERT INTO errores(fecha, error) VALUES (?,?)", Array As Object (Subs.fechaKMT(DateTime.now), logs))
	StartActivity(errorManager)
	Return True
End Sub

Sub Service_Destroy
'	Timer1.Enabled=False
	If Logger Then LogColor("starter destroyed", Colors.red)
End Sub

Sub pe_BatteryChanged (Level As Int, Scale As Int, Plugged As Boolean, Intent As Intent)
	batt=Level
End Sub

Private Sub Timer1_Tick
'	ToastMessageShow("Timer",False)
	If Logger Then Log("Siguiente actualizacion " & DateTime.Time(DateTime.Now + Interval * 1000))
	ENVIA_ULTIMA_GPS   'Comentado para que no estorbe hasta que no esten los queries correctos en el config.properties
End Sub

Sub reinicializaReqManager
	reqManager.Initialize(Me, server)
	If Logger Then Log(server)
End Sub

Sub ENVIA_ULTIMA_GPS
	If Not(skmt.IsInitialized) Then skmt.Initialize(ruta,"kmt.db", True)
	If Logger Then Log("Iniciamos ENVIA_ULTIMA_GPS")
	DateTime.TimeFormat = "HHmmss"
	ultimaActualizacionGPS = DateTime.Time(DateTime.Now)
	Private s As Cursor=skmt.ExecQuery2("select CAT_VA_VALOR as semana from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("SEMANA")) 'Traemos la semana.
	If s.RowCount> 0 Then 
		s.Position=0
		Private laSemana As String = s.GetString("semana")
	Else
		Private laSemana As String = ""
	End If

	Private cpv As Cursor=skmt.ExecQuery2("select  count(*) as CUANTOS from kmt_info where  CAT_CL_DIAS_VISITA = (SELECT CAT_VA_VALOR FROM CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?) and cat_cl_codigo <> 0 AND CAT_CL_TIPO_RUTA IN (?,?)  ORDER BY CAT_CL_NUM_SERIEFISICO", Array As String("DIA_VISITA", laSemana, "SEMANAL"))'Traemos los clientes a visitar hoy.
	cpv.Position=0
	Private clientesVisitaHoy As String=cpv.GetString("CUANTOS")
	If lat_gps = 0 Or lat_gps = Null Then 'Si latitud es CERO o NULL traemos las ultimas coordenadas de la base de datos.
		Private coords As List = Subs.traeCoordsDeBD
		lat_gps = coords.Get(0)
		lon_gps = coords.Get(1)
	End If
	s.Close
	cpv.Close
	Private rtec, ping, salty As String
'	Log(Application.VersionName)
	Subs.dameClientesFueraDeFrecuencia
	Private h As Cursor
	For Each i As String In Array As String ("RTEC", "PING", "SALTY SNACKS")
		h=skmt.ExecQuery2("Select sum(PE_COSTO_TOT) As MONTO_DIA from pedido where PE_CLIENTE <> 0 and pe_proid in (Select CAT_GP_ID from cat_gunaprod2 where CAT_GP_TIPO = ? )", Array As String(i))
		Private x As String = 0
		If h.RowCount > 0 Then
			h.Position = 0
			x = $"$1.3{h.GetString("MONTO_DIA")}"$
		End If
		x = $"$1.3{x}"$
		If x="NaN" Then X = "0"
		If i = "RTEC" Then rtec = x
		If i = "PING" Then ping = x
		If i = "SALTY SNACKS" Then salty = x
	Next
	h.Close
'
'	Dim cmd As DBCommand
'	cmd.Initialize
'	cmd.Name = "UPDATE_KELL_ACTUAL4_GPS"
'	cmd.Parameters = Array As Object(montoActual, clientesVisitaHoy, clientesVenta, clientesVisitados, lat_gps, lon_gps, batt, 0, 0, 0, Application.VersionName,  rtec, ping, salty, Subs.dameClientesFueraDeFrecuencia,pedodo_doe almacen, rutaPreventa)
'	If Logger Then LogColor(montoActual&","&clientesVisitaHoy&","&clientesVenta&","&clientesVisitados&","&lat_gps&","&lon_gps&","&batt&","&0&","&0&","&0&","&Application.VersionName&","&rtec&","&ping&","&salty&","& Subs.dameClientesFueraDeFrecuencia&","&almacen&","&rutaPreventa, Colors.Magenta)
'	reqManager.ExecuteCommand(cmd,"updateKell_UTR")

	Dim cmd As DBCommand
	cmd.Initialize
	cmd.Name = "UPDATE_KELL_ACTUAL3_GPS"
	cmd.Parameters = Array As Object(montoActual, clientesVisitados, clientesVenta, clientesVisitaHoy, lat_gps, lon_gps, batt, 0, 0, 0, Application.VersionName,  rtec, ping, salty, Subs.dameClientesFueraDeFrecuencia, almacen, rutaPreventa)
	If Logger Then LogColor(montoActual&","&clientesVisitaHoy&","&clientesVenta&","&clientesVisitados&","&lat_gps&","&lon_gps&","&batt&","&0&","&0&","&0&","&Application.VersionName&","&rtec&","&ping&","&salty&","& Subs.dameClientesFueraDeFrecuencia&","&almacen&","&rutaPreventa, Colors.Magenta)
	reqManager.ExecuteCommand(cmd,"updateKell_UTR")
'	Log("GPS ACTUALIZACION: " & montoActual&","&clientesVisitaHoy&","&clientesVenta&","&clientesVisitados&","&lat_gps&","&lon_gps&","&batt&","&0&","&0&","&0&","&Application.VersionName&","&rtec&","&ping&","&salty&","& Subs.dameClientesFueraDeFrecuencia&","&almacen&","&rutaPreventa)
'	If Logger Then Log(reqManager)
'	If Logger Then Log("++ ++ ++ Envia_Ultima GPS - Inst_visitas - server: "& server)
	skmt.ExecNonQuery2("Update cat_variables set CAT_VA_VALOR = ?  WHERE CAT_VA_DESCRIPCION = ?" , Array As String(DateTime.Time(DateTime.Now),"HoraIngreso"))
	'Reiniciamos el timer para cuando llamamos el Sub desde otra actividad
	Timer1.Enabled = False
	Timer1.Interval = Interval * 1000
	Timer1.Enabled = True
End Sub

Sub JobDone(Job As HttpJob)
	If Job.Success = False Then
'		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 Job.JobName = "DBRequest" Then
			Dim result As DBResult = reqManager.HandleJob(Job)
			If result.Tag = "updateKell_UTR" Then 'query tag
				For Each records() As Object In result.Rows
					For Each k As String In result.Columns.Keys
						If Logger Then Log("Ubicacion en tiempo real: " & k & ": " & records(result.Columns.Get(k)))
					Next
				Next
			End If
		End If
	End If
	Job.Release
End Sub

'Para los Logs
Private Sub logcat_LogCatData (Buffer() As Byte, Length As Int)
	logs.Append(BytesToString(Buffer, 0, Length, "utf8"))
	If logs.Length > 4000 Then
		logs.Remove(0, logs.Length - 2000) 'Obtenemos log de 2000 ~ 4000 chars
	End If
End Sub

'Revisa que la conexion a la base de datos este bien.
Sub revisaBD 'ignore
	If Logger Then Log("revisaBD")
	If Not(File.Exists(ruta, "kmt.db")) Then File.Copy(File.DirAssets, "kmt.db", ruta, "kmt.db")
	If Not(skmt.IsInitialized) Then skmt.Initialize(ruta, "kmt.db", True)
End Sub
