From 79d74e2fdb86859d557510e217a27502bd105142 Mon Sep 17 00:00:00 2001 From: Jose Alberto Guerra Ugalde Date: Sat, 23 Mar 2024 13:07:32 -0600 Subject: [PATCH] Commit inicial --- .gitignore | 2 + B4A/B4x_Transition.bas | 223 +++++ B4A/BatteryUtilities.bas | 126 +++ B4A/C_UpdateAvailable.bas | 74 ++ B4A/C_principal.bas | 1717 ++++++++++++++++++++++++++++++++++++ B4A/C_supervisor.bas | 1507 +++++++++++++++++++++++++++++++ B4A/CameraExClass.bas | 403 +++++++++ B4A/CameraExClass2.bas | 398 +++++++++ B4A/DBRequestManager.bas | 272 ++++++ B4A/Files/alert2.png | Bin 0 -> 632 bytes B4A/Files/atras.png | Bin 0 -> 3208 bytes B4A/Files/camara.png | Bin 0 -> 2130 bytes B4A/Files/derecha.png | Bin 0 -> 8551 bytes B4A/Files/engranes.png | Bin 0 -> 8887 bytes B4A/Files/frintal.png | Bin 0 -> 3236 bytes B4A/Files/from2.png | Bin 0 -> 7439 bytes B4A/Files/gabinete.jpg | Bin 0 -> 19549 bytes B4A/Files/gabinete.png | Bin 0 -> 13242 bytes B4A/Files/gabinete1.png | Bin 0 -> 19549 bytes B4A/Files/gestion.bal | Bin 0 -> 14178 bytes B4A/Files/gestion_sup.bal | Bin 0 -> 26920 bytes B4A/Files/gestiones.bal | Bin 0 -> 3901 bytes B4A/Files/izquierda.png | Bin 0 -> 8613 bytes B4A/Files/kmt.db | Bin 0 -> 16384 bytes B4A/Files/login.bal | Bin 0 -> 9846 bytes B4A/Files/mainpage.bal | Bin 0 -> 2605 bytes B4A/Files/mas.png | Bin 0 -> 550 bytes B4A/Files/menos.png | Bin 0 -> 468 bytes B4A/Files/principal.bal | Bin 0 -> 17261 bytes B4A/Files/qr.png | Bin 0 -> 1151 bytes B4A/Files/roit.png | Bin 0 -> 23498 bytes B4A/Files/supervisor.bal | Bin 0 -> 12610 bytes B4A/FirebaseMessaging.bas | 253 ++++++ B4A/Gabinete roit.b4a | 166 ++++ B4A/Gabinete roit.b4a.meta | 51 ++ B4A/QRGenerator.bas | 491 +++++++++++ B4A/Starter.bas | 120 +++ B4A/Subs.bas | 67 ++ B4A/Tracker.bas | 254 ++++++ B4A/appUpdater.bas | 282 ++++++ B4A/login.bas | 395 +++++++++ B4XMainPage.bas | 110 +++ gitpull.bat | 1 + 43 files changed, 6912 insertions(+) create mode 100644 .gitignore create mode 100644 B4A/B4x_Transition.bas create mode 100644 B4A/BatteryUtilities.bas create mode 100644 B4A/C_UpdateAvailable.bas create mode 100644 B4A/C_principal.bas create mode 100644 B4A/C_supervisor.bas create mode 100644 B4A/CameraExClass.bas create mode 100644 B4A/CameraExClass2.bas create mode 100644 B4A/DBRequestManager.bas create mode 100644 B4A/Files/alert2.png create mode 100644 B4A/Files/atras.png create mode 100644 B4A/Files/camara.png create mode 100644 B4A/Files/derecha.png create mode 100644 B4A/Files/engranes.png create mode 100644 B4A/Files/frintal.png create mode 100644 B4A/Files/from2.png create mode 100644 B4A/Files/gabinete.jpg create mode 100644 B4A/Files/gabinete.png create mode 100644 B4A/Files/gabinete1.png create mode 100644 B4A/Files/gestion.bal create mode 100644 B4A/Files/gestion_sup.bal create mode 100644 B4A/Files/gestiones.bal create mode 100644 B4A/Files/izquierda.png create mode 100644 B4A/Files/kmt.db create mode 100644 B4A/Files/login.bal create mode 100644 B4A/Files/mainpage.bal create mode 100644 B4A/Files/mas.png create mode 100644 B4A/Files/menos.png create mode 100644 B4A/Files/principal.bal create mode 100644 B4A/Files/qr.png create mode 100644 B4A/Files/roit.png create mode 100644 B4A/Files/supervisor.bal create mode 100644 B4A/FirebaseMessaging.bas create mode 100644 B4A/Gabinete roit.b4a create mode 100644 B4A/Gabinete roit.b4a.meta create mode 100644 B4A/QRGenerator.bas create mode 100644 B4A/Starter.bas create mode 100644 B4A/Subs.bas create mode 100644 B4A/Tracker.bas create mode 100644 B4A/appUpdater.bas create mode 100644 B4A/login.bas create mode 100644 B4XMainPage.bas create mode 100644 gitpull.bat diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..af94e9d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +**/Objects +**/AutoBackups \ No newline at end of file diff --git a/B4A/B4x_Transition.bas b/B4A/B4x_Transition.bas new file mode 100644 index 0000000..77eb2ee --- /dev/null +++ b/B4A/B4x_Transition.bas @@ -0,0 +1,223 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=StaticCode +Version=11 +@EndOfDesignText@ +'Code module +Sub Process_Globals +End Sub + +Public Sub PrepareTransition_RadiusOut (Xui As XUI, RootWidth As Float, RootHeight As Float, CurrentPageRoot As B4XView, NewPageRoot As B4XView) As ResumableSub + Dim pnl As B4XView = Xui.CreatePanel("") + NewPageRoot.AddView(pnl, 0, 0, RootWidth, RootHeight) + pnl.As(Panel).Elevation = 10dip + Dim cnv As B4XCanvas + cnv.Initialize(pnl) + Dim frontBmp As B4XBitmap = CurrentPageRoot.Snapshot + Dim backBmp As B4XBitmap = NewPageRoot.Snapshot + cnv.ClearRect(cnv.TargetRect) + Dim frames As Int = 20 + Dim stepWidth As Float = RootWidth/frames + For i = 0 To frames-1 + cnv.DrawBitmap(frontBmp,getRect(0,0,RootWidth,RootHeight)) + Dim path As B4XPath + path.InitializeOval(getRect((RootWidth/2)-(stepWidth*i),(RootHeight/2)-(stepWidth*i),(stepWidth*2)*i,(stepWidth*2)*i)) + cnv.ClipPath(path) + cnv.DrawBitmap(backBmp,getRect(0,0,RootWidth,RootHeight)) + cnv.RemoveClip + cnv.Invalidate + Sleep(16) + Next + pnl.RemoveViewFromParent + Return True +End Sub + +Public Sub PrepareTransition_RadiusIn (Xui As XUI, RootWidth As Float, RootHeight As Float, CurrentPageRoot As B4XView, NewPageRoot As B4XView) As ResumableSub + Dim pnl As B4XView = Xui.CreatePanel("") + NewPageRoot.AddView(pnl, 0, 0, RootWidth, RootHeight) + pnl.As(Panel).Elevation = 10dip + Dim cnv As B4XCanvas + cnv.Initialize(pnl) + Dim frontBmp As B4XBitmap = CurrentPageRoot.Snapshot + Dim backBmp As B4XBitmap = NewPageRoot.Snapshot + Dim startingSize As Float = IIf(RootHeight>RootWidth,RootHeight,RootWidth) + cnv.ClearRect(cnv.TargetRect) + Dim frames As Int = 22 + Dim stepSize As Float = startingSize/frames + For i = 0 To frames-1 + cnv.DrawBitmap(backBmp,getRect(0,0,RootWidth,RootHeight)) + Dim path As B4XPath + path.InitializeOval(getRect((RootWidth/2)-(startingSize)+(stepSize*i),(RootHeight/2)-(startingSize)+(stepSize*i),(startingSize*2)-((stepSize*2)*i) , (startingSize*2)-((stepSize*2)*i))) + cnv.ClipPath(path) + cnv.DrawBitmap(frontBmp,getRect(0,0,RootWidth,RootHeight)) + cnv.RemoveClip + cnv.Invalidate + Sleep(16) + Next + pnl.RemoveViewFromParent + Return True +End Sub + +Public Sub PrepareTransition_OpenDoor (Xui As XUI, RootWidth As Float, RootHeight As Float, CurrentPageRoot As B4XView, NewPageRoot As B4XView) As ResumableSub + Dim pnl As B4XView = Xui.CreatePanel("") + NewPageRoot.AddView(pnl, 0, 0, RootWidth, RootHeight) + pnl.As(Panel).Elevation = 10dip + Dim cnv As B4XCanvas + cnv.Initialize(pnl) + Dim leftDoor As B4XBitmap = CurrentPageRoot.Snapshot.Crop(0,0,RootWidth/2, RootHeight) + Dim rightDoor As B4XBitmap = CurrentPageRoot.Snapshot.Crop(RootWidth/2,0,RootWidth/2, RootHeight) + Dim backBmp As B4XBitmap = NewPageRoot.Snapshot + cnv.ClearRect(cnv.TargetRect) + Dim frames As Int = 14 + Dim stepWidth As Float = (RootWidth/2)/frames + For i = 0 To frames-1 + cnv.DrawBitmap(backBmp,getRect(0,0,RootWidth,RootHeight)) + cnv.DrawBitmap(leftDoor,getRect(-(i*stepWidth),0,RootWidth/2,RootHeight)) + cnv.DrawBitmap(rightDoor,getRect((RootWidth/2)+(i*stepWidth),0,RootWidth/2,RootHeight)) + cnv.Invalidate + Sleep(16) + Next + pnl.RemoveViewFromParent + Return True +End Sub + +Public Sub PrepareTransition_CloseDoor (Xui As XUI, RootWidth As Float, RootHeight As Float, CurrentPageRoot As B4XView, NewPageRoot As B4XView) As ResumableSub + Dim pnl As B4XView = Xui.CreatePanel("") + NewPageRoot.AddView(pnl, 0, 0, RootWidth, RootHeight) + pnl.As(Panel).Elevation = 10dip + Dim cnv As B4XCanvas + cnv.Initialize(pnl) + Dim leftDoor As B4XBitmap = NewPageRoot.Snapshot.Crop(0,0,RootWidth/2, RootHeight) + Dim rightDoor As B4XBitmap = NewPageRoot.Snapshot.Crop(RootWidth/2,0,RootWidth/2, RootHeight) + Dim backBmp As B4XBitmap = CurrentPageRoot.Snapshot + cnv.ClearRect(cnv.TargetRect) + Dim frames As Int = 14 + Dim stepWidth As Float = (RootWidth/2)/frames + For i = 0 To frames-1 + cnv.DrawBitmap(backBmp,getRect(0,0,RootWidth,RootHeight)) + cnv.DrawBitmap(leftDoor,getRect(-(RootWidth/2)+(i*stepWidth),0,RootWidth/2,RootHeight)) + cnv.DrawBitmap(rightDoor,getRect(RootWidth-(i*stepWidth),0,RootWidth/2,RootHeight)) + cnv.Invalidate + Sleep(16) + Next + pnl.RemoveViewFromParent + Return True +End Sub + +Public Sub PrepareTransition_FadeOut (Xui As XUI, RootWidth As Float, RootHeight As Float, CurrentPageRoot As B4XView, NewPageRoot As B4XView) As ResumableSub + Dim pnl As B4XView = Xui.CreatePanel("") + NewPageRoot.AddView(pnl, 0, 0, RootWidth, RootHeight) + pnl.As(Panel).Elevation = 10dip + Dim cnv As B4XCanvas + cnv.Initialize(pnl) + Dim backBmp As B4XBitmap = CurrentPageRoot.Snapshot + cnv.ClearRect(cnv.TargetRect) + cnv.DrawBitmap(backBmp,getRect(0,0,RootWidth,RootHeight)) + cnv.Invalidate + pnl.Visible = True + pnl.SetVisibleAnimated(600,False) + Sleep(600) + pnl.RemoveViewFromParent + Return True +End Sub + +'Direction, choose between "LEFT" "TOP" "RIGHT" "BOTTOM" +Public Sub PrepareTransition_SlideOut (Xui As XUI, RootWidth As Float, RootHeight As Float, CurrentPageRoot As B4XView, NewPageRoot As B4XView, Direction As String) As ResumableSub + Dim pnl As B4XView = Xui.CreatePanel("") + NewPageRoot.AddView(pnl, 0, 0, RootWidth, RootHeight) + pnl.As(Panel).Elevation = 10dip + Dim cnv As B4XCanvas + cnv.Initialize(pnl) + Dim backBmp As B4XBitmap = CurrentPageRoot.Snapshot + cnv.ClearRect(cnv.TargetRect) + cnv.DrawBitmap(backBmp,getRect(0,0,RootWidth,RootHeight)) + cnv.Invalidate + Select Direction.ToUpperCase + Case "LEFT" + pnl.SetLayoutAnimated(400,-pnl.Width,pnl.Top,pnl.Width,pnl.Height) + Case "TOP" + pnl.SetLayoutAnimated(400,pnl.left,-pnl.Height,pnl.Width,pnl.Height) + Case "BOTTOM" + pnl.SetLayoutAnimated(400,pnl.left,pnl.Height,pnl.Width,pnl.Height) + Case "RIGHT" + pnl.SetLayoutAnimated(400,pnl.Width,pnl.Top,pnl.Width,pnl.Height) + Case Else + pnl.SetLayoutAnimated(400,-pnl.Width,pnl.Top,pnl.Width,pnl.Height) + End Select + Sleep(400) + pnl.RemoveViewFromParent + Return True +End Sub + +Public Sub PrepareTransition_SpiralOut (Xui As XUI, RootWidth As Float, RootHeight As Float, CurrentPageRoot As B4XView, NewPageRoot As B4XView) As ResumableSub + Dim pnl As B4XView = Xui.CreatePanel("") + NewPageRoot.AddView(pnl, 0, 0, RootWidth, RootHeight) + pnl.As(Panel).Elevation = 10dip + Dim cnv As B4XCanvas + cnv.Initialize(pnl) + Dim frontBmp As B4XBitmap = CurrentPageRoot.Snapshot + Dim backBmp As B4XBitmap = NewPageRoot.Snapshot + cnv.ClearRect(cnv.TargetRect) + Dim frames As Int = 35 + Dim stepSizeY As Float = RootHeight/frames + Dim stepSizeX As Float = RootWidth/frames + Dim deg As Int = 0 + For i = 0 To frames-1 + cnv.DrawBitmap(backBmp,getRect(0,0,RootWidth,RootHeight)) + deg = deg + 30 + cnv.DrawBitmapRotated(frontBmp,getRect((RootWidth/2)-(RootWidth/2)+(stepSizeX*i),(RootHeight/2)-(RootHeight/2)+(stepSizeY*i),(RootWidth)-((stepSizeX*2)*i) , (RootHeight)-((stepSizeY*2)*i)),deg) + cnv.Invalidate + Sleep(16) + Next + pnl.RemoveViewFromParent + Return True +End Sub + +Public Sub PrepareTransition_BurnOut (Xui As XUI, RootWidth As Float, RootHeight As Float, CurrentPageRoot As B4XView, NewPageRoot As B4XView) As ResumableSub + Dim pnl As B4XView = Xui.CreatePanel("") + NewPageRoot.AddView(pnl, 0, 0, RootWidth, RootHeight) + pnl.As(Panel).Elevation = 10dip + Dim spritelist As List + spritelist.Initialize + Dim fireSprite As B4XBitmap = Xui.LoadBitmap(File.DirAssets,"fire2.png") + Dim spWidth, spHeight As Float + spWidth = fireSprite.Width/4 + spHeight = fireSprite.Height/4 + For y = 0 To 3 + For x = 0 To 3 + spritelist.Add(fireSprite.Crop(x*spWidth,y*spHeight,spWidth,spHeight)) + Next + Next + Dim cnv As B4XCanvas + cnv.Initialize(pnl) + Dim frontBmp As B4XBitmap = CurrentPageRoot.Snapshot + Dim backBmp As B4XBitmap = NewPageRoot.Snapshot + cnv.ClearRect(cnv.TargetRect) + Dim frames As Int = 36 + Dim stepSize As Float = RootHeight/frames + Dim flameframe As Int = 0 + For i = 0 To frames-1 + cnv.DrawBitmap(backBmp,getRect(0,0,RootWidth,RootHeight)) + Dim path As B4XPath + path.InitializeRoundedRect(getRect(0,0,RootWidth,RootHeight-(i*stepSize)),0) + cnv.ClipPath(path) + cnv.DrawBitmap(frontBmp,getRect(0,0,RootWidth,RootHeight)) + cnv.RemoveClip + Dim flame As B4XBitmap = spritelist.Get(flameframe) + cnv.DrawBitmap(flame,getRect(-(pnl.Width*0.2),RootHeight-(pnl.Height*0.35)-(i*stepSize),pnl.Width*1.4,pnl.Height*0.45)) + cnv.Invalidate + Sleep(16) + If i Mod 2 = 0 Then _ + flameframe = (flameframe+1) Mod spritelist.Size + Next + pnl.RemoveViewFromParent + Return True +End Sub + +Private Sub getRect(x As Float, y As Float, w As Float, h As Float) As B4XRect + Dim r As B4XRect + r.Initialize(x,y,x+w,y+h) + Return r +End Sub + \ No newline at end of file diff --git a/B4A/BatteryUtilities.bas b/B4A/BatteryUtilities.bas new file mode 100644 index 0000000..ebb4448 --- /dev/null +++ b/B4A/BatteryUtilities.bas @@ -0,0 +1,126 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=10.2 +@EndOfDesignText@ +'Class module +Sub Class_Globals + Private nativeMe As JavaObject + +End Sub +'Initializes the object. +Public Sub Initialize + nativeMe = Me +End Sub +'Return information about the battery status. It returns the following 11 values in an integer Array: +'EXTRA_LEVEL = current battery level, from 0 To EXTRA_SCALE. +'EXTRA_SCALE = the maximum battery level possible. +'EXTRA_HEALTH = the current health constant. +'EXTRA_ICON_SMALL = the resource ID of a small status bar icon indicating the current battery state. +'EXTRA_PLUGGED = whether the device is plugged into a Power source; 0 means it is on battery, other constants are different types of Power sources. +'EXTRA_STATUS = the current status constant. +'EXTRA_TEMPERATURE = the current battery temperature. +'EXTRA_VOLTAGE = the current battery voltage level. +'A value indicating if the battery is being charged or fully charged (If neither it returns 0 Else it returns 1) +'A value indicating if it is charging via USB (0 = Not USB, 2 = USB) +'A value indicating if it is charging via AC (0 = Not AC, 1 = AC) +Public Sub getBatteryInformation () As Int() + + Dim batteryInfo(11) As Int + batteryInfo = nativeMe.RunMethod("getBatteryInformation",Null) + Return batteryInfo + +End Sub + +Public Sub getBatteryTechnolgy() As String + + Dim batterytech As String + batterytech = nativeMe.RunMethod("getBatteryTechnology",Null) + Return batterytech + +End Sub + + + +#If Java + +import android.os.BatteryManager; +import android.os.Bundle; +import android.app.Activity; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; + + public int[] getBatteryInformation() { + + int[] mybat = new int[11]; + + Intent batteryIntent = ba.context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + + int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); + mybat[0] = level; + int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); + mybat[1] = scale; + int health = batteryIntent.getIntExtra(BatteryManager.EXTRA_HEALTH,-1); + mybat[2] = health; + int icon_small = batteryIntent.getIntExtra(BatteryManager.EXTRA_ICON_SMALL,-1); + mybat[3] = icon_small; + int plugged = batteryIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED,-1); + mybat[4] = plugged; +// boolean present = batteryIntent.getExtras().getBoolean(BatteryManager.EXTRA_PRESENT); + int status = batteryIntent.getIntExtra(BatteryManager.EXTRA_STATUS,-1); + mybat[5] = status; +// String technology = batteryIntent.getExtras().getString(BatteryManager.EXTRA_TECHNOLOGY); +// BA.Log("Technology = " + technology); + int temperature = batteryIntent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE,-1); + mybat[6] = temperature; + int voltage = batteryIntent.getIntExtra(BatteryManager.EXTRA_VOLTAGE,-1); + mybat[7] = voltage; +// int ac = batteryIntent.getIntExtra("plugged",BatteryManager.BATTERY_PLUGGED_AC); +// mybat[8] = ac; +// int usb = batteryIntent.getIntExtra("plugged",BatteryManager.BATTERY_PLUGGED_USB); +// mybat[9] = usb; + + boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || + status == BatteryManager.BATTERY_STATUS_FULL; + mybat[8] = 0; + if (isCharging == true) { + mybat[8] = 1; + } + + // How are we charging? + mybat[9] = 0; + mybat[10] = 0; + int chargePlug = batteryIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); + boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; + if (usbCharge == true) { + mybat[9] = 2; + } + + boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; + if (acCharge == true) { + mybat[10] = 1; + } + + return mybat; + } + + + public String getBatteryTechnology() { + + Intent batteryIntent = ba.context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + + String technology = batteryIntent.getExtras().getString(BatteryManager.EXTRA_TECHNOLOGY); + + return technology; + } + + + + + + + +#End If \ No newline at end of file diff --git a/B4A/C_UpdateAvailable.bas b/B4A/C_UpdateAvailable.bas new file mode 100644 index 0000000..7837736 --- /dev/null +++ b/B4A/C_UpdateAvailable.bas @@ -0,0 +1,74 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=12.2 +@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 + Root.Color = Colors.Transparent +End Sub + +Sub B4XPage_Appear + Try + Do While Not(CanRequestPackageInstalls) + MsgboxAsync($"Por favor permita que ${Application.PackageName} instale actualizaciones"$, "Instalar actualización") + Wait For Msgbox_Result(Result As Int) + Dim in As Intent + in.Initialize("android.settings.", "package:" & Application.PackageName) + StartActivity(in) + Loop + Catch + Log("updateAvailable() Error - " & LastException.Message) + End Try + If appUpdater.newApp.update Then + ofreceActualizacion + Else + sinActualizacion + End If +End Sub + +'//////////////////////////////////////////////////////////////////////////////////////////// +'//// Esta es una actividad usada por el servicio appUpdater para mostrar notificaciones +'//// cuando hay alguna actualizacion de apk. +'//////////////////////////////////////////////////////////////////////////////////////////// + + +public Sub CanRequestPackageInstalls As Boolean + ' // https://www.b4x.com/android/forum/threads/version-safe-apk-installation.87667/#content + Dim ctxt As JavaObject + ctxt.InitializeContext + Dim PackageManager As JavaObject = ctxt.RunMethod("getPackageManager", Null) + Return PackageManager.RunMethod("canRequestPackageInstalls", Null) +End Sub + +Sub ofreceActualizacion + If Msgbox2(appUpdater.newApp.newMsg,"Actualización disponible","Si","","No",Null) = DialogResponse.Positive Then 'ignore +' StartService(DownloadService) + CallSubDelayed(appUpdater, "download_newApk") +' ToastMessageShow("Descargando actualización", True) + End If + B4XPages.MainPage.login.ocultaProgreso + StartActivity(Main) +' Activity.Finish + B4XPages.ShowPage("Login") +End Sub + +Sub sinActualizacion + Msgbox(appUpdater.newApp.okMsg, "Aplicación al corriente") 'ignore +' StartActivity(Main) + B4XPages.MainPage.login.ocultaProgreso + B4XPages.ShowPage("Login") +End Sub \ No newline at end of file diff --git a/B4A/C_principal.bas b/B4A/C_principal.bas new file mode 100644 index 0000000..80ca505 --- /dev/null +++ b/B4A/C_principal.bas @@ -0,0 +1,1717 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=11.8 +@EndOfDesignText@ +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore + Private b_checkin As Button + Private b_checout As Button + Dim c As Cursor + Dim cmd As DBCommand + Dim reqManager As DBRequestManager + Dim sDate, sTime As String + Dim g As GPS + Private B4XImageView1 As B4XImageView + Private qr As QRGenerator + Private p_qr As Panel + Private b_cerrarqr As Button + Private p_scroll As Panel + Private ScrollView1 As ScrollView + Private b_gestion As Button + + Private camEx2 As CameraExClass2 + Dim frontCamera As Boolean = False + Private p_cam As Panel + Dim nombrefoto As String = "0" + Dim nombrefoto1 As String = "0" + Private p_camara As Panel + Private teclado As IME + Dim fototomada As String + Dim x As Int = 0 + Private p_general As Panel + Private p_gestion As Panel + Dim y As Int = 0 + Private iv_gestion As ImageView + Private iv_ine As ImageView + Private cb_estatus As B4XComboBox + Dim itemselect As String + Private b_finalizar As Button + Private b_cancelar As Button + Private et_nombre As EditText + Private et_telefono As EditText + Private et_correo As EditText + Private et_curp As EditText + Private Panel1 As Panel + Private p_inci As Panel + Private p_inci2 As Panel + Private et_observaciones As EditText + Private et_comentarios As EditText + Private bu As BatteryUtilities + Dim batterystatus(11) As Int + Dim bateria As Int + Dim m_lat, m_lon As String + Private Label1 As Label + Dim distance As Long + Private b_cancelafoto As Button + Private b_comidain As Button + Private b_comidaout As Button + Dim mensaje As String + Dim donde As String + Dim donde1 As String + Dim donde2 As String + Dim donde3 As String + Private p_validacion As Panel + Private b_aceptar As Button + Private et_codigo As EditText + Private b_cancelarcodigo As Button + Private l_codigo As Label + Private b_gestionadas As Button + Private p_trabajadas As Panel + Private l_trabajdas As Label + Private cb_rechazadas As CheckBox + Private cb_aprobadas As CheckBox + Private clv_gestionadas As CustomListView + Private l_nombre As Label + Private l_estatus As Label +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 + Root.LoadLayout("Principal") + reqManager.Initialize(Me, Starter.DBReqServer) + g.Initialize("GPS") + qr.Initialize(B4XImageView1.mBase.Width) + + Panel1.Width = Root.Width + Panel1.Height = Root.Height + p_camara.Width = Root.Width + p_camara.Height = Root.Height + p_validacion.Width = Root.Width + p_validacion.Height = Root.Height + + + ScrollView1.height = Root.Height - p_general.Height + p_scroll.height = Root.Height - p_general.Height + + p_trabajadas.height = Root.Height - p_general.Height + +End Sub + +Private Sub B4XPage_Appear + + CheckAndRequestNotificationPermission + If Not(Subs.IsConnectedToInternet) Then + Msgbox("Habilita los datos del celular","Atención") + B4XPage_Appear + Else + + + If g.GPSEnabled=False Then + Dim Resultado As Int= -3 + Do While Resultado=-3 + Resultado = Msgbox2("Habilitar el GPS", "Atencion","ACEPTAR","", "",LoadBitmap(File.DirAssets,"alert2.png")) + Select Case Resultado + Case DialogResponse.POSITIVE + MsgboxAsync("Habilitar el GPS", "Atencion") + StartActivity(g.LocationSettingsIntent) + Case DialogResponse.NEGATIVE + + B4XPage_Appear + End Select + Loop + Else + + Log("ENTRE") + StartService(Tracker) + + m_lat = "0" + m_lon = "0" + GPS_LocationChanged(Tracker.FLP.GetLastKnownLocation) + + End If + m_lat = B4XPages.MainPage.login.lat_suc + m_lon = B4XPages.MainPage.login.long_suc + DateTime.DateFormat = "dd/MM/yyyy" + sDate="%" & DateTime.Date(DateTime.Now) & "%" + Log(sDate&" "&B4XPages.MainPage.login.user) + + C = Starter.skmt.ExecQuery2("SELECT * FROM CHECADO WHERE FECHA LIKE ? AND USUARIO = ?",Array As String(sDate, B4XPages.MainPage.login.user)) + If c.RowCount > 0 Then + c.Position = 0 + If c.GetString("ESTATUS") = "ENTRADA" Then + b_checkin.visible = False + b_checout.visible = True + b_comidain.Visible = True + b_comidaout.Visible = False + Else If c.GetString("ESTATUS") = "SALIDA A COMER" Then + b_checkin.visible = False + b_checout.visible = True + b_comidain.Visible = False + b_comidaout.Visible = True + Else If c.GetString("ESTATUS") = "REGRESO DE COMER" Then + b_checkin.visible = False + b_checout.visible = True + b_comidain.Visible = False + b_comidaout.Visible = False + Else If c.GetString("ESTATUS") = "SALIDA" Then + b_checkin.visible = True + b_checout.visible = False + b_comidain.Visible = False + b_comidaout.Visible = False + End If + Else If c.RowCount = 0 Then + b_checkin.visible = True + b_checout.visible = False + b_comidain.Visible = False + b_comidaout.Visible = False + End If + + '' CallSubDelayed(Tracker, "StartFLPSmall") + If Tracker.FLP.IsInitialized And Tracker.FLP.GetLastKnownLocation.IsInitialized Then 'Si tenemos "UltimaUbicaccionConocida" la usamos. + Starter.latitud = Tracker.FLP.GetLastKnownLocation.Latitude + Starter.longitud = Tracker.FLP.GetLastKnownLocation.Longitude +' Log($"Tenemos UUC: ${Tracker.FLP.GetLastKnownLocation.Latitude},${Tracker.FLP.GetLastKnownLocation.Longitude}"$) + GPS_LocationChanged(Tracker.FLP.GetLastKnownLocation) + Log("hice esto") + End If + + bu.Initialize + batterystatus = bu.BatteryInformation + bateria = batterystatus(0) + ajustaTamano2 + + Wait For (CheckAndRequestNotificationPermission) Complete (HasPermission As Boolean) + If HasPermission Then + Log("Con permisos de notificación") + Else + ToastMessageShow("No permission to show notification", True) + End If + End If + + If b_checkin.Visible Then + b_gestion.Visible = False + b_gestionadas.Visible = False + Else + b_gestion.Visible = True + b_gestionadas.Visible = True + End If + +End Sub + +'Make sure that targetSdkVersion >= 33 +Private Sub CheckAndRequestNotificationPermission As ResumableSub + Dim p As Phone + If p.SdkVersion < 33 Then Return True + Dim ctxt As JavaObject + ctxt.InitializeContext + Dim targetSdkVersion As Int = ctxt.RunMethodJO("getApplicationInfo", Null).GetField("targetSdkVersion") + If targetSdkVersion < 33 Then Return True + Dim NotificationsManager As JavaObject = ctxt.RunMethod("getSystemService", Array("notification")) + Dim NotificationsEnabled As Boolean = NotificationsManager.RunMethod("areNotificationsEnabled", Null) + If NotificationsEnabled Then Return True + Dim rp As RuntimePermissions + rp.CheckAndRequest(rp.PERMISSION_POST_NOTIFICATIONS) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) 'change to Activity_PermissionResult if non-B4XPages. + Return Result +End Sub + +Sub GPS_LocationChanged (Location1 As Location) +' LogColor($"Entrando a Cliente.GPS_LocationChanged"$, Colors.red) + If Tracker.FLP.GetLastKnownLocation.IsInitialized And Tracker.FLP.GetLastKnownLocation.Latitude <> 0 Then + Starter.latitud = Tracker.FLP.GetLastKnownLocation.Latitude + Starter.longitud= Tracker.FLP.GetLastKnownLocation.Longitude +' Log("Coords set to: " & B4XPages.MainPage.lat_gps & " and " & B4XPages.MainPage.lon_gps) + End If + + If m_lat = Null Or m_lat = "" Then m_lat = 0 + If m_lon = Null Or m_lon = "" Then m_lon = 0 + + Dim l1, l2 As Location + l1.Initialize2(Starter.latitud, Starter.longitud) +' Log($"Coordenadas de la tienda - lat:${m_lat}, lon:${m_lon}"$) + l2.Initialize2(m_lat, m_lon) + +' If Label1.IsInitialized Then +' Label1.Text = Starter.latitud & ", "& Starter.longitud +' End If + 'now we need the distance between our location and the target location + + distance = l1.DistanceTo(l2) 'the result is in meter +' Log(distance) + If distance < 200 Then +' If b_gestion.IsInitialized Then +' b_gestion.Enabled = True +' End If + Else If distance > 201 Then +' If b_gestion.IsInitialized Then +' b_gestion.Enabled = False +' End If + End If + +' If Location1.IsInitialized And Location1.Accuracy > 200 Then +' +' End If + + CallSubDelayed(Tracker, "CreateLocationRequest") +End Sub + +Private Sub b_checout_Click + If b_comidaout.Visible = False Then + If p_scroll.Visible = False Then + If horasalida Then + If Not(Subs.IsConnectedToInternet) Then + Msgbox("Habilita los datos del celular","Atención") + B4XPage_Appear + Else + If distance > 200 Then + Log("aqui") + MsgboxAsync("No estas cerca del punto asignado","Atención") + Else If distance < 200 Then + Log("validar") + DateTime.DateFormat = "dd/MM/yyyy" + sDate="%" & DateTime.Date(DateTime.Now) & "%" + C = Starter.skmt.ExecQuery2("SELECT * FROM HIST_CHECADO WHERE FECHA LIKE ? AND USUARIO = ?",Array As String(sDate, B4XPages.MainPage.login.user)) + Log(c.RowCount) + If c.RowCount < 6 Then + If g.GPSEnabled=False Then + Dim result As Int= -3 + Do While result=-3 + result = Msgbox2("Habilitar el GPS", "Atencion","ACEPTAR","", "",LoadBitmap(File.DirAssets,"alert2.png")) + Select Case result + Case DialogResponse.POSITIVE + MsgboxAsync("Habilitar el GPS", "Atencion") + StartActivity(g.LocationSettingsIntent) + Case DialogResponse.NEGATIVE + + B4XPage_Appear + End Select + Loop + Else + botonout + End If + Else + MsgboxAsync("No puedes hacer mas registros","Atención") + End If + End If + End If + Else If donde1 = "1" Then + Msgbox2Async(mensaje,"Atención", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (result As Int) + If result = DialogResponse.POSITIVE Then + + p_validacion.Visible = True + l_codigo.Text = "Ingresa el codigo para el CHECK-OUT." + + End If + Else If donde1 = "2" Then + Msgbox2Async(mensaje,"Atención", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (result As Int) + If result = DialogResponse.POSITIVE Then + + p_validacion.Visible = True + l_codigo.Text = "Ingresa el codigo para el CHECK-OUT." + + End If + End If + Else + MsgboxAsync("Necesitas acabar la gestion actual.","Atención") + End If + Else + MsgboxAsync("Necesitas hacer la entrada de comida.","Atención") + End If +End Sub + +Sub botonout + g.Start(0,0) + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + + C = Starter.skmt.ExecQuery("SELECT * FROM CHECADO") + If c.RowCount = 0 Then + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(B4XPages.MainPage.login.user, B4XPages.MainPage.login.ID_EMP,B4XPages.MainPage.login.perfil, Starter.almacen, B4XPages.MainPage.login.sucursal, "ENTRADA", sDate &" " &sTime)) + Else + c.Position = 0 + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(c.GetString("USUARIO"),c.GetString("ID_EMP"),c.GetString("PERFIL"),c.GetString("PROYECTO"),c.GetString("SUCURSAL"),c.GetString("ESTATUS"),c.GetString("FECHA"))) + End If + Starter.skmt.ExecNonQuery("delete from CHECADO") + Starter.skmt.ExecNonQuery2("INSERT INTO CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(B4XPages.MainPage.login.user, B4XPages.MainPage.login.ID_EMP,B4XPages.MainPage.login.perfil, Starter.almacen, B4XPages.MainPage.login.sucursal, "SALIDA", sDate &" " &sTime)) + + b_checkin.visible = True + b_checout.visible = False + b_comidain.Visible = False + b_comidaout.Visible = False + MsgboxAsync("Check-out enviado con exito","Atención") + Mandaout +End Sub + +Sub Mandaout + DateTime.DateFormat = "dd/MM/yyyy" + sDate=DateTime.Date(DateTime.Now) + DateTime.TimeFormat = "HH:mm:ss" + sTime=DateTime.Time(DateTime.Now) + cmd.Initialize + cmd.Name = "insert_check_GABICO" + cmd.Parameters = Array As Object(B4XPages.MainPage.login.ID_EMP, Starter.almacen, sDate &" " &sTime,"MOVIL", "SALIDA", B4XPages.MainPage.login.user, B4XPages.MainPage.login.sucursal, Starter.latitud, Starter.longitud) + reqManager.ExecuteCommand(cmd , "check") + B4XPage_Appear +End Sub + +Sub horasalida As Boolean + + Dim p As Period + p.Hours = 0 + p.Minutes = 0 + Dim newDate As Long = DateUtils.AddPeriod(DateTime.Now, p) + Log(newDate) + Log(DateUtils.TicksToString(newDate)) + + Dim p2 As Period + p2.Hours = 1 + p2.Minutes = 0 + DateTime.DateFormat = "MM/dd/yyyy HH:mm" + Dim fecha2 As String = DateTime.Date(DateTime.Now) + Dim prueba2() As String = Regex.Split(" ",fecha2) + LogColor(prueba2(0),Colors.red) + Dim prueba3 As String = prueba2(0) &" "&B4XPages.MainPage.login.horaout&":00" + LogColor(prueba3,Colors.Red) + Dim ticks2 As Long = DateTime.DateParse(prueba3) + LogColor(ticks2,Colors.red) + LogColor(DateTime.Date(ticks2),Colors.red) + Dim timeToCheck2 As Long = DateUtils.AddPeriod(ticks2, p2) + LogColor(DateUtils.TicksToString(timeToCheck2),Colors.red) + + DateTime.TimeFormat = "hhmm" + Dim p3 As Period + p3.Hours = 0 + p3.Minutes = 0 + DateTime.DateFormat = "MM/dd/yyyy HH:mm" + Dim fecha As String = DateTime.Date(DateTime.Now) + Dim prueba1() As String = Regex.Split(" ",fecha) + Log(prueba1(0)) + Dim prueba As String = prueba1(0) &" "&B4XPages.MainPage.login.horaout&":00" + LogColor(prueba,Colors.Red) + Dim ticks As Long = DateTime.DateParse(prueba) + Log(ticks) + Dim timeToCheck As Long = DateUtils.AddPeriod(ticks, p3) + Log(DateUtils.TicksToString(timeToCheck)) + + If newDate >= timeToCheck And newDate <= timeToCheck2 Then + donde1 = "0" + Log("0") + Return True + Else If newDate > timeToCheck2 Then + donde1 = "1" + Log("1") + mensaje = "La hora maxima para hacer el check-out ha terminado, ingresa el codigo" + Return False + Else If newDate < timeToCheck Then + donde1 = "2" + Log("2") + mensaje = "Aun no es tu horario de salida, ingresa el codigo" + Return False + Else + Return False + End If + +End Sub + +Private Sub b_checkin_Click + + If horaentrada Then + If Not(Subs.IsConnectedToInternet) Then + Msgbox("Habilita los datos del celular","Atención") + B4XPage_Appear + Else + If distance > 200 Then + Log("aqui") + MsgboxAsync("No estas cerca del punto asignado","Atención") + Else If distance < 200 Then + DateTime.DateFormat = "dd/MM/yyyy" + sDate="%" & DateTime.Date(DateTime.Now) & "%" + C = Starter.skmt.ExecQuery2("SELECT * FROM HIST_CHECADO WHERE FECHA LIKE ? AND USUARIO = ?",Array As String(sDate, B4XPages.MainPage.login.user)) + Log(c.RowCount) + If c.RowCount < 6 Then + If g.GPSEnabled=False Then + Dim result As Int= -3 + Do While result=-3 + result = Msgbox2("Habilitar el GPS", "Atencion","ACEPTAR","", "",LoadBitmap(File.DirAssets,"alert2.png")) + Select Case result + Case DialogResponse.POSITIVE + MsgboxAsync("Habilitar el GPS", "Atencion") + StartActivity(g.LocationSettingsIntent) + Case DialogResponse.NEGATIVE + + B4XPage_Appear + End Select + Loop + Else + botoncheck + End If + Else + MsgboxAsync("No puedes hacer mas registros","Atención") + End If + End If + End If + Else If donde2 = "1" Then + Msgbox2Async(mensaje,"Atención", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (result As Int) + If result = DialogResponse.POSITIVE Then + + p_validacion.Visible = True + l_codigo.Text = "Ingresa el codigo para el CHECK-IN." + + End If + Else If donde2 = "2" Then + Msgbox2Async(mensaje,"Atención", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (result As Int) + If result = DialogResponse.POSITIVE Then + + p_validacion.Visible = True + l_codigo.Text = "Ingresa el codigo para el CHECK-IN." + + End If + End If + +End Sub + +Sub botoncheck + g.Start(0,0) + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + + C = Starter.skmt.ExecQuery("SELECT * FROM CHECADO") + If c.RowCount = 0 Then + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(B4XPages.MainPage.login.user, B4XPages.MainPage.login.ID_EMP,B4XPages.MainPage.login.perfil, Starter.almacen, B4XPages.MainPage.login.sucursal, "ENTRADA", sDate &" " &sTime)) + Else + c.Position = 0 + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(c.GetString("USUARIO"),c.GetString("ID_EMP"),c.GetString("PERFIL"),c.GetString("PROYECTO"),c.GetString("SUCURSAL"),c.GetString("ESTATUS"),c.GetString("FECHA"))) + End If + + b_checkin.visible = False + b_checout.visible = True + b_comidain.Visible = True + b_comidaout.Visible = False + Starter.skmt.ExecNonQuery("delete from CHECADO") + Starter.skmt.ExecNonQuery2("INSERT INTO CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(B4XPages.MainPage.login.user, B4XPages.MainPage.login.ID_EMP,B4XPages.MainPage.login.perfil, Starter.almacen, B4XPages.MainPage.login.sucursal, "ENTRADA", sDate &" " &sTime)) + Mandacheck + MsgboxAsync("Check-in enviado con exito","Atención") +End Sub + +Sub Mandacheck + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + cmd.Initialize + cmd.Name = "insert_check_GABICO" + cmd.Parameters = Array As Object(B4XPages.MainPage.login.ID_EMP, Starter.almacen, sDate &" " &sTime,"MOVIL", "ENTRADA", B4XPages.MainPage.login.user, B4XPages.MainPage.login.sucursal, Starter.latitud, Starter.longitud) + reqManager.ExecuteCommand(cmd , "check") + B4XPage_Appear +End Sub + +Sub horaentrada As Boolean + + Dim p As Period + p.Hours = 0 + p.Minutes = 0 + Dim newDate As Long = DateUtils.AddPeriod(DateTime.Now, p) + Log(newDate) + Log(DateUtils.TicksToString(newDate)) + + Dim p2 As Period + p2.Hours = 0 + p2.Minutes = 20 + DateTime.DateFormat = "MM/dd/yyyy HH:mm" + Dim fecha2 As String = DateTime.Date(DateTime.Now) + Dim prueba2() As String = Regex.Split(" ",fecha2) + LogColor(prueba2(0),Colors.red) + Dim prueba3 As String = prueba2(0) &" "&B4XPages.MainPage.login.horain&":00" + LogColor(prueba3,Colors.Red) + Dim ticks2 As Long = DateTime.DateParse(prueba3) + LogColor(ticks2,Colors.red) + LogColor(DateTime.Date(ticks2),Colors.red) + Dim timeToCheck2 As Long = DateUtils.AddPeriod(ticks2, p2) + LogColor(DateUtils.TicksToString(timeToCheck2),Colors.red) + + DateTime.TimeFormat = "hhmm" + Dim p3 As Period + p3.Hours = 0 + p3.Minutes = -30 + DateTime.DateFormat = "MM/dd/yyyy HH:mm" + Dim fecha As String = DateTime.Date(DateTime.Now) + Dim prueba1() As String = Regex.Split(" ",fecha) + Log(prueba1(0)) + Dim prueba As String = prueba1(0) &" "&B4XPages.MainPage.login.horain&":00" + LogColor(prueba,Colors.Red) + Dim ticks As Long = DateTime.DateParse(prueba) + Log(ticks) + Dim timeToCheck As Long = DateUtils.AddPeriod(ticks, p3) + Log(DateUtils.TicksToString(timeToCheck)) + + If newDate >= timeToCheck And newDate < timeToCheck2 Then + donde2 = "0" + Return True + Else If newDate > timeToCheck2 Then + donde2 = "1" + mensaje = "La tolerancia del check-in paso, por favor, ingresa el codigo" + Return False + Else If newDate < timeToCheck Then + donde2 = "1" + mensaje = "Aun no es tu horario de entrada, ingresa el codigo" + Return False + Else + Return False + End If + +End Sub + +Private Sub ImageView2_Click + If b_comidaout.Visible = False Then + If Not(Subs.IsConnectedToInternet) Then + Msgbox("Habilita los datos del celular","Atención") + B4XPage_Appear + Else + If distance > 200 Then + Log("aqui") + MsgboxAsync("No estas cerca del punto asignado","Atención") + Else If distance < 200 Then + If g.GPSEnabled=False Then + Dim result As Int= -3 + Do While result=-3 + result = Msgbox2("Habilitar el GPS", "Atencion","ACEPTAR","", "",LoadBitmap(File.DirAssets,"alert2.png")) + Select Case result + Case DialogResponse.POSITIVE + MsgboxAsync("Habilitar el GPS", "Atencion") + StartActivity(g.LocationSettingsIntent) + Case DialogResponse.NEGATIVE + + B4XPage_Appear + End Select + Loop + Else + DateTime.DateFormat = "dd/MM/yyyy" + sDate="%" & DateTime.Date(DateTime.Now) & "%" + C = Starter.skmt.ExecQuery2("SELECT * FROM CHECADO WHERE USUARIO = ? AND FECHA LIKE ?",Array As String( B4XPages.MainPage.login.user, sDate)) + If c.RowCount > 0 Then + c.Position = 0 + Log(c.GetString("ESTATUS")) + If c.GetString("ESTATUS") = "ENTRADA" Or c.GetString("ESTATUS") = "SALIDA A COMER" Or c.GetString("ESTATUS") = "REGRESO DE COMER" Then + + If p_gestion.IsInitialized And p_gestion.Visible = True Then + p_gestion.Visible = False + p_qr.Visible = True + p_qr.BringToFront + Else + p_qr.Visible = True + End If + + If p_trabajadas.IsInitialized And p_trabajadas.Visible = True Then + Log("PANEL TRABAJADAS INVISIBLE") + p_trabajadas.Visible = False + p_qr.Visible = True + p_qr.BringToFront + Else + p_qr.Visible = True + End If + + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Dim SenderFilter As Object = Starter.skmt.ExecQueryAsync("SQL", "SELECT ID_EMP, USUARIO, PROYECTO, SUCURSAL FROM CHECADO", Null) + Wait For (SenderFilter) SQL_QueryComplete (Success As Boolean, rs As ResultSet) + Dim texto As String="" + If Success Then + Do While rs.NextRow + texto="QR"&";"&rs.GetString("ID_EMP")&";"&B4XPages.MainPage.login.nombre&";"&rs.GetString("USUARIO")&";"&rs.GetString("PROYECTO")&";"&rs.GetString("SUCURSAL")&";"& (sDate &" "& sTime)&";"&(Starter.latitud &", "&Starter.longitud&";"&B4XPages.MainPage.login.formato_suc&";"&B4XPages.MainPage.login.nom_proyec&";"&B4XPages.MainPage.login.lat_suc&";"&B4XPages.MainPage.login.long_suc) + Loop + rs.Close + Else + Log(LastException) + End If + Log("Crear QR") + CrearQR(texto) + Else + MsgboxAsync("Por favor hacer el check-in","Atención") + End If + Else + MsgboxAsync("Por favor hacer el check-in","Atención") + End If + End If + End If + End If + Else + MsgboxAsync("No puedes generar el QR durate la hora de comida","Atención") + End If +End Sub + +Private Sub CrearQR(texto As String) + B4XImageView1.Clear + If texto.Length>0 Then + B4XImageView1.SetBitmap(qr.Create(texto)) + Log("QR Creado ->"&texto) + End If +End Sub + + +Private Sub b_cerrarqr_Click + B4XImageView1.Clear + If y = 1 Then + p_qr.Visible = False + p_gestion.Visible = True + p_gestion.BringToFront + Else + p_qr.Visible = False + + End If +End Sub + +Private Sub b_gestion_Click + DateTime.DateFormat = "dd/MM/yyyy" + sDate="%" & DateTime.Date(DateTime.Now) & "%" + Log(sDate&" "&B4XPages.MainPage.login.user) + If b_comidaout.Visible = False Then + + C = Starter.skmt.ExecQuery2("SELECT * FROM CHECADO WHERE USUARIO = ? AND FECHA LIKE ?",Array As String( B4XPages.MainPage.login.user, sDate)) + If c.RowCount > 0 Then + c.Position = 0 + Log(c.GetString("ESTATUS")) + If c.GetString("ESTATUS") = "ENTRADA" Or c.GetString("ESTATUS") = "SALIDA A COMER" Or c.GetString("ESTATUS") = "REGRESO DE COMER" Then + If Not(Subs.IsConnectedToInternet) Then + MsgboxAsync("Habilita los datos del celular","Atención") + B4XPage_Appear + Else + If distance > 200 Then + Log("aqui") + MsgboxAsync("No estas cerca del punto asignado","Atención") + Else If distance < 200 Then + p_trabajadas.Visible= False + p_scroll.Visible = True + ScrollView1.Visible = True + + ScrollView1.Panel.LoadLayout("gestion") + ScrollView1.Panel.Height = p_gestion.Height + + p_scroll.BringToFront + y = 1 + x = 1 + InitializeCamera2 + p_camara.Visible = True + b_gestion.Enabled = False + p_gestion.Visible = True + + nombrefoto = "0" + nombrefoto1 = "0" + iv_ine.Bitmap = LoadBitmap(File.DirAssets,"camara.png") + iv_gestion.Bitmap = LoadBitmap(File.DirAssets,"camara.png") + itemselect = "" + + Dim Items As List + Items.Initialize + Items.Clear + Items.Add("SELECCIONA UNA OPCION ") + Items.Add("APROBADO") + Items.Add("RECHAZADO") + Items.Add("INTERMITENCIA") + Items.Add("NO CONCLUIDO") + cb_estatus.SetItems(Items) + itemselect = "SELECCIONA UNA OPCION" + p_inci.Visible = False + ajustaTamano + End If + End If + Else + MsgboxAsync("Por favor hacer el check-in","Atención") + End If + Else + MsgboxAsync("Por favor hacer el check-in","Atención") + End If + Else + MsgboxAsync("No puedes hacer gestiones durate la hora de comida","Atención") + End If +End Sub + + +'tomar foto + +Private Sub InitializeCamera2 + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_CAMERA) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) + If Result Then + camEx2.Initialize(p_cam, frontCamera, Me, "Camera1") + frontCamera = camEx2.Front + Log("inicializamos Camara") + Else + ToastMessageShow("No permission!!!", True) + End If +End Sub + +Sub Camera1_Ready (Success As Boolean) + Log("Camara ready") + If Success Then + camEx2.SetJpegQuality(90) + camEx2.SetContinuousAutoFocus + camEx2.CommitParameters + camEx2.StartPreview + Log(camEx2.GetPreviewSize) + Else + ToastMessageShow("Cannot open camera.", True) + Log("Cannot open camera") + End If +End Sub + +Sub Camera1_PictureTaken (Data()As Byte) + If x = 1 Then + DateTime.DateFormat="ddMMyyyyHHmmss" + nombrefoto = DateTime.Now & "_FOTO1.jpg" + teclado.HideKeyboard + fototomada = nombrefoto + Else If x = 2 Then + DateTime.DateFormat="ddMMyyyyHHmmss" + nombrefoto1 = DateTime.Now & "_FOTO2.jpg" + teclado.HideKeyboard + fototomada = nombrefoto1 + End If + Log("tome foto") + Dim filename As String = fototomada + Dim Dirp As String = File.DirInternal + Dim Dir As String + Dim Dir2 As String + Try + File.MakeDir(Dirp,"/GABINETE") + Dir = "/GABINETE" + Log("creado en promotoria " & Dirp & Dir) + Catch + Dir = "" + Log("creado en raiz") + End Try + + Try + File.MakeDir(Dirp & Dir,"/reduccion") + Dir2 = "/reduccion" + Log("creado en promotoria " & Dirp & Dir & Dir2) + Catch + Dir = "" + Log("creado en raiz") + End Try + + camEx2.SavePictureToFile(Data, Dirp&Dir, filename) + camEx2.StartPreview 'restart preview +' ToastMessageShow("Picture saved." & CRLF & "File size: " & File.Size(Dir, filename) & Dir &"," & filename, True) + Log("Picture saved." & CRLF & "File size: " & File.Size(Dir, filename) & Dir &"," & filename) + p_camara.Visible = False + + Log(nombrefoto) + Log(nombrefoto1) + + If nombrefoto <> "0" Then + Dim img As B4XBitmap = xui.LoadBitmapResize(File.DirInternal & Dir, filename, 300, 450, True) + Dim out As OutputStream = File.OpenOutput(File.DirInternal & Dir & Dir2, filename, True) + img.WriteToStream(out, 100, "PNG") + out.Close + iv_ine.Bitmap = LoadBitmap(File.DirInternal & Dir & Dir2,nombrefoto) + End If + + If nombrefoto1 <> "0" Then + Dim img As B4XBitmap = xui.LoadBitmapResize(File.DirInternal & Dir, filename, 300, 450, True) + Dim out As OutputStream = File.OpenOutput(File.DirInternal & Dir & Dir2, filename, False) + img.WriteToStream(out, 100, "PNG") + out.Close + iv_gestion.Bitmap = LoadBitmap(File.DirInternal & Dir & Dir2,nombrefoto1) + End If + + StopCamera2 + +End Sub + +Private Sub p_camara_Click + +End Sub + +Private Sub b_foto_Click + camEx2.TakePicture + p_camara.Visible = False +' StopCamera2 +End Sub + +Private Sub StopCamera2 +' Capturing = False + If camEx2.IsInitialized Then + camEx2.Release + End If +End Sub + +Private Sub iv_gestion_Click + x = 2 + InitializeCamera2 + p_camara.Visible = True + b_gestion.Enabled = False +End Sub + +Private Sub cb_estatus_SelectedIndexChanged (Index As Int) + itemselect = cb_estatus.SelectedItem + Log(itemselect) + If itemselect = "RECHAZADO" Then + p_inci.Visible = True + ajustaTamano + Else If itemselect = "INTERMITENCIA" Or itemselect = "NO CONCLUIDO" Then + p_inci.Visible = True + p_inci2.Visible = True + ajustaTamano + Else + p_inci.Visible = False + p_inci2.Visible = False + ajustaTamano + End If +End Sub + +Private Sub b_cancelar_Click + et_nombre.Text = "" + et_telefono.Text = "" + et_correo.Text = "" + et_curp.Text = "" + iv_ine.Bitmap = LoadBitmap(File.DirAssets,"camara.png") + iv_gestion.Bitmap = LoadBitmap(File.DirAssets,"camara.png") + cb_estatus.SelectedIndex = 0 + p_scroll.Visible = False + p_gestion.Visible = False + b_gestion.Enabled = True + nombrefoto1 = "0" + nombrefoto = "0" + itemselect = "" + et_comentarios.Text = "" + et_observaciones.Text = "" + +End Sub + +Sub ajustaTamano + If p_inci.visible And p_inci2.Visible Then + Log("visible 1 y 2") + p_inci2.Top = p_inci.Top + p_inci.Height + b_cancelar.Top = p_inci2.Top + p_inci2.Height + 35 + b_finalizar.Top = p_inci2.Top + p_inci2.Height + 35 + Else If p_inci.Visible And p_inci2.visible = False Then + Log("visible 1") + b_cancelar.Top = p_inci.Top + p_inci.Height + 35 + b_finalizar.Top = p_inci.Top + p_inci.Height + 35 + Else If p_inci2.Visible And p_inci.Visible = False Then + Log("visible 2") + p_inci2.top = iv_ine.Top + iv_ine.Height + 35 + b_cancelar.Top = p_inci2.Top + p_inci2.Height + 35 + b_finalizar.Top = p_inci2.Top + p_inci2.Height + 35 + Else + Log("Invisible 1 y 2") + b_cancelar.Top = iv_ine.Top + iv_ine.Height + 45 + b_finalizar.Top = iv_ine.Top + iv_ine.Height + 45 + End If + p_gestion.Height = b_cancelar.Top + 150 + ScrollView1.Panel.Height = p_gestion.Height +End Sub + +Sub ajustaTamano2 + p_general.Height = b_gestion.Top + 200 + p_scroll.Top = p_general.Top + p_general.Height + p_scroll.Height = Root.Height - p_general.Height + + p_trabajadas.Top = p_general.Top + p_general.Height + p_trabajadas.Height = Root.Height - p_general.Height + + p_qr.Top = p_general.Top + p_general.Height + + ScrollView1.Height = p_scroll.Height +' ScrollView1.Top = p_general.Top + p_general.Height + +End Sub + +Private Sub b_finalizar_Click + If g.GPSEnabled=False Then + Dim result As Int= -3 + Do While result=-3 + result = Msgbox2("Habilitar el GPS", "Atencion","ACEPTAR","", "",LoadBitmap(File.DirAssets,"alert2.png")) + Select Case result + Case DialogResponse.POSITIVE + MsgboxAsync("Habilitar el GPS", "Atencion") + StartActivity(g.LocationSettingsIntent) + Case DialogResponse.NEGATIVE + + B4XPage_Appear + End Select + Loop + Else + Dim Dirp As String = File.DirInternal + Dim Dir As String + Dim Dir2 As String + Try + File.MakeDir(Dirp,"/GABINETE") + Dir = "/GABINETE" + Log("creado en promotoria " & Dirp & Dir) + Catch + Dir = "" + Log("creado en raiz") + End Try + + Try + File.MakeDir(Dirp & Dir,"/reduccion") + Dir2 = "/reduccion" + Log("creado en promotoria " & Dirp & Dir & Dir2) + Catch + Dir = "" + Log("creado en raiz") + End Try + + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + + If itemselect = "SELECCIONA UNA OPCION" Then + MsgboxAsync("Completa todo el formulario.","Atención") + Else If itemselect = "APROBADO" Then + If et_nombre.Text <> "" Then + If et_telefono.Text <> "" Then + If et_correo.Text <> "" Then + If et_curp.Text <> "" And et_curp.Text.Length = 18 Then + If nombrefoto <> "0" Then + If nombrefoto1 <> "0" Then + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PROMOTORIA(HIST_PM_FECHA, HIST_PR_NOMBRE,HIST_PR_TELEFONO, HIST_PR_CORREO, HIST_PR_CURP, HIST_PR_INE, HIST_PR_ESTATUS, HIST_PR_EVIDENCIA, HIST_PR_IDPROYECTO, HIST_PR_NOMBREPROYECTO, HIST_PR_IDSUCURSAL, HIST_PR_NOMBRESUCURSAL, HIST_PR_USUARIO, HIST_PR_LATITUD, HIST_PR_LONGITUD, HIST_PR_BATERIA,ENVIADO) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",Array As Object((sDate & " " & sTime), et_nombre.Text, et_telefono.Text, et_correo. Text, et_curp.Text, File.ReadBytes(File.DirInternal & Dir & Dir2, nombrefoto),itemselect,File.ReadBytes(File.DirInternal & Dir & Dir2, nombrefoto1),Starter.almacen,B4XPages.MainPage.login.nom_proyec,B4XPages.MainPage.login.sucursal,B4XPages.MainPage.login.suc_nom,B4XPages.MainPage.login.user, Starter.latitud, Starter.longitud, bateria,0)) + mandaPendientes + et_nombre.Text = "" + et_telefono.Text = "" + et_correo.Text = "" + et_curp.Text = "" + iv_ine.Bitmap = LoadBitmap(File.DirAssets,"camara.png") + iv_gestion.Bitmap = LoadBitmap(File.DirAssets,"camara.png") + cb_estatus.SelectedIndex = 0 + p_scroll.Visible = False + p_gestion.Visible = False + b_gestion.Enabled = True + nombrefoto1 = "0" + nombrefoto = "0" + itemselect = "" + + b_gestion.Enabled = True + + Else + MsgboxAsync("Captura las fotos.","Atención") + End If + Else + MsgboxAsync("Captura las fotos.","Atención") + End If + Else + MsgboxAsync("Captura un CURP valido.","Atención") + End If + Else + MsgboxAsync("Completa todo el formulario.","Atención") + End If + Else + MsgboxAsync("Completa todo el formulario.","Atención") + End If + Else + MsgboxAsync("Completa todo el formulario.","Atención") + End If + Else If itemselect = "RECHAZADO" Then + If et_nombre.Text <> "" Then + If et_telefono.Text <> "" Then + If et_correo.Text <> "" Then + If et_curp.Text <> "" And et_curp.Text.Length = 18 Then + If nombrefoto <> "0" Then + If nombrefoto1 <> "0" Then + If et_observaciones.Text <> "" Then + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PROMOTORIA(HIST_PM_FECHA, HIST_PR_NOMBRE,HIST_PR_TELEFONO, HIST_PR_CORREO, HIST_PR_CURP, HIST_PR_INE, HIST_PR_ESTATUS, HIST_PR_EVIDENCIA, HIST_PR_OBSERVACIONES, HIST_PR_IDPROYECTO, HIST_PR_NOMBREPROYECTO, HIST_PR_IDSUCURSAL, HIST_PR_NOMBRESUCURSAL, HIST_PR_USUARIO, HIST_PR_LATITUD, HIST_PR_LONGITUD, HIST_PR_BATERIA,ENVIADO) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",Array As Object((sDate & " " & sTime), et_nombre.Text, et_telefono.Text, et_correo. Text, et_curp.Text, File.ReadBytes(File.DirInternal & Dir & Dir2, nombrefoto),itemselect,File.ReadBytes(File.DirInternal & Dir & Dir2, nombrefoto1), et_observaciones.Text,Starter.almacen,B4XPages.MainPage.login.nom_proyec,B4XPages.MainPage.login.sucursal,B4XPages.MainPage.login.suc_nom,B4XPages.MainPage.login.user, Starter.latitud, Starter.longitud, bateria,0)) + mandaPendientes + et_nombre.Text = "" + et_telefono.Text = "" + et_correo.Text = "" + et_curp.Text = "" + iv_ine.Bitmap = LoadBitmap(File.DirAssets,"camara.png") + iv_gestion.Bitmap = LoadBitmap(File.DirAssets,"camara.png") + cb_estatus.SelectedIndex = 0 + p_scroll.Visible = False + p_gestion.Visible = False + b_gestion.Enabled = True + nombrefoto1 = "0" + nombrefoto = "0" + itemselect = "" + et_observaciones.Text = "" + + b_gestion.Enabled = True + + Else + MsgboxAsync("Completa todo el formulario.","Atención") + End If + Else + MsgboxAsync("Captura las fotos.","Atención") + End If + Else + MsgboxAsync("Captura las fotos.","Atención") + End If + Else + MsgboxAsync("Captura un CURP valido.","Atención") + End If + Else + MsgboxAsync("Completa todo el formulario.","Atención") + End If + Else + MsgboxAsync("Completa todo el formulario.","Atención") + End If + Else + MsgboxAsync("Completa todo el formulario.","Atención") + End If + Else If itemselect = "INTERMITENCIA" Or itemselect = "NO CONCLUIDO" Then + If et_nombre.Text <> "" Then + If et_telefono.Text <> "" Then + If et_correo.Text <> "" Then + If et_curp.Text <> "" And et_curp.Text.Length = 18 Then + If nombrefoto <> "0" Then + If nombrefoto1 <> "0" Then + If et_observaciones.Text <> "" Then + If et_comentarios.Text <> "" Then + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PROMOTORIA(HIST_PM_FECHA, HIST_PR_NOMBRE,HIST_PR_TELEFONO, HIST_PR_CORREO, HIST_PR_CURP, HIST_PR_INE, HIST_PR_ESTATUS, HIST_PR_EVIDENCIA, HIST_PR_OBSERVACIONES, HIST_PR_COMENTARIOERROR, HIST_PR_IDPROYECTO, HIST_PR_NOMBREPROYECTO, HIST_PR_IDSUCURSAL, HIST_PR_NOMBRESUCURSAL, HIST_PR_USUARIO, HIST_PR_LATITUD, HIST_PR_LONGITUD, HIST_PR_BATERIA, ENVIADO) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",Array As Object((sDate & " " & sTime), et_nombre.Text, et_telefono.Text, et_correo. Text, et_curp.Text, File.ReadBytes(File.DirInternal & Dir & Dir2, nombrefoto),itemselect,File.ReadBytes(File.DirInternal & Dir & Dir2, nombrefoto1), et_observaciones.Text, et_comentarios.Text, Starter.almacen,B4XPages.MainPage.login.nom_proyec,B4XPages.MainPage.login.sucursal,B4XPages.MainPage.login.suc_nom,B4XPages.MainPage.login.user, Starter.latitud, Starter.longitud, bateria,0)) + mandaPendientes + et_nombre.Text = "" + et_telefono.Text = "" + et_correo.Text = "" + et_curp.Text = "" + iv_ine.Bitmap = LoadBitmap(File.DirAssets,"camara.png") + iv_gestion.Bitmap = LoadBitmap(File.DirAssets,"camara.png") + cb_estatus.SelectedIndex = 0 + p_scroll.Visible = False + p_gestion.Visible = False + b_gestion.Enabled = True + nombrefoto1 = "0" + nombrefoto = "0" + itemselect = "" + et_comentarios.Text = "" + et_observaciones.Text = "" + + b_gestion.Enabled = True + + Else + MsgboxAsync("Completa todo el formulario.","Atención") + End If + Else + MsgboxAsync("Completa todo el formulario.","Atención") + End If + Else + MsgboxAsync("Captura las fotos.","Atención") + End If + Else + MsgboxAsync("Captura las fotos.","Atención") + End If + Else + MsgboxAsync("Captura un CURP valido.","Atención") + End If + Else + MsgboxAsync("Completa todo el formulario.","Atención") + End If + Else + MsgboxAsync("Completa todo el formulario.","Atención") + End If + Else + MsgboxAsync("Completa todo el formulario.","Atención") + End If + End If + End If +End Sub + +Sub mandaPendientes + Log("MandaPendientes") + 'PEDIDO (Pendientes) + c=Starter.skmt.ExecQuery("SELECT HIST_PM_FECHA, HIST_PR_NOMBRE,HIST_PR_TELEFONO, HIST_PR_CORREO, HIST_PR_CURP, HIST_PR_INE, HIST_PR_ESTATUS, HIST_PR_EVIDENCIA, HIST_PR_OBSERVACIONES, HIST_PR_COMENTARIOERROR, HIST_PR_IDPROYECTO, HIST_PR_NOMBREPROYECTO, HIST_PR_IDSUCURSAL, HIST_PR_NOMBRESUCURSAL, HIST_PR_USUARIO, HIST_PR_LATITUD, HIST_PR_LONGITUD, HIST_PR_BATERIA FROM HIST_PROMOTORIA WHERE ENVIADO <> 1") + Log($"GESTIONES PENDIENTES: ${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_GESTION_GABICO" + cmd.Parameters = Array As Object(c.GetString("HIST_PM_FECHA"), c.GetString("HIST_PR_NOMBRE"),c.GetString("HIST_PR_TELEFONO"), c.GetString("HIST_PR_CORREO"), c.GetString("HIST_PR_CURP"), c.GetBlob("HIST_PR_INE"), c.GetString("HIST_PR_ESTATUS"),c.GetBlob("HIST_PR_EVIDENCIA"), c.GetString("HIST_PR_OBSERVACIONES"), c.GetString("HIST_PR_COMENTARIOERROR"), c.GetString("HIST_PR_IDPROYECTO"), c.GetString("HIST_PR_NOMBREPROYECTO"), c.GetString("HIST_PR_IDSUCURSAL"), c.GetString("HIST_PR_NOMBRESUCURSAL"), c.GetString("HIST_PR_USUARIO"), c.GetString("HIST_PR_LATITUD"), c.GetString("HIST_PR_LONGITUD"), c.GetString("HIST_PR_BATERIA")) + reqManager.ExecuteCommand(cmd , $"ins_gestionPendientes_head_${c.GetString("HIST_PR_NOMBRE")}"$) + Next + End If +End Sub + + + +Sub JobDone(Job As HttpJob) + Log(Job.Success) + If Job.Success = False Then +' ToastMessageShow("Error: " & Job.ErrorMessage, True) + Else + LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211027 + If Job.JobName = "DBRequest" Then + Dim resultado As DBResult = reqManager.HandleJob(Job) + If resultado.Tag.As(String).IndexOf("ins_gestionPendientes_head_") > -1 Then + Private cliente As String= resultado.Tag + cliente = cliente.SubString(cliente.IndexOf("_")+24) + Log($"Cliente1:${cliente}"$) + For Each records() As Object In resultado.Rows + For Each k As String In resultado.Columns.Keys + Log(resultado.Tag & ": " & k & ": " & records(resultado.Columns.Get(k))) + Next + Next + Starter.skmt.ExecNonQuery($"UPDATE HIST_PROMOTORIA set ENVIADO = 1 where HIST_PR_NOMBRE = '${cliente}'"$) + End If + + + If resultado.Tag = "CODIGO" Then 'query tag + For Each records() As Object In resultado.Rows +' + Dim codigo As String = records(resultado.Columns.Get("TMP_CD_CODIGO")) + If codigo = et_codigo.Text Then + Log("SI ENVIE CODIGO") + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "delete_codigo_GABICO" + cmd.Parameters = Array As Object(B4XPages.MainPage.login.user, et_codigo.Text) + reqManager.ExecuteCommand(cmd, "delete") + + If l_codigo.Text = "Ingresa el codigo para el CHECK-OUT." Then + botonout + Else If l_codigo.Text = "Ingresa el codigo para el CHECK-IN." Then + botoncheck + Else If l_codigo.Text = "Ingresa el codigo para el REGRESO DE COMER." Then + botoncomidaentrada + Else If l_codigo.Text = "Ingresa el codigo para la SALIDA A COMER." Then + botoncomidasalida + End If + + + b_cancelarcodigo_Click + Else + ToastMessageShow ("Codigo incorrecto",True) + End If + Next + If resultado.Rows.Size = 0 Then + ToastMessageShow ("Codigo incorrecto",True) + End If + End If + End If + End If +End Sub + +Private Sub p_scroll_Click + MsgboxAsync("asdsadas","atencion") +End Sub + +Private Sub et_comentarios_TextChanged (Old As String, New As String) + If New.Length > 400 Then + et_comentarios.Text = Old + End If + ajustaTamano2 +End Sub + +Private Sub et_observaciones_TextChanged (Old As String, New As String) + If New.Length > 200 Then + et_observaciones.Text = Old + End If + ajustaTamano2 +End Sub + +Private Sub et_curp_TextChanged (Old As String, New As String) + If New.Length > 20 Then + et_curp.Text = Old + End If +End Sub + +Private Sub et_correo_TextChanged (Old As String, New As String) + If New.Length > 150 Then + et_correo.Text = Old + End If +End Sub + +Private Sub et_telefono_TextChanged (Old As String, New As String) + If New.Length > 25 Then + et_telefono.Text = Old + End If +End Sub + +Private Sub et_nombre_TextChanged (Old As String, New As String) + If New.Length > 250 Then + et_nombre.Text = Old + End If +End Sub + + +Private Sub b_cancelafoto_Click + p_camara.Visible = False + StopCamera2 +End Sub + +Private Sub iv_ine_Click + x = 1 + InitializeCamera2 + p_camara.Visible = True + b_gestion.Enabled = False +End Sub + +Private Sub b_comidaout_Click + If horaentradacomer Then + If Not(Subs.IsConnectedToInternet) Then + Msgbox("Habilita los datos del celular","Atención") + B4XPage_Appear + Else + If distance > 200 Then + Log("aqui") + MsgboxAsync("No estas cerca del punto asignado","Atención") + Else If distance < 200 Then + Log("validar") + DateTime.DateFormat = "dd/MM/yyyy" + sDate="%" & DateTime.Date(DateTime.Now) & "%" + C = Starter.skmt.ExecQuery2("SELECT * FROM HIST_CHECADO WHERE FECHA LIKE ? AND USUARIO = ?",Array As String(sDate, B4XPages.MainPage.login.user)) + Log(c.RowCount) + If c.RowCount < 6 Then + If g.GPSEnabled=False Then + Dim result As Int= -3 + Do While result=-3 + result = Msgbox2("Habilitar el GPS", "Atencion","ACEPTAR","", "",LoadBitmap(File.DirAssets,"alert2.png")) + Select Case result + Case DialogResponse.POSITIVE + MsgboxAsync("Habilitar el GPS", "Atencion") + StartActivity(g.LocationSettingsIntent) + Case DialogResponse.NEGATIVE + + B4XPage_Appear + End Select + Loop + Else + botoncomidaentrada + End If + Else + MsgboxAsync("No puedes hacer mas registros","Atención") + End If + End If + End If + Else If donde3 = "1" Then + Msgbox2Async(mensaje,"Atención", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (result As Int) + If result = DialogResponse.POSITIVE Then + + p_validacion.Visible = True + l_codigo.Text = "Ingresa el codigo para el REGRESO DE COMER." + + End If + Else If donde3 = "2" Then + Msgbox2Async(mensaje,"Atención", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (result As Int) + If result = DialogResponse.POSITIVE Then + + p_validacion.Visible = True + l_codigo.Text = "Ingresa el codigo para el REGRESO DE COMER." + + End If + End If +End Sub + +Sub botoncomidaentrada + g.Start(0,0) + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + + C = Starter.skmt.ExecQuery("SELECT * FROM CHECADO") + If c.RowCount = 0 Then + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(B4XPages.MainPage.login.user, B4XPages.MainPage.login.ID_EMP,B4XPages.MainPage.login.perfil, Starter.almacen, B4XPages.MainPage.login.sucursal, "REGRESO DE COMER", sDate &" " &sTime)) + Else + c.Position = 0 + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(c.GetString("USUARIO"),c.GetString("ID_EMP"),c.GetString("PERFIL"),c.GetString("PROYECTO"),c.GetString("SUCURSAL"),c.GetString("ESTATUS"),c.GetString("FECHA"))) + End If + Starter.skmt.ExecNonQuery("delete from CHECADO") + Starter.skmt.ExecNonQuery2("INSERT INTO CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(B4XPages.MainPage.login.user, B4XPages.MainPage.login.ID_EMP,B4XPages.MainPage.login.perfil, Starter.almacen, B4XPages.MainPage.login.sucursal, "REGRESO DE COMER", sDate &" " &sTime)) + + b_checkin.visible = False + b_checout.visible = True + b_comidain.Visible = False + b_comidaout.Visible = False + MsgboxAsync("Regreso de comer enviado con exito","Atención") + Mandacomidaout +End Sub + +Sub Mandacomidaout + DateTime.DateFormat = "dd/MM/yyyy" + sDate=DateTime.Date(DateTime.Now) + DateTime.TimeFormat = "HH:mm:ss" + sTime=DateTime.Time(DateTime.Now) + cmd.Initialize + cmd.Name = "insert_check_GABICO" + cmd.Parameters = Array As Object(B4XPages.MainPage.login.ID_EMP, Starter.almacen, sDate &" " &sTime,"MOVIL", "REGRESO DE COMER", B4XPages.MainPage.login.user, B4XPages.MainPage.login.sucursal, Starter.latitud, Starter.longitud) + reqManager.ExecuteCommand(cmd , "check") + B4XPage_Appear +End Sub + +Sub horaentradacomer As Boolean + + C = Starter.skmt.ExecQuery("SELECT * FROM CHECADO") + If c.RowCount > 0 Then + + c.Position = 0 + + DateTime.DateFormat = "dd/MM/yyyy HH:mm" + Dim p As Period + p.Hours = 0 + p.Minutes = 0 + Dim newDate As Long = DateUtils.AddPeriod(DateTime.Now, p) + Log(newDate) + Log(DateUtils.TicksToString(newDate)) + + Dim p2 As Period + p2.Hours = 1 + p2.Minutes = 0 + DateTime.DateFormat = "dd/MM/yyyy HH:mm" + Dim prueba3 As String = c.GetString("FECHA") + LogColor(prueba3.SubString2(0,16),Colors.Red) + Dim ticks2 As Long = DateTime.DateParse(prueba3.SubString2(0,16)) + LogColor(ticks2,Colors.red) + LogColor(DateTime.Date(ticks2),Colors.red) + Dim timeToCheck2 As Long = DateUtils.AddPeriod(ticks2, p2) + LogColor(DateUtils.TicksToString(timeToCheck2),Colors.red) + + Dim p2 As Period + p2.Hours = 1 + p2.Minutes = 10 + DateTime.DateFormat = "dd/MM/yyyy HH:mm" + Dim prueba As String = c.GetString("FECHA") + LogColor(prueba.SubString2(0,16),Colors.Red) + Dim ticks As Long = DateTime.DateParse(prueba3.SubString2(0,16)) + LogColor(ticks,Colors.red) + LogColor(DateTime.Date(ticks2),Colors.red) + Dim timeToCheck As Long = DateUtils.AddPeriod(ticks, p2) + LogColor(DateUtils.TicksToString(timeToCheck),Colors.red) + + If newDate >= timeToCheck2 And newDate < timeToCheck Then + donde3 = "0" + Return True + Else If newDate > timeToCheck Then + mensaje = "Tu horario de regreso ya paso, ingresa el codigo" + donde3 = "1" + Return False + Else If newDate < timeToCheck2 Then + mensaje = "Tu hora de comida aun no se cumple, ingresa el codigo" + donde3 = "2" + Return False + End If + End If + + + +End Sub + +Private Sub b_comidain_Click + If p_scroll.Visible = False Then + Log("Cumple panel invisible") + If horasalidacomer Then + If Not(Subs.IsConnectedToInternet) Then + Msgbox("Habilita los datos del celular","Atención") + B4XPage_Appear + Else + If distance > 200 Then + Log("aqui") + MsgboxAsync("No estas cerca del punto asignado","Atención") + Else If distance < 200 Then + Log("validar") + DateTime.DateFormat = "dd/MM/yyyy" + sDate="%" & DateTime.Date(DateTime.Now) & "%" + C = Starter.skmt.ExecQuery2("SELECT * FROM HIST_CHECADO WHERE FECHA LIKE ? AND USUARIO = ?",Array As String(sDate, B4XPages.MainPage.login.user)) + Log(c.RowCount) + If c.RowCount < 6 Then + If g.GPSEnabled=False Then + Dim result As Int= -3 + Do While result=-3 + result = Msgbox2("Habilitar el GPS", "Atencion","ACEPTAR","", "",LoadBitmap(File.DirAssets,"alert2.png")) + Select Case result + Case DialogResponse.POSITIVE + MsgboxAsync("Habilitar el GPS", "Atencion") + StartActivity(g.LocationSettingsIntent) + Case DialogResponse.NEGATIVE + + B4XPage_Appear + End Select + Loop + Else + botoncomidasalida + End If + Else + MsgboxAsync("No puedes hacer mas registros","Atención") + End If + End If + End If + Else If donde = "1" Then + Msgbox2Async(mensaje,"Atención", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (result As Int) + If result = DialogResponse.POSITIVE Then + + p_validacion.Visible = True + l_codigo.Text = "Ingresa el codigo para la SALIDA A COMER." + + End If + Else If donde = "2" Then + Msgbox2Async(mensaje,"Atención", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (result As Int) + If result = DialogResponse.POSITIVE Then + + p_validacion.Visible = True + l_codigo.Text = "Ingresa el codigo para la SALIDA A COMER." + + End If + End If + Else + MsgboxAsync("Necesitas acabar la gestion actual.","Atención") + End If +End Sub + +Sub botoncomidasalida + g.Start(0,0) + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + + C = Starter.skmt.ExecQuery("SELECT * FROM CHECADO") + If c.RowCount = 0 Then + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(B4XPages.MainPage.login.user, B4XPages.MainPage.login.ID_EMP,B4XPages.MainPage.login.perfil, Starter.almacen, B4XPages.MainPage.login.sucursal, "SALIDA A COMER", sDate &" " &sTime)) + Else + c.Position = 0 + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(c.GetString("USUARIO"),c.GetString("ID_EMP"),c.GetString("PERFIL"),c.GetString("PROYECTO"),c.GetString("SUCURSAL"),c.GetString("ESTATUS"),c.GetString("FECHA"))) + End If + Starter.skmt.ExecNonQuery("delete from CHECADO") + Starter.skmt.ExecNonQuery2("INSERT INTO CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(B4XPages.MainPage.login.user, B4XPages.MainPage.login.ID_EMP,B4XPages.MainPage.login.perfil, Starter.almacen, B4XPages.MainPage.login.sucursal, "SALIDA A COMER", sDate &" " &sTime)) + + b_checkin.visible = False + b_checout.visible = True + b_comidain.Visible = False + b_comidaout.Visible = True + MsgboxAsync("Salida a comer enviada con exito","Atención") + Mandacomidain +End Sub + +Sub Mandacomidain + DateTime.DateFormat = "dd/MM/yyyy" + sDate=DateTime.Date(DateTime.Now) + DateTime.TimeFormat = "HH:mm:ss" + sTime=DateTime.Time(DateTime.Now) + cmd.Initialize + cmd.Name = "insert_check_GABICO" + cmd.Parameters = Array As Object(B4XPages.MainPage.login.ID_EMP, Starter.almacen, sDate &" " &sTime,"MOVIL", "SALIDA A COMER", B4XPages.MainPage.login.user, B4XPages.MainPage.login.sucursal, Starter.latitud, Starter.longitud) + reqManager.ExecuteCommand(cmd , "check") + B4XPage_Appear +End Sub + +Sub horasalidacomer As Boolean + DateTime.DateFormat = "MM/dd/yyyy HH:mm" + Dim p As Period + p.Hours = 0 + p.Minutes = 0 + Dim newDate As Long = DateUtils.AddPeriod(DateTime.Now, p) + Log(newDate) + Log(DateUtils.TicksToString(newDate)) + + Dim p2 As Period + p2.Hours = 1 + p2.Minutes = 0 + DateTime.DateFormat = "MM/dd/yyyy HH:mm" + Dim fecha2 As String = DateTime.Date(DateTime.Now) + Dim prueba2() As String = Regex.Split(" ",fecha2) + LogColor(prueba2(0),Colors.red) + Dim prueba3 As String = prueba2(0) &" "&B4XPages.MainPage.login.horacomin&":00" + LogColor(prueba3,Colors.Red) + Dim ticks2 As Long = DateTime.DateParse(prueba3) + LogColor(ticks2,Colors.red) + LogColor(DateTime.Date(ticks2),Colors.red) + Dim timeToCheck2 As Long = DateUtils.AddPeriod(ticks2, p2) + LogColor(DateUtils.TicksToString(timeToCheck2),Colors.red) + + DateTime.TimeFormat = "hhmm" + Dim p3 As Period + p3.Hours = 0 + p3.Minutes = 0 + DateTime.DateFormat = "MM/dd/yyyy HH:mm" + Dim fecha As String = DateTime.Date(DateTime.Now) + Dim prueba1() As String = Regex.Split(" ",fecha) + Log(prueba1(0)) + Dim prueba As String = prueba1(0) &" "&B4XPages.MainPage.login.horacomin&":00" + LogColor(prueba,Colors.Red) + Dim ticks As Long = DateTime.DateParse(prueba) + Log(ticks) + Dim timeToCheck As Long = DateUtils.AddPeriod(ticks, p3) + Log(DateUtils.TicksToString(timeToCheck)) + + If newDate >= timeToCheck And newDate < timeToCheck2 Then + donde = "0" + Return True + Else If newDate > timeToCheck2 Then + donde = "1" + mensaje = "Tu horario de comida ya paso, ingresa el codigo" + Return False + Else If newDate < timeToCheck Then + donde = "2" + mensaje = "Aun no es tu horario de comida, ingresa el codigo" + Return False + Else + Return False + End If + +End Sub + +Private Sub b_aceptar_Click + mandacodigo +End Sub + +Private Sub p_validacion_Click + +End Sub + +Private Sub b_cancelarcodigo_Click + et_codigo.Text = "" + p_validacion.Visible = False +End Sub + +Sub mandacodigo + If et_codigo.Text <> "" Then + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_codigo_GABICO" + cmd.Parameters = Array As Object(B4XPages.MainPage.login.user, et_codigo.Text) + reqManager.ExecuteQuery(cmd , 0, "CODIGO") + Else If et_codigo.Text = "" Then + ToastMessageShow("No has ingresado ningun codigo",True) + End If +End Sub + + +Private Sub b_gestionadas_Click + DateTime.DateFormat = "dd/MM/yyyy" + sDate="%" & DateTime.Date(DateTime.Now) & "%" + Log(sDate&" "&B4XPages.MainPage.login.user) + If p_scroll.Visible = False Then + C = Starter.skmt.ExecQuery2("SELECT * FROM CHECADO WHERE USUARIO = ? AND FECHA LIKE ?",Array As String( B4XPages.MainPage.login.user, sDate)) + If c.RowCount > 0 Then + c.Position = 0 + Log(c.GetString("ESTATUS")) + If c.GetString("ESTATUS") = "ENTRADA" Or c.GetString("ESTATUS") = "SALIDA A COMER" Or c.GetString("ESTATUS") = "REGRESO DE COMER" Then + If Not(Subs.IsConnectedToInternet) Then + MsgboxAsync("Habilita los datos del celular","Atención") + B4XPage_Appear + Else + If distance > 200 Then + Log("aqui") + MsgboxAsync("No estas cerca del punto asignado","Atención") + Else If distance < 200 Then + If p_qr.IsInitialized And p_qr.Visible = True Then + Log("PANEL TRABAJADAS INVISIBLE") + p_qr.Visible = False + p_trabajadas.Visible = True + p_trabajadas.BringToFront + Else + p_trabajadas.Visible = True + End If + botongestionadas + + End If + End If + Else + Log(8) + MsgboxAsync("Por favor hacer el check-in","Atención") + End If + Else + Log(9) + MsgboxAsync("Por favor hacer el check-in","Atención") + End If + + Else + MsgboxAsync("Necesitas acabar la gestion actual.","Atención") + End If +End Sub + +Private Sub cb_aprobadas_CheckedChange(Checked As Boolean) + botongestionadas +End Sub + +Private Sub cb_rechazadas_CheckedChange(Checked As Boolean) + botongestionadas +End Sub + +Sub botongestionadas + c = Starter.skmt.ExecQuery("SELECT HIST_PR_NOMBRE, HIST_PR_ESTATUS FROM HIST_PROMOTORIA") + If c.RowCount > 0 Then + If cb_aprobadas.Checked = False And cb_rechazadas.Checked = False Then + c = Starter.skmt.ExecQuery("SELECT HIST_PR_NOMBRE, HIST_PR_ESTATUS FROM HIST_PROMOTORIA") + If c.RowCount > 0 Then + clv_gestionadas.Clear + For i = 0 To c.RowCount - 1 + c.Position = i + clv_gestionadas.Add(CreateListItem(c.GetString("HIST_PR_NOMBRE"),c.GetString("HIST_PR_ESTATUS")),i) + Next + c.Close + Else + clv_gestionadas.Clear + End If + Else If cb_aprobadas.Checked = True And cb_rechazadas.Checked = True Then + c = Starter.skmt.ExecQuery("SELECT HIST_PR_NOMBRE, HIST_PR_ESTATUS FROM HIST_PROMOTORIA") + If c.RowCount > 0 Then + clv_gestionadas.Clear + For i = 0 To c.RowCount - 1 + c.Position = i + clv_gestionadas.Add(CreateListItem(c.GetString("HIST_PR_NOMBRE"),c.GetString("HIST_PR_ESTATUS")),i) + Next + c.Close + Else + clv_gestionadas.Clear + End If + Else If cb_aprobadas.Checked = True And cb_rechazadas.Checked = False Then + c = Starter.skmt.ExecQuery2("SELECT HIST_PR_NOMBRE, HIST_PR_ESTATUS FROM HIST_PROMOTORIA WHERE HIST_PR_ESTATUS = ?", Array As String("APROBADO")) + If c.RowCount > 0 Then + clv_gestionadas.Clear + For i = 0 To c.RowCount - 1 + c.Position = i + clv_gestionadas.Add(CreateListItem(c.GetString("HIST_PR_NOMBRE"),c.GetString("HIST_PR_ESTATUS")),i) + Next + c.Close + Else + clv_gestionadas.Clear + End If + Else If cb_aprobadas.Checked = False And cb_rechazadas.Checked = True Then + c = Starter.skmt.ExecQuery2("SELECT HIST_PR_NOMBRE, HIST_PR_ESTATUS FROM HIST_PROMOTORIA WHERE HIST_PR_ESTATUS <> ?", Array As String("APROBADO")) + If c.RowCount > 0 Then + clv_gestionadas.Clear + For i = 0 To c.RowCount - 1 + c.Position = i + clv_gestionadas.Add(CreateListItem(c.GetString("HIST_PR_NOMBRE"),c.GetString("HIST_PR_ESTATUS")),i) + Next + c.Close + Else + clv_gestionadas.Clear + End If + End If + Else + p_trabajadas.Visible = False + ToastMessageShow("Aun no hay gestiones",True) + End If +End Sub + +Sub CreateListItem(nombre As String, estatus As String) As Panel + Dim p As B4XView = xui.CreatePanel("") +' p.SetLayoutAnimated(0, 0, 0, 1, 180) + p.LoadLayout("gestiones") + p.Height= 200dip +' p.Width = clv_orden.GetBase.Width +' contenidoorden.Width = Panelchecar.Width +' lb_numorden.Height = p.Height *0.8 + l_nombre.Text = nombre + l_estatus.Text = estatus +' Log(p.Width) + Return p +End Sub \ No newline at end of file diff --git a/B4A/C_supervisor.bas b/B4A/C_supervisor.bas new file mode 100644 index 0000000..c1bc599 --- /dev/null +++ b/B4A/C_supervisor.bas @@ -0,0 +1,1507 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=12.5 +@EndOfDesignText@ +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore + Private p_camara As Panel + Private b_foto As Button + Private p_cam As Panel + Private b_checkin As Button + Private b_checout As Button + Dim g As GPS + Private bu As BatteryUtilities + Dim batterystatus(11) As Int + Dim bateria As Int + Dim sDate, sTime As String + Dim cmd As DBCommand + Dim reqManager As DBRequestManager + Private Panel1 As Panel + Private Capturing As Boolean + + Private rp As RuntimePermissions + Private detector As JavaObject + Private camEx As CameraExClass + Private toast As BCToast + Private Capturing As Boolean + Private LastPreview As Long + Private IntervalBetweenPreviewsMs As Int = 100 + Private b_qr As Button + Dim texto1 As String + Private p_general As Panel + Private b_gestion As Button + Private ScrollView1 As ScrollView + Private p_scroll As Panel + Dim c As Cursor + Private p_gestion As Panel + Private cb_p1 As B4XComboBox + Private cb_p2 As B4XComboBox + Private cb_p3 As B4XComboBox + Private cb_p4 As B4XComboBox + Private cb_p5 As B4XComboBox + Private cb_p6 As B4XComboBox + Private cb_p7 As B4XComboBox + Private cb_p8 As B4XComboBox + Private cb_p9 As B4XComboBox + Private cb_p10 As B4XComboBox + Private cb_p11 As B4XComboBox + Private cb_p12 As B4XComboBox + Private cb_p13 As B4XComboBox + Private cb_p14 As B4XComboBox + Private cb_p15 As B4XComboBox + Private cb_p16 As B4XComboBox + Private cb_p17 As B4XComboBox + Private cb_p18 As B4XComboBox + Private cb_p19 As B4XComboBox + Dim itemselect1 As String + Dim itemselect2 As String + Dim itemselect3 As String + Dim itemselect4 As String + Dim itemselect5 As String + Dim itemselect6 As String + Dim itemselect7 As String + Dim itemselect8 As String + Dim itemselect8 As String + Dim itemselect9 As String + Dim itemselect10 As String + Dim itemselect11 As String + Dim itemselect12 As String + Dim itemselect13 As String + Dim itemselect14 As String + Dim itemselect15 As String + Dim itemselect16 As String + Dim itemselect17 As String + Dim itemselect18 As String + Dim itemselect19 As String + Dim teclado As IME + Private b_cancelar As Button + Private b_finalizar As Button + Private et_sup As EditText + Private Panel7 As Panel + Private NOMBRE As Label + Private temporal As Location + Private b_comidain As Button + Private b_comidaout As Button + + Dim mensaje As String + Dim donde As String + Dim donde1 As String + Dim donde2 As String + Dim donde3 As String + Private p_validacion As Panel + Private b_aceptar As Button + Private et_codigo As EditText + Private b_cancelarcodigo As Button + Private l_codigo As Label +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 + Root.LoadLayout("supervisor") + 'load the layout to Root + reqManager.Initialize(Me, Starter.DBReqServer) + g.Initialize("GPS") + toast.Initialize(Root) + StopCamera + + + + + ScrollView1.height = Root.Height - p_general.Height + p_scroll.height = Root.Height - p_general.Height + + Panel1.Width = Root.Width + Panel1.Height = Root.Height + p_validacion.Width = Root.Width + p_validacion.Height = Root.Height + p_general.Width = Root.Width + p_camara.Width = Root.Width + p_camara.Height = Root.Height + CreateDetector (Array("CODE_128", "CODE_93", "QR_CODE")) + + + +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Private Sub B4XPage_Appear + CheckAndRequestNotificationPermission + If g.GPSEnabled=False Then + Dim result As Int= -3 + Do While result=-3 + result = Msgbox2("Habilitar el GPS", "Atencion","ACEPTAR","", "",LoadBitmap(File.DirAssets,"alert2.png")) + Select Case result + Case DialogResponse.POSITIVE + MsgboxAsync("Habilitar el GPS", "Atencion") + StartActivity(g.LocationSettingsIntent) + Case DialogResponse.NEGATIVE + + B4XPage_Appear + End Select + Loop + End If + + DateTime.DateFormat = "dd/MM/yyyy" + sDate="%" & DateTime.Date(DateTime.Now) & "%" + Log(sDate&" "&B4XPages.MainPage.login.user) + + C = Starter.skmt.ExecQuery2("SELECT * FROM CHECADO WHERE FECHA LIKE ? AND USUARIO = ?",Array As String(sDate, B4XPages.MainPage.login.user)) + If c.RowCount > 0 Then + c.Position = 0 + If c.GetString("ESTATUS") = "ENTRADA" Then + b_checkin.visible = False + b_checout.visible = True + Else If c.GetString("ESTATUS") = "SALIDA" Then + b_checkin.visible = True + b_checout.visible = False + End If + Else If c.RowCount = 0 Then + b_checkin.visible = True + b_checout.visible = False + End If + + bu.Initialize + batterystatus = bu.BatteryInformation + bateria = batterystatus(0) + ajustaTamano2 + + Wait For (CheckAndRequestNotificationPermission) Complete (HasPermission As Boolean) + If HasPermission Then + Log("Con permisos de notificación") + Else + ToastMessageShow("No permission to show notification", True) + End If + + C = Starter.skmt.ExecQuery2("SELECT * FROM CHECADO WHERE FECHA LIKE ? AND USUARIO = ?",Array As String(sDate, B4XPages.MainPage.login.user)) + If c.RowCount > 0 Then + c.Position = 0 + If c.GetString("ESTATUS") = "ENTRADA" Then + b_checkin.visible = False + b_checout.visible = True + b_comidain.Visible = True + b_comidaout.Visible = False + Else If c.GetString("ESTATUS") = "SALIDA A COMER" Then + b_checkin.visible = False + b_checout.visible = True + b_comidain.Visible = False + b_comidaout.Visible = True + Else If c.GetString("ESTATUS") = "REGRESO DE COMER" Then + b_checkin.visible = False + b_checout.visible = True + b_comidain.Visible = False + b_comidaout.Visible = False + Else If c.GetString("ESTATUS") = "SALIDA" Then + b_checkin.visible = True + b_checout.visible = False + b_comidain.Visible = False + b_comidaout.Visible = False + End If + Else If c.RowCount = 0 Then + b_checkin.visible = True + b_checout.visible = False + b_comidain.Visible = False + b_comidaout.Visible = False + End If + + If b_checkin.Visible Then + b_qr.Visible = False + Else + b_qr.Visible = True + End If + +End Sub + + + + +'Sub ajustaTamano2 +' Panel1.Width = Root.Width +' Panel1.Height = Root.Height +' p_general.Height = b_gestion.Top + 200 +' +'End Sub + +'Make sure that targetSdkVersion >= 33 +Private Sub CheckAndRequestNotificationPermission As ResumableSub + Dim p As Phone + If p.SdkVersion < 33 Then Return True + Dim ctxt As JavaObject + ctxt.InitializeContext + Dim targetSdkVersion As Int = ctxt.RunMethodJO("getApplicationInfo", Null).GetField("targetSdkVersion") + If targetSdkVersion < 33 Then Return True + Dim NotificationsManager As JavaObject = ctxt.RunMethod("getSystemService", Array("notification")) + Dim NotificationsEnabled As Boolean = NotificationsManager.RunMethod("areNotificationsEnabled", Null) + If NotificationsEnabled Then Return True + Dim rp As RuntimePermissions + rp.CheckAndRequest(rp.PERMISSION_POST_NOTIFICATIONS) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) 'change to Activity_PermissionResult if non-B4XPages. + Return Result +End Sub + +Private Sub b_foto_Click + p_camara.Visible = False + StopCamera + Log(texto1) + Dim s() As String = Regex.Split(";", texto1) + temporal.Initialize2(s(10),s(11)) + Dim l1 As Location + l1.Initialize2(Starter.latitud, Starter.longitud) + Private distancias As String = temporal.DistanceTo(l1) + If distancias <= 200 Then + b_gestion_Click + Else + MsgboxAsync("Es necesario estar cerca del promotor.","Atención") + End If +End Sub + + +Private Sub b_checout_Click + If b_comidaout.Visible = False Then + If p_scroll.Visible = False Then + If horasalida Then + If g.GPSEnabled=False Then + Dim result As Int= -3 + Do While result=-3 + result = Msgbox2("Habilitar el GPS", "Atencion","ACEPTAR","", "",LoadBitmap(File.DirAssets,"alert2.png")) + Select Case result + Case DialogResponse.POSITIVE + MsgboxAsync("Habilitar el GPS", "Atencion") + StartActivity(g.LocationSettingsIntent) + Case DialogResponse.NEGATIVE + + B4XPage_Appear + End Select + Loop + Else + botonout + End If + Else If donde1 = "1" Then + Msgbox2Async(mensaje,"Atención", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (result As Int) + If result = DialogResponse.POSITIVE Then + + p_validacion.Visible = True + l_codigo.Text = "Ingresa el codigo para el CHECK-OUT." + + End If + Else If donde1 = "2" Then + Msgbox2Async(mensaje,"Atención", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (result As Int) + If result = DialogResponse.POSITIVE Then + + p_validacion.Visible = True + l_codigo.Text = "Ingresa el codigo para el CHECK-OUT." + + End If + End If + Else + MsgboxAsync("Necesitas acabar la gestion actual.","Atención") + End If + Else + MsgboxAsync("Necesitas hacer la entrada de comida.","Atención") + End If + +End Sub + +Private Sub b_checkin_Click + If horaentrada Then + If g.GPSEnabled=False Then + Dim result As Int= -3 + Do While result=-3 + result = Msgbox2("Habilitar el GPS", "Atencion","ACEPTAR","", "",LoadBitmap(File.DirAssets,"alert2.png")) + Select Case result + Case DialogResponse.POSITIVE + MsgboxAsync("Habilitar el GPS", "Atencion") + StartActivity(g.LocationSettingsIntent) + Case DialogResponse.NEGATIVE + + B4XPage_Appear + End Select + Loop + Else + botoncheck + End If + Else If donde2 = "1" Then + Msgbox2Async(mensaje,"Atención", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (result As Int) + If result = DialogResponse.POSITIVE Then + + p_validacion.Visible = True + l_codigo.Text = "Ingresa el codigo para el CHECK-IN." + + End If + Else If donde2 = "2" Then + Msgbox2Async(mensaje,"Atención", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (result As Int) + If result = DialogResponse.POSITIVE Then + + p_validacion.Visible = True + l_codigo.Text = "Ingresa el codigo para el CHECK-IN." + + End If + End If +End Sub + +Sub botonout + g.Start(0,0) + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + + + C = Starter.skmt.ExecQuery("SELECT * FROM CHECADO") + If c.RowCount = 0 Then + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(B4XPages.MainPage.login.user, B4XPages.MainPage.login.ID_EMP,B4XPages.MainPage.login.perfil, Starter.almacen, B4XPages.MainPage.login.sucursal, "ENTRADA", sDate &" " &sTime)) + Else + c.Position = 0 + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(c.GetString("USUARIO"),c.GetString("ID_EMP"),c.GetString("PERFIL"),c.GetString("PROYECTO"),c.GetString("SUCURSAL"),c.GetString("ESTATUS"),c.GetString("FECHA"))) + End If + b_checkin.visible = True + b_checout.visible = False + + + + Starter.skmt.ExecNonQuery("delete from CHECADO") + Starter.skmt.ExecNonQuery2("INSERT INTO CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(B4XPages.MainPage.login.user, B4XPages.MainPage.login.ID_EMP,B4XPages.MainPage.login.perfil, Starter.almacen, B4XPages.MainPage.login.sucursal, "SALIDA", sDate &" " &sTime)) + Mandaout + MsgboxAsync("Check-out enviado con exito","Atención") +End Sub + + +Sub botoncheck + g.Start(0,0) + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + + C = Starter.skmt.ExecQuery("SELECT * FROM CHECADO") + If c.RowCount = 0 Then + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(B4XPages.MainPage.login.user, B4XPages.MainPage.login.ID_EMP,B4XPages.MainPage.login.perfil, Starter.almacen, B4XPages.MainPage.login.sucursal, "ENTRADA", sDate &" " &sTime)) + Else + c.Position = 0 + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(c.GetString("USUARIO"),c.GetString("ID_EMP"),c.GetString("PERFIL"),c.GetString("PROYECTO"),c.GetString("SUCURSAL"),c.GetString("ESTATUS"),c.GetString("FECHA"))) + End If + + b_checkin.visible = False + b_checout.visible = True + Starter.skmt.ExecNonQuery("delete from CHECADO") + Starter.skmt.ExecNonQuery2("INSERT INTO CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(B4XPages.MainPage.login.user, B4XPages.MainPage.login.ID_EMP,B4XPages.MainPage.login.perfil, Starter.almacen, B4XPages.MainPage.login.sucursal, "ENTRADA", sDate &" " &sTime)) + Mandacheck + MsgboxAsync("Check-in enviado con exito","Atención") +End Sub + +Sub Mandacheck + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + cmd.Initialize + cmd.Name = "insert_check_GABICO" + cmd.Parameters = Array As Object(B4XPages.MainPage.login.ID_EMP, Starter.almacen, sDate &" " &sTime,"MOVIL", "ENTRADA", B4XPages.MainPage.login.user, B4XPages.MainPage.login.sucursal, Starter.latitud, Starter.longitud) + reqManager.ExecuteCommand(cmd , "check") + B4XPage_Appear +End Sub + +Sub Mandaout + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + cmd.Initialize + cmd.Name = "insert_check_GABICO" + cmd.Parameters = Array As Object(B4XPages.MainPage.login.ID_EMP, Starter.almacen, sDate &" " &sTime,"MOVIL", "SALIDA", B4XPages.MainPage.login.user, B4XPages.MainPage.login.sucursal, Starter.latitud, Starter.longitud) + reqManager.ExecuteCommand(cmd , "check") + B4XPage_Appear +End Sub + +Private Sub b_qr_Click + If Capturing = False Then + p_camara.Visible = True + StartCamera + Else + StopCamera + End If +End Sub + + +'CAMARA + +Private Sub B4XPage_Disappear + StopCamera +End Sub + +Private Sub StopCamera + Capturing = False + + p_cam.Visible = False + #if B4A + If camEx.IsInitialized Then + camEx.Release + End If + #Else If B4i + scanner.Stop + #end if +End Sub + +Private Sub StartCameraShared + + p_cam.Visible = True + Capturing = True +End Sub + +Private Sub FoundBarcode (msg As String) + texto1 = msg + toast.Show($"Found [Color=Blue][b][plain]${msg}[/plain][/b][/Color]"$) + b_foto_Click +End Sub + +Private Sub StartCamera + rp.CheckAndRequest(rp.PERMISSION_CAMERA) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) + If Result = False Then + toast.Show("No permission!") + Return + End If + StartCameraShared + camEx.Initialize(p_cam, False, Me, "Camera1") + Wait For Camera1_Ready (Success As Boolean) + If Success Then + camEx.SetContinuousAutoFocus + camEx.CommitParameters + camEx.StartPreview + Else + toast.Show("Error opening camera") + StopCamera + End If +End Sub + + +Private Sub CreateDetector (Codes As List) + Dim ctxt As JavaObject + ctxt.InitializeContext + Dim builder As JavaObject + builder.InitializeNewInstance("com/google/android/gms/vision/barcode/BarcodeDetector.Builder".Replace("/", "."), Array(ctxt)) + Dim barcodeClass As String = "com/google/android/gms/vision/barcode/Barcode".Replace("/", ".") + Dim barcodeStatic As JavaObject + barcodeStatic.InitializeStatic(barcodeClass) + Dim format As Int + For Each formatName As String In Codes + format = Bit.Or(format, barcodeStatic.GetField(formatName)) + Next + builder.RunMethod("setBarcodeFormats", Array(format)) + detector = builder.RunMethod("build", Null) + Dim operational As Boolean = detector.RunMethod("isOperational", Null) + If operational = False Then + toast.Show("Failed to create detector") + End If + b_qr.Enabled = operational +End Sub + +Private Sub Camera1_Preview (data() As Byte) + If DateTime.Now > LastPreview + IntervalBetweenPreviewsMs Then + 'Dim n As Long = DateTime.Now + Dim frameBuilder As JavaObject + Dim bb As JavaObject + bb = bb.InitializeStatic("java.nio.ByteBuffer").RunMethod("wrap", Array(data)) + frameBuilder.InitializeNewInstance("com/google/android/gms/vision/Frame.Builder".Replace("/", "."), Null) + Dim cs As CameraSize = camEx.GetPreviewSize + frameBuilder.RunMethod("setImageData", Array(bb, cs.Width, cs.Height, 842094169)) + Dim frame As JavaObject = frameBuilder.RunMethod("build", Null) + Dim SparseArray As JavaObject = detector.RunMethod("detect", Array(frame)) + LastPreview = DateTime.Now + Dim Matches As Int = SparseArray.RunMethod("size", Null) + If Matches > 0 Then + Dim barcode As JavaObject = SparseArray.RunMethod("valueAt", Array(0)) + Dim raw As String = barcode.GetField("rawValue") + FoundBarcode(raw) + End If + End If +End Sub + +Private Sub b_gestion_Click + + + p_scroll.Visible = True + ScrollView1.Visible = True + + ScrollView1.Panel.LoadLayout("gestion_sup") + ScrollView1.Panel.Height = p_gestion.Height + + p_scroll.BringToFront + b_gestion.Enabled = False + p_gestion.Visible = True + + Dim s() As String = Regex.Split(";", texto1) + NOMBRE.Text = s(2) + + Dim Items As List + Items.Initialize + Items.Clear + Items.Add("SELECCIONA UNA OPCION ") + Items.Add("CUMPLE") + Items.Add("NO CUMPLE") + Items.Add("RIESGO") + cb_p1.SetItems(Items) + cb_p2.SetItems(Items) + cb_p3.SetItems(Items) + cb_p4.SetItems(Items) + cb_p5.SetItems(Items) + cb_p6.SetItems(Items) + cb_p7.SetItems(Items) + cb_p8.SetItems(Items) + cb_p9.SetItems(Items) + cb_p10.SetItems(Items) + cb_p11.SetItems(Items) + cb_p12.SetItems(Items) + cb_p13.SetItems(Items) + cb_p14.SetItems(Items) + cb_p15.SetItems(Items) + cb_p16.SetItems(Items) + cb_p17.SetItems(Items) + cb_p18.SetItems(Items) + cb_p19.SetItems(Items) + itemselect1 = "SELECCIONA UNA OPCION" + itemselect2 = "SELECCIONA UNA OPCION" + itemselect3 = "SELECCIONA UNA OPCION" + itemselect4 = "SELECCIONA UNA OPCION" + itemselect5 = "SELECCIONA UNA OPCION" + itemselect6 = "SELECCIONA UNA OPCION" + itemselect7 = "SELECCIONA UNA OPCION" + itemselect8 = "SELECCIONA UNA OPCION" + itemselect9 = "SELECCIONA UNA OPCION" + itemselect10 = "SELECCIONA UNA OPCION" + itemselect11 = "SELECCIONA UNA OPCION" + itemselect12 = "SELECCIONA UNA OPCION" + itemselect13 = "SELECCIONA UNA OPCION" + itemselect14 = "SELECCIONA UNA OPCION" + itemselect15 = "SELECCIONA UNA OPCION" + itemselect16 = "SELECCIONA UNA OPCION" + itemselect17 = "SELECCIONA UNA OPCION" + itemselect18 = "SELECCIONA UNA OPCION" + itemselect19 = "SELECCIONA UNA OPCION" + +End Sub + +Private Sub cb_p19_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p19.SelectedItem = "CUMPLE" Then + itemselect19 = "1" + Else If cb_p19.SelectedItem = "NO CUMPLE" Then + itemselect19 = "2" + Else If cb_p19.SelectedItem = "RIESGO" Then + itemselect19 = "3" + End If + + teclado.HideKeyboard +End Sub + +Private Sub cb_p18_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p18.SelectedItem = "CUMPLE" Then + itemselect18 = "1" + Else If cb_p18.SelectedItem = "NO CUMPLE" Then + itemselect18 = "2" + Else If cb_p18.SelectedItem = "RIESGO" Then + itemselect18 = "3" + End If + teclado.HideKeyboard +End Sub + +Private Sub cb_p17_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p17.SelectedItem = "CUMPLE" Then + itemselect17 = "1" + Else If cb_p17.SelectedItem = "NO CUMPLE" Then + itemselect17 = "2" + Else If cb_p17.SelectedItem = "RIESGO" Then + itemselect17 = "3" + End If + teclado.HideKeyboard +End Sub + +Private Sub cb_p16_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p16.SelectedItem = "CUMPLE" Then + itemselect16 = "1" + Else If cb_p16.SelectedItem = "NO CUMPLE" Then + itemselect16 = "2" + Else If cb_p16.SelectedItem = "RIESGO" Then + itemselect16 = "3" + End If + teclado.HideKeyboard +End Sub + +Private Sub cb_p15_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p15.SelectedItem = "CUMPLE" Then + itemselect15 = "1" + Else If cb_p15.SelectedItem = "NO CUMPLE" Then + itemselect15 = "2" + Else If cb_p15.SelectedItem = "RIESGO" Then + itemselect15 = "3" + End If + teclado.HideKeyboard +End Sub + +Private Sub cb_p14_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p14.SelectedItem = "CUMPLE" Then + itemselect14 = "1" + Else If cb_p14.SelectedItem = "NO CUMPLE" Then + itemselect14 = "2" + Else If cb_p14.SelectedItem = "RIESGO" Then + itemselect14 = "3" + End If + teclado.HideKeyboard +End Sub + +Private Sub cb_p13_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p13.SelectedItem = "CUMPLE" Then + itemselect13 = "1" + Else If cb_p13.SelectedItem = "NO CUMPLE" Then + itemselect13 = "2" + Else If cb_p13.SelectedItem = "RIESGO" Then + itemselect13 = "3" + End If + teclado.HideKeyboard +End Sub + +Private Sub cb_p12_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p12.SelectedItem = "CUMPLE" Then + itemselect12 = "1" + Else If cb_p12.SelectedItem = "NO CUMPLE" Then + itemselect12 = "2" + Else If cb_p12.SelectedItem = "RIESGO" Then + itemselect12 = "3" + End If + teclado.HideKeyboard +End Sub + +Private Sub cb_p11_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p11.SelectedItem = "CUMPLE" Then + itemselect11 = "1" + Else If cb_p11.SelectedItem = "NO CUMPLE" Then + itemselect11 = "2" + Else If cb_p11.SelectedItem = "RIESGO" Then + itemselect11 = "3" + End If + teclado.HideKeyboard +End Sub + +Private Sub cb_p10_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p10.SelectedItem = "CUMPLE" Then + itemselect10 = "1" + Else If cb_p10.SelectedItem = "NO CUMPLE" Then + itemselect10 = "2" + Else If cb_p10.SelectedItem = "RIESGO" Then + itemselect10 = "3" + End If + teclado.HideKeyboard +End Sub + +Private Sub cb_p9_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p9.SelectedItem = "CUMPLE" Then + itemselect9 = "1" + Else If cb_p9.SelectedItem = "NO CUMPLE" Then + itemselect9 = "2" + Else If cb_p9.SelectedItem = "RIESGO" Then + itemselect9 = "3" + End If + teclado.HideKeyboard +End Sub + +Private Sub cb_p8_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p8.SelectedItem = "CUMPLE" Then + itemselect8 = "1" + Else If cb_p8.SelectedItem = "NO CUMPLE" Then + itemselect8 = "2" + Else If cb_p8.SelectedItem = "RIESGO" Then + itemselect8 = "3" + End If + teclado.HideKeyboard +End Sub + +Private Sub cb_p7_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p7.SelectedItem = "CUMPLE" Then + itemselect7 = "1" + Else If cb_p7.SelectedItem = "NO CUMPLE" Then + itemselect7 = "2" + Else If cb_p7.SelectedItem = "RIESGO" Then + itemselect7 = "3" + End If + teclado.HideKeyboard +End Sub + +Private Sub cb_p6_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p6.SelectedItem = "CUMPLE" Then + itemselect6 = "1" + Else If cb_p6.SelectedItem = "NO CUMPLE" Then + itemselect6 = "2" + Else If cb_p6.SelectedItem = "RIESGO" Then + itemselect6 = "3" + End If + teclado.HideKeyboard +End Sub + +Private Sub cb_p5_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p5.SelectedItem = "CUMPLE" Then + itemselect5 = "1" + Else If cb_p5.SelectedItem = "NO CUMPLE" Then + itemselect5 = "2" + Else If cb_p5.SelectedItem = "RIESGO" Then + itemselect5 = "3" + End If + teclado.HideKeyboard +End Sub + +Private Sub cb_p4_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p4.SelectedItem = "CUMPLE" Then + itemselect4 = "1" + Else If cb_p4.SelectedItem = "NO CUMPLE" Then + itemselect4 = "2" + Else If cb_p4.SelectedItem = "RIESGO" Then + itemselect4 = "3" + End If + teclado.HideKeyboard +End Sub + +Private Sub cb_p3_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p3.SelectedItem = "CUMPLE" Then + itemselect3 = "1" + Else If cb_p3.SelectedItem = "NO CUMPLE" Then + itemselect3 = "2" + Else If cb_p3.SelectedItem = "RIESGO" Then + itemselect3 = "3" + End If + teclado.HideKeyboard +End Sub + +Private Sub cb_p2_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p2.SelectedItem = "CUMPLE" Then + itemselect2 = "1" + Else If cb_p2.SelectedItem = "NO CUMPLE" Then + itemselect2 = "2" + Else If cb_p2.SelectedItem = "RIESGO" Then + itemselect2 = "3" + End If + teclado.HideKeyboard +End Sub + +Private Sub cb_p1_SelectedIndexChanged (Index As Int) + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + If cb_p1.SelectedItem = "CUMPLE" Then + itemselect1 = "1" + Else If cb_p1.SelectedItem = "NO CUMPLE" Then + itemselect1 = "2" + Else If cb_p1.SelectedItem = "RIESGO" Then + itemselect1 = "3" + End If + teclado.HideKeyboard +End Sub + +Private Sub et_sup_FocusChanged (HasFocus As Boolean) + p_gestion.Height = b_cancelar.Top + 650 + ScrollView1.Panel.Height = p_gestion.Height +End Sub + +Sub ajustaTamano2 + p_general.Height = b_gestion.Top + 200 + p_scroll.Top = p_general.Top + p_general.Height + p_scroll.Height = Root.Height - p_general.Height + ScrollView1.Height = p_scroll.Height +' ScrollView1.Top = p_general.Top + p_general.Height + +End Sub + +Private Sub b_finalizar_Click + If itemselect1 <> "SELECCIONA UNA OPCION" And itemselect2 <> "SELECCIONA UNA OPCION" And itemselect3 <> "SELECCIONA UNA OPCION" And itemselect4 <> "SELECCIONA UNA OPCION" And itemselect5 <> "SELECCIONA UNA OPCION" And itemselect6 <> "SELECCIONA UNA OPCION" And itemselect7 <> "SELECCIONA UNA OPCION" And itemselect8 <> "SELECCIONA UNA OPCION" And itemselect9 <> "SELECCIONA UNA OPCION" And itemselect10 <> "SELECCIONA UNA OPCION" And itemselect11 <> "SELECCIONA UNA OPCION" And itemselect12 <> "SELECCIONA UNA OPCION" And itemselect13 <> "SELECCIONA UNA OPCION" And itemselect14 <> "SELECCIONA UNA OPCION" And itemselect15 <> "SELECCIONA UNA OPCION" And itemselect16 <> "SELECCIONA UNA OPCION" And itemselect17 <> "SELECCIONA UNA OPCION" And itemselect18 <> "SELECCIONA UNA OPCION" And itemselect19 <> "SELECCIONA UNA OPCION" And et_sup.Text <> "" Then + + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Dim s() As String = Regex.Split(";", texto1) + Log(s.Length) + Log(s(1)) + Log(s(2)) + Log(s(3)) + Log(s(4)) + Log(s(5)) + Log(s(6)) + Log(s(7)) + Log(s(8)) + Dim fe() As String = Regex.Split(" ", s(6)) + Log(fe(1)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"1",itemselect1,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"2",itemselect2,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"3",itemselect3,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"4",itemselect4,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"5",itemselect5,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"6",itemselect6,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"7",itemselect7,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"8",itemselect8,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"9",itemselect9,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"10",itemselect10,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"11",itemselect11,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"12",itemselect12,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"13",itemselect13,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"14",itemselect14,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"15",itemselect15,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"16",itemselect16,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"17",itemselect17,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"18",itemselect18,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"19",itemselect19,"","de " & fe(1) & " a "&sTime, 0)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_SUPERVISOR(HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO, ENVIADO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", Array As String(s(4),s(9),s(5),s(8),B4XPages.MainPage.login.ID_EMP,s(1), sDate,"20","",et_sup.Text,"de " & fe(1) & " a "&sTime, 0)) + + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + + p_scroll.Visible = False + p_gestion.Visible = False + b_gestion.Enabled = True + et_sup.Text = "" + itemselect1 = "SELECCIONA UNA OPCION" + itemselect2 = "SELECCIONA UNA OPCION" + itemselect3 = "SELECCIONA UNA OPCION" + itemselect4 = "SELECCIONA UNA OPCION" + itemselect5 = "SELECCIONA UNA OPCION" + itemselect6 = "SELECCIONA UNA OPCION" + itemselect7 = "SELECCIONA UNA OPCION" + itemselect8 = "SELECCIONA UNA OPCION" + itemselect9 = "SELECCIONA UNA OPCION" + itemselect10 = "SELECCIONA UNA OPCION" + itemselect11 = "SELECCIONA UNA OPCION" + itemselect12 = "SELECCIONA UNA OPCION" + itemselect13 = "SELECCIONA UNA OPCION" + itemselect14 = "SELECCIONA UNA OPCION" + itemselect15 = "SELECCIONA UNA OPCION" + itemselect16 = "SELECCIONA UNA OPCION" + itemselect17 = "SELECCIONA UNA OPCION" + itemselect18 = "SELECCIONA UNA OPCION" + itemselect19 = "SELECCIONA UNA OPCION" + teclado.HideKeyboard + + mandaPendientes + + Else + MsgboxAsync("Captura todos los datos","Atención") + End If +End Sub + +Private Sub b_cancelar_Click + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + + p_scroll.Visible = False + p_gestion.Visible = False + b_gestion.Enabled = True + et_sup.Text = "" + itemselect1 = "SELECCIONA UNA OPCION" + itemselect2 = "SELECCIONA UNA OPCION" + itemselect3 = "SELECCIONA UNA OPCION" + itemselect4 = "SELECCIONA UNA OPCION" + itemselect5 = "SELECCIONA UNA OPCION" + itemselect6 = "SELECCIONA UNA OPCION" + itemselect7 = "SELECCIONA UNA OPCION" + itemselect8 = "SELECCIONA UNA OPCION" + itemselect9 = "SELECCIONA UNA OPCION" + itemselect10 = "SELECCIONA UNA OPCION" + itemselect11 = "SELECCIONA UNA OPCION" + itemselect12 = "SELECCIONA UNA OPCION" + itemselect13 = "SELECCIONA UNA OPCION" + itemselect14 = "SELECCIONA UNA OPCION" + itemselect15 = "SELECCIONA UNA OPCION" + itemselect16 = "SELECCIONA UNA OPCION" + itemselect17 = "SELECCIONA UNA OPCION" + itemselect18 = "SELECCIONA UNA OPCION" + itemselect19 = "SELECCIONA UNA OPCION" + teclado.HideKeyboard +End Sub + +Private Sub et_sup_TextChanged (Old As String, New As String) + If New.Length > 200 Then + et_sup.Text = Old + End If + + p_gestion.Height = b_cancelar.Top + 650 + ScrollView1.Panel.Height = p_gestion.Height + +End Sub + +Private Sub p_gestion_Click + teclado.HideKeyboard + p_gestion.Height = b_cancelar.Top + 110 + ScrollView1.Panel.Height = p_gestion.Height + teclado.HideKeyboard +End Sub + +Private Sub Panel7_Click + Panel7.Visible = False + et_sup.BringToFront + p_gestion.Height = b_cancelar.Top + 650 + ScrollView1.Panel.Height = p_gestion.Height +End Sub + +Sub mandaPendientes + Log("MandaPendientes") + 'PEDIDO (Pendientes) + c=Starter.skmt.ExecQuery("SELECT HIST_CHKS_PROYECTO, HIST_CHKS_NOMPROY, HIST_CHKS_SUCURSAL, HIST_CHKS_FORMATO, HIST_CHKS_SUPERVISOR, HIST_CHKS_PROMOTOR, HIST_CHKS_FECHA, HIST_CHKS_ID, HIST_CHKS_CALIF_MULTIPLE, HIST_CHKS_CALIF_ABIERTA, HIST_CHKS_HORARIO FROM HIST_SUPERVISOR WHERE ENVIADO <> 1") + Log($"GESTIONES PENDIENTES: ${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_gestionsuper_GABICO" + cmd.Parameters = Array As Object(c.GetString("HIST_CHKS_PROYECTO"), c.GetString("HIST_CHKS_NOMPROY"),c.GetString("HIST_CHKS_SUCURSAL"), c.GetString("HIST_CHKS_FORMATO"), c.GetString("HIST_CHKS_SUPERVISOR"), c.GetString("HIST_CHKS_PROMOTOR"), c.GetString("HIST_CHKS_FECHA"),c.GetString("HIST_CHKS_ID"), c.GetString("HIST_CHKS_CALIF_MULTIPLE"), c.GetString("HIST_CHKS_CALIF_ABIERTA"), c.GetString("HIST_CHKS_HORARIO")) + reqManager.ExecuteCommand(cmd , $"ins_superviPendientes_head_${c.GetString("HIST_CHKS_ID")}_${c.GetString("HIST_CHKS_PROMOTOR")}"$) + Next + End If +End Sub + +Sub JobDone(Job As HttpJob) + Log(Job.Success) + If Job.Success = False Then +' ToastMessageShow("Error: " & Job.ErrorMessage, True) + Else + LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211027 + If Job.JobName = "DBRequest" Then + Dim resultado As DBResult = reqManager.HandleJob(Job) + If resultado.Tag.As(String).IndexOf("ins_superviPendientes_head_") > -1 Then + Private cliente As String= resultado.Tag + cliente = cliente.SubString(cliente.IndexOf("_")+24) + Private check() As String = Regex.Split("_", cliente) + Log(check(0)) + Log(check(1)) + Log($"Cliente1:${cliente}"$) + For Each records() As Object In resultado.Rows + For Each k As String In resultado.Columns.Keys + Log(resultado.Tag & ": " & k & ": " & records(resultado.Columns.Get(k))) + Next + Next + Starter.skmt.ExecNonQuery($"UPDATE HIST_SUPERVISOR set ENVIADO = 1 where HIST_CHKS_ID = '${check(0)}' AND HIST_CHKS_PROMOTOR = '${check(1)}'"$) + End If + + If resultado.Tag = "CODIGO" Then 'query tag + For Each records() As Object In resultado.Rows +' + Dim codigo As String = records(resultado.Columns.Get("TMP_CD_CODIGO")) + If codigo = et_codigo.Text Then + Log("SI ENVIE CODIGO") + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "delete_codigo_GABICO" + cmd.Parameters = Array As Object(B4XPages.MainPage.login.user, et_codigo.Text) + reqManager.ExecuteCommand(cmd, "delete") + + If l_codigo.Text = "Ingresa el codigo para el CHECK-OUT." Then + botonout + Else If l_codigo.Text = "Ingresa el codigo para el CHECK-IN." Then + botoncheck + Else If l_codigo.Text = "Ingresa el codigo para el REGRESO DE COMER." Then + botoncomidaentrada + Else If l_codigo.Text = "Ingresa el codigo para la SALIDA A COMER." Then + botoncomidasalida + End If + + + b_cancelarcodigo_Click + Else + ToastMessageShow ("Codigo incorrecto",True) + End If + Next + If resultado.Rows.Size = 0 Then + ToastMessageShow ("Codigo incorrecto",True) + End If + End If + End If + End If +End Sub + + +Private Sub b_cancelafoto_Click + p_camara.Visible = False + StopCamera +End Sub + +Sub horasalida As Boolean + + Dim p As Period + p.Hours = 0 + p.Minutes = 0 + Dim newDate As Long = DateUtils.AddPeriod(DateTime.Now, p) + Log(newDate) + Log(DateUtils.TicksToString(newDate)) + + Dim p2 As Period + p2.Hours = 1 + p2.Minutes = 0 + DateTime.DateFormat = "MM/dd/yyyy HH:mm" + Dim fecha2 As String = DateTime.Date(DateTime.Now) + Dim prueba2() As String = Regex.Split(" ",fecha2) + LogColor(prueba2(0),Colors.red) + Dim prueba3 As String = prueba2(0) &" "&B4XPages.MainPage.login.horaout&":00" + LogColor(prueba3,Colors.Red) + Dim ticks2 As Long = DateTime.DateParse(prueba3) + LogColor(ticks2,Colors.red) + LogColor(DateTime.Date(ticks2),Colors.red) + Dim timeToCheck2 As Long = DateUtils.AddPeriod(ticks2, p2) + LogColor(DateUtils.TicksToString(timeToCheck2),Colors.red) + + DateTime.TimeFormat = "hhmm" + Dim p3 As Period + p3.Hours = 0 + p3.Minutes = 0 + DateTime.DateFormat = "MM/dd/yyyy HH:mm" + Dim fecha As String = DateTime.Date(DateTime.Now) + Dim prueba1() As String = Regex.Split(" ",fecha) + Log(prueba1(0)) + Dim prueba As String = prueba1(0) &" "&B4XPages.MainPage.login.horaout&":00" + LogColor(prueba,Colors.Red) + Dim ticks As Long = DateTime.DateParse(prueba) + Log(ticks) + Dim timeToCheck As Long = DateUtils.AddPeriod(ticks, p3) + Log(DateUtils.TicksToString(timeToCheck)) + + If newDate >= timeToCheck And newDate <= timeToCheck2 Then + donde1 = "0" + Log("0") + Return True + Else If newDate > timeToCheck2 Then + donde1 = "1" + Log("1") + mensaje = "La hora maxima para hacer el check-out ha terminado, ingresa el codigo" + Return False + Else If newDate < timeToCheck Then + donde1 = "2" + Log("2") + mensaje = "Aun no es tu horario de salida, ingresa el codigo" + Return False + Else + Return False + End If + +End Sub + +Sub horaentrada As Boolean + + Dim p As Period + p.Hours = 0 + p.Minutes = 0 + Dim newDate As Long = DateUtils.AddPeriod(DateTime.Now, p) + Log(newDate) + Log(DateUtils.TicksToString(newDate)) + + Dim p2 As Period + p2.Hours = 0 + p2.Minutes = 20 + DateTime.DateFormat = "MM/dd/yyyy HH:mm" + Dim fecha2 As String = DateTime.Date(DateTime.Now) + Dim prueba2() As String = Regex.Split(" ",fecha2) + LogColor(prueba2(0),Colors.red) + Dim prueba3 As String = prueba2(0) &" "&B4XPages.MainPage.login.horain&":00" + LogColor(prueba3,Colors.Red) + Dim ticks2 As Long = DateTime.DateParse(prueba3) + LogColor(ticks2,Colors.red) + LogColor(DateTime.Date(ticks2),Colors.red) + Dim timeToCheck2 As Long = DateUtils.AddPeriod(ticks2, p2) + LogColor(DateUtils.TicksToString(timeToCheck2),Colors.red) + + DateTime.TimeFormat = "hhmm" + Dim p3 As Period + p3.Hours = 0 + p3.Minutes = -30 + DateTime.DateFormat = "MM/dd/yyyy HH:mm" + Dim fecha As String = DateTime.Date(DateTime.Now) + Dim prueba1() As String = Regex.Split(" ",fecha) + Log(prueba1(0)) + Dim prueba As String = prueba1(0) &" "&B4XPages.MainPage.login.horain&":00" + LogColor(prueba,Colors.Red) + Dim ticks As Long = DateTime.DateParse(prueba) + Log(ticks) + Dim timeToCheck As Long = DateUtils.AddPeriod(ticks, p3) + Log(DateUtils.TicksToString(timeToCheck)) + + If newDate >= timeToCheck And newDate < timeToCheck2 Then + donde2 = "0" + Return True + Else If newDate > timeToCheck2 Then + donde2 = "1" + mensaje = "La tolerancia del check-in paso, por favor, ingresa el codigo" + Return False + Else If newDate < timeToCheck Then + donde2 = "1" + mensaje = "Aun no es tu horario de entrada, ingresa el codigo" + Return False + Else + Return False + End If + +End Sub + + +Private Sub b_comidaout_Click + If horaentradacomer Then + If Not(Subs.IsConnectedToInternet) Then + Msgbox("Habilita los datos del celular","Atención") + B4XPage_Appear + Else + Log("validar") + DateTime.DateFormat = "dd/MM/yyyy" + sDate="%" & DateTime.Date(DateTime.Now) & "%" + C = Starter.skmt.ExecQuery2("SELECT * FROM HIST_CHECADO WHERE FECHA LIKE ? AND USUARIO = ?",Array As String(sDate, B4XPages.MainPage.login.user)) + Log(c.RowCount) + If c.RowCount < 6 Then + If g.GPSEnabled=False Then + Dim result As Int= -3 + Do While result=-3 + result = Msgbox2("Habilitar el GPS", "Atencion","ACEPTAR","", "",LoadBitmap(File.DirAssets,"alert2.png")) + Select Case result + Case DialogResponse.POSITIVE + MsgboxAsync("Habilitar el GPS", "Atencion") + StartActivity(g.LocationSettingsIntent) + Case DialogResponse.NEGATIVE + + B4XPage_Appear + End Select + Loop + Else + botoncomidaentrada + End If + Else + MsgboxAsync("No puedes hacer mas registros","Atención") + End If + End If + Else If donde3 = "1" Then + Msgbox2Async(mensaje,"Atención", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (result As Int) + If result = DialogResponse.POSITIVE Then + + p_validacion.Visible = True + l_codigo.Text = "Ingresa el codigo para el REGRESO DE COMER." + + End If + Else If donde3 = "2" Then + Msgbox2Async(mensaje,"Atención", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (result As Int) + If result = DialogResponse.POSITIVE Then + + p_validacion.Visible = True + l_codigo.Text = "Ingresa el codigo para el REGRESO DE COMER." + + End If + End If +End Sub + +Sub botoncomidaentrada + g.Start(0,0) + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + + C = Starter.skmt.ExecQuery("SELECT * FROM CHECADO") + If c.RowCount = 0 Then + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(B4XPages.MainPage.login.user, B4XPages.MainPage.login.ID_EMP,B4XPages.MainPage.login.perfil, Starter.almacen, B4XPages.MainPage.login.sucursal, "REGRESO DE COMER", sDate &" " &sTime)) + Else + c.Position = 0 + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(c.GetString("USUARIO"),c.GetString("ID_EMP"),c.GetString("PERFIL"),c.GetString("PROYECTO"),c.GetString("SUCURSAL"),c.GetString("ESTATUS"),c.GetString("FECHA"))) + End If + Starter.skmt.ExecNonQuery("delete from CHECADO") + Starter.skmt.ExecNonQuery2("INSERT INTO CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(B4XPages.MainPage.login.user, B4XPages.MainPage.login.ID_EMP,B4XPages.MainPage.login.perfil, Starter.almacen, B4XPages.MainPage.login.sucursal, "REGRESO DE COMER", sDate &" " &sTime)) + + b_checkin.visible = False + b_checout.visible = True + b_comidain.Visible = False + b_comidaout.Visible = False + MsgboxAsync("Regreso de comer enviado con exito","Atención") + Mandacomidaout +End Sub + +Sub Mandacomidaout + DateTime.DateFormat = "dd/MM/yyyy" + sDate=DateTime.Date(DateTime.Now) + DateTime.TimeFormat = "HH:mm:ss" + sTime=DateTime.Time(DateTime.Now) + cmd.Initialize + cmd.Name = "insert_check_GABICO" + cmd.Parameters = Array As Object(B4XPages.MainPage.login.ID_EMP, Starter.almacen, sDate &" " &sTime,"MOVIL", "REGRESO DE COMER", B4XPages.MainPage.login.user, B4XPages.MainPage.login.sucursal, Starter.latitud, Starter.longitud) + reqManager.ExecuteCommand(cmd , "check") + B4XPage_Appear +End Sub + +Sub horaentradacomer As Boolean + + C = Starter.skmt.ExecQuery("SELECT * FROM CHECADO") + If c.RowCount > 0 Then + + c.Position = 0 + + DateTime.DateFormat = "dd/MM/yyyy HH:mm" + Dim p As Period + p.Hours = 0 + p.Minutes = 0 + Dim newDate As Long = DateUtils.AddPeriod(DateTime.Now, p) + Log(newDate) + Log(DateUtils.TicksToString(newDate)) + + Dim p2 As Period + p2.Hours = 1 + p2.Minutes = 0 + DateTime.DateFormat = "dd/MM/yyyy HH:mm" + Dim prueba3 As String = c.GetString("FECHA") + LogColor(prueba3.SubString2(0,16),Colors.Red) + Dim ticks2 As Long = DateTime.DateParse(prueba3.SubString2(0,16)) + LogColor(ticks2,Colors.red) + LogColor(DateTime.Date(ticks2),Colors.red) + Dim timeToCheck2 As Long = DateUtils.AddPeriod(ticks2, p2) + LogColor(DateUtils.TicksToString(timeToCheck2),Colors.red) + + Dim p2 As Period + p2.Hours = 1 + p2.Minutes = 10 + DateTime.DateFormat = "dd/MM/yyyy HH:mm" + Dim prueba As String = c.GetString("FECHA") + LogColor(prueba.SubString2(0,16),Colors.Red) + Dim ticks As Long = DateTime.DateParse(prueba3.SubString2(0,16)) + LogColor(ticks,Colors.red) + LogColor(DateTime.Date(ticks2),Colors.red) + Dim timeToCheck As Long = DateUtils.AddPeriod(ticks, p2) + LogColor(DateUtils.TicksToString(timeToCheck),Colors.red) + + If newDate >= timeToCheck2 And newDate < timeToCheck Then + donde3 = "0" + Return True + Else If newDate > timeToCheck Then + mensaje = "Tu horario de regreso ya paso, ingresa el codigo" + donde3 = "1" + Return False + Else If newDate < timeToCheck2 Then + mensaje = "Tu hora de comida aun no se cumple, ingresa el codigo" + donde3 = "2" + Return False + End If + End If + + + +End Sub + +Private Sub b_comidain_Click + If p_scroll.Visible = False Then + Log("Cumple panel invisible") + If horasalidacomer Then + If Not(Subs.IsConnectedToInternet) Then + Msgbox("Habilita los datos del celular","Atención") + B4XPage_Appear + Else + Log("validar") + DateTime.DateFormat = "dd/MM/yyyy" + sDate="%" & DateTime.Date(DateTime.Now) & "%" + C = Starter.skmt.ExecQuery2("SELECT * FROM HIST_CHECADO WHERE FECHA LIKE ? AND USUARIO = ?",Array As String(sDate, B4XPages.MainPage.login.user)) + Log(c.RowCount) + If c.RowCount < 6 Then + If g.GPSEnabled=False Then + Dim result As Int= -3 + Do While result=-3 + result = Msgbox2("Habilitar el GPS", "Atencion","ACEPTAR","", "",LoadBitmap(File.DirAssets,"alert2.png")) + Select Case result + Case DialogResponse.POSITIVE + MsgboxAsync("Habilitar el GPS", "Atencion") + StartActivity(g.LocationSettingsIntent) + Case DialogResponse.NEGATIVE + + B4XPage_Appear + End Select + Loop + Else + botoncomidasalida + End If + Else + MsgboxAsync("No puedes hacer mas registros","Atención") + End If + End If + Else If donde = "1" Then + Msgbox2Async(mensaje,"Atención", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (result As Int) + If result = DialogResponse.POSITIVE Then + + p_validacion.Visible = True + l_codigo.Text = "Ingresa el codigo para la SALIDA A COMER." + + End If + Else If donde = "2" Then + Msgbox2Async(mensaje,"Atención", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (result As Int) + If result = DialogResponse.POSITIVE Then + + p_validacion.Visible = True + l_codigo.Text = "Ingresa el codigo para la SALIDA A COMER." + + End If + End If + Else + MsgboxAsync("Necesitas acabar la gestion actual.","Atención") + End If +End Sub + +Sub botoncomidasalida + g.Start(0,0) + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + + C = Starter.skmt.ExecQuery("SELECT * FROM CHECADO") + If c.RowCount = 0 Then + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(B4XPages.MainPage.login.user, B4XPages.MainPage.login.ID_EMP,B4XPages.MainPage.login.perfil, Starter.almacen, B4XPages.MainPage.login.sucursal, "SALIDA A COMER", sDate &" " &sTime)) + Else + c.Position = 0 + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(c.GetString("USUARIO"),c.GetString("ID_EMP"),c.GetString("PERFIL"),c.GetString("PROYECTO"),c.GetString("SUCURSAL"),c.GetString("ESTATUS"),c.GetString("FECHA"))) + End If + Starter.skmt.ExecNonQuery("delete from CHECADO") + Starter.skmt.ExecNonQuery2("INSERT INTO CHECADO(USUARIO, ID_EMP, PERFIL, PROYECTO, SUCURSAL, ESTATUS, FECHA) VALUES(?,?,?,?,?,?,?)", Array As String(B4XPages.MainPage.login.user, B4XPages.MainPage.login.ID_EMP,B4XPages.MainPage.login.perfil, Starter.almacen, B4XPages.MainPage.login.sucursal, "SALIDA A COMER", sDate &" " &sTime)) + + b_checkin.visible = False + b_checout.visible = True + b_comidain.Visible = False + b_comidaout.Visible = True + MsgboxAsync("Salida a comer enviada con exito","Atención") + Mandacomidain +End Sub + +Sub Mandacomidain + DateTime.DateFormat = "dd/MM/yyyy" + sDate=DateTime.Date(DateTime.Now) + DateTime.TimeFormat = "HH:mm:ss" + sTime=DateTime.Time(DateTime.Now) + cmd.Initialize + cmd.Name = "insert_check_GABICO" + cmd.Parameters = Array As Object(B4XPages.MainPage.login.ID_EMP, Starter.almacen, sDate &" " &sTime,"MOVIL", "SALIDA A COMER", B4XPages.MainPage.login.user, B4XPages.MainPage.login.sucursal, Starter.latitud, Starter.longitud) + reqManager.ExecuteCommand(cmd , "check") + B4XPage_Appear +End Sub + +Sub horasalidacomer As Boolean + DateTime.DateFormat = "MM/dd/yyyy HH:mm" + Dim p As Period + p.Hours = 0 + p.Minutes = 0 + Dim newDate As Long = DateUtils.AddPeriod(DateTime.Now, p) + Log(newDate) + Log(DateUtils.TicksToString(newDate)) + + Dim p2 As Period + p2.Hours = 1 + p2.Minutes = 0 + DateTime.DateFormat = "MM/dd/yyyy HH:mm" + Dim fecha2 As String = DateTime.Date(DateTime.Now) + Dim prueba2() As String = Regex.Split(" ",fecha2) + LogColor(prueba2(0),Colors.red) + Dim prueba3 As String = prueba2(0) &" "&B4XPages.MainPage.login.horacomin&":00" + LogColor(prueba3,Colors.Red) + Dim ticks2 As Long = DateTime.DateParse(prueba3) + LogColor(ticks2,Colors.red) + LogColor(DateTime.Date(ticks2),Colors.red) + Dim timeToCheck2 As Long = DateUtils.AddPeriod(ticks2, p2) + LogColor(DateUtils.TicksToString(timeToCheck2),Colors.red) + + DateTime.TimeFormat = "hhmm" + Dim p3 As Period + p3.Hours = 0 + p3.Minutes = 0 + DateTime.DateFormat = "MM/dd/yyyy HH:mm" + Dim fecha As String = DateTime.Date(DateTime.Now) + Dim prueba1() As String = Regex.Split(" ",fecha) + Log(prueba1(0)) + Dim prueba As String = prueba1(0) &" "&B4XPages.MainPage.login.horacomin&":00" + LogColor(prueba,Colors.Red) + Dim ticks As Long = DateTime.DateParse(prueba) + Log(ticks) + Dim timeToCheck As Long = DateUtils.AddPeriod(ticks, p3) + Log(DateUtils.TicksToString(timeToCheck)) + + If newDate >= timeToCheck And newDate < timeToCheck2 Then + donde = "0" + Return True + Else If newDate > timeToCheck2 Then + donde = "1" + mensaje = "Tu horario de comida ya paso, ingresa el codigo" + Return False + Else If newDate < timeToCheck Then + donde = "2" + mensaje = "Aun no es tu horario de comida, ingresa el codigo" + Return False + Else + Return False + End If + +End Sub + +Private Sub b_aceptar_Click + mandacodigo +End Sub + +Private Sub p_validacion_Click + +End Sub + +Private Sub b_cancelarcodigo_Click + et_codigo.Text = "" + p_validacion.Visible = False +End Sub + +Sub mandacodigo + If et_codigo.Text <> "" Then + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_codigo_GABICO" + cmd.Parameters = Array As Object(B4XPages.MainPage.login.user, et_codigo.Text) + reqManager.ExecuteQuery(cmd , 0, "CODIGO") + Else If et_codigo.Text = "" Then + ToastMessageShow("No has ingresado ningun codigo",True) + End If +End Sub \ No newline at end of file diff --git a/B4A/CameraExClass.bas b/B4A/CameraExClass.bas new file mode 100644 index 0000000..f756538 --- /dev/null +++ b/B4A/CameraExClass.bas @@ -0,0 +1,403 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=7.28 +@EndOfDesignText@ +'Class module +'version 1.30 +'See this page for the list of constants: +'http://developer.android.com/intl/fr/reference/android/hardware/Camera.Parameters.html +'Note that you should use the constant values instead of the names. +Sub Class_Globals + Private nativeCam As Object + Private cam As Camera + Private r As Reflector + Private target As Object + Private event As String + Public Front As Boolean + + Private parameters As Object + + Public PreviewOrientation As Int +End Sub + +Public Sub Initialize (Panel1 As Panel, FrontCamera As Boolean, TargetModule As Object, EventName As String) + target = TargetModule + event = EventName + Front = FrontCamera + Dim id As Int + id = FindCamera(Front).id + If id = -1 Then + Front = Not(Front) 'try different camera + id = FindCamera(Front).id + If id = -1 Then + ToastMessageShow("No camera found.", True) + Return + End If + End If + cam.Initialize2(Panel1, "camera", id) +End Sub + +Private Sub FindCamera (frontCamera As Boolean) As CameraInfoAndId + Dim ci As CameraInfoAndId + Dim cameraInfo As Object + Dim cameraValue As Int + Log("findCamera") + If frontCamera Then cameraValue = 1 Else cameraValue = 0 + cameraInfo = r.CreateObject("android.hardware.Camera$CameraInfo") + Dim numberOfCameras As Int = r.RunStaticMethod("android.hardware.Camera", "getNumberOfCameras", Null, Null) + Log(r.target) + Log(numberOfCameras) + For i = 0 To numberOfCameras - 1 + r.RunStaticMethod("android.hardware.Camera", "getCameraInfo", Array As Object(i, cameraInfo), _ + Array As String("java.lang.int", "android.hardware.Camera$CameraInfo")) + r.target = cameraInfo + Log("facing: " & r.GetField("facing") & ", " & cameraValue) + If r.GetField("facing") = cameraValue Then 'ignore + ci.cameraInfo = r.target + ci.Id = i + Return ci + End If + Next + ci.id = -1 + Return ci +End Sub + +Private Sub SetDisplayOrientation + r.target = r.GetActivity + r.target = r.RunMethod("getWindowManager") + r.target = r.RunMethod("getDefaultDisplay") + r.target = r.RunMethod("getRotation") + Dim result, degrees As Int = r.target * 90 + Dim ci As CameraInfoAndId = FindCamera(Front) + r.target = ci.CameraInfo + Dim orientation As Int = r.GetField("orientation") + If Front Then + PreviewOrientation = (orientation + degrees) Mod 360 + result = PreviewOrientation + PreviewOrientation = (360 - PreviewOrientation) Mod 360 + Else + PreviewOrientation = (orientation - degrees + 360) Mod 360 + result = PreviewOrientation + Log("Preview Orientation: " & PreviewOrientation) + End If + r.target = nativeCam + r.RunMethod2("setDisplayOrientation", PreviewOrientation, "java.lang.int") + r.target = parameters + r.RunMethod2("setRotation", result, "java.lang.int") + CommitParameters +End Sub + +Private Sub Camera_Ready (Success As Boolean) + If Success Then + r.target = cam + nativeCam = r.GetField("camera") + r.target = nativeCam + parameters = r.RunMethod("getParameters") + SetDisplayOrientation + Else + Log("success = false, " & LastException) + End If + CallSub2(target, event & "_ready", Success) +End Sub +'Uncomment this sub if you need to handle the Preview event +Sub Camera_Preview (Data() As Byte) + If SubExists(target, event & "_preview") Then + CallSub2(target, event & "_preview", Data) + End If +End Sub + +Public Sub TakePicture + cam.TakePicture +End Sub + +Private Sub Camera_PictureTaken (Data() As Byte) + CallSub2(target, event & "_PictureTaken", Data) +End Sub + +Public Sub StartPreview + cam.StartPreview +End Sub + +Public Sub StopPreview + cam.StopPreview +End Sub + +Public Sub Release + cam.Release +End Sub + +'Saves the data received from PictureTaken event +Public Sub SavePictureToFile(Data() As Byte, Dir As String, FileName As String) + Dim out As OutputStream = File.OpenOutput(Dir, FileName, False) + out.WriteBytes(Data, 0, Data.Length) + out.Close +End Sub + +Public Sub SetParameter(Key As String, Value As String) + r.target = parameters + r.RunMethod3("set", Key, "java.lang.String", Value, "java.lang.String") +End Sub + +Public Sub GetParameter(Key As String) As String + r.target = parameters + Return r.RunMethod2("get", Key, "java.lang.String") +End Sub + +Public Sub CommitParameters + 'Try + r.target = nativeCam + r.RunMethod4("setParameters", Array As Object(parameters), Array As String("android.hardware.Camera$Parameters")) + 'Catch + ' ToastMessageShow("Error setting parameters.", True) + ' Log(LastException) + ' End Try +End Sub + +Public Sub GetColorEffect As String + Return GetParameter("effect") +End Sub + +Public Sub SetColorEffect(Effect As String) + SetParameter("effect", Effect) +End Sub + +Public Sub GetSupportedPreviewSizes As CameraSize() + r.target = parameters + Dim list1 As List = r.RunMethod("getSupportedPreviewSizes") + Dim cs(list1.Size) As CameraSize + For i = 0 To list1.Size - 1 + r.target = list1.get(i) + cs(i).Width = r.GetField("width") + cs(i).Height = r.GetField("height") + Next + Return cs +End Sub + +Public Sub SetPreviewSize(Width As Int, Height As Int) + r.target = parameters + r.RunMethod3("setPreviewSize", Width, "java.lang.int", Height, "java.lang.int") +End Sub +Public Sub GetSupportedPicturesSizes As CameraSize() + r.target = parameters + Dim list1 As List = r.RunMethod("getSupportedPictureSizes") + Dim cs(list1.Size) As CameraSize + For i = 0 To list1.Size - 1 + r.target = list1.get(i) + cs(i).Width = r.GetField("width") + cs(i).Height = r.GetField("height") + Next + Return cs +End Sub + +Public Sub SetPictureSize(Width As Int, Height As Int) + r.target = parameters + r.RunMethod3("setPictureSize", Width, "java.lang.int", Height, "java.lang.int") +End Sub + +Public Sub SetJpegQuality(Quality As Int) + r.target = parameters + r.RunMethod2("setJpegQuality", Quality, "java.lang.int") +End Sub + +Public Sub SetFlashMode(Mode As String) + r.target = parameters + r.RunMethod2("setFlashMode", Mode, "java.lang.String") +End Sub + +Public Sub GetFlashMode As String + r.target = parameters + Return r.RunMethod("getFlashMode") +End Sub + +Public Sub GetSupportedFlashModes As List + r.target = parameters + Return r.RunMethod("getSupportedFlashModes") +End Sub + +Public Sub GetSupportedColorEffects As List + r.target = parameters + Return r.RunMethod("getSupportedColorEffects") +End Sub + +'Returns a list with the supported preview fps. Each item in the list is an array of two ints (minimum value and maximum value). +Public Sub GetSupportedPreviewFpsRange As List + r.target = parameters + Return r.RunMethod("getSupportedPreviewFpsRange") +End Sub +'Returns the current preview fps range. +'Range is a two elements array. The minimum value and maximum value will be stored in this array. +Public Sub GetPreviewFpsRange(Range() As Int) + r.target = parameters + r.RunMethod4("getPreviewFpsRange", Array As Object(Range), Array As String("[I")) +End Sub + +Public Sub SetPreviewFpsRange(MinValue As Int, MaxValue As Int) + r.target = parameters + r.RunMethod4("setPreviewFpsRange", Array As Object(MinValue, MaxValue), _ + Array As String("java.lang.int", "java.lang.int")) +End Sub + +Public Sub GetPreviewSize As CameraSize + r.target = parameters + r.target = r.RunMethod("getPreviewSize") + Dim cs As CameraSize + cs.Width = r.GetField("width") + cs.Height = r.GetField("height") + Return cs +End Sub + +Public Sub GetPictureSize As CameraSize + r.target = parameters + r.target = r.RunMethod("getPictureSize") + Dim cs As CameraSize + cs.Width = r.GetField("width") + cs.Height = r.GetField("height") + Return cs +End Sub + +'Converts a preview image formatted in YUV format to JPEG. +'Note that you should not save every preview image as it will slow down the whole process. +Public Sub PreviewImageToJpeg(data() As Byte, quality As Int) As Byte() + Dim size, previewFormat As Object + r.target = parameters + size = r.RunMethod("getPreviewSize") + previewFormat = r.RunMethod("getPreviewFormat") + r.target = size + Dim width = r.GetField("width"), height = r.GetField("height") As Int + Dim yuvImage As Object = r.CreateObject2("android.graphics.YuvImage", _ + Array As Object(data, previewFormat, width, height, Null), _ + Array As String("[B", "java.lang.int", "java.lang.int", "java.lang.int", "[I")) + r.target = yuvImage + Dim rect1 As Rect + rect1.Initialize(0, 0, r.RunMethod("getWidth"), r.RunMethod("getHeight")) + Dim out As OutputStream + out.InitializeToBytesArray(100) + r.RunMethod4("compressToJpeg", Array As Object(rect1, quality, out), _ + Array As String("android.graphics.Rect", "java.lang.int", "java.io.OutputStream")) + + Return out.ToBytesArray +End Sub + +Public Sub GetSupportedFocusModes As List + r.target = parameters + Return r.RunMethod("getSupportedFocusModes") +End Sub + +Public Sub SetContinuousAutoFocus + Dim modes As List = GetSupportedFocusModes + If modes.IndexOf("continuous-picture") > -1 Then + SetFocusMode("continuous-picture") + Else If modes.IndexOf("continuous-video") > -1 Then + SetFocusMode("continuous-video") + Else + Log("Continuous focus mode is not available") + End If +End Sub + +Public Sub SetFocusMode(Mode As String) + r.target = parameters + r.RunMethod2("setFocusMode", Mode, "java.lang.String") +End Sub + +Public Sub GetFocusDistances As Float() + Dim F(3) As Float + r.target = parameters + r.RunMethod4("getFocusDistances", Array As Object(F), Array As String("[F")) + Return F +End Sub + +Public Sub GetSupportedPictureFormats As List + r.target = parameters + Return r.RunMethod("getSupportedPictureFormats") +End Sub +'This method should only be called if you need to immediately release the camera. +'For example if you need to start another application that depends on the camera. +Public Sub CloseNow + cam.Release + r.target = cam + r.RunMethod2("releaseCameras", True, "java.lang.boolean") +End Sub +'Calls AutoFocus and then takes the picture if focus was successfull. +Public Sub FocusAndTakePicture + cam.AutoFocus +End Sub + + +Private Sub Camera_FocusDone (Success As Boolean) + If Success Then + Sleep(100) + TakePicture + Else + Log("AutoFocus error.") + End If +End Sub + +Public Sub IsZoomSupported As Boolean + r.target = parameters + Return r.RunMethod("isZoomSupported") +End Sub + +Public Sub GetMaxZoom As Int + r.target = parameters + Return r.RunMethod("getMaxZoom") +End Sub + +Public Sub getZoom() As Int + r.target = parameters + Return r.RunMethod("getZoom") +End Sub + +Public Sub setZoom(ZoomValue As Int) + r.target = parameters + r.RunMethod2("setZoom", ZoomValue, "java.lang.int") +End Sub + +Public Sub getExposureCompensation As Int + r.target = parameters + Return r.RunMethod("getExposureCompensation") +End Sub + +Public Sub setExposureCompensation(v As Int) + r.target = parameters + r.RunMethod2("setExposureCompensation", v, "java.lang.int") +End Sub + +Public Sub getMinExposureCompensation As Int + r.target = parameters + Return r.RunMethod("getMinExposureCompensation") +End Sub + +Public Sub getMaxExposureCompensation As Int + r.target = parameters + Return r.RunMethod("getMaxExposureCompensation") +End Sub + +Public Sub SetFaceDetectionListener + Dim jo As JavaObject = nativeCam + Dim e As Object = jo.CreateEvent("android.hardware.Camera.FaceDetectionListener", "FaceDetection", Null) + jo.RunMethod("setFaceDetectionListener", Array(e)) +End Sub + +Private Sub FaceDetection_Event (MethodName As String, Args() As Object) As Object + Dim faces() As Object = Args(0) + For Each f As Object In faces + Dim jo As JavaObject = f + Dim faceRect As Rect = jo.GetField("rect") 'ignore + Next + Return Null +End Sub + + + +Public Sub StartFaceDetection + Dim jo As JavaObject = nativeCam + jo.RunMethod("startFaceDetection", Null) +End Sub + +Public Sub StopFaceDetection + Dim jo As JavaObject = nativeCam + jo.RunMethod("stopFaceDetection", Null) +End Sub + diff --git a/B4A/CameraExClass2.bas b/B4A/CameraExClass2.bas new file mode 100644 index 0000000..76681dc --- /dev/null +++ b/B4A/CameraExClass2.bas @@ -0,0 +1,398 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=6 +@EndOfDesignText@ +'Class module +'version 1.30 +'See this page for the list of constants: +'http://developer.android.com/intl/fr/reference/android/hardware/Camera.Parameters.html +'Note that you should use the constant values instead of the names. +Sub Class_Globals + Private nativeCam As Object + Private cam As Camera + Private r As Reflector + Private target As Object + Private event As String + Public Front As Boolean + Private parameters As Object +End Sub + +Public Sub Initialize (Panel1 As Panel, FrontCamera As Boolean, TargetModule As Object, EventName As String) + target = TargetModule + event = EventName + Front = FrontCamera + Dim id As Int + id = FindCamera(Front).id + If id = -1 Then + Front = Not(Front) 'try different camera + id = FindCamera(Front).id + If id = -1 Then + ToastMessageShow("No camera found.", True) + Return + End If + End If + cam.Initialize2(Panel1, "camera", id) +End Sub + +Private Sub FindCamera (frontCamera As Boolean) As CameraInfoAndId + Dim cI As CameraInfoAndId + Dim cameraInfo As Object + Dim cameraValue As Int + Log("findCamera") + If frontCamera Then cameraValue = 1 Else cameraValue = 0 + cameraInfo = r.CreateObject("android.hardware.Camera$CameraInfo") + Dim numberOfCameras As Int = r.RunStaticMethod("android.hardware.Camera", "getNumberOfCameras", Null, Null) + Log(r.target) + Log(numberOfCameras) + For i = 0 To numberOfCameras - 1 + r.RunStaticMethod("android.hardware.Camera", "getCameraInfo", Array As Object(i, cameraInfo), _ + Array As String("java.lang.int", "android.hardware.Camera$CameraInfo")) + r.target = cameraInfo + Log("facing: " & r.GetField("facing") & ", " & cameraValue) + If r.GetField("facing") = cameraValue Then + cI.cameraInfo = r.target + cI.Id = i + Return cI + End If + Next + cI.id = -1 + Return cI +End Sub + +Private Sub SetDisplayOrientation + r.target = r.GetActivity + r.target = r.RunMethod("getWindowManager") + r.target = r.RunMethod("getDefaultDisplay") + r.target = r.RunMethod("getRotation") + Dim previewResult, result, degrees As Int = r.target * 90 + Dim cI As CameraInfoAndId = FindCamera(Front) + r.target = cI.CameraInfo + Dim orientation As Int = r.GetField("orientation") + If Front Then + previewResult = (orientation + degrees) Mod 360 + result = previewResult + previewResult = (360 - previewResult) Mod 360 + Else + previewResult = (orientation - degrees + 360) Mod 360 + result = previewResult + Log(previewResult) + End If + r.target = nativeCam + r.RunMethod2("setDisplayOrientation", previewResult, "java.lang.int") + r.target = parameters + r.RunMethod2("setRotation", result, "java.lang.int") + CommitParameters +End Sub + +Private Sub Camera_Ready (Success As Boolean) + If Success Then + r.target = cam + nativeCam = r.GetField("camera") + r.target = nativeCam + parameters = r.RunMethod("getParameters") + SetDisplayOrientation + Else + Log("success = false, " & LastException) + End If + CallSub2(target, event & "_ready", Success) +End Sub +'Uncomment this sub if you need to handle the Preview event +'Sub Camera_Preview (Data() As Byte) +' If SubExists(target, event & "_preview") Then +' CallSub2(target, event & "_preview", Data) +' End If +'End Sub + +Public Sub TakePicture + cam.TakePicture +End Sub + +Private Sub Camera_PictureTaken (Data() As Byte) + CallSub2(target, event & "_PictureTaken", Data) +End Sub + +Public Sub StartPreview + cam.StartPreview +End Sub + +Public Sub StopPreview + cam.StopPreview +End Sub + +Public Sub Release + cam.Release +End Sub + +'Saves the data received from PictureTaken event +Public Sub SavePictureToFile(Data() As Byte, Dir As String, FileName As String) + Dim out As OutputStream = File.OpenOutput(Dir, FileName, False) + out.WriteBytes(Data, 0, Data.Length) + out.Close +End Sub + +Public Sub SetParameter(Key As String, Value As String) + r.target = parameters + r.RunMethod3("set", Key, "java.lang.String", Value, "java.lang.String") +End Sub + +Public Sub GetParameter(Key As String) As String + r.target = parameters + Return r.RunMethod2("get", Key, "java.lang.String") +End Sub + +Public Sub CommitParameters + 'Try + r.target = nativeCam + r.RunMethod4("setParameters", Array As Object(parameters), Array As String("android.hardware.Camera$Parameters")) + 'Catch +' ToastMessageShow("Error setting parameters.", True) +' Log(LastException) +' End Try +End Sub + +Public Sub GetColorEffect As String + Return GetParameter("effect") +End Sub + +Public Sub SetColorEffect(Effect As String) + SetParameter("effect", Effect) +End Sub + +Public Sub GetSupportedPreviewSizes As CameraSize() + r.target = parameters + Dim list1 As List = r.RunMethod("getSupportedPreviewSizes") + Dim cS(list1.Size) As CameraSize + For i = 0 To list1.Size - 1 + r.target = list1.get(i) + cS(i).Width = r.GetField("width") + cS(i).Height = r.GetField("height") + Next + Return cS +End Sub + +Public Sub SetPreviewSize(Width As Int, Height As Int) + r.target = parameters + r.RunMethod3("setPreviewSize", Width, "java.lang.int", Height, "java.lang.int") +End Sub +Public Sub GetSupportedPicturesSizes As CameraSize() + r.target = parameters + Dim list1 As List = r.RunMethod("getSupportedPictureSizes") + Dim cS(list1.Size) As CameraSize + For i = 0 To list1.Size - 1 + r.target = list1.get(i) + cS(i).Width = r.GetField("width") + cS(i).Height = r.GetField("height") + Next + Return cS +End Sub + +Public Sub SetPictureSize(Width As Int, Height As Int) + r.target = parameters + r.RunMethod3("setPictureSize", Width, "java.lang.int", Height, "java.lang.int") +End Sub + +Public Sub SetJpegQuality(Quality As Int) + r.target = parameters + r.RunMethod2("setJpegQuality", Quality, "java.lang.int") +End Sub + +Public Sub SetFlashMode(Mode As String) + r.target = parameters + r.RunMethod2("setFlashMode", Mode, "java.lang.String") +End Sub + +Public Sub GetFlashMode As String + r.target = parameters + Return r.RunMethod("getFlashMode") +End Sub + +Public Sub GetSupportedFlashModes As List + r.target = parameters + Return r.RunMethod("getSupportedFlashModes") +End Sub + +Public Sub GetSupportedColorEffects As List + r.target = parameters + Return r.RunMethod("getSupportedColorEffects") +End Sub + +'Returns a list with the supported preview fps. Each item in the list is an array of two ints (minimum value and maximum value). +Public Sub GetSupportedPreviewFpsRange As List + r.target = parameters + Return r.RunMethod("getSupportedPreviewFpsRange") +End Sub +'Returns the current preview fps range. +'Range is a two elements array. The minimum value and maximum value will be stored in this array. +Public Sub GetPreviewFpsRange(Range() As Int) + r.target = parameters + r.RunMethod4("getPreviewFpsRange", Array As Object(Range), Array As String("[I")) +End Sub + +Public Sub SetPreviewFpsRange(MinValue As Int, MaxValue As Int) + r.target = parameters + r.RunMethod4("setPreviewFpsRange", Array As Object(MinValue, MaxValue), _ + Array As String("java.lang.int", "java.lang.int")) +End Sub + +Public Sub GetPreviewSize As CameraSize + r.target = parameters + r.target = r.RunMethod("getPreviewSize") + Dim cs As CameraSize + cs.Width = r.GetField("width") + cs.Height = r.GetField("height") + Return cs +End Sub + +Public Sub GetPictureSize As CameraSize + r.target = parameters + r.target = r.RunMethod("getPictureSize") + Dim cs As CameraSize + cs.Width = r.GetField("width") + cs.Height = r.GetField("height") + Return cs +End Sub + +'Converts a preview image formatted in YUV format to JPEG. +'Note that you should not save every preview image as it will slow down the whole process. +Public Sub PreviewImageToJpeg(data() As Byte, quality As Int) As Byte() + Dim size, previewFormat As Object + r.target = parameters + size = r.RunMethod("getPreviewSize") + previewFormat = r.RunMethod("getPreviewFormat") + r.target = size + Dim width = r.GetField("width"), height = r.GetField("height") As Int + Dim yuvImage As Object = r.CreateObject2("android.graphics.YuvImage", _ + Array As Object(data, previewFormat, width, height, Null), _ + Array As String("[B", "java.lang.int", "java.lang.int", "java.lang.int", "[I")) + r.target = yuvImage + Dim rect1 As Rect + rect1.Initialize(0, 0, r.RunMethod("getWidth"), r.RunMethod("getHeight")) + Dim out As OutputStream + out.InitializeToBytesArray(100) + r.RunMethod4("compressToJpeg", Array As Object(rect1, quality, out), _ + Array As String("android.graphics.Rect", "java.lang.int", "java.io.OutputStream")) + Return out.ToBytesArray +End Sub + +Public Sub GetSupportedFocusModes As List + r.target = parameters + Return r.RunMethod("getSupportedFocusModes") +End Sub + +Public Sub SetContinuousAutoFocus + Dim modes As List = GetSupportedFocusModes + If modes.IndexOf("continuous-picture") > -1 Then + SetFocusMode("continuous-picture") + Else If modes.IndexOf("continuous-video") > -1 Then + SetFocusMode("continuous-video") + Else + Log("Continuous focus mode is not available") + End If +End Sub + +Public Sub SetFocusMode(Mode As String) + r.target = parameters + r.RunMethod2("setFocusMode", Mode, "java.lang.String") +End Sub + +Public Sub GetFocusDistances As Float() + Dim F(3) As Float + r.target = parameters + r.RunMethod4("getFocusDistances", Array As Object(F), Array As String("[F")) + Return F +End Sub + +Public Sub GetSupportedPictureFormats As List + r.target = parameters + Return r.RunMethod("getSupportedPictureFormats") +End Sub +'This method should only be called if you need to immediately release the camera. +'For example if you need to start another application that depends on the camera. +Public Sub CloseNow + cam.Release + r.target = cam + r.RunMethod2("releaseCameras", True, "java.lang.boolean") +End Sub +'Calls AutoFocus and then takes the picture if focus was successfull. +Public Sub FocusAndTakePicture + cam.AutoFocus +End Sub + + +Private Sub Camera_FocusDone (Success As Boolean) + If Success Then + TakePicture + Else + Log("AutoFocus error.") + End If +End Sub + +Public Sub IsZoomSupported As Boolean + r.target = parameters + Return r.RunMethod("isZoomSupported") +End Sub + +Public Sub GetMaxZoom As Int + r.target = parameters + Return r.RunMethod("getMaxZoom") +End Sub + +Public Sub getZoom() As Int + r.target = parameters + Return r.RunMethod("getZoom") +End Sub + +Public Sub setZoom(ZoomValue As Int) + r.target = parameters + r.RunMethod2("setZoom", ZoomValue, "java.lang.int") +End Sub + +Public Sub getExposureCompensation As Int + r.target = parameters + Return r.RunMethod("getExposureCompensation") +End Sub + +Public Sub setExposureCompensation(v As Int) + r.target = parameters + r.RunMethod2("setExposureCompensation", v, "java.lang.int") +End Sub + +Public Sub getMinExposureCompensation As Int + r.target = parameters + Return r.RunMethod("getMinExposureCompensation") +End Sub + +Public Sub getMaxExposureCompensation As Int + r.target = parameters + Return r.RunMethod("getMaxExposureCompensation") +End Sub + +Public Sub SetFaceDetectionListener + Dim jo As JavaObject = nativeCam + Dim e As Object = jo.CreateEvent("android.hardware.Camera.FaceDetectionListener", "FaceDetection", Null) + jo.RunMethod("setFaceDetectionListener", Array(e)) +End Sub + +Private Sub FaceDetection_Event (MethodName As String, Args() As Object) As Object + Dim faces() As Object = Args(0) + For Each f As Object In faces + Dim jo As JavaObject = f + Dim faceRect As Rect = jo.GetField("rect") + Log(faceRect) + Next + Return Null +End Sub + + + +Public Sub StartFaceDetection + Dim jo As JavaObject = nativeCam + jo.RunMethod("startFaceDetection", Null) +End Sub + +Public Sub StopFaceDetection + Dim jo As JavaObject = nativeCam + jo.RunMethod("stopFaceDetection", Null) +End Sub \ No newline at end of file diff --git a/B4A/DBRequestManager.bas b/B4A/DBRequestManager.bas new file mode 100644 index 0000000..31298ba --- /dev/null +++ b/B4A/DBRequestManager.bas @@ -0,0 +1,272 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=6.8 +@EndOfDesignText@ +''Class module + +'' Requiere accesRandom File y requiere compressStrings, byte converter y okhhtputuils2 +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 +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) + + WriteObject(Command.Name, out2) + WriteInt(Limit, out2) + WriteList(Command.Parameters, out2) + out2.Close + j.PostBytes(link & "?method=query", ms.ToBytesArray) +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) + ExecuteBatch(Array As DBCommand(Command), Tag) +End Sub + +Private Sub StartJob(j As HttpJob, MemoryStream As OutputStream, Tag As Object) As OutputStream + 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 + Dim start As Long = DateTime.Now 'ignore + 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 jobTagAnterior <> Job.Tag Then LogColor("HandleJob: '"&Job.Tag&"'", Colors.Blue) 'Mod por CHV - 211109 + jobTagAnterior = Job.Tag 'Mod por CHV - 211109 + 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 + 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 + ToastMessageShow(sb.ToString, True) + Next +End Sub + + \ No newline at end of file diff --git a/B4A/Files/alert2.png b/B4A/Files/alert2.png new file mode 100644 index 0000000000000000000000000000000000000000..44d3b7e651884f30ca0811371860a2c872077175 GIT binary patch literal 632 zcmV-;0*C#HP)a1y& zFeNaQ#z>D?Pp5~l@C6?oy~8sZU}IxI;&C5S^*RX4g3j(P>{qMnPinP$E4E$LLaawd zxnek%yAhe62RbqWgdrq^ANpD6_~aynggAY^(YRg~;@v0DbNvqNboym@YHBGwJq<@$ z?d@$S@9ezE?CmWRJ#%Duc*B^R3lx$242WOzK{1WrMjcw z-v5w}lckIWi}Lw_qDo3|mHN%`gnbxlHnWuTVAa-E_dYWdfCP^HQ;1ED$MadV-M-B| z?^qsqIKpekS=WQ}^2EeiLaAF}ZRSx95_bDVsrP40^RXUWeHWs5EgHQPk}^fGlYhI? z7ZShfA-TfX#^p-oQ5`+#S+9lSo8#jTvz$LL94Eq1h#qt#kt9MPaAUF7$5v}~!Lru$ zkBjl^|Gm>9vFC}z*(-*zl%(`RoYGSo*q8FFDMYE@IB%cY_Ge7}ISA*k00RI&q3etP SUq&PV0000oxwhr{f`Pln- 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 G{67H>8H7#% literal 0 HcmV?d00001 diff --git a/B4A/Files/camara.png b/B4A/Files/camara.png new file mode 100644 index 0000000000000000000000000000000000000000..1ba177785e3ba0aaa6d6d9c7cf4d1b8638023f33 GIT binary patch literal 2130 zcmb7F`8yK~9G_mw%^cZWEi%g$&COiRv7{nOuD8vRh$4)Hj*ZQRcq7rsoi=kH%TX<) z2~Et1Fy+W{zmDkb_5KO(_j$hG&+~kq&+~kK`97Zy@%&jw2~kB+001C?azeW8WAgsC z3Lo6R&nUCJeE>(e)lsM@86+rI#xU$;9~zIGFe)YA98mwiC8+~T}> zi*F!dB>?p_8y157I{|<;&B^_?)(o%z9h4@pZ~lMguHZuH8pQhd4mC8%XH2_(gs~Qi zZ}%J7`!PQADk&=-ac6sX(u^tWC~dN-$fYXTWOi@9O!tLQdhFTt*5w!tJ0_9GO!ZIJ zmsC%EXG23q^5&6RqMFHb0NpOFh&^zLcbr1yn--#toC9rCn#4|Tym>#CNaOa0$a#`~ z$@q)4y}|HDyf!qZ$eGV+-4g0pld4xuSmav5Rwp{2chDnhc&CyoErJvH9+C{WEnQ*2!CpW$p zPAtQTtcd|l@8eRc95o|X9gKwcCEMzWdBbDE3Smi`gqLFRE_|agceBlo6GTR))>%+t zmRz!+TkDx%dCbLi`K=fZCU`LDdf_iEFq(h|8FTX}-&*M7)*Fq7U9y~KV8!yuZ8b%m z5^4Dt;}iahPcoBnb&psb!2(%4>|9V;KQ)@YPRl>pl)uwys8R-D)#9p&P29kj*;8gl zt1g}RKCDb~OWLlW*NP8vr8La8Zd0AQ(eRTf9H6(fh}K4PQ^5}58ne9Oj`*m|MV*RJ z*bx`xx~kGm>Zqe1vnG3r)(IIrq<72@yc|lip}kj-?Qg<|T{h!#P#@e(f#X%7Lh&+A z3_6_S@bx?YI^)vN<<(~ivU6IMwPsTeM-~v{j*1N(;B%KX$kzh?sW*NYav9P*yHfv# zadj&ud~rFWkx95I)U@d9gEO9kT*ThK%bl^M1=YH%_QBTdqXlorjUmdHxTZ)~)6)9` z$d)Q1v#*_|Xq%l&4fmT(T273MF(M6X8h?BXD@@?vxZ`4VTkQ{HtI}F#UY1)*HCgT? zcPG`MKoylFyZcCmQFa%l+IdyfddER}&^gwibs6g$^`aO?AwdL&?hZP6Mwr4IBA%>nH4gsctH$ARa0abrkEU0;3x1r(>4*LqhQSYDh1X9+|Aa zVR@W}$12bQf1V6gDzgxA1F?oZ3thH@-BiB{pK=Vd_lOxz=`Sk=PMv=AA@BK$P0ypH zV~(J|_uTKy4s|{VGHkK|^)(duVVJS@Ac-gQ1lDaCe<5|UKI=4Dz*F1?R0Tgrqb1<{u=scpm2h(*0dtT>*rA+X`m2E|;lqh)5Sl4}A)KUiYBpFsteT0>{3qEfS~l zRwl2@p<@A@VY2N`Ps~F?$S7F}0rcK%2@gK=y0wZCdHR#%2L-|1F$UCoV39k0(XnV{Ga*27jBNmNSZYn&`rqdg^!?euv;cj@h9jWV?UliHW1#TSoYh6J1A7d>`Xu0Uv~N z6|6*l?B|?XT#^nGR{!mJrowF9x-n%vB!YQwC%e{q{|D=3J~@52c!4)Zn4Ri!RK_c# zM{)6$qC5`#!IcqZX!ACw%_L&__VMbau2|8|M*eu>2;=d+odmMS1WBt@sclgNmBNyU zF=ToQ-q;ixXf~rccmHM>$_DRtWZ8QK7Y_C55-`%OFiebw$4Owyq5)Yl7U~6E zMOxo8cL~uPOA`+GSO;OrN*1`7AKHYX4RWedlr*B%80!e{0MgW88U`9CnGnMCJWR-^ zMe=eDvj?4K!&rOc@9T8P6^}j?H3W>jcr~Wr)dT910+;k;Uo6s$jtm(zZHiavf}%gj zCa%!NSl`CsTWyOvs7Ymo>U^AmMICEiwFtm5@cyg~TsN;sPtR(jxBj$IQBjfVow26k zA{-GaDmRS7+kwevbdILapc`JKa7I6Rw4Q6PmL!Gmj=r#_smMG&9;V|smczR~al|5e zGUxqK6Mp!C*r(43V2_9$@%~9&kEQxp@c*gV|Fl_OtpyGO Xet+p@+=B8D|1l{0vq-w#mHYn!%-`K8 literal 0 HcmV?d00001 diff --git a/B4A/Files/derecha.png b/B4A/Files/derecha.png new file mode 100644 index 0000000000000000000000000000000000000000..58a1e82a2ac20415233307508e7ffcf834da30cb GIT binary patch literal 8551 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/engranes.png b/B4A/Files/engranes.png new file mode 100644 index 0000000000000000000000000000000000000000..288b47eb5bc785484c244e8539da733fb3372cab GIT binary patch literal 8887 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 ATL1t6 literal 0 HcmV?d00001 diff --git a/B4A/Files/gabinete.jpg b/B4A/Files/gabinete.jpg new file mode 100644 index 0000000000000000000000000000000000000000..78023d32aebdcafb4a6e5539f76a1fdad56d3e47 GIT binary patch literal 19549 zcmd?QbyOTrw=O&c5AKA)HNgq)!6CT2yA3|bV1Wde;10pv-66QUySuwze&>AaoOhkI z&Ry^Q`+ItI_tRCoYVT>8y?a;n+x*))0R6kTlsEti3IKq5UjT2LQ1enEBKitS^5Rl5 zV*gpu4|oR*GXP)S z`M+?Zf8oaVj{nGqz02^~+PM6q>mU4MF|sL0Rr!67@V*iPoB&Dy34riFzyJOC9d=m& z0M`uw0R8*F%Z!o$fcjqm0RG~Cmr?!!0MLE{0Ci*kUH0GS#NN=+@IShPdEb68GXnrF z^8o-9O#lFE902&J{U3GjoBzc&()TLDcf0J~7ju9Oz!X3VkOF`J#sJ25_7%VkU;%Kv zEdfLT&>#N6KU?T`z`()$0|YoYSU5z4j~@{c5D`BjqalApLPbJEM8QBoMMFo&K>vu0 ziG_)d_0G}%=>+PZme4Q=?+wwB5Ru+X{~z(z0l+|jGJ-OOh9U=iz<`3rfO_i&5Wk;p zXut>Pe{RM95AXFF|QK~xoWoA`<;uLZ5kFMrWGyWA5SIe%_*>&;W zFX6jFDA<3|3IM?WN54=A@3q1h0H_Zz(6H}-dpG6Xu>aJGLB=8khpA}j0FOofBkF5r zW#ApGW2^J3}_61AYg_~^#4!L1z#03;0kOG z&6=8JM>U@j)>Z}!Zm%W2AQjIz5M|ZaZ6|R5>T?wM7@eg!wbYyzu?>A-!r`y({Q0|OqM0+K;rr1OfZaZ{=+pgHY}IK_0`Sbz5oytnHC#y( zG{Xmk{njHh1p9^oYXk-k?ksX9^`QS}v?HRxj*>!6$E*jntLqNmz@tq)V(7=Mec4Yw zmr=wTVOw(h%F>*+F^v-NBB@YUd7&s_676Xxn}%X*?P@Y70k|gE5c(|WMn?5;Xwf$1WLi&o~?*$uJI+$RY!u~x6 z>Q;jk<357%hEpIOA@sCX!!BU~f<%?vv_bvks5I54Znsk{q}voK%i4f zT!(ed=T|#<{m@wH?k49W9&?Ul%%Tt*%aIr|>tauW*+lRKl|aw_duuWxuPmbA zH}4&L&hW3(($GW-CE~*DRV(AZuc}5ub7a!&8d^mu^oLW8hH-m3n zo>3V&-*FIVme_1~{s~nT2llC{>#_f#4mx<=V%jBe!FPlb(-vCD&SdM$;dS#C$+%4O zAasv&R&+?*l{Ox-IoGdTie;Z>rvOWTy11|ogy`@I%}3%46q*r=ix~tX`=OGC2@%H1 zVgfh#x`GfWKA^%7TLgvF3X}iaxPUAHrB~NyYcQpF0emw;n@B;ymq}L4Ed;d}ni?{y zaZzb$I*?E;Px3ba=fK(mSKe$A>4|d}Uh$4oGXH%+_{uj52RXDF8~ysq_Anf6h0)cM z(B(TN6CwjY=~q0A6DZnVO60cf06Te!&qn`7cjgO$Ani{Te|Os_py_=9@n##L8rb>0+l zL8};Z4y%TNWVMGX#y~skP@(e`jb+||Qrhkm!fH+a$6|A3{^4Np*ZwAn`oT%BA{8<2 zi8}HqNelipw>QA>vlpDmi}G&D9RYeprBSg#`3s>0H_r9H-O1}DXdQUS;6rW_Z#3wv-%Ct z`ig$Slq0m4Z2DaPn*-fnJA%+{Xu7 zQ70H_rC4!1NBqbGvxQjA``TRZjg(yw+w%JFY!-6l?!Rj1B|+2QTt}AVm&C-csmp(& zFS@iK+ISH^KD%7Dk)f!0!sD#oYYV*lEx!qk(ZS_;$rtg_ZXvuTb`fg1`>CPBXwsff zT7HOS*r>(1Sj~~2wvA)MI%;ZZ&mLzQ4LmW;?DlHi=O5@Av1M;(hL>#oa4RSuZS3Ob zq1iiXc|iFUEgZOX&j`Hp{0Ty!Ewzk9Tp<2t*ld0!Wm2D(`gx(UB-Wki4g)R0)y*;D z#)^fWlc2MdzG`ze(ZW*8Jr$qRIbsQ9-f-j8h_GXu$+ZmEan&+=EZN_3_3!`Qglh6LA zOPj7j`AHQAF6gSNDs!r`+M2w(1qD%)LlmQ@kY!h=;0wxV^)TiUWj5#Q3jrxpdt?00 z=G09v01fl|xf<`!R@#UIed^rRgT}&>OMKffxBZ8Xo1NDVQnXRZyIRjD(VV_=`6@YF z5LY_1l8;6Tiu$-}Q_V+Y|2^{U2?MS)z>5K+vr-1yBZX{UJb3lYzDg&01N|fwY@Z!= zbFAU{)EIO|VK@#ly%xK^;YeYUiZjV6wwZmpkLgZRA7-bG?a{KFa*}IKJ6(qdyvInI zL$DYwC?Yc}UnfH_9HwO!=ZwQocEjUXJ=wC~0I1YwlxcmNHAP2J9#TiS)o%fN zfxEHv4uJ1p3UjSJhkR4f1-_}4cU>0CIfX1b(IKWT**QC?EAd!_**Sk@Gw4wi}&v#lMxR8$*Jpv5L6Mjt%nx!g|JTwNNDWJi{wjHHXq&>H6L{q*R#D~ z#vQOk;x=%GefucxO;~n#bzfp}cn2XsRD~$t*R`xXS&OGm3CxMR8kb@DTA7d}u9k+m z-W;B8a(~}DN|BcPQ*~u`VKEUJ8J{NWxBnT!u2?QG8FqfSa{1AmeF?Q%tBM1GT#Ynqk4DZ<#KsvZ0k9k-XR_8?6oeD>RB zjTthnt*)-BuS{j?B2$Zl#nmQd>JC}mT9uAe^2+syrKthBD3+LJ{v?#Y;MMc% zic&TkJ7(YswWySUV0)7@ll)!bNl7=)0dX`L*3WlHL%%*i~*6kdd{Au-x;`_ycV|02GP62`?>M~m>eP68UbGgIOJA>(>}W9CoxnGK@#j+p5}whIA;E`-RK-PclOwDvl#ve0 zjoqhG0w!_JTn(*F3%SBezt3%X+A5p3I2BFABQ zZuLn?r?O$u;zEMKF-3XUkmY zSy>HtaK^W_o?v!aE<0OT-k4+1QCQfkwOf%_h& zeV-ZoTEsi{Zh)AxHP5DDakaIs1Oumd9}BIligKN&M(Bpt=p!f_M;#8OD5K@w=_(gI zuxNr)lJE>Tpo91NA!A}i1*78UHevfXiot=ljjwveA z8Ani~=8ifAp+FB8>2{;#Bw+OLPla3jqU2_nX_;udP?+ObgIcoPw3Cn%S}QLa_4PY1 zRBLb$D{gwy*htbJ;ZG|^^BWKvLBZB`#T*%k>S|9G-sI%9;rSeAQ>aaXijy@)wDlma zXRaTpYGhWh=Vq|Zb(p73f}Yf?nL6S!Ls(RG&Nzz9sxnahh3K9?1#UP(@WX6CM9V6? zdsGQzmBLs$b*sVx80{G=^{0i*>b6ZD$0d2@jDt(JrhX`fupi;#So4(VmRl!?pRKI^hfB*FVJ$Q2@DgbCg(Hb;zPqJsPj&U^|UFxGzoM( zVj58206`p=>a{{T`o^|RmOYF@K+fa=oj&eWg`q<(&$HvUUnFz41Q~LFdcKynsA(?s zvD!Q$=|gqs9cBNq9TCpf`$?TZsOF8tuaSw|CG8^@-0=AT+QNBI3HNJV=1iC;1u z;7OL^`0assF5{#qC@%u@ETZcBrxMEPCwi|-zmv% zhmUH=Z}8?f`SGn#qs}(L1gsa%kH_TXkD8v7|IRCFF%7{?ZcSobV;NA2%H))AWjTwK z$H#I_NYzpk#P0K$_vJ;e{CR?Qvdv~`F5v{Z=X!-?eC9g6lbO{#_oVFNwVqC*Q?)h= zx#)cNbWb2UDPpMsiXv6OYvG!Xr#K&Wx!q_19dHHNz}@ps0sFiGR6~_H{#J-AJlL!IjmAgyk3C>%EqUL>kb@BJ z^pNq797hR3lE=9Ah+4vSJPQQ+|qcFa1JGi!d^Hxb~Wr6u3D|!UG?=1z%*|vrdd=s|5+&H8%cE6r&M+rWO=6Chm!9+#FgRnMiAh)7p}^sscw!SbO^Zuq(WcI2=FFybT4}A7sM93ppyt0v z$}XlolkcV+@^eFvFLD=1zauHEG&0~3k7uE zBL%iY)_2VBX`9#xiw5t~jlNiAgI-Ax<}%KVYG@={^PT|(ZN0R zRrke7A}EJbOy>9-QYS~OiDF=}MbXJj%+e`#)s(8z;J$f)8m_<>0!b&GscCc}7~)Or z>Z+-el;1XV_ennvGOxP^oY+58V;h~I3aUD{5=mf84s2^Pr#BjQ~ld1ioIFi6qdf}Q^&e{eS5^Fc& zNZ>lTWSJGS@p;RQ!Atx0{>Ptm*;m%vd2~WC_F*q7PvPxY#y^$HTW)=^l$b8{=4c*=jcG7xkevJ0v@=zL7a>t|Az{IZ7v51zVml6g%>2`+cIWh+ar z5uC{F+EHyHX!Rca4B=E0eMAOx1CPL>C;SS;P)lH2{%vqN4Az_)&5~SGV8Yr~gdZSUQWkF+%F4ktI`p7@EHqXFsH9!ZX6opHAS zn4Qai19^26ftyeL6?k?^@N0R6sN()+=f}!A2RVWx74R5a}rPU#VjY}IJ*{N^2$ zLI}^^v(9}I&1-c-Mg(jDiTqo=gSLFKPCSDJ&i>9q`nQl7B7o=2<-ZN$`x_5oEDCbS zn$q(s$MOh6xWW|>6IUAw*Uj3I0{=;V(AlkJPMHW8o!&>^uS+QH z4Bxuw*na(EvIYFg9w>okKD+HwbKWZm(Fr_Q1eHS6f9?`Oz0cMUTnt zQ@u6Yj8=GFWPa^#goTSPeSUQO$sos}&w^|PKyb6!fT(U~bA@~;Iz3W8j6ynv#DNfv z%8CtF0<_hO1j{Oe^>wQFcz)C=d~Si!9&1Ei6VcFq4P=(SS8*~iLY3bU*U4}&e2z?^ z$l!gsr;%3lBFf1S(iRtkuq@s)%m}PpOPxfkRWC`IXzh}HH6H=}>90I>YNx8&*BN&` z$3aQ3i)k*Ghh6(_n^V0AGle8iFEO`SQ)$Tp^;B(NW$RsA2Jy$A+~Yb10Hf7%#~+#9 z+;a+SuC_moSOeFP?+6t7TrOCq*w=(El+}{XyE1tsc+@wb0tb$C|r-q~FuBb>WcFqv3EXWepV5 zbRt^kZzV#O$lE@?Lkj_rZOK}E{#@$Jb~|KB$QJAD@b#mIo5m+X#R|CEaEtv}UjV=v zz~sS*TBw#-EOtgg2=~oIu${drA>O3gRr4??s5X=g2Xj+`7i3o$7nYq-Q@@~n=E7oK zZyhT2mCwz^-F~f`y=d40rKs|t?GqJ4Qx3{$e>~Yn+n@A75Cyp=-&X94`^)az@NyHi_ARBd2T~y?W(q) z1eisdwO?78#&KkN9i9Tze=l7$YjYQsu_Nb4W|Fn^6-TTBKvL&`Qo=qP6^)*NwMcEv zAz4sfL^5NVr17`qC%L5zOFHd^@Xy2Y0)H+x0_X*U*Th#}gcrbRs+gDb`ONoOz>E#M znb~^bMr={#WWR}j=NXmYIm?roUMBD$kW2>MURs@u@qRFYo(=V(iAdMJj9Jbx(TJH; zu=+X{mxyQF6L}Og?4;?)T3I+npX_UM3yhqDj@qt<)5!Hx@8q+KkX+WdTPLyY-PPUAKx$YMd8KLJcVF6E6q=QEyGrd;Ig$9E4jR(0u&kbR!D;rNbh3v#L z#DYGBCYtQn5I$bBkoiS{!?Dq4v&dNIeQNf^+od?K^tSW^>*DzMvUnkSR?$=S%B=>! zGU`wVCbJO=f1(jHzXk98{yhie{89lR)T69#bB2@>p!W{|eYc%gi5k0_7Zz>%I71KR&J=%nHa^#B>dp?1tv6yOrDzd1Z{9 z&(Y!($NdU@e?CEtePgH9-vCNyNXv8N>yeUwk8ew!?nB+bTa;>ZzxYg_YmKz5vrTv zd91_qdwt^f;|1sEpiujo{r@_{|5p;)E4dZVDMm+d%ZK~^ViX9yig58U%lbX9=z>38 z%bgA{dQdXDs?~(w$&@9)XmG~jc5*M6y<(@n0SFJ;uTg!;h+X^y+BDFJH0|QZ$j2zx z#%TRx3$r>Vb9cGB{v^xI<>f}iqeIvsX3y^bt5{9$F)S3oym%V9DrKR2IHkhdU2oUO z^~A5d%@e0mMQ`>72-exIHi=IT^)k^X_>xq&HIm=h)$b>y&o>9Q@-g2$9j-f`=vojI z>EGH3c_jE%GYJ$z^3a_1E)^Jmj4(#y!;Z>p`M#HkL|&)fqF;(}JRz%gNfq3tI5hp^ z*xsHPKt~mDL6ht51SG7lG%e;o*SY;^cO2vNo>xvJG0KvxQ?YF-R$L^rbN$^L(Yu0b zyb2FnT5`-lU9pAd+8pEp!aMvbur*@2!Y<2hf?SkS5aDJ5tdd+MoI_)l5N<7IE#-!N z?D~@22PvS$M(r|@@@ zffP+Cqaia|{&s~6R#QW3YmG~pG z#0^`B-6vDRIOMg5Qi|3Ij;)T`l*^1s($DY;ZtZO=nheeICwkZ4PL@s=%QR^vudI10 z19x^G;=p3PGtHvKDnfyPAX&kL#W#S%gCEkGn#i~lwV4p=f#+a;=eqkXY5%{D#JFn@_Or@P4b8ZFMmz9^{f5qO3(?p~_u05QLXyo=3{PD&}BQ6lWV#+vi2g|bHAW&%afDp2J zbuTAC^9JaE^5UR_O~J2KoQip@s|j`qD;?88{q%GjW@1MSLOJ`3Ga5F z&AaG2&;sAG>kPfOQnWY_o)g~0$EfiAs|0RQm5o5$PYYO5h z$r_S&$m9Jzkkn|%&uJZ4(sg19>$qRq^Rxe$d9#K)pINN)5XU~N4XImFj;xCuCFn{u zfpdK^UYW`)V_O^^Q!=X&wCfojmu(O4%OEhBNuMIhE|29jGKE|ojceC(9d;)JaZiwF z|NO!b@1M0n>y@fR6YPof*Y$LBP2`fyHFk93@RIZ^e^&ing=@isUp3URGl(7{tus{# zVE&5>UFbOTI8dMTFUQ## zQgq~k%98xD3|oXjWWeQ-0l4_{#@*#9d=&gvQ}qVUtAF4LFyF!1jR=v__Go~vZ+s7D zWXZWp&K8De#c$rg?bNNlTmKEf0=#!GR%oUxz`CoP=dmOCt!{K%C=Y%5hwo;EVZ(B&+|raX{|O15@4V-Z^t~NI zJXI$PGqJ(w?X4{Z!qwOS^rUn1!G>}PWK&T@*ypzrO?!`iyG8u@(`HaMsT_X^y|T|L zUZb;D_{K~5r+yI07R{Uv#qd0BXxCIj?~bNcz7JYL*SpgSiz;EK#?}g;`_p#xh6C#N zuN05Bk4J>RM6zAp5lOZ0JHC(SNaOt1#s6Q4MDkXd28Zv4(ynH$a=%kE0RcV-JI>Te zLj+zVbb!YVN+u?CNyQE>G@5$rGfOAtVAH98jV2 zr>26np8#{Lgan*GR^E^5@J4R1Wd#+Pk8>qe-w(FmbEud6J*SZJ8L^)C%szj@jqHO#UbfB$>w?m=R($*07y;-yEEnl}?-3hNvy<#1$WmpSWxWh(}Mp%gm z^{6G1A%=J|Y?&#v6f-I*9TI^zma zkQjz)h9pO+74>h+JZ{L8XF7z+#r9fhj7?F3%u{bKZn;@<4lQil1LcwS)4v*IC%aIX zoZ681bJy1{?JV${8fA|-Ve?Zxv`h8p%Bq+MZ`y)G<3h7i)qZ2%OIf>Y2+=VEi;e2) zdUH5!sYh|a)QV7MPWDj2L7KX}vgGP0QWy%U;56ms_mxgkqEzl6lpQjN!h-vvCl*mR zcQ!9pAm2AhoX;$44UA~)wu&y{3Qf!OT9)yvC+v**W%cvLhlP0-Fn#pSXHJAr%S5SA zha8%~f3=r5MmSR4It{i1bkWudrB0o%N&C%>`p8UCT!+n6{drBOqNMsuqre8ZaS6z; zE4?_|q=}TuN%jY7nb%iyq*TZ7f+ozG+C6-}R<0>}$#S49md*JjCyyMTyeKNF0_zhc zTn%bYdg#DMLXV%_Qf?qXHSg-e5;7*=5h+V0Axg-siDu7VG-CI#hb#Lu_d&1AI{npt z3s5bF7{;HXQ)@kAYYCH=4$5bB$Fwf#poy7q<=nnp@zd<1APVv_>ESBVlwncTlu4)} z_tz+kl@!XU)M#s}!F=lc%=oO&+3wD$xkZqqnsEF1CJy407gd=W^)La-OD~g-i{{h9 zIn^c50()6NRoZlHhb&C3VwE^11m@U_aMvQ-GnZK8f{Y%Pds}W%lG~PYhQcPW6w^cFKsKQw1RYZXoZtL zh>G9;$f#~KQQ`rh>Np=hv?iyU6#MI;(wQk5b1t>^NbGoT-0;Y6(8+evpeGL$;o7Pe zjYeT_v`LaO1)H4+rv^Y_C z{Ti`<6G2#)*%+0Z=iYS70!|%mu7W4l)03;jTnl}9QN!LHmX*RcJhNQ0x2V11vmem= zr4$JC=vYU*R)@l6^=e*L@m4=2QONUyV#Ug%FeFIFIfOy&rnKFWzX*ixGr4FjfGydcRi`7eOJ%VAka>uB=@4X}g@FzI}Xi zlVN@h)5PE7w_G2%3C=J^Drt90LINi-dTd1}raF_x1*CNFdqWwhPaSxnE^w>$%fZW5 zeGdI+>>twCta6g;%9MB{kY$)4ZDuubxr<-8?;Vy1oNF5IQC8Kqxi*qC9We~JfBhB$ zIP6vjPWl(My_nY#QPitCDH}Vl-Y;uRjnAq;E!1|6{Px{APA#$&3fE@@OP5KAfa0xf ze|OLw67WkRk1~WNzB(m;d%&Y9Oqv-}c7Z3GMru1LY}cVKWl3;CNZccq?7TGQ*5D6E z`sOCTQAOzQ*HSd+kZsM_lmT<2z$5o7JkUX??S)&k_3$ zJ%o@qRENj^1j(TqndJ*GoP)+q->?c=dbV!?4pl!1@T7x<2+Ric? zLa9+&5EVH<`lwZfo3 zU4g;AsNNp(vbYYEQ}X7ieYVZ$fV{Qf4UqTiaYAB9?jEq&aYz)6f;Wxy8!T_`Z!M-XdQ+xi zW4F94-C&Od;M~(KL zOZ8%sC*XutUWz?Vmw-gRMx6+_t9YlZNz=mGN^hx0StK_aj(;2Q5^(CU&-2AchD&dv zl{l|`(!lLS6?&Z3O``$OJ|5!5===+@ArgbR?k7mwkqU~Da{}>kEnza;N9f`# zd`V<6stpf-+S-|rx{H(;Ly85595yf)`4&i_S z;ay)u^8w?gxyWm`^LIf<5XsYw{spc`naFV{>1$epm*x8uOGz9p&*9g-g{?%j))P-V z5R9pv$Aq**Al%CqXIb5m#5Ij<4fT?J%|UHC#EX3rJgriv)o6v3W9=>kCxOZ121{Dx zzu#F}QZ~-}JX7nWBKh?(FHoAy9ePQj}rk2zIQ&1?y*eO8kk@6cbK0=mxQap`)~xoKB8&;*M> z(;C+9aM<5zG1?h2+ys`wbhxl^{h0osA;Apq%Dx~`&sMMVAyyR-TjieMuq@F=R&$qC)4U*aq?Oi%--oToM? znW&p6V9Ig&lOCR*iYo{AX=TmzQv(3p^;-8Ogf z{FmrQ7rFWlFpgJDrYzPfBi(Tg;yG^N|4w*wMV81JI|6s&kkti-VGcREZf-&G=fJ`#QUkIGJtHD604z0rejr|<5K@g9#1qQyKq*B;tSZp*C6_hp3bUF{)vD7Be?k7V&Q@}gO!>tp4`^M-n-{LFz z{-x0xNn`7ivfGbFZQI$!hf@5X!UNwmp@)cA5nV){>egzVk{Zr1*sVl|d0s4kCI0=% zdD^E4-;-9Pa@!o#8`-trsG4s6R__j zF`d`Cr=$YR@x)Kah8=Z%Ll*oaj7X3@(<~!fUDEoDr_X*`dM7W7Kt}w>>W=dSx9{w9 zp!iB-K%d3Wrw7cxH4oNxgRX5!Hq~;-c>MCW^+o+Toy!46MBY%w8AJpYY*RtU5j3v%h9UaEIESJV^D;gaaf#&|=%3y>4u=)#YVGZUl0G_JAq}#~q}}LjkUCM*?*)x<_*WL%!2MpScuU42 zW1e6Me1VdSh>TxY>1%0rJE7LGjQbflrOzWnb7-pmn3u}UU35<& zZF;fq)1?K2y{jS@%v6kjJs9~1rEw>_YZBTFeAd}(?SPAzX_ew1y!Ma-QoRAhDh7w> zS=D+JeN06`0i3+aoJulUC%(%c5YDbND{py!`v~a>6ukkKTNm;WVk7ob^xZtxTM952 zS~qgzyDtPayKcl|OsWpO#F;qxn{p<2)P*0rR2QN?Vb4ay?xYO!iHi(@dwPK zDmo)|wxjmqN=zw#Haq~}Rk`=oVLZl)?*=9G98w~_gx!X-CrIb={_!zwSA>y=x@-vV zAa#UZU9T#fjDF%}Jbh&E>?7od9lKN8>IoJ^2eIOKviVi*=ywp&-|2xC8i)pQuk6~5 z30bQc-;>uPB}?;FR3JI8aBUV_r~wChaA?J!S|gkqYz1bJHleefG4O;J>M|~9&A1W% z8mH^9{AEbDN-+h0xCbAe=e1rFM;sTyb{%*49CBA>x%QNlvFAA8O)hYcBKzXd>b*oe z+lIc8oDq=5@0Uf>LqUIxYP_hmo9^oBzg!g=B#m-u>p5MRS*xpSAmK9cW_3RkBa z#Os2DXC{fmU3?*UN!t`8X#O50==+GZzdPmM-VHOaJ)&7>lI9Y}aOQT0{U7mVpCAt9k3L_7Q#r(%(X7u$Fm;ieFqBDmRRnf;PFlxJ&w# zPLg7*iMl3y1hv!ZmXAG-bBKvv?@_+KI8?nZVaB@kYzSXvx-T?rf(M(HzrFz|cIu?C zLBA)YRu82R){Iu}3o0cu|Z=7~{2I{lTT9(WVhbMU@jXD*sLVqg_b(CBA5GAkx z=O{I?0rZdaP# zQ#Rbn?E}s<^8e+gY-|m&$E;*}Xp=V7zzbRp)u?If?955F43_e$+HXFUuT)PUYz~^m$>Vp4m7T`{fPr6Uw#T z4kxhvzix}cI}bYBdIF@^EP}(2$p(+S7MAfetSRPWZA%fwA8Uo4*h-|*Uqe_IGMITrgAY>Ki2%WGCD>0y{epkWNK}1J z)xo5`^LH<6PqfzLJLx`Dm4xUohxhO|JdumLIzA*m9%`;{fVelnrE_uYdOG5Pn@-1{ z!T`x!Q=)H9#FKMqd&;hU4X=C$MYQ({@81U)L|f{gnbT2NIz`OUDuJQP9ry5ku6*AB zw{L(I8?;BJod7q z*s@b%v3x_8-2uB4M|Q2HpsrxR-9=ZBpYK$Ty_2Oegh&*8x}v*-t7_`q$8`@}nw>uK zrOS;EUj1u*Vx2|K;L-L!Myx{T6lLYrp%1LqBP>iUt+%2wN9-?2ugOG~Ma+|arEmFJ z20*!*Mn4p&2abn!{V_SMpA;goR-|-j!Q~NNNnQn|NuA9{$`SprmP@h9ZHvwjY%}M9 zxMdaIjmm`NCEe5|&qi2e0O$Lc@3(oYqe{t|Pr>sz$qRx_7&_;OFurz<@XgFNOuyt;<&?7%-Sp)6jhKc zj9dt8gO-g0Zgpz$>eN*@ScN+4@V9yg|B`1Wj+W~k95_dBjukoz^_Xp)dgg4yZA;W<-!e+P;<92PxE zyF&L5FWn4iU8`<|hm9#$43i+lNR~}1Y^$dpE?N92Wk4=E$t>LQlLP&Vh^jnWSy^r1 ziwv?lJ{`#Vq=w~GTum6rms`0F9tTGwYW0OAfB6Btb|YHHoSbuBasQZv%SJ73iR(a- z`-AJIvR>4A2!FFHvA$J{O(7qh17gN*(qc6#QN|M(qE+f_%lMvoEhG<+f-mY7AF#}E zh?j`3@mK;$*spjkGik6Zjpbh7p%@N;>Um!dU3Fj?dd1tcO?f*ol(|Q&-O~xU)7>RX zHaUQF)C!1pHSl34?^8&$9qL*oa5O^i(pF-dLh{!=j?z}#LcLCpoERsUd(RxZ9QxZA z`t-l`FE6Is)-e=7tP)3pDeH~kI#LW;QeuLsck8IL-T;czgdc@N=KsX+2Nj81r!MSm zQYf<6if!tXPKC}JcQ&)xjL#80NO7a)@!{L9_B_>f{MZES zSsQxV6kq`Yfu`OBj>?;~JDD?hgUf#xoTnHm;0g^?RboP)@tXF{8nuhu-Ty>m5XwNH zGn!=_FE8txQw;0%ykv*iXS}pC``zLOn7@0P9Z1Vs=H)dhDo^%d6=cVqL1@AnJNTl( z5DBG>YI(O^yhwz`&beVE3~PUnP>CqxAgM27+N1V$Y;L@=7)N z_sKp5nKlCVT{t$1b*13|HYfH`%X!;od50C(aQxD#=38Y8Z~mTH)g;|)-x+Dc^cTB= z06YJiuFa67at2HA3n2$7NWJolA{on>`>hlRkopZi0Gi0A#b!w78#FU&axp08l(TNTu(5Hc6=#?=EFL9tXIgv0@{O>hJ%!#L7GkmxeWX+nOSGK>0-gW9 zsOPbYB(KsAWCc|`7n7H78Y{984AopNl&S%#WQl-5$LsN+wHha{vK`QScEo`-&O{@E zBz(?T-SXrH$2~5>&z+1EZ)!wkR{GOg=LjW^WQ==QKVDAC~F4(3e ziD^W#DB>>evn6w|H5vsZROT&lHRDr>^Ez8}-8GkuWAm53Q*&m%h-Zg<?p99nC}U0?l$Y9VW5jF!f@Fx@w-b0D$y~vxu2;1G=lt zB_5~Y+h9QV%3ivk*&Mm_s1Pu;76CU}ujC?p;jL!DRBQ zG4MNCm)x27hJ8O{lspQDAJi<4! z1X8zcyxY*?Ptm9`SIX>Pk=0JM;w`)L7}V1A{*a!Rm)L_s>B#4+)mt0B$BQy>Q~@iG zQ0yX1@vDUC*C;1%qdw3B%1f0TT4?xa$3;dkhTm)SdI)NwX$7jz(5_eZx600q>mxyu z;T=L`vIcqnZcL4PWY3a~BuzPUl8cB$d#tW|M-^cxLhUwJc=CvAegjf0+YNf3;+LPD zEniP{?dnYZR?Q!}2ui)+&Z~S?Cl{(Eo8qtm$d0L+{?5 zdA`q6VMr{g{op0wSv2~oZu~7t=x#LcCMbTJ=(8C8SQW!mZom2w7S`}fEqObJ$&2%6 zf)^=FU_PR`?<+%buk0wnNc@Tb!sp3*`DYtq?`6o9+XwG0#}%#?rrBm6$ILd=CEb4y zd=kP>bBrGp9&;gyOm{XjbDq2;cGLCc4&{6F2dx)>E2+^ z*@Tb*^7i;&aoZRd!h4YW&KjpN-nl)Xt(6RQEm;*G(Tc39A)a_#jZ1n*dgFSwWR8<7 zw)XIz>SaX&hkAU^0TQ1@XBk%%*ut70JZsIVrN6vz;xRSGrltL%Gc;f@Vizm;+H^~| zz<*Y4Fq7!AX$)3INY8|al18{Y&98pC0=guhl^(&Pj7x*52bDIKKTys5VkuwWNy4Ku zF1y4vzo8neOPb!MLuMXbR(j26l#3t2J9}ky#O8P!I-k1W8}yjg?G3>-)z@ZvQFR@r z0q{{j!*urjHbEnl)tVbCP}P{p6byd~Vcyjgq&V&HF6bLjiSoImY2q%r`eQI(UmMe= zf#7xA{$kOx)XKM8g(ZD!cilC3LdnYqIuN6FqFIEWG8Q^~zwKd~G&W#0Z2veCP@{Ov z-MC7+!DW&gk965pSpVr{V>QOb25}nk9EzV~LZ1H5w2#8&xoCutslihj^HbEBRt`I~ zWhG>nMf3n7=3+eQ<;ck^rRiBfn$IVPEQgi#qAn@^MICD#?UXxmmEV@u5CeTkjoq0z@P^<6cA$!rGMn{DeVo5E}u3ULcbrrs&(riBxsPcZ{Uu613Z*(ggUHS-^# zIA-yHql$8UhJduJPf9kS)V+(w0Lj>d-f%>sj&*+@XT{t|9=#ICe4Z24)?Deq`Edg> zynL7b757zbCUZhpG1<@TZvUcS(??atOa-o$(r^~PzlB?+AI8a)qQ^a8c;A(hy@cDl{j}s&ly_g5Cn2dFV6MM#eCM zX&SSCvw=wov8=j5K3zxF2GrdQ#bMZLowVQ4xh9ivcy9Cfpiq!_`Kg=HV>%Lu>NqZD zYglSW3N5F?l+f_+GSDFgEb~0i)9{nz{V?jh`59}-i<9^}H^xuPo?P#P@^D0JcCIbz zX5MQd_YHv)5hh{u6lr=N?=~LR5g{#}cP^^U2$Q#!9<3>Ws!g1mzbITqjWOcuC33+|f$8 zF`bc)UX?e{9X&QTXJPa>+cwemZRLSih{#yxcvCbz6>Y z{8Zd#-0h2yKkPc@^?#G|yCq8IT!nhbmqw&M{MQ5j&rN@lSvfan8~$j0?W^!ldrwei zA86D()n*DE5sRAq-AR2cExk8Xb2gweLO?hM92sDuD%PCuP`xq=u+k*l>^u&U;0RjQ z>|B4i9_k-mn_{)qD2jhjaeoI~QDhHlzLq(jNC&5_FjFM-PO~y6F&c9tWVe~S@9c1F zu0VDKPEqL&iFLF!Vg$5zb!>;;Z*#r!dB`Tmm@}#=4q|5~&RCP*_APDF>HGT+eDh15=RW72b05fthYaEIcCyPxZwONPEKckh_rad8jx@4NFK2=we0U~yAK zEpgkMKPBgrop)*P@bXo?^u1q4lhd0!L6QgcFaQ4DJDL7eRzI$V%n5niw3lqTyta4L zQwli0J6#_C@l5~MJO9_kL%UHbXWPqWzol@jXyKp{<|Li)>c2l z%wfS(gmg#pInuJ(Sv4l=U5lrlrCtC+k<#pMk0Q^;tyV_l>hRe*F^@bDSI$?3W~<=XT<| z_iWR8%?zlyUK)t9tKy&hN10+Eieks;3PZ493*zcl-LXhmgm6l9-z%kT-&Fqie47vC zqu;ElD{ve;h8lp^&4?OSJ9ixD70-Cce76AmR9`~B5E3Kuk{+E#O`H-JaZ-TUHeuYF-yyCYL=nD9URr1wX44u)VIkl@f zASW!f~OGXo#Y@x~M+t?DWjiBa|~q(p)* z^`4;(x`oc{8UMbV-Cz7|JTvXL+WkV8694hjm`i=ojrY2x*&u#W%ZKhU0Rd_gP)u|# zf5tts1QDL%Ige7Cvo=1opwH6HKaM2_*{Dh0z#1qb5lt@&Llq6n3`MhqaI>FM9}{op z^TeWe{(I$QRKV{bn#GEn?DJA(C@)ws7tLbCeGnmzMO zXnta0<=PFpoB3#vrk$yQ zIlU~q2?Xd1uuJ7`G*ApjnDoBnD^%xdO>=TOcPe!f2|wF;@#Wp&*7@y%kT>Kn-W_rr zXYEZ5-s3`#)S1C)VXP(^RBQM2F$dQNv99bKI^B> zzK9)q(%N!P`7TfMbYkhfw$>p>)!vyr#ht&Z-O}X1ElcgMw>l?3KD_y7DyI5D#&ase znTQ#VIW6qV$BZ~)*Z4Pg=hj8~rQ1774G~1brw(!^?8}!jzqhLr_i|-8(sSK5%z|e9 zDC9q=MG5}8OJ_MzfG3fEZ#(jywrne+s9}*0(3YaC4-@VNs$ckWyF7 zX~&OglplxHdg#ZJQo>@H$;LxL%Jx^{LCAExxFHSA@+9hF6K58_KHL`Qo?01xOo&TJ z;t@sJNtXslq9}t$%?r%z&i zgsDhN|M4I$`{1uxV)}1?NZN`vOfpvT>Q^+AZZO1WvG7`UvEohr?ma|NV$u3GlTzfS zCjzqN?CNWqYO0B;fa+z1i|r6Z@LP|^C_DGO+1U`olDOzT$_yVDvNZ}=?(`@bmoL3o z5YHSfkpQQ{-%EWomiwS~BTxoqJ{nnIGZwV*8~M%LtHX8EX6PL?Dc>Whq1kalT@c}` z|Idf#dfZ)m-d>g+jYa!svfw(#R5I2~@lRZ2RZ|%>H1u`gfeym7NN-P%9F&)zUe7>b zCKm0IX3UZsU#FTF2NbHxvc;hnP3V9#<=)Q1FsvaBpg!@Fslm(6Qkj+8H%^=1dDAQs zCb#zC=+K6^V*hQdtgnCqJ`w)1tG=jg^RusbznB-IzB{3Z0e>?z4f87~Pn$sPJp8^o z!vE2Mikc~YRy3oRm}Wu`s7AJ0Zf0H~7ED$K1P2Bl#UHC8H6^^l?))`Q*MkP0r+;J| zi4hB717HejybQAix&<%{W5Rz>)|X)67D8jLPs>I$2VSA&RjVt>deZ|8&)VR z=luH8&p*8TUS=&bepo1e>%I1YPA#qJ8{y-zp1*aF!>D;E?vfhN>u`dz`)Yu6@hXjG z4{$l}wJdRc=LsxJtgR1P={G_IR^xQrN zg85VftKz#O2v?emYEjAR2zunGmda8Lu%&V{c{32 z7|%p5fC1Vxp_0W-g=~j!O%B}fh7z(C)|kqIp9$l_<4KinRLIXZUJnTe^qFTZZ{L?q zQsV!5GHG6J5E{4qz=J*>+Fe4FU^)HtXfX$*r-X zfeSIzi1(;mBaDZA%-D-5A-SJ;6udTI6gg$Q)ysh}?wn$H`V!bU!cY31ucy!c!?ozGa`6Pgfq; zm4yCCj=U^Dfz-H+IHuV08>(t6mm6x}M7Wd>qBXkZGH2Qf|MT_yZ?~KokMcknsdzjx zqkbrd@*0g)ayapMXD=0MP#rN#1AHO|xl7E?7-c}1aDvF$C-MgHh;_Kdb4_7NxD+ZJ zk*P!{asD(8-If(}Y<{|}(($9&l;LOmk1?ZYLl`jMO4xU=@o9b^;PJtYMSknG!m>HZ zhdqz$P;DgoVb|UITD9$1w2^I-&jn!at>4^l7$5YJ4sjnRkU_w1^s;9R5+V)+D3LTX z$7&1+X08|aj>k^S$OF_=u>O>6SjJz$8ts{a5(|}*PBmOU)G~^$Q~7vhD|g(nQ37Qi zy0YeWuL4$)VE9tAxD$dXgi(^hj^L_E_G$*5D)czPjzT40YoD9&c9}RsI$$EGnK7t& zZ1n!6=dl7sP(`*SI+)k@U7yCfDcH0BAl?}Zs4)s8#g4u@C8Ds?!(T#z1a{*)A|WyIL)N!w!>YwXJ(HYP;;0GbW%AD@bSr%h%%O;D!9hgBy;?S zn{O@zc~^n@(L>bce@?@EELYi5map8vUq)R1-8NESl&(Ve;~GX0W|^hDJ%n+t;umA>unw&Tj8tPBkGbmpCMDp{%`Kl!5?)hN6+<4@!+5_pLr1Im|I@^+^j& zf*@4|5V?HH1Pgi`f%Sfe42@F6{@|!`CY%ahnaPA}&xKq@)zHDKh>CME0YydWR|pn_ z6=ksBEIp1N0()?{YavB58Lwb4!TRU=hBMT60d_L`h2o69$Mx8W8*lps=?))`9X7zq4INfUA9LXJO*EEAn~d;t zy7voEA=TIrcS^LWvn4-N=lZ_;>Vzog-wTc7f2f%9L96J)`QyUvx=%94D%@6gSb$?u z!ph;V;7*@W{sOx^8h~I2S=&779k>89B)Qs&8=IpGrKo1t6#6+$*yIGYaHY-sS#pCy zTj`>!b_5F*6e3-f?8RM^V{Pn;wq(kieoj~lqOA=e7ZcM~C04F}w>8N!C80F#A|N^o zIaYVRi4>76r5fv;Q;i4khnAahY4-^b_@guwL*)79#0~0)uR|wwgD+Qqzlad~Gu$6t zA0%c*b3l_3FZL`bOE##y1W`kcFCBVLFDceJtb{8yHbm$Pi6$aW?)xf!J3yUhy(7qfHUI;)?F z#~2T!59`qPnZPv=!48VnVSKNMX>3Cz@i%>SZkfn;bflQMOB=tI9u`*VRj5$?HrCWo z6x33qWJ5EO+$ZZx}bEN8!2Wf8T_xfsIBpr#EMdWx^>R@hDUOBk%k+YOyzB8$+ zwa~O`u{AGv4M(t$6g3ogy?XGFc#zYyZXOWei=qq*;BQ$mKj`NPs*yao=6w#E8D5FI zCLZEkAsS+zNf>w7WAn(3Wz8UrW7{V8#P5y$EZ_uKe-mVt<_D^7%bryY{iVyeYdon^ zYrft&wKMUwS_jqqO~)nuQ_t!WJB~e3^A4YCQ;7hOC#JvfOk!-2JwU6!sOIPSC;ps3 zN)sVr=Zc=FG7e!cHW;qCV?mX-DR25rp(Fh+9de=XMQLSJgPqYv3ny^NEV0%9js?2@ zm$s_m8@40X*3L0n&risM;$F|bE*dzi&bee8sWY*xb5-BA~#(`>2LHo~} ztf6aYeEik@{_(wMf8v;A&n7Wi92qI87)HP`r=&{hqUhX%Poi2!#PQQGJ708@qIw)z z3U^($|C5Ytj51G`%!>`@#&2UnoZHmjhs>>d=^qTz;yF(1i_;rsf_8?yl{1;6(QWxm z5B3k|!v=W)alW^HCbBmU-_`YeIln=h@pn-8ulU4_xLlVd^NJ73t4ckLYBfJeK~l<_ z0-%bZdtIE|GZ)V1{ftOGU2tR8`qGyb_NuC$Et~6Sa8mV_PQAzX$g#FqEi28A+^xEH zdP0!ibal#RNcQgf=vPWo^fUj*rx$f*ltO>e!iv9N^Uclp>vA!fhBqin=zO0xqq*{E z#mt$duCPCE)n4PJJ3Ya|^&?lN-AbA6JZ@mccOfqF*I4#o1xJ-e}kc#Tg?u~Tc#OS`>i9sXm>tY{f zf6#e5w;Vo?n&y#nHD3^-`@F^!^mi_sX6i3n=3hE;cw17jpHTf$I$|N*O5fnUTmu8#rhI2_{x@cN?s_i6 z;Z{=|`p#Eu%Z2+Tq4~tbYeyO8z3eLkoF1=lJva+**T28_=T`Tu1tl_Ju!fm=(--mP zsX1#~=T})=UQw>hi_?%_J#%0GOBJsw|K;^%kRMS0&7?9&mp7fn4pE3&0PvI>W!mi_ z(`{`CaRrONEt1SyHc-HE@jHKR#_8i}XE*4?N8l5o&SQ&Di_~^Si$D#%dfUp{3EDW0 z{F54M_VY}xa2nf1-}9cP$diyJ?A_$uf4SfTar|R?*QUQZ3<4`yg)V9~MZ4OCeE5%; zlX?8{Jf?rwl?mAS>}b)%il^^mVn>EuNd@POs{8NqSzbm%m$FC1WZxyYI)zvaTr%T6 zSFRCc5lkh$vG(8i4|M9O+zZ9W%y2BqRg?r!EjSb1KP+Qd_&_i4b6tsdc8s#s&w`ZrfS<2<}SdwzbKpZ?6g?Z_>c` zO`Wpn-JDs)J5jFB6^62n9}z8Z{s0Fvp1&@`Y3Is9l@(tX$>u`_29V&yHB0B+djVey zUKxzT{K94rzGy}pSnr4fT}?5-4UNR2Mo z4XfauZ)K)t`d=wML+pQEWku{HME)J6g_X7GmxOdY2)QjtBkFiPxFRqO8(2~(2QK5l zuz4*w&A-v2ix-zgdd+0~zUdl=L8o>7qu*rjUlEfU01c4UF8kDXg+kRo#qRjV206hE zJ$71-t{y+JnINvXkdCL_c~w$~l(?*GmI3#)8qWO5!ViS zNl)(}_U`f+Z_m7Ydmct&uIYEm`?wNaKb|pB(umXm!kkXx zZO5I7L5QOR{jON^TlWop`y}Zyc)Jut>iXU(aK8G(;#3@0@;-FDY4I}Y8`LUU@7NqVbUzx#;UJjNwBRu( zDnKGY;oa*9H6ML@N^JXR+F+&8rSNXXwr=l%lPxVdXF{F)U6-{qhxpcHv=>SDBc`@J zxc8Zu3?evpdEDRm$p2n#CFT)mW1ihAC6X!K0aK(bVO6|JQpIB>f3ieLcL*X|Shd7KMNyERNoP74X z2Q%P7ChX!O1jyAwgIN0a+P&AxQMYfB2kd?>Z#AgFqs{&lG(l}lD<~a} ziy~;dZNPxLZ#SGl6v?W2|Li%QtWoNq`sBCZyVA3$#-%Y%(`a%xe&?+mdsF!QnrWf) zibGaKIAo+~oqk-)Cs`-iohyDA%obq*LC_|D;*^0iQ7= z`mFU+ktDd>QO^b=qomoU}_R zg?tlrtNJ>D|USG5viXDOBrz7=o2AsmG) z)TBq@&E=!OYU^IG69Tgxi-GS51gz|xHN}ww=R$d@SxjqR6ct>e7hWfF6qeI`7f=@b zBKXF2Xq~w=oS^b}Awr!w4nxCTeGRcA9Vfxi+DbF<_K~SuMq@#B@WwTqaTgSC@XOZm z>dr8f<%HU&PVJY2#z?^J`yZDCaU8B%3ky25Q1z6wD0^zsEx(u_b{Q*LrJnvr&DaSu z5hVmom5$tq({MTD>h(JPBFis-Tu$Nvs_E1aG?PLsuwmn! zXy}9}3o~3p{uqb(j|Oo}qCyg=@SoQyo?IJ|=aa)30p5-l5%r7LY;37uEG8-lbc#d{ zA8z;;H8%Bp?`~mKUFjPH&V0L!F;Ft2!b0Xe-|mW27d2c!US^FJ?)Mrs*7V~|XK)b% zygrcrqIDK9w}s4{p@wa5z`@P+WON9snE`jdBt@D)J*7_%&&6h6DZ?K+C;7xeAGR{{ z0-Nqx0yqy|H}hbQZp+1kIpggV-%7vAmhoz%L5Y)X4V)&q{|hY+Eq%I|&Q9 zjl9?W5-?mEXbrqtIDn?`a-|kGGj1vVNBy&sB}WIvWK)gw&QvHM>CTR@r9rwd02~^A zmAlb~LK|p<(FOnDnWrc!|4qNqaj*G0^QhTs z79;RL9*Togz0&EqnIfe{_j82HA&O(FlWPe~afep9A1@K!|UvS>bDxI(&Iv8{Uutj z%o~+*Y2D52zbb-5fGU`xA;nPx>3@5Y-8JrtzH>Q<_70crwy0!AkJkXJ3gWm6pN$Az z^!N@7@*&SJYHnuyY#73kf62Uz%nkx1Z~{MyR@rf04}RKfuzbtrrs4-e14sSJuV9nH zK7~_?Dp>bFyg3o^to?h0)9xt`U51^eIOmXh-yg^UbF(`Q>?mwBT4Eo%-?DD?aOV`M z5m<1zIX^N}zz-r)L77K+eLM4?P(7=mUaC8@5nqZry-I_7>Kr&u z68PT12;YE-K#+P5+#fg3uzR+dj9rx`(5Qkan5*Wdo_ra(BvH9C>q`G0W@$QV-p=+M zg)EF&vS`3}ezBpCN$oU)z%OMQ5Q3C?3wPPJ+Ds~|De+$?kpBo zqY(`5VSi&cjMlv;FV@hT#FVIKE(XRy_2BG?FiN}?!Z)J~U$;s zoFe3oW?iY4kYiqVp}D$I5e?p4?8Jl$egPcs1k^P5doIts8*@1+#){pPL-AX0nX}XL zkY<1L3||-vxU{^NKm@Pjj)>HkvC$YdAX!5~@qqG24Kd3_0~;RTT~RYm)VRh|_p`Zm zGq6NT+9rz<>B|OCfCj(~t_ym@#{LMmYKpIF3!0d+xO-Gs%Km4ucV90W-gx5FCI37qf{u-W0a9-0Cb+vWxLK$FmBeP=oaiugTA`6!2SH`!Ctq-&*;0uztr=XiIQIm*Ym7Hv>Qy18* zin-WD65~V}B9$Wq50wkUge{DqW3Vh#|4uAA8Z>KDgxFgC0`uBP64R@%`o1^v!=r&D z>E(rGeU2aTOfh}6O!z2JE*0WFg6oWSH$#U>S5zK2uWRjoJEQ=Is|=;~Qw83uYgRO2(NNjP*ghaK zwY*$XwSg{#y;^JHNOm{5Mzm0+z~2KoumSbYrGopxsy2r^nHhX8+tk5R?@mif6qEeI zH3l6FMCW}FQKZ5@VMJ|;g4*WDyn%E&8qp%e%yNlts; zbT~RP{h>TYlqqb zIzb_;W1*?9L>T24y)v)dTxTg)xh~kU+ROYAKSqI*wP~G4zNEj@C&G&2ou7Evz8eszM>XbKn`2k7i;2>b%Oq1g@7B|K|T;W>FLMeXRrcWBzhCWkj=h zKsB-Oc^M*s2Cz0pooJ>|1A{0@rqcihb!1%{`}|4Ps_o72%N}0D_@RgPC?nq(G#h>e z)h|wg&w&CMv@^?u{BR)!Yy=yTY=W!hL_lPw$JlYg-l!9Xo9qagu}k#%{&DCOy&D7y z{4;;&VRuNQ*@@R1>C13dp0$Y=W6V!xjntL`qsi0Y!vC)PXfy`TkFR5Z_g|Gx-i4OP zeQCKiI7d+aaeGk*a3ro(wAEyNcF$8`w?n_0%IuG^L_`W>bx@Q~!*XazJ=~fL1M`h? z&(t!nOZ_m(zIRu${71?s$aiU4t}I6%V70885&!X@jmMGO746;7i9i8V^-9N{`U9N; zbf?;j#r5-5C47w^AMog(uhPOih2$KO@Id$cHTL3W^S2RVlin`5-Omr%r*Qq%zKFAb zL4pscGQv-U`}_kMtn2bidr|%CN#I2{FI96sWYc+h76qxNkp|dCQLbjuN4&xH4W$G^ z$M@XBLEj3#q|76rm}2XWSz#JMx*cZ=O(!)hbjDELelbGnPC ztnD)UBin=rqsh5ocnCodUB$;2zte^$Rs_oujaE2oGU|0ulDDnZW-|NRgAr~29D)wE zQOt4j<4`J}ciRI-8I}zQz!jA z=Dqg37~-;Ow;lO+=v)|N?}P31I_~i$7O3fU;VL1Fi=-?v{mx1 zwDyU}odZisY{+$VR6PiFHC7@?2Z9wr#RhZd%_9!UZ7G~AkAb!c_IA1z7M$8L{LagR zlE$KdemZ>ds4zGJ7l7-|i39H8r&h3un027dH=34|%MMsCqnbn3){TR>v%)0rK17An zXo7h8P--?xnOS(z>)6jBYNCTE^DVnonQ!mGaC0XqY^=Miw!DP@eyrg$P{T$D$ghBh za2O;@zMW<2dYoaoistoCx4#m`S1a3C1UG*E)V4>e-lf6Pf*MRiQBK+fWC2;8{pO$e zsCWToa|F*qSN6fxJny$o(k83PTwp%Qj!21>@F%#3cW3=qUxW81gjs`lt0}L2`s9c6 z@SklN5AYFXQb?CNcf8C+!9gehK+l!HMW3$XOz;`9)^*iE9-3V220KMdt0|e{vWV3- z**mkjUD{@=UK^3=G0Kfh!=OxHiiP0-2=n6Ga8k=un($YSwe4q>H{PDzYK?l%@UALG zV*C6TLm|)}dwR%aN_9YEn8+mrq3X>9|o=Mj> z))w8H`uIWe4SPxYp3zJlVcwF*plz#Yqb!BL^6~H{_d_! z()RQFK3AT+OE2t1_W?f%9o$DmYi!zrM~WJ1xbif*Hvx zCSdXV2b{`B0tUrV0(OZIzy_QXdx_NL+%^@afs11&o*nVqECnlgLfVbLh!1Jtv9(-N zyaeJhm{JSV!Gbz-UN6W?&SmIrnkukhp$aLoc?&(Sz=&C*H!e{X4b=w?MFU5GW0yiE z$Z7#uE)Baz9q)M%t9cX(AU0Y+j1ux6N;}1npvwxsPwNFA=Kq>Pnk$Bhtg9aAZUT*k zRmQJXiQ}1diga)$(4hBGv0S#potY851IUom09$tofQ({8p1&CY&z{WC!D2xVp+yi) z@Tw|-NvmVy!)vb{U78?>8{X^5g#e5amh(S=%K(1j-ll_E`5%Si>?|2JKX2>;LA|XegVV?d})k z>KN}H$MY;1_i=Yhxu+MFUt2ymhp+Yf{X)eigLxk{p827n*Z!pd2bw=Tx9W>FuVr53 z)TCso2Y2u6FK;R-C?PCaVxZT-k%8g9-FZSP_fWee2+7o%Sy!Je7MQysWDJm0vl9y zIu#SpYfMiJywp#8#Wl6aB|(SFXPS6Gq{h+yn=!ys3hp@m%v%oma{~^nvVWy%%Gc&= zg+H1Wq{bV|ZvO4`SQ9=p`_Q-PkDGtW~im7&>0GDX2Wt{o&aXCqw%zx+&CywiY5{lyx zoKG!Uy7hVr#dP%K>5!Ky}EQpsT`bOsVvz^wX5gn1g9-6k}LB*$~AtM zhX%IFO>t;G_!2OXmB}tkOP<<5()wp$UIT;H)@>cL3eoT9NL_4`_kz2A(k~y*m0lbYHW| zVM(hwJ_&ep5qD1kO?#U{*Gn$pAa*vAwK11@X2>a<^ z01`oYg=_??m)1an)Dm}X(p)CScXJNI40}8yR$dHIUqQHL^=mjHx1-67pig-a9w!l6 zW#&d76GmP9YWE`TLWh%XD4CTio5{^0o4)^*jv*_6a8C&Z7vgLM_1Qg*e&{Ih>%7Yz zojUBj{WK))dRS*pnB*HiI^sSCz|xSWt|1nYfg(`Fa>hS|SNIhBv9jH&r=}!+UdpW# zF(<_8ODyWd7~dD$7svu^wRKQxs(c^zwPNV3p_qLUbvQF}il$vXqG#ErAs=FjfTomY>?(Bf%Dp1LN)M+T4%TPFKGf!_5&hyGhBMllHkJG&8 zS$rX$0|=XHWWk4mQ(Quu7~=1^DCsn)d(Q0` zuokdmJm}!*np4iF_VWoczkRDYK(e(ISi48~N+KL4n2TpsuGn1_9^EDu1gwpk)nb${ zw9k8y0$cT8ztF9v#+nQLcyn*;)sWznCUo~R*)$Y9yk2rsIX?ZPH1{_C;CGX7Q&agM zEXC6uH74bG;-fq#v24;}e_~ThV#frr{_G6tU`J) zx*~MQT1{zjeB5JDztwS=zT8^zl2Q%~o&xR^I$V{w^a(uEP63MyF`ZQbuMref4*4_K z*!96VQap`N`5Ve8NAqnNb`vHbC}O?LFkbRzJ~;-xqKDOOyP0noiylwGxBPp=#Fp45 zDQbky_NHCHz!~xQDNeTpSxgf+h`fM^G_{;)Gx#V745{&0?xgzMV8g6Y;PI+2#kIr> z=Y>Zd2;+*`+N~f5E8MuOwZ$kh;r0m;qpLuLB>BwgVSN%{m^FHM(P&*NJ0!&uj|#YG z5-XPCIgIkk(!Xp2UZqF`Yf?)0f@!pjd<;d|5pCo&6(qA0{i}aB5Bz*{HyERmo5er@ z_ibBR?$nYWU`J97L{TSbrKy?H8a0EvF!0-W#lcX#@!@QIwJ19j7ak-(gg-N3;kf`N zot-}N>m-dQM&S5E%X$`jg{;|G|J`_4WEOANb@a!MQT$ULe(vRbfE_2M;2TI5`+72| zAWuH`_p@@FfBi81l{2DrKykVtGO!)wN;t(}{O!3Mfx?jmVPk_ikN_{W OP#E4c)veG*#r_`vcBkI} literal 0 HcmV?d00001 diff --git a/B4A/Files/gabinete1.png b/B4A/Files/gabinete1.png new file mode 100644 index 0000000000000000000000000000000000000000..78023d32aebdcafb4a6e5539f76a1fdad56d3e47 GIT binary patch literal 19549 zcmd?QbyOTrw=O&c5AKA)HNgq)!6CT2yA3|bV1Wde;10pv-66QUySuwze&>AaoOhkI z&Ry^Q`+ItI_tRCoYVT>8y?a;n+x*))0R6kTlsEti3IKq5UjT2LQ1enEBKitS^5Rl5 zV*gpu4|oR*GXP)S z`M+?Zf8oaVj{nGqz02^~+PM6q>mU4MF|sL0Rr!67@V*iPoB&Dy34riFzyJOC9d=m& z0M`uw0R8*F%Z!o$fcjqm0RG~Cmr?!!0MLE{0Ci*kUH0GS#NN=+@IShPdEb68GXnrF z^8o-9O#lFE902&J{U3GjoBzc&()TLDcf0J~7ju9Oz!X3VkOF`J#sJ25_7%VkU;%Kv zEdfLT&>#N6KU?T`z`()$0|YoYSU5z4j~@{c5D`BjqalApLPbJEM8QBoMMFo&K>vu0 ziG_)d_0G}%=>+PZme4Q=?+wwB5Ru+X{~z(z0l+|jGJ-OOh9U=iz<`3rfO_i&5Wk;p zXut>Pe{RM95AXFF|QK~xoWoA`<;uLZ5kFMrWGyWA5SIe%_*>&;W zFX6jFDA<3|3IM?WN54=A@3q1h0H_Zz(6H}-dpG6Xu>aJGLB=8khpA}j0FOofBkF5r zW#ApGW2^J3}_61AYg_~^#4!L1z#03;0kOG z&6=8JM>U@j)>Z}!Zm%W2AQjIz5M|ZaZ6|R5>T?wM7@eg!wbYyzu?>A-!r`y({Q0|OqM0+K;rr1OfZaZ{=+pgHY}IK_0`Sbz5oytnHC#y( zG{Xmk{njHh1p9^oYXk-k?ksX9^`QS}v?HRxj*>!6$E*jntLqNmz@tq)V(7=Mec4Yw zmr=wTVOw(h%F>*+F^v-NBB@YUd7&s_676Xxn}%X*?P@Y70k|gE5c(|WMn?5;Xwf$1WLi&o~?*$uJI+$RY!u~x6 z>Q;jk<357%hEpIOA@sCX!!BU~f<%?vv_bvks5I54Znsk{q}voK%i4f zT!(ed=T|#<{m@wH?k49W9&?Ul%%Tt*%aIr|>tauW*+lRKl|aw_duuWxuPmbA zH}4&L&hW3(($GW-CE~*DRV(AZuc}5ub7a!&8d^mu^oLW8hH-m3n zo>3V&-*FIVme_1~{s~nT2llC{>#_f#4mx<=V%jBe!FPlb(-vCD&SdM$;dS#C$+%4O zAasv&R&+?*l{Ox-IoGdTie;Z>rvOWTy11|ogy`@I%}3%46q*r=ix~tX`=OGC2@%H1 zVgfh#x`GfWKA^%7TLgvF3X}iaxPUAHrB~NyYcQpF0emw;n@B;ymq}L4Ed;d}ni?{y zaZzb$I*?E;Px3ba=fK(mSKe$A>4|d}Uh$4oGXH%+_{uj52RXDF8~ysq_Anf6h0)cM z(B(TN6CwjY=~q0A6DZnVO60cf06Te!&qn`7cjgO$Ani{Te|Os_py_=9@n##L8rb>0+l zL8};Z4y%TNWVMGX#y~skP@(e`jb+||Qrhkm!fH+a$6|A3{^4Np*ZwAn`oT%BA{8<2 zi8}HqNelipw>QA>vlpDmi}G&D9RYeprBSg#`3s>0H_r9H-O1}DXdQUS;6rW_Z#3wv-%Ct z`ig$Slq0m4Z2DaPn*-fnJA%+{Xu7 zQ70H_rC4!1NBqbGvxQjA``TRZjg(yw+w%JFY!-6l?!Rj1B|+2QTt}AVm&C-csmp(& zFS@iK+ISH^KD%7Dk)f!0!sD#oYYV*lEx!qk(ZS_;$rtg_ZXvuTb`fg1`>CPBXwsff zT7HOS*r>(1Sj~~2wvA)MI%;ZZ&mLzQ4LmW;?DlHi=O5@Av1M;(hL>#oa4RSuZS3Ob zq1iiXc|iFUEgZOX&j`Hp{0Ty!Ewzk9Tp<2t*ld0!Wm2D(`gx(UB-Wki4g)R0)y*;D z#)^fWlc2MdzG`ze(ZW*8Jr$qRIbsQ9-f-j8h_GXu$+ZmEan&+=EZN_3_3!`Qglh6LA zOPj7j`AHQAF6gSNDs!r`+M2w(1qD%)LlmQ@kY!h=;0wxV^)TiUWj5#Q3jrxpdt?00 z=G09v01fl|xf<`!R@#UIed^rRgT}&>OMKffxBZ8Xo1NDVQnXRZyIRjD(VV_=`6@YF z5LY_1l8;6Tiu$-}Q_V+Y|2^{U2?MS)z>5K+vr-1yBZX{UJb3lYzDg&01N|fwY@Z!= zbFAU{)EIO|VK@#ly%xK^;YeYUiZjV6wwZmpkLgZRA7-bG?a{KFa*}IKJ6(qdyvInI zL$DYwC?Yc}UnfH_9HwO!=ZwQocEjUXJ=wC~0I1YwlxcmNHAP2J9#TiS)o%fN zfxEHv4uJ1p3UjSJhkR4f1-_}4cU>0CIfX1b(IKWT**QC?EAd!_**Sk@Gw4wi}&v#lMxR8$*Jpv5L6Mjt%nx!g|JTwNNDWJi{wjHHXq&>H6L{q*R#D~ z#vQOk;x=%GefucxO;~n#bzfp}cn2XsRD~$t*R`xXS&OGm3CxMR8kb@DTA7d}u9k+m z-W;B8a(~}DN|BcPQ*~u`VKEUJ8J{NWxBnT!u2?QG8FqfSa{1AmeF?Q%tBM1GT#Ynqk4DZ<#KsvZ0k9k-XR_8?6oeD>RB zjTthnt*)-BuS{j?B2$Zl#nmQd>JC}mT9uAe^2+syrKthBD3+LJ{v?#Y;MMc% zic&TkJ7(YswWySUV0)7@ll)!bNl7=)0dX`L*3WlHL%%*i~*6kdd{Au-x;`_ycV|02GP62`?>M~m>eP68UbGgIOJA>(>}W9CoxnGK@#j+p5}whIA;E`-RK-PclOwDvl#ve0 zjoqhG0w!_JTn(*F3%SBezt3%X+A5p3I2BFABQ zZuLn?r?O$u;zEMKF-3XUkmY zSy>HtaK^W_o?v!aE<0OT-k4+1QCQfkwOf%_h& zeV-ZoTEsi{Zh)AxHP5DDakaIs1Oumd9}BIligKN&M(Bpt=p!f_M;#8OD5K@w=_(gI zuxNr)lJE>Tpo91NA!A}i1*78UHevfXiot=ljjwveA z8Ani~=8ifAp+FB8>2{;#Bw+OLPla3jqU2_nX_;udP?+ObgIcoPw3Cn%S}QLa_4PY1 zRBLb$D{gwy*htbJ;ZG|^^BWKvLBZB`#T*%k>S|9G-sI%9;rSeAQ>aaXijy@)wDlma zXRaTpYGhWh=Vq|Zb(p73f}Yf?nL6S!Ls(RG&Nzz9sxnahh3K9?1#UP(@WX6CM9V6? zdsGQzmBLs$b*sVx80{G=^{0i*>b6ZD$0d2@jDt(JrhX`fupi;#So4(VmRl!?pRKI^hfB*FVJ$Q2@DgbCg(Hb;zPqJsPj&U^|UFxGzoM( zVj58206`p=>a{{T`o^|RmOYF@K+fa=oj&eWg`q<(&$HvUUnFz41Q~LFdcKynsA(?s zvD!Q$=|gqs9cBNq9TCpf`$?TZsOF8tuaSw|CG8^@-0=AT+QNBI3HNJV=1iC;1u z;7OL^`0assF5{#qC@%u@ETZcBrxMEPCwi|-zmv% zhmUH=Z}8?f`SGn#qs}(L1gsa%kH_TXkD8v7|IRCFF%7{?ZcSobV;NA2%H))AWjTwK z$H#I_NYzpk#P0K$_vJ;e{CR?Qvdv~`F5v{Z=X!-?eC9g6lbO{#_oVFNwVqC*Q?)h= zx#)cNbWb2UDPpMsiXv6OYvG!Xr#K&Wx!q_19dHHNz}@ps0sFiGR6~_H{#J-AJlL!IjmAgyk3C>%EqUL>kb@BJ z^pNq797hR3lE=9Ah+4vSJPQQ+|qcFa1JGi!d^Hxb~Wr6u3D|!UG?=1z%*|vrdd=s|5+&H8%cE6r&M+rWO=6Chm!9+#FgRnMiAh)7p}^sscw!SbO^Zuq(WcI2=FFybT4}A7sM93ppyt0v z$}XlolkcV+@^eFvFLD=1zauHEG&0~3k7uE zBL%iY)_2VBX`9#xiw5t~jlNiAgI-Ax<}%KVYG@={^PT|(ZN0R zRrke7A}EJbOy>9-QYS~OiDF=}MbXJj%+e`#)s(8z;J$f)8m_<>0!b&GscCc}7~)Or z>Z+-el;1XV_ennvGOxP^oY+58V;h~I3aUD{5=mf84s2^Pr#BjQ~ld1ioIFi6qdf}Q^&e{eS5^Fc& zNZ>lTWSJGS@p;RQ!Atx0{>Ptm*;m%vd2~WC_F*q7PvPxY#y^$HTW)=^l$b8{=4c*=jcG7xkevJ0v@=zL7a>t|Az{IZ7v51zVml6g%>2`+cIWh+ar z5uC{F+EHyHX!Rca4B=E0eMAOx1CPL>C;SS;P)lH2{%vqN4Az_)&5~SGV8Yr~gdZSUQWkF+%F4ktI`p7@EHqXFsH9!ZX6opHAS zn4Qai19^26ftyeL6?k?^@N0R6sN()+=f}!A2RVWx74R5a}rPU#VjY}IJ*{N^2$ zLI}^^v(9}I&1-c-Mg(jDiTqo=gSLFKPCSDJ&i>9q`nQl7B7o=2<-ZN$`x_5oEDCbS zn$q(s$MOh6xWW|>6IUAw*Uj3I0{=;V(AlkJPMHW8o!&>^uS+QH z4Bxuw*na(EvIYFg9w>okKD+HwbKWZm(Fr_Q1eHS6f9?`Oz0cMUTnt zQ@u6Yj8=GFWPa^#goTSPeSUQO$sos}&w^|PKyb6!fT(U~bA@~;Iz3W8j6ynv#DNfv z%8CtF0<_hO1j{Oe^>wQFcz)C=d~Si!9&1Ei6VcFq4P=(SS8*~iLY3bU*U4}&e2z?^ z$l!gsr;%3lBFf1S(iRtkuq@s)%m}PpOPxfkRWC`IXzh}HH6H=}>90I>YNx8&*BN&` z$3aQ3i)k*Ghh6(_n^V0AGle8iFEO`SQ)$Tp^;B(NW$RsA2Jy$A+~Yb10Hf7%#~+#9 z+;a+SuC_moSOeFP?+6t7TrOCq*w=(El+}{XyE1tsc+@wb0tb$C|r-q~FuBb>WcFqv3EXWepV5 zbRt^kZzV#O$lE@?Lkj_rZOK}E{#@$Jb~|KB$QJAD@b#mIo5m+X#R|CEaEtv}UjV=v zz~sS*TBw#-EOtgg2=~oIu${drA>O3gRr4??s5X=g2Xj+`7i3o$7nYq-Q@@~n=E7oK zZyhT2mCwz^-F~f`y=d40rKs|t?GqJ4Qx3{$e>~Yn+n@A75Cyp=-&X94`^)az@NyHi_ARBd2T~y?W(q) z1eisdwO?78#&KkN9i9Tze=l7$YjYQsu_Nb4W|Fn^6-TTBKvL&`Qo=qP6^)*NwMcEv zAz4sfL^5NVr17`qC%L5zOFHd^@Xy2Y0)H+x0_X*U*Th#}gcrbRs+gDb`ONoOz>E#M znb~^bMr={#WWR}j=NXmYIm?roUMBD$kW2>MURs@u@qRFYo(=V(iAdMJj9Jbx(TJH; zu=+X{mxyQF6L}Og?4;?)T3I+npX_UM3yhqDj@qt<)5!Hx@8q+KkX+WdTPLyY-PPUAKx$YMd8KLJcVF6E6q=QEyGrd;Ig$9E4jR(0u&kbR!D;rNbh3v#L z#DYGBCYtQn5I$bBkoiS{!?Dq4v&dNIeQNf^+od?K^tSW^>*DzMvUnkSR?$=S%B=>! zGU`wVCbJO=f1(jHzXk98{yhie{89lR)T69#bB2@>p!W{|eYc%gi5k0_7Zz>%I71KR&J=%nHa^#B>dp?1tv6yOrDzd1Z{9 z&(Y!($NdU@e?CEtePgH9-vCNyNXv8N>yeUwk8ew!?nB+bTa;>ZzxYg_YmKz5vrTv zd91_qdwt^f;|1sEpiujo{r@_{|5p;)E4dZVDMm+d%ZK~^ViX9yig58U%lbX9=z>38 z%bgA{dQdXDs?~(w$&@9)XmG~jc5*M6y<(@n0SFJ;uTg!;h+X^y+BDFJH0|QZ$j2zx z#%TRx3$r>Vb9cGB{v^xI<>f}iqeIvsX3y^bt5{9$F)S3oym%V9DrKR2IHkhdU2oUO z^~A5d%@e0mMQ`>72-exIHi=IT^)k^X_>xq&HIm=h)$b>y&o>9Q@-g2$9j-f`=vojI z>EGH3c_jE%GYJ$z^3a_1E)^Jmj4(#y!;Z>p`M#HkL|&)fqF;(}JRz%gNfq3tI5hp^ z*xsHPKt~mDL6ht51SG7lG%e;o*SY;^cO2vNo>xvJG0KvxQ?YF-R$L^rbN$^L(Yu0b zyb2FnT5`-lU9pAd+8pEp!aMvbur*@2!Y<2hf?SkS5aDJ5tdd+MoI_)l5N<7IE#-!N z?D~@22PvS$M(r|@@@ zffP+Cqaia|{&s~6R#QW3YmG~pG z#0^`B-6vDRIOMg5Qi|3Ij;)T`l*^1s($DY;ZtZO=nheeICwkZ4PL@s=%QR^vudI10 z19x^G;=p3PGtHvKDnfyPAX&kL#W#S%gCEkGn#i~lwV4p=f#+a;=eqkXY5%{D#JFn@_Or@P4b8ZFMmz9^{f5qO3(?p~_u05QLXyo=3{PD&}BQ6lWV#+vi2g|bHAW&%afDp2J zbuTAC^9JaE^5UR_O~J2KoQip@s|j`qD;?88{q%GjW@1MSLOJ`3Ga5F z&AaG2&;sAG>kPfOQnWY_o)g~0$EfiAs|0RQm5o5$PYYO5h z$r_S&$m9Jzkkn|%&uJZ4(sg19>$qRq^Rxe$d9#K)pINN)5XU~N4XImFj;xCuCFn{u zfpdK^UYW`)V_O^^Q!=X&wCfojmu(O4%OEhBNuMIhE|29jGKE|ojceC(9d;)JaZiwF z|NO!b@1M0n>y@fR6YPof*Y$LBP2`fyHFk93@RIZ^e^&ing=@isUp3URGl(7{tus{# zVE&5>UFbOTI8dMTFUQ## zQgq~k%98xD3|oXjWWeQ-0l4_{#@*#9d=&gvQ}qVUtAF4LFyF!1jR=v__Go~vZ+s7D zWXZWp&K8De#c$rg?bNNlTmKEf0=#!GR%oUxz`CoP=dmOCt!{K%C=Y%5hwo;EVZ(B&+|raX{|O15@4V-Z^t~NI zJXI$PGqJ(w?X4{Z!qwOS^rUn1!G>}PWK&T@*ypzrO?!`iyG8u@(`HaMsT_X^y|T|L zUZb;D_{K~5r+yI07R{Uv#qd0BXxCIj?~bNcz7JYL*SpgSiz;EK#?}g;`_p#xh6C#N zuN05Bk4J>RM6zAp5lOZ0JHC(SNaOt1#s6Q4MDkXd28Zv4(ynH$a=%kE0RcV-JI>Te zLj+zVbb!YVN+u?CNyQE>G@5$rGfOAtVAH98jV2 zr>26np8#{Lgan*GR^E^5@J4R1Wd#+Pk8>qe-w(FmbEud6J*SZJ8L^)C%szj@jqHO#UbfB$>w?m=R($*07y;-yEEnl}?-3hNvy<#1$WmpSWxWh(}Mp%gm z^{6G1A%=J|Y?&#v6f-I*9TI^zma zkQjz)h9pO+74>h+JZ{L8XF7z+#r9fhj7?F3%u{bKZn;@<4lQil1LcwS)4v*IC%aIX zoZ681bJy1{?JV${8fA|-Ve?Zxv`h8p%Bq+MZ`y)G<3h7i)qZ2%OIf>Y2+=VEi;e2) zdUH5!sYh|a)QV7MPWDj2L7KX}vgGP0QWy%U;56ms_mxgkqEzl6lpQjN!h-vvCl*mR zcQ!9pAm2AhoX;$44UA~)wu&y{3Qf!OT9)yvC+v**W%cvLhlP0-Fn#pSXHJAr%S5SA zha8%~f3=r5MmSR4It{i1bkWudrB0o%N&C%>`p8UCT!+n6{drBOqNMsuqre8ZaS6z; zE4?_|q=}TuN%jY7nb%iyq*TZ7f+ozG+C6-}R<0>}$#S49md*JjCyyMTyeKNF0_zhc zTn%bYdg#DMLXV%_Qf?qXHSg-e5;7*=5h+V0Axg-siDu7VG-CI#hb#Lu_d&1AI{npt z3s5bF7{;HXQ)@kAYYCH=4$5bB$Fwf#poy7q<=nnp@zd<1APVv_>ESBVlwncTlu4)} z_tz+kl@!XU)M#s}!F=lc%=oO&+3wD$xkZqqnsEF1CJy407gd=W^)La-OD~g-i{{h9 zIn^c50()6NRoZlHhb&C3VwE^11m@U_aMvQ-GnZK8f{Y%Pds}W%lG~PYhQcPW6w^cFKsKQw1RYZXoZtL zh>G9;$f#~KQQ`rh>Np=hv?iyU6#MI;(wQk5b1t>^NbGoT-0;Y6(8+evpeGL$;o7Pe zjYeT_v`LaO1)H4+rv^Y_C z{Ti`<6G2#)*%+0Z=iYS70!|%mu7W4l)03;jTnl}9QN!LHmX*RcJhNQ0x2V11vmem= zr4$JC=vYU*R)@l6^=e*L@m4=2QONUyV#Ug%FeFIFIfOy&rnKFWzX*ixGr4FjfGydcRi`7eOJ%VAka>uB=@4X}g@FzI}Xi zlVN@h)5PE7w_G2%3C=J^Drt90LINi-dTd1}raF_x1*CNFdqWwhPaSxnE^w>$%fZW5 zeGdI+>>twCta6g;%9MB{kY$)4ZDuubxr<-8?;Vy1oNF5IQC8Kqxi*qC9We~JfBhB$ zIP6vjPWl(My_nY#QPitCDH}Vl-Y;uRjnAq;E!1|6{Px{APA#$&3fE@@OP5KAfa0xf ze|OLw67WkRk1~WNzB(m;d%&Y9Oqv-}c7Z3GMru1LY}cVKWl3;CNZccq?7TGQ*5D6E z`sOCTQAOzQ*HSd+kZsM_lmT<2z$5o7JkUX??S)&k_3$ zJ%o@qRENj^1j(TqndJ*GoP)+q->?c=dbV!?4pl!1@T7x<2+Ric? zLa9+&5EVH<`lwZfo3 zU4g;AsNNp(vbYYEQ}X7ieYVZ$fV{Qf4UqTiaYAB9?jEq&aYz)6f;Wxy8!T_`Z!M-XdQ+xi zW4F94-C&Od;M~(KL zOZ8%sC*XutUWz?Vmw-gRMx6+_t9YlZNz=mGN^hx0StK_aj(;2Q5^(CU&-2AchD&dv zl{l|`(!lLS6?&Z3O``$OJ|5!5===+@ArgbR?k7mwkqU~Da{}>kEnza;N9f`# zd`V<6stpf-+S-|rx{H(;Ly85595yf)`4&i_S z;ay)u^8w?gxyWm`^LIf<5XsYw{spc`naFV{>1$epm*x8uOGz9p&*9g-g{?%j))P-V z5R9pv$Aq**Al%CqXIb5m#5Ij<4fT?J%|UHC#EX3rJgriv)o6v3W9=>kCxOZ121{Dx zzu#F}QZ~-}JX7nWBKh?(FHoAy9ePQj}rk2zIQ&1?y*eO8kk@6cbK0=mxQap`)~xoKB8&;*M> z(;C+9aM<5zG1?h2+ys`wbhxl^{h0osA;Apq%Dx~`&sMMVAyyR-TjieMuq@F=R&$qC)4U*aq?Oi%--oToM? znW&p6V9Ig&lOCR*iYo{AX=TmzQv(3p^;-8Ogf z{FmrQ7rFWlFpgJDrYzPfBi(Tg;yG^N|4w*wMV81JI|6s&kkti-VGcREZf-&G=fJ`#QUkIGJtHD604z0rejr|<5K@g9#1qQyKq*B;tSZp*C6_hp3bUF{)vD7Be?k7V&Q@}gO!>tp4`^M-n-{LFz z{-x0xNn`7ivfGbFZQI$!hf@5X!UNwmp@)cA5nV){>egzVk{Zr1*sVl|d0s4kCI0=% zdD^E4-;-9Pa@!o#8`-trsG4s6R__j zF`d`Cr=$YR@x)Kah8=Z%Ll*oaj7X3@(<~!fUDEoDr_X*`dM7W7Kt}w>>W=dSx9{w9 zp!iB-K%d3Wrw7cxH4oNxgRX5!Hq~;-c>MCW^+o+Toy!46MBY%w8AJpYY*RtU5j3v%h9UaEIESJV^D;gaaf#&|=%3y>4u=)#YVGZUl0G_JAq}#~q}}LjkUCM*?*)x<_*WL%!2MpScuU42 zW1e6Me1VdSh>TxY>1%0rJE7LGjQbflrOzWnb7-pmn3u}UU35<& zZF;fq)1?K2y{jS@%v6kjJs9~1rEw>_YZBTFeAd}(?SPAzX_ew1y!Ma-QoRAhDh7w> zS=D+JeN06`0i3+aoJulUC%(%c5YDbND{py!`v~a>6ukkKTNm;WVk7ob^xZtxTM952 zS~qgzyDtPayKcl|OsWpO#F;qxn{p<2)P*0rR2QN?Vb4ay?xYO!iHi(@dwPK zDmo)|wxjmqN=zw#Haq~}Rk`=oVLZl)?*=9G98w~_gx!X-CrIb={_!zwSA>y=x@-vV zAa#UZU9T#fjDF%}Jbh&E>?7od9lKN8>IoJ^2eIOKviVi*=ywp&-|2xC8i)pQuk6~5 z30bQc-;>uPB}?;FR3JI8aBUV_r~wChaA?J!S|gkqYz1bJHleefG4O;J>M|~9&A1W% z8mH^9{AEbDN-+h0xCbAe=e1rFM;sTyb{%*49CBA>x%QNlvFAA8O)hYcBKzXd>b*oe z+lIc8oDq=5@0Uf>LqUIxYP_hmo9^oBzg!g=B#m-u>p5MRS*xpSAmK9cW_3RkBa z#Os2DXC{fmU3?*UN!t`8X#O50==+GZzdPmM-VHOaJ)&7>lI9Y}aOQT0{U7mVpCAt9k3L_7Q#r(%(X7u$Fm;ieFqBDmRRnf;PFlxJ&w# zPLg7*iMl3y1hv!ZmXAG-bBKvv?@_+KI8?nZVaB@kYzSXvx-T?rf(M(HzrFz|cIu?C zLBA)YRu82R){Iu}3o0cu|Z=7~{2I{lTT9(WVhbMU@jXD*sLVqg_b(CBA5GAkx z=O{I?0rZdaP# zQ#Rbn?E}s<^8e+gY-|m&$E;*}Xp=V7zzbRp)u?If?955F43_e$+HXFUuT)PUYz~^m$>Vp4m7T`{fPr6Uw#T z4kxhvzix}cI}bYBdIF@^EP}(2$p(+S7MAfetSRPWZA%fwA8Uo4*h-|*Uqe_IGMITrgAY>Ki2%WGCD>0y{epkWNK}1J z)xo5`^LH<6PqfzLJLx`Dm4xUohxhO|JdumLIzA*m9%`;{fVelnrE_uYdOG5Pn@-1{ z!T`x!Q=)H9#FKMqd&;hU4X=C$MYQ({@81U)L|f{gnbT2NIz`OUDuJQP9ry5ku6*AB zw{L(I8?;BJod7q z*s@b%v3x_8-2uB4M|Q2HpsrxR-9=ZBpYK$Ty_2Oegh&*8x}v*-t7_`q$8`@}nw>uK zrOS;EUj1u*Vx2|K;L-L!Myx{T6lLYrp%1LqBP>iUt+%2wN9-?2ugOG~Ma+|arEmFJ z20*!*Mn4p&2abn!{V_SMpA;goR-|-j!Q~NNNnQn|NuA9{$`SprmP@h9ZHvwjY%}M9 zxMdaIjmm`NCEe5|&qi2e0O$Lc@3(oYqe{t|Pr>sz$qRx_7&_;OFurz<@XgFNOuyt;<&?7%-Sp)6jhKc zj9dt8gO-g0Zgpz$>eN*@ScN+4@V9yg|B`1Wj+W~k95_dBjukoz^_Xp)dgg4yZA;W<-!e+P;<92PxE zyF&L5FWn4iU8`<|hm9#$43i+lNR~}1Y^$dpE?N92Wk4=E$t>LQlLP&Vh^jnWSy^r1 ziwv?lJ{`#Vq=w~GTum6rms`0F9tTGwYW0OAfB6Btb|YHHoSbuBasQZv%SJ73iR(a- z`-AJIvR>4A2!FFHvA$J{O(7qh17gN*(qc6#QN|M(qE+f_%lMvoEhG<+f-mY7AF#}E zh?j`3@mK;$*spjkGik6Zjpbh7p%@N;>Um!dU3Fj?dd1tcO?f*ol(|Q&-O~xU)7>RX zHaUQF)C!1pHSl34?^8&$9qL*oa5O^i(pF-dLh{!=j?z}#LcLCpoERsUd(RxZ9QxZA z`t-l`FE6Is)-e=7tP)3pDeH~kI#LW;QeuLsck8IL-T;czgdc@N=KsX+2Nj81r!MSm zQYf<6if!tXPKC}JcQ&)xjL#80NO7a)@!{L9_B_>f{MZES zSsQxV6kq`Yfu`OBj>?;~JDD?hgUf#xoTnHm;0g^?RboP)@tXF{8nuhu-Ty>m5XwNH zGn!=_FE8txQw;0%ykv*iXS}pC``zLOn7@0P9Z1Vs=H)dhDo^%d6=cVqL1@AnJNTl( z5DBG>YI(O^yhwz`&beVE3~PUnP>CqxAgM27+N1V$Y;L@=7)N z_sKp5nKlCVT{t$1b*13|HYfH`%X!;od50C(aQxD#=38Y8Z~mTH)g;|)-x+Dc^cTB= z06YJiuFa67at2HA3n2$7NWJolA{on>`>hlRkopZi0Gi0A#b!w78#FU&axp08l(TNTu(5Hc6=#?=EFL9tXIgv0@{O>hJ%!#L7GkmxeWX+nOSGK>0-gW9 zsOPbYB(KsAWCc|`7n7H78Y{984AopNl&S%#WQl-5$LsN+wHha{vK`QScEo`-&O{@E zBz(?T-SXrH$2~5>&z+1EZ)!wkR{GOg=LjW^WQ==QKVDAC~F4(3e ziD^W#DB>>evn6w|H5vsZROT&lHRDr>^Ez8}-8GkuWAm53Q*&m%h-Zg<?p99nC}U0?l$Y9VW5jF!f@Fx@w-b0D$y~vxu2;1G=lt zB_5~Y+h9QV%3ivk*&Mm_s1Pu;76CU}ujC?p;jL!DRBQ zG4MNCm)x27hJ8O{lspQDAJi<4! z1X8zcyxY*?Ptm9`SIX>Pk=0JM;w`)L7}V1A{*a!Rm)L_s>B#4+)mt0B$BQy>Q~@iG zQ0yX1@vDUC*C;1%qdw3B%1f0TT4?xa$3;dkhTm)SdI)NwX$7jz(5_eZx600q>mxyu z;T=L`vIcqnZcL4PWY3a~BuzPUl8cB$d#tW|M-^cxLhUwJc=CvAegjf0+YNf3;+LPD zEniP{?dnYZR?Q!}2ui)+&Z~S?Cl{(Eo8qtm$d0L+{?5 zdA`q6VMr{g{op0wSv2~oZu~7t=x#LcCMbTJ=(8C8SQW!mZom2w7S`}fEqObJ$&2%6 zf)^=FU_PR`?<+%buk0wnNc@Tb!sp3*`DYtq?`6o9+XwG0#}%#?rrBm6$ILd=CEb4y zd=kP>bBrGp9&;gyOm{XjbDq2;cGLCc4&{6F2dx)>E2+^ z*@Tb*^7i;&aoZRd!h4YW&KjpN-nl)Xt(6RQEm;*G(Tc39A)a_#jZ1n*dgFSwWR8<7 zw)XIz>SaX&hkAU^0TQ1@XBk%%*ut70JZsIVrN6vz;xRSGrltL%Gc;f@Vizm;+H^~| zz<*Y4Fq7!AX$)3INY8|al18{Y&98pC0=guhl^(&Pj7x*52bDIKKTys5VkuwWNy4Ku zF1y4vzo8neOPb!MLuMXbR(j26l#3t2J9}ky#O8P!I-k1W8}yjg?G3>-)z@ZvQFR@r z0q{{j!*urjHbEnl)tVbCP}P{p6byd~Vcyjgq&V&HF6bLjiSoImY2q%r`eQI(UmMe= zf#7xA{$kOx)XKM8g(ZD!cilC3LdnYqIuN6FqFIEWG8Q^~zwKd~G&W#0Z2veCP@{Ov z-MC7+!DW&gk965pSpVr{V>QOb25}nk9EzV~LZ1H5w2#8&xoCutslihj^HbEBRt`I~ zWhG>nMf3n7=3+eQ<;ck^rRiBfn$IVPEQgi#qAn@^MICD#?UXxmmEV@u5CeTkjoq0z@P^<6cA$!rGMn{DeVo5E}u3ULcbrrs&(riBxsPcZ{Uu613Z*(ggUHS-^# zIA-yHql$8UhJduJPf9kS)V+(w0Lj>d-f%>sj&*+@XT{t|9=#ICe4Z24)?Deq`Edg> zynL7b757zbCUZhpG1<@TZvUcS(??atOa-o$(r^~PzlB?+AI8a)qQ^a8c;A(hy@cDl{j}s&ly_g5Cn2dFV6MM#eCM zX&SSCvw=wov8=j5K3zxF2GrdQ#bMZLowVQ4xh9ivcy9Cfpiq!_`Kg=HV>%Lu>NqZD zYglSW3N5F?l+f_+GSDFgEb~0i)9{nz{V?jh`59}-i<9^}H^xuPo?P#P@^D0JcCIbz zX5MQd_YHv)5hh{u6lr=N?=~LR5g{#}cP^^U2$Q#!9<3>Ws!g1mzbITqjWOcuC33+|f$8 zF`bc)UX?e{9X&QTXJPa>+cwemZRLSih{#yxcvCbz6>Y z{8Zd#-0h2yKkPc@^?#G|yCq8IT!nhbmqw&M{MQ5j&rN@lSvfan8~$j0?W^!ldrwei zA86D()n*DE5sRAq-AR2cExk8Xb2gweLO?hM92sDuD%PCuP`xq=u+k*l>^u&U;0RjQ z>|B4i9_k-mn_{)qD2jhjaeoI~QDhHlzLq(jNC&5_FjFM-PO~y6F&c9tWVe~S@9c1F zu0VDKPEqL&iFLF!Vg$5zb!>;;Z*#r!dB`Tmm@}#=4q|5~&RCP*_AP6FUJK*_KQ}BwmRmUWwEb!(9F}xxXSG!0%0Hpjdxbd77S{2Ss9i2yJIT-Ua!?Xdgj)JRpBGAb%_%e>@=X4#=Mf z$e#?zdjfJSAn%2|4{bl%69M@^KyD4l2Lp0jKt2?Z4+rEU0l7UO6MJHk(`GbFiRT>{C_r?3of@yhgJo30VE!;&m<~Wx0)8~+5(%Ov9Wjr5=;pA+gFqX4)y+~#v zWD2u+J!3cp8Tq0%r*XI3O%b!X|B`0G76jqCqfK!khcjqT1aXng0w0z zbkrE_A?Sj3!EmPgO$(=JdmWPBO)IZkvK{~R0^KEAIhio3<&9ZeKrZNWa+Y*kFY+Yw z)T@j|eM!sbjpEc&8<50Vm0Mlw1*2peSL86#Bk3d&bMq{HLtb|h^SX`OgmCkfgLx*? zi2?}9TZZ7Ll7ks80Q%`TlEP5VEZQ7q!>xjzLY61iwsW~4=bauI9ZsZ#&$yMy=d|22 zF z%*T ze4hyF&bWK6@@3Mra{2%+RH89$6dfx0TXxPDqga}CyokvpFJ=fwNwe*FFo~4UjGX1< zc~l$RqJIZ=a(bqGLC4wW-#^EBz=8XlxTeny_a#TiIPe6Md#z}23zh03=1`6C9_`~} zC}8x0VLQ}-!n`f~6eGQ0P^_y6Y2hBDlsbkoxCJ#VXcZKvazb1I#^?theN#2aAvfU_sSdG$2;6d z>P#ALruA<>?qSN(SkiLGZlxyP9_McSN>6k?<+@48p>$Hzehqe#xovPHGZIUVWfGZl zW729Z2RG|`FR_WzYmFrQ83g?gV1%ItQ6N-r20FGd1~%xFWP2qXCIna za`(8nxVYcb;CH0?2|PFqc?K;|A5eeCesBx8uY;ecIg@?kj zo0=1NoJ5n86?D^h>tRprSOAZcWslbz+@}ag90A>jy5}_~=xp4u8@uVz4E(7yf zNG>oNPQ)j%R3#CA;S%u-y43O2O+*?DgBKuT0-Xv=Az~jiC($+|pDYTxYb7Eri2=GQ zc+(Z}TM>~lT?6las8>tG#fjE^nASv-5248hgoq4t{?yEf1Lz2YO4fuk;``7D5ji-F zr25S|jLX+h638r=wBYs26BjeYL@?d$WxY5w>V%a&D9gd^OJ^avv}=PT=x)?~^Bfka zJf?>38yfUaVa5Aq6vJKoAqa3pJBKbT6p}mQ47$S6!k8C^5GlC`7C`3kML>f-Lzsdl&{ntz zGz@VQkymg01%}s>h<*-BlF9xExFiw10*%Bv5moz9DGkc<6_ADGV!YvrKZm6%QEw>m z(_k2NQfJ8z8azlBZwLZc!-@Yf9N6j-zmBzCyjclKOzeT+M_|lT`=PSN`fd`I)X}e$ z_&GR?WkZR-+XH4D6aN%ktmMzy6MsGR9ar>0AwH{=?|T&H29~NkriQ|t z2K`fL#oMxB{vrmfbC}O~Y_7Y$dkIe5qcAUEsk+0QgTq)h6z2T;QS#q9hWQL!tmMze zhB;UCK_NuLXb)nT7vZ-{yNi(IcKLs-?@VmInnDfKcQoiTgehnOZ3TvuFvLwnjn;Sk z1S$o~>g&5NVyeps3z9H`UoQIfhU2McALl>rJq2jVp2EfeHD+BX#O7&{)wxphh4pRoT6|V55}`a{Wej9E*3JdAmAUjIUXNj9#h_QRw|^P70wqxkp^ zmZ}84p${Q67zTb>yuXX#;rK{H(-7V_J-qAw5W*vN@vi^7229z9hP5jHmP8GIYW^+h zd*}$W`6e{m(4zc$L)iRx2vQbsa2QKPR$BBC5Zx z7ty7>QIbP07{MayOY^j82=^?jpcfFl?f$N=BR>$(z=27T}d<+4P)fdT7G zM4qbPT{jW=XSUT6ap{apboo=0h(ADwI(kW~)kJ(BV}ytt9L6$C#P`sz=(7_q<@z*C zM3oVl((BHMyD>QM|1U|r3K0h(1o-nqyjJpOV?PaZMIRJGG>o>wXPxT%c_+=$<`3HT#)tVBSS2|3uux)pC>04q}htOt=vAMo}5c zd!Gs4#-f!>ZssWC_ul)w@AJNQuIw4i<#Ky2&*iSd?`a%Y;wY6vd(95dz5?<{ zd~uI&R;!jzy~UGd(=A($>3=UZ4%NcYbL;nEDi<|eEt*TVYdZEh(;viTdGTa5|0+H+ zSqnmM^@MGm*6b#Yv?9u*O3Ev#prkP+6_qruq`gX-P|`jn?T-gkh=s9OD8|BgEbNVi ziCEYd3;Su&3Qq>Ls^B$UvBL%HOjw^6@r;|OIb$wbPW~E5BO=z-XicuKh=u%UBIXmZ zkceZ6SWLw6MBJN*6N$Jl5oPSsZDO{N^jk>!Eocf!zlEgVLeg(RfETmkAd$pDB8h`U zO7z4*(k2cPNd`ANcl6Nw^bkO)o?Nzq(Dq!x?wILXj)t9Fb7CUoC2T~LU=c~iB9e?n zBpHiHG8U004!{h52BKfN@4@fOaBRatKgBZL$u8+)jxd%6`mO@6&5-=fJoHTeyiyi1dB)#TeWdABAHYx3=yJfg{aGmRy${;{za3Xgr}TTfi~@FUxAn;G67K2$oldd-(}H+}A*TM~+&d8P^UnCxl+Bg2Ko)U3=9ex2I~p{N~^*zIobQbS#ET zqw%Twy^%@J@%;FT!95Z`mcAv~nz|&awPv~Dths8jn|O?5?NZHgj+cGQa>-TOEjzV} zwP1&iXx?wGnVcnZ9kh;V4Zx z)>6on5_(lWeA=#rD>S`g*~=>-A6!ATUGaRe5s6eh@GiR&3_utqc^eTT{F2U^(j`N` zQ9DL30_`3Pisj36lFNHIT%uK$2j36$w9oX!in_7%=F;}c7SNK;34No*>eM`1sJ7c&DgF*=!5XABkrG_n?G8b zk?=;z=eSSM$+lxx%!*O5497H%Ip$f*H#y7@N`fC_fP`2w%NB8%nm$~5+sp!cT2ljJ zEts61U6`Ifd188g;mBlZhVUd6t-#Bq#O@`P>JQvKH-F^5x!HwiaEIn*rr7^6-wG_Z zY@2*AsmKLZ6yP74j^`R?#VXg#if2$MDb{0Dnlznryk*ux&&R5+;!$ZYD??*QF#wYV z9UpF9^f4clWhHpb_prDOZ7X0VZ*OaNWOm97%{TdWg`h=7NKWQ}#iBW4oiSIdjy1Aa zJX7{o7rjOA3=s&xqmX(Gi$leGCwcFXcZOa)zEGN9pum;qI47npOK5k&!_*zj-eq)n zzTw!bRa+oX%fURKOV*ZLJLE@WqhoR@D_IH7aT4cvXu6fUDY>r}qA*VyDi^0S8Y(m3>e!BzPV`L?}@G~*5qNCqqd05kFxI0`S!Bq4jZ+=8#c_UW0%dc zec?&hIBR%|_gi@1@L`tyz#y2pFiDvzhea0K?vm%P)(364R@n-e z!+E!CR!pPndqLI0$VUtrK=MK&U~0?be6fZBA@FJ(y>EC`gk+5c1!0AG0V+c58zy2c zNDK!?;4S(X3>p_L*IKgSemcT2%KnAN@!H`TwGgT29OB6{jFP`xqfOB zJZ1#7vQ;q=conZKXmDO@c14~EM%epU@{TF7JC={>T9n(8Z)I>r1L{pl05C0L3T67?Oj8zllP?j1e4xzpjeM35;+=2@&=XP$6Ph-8c2w4Mcg))xGfr%=C=JD7qqb! z!OYie)>>g`Jt&1~GL8iJak)-_FO2e)0Y-wFv0!0M;<=u2)I-jY85I+dBr6rQSHnE> z3!Vh5CSnxj#i8+H@}4dkshDuGP~iIn9*GuTsFfJ+QVms7+*n&SeX)>`NK#ZWd0ms? z7n2v7J=cnYXgt5(8aRIWm$h$vQD3@nl@e_o(BDWfWors1xt>_D-H?s^ElUPo z*lx8Z)r%Sn)AufL9Z@xd;53$IY&(rj8qRyXz?ZmIWi;BG;Uv=gHn+CWj~9O|3S)s1LiB6Vg zC#Pph^D@CPS%RKa+e?J!@R8Zl%#r)*8VTp34T)Kldf$?VC61!41(xev?)+T`A-ot} z~dje&@Em9w$DKy9LMKfXsa- zL^Tu{+%sqq1lXm_N{Fa%U^{Lqzk zV1{F09>y&-8f6KM67RWfw?c{{<~B$YF}opbGGf4rbi@q9#t@hITEvXtau3_dhfy2| zsq>{gTM9U-Q3_@RMuLf>kzo3F2;8=j#|1nZOoLZM%V2JtTHL)+SWd8IA5QymNXQFZ zv$#6ITX*2Z?V2I(*C>>Ly_03pp#2~#+i)P#U>ZCv5GQd{VJU$)g_bA~kx()P;z3vv1Ejg&&7sJ+RUnenE%2U3 z^CiOjFuH2QI}`C~a9zBciT@_3M|eZXgtsF8c0}>!h<`WwzC?H*L04VHn+7+5_nV>K zWxU_9X}sT}@ScGrh3zN=ru@hab8$1v(J>rDZ^dbz!f~AVvrRR(t%ny+?Ys%v1MCC^ z7zHL?C@|^qXPeZ+1xQ*wd>bws-E?ZbddLDK^^lX0diX4abUmcOw42myw0zXe4+0SR z3w2!h@hDm{6~~j3MuTZLZ5cnVL8xzTeP%0v^_(B~w*Wp9KWH!wd|Q6J3+i3w#~n?0 zcjAYm@a|WBthR7dCVtRh+D%)=kCRRQ>Qp~mW9K(z5)g>;Du>$}laHgch3VcL{}RQL@KATRN%dwK>TRT&8Uyjz zdRw2&EJEHke+s0*Gv~;*R)IXv8)pLIQWDDRko;e$ZgrOeH*JgofHbACM10{Be)pusfoZTayb zsCStk{LsPX`0-(dcfaz3|Lmu$>nj>eyJ^e#@kEoqI`QKpeebWI?Y6&YuuuH;!ayUx zI{E7{<*%OSv!81L{P`^VS2UOgzHL7HDAc>0&pzLTx7trZXRY?HK8EJ#eUX~nZSC2P z{>Nc_!yBnoPGhMyqvX|^C$%qp9WL7M=>J=sI5xbI`U%*Kfa!T4eiB_ZX6#HGdo-8^ zPYc9J+*DXj;9}_Kaf$*l>&D(eSQ7XAXN-3VEjw^@+}QgCC|x4Fe-T|Z;+={3G`KF_ z%^TOh1oa4S2m)8;jiT3F-k4}R5&u)@JHoqP7c!s52pip$X`xSpX*X@zLgvmUe|0L1 zzpVV#^L+G~7QkoX2Mwly*YZ&_KRyffF7v}_!n+ecensKkul)Gc7H-PK4;oCnY0LQW z;U<4|;>WKkfAyRnzup4)O#Gn1H1KWt@f%R@GC!Vf!n+ecepBJyul#ttg_|<*g9g)X z+A@B;)a0*D{P>*mSI_zJTP=Xk#19%w1K*Y(Pe8rP{J8dt&91M0TjAZW{P>*~Zpy?D z8ce%s%lN_1m!voLI`QN4%3nR_$M3cPJ`+D^Fb#ZLe*7NPyUY)>3GYtz58+bgxET6FoT9|hwT+^$#dvRcqv*>RM1OBw zd<7$HbW^6pL4#>GZCT>D;mXYx)~_mm^}Mh?)dKiTg_Q==z-#Rm3Z{}b~= z{fpF2h4qgV-aSv$e~hj+oT#as#!@90=I8;QHj${0#eultMExh|;1VV3KSfuK86Z=l zrol9LS|Bzj>OX^emlO4UG2R4^9jJk*_t_#7;~%!v3l9*rWR=L@dypsPmIGcCAiFpaua=bAI~ zccC8P4ME__{Fl_%!cuzYsMCV$U-86d@!sgyrf!FAtzf>0%SOD{eY4mFWyyQHAxPf) z5`=U;d=V|g`)X7o`MDP7p`AFj#l5*AT6pB;WIk03xvWUz&hfX)e7Ie&ifJjA`#-H3 BTk`+_ literal 0 HcmV?d00001 diff --git a/B4A/Files/gestiones.bal b/B4A/Files/gestiones.bal new file mode 100644 index 0000000000000000000000000000000000000000..4822e373125430cf004a99eb5ccbf1b9a1383c8d GIT binary patch literal 3901 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/kmt.db b/B4A/Files/kmt.db new file mode 100644 index 0000000000000000000000000000000000000000..2cbbb8e77a5f7e88713753e6fd61b3379163d4ff GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/mainpage.bal b/B4A/Files/mainpage.bal new file mode 100644 index 0000000000000000000000000000000000000000..1e6fab1f56096523d14cdcf04f8099f312e7323a GIT binary patch literal 2605 zcmbtVT}&KR6rPn`>>}b%QL0s-R%t1+-G$mV#wZGDN?YrSAlQ(=-JQ$q)!CVKcG#7d z#wTN9V{E~OMhqtQCowef$-XKz5wW$^#GeP7_~6f*nivzG9M5-lXBN^0W4g(`^WF1z z&-w1TcO#mneH+rWI{IR4pz&ndRR!fv-A*{>FNPhF%Sq>ElBw+2gkxv#fVw{`4Eem0 z#j-w1!a!CwHf_U3+~iow6js{46^=<^Nwe$}ff8#tB*!diI5uSXQEvRZiRKy_VH(i+ zxRx;7umLvrG3>BLrd_d|Wz^Hc5GiFzS7MDU{B;5XL>RD@3w)7q%Nvkj$9FED{%v;p z{p87!nNzdF0}IKy(U}*Li$9MXIngpVH#=Q7^HbgH&n)*}I{4*xe=hA@URb`;(SPaX z!JF8~*y;Q=8|f z=ieN<(7u1qq2}HTiNWHLXOG4nzcxNqf9;ojAH036zV+((@0$LYmg@W~zJG6fW7Fw2 zLf5k-+QWm}ctePvy&*EVg(Up0|s z%y(O@!oj9ti<6TDX}O0*R$?1JNA&2#q-j2vcBHg$rpij2le!#KuE~}!ih@A3sKz31 z)SnX$#Uj9M;|c>Cx$rcOT3;V5CbafCAEgo~bY?HrtoN_R5|osr7O zxNyu+Z)a@2A%zlz;iE4pJ&z`i-$PS1`nmJ3yAz2j);@zJ(uS3r>9rj?#k{Y$g`85h zqf3X&sVs+)F4#)5!+_A$WS&VjWr5EU6-WywsRNd8Az)7Ey0Q$^kN_+GHHM(;ewwNk z6}$meUx{s1y!;wsPboJma{h7?nO3@GwGQVpp-g$*RYux|Bk+g;(u0LJ2nlzudK1b@ zyb(}p+N)3W5csjQ(4zR_;feaMP3SEW;aDNiqG$ltBM`W$_2>ZTtA(*o6y1eGh-lzG z5<;RJs{sJo+W>Ikz!QTz0ifDQqt^T5Z?BO+By<;o*qxcxOau2SmFggEsU0+otdeK9K9LIV|P576L{r5e5Qwylt~awv-ZAg$n_JwziC z;@a^b1gUUxOC(_iuq9V=oB&e+<83tRnGaMS@WGWHB}q_Di4QIuAuGfrJyI@mAhS#Ar&<+hk6 zz-0=u`ameGB@>YdUyw~KbCZWO;!m394Pv5ocUCd=Pa=3S2h&kE*o zTlrtyWKmwCs+V4{?nP9{zQfbsI$f^)yx;c8J3!aoZPYKplY%^v+Cmy>$dkh`mIclsW*Qsm%IPv`K2>HA1ywWYajo= z{#;A9zw4$kz{s%oqs!52kz)ISQNZBo>gTe~DWM4fe4-A- literal 0 HcmV?d00001 diff --git a/B4A/Files/menos.png b/B4A/Files/menos.png new file mode 100644 index 0000000000000000000000000000000000000000..e18eb42cf5b3468ae72b7126751c584718ecc49c GIT binary patch literal 468 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw3=&b&bO2J4C9V-A!TD(=<%vb942~)JNvR5+ zxryniL8*x;m4zo$K{|{Bd_r9BbBX-_|No(+^6v+aUZ>?ewQ%@(@$%mfAHE+t@_F&{ z_br_-!{feg+WNMv`nkLR$H_B*ie;;-gMr!wOM?7@fm{^8pt^Qu5(5LHl&6bhNX4x+ z({J*%Clb?gbGMsHw?rOYl*XiAK z=c(Y@o`~gXm4~usr8bMQ^i8ZaY1!xf_;IJ?w{>reB2J#%clvShCfyTeQ7OB3uRGEj zzwg6*?!~g#wX^1}6m?shn-?DVd*&*Y5Z=eD)I+zg6mGU&y&`y$_57772U3Ofcmpka zyc=S^JqgmEzJ2GC|8H_`Rr9Rdt@wM@tiE?@2N(|AHt^-hPy~h`1B0ilpUXO@geCyo CH{B-y literal 0 HcmV?d00001 diff --git a/B4A/Files/principal.bal b/B4A/Files/principal.bal new file mode 100644 index 0000000000000000000000000000000000000000..d17ac73c1ce88799c4686de48234b468e6a1ec00 GIT binary patch literal 17261 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 F`(I;6sSyAG literal 0 HcmV?d00001 diff --git a/B4A/Files/qr.png b/B4A/Files/qr.png new file mode 100644 index 0000000000000000000000000000000000000000..d75e42d09a3aeebc1b3c2852dd678818464ca399 GIT binary patch literal 1151 zcmV-_1c3XAP)W2oP?%XU6>5>DJn>mXJW(X?o&`C-z`pq!8wCDb|pw2MYfg&WH2>?1wWN zKx{WTc*vcA_jVcX1nkiRAlMqBJAkEzDMyDEe3DOa@ZXK8F~D{Q8xPn|%IEEUS1usD z5`}>CEyx4ljTc{|2f#mEaT`kta6BXhU}5MiAd%bLi~+srGy#B&Xx;HYZ6>J zJ`R9P?B;ny@L+QX7$%%I17ew&00eim0k|7W0$|>o&VcZUC?K3Fh62JtcrhSMLzpEW zh52(8z`4Ubb2~uT_`U}aq#p)w%5h%+sD=rEE1dNDm|g%d71IIy9R4E!CbpN!q^YXf z9`IUky)FUR!|cDY3E=++fNGcp%m_dP>x1?*i~^?g99#}i0*3Mc%T^qfsh5jWIsefB zA`ImKI9l!r!D)bOSBwE(43EnIv2f0y1Xczw1mN8$1iVEeeh$EL45}X*K+v;*zB&d8 zSOwr_iPi(4cp?gC!YV*E`^Ev3w-zM>uw>Aj6smPME;kliV)pZ<3;?DtVQ$F@o!!K7 z!F1+QmjS>X%-j+aIu2N5-bw&wTTyNTocYopz~Y@x6oAgiw*$a(lG#DHANNKEAqGg) z90~v}ieIr!iD3XQy#QbV(~$-MjZTNv0PH-%ZD;mp&b1E}0JH}n0Hi%wf_%>bkeM=9 zfMNg!v%@}74v?86+W}s~(F35JM9cxOI;GkG&aQMRfY6jq#2&!35?&gbXUM$`p>8ijO=9RRQx$xq*v0|;zwUJc0gvws`_t{yoH zB-+7M0&3Ebp&eWr0Ql>ReaFvG27vR?zQH17xbJ`!o?ZZSe`CAa@Po@+05%Od-hlQ3 zoTK+r0NRp~0n+)rm7WFYGOz|fcu9r*z&Eno%>Zlza!e`Gc}ax;?7a(WL1g=u!4DJC zW8eYA2O$X%sRac9N~4G`;SfN45QZ~(dmwiDJ|U?e;IxzV0wg|} z7zs#0E(Y*m9ajx_rFLn(jwlOAo~-$sR0IGkD~b=G0T4N~8bJK$mIM&7ll21llc4$X zz(|0t1t`EEM*`f5=mFdbKr>E#_LN2f{MGRZSk5iIOVTg^aBo|8G{B_eeSqU*@CSg^ zo%;Y6)B<-Y=L0U7h|;D10o)F_G7H85a!slGYmPKvNLTCv7Ua7emjVW~<#z%Ii&Gz< zz2EyxO^Z{~H>qalo0joGIB0)>o`w&g5FiC9W*?xiA95<%$)+cs_#5#nzyNE1GbjBI Rv_k*@002ovPDHLkV1lM>>XrZi literal 0 HcmV?d00001 diff --git a/B4A/Files/roit.png b/B4A/Files/roit.png new file mode 100644 index 0000000000000000000000000000000000000000..e1396aad13a6a97a366fda9fca4b49083b659571 GIT binary patch literal 23498 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�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 WN9+v@xFLUgkLmdfhA;J9V*dj}B66bu literal 0 HcmV?d00001 diff --git a/B4A/Files/supervisor.bal b/B4A/Files/supervisor.bal new file mode 100644 index 0000000000000000000000000000000000000000..81618fde29a749063e00c43498e61d9a7c9cc6f8 GIT binary patch literal 12610 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 Subscrito Then +'' fm.SubscribeToTopic(Starter.usuario) 'Propio (you can subscribe to more topics) +'' fm.UnsubscribeFromTopic(Subscrito) 'Unsubscribe from topic +'' End If +'' If Starter.logger Then Log("Subscrito a "&Starter.usuario) +'' Subscrito = Starter.usuario +'End Sub + +Sub Service_Start (StartingIntent As Intent) + If StartingIntent.IsInitialized Then fm.HandleIntent(StartingIntent) + Sleep(0) + Service.StopAutomaticForeground 'remove if not using B4A v8+. + StartServiceAt(Me, DateTime.Now + 10 * DateTime.TicksPerMinute, True) 'Iniciamos servicio cada XX minutos +End Sub + +'Sub fm_MessageArrived (Message As RemoteMessage) +' If Starter.logger Then Log("Message arrived") +' If Starter.logger Then Log($"Message data: ${Message.GetData}"$) +'' getPhnId +' If Message.GetData.ContainsKey("t") Then +' Dim tipos As List = Regex.Split(",",Message.GetData.Get("t")) +' If tipos.IndexOf("pu") <> -1 Or tipos.IndexOf("au") <> -1 Then 'Si es una peticion de ubicacion +' If Starter.logger Then Log("Es una peticion de ubicacion") +' locRequest="Activa" +' If Starter.logger Then Log("Llamamos StartFLP2Reqs") +' CallSubDelayed(Tracker, "StartFLP2Reqs") +' CallSubDelayed(Tracker, "StartFLP") +' End If +' If tipos.IndexOf("au") <> -1 Then 'Si es una actualizacion de ubicacion +' au = 1 +' End If +' If tipos.IndexOf("ping") <> -1 Then 'Si es un ping +' If Starter.logger Then Log("Es un ping") +' If Starter.logger Then Log("Mandamos pong") +'' Dim params As Map = CreateMap("topic":"Sprv-Durakelo","title":"pong", "body":Starter.usuario&" - Recibi mensaje "&Message.GetData.Get("title"), "t":"pong") +'' SendMessage(params) +' End If +' If tipos.IndexOf("bgps") <> -1 Then 'Si es una instruccion de borrar archivo gps +' If Starter.logger Then Log("Es una instruccion de borrar archivo gps") +' If Starter.logger Then Log("Borramos archivo gps") +' borramosArchivoGPS +' End If +' If tipos.IndexOf("dr") <> -1 Then 'Si es una peticion de ruta gps +' If Starter.logger Then Log("Es una peticion de Ruta GPS") +'' Dim rutaGpsCmp As String = dameRuta +'' Dim params As Map = CreateMap("topic":"Sprv-Durakelo","title":"ruta", "body":Starter.usuario&" - Recibi mensaje "&Message.GetData.Get("title"), "t":"ruta", "r":rutaGpsCmp) +'' SendMessage(params) +' End If +' If tipos.IndexOf("bgps2") <> -1 Then 'Si es una instruccion de borrar DB gps +' If Starter.logger Then Log("Es una instruccion de borrar BD gps") +' If Starter.logger Then Log("Borramos BD gps") +' borraGPSHist +' End If +' If tipos.IndexOf("pu") = -1 And tipos.IndexOf("au") = -1 And tipos.IndexOf("ping") = -1 And tipos.IndexOf("dr") = -1 Then +' If Starter.logger Then Log("No es ping ni solicitud de ubicacion o ruta, entonces no hacemos nada") +' End If +' End If +'End Sub + +Sub Service_Destroy + +End Sub + +'Sub SendMessage(params As Map) +'' Dim topic As String= params.Get("topic") +'' Dim title As String= params.Get("title") +'' Dim body As String= params.Get("body") +'' Dim tipo As String= params.Get("t") +'' If params.ContainsKey("r") Then +'' If Starter.logger Then Log("Con ruta") +'' Dim rutaGpsCmp As String= params.Get("r") +'' Else +'' If Starter.logger Then Log("Sin ruta") +'' Dim rutaGpsCmp As String = "" +'' End If +'' Dim Job As HttpJob +'' Job.Initialize("fcm", Me) +'' Dim m As Map = CreateMap("to": $"/topics/${topic}"$) +'' Dim data As Map = CreateMap("title":title, "body":body, "d":Starter.usuario, "t":tipo, "b":Main.batt, "mt":Main.montoActual, "r":rutaGpsCmp, "v":Main.v) +'' m.Put("data", data) +'' Dim jg As JSONGenerator +'' jg.Initialize(m) +'' Job.PostString("https://fcm.googleapis.com/fcm/send", jg.ToString) +'' Job.GetRequest.SetContentType("application/json;charset=UTF-8") +'' Job.GetRequest.SetHeader("Authorization", "key=" & API_KEY) +'' If Starter.logger Then Log(m) +'End Sub + +Sub mandamosLoc(coords As String) +' If Starter.logger Then Log("Iniciamos mandamosLoc "&coords) +' If Starter.logger Then Log("locRequest="&locRequest) +' Dim t As String +' guardaInfoEnArchivo(coords)'Escribimos coordenadas y fecha a un archivo de texto +' If locRequest="Activa" Then 'Si hay solicitud de ubicacion, entonces la mandamos ... +' If au = 1 Then +' t = "au" ' es una actualizacion +' Else +' t = "u" ' es una peticion +' End If +' Dim params As Map = CreateMap("topic":"Sprv-Durakelo","title":"ubicacionRecibida", "body":coords, "t":t) +' SendMessage(params) +' locRequest="Enviada" +' CallSubDelayed(Tracker,"CreateLocationRequest") +' End If +End Sub + +Sub guardaInfoEnArchivo(coords As String) 'Escribimos coordenadas y fecha a un archivo de texto +'' Cambiamos el formato de la hora +'' Dim OrigFormat As String=DateTime.DateFormat 'save orig date format +'' DateTime.DateFormat="MMM-dd HH:mm:ss" +'' Dim lastUpdate As String=DateTime.Date(DateTime.Now) +'' DateTime.DateFormat=OrigFormat 'return to orig date format +' +' If Starter.logger Then Log("Guardamos ubicacion en db") +' Dim latlon() As String = Regex.Split(",", coords) +' Try +' Main.skmt.ExecNonQuery2("INSERT INTO RUTA_GPS(fecha, lat, lon) VALUES (?,?,?)", Array As Object (latlon(2),latlon(0),latlon(1))) +' Catch +' If Starter.logger Then Log("Error guardando ubicacion") 'Si la horaMinSeg es el mismo no lo guarda +' Log(LastException) +' End Try +End Sub + +Sub borramosArchivoGPS + Dim out As OutputStream = File.OpenOutput(File.DirRootExternal, "gps.txt", False) + Dim s As String = "" + Dim t() As Byte = s.GetBytes("UTF-8") + out.WriteBytes(t, 0, t.Length) + out.Close +End Sub + +Sub pe_BatteryChanged (Level As Int, Scale As Int, Plugged As Boolean, Intent As Intent) +' Main.batt=Level +End Sub + +Sub compress(str As String) As String + ' Compression + Private su As StringUtils + Dim compressed() As Byte = GZip.compress(str) + If Starter.logger Then Log($"CompressedBytesLength: ${compressed.Length}"$) + Dim base64 As String = su.EncodeBase64(compressed) + If Starter.logger Then Log($"CompressedBytes converted to base64 Length: ${base64.Length}"$) + If Starter.logger Then Log($"CompressedBytes converted to base64: ${base64}"$) + Return base64 +End Sub + +Sub decompress(base64 As String) As String + ' Decompression + Private su As StringUtils + Dim decompressedbytes() As Byte = su.DecodeBase64(base64) + If Starter.logger Then Log($"decompressedbytesLength: ${decompressedbytes.Length}"$) + Dim bc As ByteConverter + Dim uncompressed As String = bc.StringFromBytes(decompressedbytes,"UTF8") + If Starter.logger Then Log($"uncompressedLength: ${uncompressed.Length}"$) ' 6163 Bytes + If Starter.logger Then Log($"Decompressed String = ${uncompressed}"$) + Return uncompressed +End Sub + +Sub dameRuta As String +' If Starter.logger Then Log("dameRuta") +' Dim OrigFormat As String = DateTime.DateFormat 'save orig date format +' DateTime.DateFormat="yyMMdd" +'' Dim lastUpdate As String=DateTime.Date(fecha) +' Dim hoy As String = DateTime.Date(DateTime.Now)&"000000" +' DateTime.DateFormat=OrigFormat 'return to orig date format +' If Starter.logger Then Log(hoy) +' Dim c As Cursor +' c = Main.skmt.ExecQuery("select LAT, LON from RUTA_GPS where fecha > "& hoy &" order by fecha desc limit "&puntosRuta) +' c.Position = 0 +' Dim ruta2 As String = "" +' If c.RowCount>0 Then +' For i=0 To c.RowCount -1 +' c.Position=i +' ruta2=ruta2&CRLF&c.GetString("LAT")&","&c.GetString("LON") +' Next +' End If +' c.Close +' Return compress(ruta2) +End Sub + +Sub borraGPSHist +' c=Main.skmt.ExecQuery("select count(*) as cuantos FROM RUTA_GPS") +' c.Position=0 +' If Starter.logger Then Log(c.GetInt("cuantos")) +' Main.skmt.ExecNonQuery("delete from RUTA_GPS") +' c=Main.skmt.ExecQuery("select count(*) as cuantos FROM RUTA_GPS") +' c.Position=0 +' Log(c.GetInt("cuantos")) +' Log("Borramos RUTA_GPS") +' c.Close +End Sub \ No newline at end of file diff --git a/B4A/Gabinete roit.b4a b/B4A/Gabinete roit.b4a new file mode 100644 index 0000000..f249767 --- /dev/null +++ b/B4A/Gabinete roit.b4a @@ -0,0 +1,166 @@ +Build1=Default,gabinete.keymon.lat +File1=alert2.png +File10=gestion.bal +File11=gestion_sup.bal +File12=gestiones.bal +File13=izquierda.png +File14=kmt.db +File15=login.bal +File16=MainPage.bal +File17=mas.png +File18=menos.png +File19=principal.bal +File2=atras.png +File20=qr.png +File21=Roit.png +File22=supervisor.bal +File3=camara.png +File4=derecha.png +File5=engranes.png +File6=frintal.png +File7=from2.png +File8=gabinete.png +File9=gabinete1.png +FileGroup1=Default Group +FileGroup10=Default Group +FileGroup11=Default Group +FileGroup12=Default Group +FileGroup13=Default Group +FileGroup14=Default Group +FileGroup15=Default Group +FileGroup16=Default Group +FileGroup17=Default Group +FileGroup18=Default Group +FileGroup19=Default Group +FileGroup2=Default Group +FileGroup20=Default Group +FileGroup21=Default Group +FileGroup22=Default Group +FileGroup3=Default Group +FileGroup4=Default Group +FileGroup5=Default Group +FileGroup6=Default Group +FileGroup7=Default Group +FileGroup8=Default Group +FileGroup9=Default Group +Group=Default Group +Library1=accessibility +Library10=core +Library11=fileprovider +Library12=firebaseanalytics +Library13=firebasenotifications +Library14=fusedlocationprovider +Library15=gps +Library16=ime +Library17=javaobject +Library18=nb6 +Library19=okhttputils2 +Library2=appupdating +Library20=phone +Library21=randomaccessfile +Library22=reflection +Library23=runtimepermissions +Library24=sql +Library25=stringutils +Library26=xcustomlistview +Library27=xui +Library28=xui views +Library3=b4xpages +Library4=batteryprogressview +Library5=bctoast +Library6=bitmapcreator +Library7=byteconverter +Library8=camera +Library9=compressstrings +ManifestCode='This code will be applied to the manifest file during compilation.~\n~'You do not need to modify it in most cases.~\n~'See this link for for more information: https://www.b4x.com/forum/showthread.php?p=78136~\n~AddManifestText(~\n~~\n~)~\n~SetApplicationAttribute(android:icon, "@drawable/icon")~\n~SetApplicationAttribute(android:label, "$LABEL$")~\n~CreateResourceFromFile(Macro, Themes.LightTheme)~\n~SetApplicationAttribute(android:usesCleartextTraffic, "true")~\n~SetServiceAttribute(Tracker, android:foregroundServiceType, "location")~\n~'SetServiceAttribute(android:requestLegacyExternalStorage, True)~\n~~\n~AddApplicationText(~\n~~\n~ ~\n~)~\n~~\n~AddManifestText(~\n~~\n~)~\n~~\n~AddManifestText(~\n~~\n~ )~\n~~\n~AddPermission(android.permission.ACCESS_BACKGROUND_LOCATION)~\n~~\n~AddPermission("android.permission.MANAGE_EXTERNAL_STORAGE")~\n~~\n~~\n~AddManifestText(~\n~)~\n~~\n~~\n~'End of default text.~\n~~\n~'/////////////////////// App Updating ////////////////~\n~ AddManifestText(~\n~ )~\n~ AddApplicationText(~\n~ ~\n~ ~\n~ ~\n~ )~\n~ CreateResource(xml, provider_paths,~\n~ ~\n~ ~\n~ ~\n~ ~\n~ ~\n~ )~\n~AddManifestText()~\n~AddManifestText()~\n~AddManifestText()~\n~AddManifestText()~\n~~\n~AddPermission(android.permission.REQUEST_INSTALL_PACKAGES)~\n~AddPermission(android.permission.INTERNET)~\n~AddPermission(android.permission.INSTALL_PACKAGES)~\n~AddPermission(android.permission.READ_EXTERNAL_STORAGE)~\n~AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)~\n~AddPermission(android.permission.READ_PHONE_STATE)~\n~AddPermission(android.permission.WAKE_LOCK)~\n~CreateResourceFromFile(Macro, JhsIceZxing1.CaturePortrait)~\n~AddPermission("android.permission.MANAGE_EXTERNAL_STORAGE")~\n~SetApplicationAttribute(android:largeHeap, "true")~\n~AddPermission("android.permission.MANAGE_EXTERNAL_STORAGE")~\n~~\n~AddPermission("android.permission.POST_NOTIFICATIONS")~\n~~\n~AddManifestText()~\n~AddPermission(android.permission.INTERNET)~\n~SetApplicationAttribute(android:allowBackup, "false")~\n~ +Module1=appUpdater +Module10=DBRequestManager +Module11=login +Module12=QRGenerator +Module13=Starter +Module14=Subs +Module15=Tracker +Module2=B4x_Transition +Module3=|relative|..\B4XMainPage +Module4=BatteryUtilities +Module5=C_principal +Module6=C_supervisor +Module7=C_UpdateAvailable +Module8=CameraExClass +Module9=CameraExClass2 +NumberOfFiles=22 +NumberOfLibraries=28 +NumberOfModules=15 +Version=12.8 +@EndOfDesignText@ +#Region Project Attributes + #ApplicationLabel: Gabinete + #VersionCode: 1 + #VersionName: 4.03.05 + 'SupportedOrientations possible values: unspecified, landscape or portrait. + #SupportedOrientations: portrait + #CanInstallToExternalStorage: False + #AdditionalJar: com.android.support:support-v4 + #AdditionalJar: com.google.android.gms:play-services-location +#End Region + +#Region Activity Attributes + #FullScreen: False + #IncludeTitle: False +#End Region +#AdditionalJar: com.google.android.gms:play-services-vision +'#BridgeLogger: True + +Sub Process_Globals + Public ActionBarHomeClicked As Boolean +End Sub + +Sub Globals + Type CameraInfoAndId (CameraInfo As Object, Id As Int) + Type CameraSize (Width As Int, Height As Int) +End Sub + +Sub Activity_Create(FirstTime As Boolean) + Dim pm As B4XPagesManager + pm.Initialize(Activity) +End Sub + +'Template version: B4A-1.01 +#Region Delegates + +Sub Activity_ActionBarHomeClick + ActionBarHomeClicked = True + B4XPages.Delegate.Activity_ActionBarHomeClick + ActionBarHomeClicked = False +End Sub + +Sub Activity_KeyPress (KeyCode As Int) As Boolean + Return B4XPages.Delegate.Activity_KeyPress(KeyCode) +End Sub + +Sub Activity_Resume + B4XPages.Delegate.Activity_Resume +End Sub + +Sub Activity_Pause (UserClosed As Boolean) + B4XPages.Delegate.Activity_Pause +End Sub + +Sub Activity_PermissionResult (Permission As String, Result As Boolean) + B4XPages.Delegate.Activity_PermissionResult(Permission, Result) +End Sub + +Sub Create_Menu (Menu As Object) + B4XPages.Delegate.Create_Menu(Menu) +End Sub + +#if Java +public boolean _onCreateOptionsMenu(android.view.Menu menu) { + processBA.raiseEvent(null, "create_menu", menu); + return true; + +} +#End If +#End Region + +'Program code should go into B4XMainPage and other pages. \ No newline at end of file diff --git a/B4A/Gabinete roit.b4a.meta b/B4A/Gabinete roit.b4a.meta new file mode 100644 index 0000000..ac83b21 --- /dev/null +++ b/B4A/Gabinete roit.b4a.meta @@ -0,0 +1,51 @@ +ModuleBookmarks0= +ModuleBookmarks1= +ModuleBookmarks10= +ModuleBookmarks11= +ModuleBookmarks12= +ModuleBookmarks13= +ModuleBookmarks14= +ModuleBookmarks15= +ModuleBookmarks2= +ModuleBookmarks3= +ModuleBookmarks4= +ModuleBookmarks5= +ModuleBookmarks6= +ModuleBookmarks7= +ModuleBookmarks8= +ModuleBookmarks9= +ModuleBreakpoints0= +ModuleBreakpoints1= +ModuleBreakpoints10= +ModuleBreakpoints11= +ModuleBreakpoints12= +ModuleBreakpoints13= +ModuleBreakpoints14= +ModuleBreakpoints15= +ModuleBreakpoints2= +ModuleBreakpoints3= +ModuleBreakpoints4= +ModuleBreakpoints5= +ModuleBreakpoints6= +ModuleBreakpoints7= +ModuleBreakpoints8= +ModuleBreakpoints9= +ModuleClosedNodes0= +ModuleClosedNodes1= +ModuleClosedNodes10= +ModuleClosedNodes11= +ModuleClosedNodes12= +ModuleClosedNodes13= +ModuleClosedNodes14= +ModuleClosedNodes15= +ModuleClosedNodes2= +ModuleClosedNodes3= +ModuleClosedNodes4= +ModuleClosedNodes5= +ModuleClosedNodes6= +ModuleClosedNodes7= +ModuleClosedNodes8= +ModuleClosedNodes9= +NavigationStack=C_principal,horaentrada,574,0,C_principal,ImageView2_Click,614,6,C_principal,botongestionadas,1627,0,C_principal,b_gestionadas_Click,1606,6,C_principal,b_comidain_Click,1429,0,C_principal,ajustaTamano2,918,5,C_principal,ajustaTamano,900,0,C_supervisor,Class_Globals,0,0,B4XMainPage,Class_Globals,19,0 +SelectedBuild=0 +VisibleModules=13,3,11,5,6,10,14,15,12,1 diff --git a/B4A/QRGenerator.bas b/B4A/QRGenerator.bas new file mode 100644 index 0000000..fa70268 --- /dev/null +++ b/B4A/QRGenerator.bas @@ -0,0 +1,491 @@ +B4J=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=6.28 +@EndOfDesignText@ +'version 1.60 +Sub Class_Globals + Private xui As XUI + Public cvs As B4XCanvas + Private ModuleSize As Int + Private GFSize As Int = 256 + Private ExpTable(GFSize) As Int + Private LogTable(GFSize) As Int + Private PolyZero() As Int = Array As Int(0) + Private Generator1L() As Int = Array As Int(1, 127, 122, 154, 164, 11, 68, 117) + Private Generator4L() As Int = Array As Int(1, 152, 185, 240, 5, 111, 99, 6, 220, 112, 150, 69, 36, 187, 22, 228, 198, 121, 121, 165, 174) '4L + Private Generator4H() As Int = Array As Int(1, 59, 13, 104, 189, 68, 209, 30, 8, 163, 65, 41, 229, 98, 50, 36, 59) + Private Generator9L() As Int = Array As Int(1, 212, 246, 77, 73, 195, 192, 75, 98, 5, 70, 103, 177, 22, 217, 138, 51, 181, 246, 72, 25, 18, 46, 228, 74, 216, 195, 11, 106, 130, 150) + Private TempBB As B4XBytesBuilder + Private Matrix(0, 0) As Boolean + Private Reserved(0, 0) As Boolean + Private NumberOfModules As Int + Private mBitmapSize As Int + Type QRVersionData (Format() As Byte, Generator() As Int, MaxSize As Int, Version As Int, MaxUsableSize As Int, Alignments() As Int, _ + Group1Size As Int, Group2Size As Int, Block1Size As Int, Block2Size As Int, VersionName As String, VersionInformation() As Byte) + Private versions As List +End Sub + + +Public Sub Initialize (BitmapSize As Int) + TempBB.Initialize + mBitmapSize = BitmapSize + PrepareTables + versions.Initialize + Dim l0() As Byte = Array As Byte(1,1,1,0,1,1,1,1,1,0,0,0,1,0,0) + Dim h0() As Byte = Array As Byte(0,0,1,0,1,1,0,1,0,0,0,1,0,0,1) + versions.Add(CreateVersionData(1, "1L", Generator1L, l0, 19 * 8, 17, Array As Int(), 1, 0, 19, 0, Null)) + versions.Add(CreateVersionData(4, "4H", Generator4H, h0 , 36 * 8, 34, Array As Int(6, 26), 4, 0, 9, 0, Null)) + versions.Add(CreateVersionData(4, "4L", Generator4L, l0 , 80 * 8, 78, Array As Int(6, 26), 1, 0, 80, 0, Null)) + versions.Add(CreateVersionData(9, "9L", Generator9L, l0, 232 * 8, 230, Array As Int(6, 26, 46), 2, 0, 116, 0, Array As Byte(0,0,1,0,0,1,1,0,1,0,1,0,0,1,1,0,0,1))) + versions.Add(CreateVersionData(23, "23H", Generator9L, h0, 464 * 8, 461, Array As Int(6, 30, 54, 78, 102), 16, 14, 15, 16, _ + Array As Byte(0,1,0,1,1,1,0,1,1,1,1,1,1,0,1,1,0,0))) + versions.Add(CreateVersionData(40, "40H", Generator9L, h0, 1276 * 8, 1273, Array As Int(6, 30, 58, 86, 114, 142, 170), 20, 61, 15, 16, _ + Array As Byte(1,0,1,0,0,0,1,1,0,0,0,1,1,0,1,0,0,1))) + versions.Add(CreateVersionData(40, "40L", Generator9L, l0, 2956 * 8, 2953, Array As Int(6, 30, 58, 86, 114, 142, 170), 19, 6, 118, 119, _ + Array As Byte(1,0,1,0,0,0,1,1,0,0,0,1,1,0,1,0,0,1))) +End Sub + +Private Sub CreateVersionData (Version As Int, Name As String, Generator() As Int, Format() As Byte, MaxSize As Int, MaxUsableSize As Int, Alignments() As Int, _ + Group1Size As Int, Group2Size As Int, Block1Size As Int, Block2Size As Int, VersionInformation() As Byte) As QRVersionData + Dim v As QRVersionData + v.Initialize + v.Version = Version + v.VersionName = Name + v.Generator = Generator + v.Format = Format + v.MaxSize = MaxSize + v.MaxUsableSize = MaxUsableSize + v.Alignments = Alignments + v.Group1Size = Group1Size + v.Group2Size = Group2Size + v.Block1Size = Block1Size + v.Block2Size = Block2Size + v.VersionInformation = VersionInformation + Return v +End Sub + +Public Sub Create(Text As String) As B4XBitmap + Dim Bytes() As Byte = Text.GetBytes("utf8") 'non-standard but still recommended + Dim vd As QRVersionData + For Each version As QRVersionData In versions + If version.MaxUsableSize >= Bytes.Length Then + vd = version + Exit + End If + Next + If vd.IsInitialized = False Then + + Log("Too long!") + Return Null + End If + Log(vd.VersionName & ", Size: " & Bytes.Length) + + NumberOfModules = 17 + vd.Version * 4 + ModuleSize = mBitmapSize / (NumberOfModules + 8) + + mBitmapSize = ModuleSize * (NumberOfModules + 8) + Dim p As B4XView = xui.CreatePanel("") + p.SetLayoutAnimated(0, 0, 0, mBitmapSize, mBitmapSize) + cvs.Initialize(p) + + + Dim Matrix(NumberOfModules, NumberOfModules) As Boolean + Dim Reserved(NumberOfModules, NumberOfModules) As Boolean + + Dim Mode() As Byte = Array As Byte(0, 1, 0, 0) 'byte mode + Dim ContentCountIndicator() As Byte + If vd.Version >= 10 Then + ContentCountIndicator = IntTo16Bits(Bytes.Length) + Else + ContentCountIndicator = UnsignedByteToBits(Bytes.Length) + End If + Dim EncodedData As B4XBytesBuilder + EncodedData.Initialize + EncodedData.Append(Mode) + EncodedData.Append(ContentCountIndicator) + For Each b As Byte In Bytes + EncodedData.Append(UnsignedByteToBits(Bit.And(0xff, b))) + Next + 'add terminator + Dim PadSize As Int = Min(4, vd.MaxSize - EncodedData.Length) + Dim pad(PadSize) As Byte + EncodedData.Append(pad) + Do While EncodedData.Length Mod 8 <> 0 + EncodedData.Append(Array As Byte(0)) + Loop + + Do While EncodedData.Length < vd.MaxSize + EncodedData.Append(Array As Byte(1,1,1,0,1,1,0,0)) + If EncodedData.Length < vd.MaxSize Then EncodedData.Append(Array As Byte(0,0,0,1,0,0,0,1)) + Loop + VersionWithTwoGroups(vd.Generator, vd.Group1Size, vd.Group2Size, vd.Block1Size, vd.Block2Size, EncodedData) + AddFinders (vd) + AddDataToMatrix(EncodedData.ToArray, vd) + DrawMatrix + cvs.Invalidate + Dim bmp As B4XBitmap = cvs.CreateBitmap + cvs.Release + Return bmp +End Sub + +Private Sub VersionWithTwoGroups (generator() As Int, Group1Size As Int, Group2Size As Int, Block1Size As Int, Block2Size As Int, EncodedData As B4XBytesBuilder) + Dim ecs As List + ecs.Initialize + Dim dataBlocks As List + dataBlocks.Initialize + Dim PrevIndex As Int + For block1 = 0 To Group1Size + Group2Size - 1 + Dim BlockSize As Int + If block1 < Group1Size Then BlockSize = Block1Size Else BlockSize = Block2Size + Dim Data() As Byte = EncodedData.SubArray2(PrevIndex * 8, (PrevIndex + BlockSize) * 8) + PrevIndex = PrevIndex + BlockSize + Dim DataAsInts(Data.Length / 8) As Int + Dim i As Int + For i = 0 To Data.Length - 1 Step 8 + DataAsInts(i / 8) = BitsToUnsignedByte(Data, i) + Next + dataBlocks.Add(DataAsInts) + Dim ec() As Int = CalcReedSolomon(DataAsInts, generator) + If ec.Length < generator.Length - 1 Then + Dim ec2(generator.Length - 1) As Int + IntArrayCopy(ec, 0, ec2, generator.Length - 1 - ec.Length, ec.Length) + ec = ec2 + End If + ecs.Add(ec) + Next + Dim Interleaved As B4XBytesBuilder + Interleaved.Initialize + For i = 0 To Max(Block1Size, Block2Size) - 1 + For block1 = 0 To dataBlocks.Size - 1 + Dim ii() As Int = dataBlocks.Get(block1) + If ii.Length > i Then + Interleaved.Append(UnsignedByteToBits(ii(i))) + End If + Next + Next + For i = 0 To generator.Length - 2 + For block1 = 0 To dataBlocks.Size - 1 + Dim ii() As Int = ecs.Get(block1) + Interleaved.Append(UnsignedByteToBits(ii(i))) + Next + Next + EncodedData.Clear + EncodedData.Append(Interleaved.ToArray) +End Sub + + + +Private Sub AddDataToMatrix (Encoded() As Byte, vd As QRVersionData) + Dim format() As Byte = vd.Format + Dim order As List = CreateOrder + 'mask 0: (row + column) mod 2 == 0 + For Each b As Byte In Encoded + Dim xy() As Int = GetNextPosition(order) + Matrix(xy(0), xy(1)) = (b = 1) + If (xy(1) + xy(0)) Mod 2 = 0 Then Matrix(xy(0), xy(1)) = Not(Matrix(xy(0), xy(1))) + Next + For i = 0 To 5 + Matrix(i, 8) = format(i) = 1 + Matrix(8, NumberOfModules - 1 - i) = format(i) = 1 + Next + Matrix(7, 8) = format(6) = 1 + Matrix(8, NumberOfModules - 1 - 6) = format(6) = 1 + Matrix(8, 8) = format(7) = 1 + Matrix(8, 7) = format(8) = 1 + For i = 0 To 5 + Matrix(8, 5 - i) = format(i + 9) = 1 + Next + For i = 0 To 7 + Matrix(NumberOfModules - 1 - 7 + i, 8) = format(7 + i) = 1 + Next + If vd.Version >= 7 Then + Dim VersionInformation() As Byte = vd.VersionInformation + Dim c As Int = 18 + For x = 0 To 5 + For y = 0 To 2 + c = c - 1 + Matrix(x, NumberOfModules - 11 + y) = VersionInformation(c) = 1 + Matrix(NumberOfModules - 11 + y, x) = VersionInformation(c) = 1 + Next + Next + End If +End Sub + +Private Sub GetNextPosition (order As List) As Int() + Do While True + Dim xy() As Int = order.Get(0) + order.RemoveAt(0) + If Reserved(xy(0), xy(1)) = False Then Return xy + Loop + Return Null +End Sub + +Private Sub CreateOrder As List + Dim Order As List + Order.Initialize + Dim x As Int = NumberOfModules - 1 + Dim y As Int = NumberOfModules - 1 + Dim dy As Int = -1 + Do While x >= 0 And y >= 0 + Order.Add(Array As Int(x, y)) + Order.Add(Array As Int(x - 1, y)) + y = y + dy + If y = -1 Then + x = x - 2 + y = 0 + dy = 1 + Else If y = NumberOfModules Then + x = x - 2 + y = NumberOfModules - 1 + dy = -1 + End If + If x = 6 Then x = x - 1 + Loop + Return Order +End Sub + +Private Sub DrawMatrix + cvs.DrawRect(cvs.TargetRect, xui.Color_White, True, 0) + Dim r As B4XRect + For y = 0 To NumberOfModules - 1 + For x = 0 To NumberOfModules - 1 + r.Initialize((x + 4) * ModuleSize, (y + 4) * ModuleSize, 0, 0) + r.Width = ModuleSize + r.Height = ModuleSize + Dim clr As Int + If Matrix(x, y) Then + clr = xui.Color_Black + 'cvs.DrawCircle(r.CenterX, r.CenterY, r.Width / 2, clr, True, 0) + cvs.DrawRect(r, clr, True, 0) + End If + Next + Next +End Sub + + + +Private Sub BitsToUnsignedByte (b() As Byte, Offset As Int) As Int + Dim res As Int + For i = 0 To 7 + Dim x As Int = Bit.ShiftLeft(1, 7 - i) + res = res + b(i + Offset) * x + Next + Return res +End Sub + +Private Sub UnsignedByteToBits (Value As Int) As Byte() + TempBB.Clear + For i = 7 To 0 Step - 1 + Dim x As Int = Bit.ShiftLeft(1, i) + Dim ii As Int = Bit.And(Value, x) + If ii <> 0 Then + TempBB.Append(Array As Byte(1)) + Else + TempBB.Append(Array As Byte(0)) + End If + Next + + Return TempBB.ToArray +End Sub + +Private Sub IntTo16Bits (Value As Int) As Byte() + TempBB.Clear + For i = 15 To 0 Step - 1 + Dim x As Int = Bit.ShiftLeft(1, i) + Dim ii As Int = Bit.And(Value, x) + If ii <> 0 Then + TempBB.Append(Array As Byte(1)) + Else + TempBB.Append(Array As Byte(0)) + End If + Next + + Return TempBB.ToArray +End Sub + +Private Sub AddFinders (vd As QRVersionData) + AddFinder(0, 0, 6) + AddFinder(NumberOfModules - 7, 0, 6) + AddFinder(0, NumberOfModules - 7, 6) + AddAlignments(vd.Alignments) + If vd.Version >= 7 Then + For x = 0 To 2 + For y = 0 To 5 + Reserved(y, NumberOfModules - 11 + x) = True + Reserved(NumberOfModules - 11 + x, y) = True + Next + Next + End If + + For i = 8 To NumberOfModules - 8 + Matrix(i, 6) = (i Mod 2 = 0) + Matrix(6, i) = (i Mod 2 = 0) + Reserved(i, 6) = True + Reserved(6, i) = True + Next + Matrix(8, NumberOfModules - 1 - 7) = True + Reserved(8, NumberOfModules - 1 - 7) = True + For i = 0 To 7 + Reserved(7, i) = True + Reserved(7, NumberOfModules - 1 - i) = True + Reserved(8, NumberOfModules - 1 - i) = True + Reserved(NumberOfModules -1 - 7, i) = True + Reserved(i, 7) = True + Reserved(i,NumberOfModules -1 - 7) = True + Reserved(NumberOfModules -1 - i, 7) = True + Reserved(NumberOfModules -1 - i, 8) = True + Next + For i = 0 To 8 + Reserved(8, i) = True + Reserved(i, 8) = True + Next +End Sub + +Private Sub AddAlignments (Positions() As Int) + For Each left As Int In Positions + For Each top As Int In Positions + AddFinder (left - 2, top - 2, 4) + Next + Next +End Sub + +Private Sub AddFinder (Left As Int, Top As Int, SizeMinOne As Int) + For y = 0 To SizeMinOne + For x = 0 To SizeMinOne + If Reserved(Left + x, Top + y) Then + Return + End If + Next + Next + For y = 0 To SizeMinOne + For x = 0 To SizeMinOne + Dim value As Boolean + If x = 0 Or x = SizeMinOne Or y = 0 Or y = SizeMinOne Then + value = True + Else if x <> 1 And y <> 1 And x <> SizeMinOne - 1 And y <> SizeMinOne - 1 Then + value = True + End If + Matrix(Left + x, Top + y) = value + Reserved(Left + x, Top + y) = True + Next + Next +End Sub + +#Region ReedSolomon + +Private Sub CalcReedSolomon (Input() As Int, Generator() As Int) As Int() + Dim ecBytes As Int = Generator.Length - 1 + Dim InfoCoefficients(Input.Length) As Int + IntArrayCopy(Input, 0, InfoCoefficients, 0, Input.Length) + InfoCoefficients = CreateGFPoly(InfoCoefficients) + InfoCoefficients = PolyMultiplyByMonomial(InfoCoefficients, ecBytes, 1) + Dim remainder() As Int = PolyDivide(InfoCoefficients, Generator) + Return remainder +End Sub + + +Private Sub PrepareTables + Dim x = 1 As Int + Dim Primitive As Int = 285 + For i = 0 To GFSize - 1 + ExpTable(i) = x + x = x * 2 + If x >= GFSize Then + x = Bit.Xor(Primitive, x) + x = Bit.And(GFSize - 1, x) + End If + Next + For i = 0 To GFSize - 2 + LogTable(ExpTable(i)) = i + Next +End Sub + +Private Sub CreateGFPoly(Coefficients() As Int) As Int() + If Coefficients.Length > 1 And Coefficients(0) = 0 Then + Dim FirstNonZero As Int = 1 + Do While FirstNonZero < Coefficients.Length And Coefficients(FirstNonZero) = 0 + FirstNonZero = FirstNonZero + 1 + Loop + If FirstNonZero = Coefficients.Length Then + Return Array As Int(0) + End If + Dim res(Coefficients.Length - FirstNonZero) As Int + IntArrayCopy(Coefficients, FirstNonZero, res, 0, res.Length) + Return res + End If + Return Coefficients +End Sub + +Private Sub PolyAddOrSubtract(This() As Int, Other() As Int) As Int() + If This(0) = 0 Then Return Other + If Other(0) = 0 Then Return This + Dim Small() As Int = This + Dim Large() As Int = Other + If Small.Length > Large.Length Then + Dim temp() As Int = Small + Small = Large + Large = temp + End If + Dim SumDiff(Large.Length) As Int + Dim LengthDiff As Int = Large.Length - Small.Length + IntArrayCopy(Large, 0, SumDiff, 0, LengthDiff) + For i = LengthDiff To Large.Length - 1 + SumDiff(i) = Bit.Xor(Small(i - LengthDiff), Large(i)) + Next + Return CreateGFPoly(SumDiff) +End Sub + +Private Sub IntArrayCopy(Src() As Int, SrcOffset As Int, Dest() As Int, DestOffset As Int, Count As Int) + For i = 0 To Count - 1 + Dest(DestOffset + i) = Src(SrcOffset + i) + Next +End Sub + + + +Private Sub PolyMultiplyByMonomial (This() As Int, Degree As Int, Coefficient As Int) As Int() + If Coefficient = 0 Then Return PolyZero + Dim product(This.Length + Degree) As Int + For i = 0 To This.Length - 1 + product(i) = GFMultiply(This(i), Coefficient) + Next + Return CreateGFPoly(product) +End Sub + +Private Sub PolyDivide (This() As Int, Other() As Int) As Int() + Dim quotient() As Int = PolyZero + Dim remainder() As Int = This + Dim denominatorLeadingTerm As Int = Other(0) + Dim inverseDenominatorLeadingTerm As Int = GFInverse(denominatorLeadingTerm) + Do While remainder.Length >= Other.Length And remainder(0) <> 0 + Dim DegreeDifference As Int = remainder.Length - Other.Length + Dim scale As Int = GFMultiply(remainder(0), inverseDenominatorLeadingTerm) + Dim term() As Int = PolyMultiplyByMonomial(Other, DegreeDifference, scale) + Dim iterationQuotient() As Int = GFBuildMonomial(DegreeDifference, scale) + quotient = PolyAddOrSubtract(quotient, iterationQuotient) + remainder = PolyAddOrSubtract(remainder, term) + Loop + Return remainder +End Sub + +Private Sub GFInverse(a As Int) As Int + Return ExpTable(GFSize - LogTable(a) - 1) +End Sub + +Private Sub GFMultiply(a As Int, b As Int) As Int + If a = 0 Or b = 0 Then + Return 0 + End If + Return ExpTable((LogTable(a) + LogTable(b)) Mod (GFSize - 1)) +End Sub + +Private Sub GFBuildMonomial(Degree As Int, Coefficient As Int) As Int() + If Coefficient = 0 Then Return PolyZero + Dim c(Degree + 1) As Int + c(0) = Coefficient + Return c +End Sub + +#End Region \ No newline at end of file diff --git a/B4A/Starter.bas b/B4A/Starter.bas new file mode 100644 index 0000000..46f3b3f --- /dev/null +++ b/B4A/Starter.bas @@ -0,0 +1,120 @@ +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 DBReqServer As String = "http://keymon.lat:1783" '"http://keymon.lat:1782" "http://10.0.0.205:1782" ""' CAMBIAR HACIA AFUERA O DENTRO DE LA OFNA + Dim rutaBD As String = File.DirInternal + Dim skmt As SQL + Dim almacen As String +' tracker + Public rp As RuntimePermissions + Public FLP As FusedLocationProvider + Private flpStarted As Boolean + Dim latitud, longitud As String + Dim logger As Boolean = True + Dim ultimaActualizacionGPS As String = 235959 + Dim Timer1 As Timer + Dim Interval As Int = 3600 + Dim sDate, sTime As String + Public gps As GPS + Private bu As BatteryUtilities + Dim batterystatus(11) As Int + Dim bateria As Double + Dim muestraProgreso = 0 + Dim ubicacionActual As Location + Dim horain As String + Dim horaout As String + Dim horacomin As String + Dim horacomout As String + Dim trabaja As Int +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. + Timer1.Initialize("Timer1",Interval * 1000) + Timer1.Enabled = True + ubicacionActual.Initialize +End Sub + +Sub Service_Start (StartingIntent As Intent) + Service.StopAutomaticForeground 'Starter service can start in the foreground state in some edge cases. + Subs.revisaBD + reqManager.Initialize(Me, DBReqServer) + If Not(skmt.IsInitialized) Then skmt.Initialize(rutaBD, "kmt.db", True) +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. +Sub Application_Error (Error As Exception, StackTrace As String) As Boolean + Return True +End Sub + +Sub Service_Destroy + +End Sub + + +Private Sub Timer1_Tick +' ToastMessageShow("Timer",False) +' If logger Then Log("Siguiente actuaizacion " & DateTime.Time(DateTime.Now + Interval * 1000)) + ENVIA_ULTIMA_GPS +' Log("trato de enviar") +End Sub + +Sub ENVIA_ULTIMA_GPS 'ignore + If trabaja = 1 Then +' DateTime.DateFormat = "dd/MM/yyyy" +' DateTime.TimeFormat = "HH:mm:ss" +' sDate=DateTime.Date(DateTime.Now) +' sTime=DateTime.Time(DateTime.Now) + Log("Iniciamos ENVIA_ULTIMA_GPS") + Dim skmt As SQL + Dim cmd As DBCommand + Dim reqManager As DBRequestManager + DateTime.TimeFormat = "HHmmss" + ultimaActualizacionGPS = DateTime.Time(DateTime.Now) + reqManager.Initialize(Me, DBReqServer) + skmt.Initialize(File.DirInternal,"kmt.db", True) + LogColor(latitud&","&longitud,Colors.Blue) + + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + If bateria = 0 Then bateria = 100 + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_ubicaprom_GABICO" + cmd.Parameters = Array As Object(sDate &" " &sTime, B4XPages.MainPage.login.user, latitud,longitud,B4XPages.MainPage.principal.bateria,almacen,B4XPages.MainPage.login.nom_proyec,B4XPages.MainPage.login.sucursal,B4XPages.MainPage.login.suc_nom) +' cmd.Parameters = Array As Object(sDate &" " &sTime, " ", latitud,longitud," ",almacen," "," "," ") + reqManager.ExecuteCommand(cmd,"inst_GESTION_GPS") + + 'Reiniciamos el timer para cuando llamamos el Sub desde "seleccion" + Timer1.Enabled = False + Timer1.Interval = Interval * 1000 + Timer1.Enabled = True + End If +End Sub + +Sub reinicializaReqManager + reqManager.Initialize(Me, DBReqServer) +' B4XPages.MainPage.reqManager.Initialize(Me, server) + If logger Then Log(DBReqServer) +End Sub \ No newline at end of file diff --git a/B4A/Subs.bas b/B4A/Subs.bas new file mode 100644 index 0000000..ec5cf4e --- /dev/null +++ b/B4A/Subs.bas @@ -0,0 +1,67 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=StaticCode +Version=11.8 +@EndOfDesignText@ +'Code module +'Subs in this code module will be accessible from all modules. +Sub Process_Globals + 'These global variables will be declared once when the application starts. + 'These variables can be accessed from all modules. + +End Sub + +Sub revisaBD 'ignore + If Not(File.Exists(Starter.rutaBD, "kmt.db")) Then File.Copy(File.DirAssets, "kmt.db", Starter.rutaBD, "kmt.db") + If Not(Starter.skmt.IsInitialized) Then Starter.skmt.Initialize(Starter.rutaBD, "kmt.db", True) + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS SUCURSAL(ID_SUC TEXT, NOMBRE_SUC TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CHECADO(USUARIO TEXT, ID_EMP TEXT, PERFIL TEXT, PROYECTO TEXT, SUCURSAL TEXT, ESTATUS TEXT, FECHA TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_CHECADO(USUARIO TEXT, ID_EMP TEXT, PERFIL TEXT, PROYECTO TEXT, SUCURSAL TEXT, ESTATUS TEXT, FECHA TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_PROMOTORIA (HIST_PM_FECHA TEXT, HIST_PR_NOMBRE TEXT,HIST_PR_TELEFONO TEXT, HIST_PR_CORREO TEXT, HIST_PR_CURP TEXT, HIST_PR_INE BLOB, HIST_PR_ESTATUS TEXT, HIST_PR_EVIDENCIA BLOB, HIST_PR_OBSERVACIONES TEXT, HIST_PR_COMENTARIOERROR TEXT, HIST_PR_IDPROYECTO TEXT, HIST_PR_NOMBREPROYECTO TEXT, HIST_PR_IDSUCURSAL TEXT, HIST_PR_NOMBRESUCURSAL TEXT, HIST_PR_USUARIO TEXT, HIST_PR_LATITUD TEXT, HIST_PR_LONGITUD TEXT, HIST_PR_BATERIA TEXT, ENVIADO INT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CAT_VARIABLES(CAT_VA_DESCRIPCION TEXT, CAT_VA_VALOR TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_SUPERVISOR(HIST_CHKS_PROYECTO TEXT, HIST_CHKS_NOMPROY TEXT, HIST_CHKS_SUCURSAL TEXT,HIST_CHKS_FORMATO TEXT, HIST_CHKS_SUPERVISOR TEXT, HIST_CHKS_PROMOTOR TEXT, HIST_CHKS_FECHA TEXT, HIST_CHKS_ID TEXT, HIST_CHKS_CALIF_MULTIPLE TEXT, HIST_CHKS_CALIF_ABIERTA TEXT, HIST_CHKS_HORARIO TEXT, ENVIADO INT)") +' Starter.skmt.ExecNonQuery("DROP TABLE IF EXISTS HIST_SUPERVISOR") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS trabaja(sitrabaja TEXT)") +End Sub + +'Genera una notificacion con importancia alta +Sub notiHigh(title As String, body As String, activity As Object) 'ignore + Private notif As Notification + notif.Initialize2(notif.IMPORTANCE_HIGH) + notif.Icon = "icon" + notif.Vibrate = False + notif.Sound = False + notif.AutoCancel = True + Log("notiHigh: "&title) + notif.SetInfo(title, body, activity) +' Log("notiHigh SetInfo") + notif.Notify(777) +End Sub + +'Regresa el objeto de una notificacion con importancia baja +Sub notiLowReturn(title As String, Body As String, id As Int) As Notification 'ignore + Private notification As Notification + notification.Initialize2(notification.IMPORTANCE_LOW) + Log("notiLowReturn: "&title) + notification.Icon = "icon" + notification.Sound = False + notification.Vibrate = False + notification.SetInfo(title, Body, Main) + notification.Notify(id) +' Log("notiLowReturn SetInfo") + Return notification +End Sub + +Sub IsConnectedToInternet As Boolean 'ignore + Dim r As Reflector + r.Target = r.GetContext + r.Target = r.RunMethod2("getSystemService", "connectivity", "java.lang.String") + r.Target = r.RunMethod("getActiveNetworkInfo") + If r.Target <> Null Then +' If logger Then LogColor("isConnectedOrConnecting", Colors.green) + Return r.RunMethod("isConnectedOrConnecting") + End If +' If logger Then LogColor("Not connected", Colors.red) + Return False +End Sub \ No newline at end of file diff --git a/B4A/Tracker.bas b/B4A/Tracker.bas new file mode 100644 index 0000000..f24c06b --- /dev/null +++ b/B4A/Tracker.bas @@ -0,0 +1,254 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Service +Version=11 +@EndOfDesignText@ +#Region Service Attributes + #StartAtBoot: True +#End Region +'****************************************************************************** +'No olvidar agregar esta linea al editor de manifiesto: +' SetServiceAttribute(Tracker, android:foregroundServiceType, "location") +' +'En Starter agregar estas lineas en Process_Globals +' Public rp As RuntimePermissions +' Public FLP As FusedLocationProvider +' Private flpStarted As Boolean +' +'En Main agregar estas lineas a Activity_Resume +' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION) +' Wait For Activity_PermissionResult (Permission As String, Result As Boolean) +' If Result Then +' StartService(Tracker) +' Log("Start Tracker") +' Else +' ToastMessageShow("No permission", True) +' End If +' +'Se necesitan las librerias FusedLocationProvider, GPS, Phone y RunTimePermissions +' +'Y en Main agregar estas dos lineas: +'#AdditionalJar: com.android.support:support-v4 +'#AdditionalJar: com.google.android.gms:play-services-location + +Sub Process_Globals +' Private nid As Int = 1 + Private Tracking As Boolean + Private lock As PhoneWakeState + 'Para FusedLocationProvider (2 lineas) + Public FLP As FusedLocationProvider + Dim actualLR As LocationRequest + Private flpStarted As Boolean +' Dim locRequest As String + Dim UUGCoords As Location 'Ultima Ubicacion Guardada +' Dim trackerActividad, pushServiceActividad As String + Dim logger As Boolean +End Sub + +Sub Service_Create + Service.AutomaticForegroundMode = Service.AUTOMATIC_FOREGROUND_NEVER 'we are handling it ourselves + UUGCoords.Initialize + logger = False + 'Para FusedLocationProvider (2 lineas) + FLP.Initialize("flp") + FLP.Connect + lock.PartialLock + StartFLP +End Sub + +Sub flp_ConnectionSuccess +' If logger Then Log("Connected to location provider") + 'FLP.GetLastKnownLocation +End Sub + +Sub flp_ConnectionFailed(ConnectionResult1 As Int) + If logger Then Log("Failed to connect to location provider") +End Sub + +Sub flp_ConnectionSuspended(ConnectionResult1 As Int) + If logger Then Log("FLP conection suspended") + StartFLP +End Sub + +Sub Service_Start (StartingIntent As Intent) + LogColor("Iniciando Tracker ...", Colors.Green) + Service.StopAutomaticForeground + Service.StartForeground(51042, Subs.notiLowReturn("Gabinete", "Activo", 51042)) + StartServiceAt(Me, DateTime.Now + 10 * DateTime.TicksPerMinute, True) + Track +End Sub + + +Public Sub Track + If logger Then Log("Inicia Track - Tracking : "&Tracking) + If Tracking Then +' Log(actualLR.GetSmallestDisplacement) + Return 'Si ya estamos "rastreando" no hacemos nada (return) + End If + If Starter.rp.Check(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION) = False Then + If logger Then Log("Sin permisos de ublicación.") + Return + End If + StartFLP 'Iniciamos FusedLocationProvider + Tracking = True +End Sub + +Public Sub StartFLP + If logger Then Log("StartFLP - flpStarted="&flpStarted) + Do While FLP.IsConnected = False + Sleep(500) + If logger Then Log("sleeping") + Loop +' If flpStarted = False Then +' If logger Then Log("RequestLocationUpdates") + FLP.RequestLocationUpdates(CreateLocationRequest) 'Buscamos ubicacion + If logger Then LogColor("Buscamos ubicacion (movimientoMinimo = "&actualLR.GetSmallestDisplacement&")", Colors.Magenta) +' If logger Then Log(actualLR.GetSmallestDisplacement) + flpStarted = True +' End If +End Sub + +Public Sub StartFLPSmall +' Log("StartFLPSmall - flpStarted="&flpStarted) + Do While FLP.IsConnected = False + Sleep(500) + Log("sleeping") + Loop + dameUltimaUbicacionConocida 'Regresamos ultima ubicacion conocida + FLP.RequestLocationUpdates(CreateLocationRequestSmallD) 'Buscamos ubicacion 2 peticiones +' Log("Buscamos ubicacion Small displacement") +' Log("GPSSmallestDisplacement = " & actualLR.GetSmallestDisplacement) +End Sub + +Private Sub CreateLocationRequestSmallD As LocationRequest +' Log("Iniciamos CreateLocationRequestSmallD") + Dim lr As LocationRequest + lr.Initialize + lr.SetInterval(2000) 'Intervalo deseado para actualizaciones de ubicacion + lr.SetFastestInterval(lr.GetInterval / 2) 'Intervalo minimo para actualizaciones de ubicacion + lr.setNumUpdates(2) 'Solicitamos solo 2 actualizaciones con estos parametros + lr.SetSmallestDisplacement(0) 'Solo registra cambio de ubicacion si es mayor a XX mts + lr.SetPriority(lr.Priority.PRIORITY_HIGH_ACCURACY) + actualLR=lr + Return lr +End Sub + +Public Sub StartFLP2 + If logger Then Log("StartFLP2 - flpStarted="&flpStarted) + Do While FLP.IsConnected = False + Sleep(500) + If logger Then Log("sleeping") + Loop + dameUltimaUbicacionConocida 'Regresamos ultima ubicacion conocida + FLP.RequestLocationUpdates(CreateLocationRequest2) 'Buscamos ubicacion 2 peticiones + If logger Then LogColor("Buscamos ubicacion (movimientoMinimo = "&actualLR.GetSmallestDisplacement&")", Colors.Magenta) +' If logger Then Log(actualLR.GetSmallestDisplacement) +End Sub + +Private Sub CreateLocationRequest As LocationRequest +' If logger Then Log("CreateLocationRequest") + Dim lr As LocationRequest + lr.Initialize + lr.SetInterval(10000) 'Intervalo deseado para actualizaciones de ubicacion + lr.SetFastestInterval(lr.GetInterval / 2) 'Intervalo minimo para actualizaciones de ubicacion + lr.SetSmallestDisplacement(0) 'Solo registra cambio de ubicacion si es mayor a XX mts + lr.SetPriority(lr.Priority.PRIORITY_HIGH_ACCURACY) + actualLR=lr + Return lr +End Sub + +Private Sub CreateLocationRequest2 As LocationRequest + If logger Then Log("Iniciamos CreateLocationRequest2") + Dim lr As LocationRequest + lr.Initialize + lr.SetInterval(2000) 'Intervalo deseado para actualizaciones de ubicacion + lr.SetFastestInterval(lr.GetInterval / 2) 'Intervalo minimo para actualizaciones de ubicacion + lr.setNumUpdates(2) 'Solicitamos solo 2 actualizaciones con estos parametros + lr.SetSmallestDisplacement(1) 'Solo registra cambio de ubicacion si es mayor a XX mts + lr.SetPriority(lr.Priority.PRIORITY_HIGH_ACCURACY) + actualLR=lr + Return lr +End Sub + +Sub dameUltimaUbicacionConocida + If FLP.GetLastKnownLocation.IsInitialized Then 'Mandamos ultima ubicacion guardada +' If logger Then LogColor($"Mandamos UUC "${Subs.fechaKMT(FLP.GetLastKnownLocation.Time)}|Acc:$0.2{FLP.GetLastKnownLocation.Accuracy}|$0.8{FLP.GetLastKnownLocation.Latitude}|$0.8{FLP.GetLastKnownLocation.Longitude}|Spd:$0.2{FLP.GetLastKnownLocation.Speed}|"$, Colors.RGB(255,112,35)) +' Dim coords As String = FLP.GetLastKnownLocation.Latitude&","&FLP.GetLastKnownLocation.Longitude&","&formatoFecha(FLP.GetLastKnownLocation.Time) +' CallSubDelayed2(FirebaseMessaging,"mandamosLoc",coords) +' Subs.mandamosLoc(coords) + End If +End Sub + +Public Sub StopFLP + 'Log("StopFLP") + If flpStarted Then + FLP.RemoveLocationUpdates 'Eliminamos todas las solicitudes de ubicacion + flpStarted = False + End If +End Sub + +Sub flp_LocationChanged (Location1 As Location) + Starter.latitud = Location1.Latitude + Starter.longitud = Location1.Longitude +' LogColor($"Location changed lat=${Location1.Latitude}, lon=${Location1.Longitude}, Acc=${Location1.Accuracy}, SD=$1.0{actualLR.GetSmallestDisplacement}"$, Colors.green) + UUGCoords = Location1 +' If logger Then Log("SmallestDisplacement="&actualLR.GetSmallestDisplacement) +' CallSub2(Starter, "GPS_LocationChanged", Location1) +' CallSub2(gestion, "GPS_LocationChanged", Location1) +' Starter.ubicacionActual.Latitude = Starter.lat_gps +' Starter.ubicacionActual.Longitude = Starter.lon_gps +' Starter.ubicacionActual.Accuracy = Location1.Accuracy + If Starter.latitud = 0 Or Starter.longitud = Null And FLP.GetLastKnownLocation.IsInitialized Then + Starter.latitud = FLP.GetLastKnownLocation.Latitude + Starter.longitud = FLP.GetLastKnownLocation.Longitude + Starter.ubicacionActual = FLP.GetLastKnownLocation + LogColor("Coords en CERO - Guardamos ultima ubicacion conocida", Colors.red) + End If + '/////// para la ultima ubicacion FL + Dim sDate,sTime As String + DateTime.DateFormat = "MM/dd/yyyy" + DateTime.TimeFormat = "HHmmss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) +' If Starter.lat_gps <> 0 And Starter.lat_gps <> Null Then +' Try +' Starter.skmt.ExecNonQuery("DELETE FROM HIST_GPS") +' Starter.skmt.ExecNonQuery2("INSERT INTO HIST_GPS (HGDATE, HGLAT, HGLON) VALUES(?,?,?) ", Array As Object (sDate & sTime, Starter.lat_gps, Starter.lon_gps)) +' Catch +' If logger Then Log("Error al borrar o insertar nuevas coordendas en HIST_GPS") +' End Try +' End If +' Dim minsDif As Int = DateTime.Time(DateTime.Now) - Starter.ultimaActualizacionGPS +' If Location1.Accuracy < 100 And minsDif > 240 Then 'Si precision de 100 y 4 min transcurridos manda a web +' If Starter.logger Then Log("actualizamos Ubicacion") +' CallSubDelayed(Starter, "ENVIA_ULTIMA_GPS") +' End If + B4XPages.MainPage.principal.GPS_LocationChanged(Location1) +End Sub + +Sub CreateNotification (Body As String) As Notification 'ignore + Dim notification As Notification + notification.Initialize2(notification.IMPORTANCE_HIGH) + notification.Icon = "icon" + notification.SetInfo("Gabinete", Body, Main) + Return notification +End Sub + +Sub Service_Destroy + If Tracking Then + StopFLP + End If + Tracking = False + lock.ReleasePartialLock +End Sub + +Sub formatoFecha(fecha As String) As String 'ignore 'Convierte una fecha al formato yyMMddHHmmss +' Log(fecha) + Dim OrigFormat As String = DateTime.DateFormat 'save orig date format + DateTime.DateFormat="yyMMddHHmmss" + Dim lastUpdate As String=DateTime.Date(fecha) + DateTime.DateFormat=OrigFormat 'return to orig date format +' Log(lastUpdate) + Return lastUpdate +End Sub \ No newline at end of file diff --git a/B4A/appUpdater.bas b/B4A/appUpdater.bas new file mode 100644 index 0000000..b4bee62 --- /dev/null +++ b/B4A/appUpdater.bas @@ -0,0 +1,282 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Service +Version=10.2 +@EndOfDesignText@ +#Region Service Attributes + #StartAtBoot: False +#End Region + +'//////////////////////////////////////////////////////////////////////////////////////////// +'//// Servicio para revisar si hay actualizacion de aplicación, usa la +'//// actividad "updateAvailable" para mostrar mensajes. +'//// +'//// https://www.b4x.com/android/forum/threads/update-your-app-without-using-the-gplaystore.109720/#content +'//// +'//// En la actividad del la cual se va a llamar la revision de actualizacion +'//// hay que agregar los siguientes Subs: +'//// +' Sub boton_que_llama_revision_Click +' StartService(appUpdater) +' End Sub +' +' appUpdater - Mostramos el anuncio de que se esta descargando el nuevo apk +' Sub muestraProgreso +' ProgressDialogShow("Descargando actualización") +' End Sub +' +' appUpdater - Ocultamos el anuncio de que se esta descargando el nuevo apk +' Sub ocultaProgreso +' ProgressDialogHide +' End Sub +'//// +'//// Requiere las siguientes librerias: +'//// +'//// * appUpdating +'//// * JavaObject +'//// * OkHttpUtils2 +'//// * Phone +'//// * RuntimePermissions +'//// +'//// Requiere las siguientes lineas en el manifiesto: +'//// +' AddManifestText( +' ) +' AddApplicationText( +' +' +' +' ) +' CreateResource(xml, provider_paths, +' +' +' +' +' +' ) +' AddPermission(android.permission.REQUEST_INSTALL_PACKAGES) +' AddPermission(android.permission.INTERNET) +' AddPermission(android.permission.INSTALL_PACKAGES) +' AddPermission(android.permission.READ_EXTERNAL_STORAGE) +' AddPermission(android.permission.WRITE_EXTERNAL_STORAGE) +' AddPermission(android.permission.READ_PHONE_STATE) +' AddPermission(android.permission.WAKE_LOCK) +'//// +'//////////////////////////////////////////////////////////////////////////////////////////// + +Sub Process_Globals + 'These global variables will be declared once when the application starts. + 'These variables can be accessed from all modules. + + 'Aqui va la liga al archivo .ver en el servidor que contiene la información de la aplicacion + Public lnk As String = "https://keymon.lat/Movil/gabinete/Gabinete.ver" + + '/// En el servidor se necesita un archivo de texto (.ver) que tenga los siguientes + '/// datos separados por un tabulador + '/// contents of ver file, each field is seperated by a tab + ' Field 0 = 2.226.19.09.19.01a <-- Esta es la version de la aplicación disponible + ' Field 1 = A new version of the MyAPP is available, Download and update now ? <-- Mensaje para cuando hay actualización + ' Field 2 = MyApp is up to date <--- Mensaje para cuando no hay actualización + ' Field 3 = http://www.mydomain.com/Public/myapp.apk <--- Liga al apk de la actualización + + Public nNewApp As Notification + Public nNewAppnID As Int = 16 + 'Para Download + Dim nativeMe As JavaObject + Dim n2 As Notification + Dim n2ID As Int = 16 + 'Para fileProvider + Public SharedFolder As String + Public UseFileProvider As Boolean + Private rp As RuntimePermissions + + Type mNewVersion(update As Boolean, nonewAPP As Boolean, notifyUser As Boolean, _ + version As String, newMsg As String, okMsg As String, appLink As String) + Public newApp As mNewVersion +End Sub + +Sub Service_Create + Log("appUpdater(), Service_Create") + newApp.Initialize + Service.AutomaticForegroundMode = Service.AUTOMATIC_FOREGROUND_NEVER + n2.Initialize + nativeMe.InitializeContext +End Sub + +Sub Service_Start (StartingIntent As Intent) + Log("appUpdater(), Service_Start") +' CallSubDelayed2(Main, "muestraProgreso", "Buscando actualización") + B4XPages.MainPage.login.muestraProgreso("Buscando actualización") + Log("Buscando actualización") + fileProvider_init + Wait For (Download(Me, lnk)) JobDone (j As HttpJob) + If j.Success Then + Try + Dim app() As String = Regex.Split(Chr(9),j.GetString) + ' // Set the data + newApp.appLink = app(3) 'Liga a nueva app + newApp.newMsg = app(1) 'Texto de que hay actualizacion + newApp.okMsg = app(2) 'Texto de app al corriente + newApp.version = app(0) 'Version actual + + Log($"Application.VersionName=${Application.VersionName}, newApp=${newApp}"$) + + ' // App version check + If newApp.version = Application.VersionName Then + newApp.update = False + Log("No new app") + B4XPages.ShowPage("updateAvailable") + 'Se puede mandar tambien una notificacion avisando que NO hay actualizaciones + CreateNotification2("Aplicacion al corriente","No hay actualizaciones disponibles","ic_file_download_white_24dp",Main,True,True,nNewApp,nNewAppnID) + End If + If newApp.version <> Application.VersionName Then + newApp.update = True + Log("New app true") + B4XPages.ShowPage("updateAvailable") + 'Se puede mandar tambien una notificacion avisando que hay actualizacion disponible +' CreateNotification2("Nueva aplicación disponible","Haga clic para descargar.","ic_file_download_white_24dp",C_UpdateAvailable,True,True,nNewApp,nNewAppnID) + End If + Catch + Log("appUpdater(), Job Failed, error " & LastException.Message) + End Try + Else + Log("appUpdater(), Job Failed " & lnk) + End If + j.Release +' StopService(Me) +End Sub + +Sub download_Start (StartingIntent As Intent) + download_newApk +End Sub + +Sub download_newApk +' CreateNotification("Descargando actualización", "Descargando apk", "ic_file_download_white_24dp", Main, False, True) +' CallSubDelayed2(Main, "muestraProgreso", "Descargando actualización") + Log("Descargando actualización") + B4XPages.ShowPage("Login") + Starter.muestraProgreso = 1 + Dim job_newAPP As HttpJob + job_newAPP.Initialize("job_newAPP",Me) + job_newAPP.Download(newApp.appLink) + Wait for (job_newAPP) JobDone (job_newAPP As HttpJob) + If job_newAPP.Success = True Then + ' // Delete existing file + If File.Exists(SharedFolder,"newapp.apk") Then + File.Delete(SharedFolder,"newapp.apk") + End If + ' // Save new file + Dim outNewAPK As OutputStream = File.OpenOutput(SharedFolder,"newapp.apk", False) + File.Copy2(job_newAPP.GetInputStream, outNewAPK) + outNewAPK.Close + If Starter.Logger Then Log("APK dir: "&SharedFolder) + End If + job_newAPP.Release + ' // Install the app + Dim in As Intent + in.Initialize(in.ACTION_VIEW,"" ) + SetFileUriAsIntentData(in, "newapp.apk") + ' // Type must be set after calling SetFileUriAsIntentData + in.SetType("application/vnd.android.package-archive") + StartActivity(in) + n2.Cancel(nNewAppnID) + B4XPages.MainPage.login.ocultaProgreso +' Service.StopForeground(nNewAppnID) + StopService(Me) +' CallSubDelayed(Main,"ocultaProgreso") +End Sub + +Sub download_Destroy + n2.Cancel(n2ID) + Service.StopForeground(n2ID) +End Sub + +Sub Download (Callback As Object, link As String) As HttpJob + Dim j As HttpJob + j.Initialize("", Callback) + j.Download(link) + Return j +End Sub + +Private Sub CreateNotification2(Title As String, Content As String, _ 'ignore + Icon As String, TargetActivity As Object, Sound As Boolean, _ + Vibrate As Boolean, pN As Notification,pNID As Int) As Notification + pN.Initialize2(pN.IMPORTANCE_HIGH) +' pN.Number = pNID +' pN.Light = False + pN.Vibrate = Vibrate + pN.Sound = Sound +' pN.OnGoingEvent = False + pN.Icon = Icon + pN.AutoCancel = True + pN.SetInfo(Title, Content, TargetActivity) + pN.Notify(pNID) + Return pN +End Sub + +Private Sub CreateNotification(Title As String, Content As String, Icon As String, TargetActivity As Object, Sound As Boolean, Vibrate As Boolean) As Notification 'ignore + n2.Initialize + n2.Light = False + n2.Vibrate = Vibrate + n2.Sound = Sound + n2.OnGoingEvent = True + n2.Icon = Icon + n2.SetInfo(Title, Content, TargetActivity) + n2.Notify(nNewAppnID) +End Sub + +Sub Service_Destroy + Log("appUpdater(), Service_Destroy") +End Sub + +Sub fileProvider_init + Dim p As Phone + If p.SdkVersion >= 24 Or File.ExternalWritable = False Then + UseFileProvider = True + SharedFolder = File.Combine(File.DirInternal, "shared") + If Not(File.IsDirectory(File.DirInternal,"shared")) Then + File.MakeDir("", SharedFolder) + End If + Else + UseFileProvider = False + SharedFolder = rp.GetSafeDirDefaultExternal("shared") + End If + Log($"Using FileProvider? ${UseFileProvider}"$) +End Sub + +'Returns the file uri. +Sub GetFileUri (FileName As String) As Object + Try + If Not(UseFileProvider) Then + Dim uri As JavaObject + Return uri.InitializeStatic("android.net.Uri").RunMethod("parse", Array("file://" & File.Combine(SharedFolder, FileName))) + End If + Dim f As JavaObject + f.InitializeNewInstance("java.io.File", Array(SharedFolder, FileName)) + Dim fp As JavaObject + Dim context As JavaObject + context.InitializeContext + fp.InitializeStatic("android.support.v4.content.FileProvider") + Return fp.RunMethod("getUriForFile", Array(context, Application.PackageName & ".provider", f)) + Catch + Log("FileProvider::GetFileUri - error - " & LastException.Message) + Return "" + End Try +End Sub + +'Replaces the intent Data field with the file uri. +'Resets the type field. Make sure to call Intent.SetType after calling this method +Sub SetFileUriAsIntentData (Intent As Intent, FileName As String) + Dim jo As JavaObject = Intent + jo.RunMethod("setData", Array(GetFileUri(FileName))) + Intent.Flags = Bit.Or(Intent.Flags, 1) 'FLAG_GRANT_READ_URI_PERMISSION +End Sub diff --git a/B4A/login.bas b/B4A/login.bas new file mode 100644 index 0000000..302d753 --- /dev/null +++ b/B4A/login.bas @@ -0,0 +1,395 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=11.8 +@EndOfDesignText@ +Sub Class_Globals + Public Root As B4XView 'ignore + Private xui As XUI 'ignore + +' Base de datos + Dim reqManager As DBRequestManager + Dim user As String + Dim perfil As String + Dim ID_EMP As String + Dim formato_suc As String + Dim nombre As String + Dim lat_suc As String + Dim long_suc As String +' Elementos + Private b_inicio As Button + Private et_user As EditText + Private et_pass As EditText + Dim sucursal As String + Dim suc_nom As String + Dim nom_proyec As String + Private ImageView5 As ImageView + Private b_regresa As Button + Private b_actualizar_app As Button + Private b_enviarbd As Button + Private b_guarda_server As Button + Private et_server As EditText + Private lv_server As ListView + Private p_configuracion As Panel + Public Provider As FileProvider + Dim horain As String + Dim horaout As String + Dim horacomin As String + Dim horacomout As String + Private p_adorno As Panel + Private l_version As Label + +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 + Root1.LoadLayout("login") + reqManager.Initialize(Me, Starter.DBReqServer) + + Provider.Initialize + l_version.Text = Application.VersionName +End Sub + +Sub B4XPage_Appear + + If Starter.muestraProgreso = 1 Then + muestraProgreso("Descargando actualización") + Starter.muestraProgreso = 0 + End If + p_configuracion.Width = Root.Width + p_configuracion.Height = Root.Height + p_configuracion.Visible = False + p_adorno.Width = Root.Width * 0.85 + p_adorno.Height = Root.Height * 0.80 + Log("inicio1") + StartService(Tracker) + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) + If Result Then + StartService(Tracker) + Log("Start Tracker") + Else + ToastMessageShow("Sin permisos para GPS", True) + End If + Log(Result) + +' Dim p As Period +' p.Days = 0 +' p.Hours = 0 +' p.Minutes = 0 +' Dim newDate As Long = DateUtils.AddPeriod(DateTime.Now, p) +' Log(newDate) +' +' ' Verificar si hoy es lunes +' If EsLunes(newDate) Then +' Log("¡Hoy es lunes!") +' Else If EsMartes(newDate) Then +' Log("¡Hoy es Martes!") +' Else If EsMiercoles(newDate) Then +' Log("¡Hoy es Miercoles!") +' Else If Esjueves(newDate) Then +' Log("¡Hoy es jueves!") +' Else If Esviernes(newDate) Then +' Log("¡Hoy es Viernes!") +' Else If Essabado(newDate) Then +' Log("¡Hoy es Sabado!") +' Else If EsDomingo(newDate) Then +' Log("¡Hoy es Domingo!") +' End If + + +End Sub + +Private Sub b_inicio_Click + If et_user.Text <> "" Then + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_usuario_GABICO" + cmd.Parameters = Array As Object(et_user.Text, et_pass.Text) + reqManager.ExecuteQuery(cmd , 0, "usuario") + user = et_user.Text + End If + Log(Starter.latitud) + Log(Starter.longitud) + +' B4XPages.ShowPage ("Principal") +End Sub + +Sub JobDone (Job As HttpJob) + If Job.Success = False Then + ToastMessageShow("Error: " & Job.ErrorMessage, True) + Else + LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "usuario" Then 'query tag + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) + Next + If records(result.Columns.Get ("USUARIO")) = "OKActivo" Then + Starter.almacen = records(result.Columns.Get ("CAT_LO_AGENCIA")) + nom_proyec = records(result.Columns.Get ("PRO_NOM")) + perfil = records(result.Columns.Get ("CAT_LO_PERFIL")) + sucursal = records(result.Columns.Get ("CAT_EMP_SUCURSAL")) + suc_nom = records(result.Columns.Get ("SUC_NOMBRE")) + ID_EMP = records(result.Columns.Get ("CAT_LO_ID")) + formato_suc = records(result.Columns.Get ("CAT_SUC_FORMATO")) + nombre = records(result.Columns.Get ("CAT_LO_NOMBRE")) + lat_suc = records(result.Columns.Get ("CAT_SUC_LATITUD")) + long_suc = records(result.Columns.Get ("CAT_SUC_LONGITUD")) + user = et_user.Text + horain = records(result.Columns.Get ("CAT_EMP_HORA_ENTRA")) + horaout = records(result.Columns.Get ("CAT_EMP_HORA_SALE")) + horacomin = records(result.Columns.Get ("CAT_EMP_COMIDA_ENTRA")) + horacomout = records(result.Columns.Get ("CAT_EMP_COMIDA_SALE")) + + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_sitrabaja_GABICO" + cmd.Parameters = Array As Object(et_user.Text) + reqManager.ExecuteQuery(cmd , 0, "diatraba") + Else + ToastMessageShow ("Datos incorrectos",True) + End If + Next + If result.Rows.Size = 0 Then + ToastMessageShow ("Datos incorrectos",True) + End If + End If + + If result.Tag = "diatraba" Then 'query tag + For Each records() As Object In result.Rows + Starter.trabaja = records(result.Columns.Get("TRABAJA")) + Log(Starter.trabaja) + If Starter.trabaja = 1 Then + If perfil = 3 Then + CallSubDelayed(Starter,"ENVIA_ULTIMA_GPS") + B4XPages.ShowPage("Principal") + Log("AQUI ANDO") + Else If perfil = 2 Then + CallSubDelayed(Starter,"ENVIA_ULTIMA_GPS") + Log("AQUI ACA") + B4XPages.ShowPage("Supervisor") + End If + Else If Starter.trabaja = 0 Then + MsgboxAsync("Hoy es día de descanso","Atención") + End If + Next + ' ToastMessageShow(" Historico Clientes Promociones Actualizado." , True) + + End If + + End If + + End If + +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub + If p_configuracion.Visible = True Then + p_configuracion.Visible = False + Else + B4XPages.ShowPage("login") + End If + +' Return True + Return False +End Sub + +Private Sub ImageView5_Click + p_configuracion.Visible = True + lv_server.Clear + lv_server.AddSingleLine("http://keymon.lat:1783") + If et_user.Text = "KMTS1" Then lv_server.AddSingleLine("http://11.0.0.196:1783") +' l_server.Text = Starter.server + et_server.Text = Starter.DBReqServer +End Sub + +Private Sub p_configuracion_Click + +End Sub + +Private Sub lv_server_ItemClick (Position As Int, Value As Object) + Starter.DBReqServer = Value +' l_server.Text = Value + et_server.Text = Value + Starter.reqManager.Initialize(Me, Value) + Log(Value) + ToastMessageShow("Servidor modificado", False) +End Sub + +Private Sub b_guarda_server_Click + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("SERVER")) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("SERVER",et_server.text)) + Starter.DBReqServer = et_server.text + Log("Inicializamos reqManager con " & Starter.DBReqServer) + reqManager.Initialize(Me, Starter.DBReqServer) + CallSubDelayed(Starter, "reinicializaReqManager") + p_configuracion.Visible= False +End Sub + +Private Sub b_regresa_Click + p_configuracion.Visible = False +End Sub + + + +Private Sub b_enviarbd_Click + ' copiaDB +' Sleep(1000) + Dim FileName As String = "kmt.db" + 'copy the shared file to the shared folder + Log("xxxxxx:"&Provider.SharedFolder) + Sleep(1000) + File.Copy(File.DirInternal, FileName, Provider.SharedFolder, FileName) + Dim email As Email + email.To.Add("soporte@keymonsoft.com") + email.Subject = "Envio Base de dados Gabinete" + email.Attachments.Add(Provider.GetFileUri(FileName)) +' email.Attachments.Add(Provider.GetFileUri(FileName)) 'second attachment + Dim in As Intent = email.GetIntent + in.Flags = 1 'FLAG_GRANT_READ_URI_PERMISSION + StartActivity(in) +End Sub + +Private Sub b_actualizar_app_Click + StartService(appUpdater) +End Sub + +' appUpdater - Mostramos el anuncio de que se esta descargando el nuevo apk +Sub muestraProgreso(mensaje As String) + ProgressDialogShow(mensaje) +End Sub +' +' appUpdater - Ocultamos el anuncio de que se esta descargando el nuevo apk +Sub ocultaProgreso + ProgressDialogHide +End Sub + +Sub notiLowReturn(title As String, Body As String, id As Int) As Notification 'ignore + Private notification As Notification + notification.Initialize2(notification.IMPORTANCE_LOW) + Log("notiLowReturn: "&title) + notification.Icon = "icon" + notification.Sound = False + notification.Vibrate = False + notification.SetInfo(title, Body, Main) + notification.Notify(id) +' Log("notiLowReturn SetInfo") + Return notification +End Sub + +'' Función para verificar si la fecha actual es un lunes +'Sub EsLunes(fecha As Long) As Boolean +' ' Crear un objeto Calendar +' Dim cal As JavaObject +' cal.InitializeNewInstance("java.util.GregorianCalendar", Null) +' +' ' Establecer la fecha actual en el objeto Calendar +' cal.RunMethod("setTimeInMillis", Array(fecha)) +' +' ' Obtener el día de la semana (1 para domingo, 2 para lunes, ..., 7 para sábado) +' Dim diaSemana As Int = cal.RunMethod("get", Array(7)) +' +' ' Verificar si es lunes (día de la semana = 2) +' Return diaSemana = 2 +'End Sub +' +'Sub EsMartes(fecha As Long) As Boolean +' ' Crear un objeto Calendar +' Dim cal As JavaObject +' cal.InitializeNewInstance("java.util.GregorianCalendar", Null) +' +' ' Establecer la fecha actual en el objeto Calendar +' cal.RunMethod("setTimeInMillis", Array(fecha)) +' +' ' Obtener el día de la semana (1 para domingo, 2 para lunes, ..., 7 para sábado) +' Dim diaSemana As Int = cal.RunMethod("get", Array(7)) +' +' ' Verificar si es lunes (día de la semana = 2) +' Return diaSemana = 3 +'End Sub +' +'Sub EsMiercoles(fecha As Long) As Boolean +' ' Crear un objeto Calendar +' Dim cal As JavaObject +' cal.InitializeNewInstance("java.util.GregorianCalendar", Null) +' +' ' Establecer la fecha actual en el objeto Calendar +' cal.RunMethod("setTimeInMillis", Array(fecha)) +' +' ' Obtener el día de la semana (1 para domingo, 2 para lunes, ..., 7 para sábado) +' Dim diaSemana As Int = cal.RunMethod("get", Array(7)) +' +' ' Verificar si es lunes (día de la semana = 2) +' Return diaSemana = 4 +'End Sub +' +'Sub Esjueves(fecha As Long) As Boolean +' ' Crear un objeto Calendar +' Dim cal As JavaObject +' cal.InitializeNewInstance("java.util.GregorianCalendar", Null) +' +' ' Establecer la fecha actual en el objeto Calendar +' cal.RunMethod("setTimeInMillis", Array(fecha)) +' +' ' Obtener el día de la semana (1 para domingo, 2 para lunes, ..., 7 para sábado) +' Dim diaSemana As Int = cal.RunMethod("get", Array(7)) +' +' ' Verificar si es lunes (día de la semana = 2) +' Return diaSemana = 5 +'End Sub +' +'Sub Esviernes(fecha As Long) As Boolean +' ' Crear un objeto Calendar +' Dim cal As JavaObject +' cal.InitializeNewInstance("java.util.GregorianCalendar", Null) +' +' ' Establecer la fecha actual en el objeto Calendar +' cal.RunMethod("setTimeInMillis", Array(fecha)) +' +' ' Obtener el día de la semana (1 para domingo, 2 para lunes, ..., 7 para sábado) +' Dim diaSemana As Int = cal.RunMethod("get", Array(7)) +' +' ' Verificar si es lunes (día de la semana = 2) +' Return diaSemana = 6 +'End Sub +' +'Sub Essabado(fecha As Long) As Boolean +' ' Crear un objeto Calendar +' Dim cal As JavaObject +' cal.InitializeNewInstance("java.util.GregorianCalendar", Null) +' +' ' Establecer la fecha actual en el objeto Calendar +' cal.RunMethod("setTimeInMillis", Array(fecha)) +' +' ' Obtener el día de la semana (1 para domingo, 2 para lunes, ..., 7 para sábado) +' Dim diaSemana As Int = cal.RunMethod("get", Array(7)) +' +' ' Verificar si es lunes (día de la semana = 2) +' Return diaSemana = 7 +'End Sub +' +'Sub EsDomingo(fecha As Long) As Boolean +' ' Crear un objeto Calendar +' Dim cal As JavaObject +' cal.InitializeNewInstance("java.util.GregorianCalendar", Null) +' +' ' Establecer la fecha actual en el objeto Calendar +' cal.RunMethod("setTimeInMillis", Array(fecha)) +' +' ' Obtener el día de la semana (1 para domingo, 2 para lunes, ..., 7 para sábado) +' Dim diaSemana As Int = cal.RunMethod("get", Array(7)) +' +' ' Verificar si es lunes (día de la semana = 2) +' Return diaSemana = 1 +'End Sub diff --git a/B4XMainPage.bas b/B4XMainPage.bas new file mode 100644 index 0000000..9312f29 --- /dev/null +++ b/B4XMainPage.bas @@ -0,0 +1,110 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=9.85 +@EndOfDesignText@ +#Region Shared Files + 'Ctrl + click to sync files: ide://run?file=%WINDIR%\System32\Robocopy.exe&args=..\..\Shared+Files&args=..\Files&FilesSync=True + '########################################################################################################### + '###################### PULL ############################################################# + 'Ctrl + click ide://run?file=%WINDIR%\System32\cmd.exe&Args=/c&Args=git&Args=pull + '########################################################################################################### + '###################### PUSH ############################################################# + 'Ctrl + click ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=github&Args=..\..\ + '########################################################################################################### + '###################### PUSH TORTOISE GIT ######################################################### + 'Ctrl + click ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=TortoiseGitProc&Args=/command:commit&Args=/path:"./../../"&Args=/closeonend:2 + '########################################################################################################### +#End Region + +'Ctrl + click to export as zip: ide://run?File=%B4X%\Zipper.jar&Args=Project.zip + +Sub Class_Globals + Public Root As B4XView + Private xui As XUI + Dim timer As Timer +' Clases + Public login As login + Dim principal As C_principal + Dim supervisor As C_supervisor + Public updateAvailable As C_UpdateAvailable +End Sub + +Public Sub Initialize +' B4XPages.GetManager.LogEvents = True + +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + Root.LoadLayout("MainPage") + B4XPages.GetManager.TransitionAnimationDuration = 0 + login.Initialize + B4XPages.AddPageAndCreate("login",login.Initialize) + timer.Initialize("Timerconteo",1000) + timer.Enabled = True + principal.Initialize + B4XPages.AddPage("Principal", principal) + supervisor.Initialize + B4XPages.AddPage("Supervisor", supervisor) + updateAvailable.Initialize + B4XPages.AddPage("updateAvailable", updateAvailable) +' auxiliar.Initialize +' B4XPages.AddPage("Auxiliar", auxiliar) +' tecnico.Initialize +' B4XPages.AddPage("Tecnico", tecnico) +' salida.Initialize +' B4XPages.AddPage("Salida",salida) + +' Tracker + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION) + Wait For Activity_PermissionResult (Permission As String, Result As Boolean) + If Result Then + StartService(Tracker) + Log("Start Tracker") + Else + ToastMessageShow("No permission", True) + End If + + CheckAndRequestNotificationPermission + + +End Sub + +Private Sub B4XPage_Appear + Wait For (CheckAndRequestNotificationPermission) Complete (HasPermission As Boolean) + If HasPermission Then + Log("Con permisos de notificación") + Else + ToastMessageShow("No permission to show notification", True) + End If +End Sub + +'Make sure that targetSdkVersion >= 33 +Private Sub CheckAndRequestNotificationPermission As ResumableSub + Dim p As Phone + If p.SdkVersion < 33 Then Return True + Dim ctxt As JavaObject + ctxt.InitializeContext + Dim targetSdkVersion As Int = ctxt.RunMethodJO("getApplicationInfo", Null).GetField("targetSdkVersion") + If targetSdkVersion < 33 Then Return True + Dim NotificationsManager As JavaObject = ctxt.RunMethod("getSystemService", Array("notification")) + Dim NotificationsEnabled As Boolean = NotificationsManager.RunMethod("areNotificationsEnabled", Null) + If NotificationsEnabled Then Return True + Dim rp As RuntimePermissions + rp.CheckAndRequest(rp.PERMISSION_POST_NOTIFICATIONS) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) 'change to Activity_PermissionResult if non-B4XPages. + Return Result +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub Timerconteo_tick + B4x_Transition.PrepareTransition_FadeOut(xui, Root.Width, Root.Height, Root, login.Root) + B4XPages.ShowPageAndRemovePreviousPages("login") + timer.Enabled = False +End Sub + + diff --git a/gitpull.bat b/gitpull.bat new file mode 100644 index 0000000..d0aed61 --- /dev/null +++ b/gitpull.bat @@ -0,0 +1 @@ +git pull