diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..618d244 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +**/Objects +**/AutoBackups +*.meta \ No newline at end of file diff --git a/B4A/C_cliente.bas b/B4A/C_cliente.bas new file mode 100644 index 0000000..1733c05 --- /dev/null +++ b/B4A/C_cliente.bas @@ -0,0 +1,717 @@ +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 + Private ScrollView1 As ScrollView + Private Panel1 As Panel + Dim IME As IME + Private p_cuestionario As Panel + Private paneltop As Panel + Private camEx2 As CameraExClass2 + Dim frontCamera As Boolean = False + Private p_cam As Panel + Dim nombrefoto As String = "0" + Dim nombrefoto1 As String = "0" + Dim nombrefoto2 As String = "0" + Dim nombrefoto3 As String = "0" + Dim nombrefoto4 As String = "0" + Dim nombrefoto5 As String = "0" + Dim nombrefoto6 As String = "0" + Dim nombrefoto7 As String = "0" + Dim nombrefoto8 As String = "0" + Private p_camara As Panel + Private teclado As IME + Private ImageView1 As ImageView + Private ImageView2 As ImageView + Private ImageView3 As ImageView + Private ImageView4 As ImageView + Private ImageView5 As ImageView + Private ImageView6 As ImageView + Private ImageView7 As ImageView + Private ImageView8 As ImageView + Private ImageView9 As ImageView + Private RadioButton1 As RadioButton + Private RadioButton2 As RadioButton + Private RadioButton3 As RadioButton + Private RadioButton4 As RadioButton + Private RadioButton5 As RadioButton + Private RadioButton6 As RadioButton + Private RadioButton7 As RadioButton + Private RadioButton8 As RadioButton + Private RadioButton9 As RadioButton + Private RadioButton10 As RadioButton + Private RadioButton11 As RadioButton + Private RadioButton12 As RadioButton + Private RadioButton13 As RadioButton + Private RadioButton14 As RadioButton + Private RadioButton15 As RadioButton + Private RadioButton16 As RadioButton + Private RadioButton17 As RadioButton + Private RadioButton18 As RadioButton + Private EditText1 As EditText + Private EditText2 As EditText + Private EditText3 As EditText + Private EditText4 As EditText + Private EditText5 As EditText + Private EditText6 As EditText + Private EditText7 As EditText + Private EditText8 As EditText + Private EditText9 As EditText + Dim p1 As String + Dim p2 As String + Dim p3 As String + Dim p4 As String + Dim p5 As String + Dim p6 As String + Dim p7 As String + Dim p8 As String + Dim p9 As String + Private Label2 As Label + Private Label4 As Label + Private Label6 As Label + Private Label8 As Label + Private Label10 As Label + Private Label12 As Label + Private Label14 As Label + Private Label16 As Label + Private Label18 As Label + Dim c As Cursor + Dim d As Cursor + Dim e As Cursor + Dim fototomada As String + Dim timer As Timer + Dim timer2 As Timer + Dim reqManager As DBRequestManager + Private l_ubicacion As Label + Dim mlat As String + Dim mlon As String + Dim logger As Boolean = False + Dim laDist As Float + Private ubicacion As Location + Dim l1, l2 As Location + Dim distance As Long +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("cliente") + reqManager.Initialize(Me, Starter.DBReqServer) + IME.Initialize("IME") + IME.AddHeightChangedEvent + IME_HeightChanged(100%y, 0) + 'load the layout to Root + ScrollView1.height = Root.Height - Panel1.Height + + ScrollView1.Panel.LoadLayout("p_cuest") + ScrollView1.Panel.Height = p_cuestionario.Height + Log(Starter.latitud & " , " & Starter.longitud) + p_camara.Height = Root.Height + p_camara.Width = Root.Width + p_camara.Visible = False +End Sub + + +Sub B4XPage_Appear + Log(Starter.latitud & " , " & Starter.longitud) + c = Starter.skmt.ExecQuery("SELECT latitud, longitud FROM CUENTAA") + c.Position = 0 + mlat=0 + mlon=0 + If c.GetString("latitud") <> "" Then + mlat = c.GetString("latitud") + mlon = c.GetString("longitud") + End If + c.Close + + If Not(Starter.GPS.GPSEnabled) Then + ToastMessageShow("Debe Activar el GPS del Equipo.", True) + StartActivity(Starter.GPS.LocationSettingsIntent) + Else + Starter.GPS.Start(0, 0) + If Starter.ubicacionActual.Latitude <> 0 Then GPS_LocationChanged(Starter.ubicacionActual) + End If + +End Sub + +Sub GPS_LocationChanged (Location1 As Location) + +' ubicacion.Initialize +' ubicacion.Latitude = mlat +' ubicacion.Longitude = mlon +' If logger Then Log($"${Location1.Latitude}, ${Location1.Longitude}, ${Location1.Accuracy}"$) +' laDist = Location1.DistanceTo(ubicacion) +' l_ubicacion.Text = $"Dist: $1.0{laDist} mts."$ + + l1.Initialize2(Starter.latitud,Starter.longitud) + l2.Initialize2(mlat, mlon) + distance = l1.DistanceTo(l2) ' resultado en metros +' Log (distance) +' Log(mlat & " , " & mlon) +' Log(Starter.latitud & " , " & Starter.longitud) + l_ubicacion.Text = $"Dist: $1.0{distance} mts."$ + If laDist > 50 Then l_ubicacion.TextColor = Colors.Red Else l_ubicacion.TextColor = Colors.Blue + +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 + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_WRITE_EXTERNAL_STORAGE) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) + If Result Then + Log("conpermisos para escritura") + Else + ToastMessageShow("No permission!!!", True) + End If + + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_READ_EXTERNAL_STORAGE) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) + If Result Then + Log("conpermisos para escritura") + 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 + +Private Sub ImageView1_Click +' foto = 2 + DateTime.DateFormat="ddMMyyyyHHmmss" + InitializeCamera2 + p_camara.Visible = True + nombrefoto = DateTime.Now & "_planograma.jpg" + teclado.HideKeyboard + fototomada = nombrefoto +End Sub + +Private Sub ImageView2_Click +' foto = 2 + DateTime.DateFormat="ddMMyyyyHHmmss" + InitializeCamera2 + p_camara.Visible = True + nombrefoto1 = DateTime.Now & "_catalogo.jpg" + teclado.HideKeyboard + fototomada = nombrefoto1 +End Sub + +Private Sub ImageView3_Click +' foto = 2 + DateTime.DateFormat="ddMMyyyyHHmmss" + InitializeCamera2 + p_camara.Visible = True + nombrefoto2 = DateTime.Now & "_presenciaanaqel.jpg" + teclado.HideKeyboard + fototomada = nombrefoto2 +End Sub + +Private Sub ImageView4_Click +' foto = 2 + DateTime.DateFormat="ddMMyyyyHHmmss" + InitializeCamera2 + p_camara.Visible = True + nombrefoto3 = DateTime.Now & "_exhibicion.jpg" + teclado.HideKeyboard + fototomada = nombrefoto3 +End Sub + +Private Sub ImageView5_Click +' foto = 2 + DateTime.DateFormat="ddMMyyyyHHmmss" + InitializeCamera2 + p_camara.Visible = True + nombrefoto4 = DateTime.Now & "_cabecera.jpg" + teclado.HideKeyboard + fototomada = nombrefoto4 +End Sub + +Private Sub ImageView6_Click +' foto = 2 + DateTime.DateFormat="ddMMyyyyHHmmss" + InitializeCamera2 + p_camara.Visible = True + nombrefoto5 = DateTime.Now & "_innovacion.jpg" + teclado.HideKeyboard + fototomada = nombrefoto5 +End Sub + +Private Sub ImageView7_Click +' foto = 2 + DateTime.DateFormat="ddMMyyyyHHmmss" + InitializeCamera2 + p_camara.Visible = True + nombrefoto6 = DateTime.Now & "_abasto.jpg" + teclado.HideKeyboard + fototomada = nombrefoto6 +End Sub + +Private Sub ImageView8_Click +' foto = 2 + DateTime.DateFormat="ddMMyyyyHHmmss" + InitializeCamera2 + p_camara.Visible = True + nombrefoto7 = DateTime.Now & "_foods.jpg" + teclado.HideKeyboard + fototomada = nombrefoto7 +End Sub + +Private Sub ImageView9_Click +' foto = 2 + DateTime.DateFormat="ddMMyyyyHHmmss" + InitializeCamera2 + p_camara.Visible = True + nombrefoto8 = DateTime.Now & "_pc.jpg" + teclado.HideKeyboard + fototomada = nombrefoto8 +End Sub + + +Private Sub p_camara_Click + +End Sub + + +Private Sub b_foto_inci_Click + camEx2.TakePicture + p_camara.Visible = False +' StopCamera2 +End Sub + +Sub Camera1_PictureTaken (Data()As Byte) + 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,"/promotoriakmts") + Dir = "/promotoriakmts" + 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 + + + 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, False) + img.WriteToStream(out, 100, "PNG") + out.Close + ImageView1.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 + ImageView2.Bitmap = LoadBitmap(File.DirInternal & Dir& Dir2,nombrefoto1) + End If + + If nombrefoto2 <> 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 + ImageView3.Bitmap = LoadBitmap(File.DirInternal & Dir& Dir2,nombrefoto2) + End If + + If nombrefoto3 <> 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 + ImageView4.Bitmap = LoadBitmap(File.DirInternal & Dir & Dir2,nombrefoto3) + End If + + If nombrefoto4 <> 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 + ImageView5.Bitmap = LoadBitmap(File.DirInternal & Dir & Dir2,nombrefoto4) + End If + + If nombrefoto5 <> 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 + ImageView6.Bitmap = LoadBitmap(File.DirInternal & Dir & Dir2,nombrefoto5) + End If + + If nombrefoto6 <> 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 + ImageView7.Bitmap = LoadBitmap(File.DirInternal & Dir & Dir2,nombrefoto6) + End If + + If nombrefoto7 <> 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 + ImageView8.Bitmap = LoadBitmap(File.DirInternal & Dir & Dir2,nombrefoto7) + End If + + If nombrefoto8 <> 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 + ImageView9.Bitmap = LoadBitmap(File.DirInternal & Dir & Dir2,nombrefoto8) + End If + StopCamera2 + +End Sub + +Private Sub StopCamera2 +' Capturing = False + If camEx2.IsInitialized Then + camEx2.Release + End If +End Sub + +Private Sub b_guardar_Click + If EditText1.Text <> "" And nombrefoto <> 0 And RadioButton1.Checked = True Or RadioButton2.Checked = True Then + If RadioButton1.Checked Then p1 = "Satisfactorio" + If RadioButton2.Checked Then p1 = "Incompleto" +' Log(nombrefoto) + + If EditText2.Text <> "" And nombrefoto1 <> 0 And RadioButton3.Checked = True Or RadioButton4.Checked = True Then + If RadioButton3.Checked Then p2 = "Satisfactorio" + If RadioButton4.Checked Then p2 = "Incompleto" + + If EditText3.Text <> "" And nombrefoto2 <> 0 And RadioButton5.Checked = True Or RadioButton6.Checked = True Then + If RadioButton5.Checked Then p3 = "Satisfactorio" + If RadioButton6.Checked Then p3 = "Incompleto" + + If EditText4.Text <> "" And nombrefoto3 <> 0 And RadioButton7.Checked = True Or RadioButton8.Checked = True Then + If RadioButton7.Checked Then p4 = "Satisfactorio" + If RadioButton8.Checked Then p4 = "Incompleto" + + If EditText5.Text <> "" And nombrefoto4 <> 0 And RadioButton9.Checked = True Or RadioButton10.Checked = True Then + If RadioButton9.Checked Then p5 = "Satisfactorio" + If RadioButton10.Checked Then p5 = "Incompleto" + + If EditText6.Text <> "" And nombrefoto5 <> 0 And RadioButton11.Checked = True Or RadioButton12.Checked = True Then + If RadioButton11.Checked Then p6 = "Satisfactorio" + If RadioButton12.Checked Then p6 = "Incompleto" + + If EditText7.Text <> "" And nombrefoto6 <> 0 And RadioButton13.Checked = True Or RadioButton14.Checked = True Then + If RadioButton13.Checked Then p7 = "Satisfactorio" + If RadioButton14.Checked Then p7 = "Incompleto" + + If EditText8.Text <> "" And nombrefoto7 <> 0 And RadioButton15.Checked = True Or RadioButton16.Checked = True Then + If RadioButton15.Checked Then p8 = "Satisfactorio" + If RadioButton16.Checked Then p8 = "Incompleto" + + If EditText9.Text <> "" And nombrefoto8 <> 0 And RadioButton17.Checked = True Or RadioButton18.Checked = True Then + If RadioButton17.Checked Then p9 = "Satisfactorio" + If RadioButton18.Checked Then p9 = "Incompleto" + + + + + + If distance > 50 Then + + c = Starter.skmt.ExecQuery("SELECT cuenta FROM CUENTAA") + c.Position = 0 + + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PREGUNTAS(CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO) VALUES(?,?,?,?,?)", Array As Object(c.GetString("cuenta"),Label2.Text,p1,EditText1.Text,nombrefoto)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PREGUNTAS(CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO) VALUES(?,?,?,?,?)", Array As Object(c.GetString("cuenta"),Label4.Text,p2,EditText2.Text,nombrefoto1)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PREGUNTAS(CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO) VALUES(?,?,?,?,?)", Array As Object(c.GetString("cuenta"),Label6.Text,p3,EditText3.Text,nombrefoto2)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PREGUNTAS(CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO) VALUES(?,?,?,?,?)", Array As Object(c.GetString("cuenta"),Label8.Text,p4,EditText4.Text,nombrefoto3)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PREGUNTAS(CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO) VALUES(?,?,?,?,?)", Array As Object(c.GetString("cuenta"),Label10.Text,p5,EditText5.Text,nombrefoto4)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PREGUNTAS(CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO) VALUES(?,?,?,?,?)", Array As Object(c.GetString("cuenta"),Label12.Text,p6,EditText6.Text,nombrefoto5)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PREGUNTAS(CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO) VALUES(?,?,?,?,?)", Array As Object(c.GetString("cuenta"),Label14.Text,p7,EditText7.Text,nombrefoto6)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PREGUNTAS(CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO) VALUES(?,?,?,?,?)", Array As Object(c.GetString("cuenta"),Label16.Text,p8,EditText8.Text,nombrefoto7)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PREGUNTAS(CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO) VALUES(?,?,?,?,?)", Array As Object(c.GetString("cuenta"),Label18.Text,p9,EditText9.Text,nombrefoto8)) + Starter.skmt.ExecNonQuery("UPDATE CUENTAA SET asignado = '0'") + Starter.skmt.ExecNonQuery2("UPDATE DATOS_CLIENTE SET ESTATUS = 1 WHERE CAT_CL_CODIGO = ?", Array As String(c.GetString("cuenta"))) + MsgboxAsync("Datos guardados","Atención") + + Dim cmd As DBCommand + d = Starter.skmt.ExecQuery("SELECT CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO FROM HIST_PREGUNTAS") + e = Starter.skmt.ExecQuery("SELECT RUTA FROM CARGA") + e.Position = 0 + Log("estoy aqui") + For i = 0 To d.RowCount - 1 + d.Position = i + Log("estoy aqui 2") + cmd.Initialize + cmd.Name = "delete_hist_promotoria_INTMEX" + cmd.Parameters = Array As Object(Starter.almacen, e.GetString("RUTA"),B4XPages.MainPage.user,d.GetString("CLIENTE"),d.GetString("CATEGORIA")) + B4XPages.MainPage.reqManager.ExecuteCommand(cmd , "delete") + Next + + c.Close + d.Close + e.Close + + timer.Initialize("Timerconteo",20000) + timer.Enabled = True + + Timerconteo_tick + guardado + B4XPages.ShowPage ("principal") + + Else if distance < 50 Then + + Dim result As Int + result = Msgbox2("Estas fuera de rango de check-in. ¿Deseas enviar la información?", "Atención","Si","","No",Null) + If result = DialogResponse.POSITIVE Then + + c = Starter.skmt.ExecQuery("SELECT cuenta FROM CUENTAA") + c.Position = 0 + + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PREGUNTAS(CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO) VALUES(?,?,?,?,?)", Array As Object(c.GetString("cuenta"),Label2.Text,p1,EditText1.Text,nombrefoto)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PREGUNTAS(CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO) VALUES(?,?,?,?,?)", Array As Object(c.GetString("cuenta"),Label4.Text,p2,EditText2.Text,nombrefoto1)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PREGUNTAS(CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO) VALUES(?,?,?,?,?)", Array As Object(c.GetString("cuenta"),Label6.Text,p3,EditText3.Text,nombrefoto2)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PREGUNTAS(CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO) VALUES(?,?,?,?,?)", Array As Object(c.GetString("cuenta"),Label8.Text,p4,EditText4.Text,nombrefoto3)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PREGUNTAS(CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO) VALUES(?,?,?,?,?)", Array As Object(c.GetString("cuenta"),Label10.Text,p5,EditText5.Text,nombrefoto4)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PREGUNTAS(CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO) VALUES(?,?,?,?,?)", Array As Object(c.GetString("cuenta"),Label12.Text,p6,EditText6.Text,nombrefoto5)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PREGUNTAS(CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO) VALUES(?,?,?,?,?)", Array As Object(c.GetString("cuenta"),Label14.Text,p7,EditText7.Text,nombrefoto6)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PREGUNTAS(CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO) VALUES(?,?,?,?,?)", Array As Object(c.GetString("cuenta"),Label16.Text,p8,EditText8.Text,nombrefoto7)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_PREGUNTAS(CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO) VALUES(?,?,?,?,?)", Array As Object(c.GetString("cuenta"),Label18.Text,p9,EditText9.Text,nombrefoto8)) + Starter.skmt.ExecNonQuery("UPDATE CUENTAA SET asignado = '0'") + Starter.skmt.ExecNonQuery2("UPDATE DATOS_CLIENTE SET ESTATUS = 1 WHERE CAT_CL_CODIGO = ?", Array As String(c.GetString("cuenta"))) + MsgboxAsync("Datos guardados","Atención") + + Dim cmd As DBCommand + d = Starter.skmt.ExecQuery("SELECT CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO FROM HIST_PREGUNTAS") + e = Starter.skmt.ExecQuery("SELECT RUTA FROM CARGA") + e.Position = 0 + Log("estoy aqui") + For i = 0 To d.RowCount - 1 + d.Position = i + Log("estoy aqui 2") + cmd.Initialize + cmd.Name = "delete_hist_promotoria_INTMEX" + cmd.Parameters = Array As Object(Starter.almacen, e.GetString("RUTA"),B4XPages.MainPage.user,d.GetString("CLIENTE"),d.GetString("CATEGORIA")) + B4XPages.MainPage.reqManager.ExecuteCommand(cmd , "delete") + Next + + c.Close + d.Close + e.Close + + timer2.Initialize("Timerconteo",20000) + timer2.Enabled = True + + Timerconteo2_tick + guardado + B4XPages.ShowPage ("principal") + + Else If result = DialogResponse.NEGATIVE Then + + End If + End If + Else + MsgboxAsync("Completa todos los campos de la Categoria PC", "Atención") + End If + Else + MsgboxAsync("Completa todos los campos de la Categoria Foods", "Atención") + End If + Else + MsgboxAsync("Completa todos los campos de Abasto", "Atención") + End If + Else + MsgboxAsync("Completa todos los campos de Innovacion", "Atención") + End If + Else + MsgboxAsync("Completa todos los campos de Cabecera", "Atención") + End If + Else + MsgboxAsync("Completa todos los campos de Exhibicion adicional", "Atención") + End If + Else + MsgboxAsync("Completa todos los campos de Presencia Anaquel", "Atención") + End If + Else + MsgboxAsync("Completa todos los campos de Catalogo", "Atención") + End If + Else + MsgboxAsync("Completa todos los campos del Planograma", "Atención") + End If + teclado.HideKeyboard +End Sub + +Sub IME_HeightChanged(NewHeight As Int, OldHeight As Int) + paneltop.Top = NewHeight - paneltop.Height + ScrollView1.Height = paneltop.Top - ScrollView1.Top +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub + + If p_camara.Visible = True Then + p_camara.Visible = False + StopCamera2 + Else + B4XPages.ShowPage("principal") + End If + +' Return True + Return False +End Sub + +Sub guardado + RadioButton1.Checked = False + RadioButton2.Checked = False + RadioButton3.Checked = False + RadioButton4.Checked = False + RadioButton5.Checked = False + RadioButton6.Checked = False + RadioButton7.Checked = False + RadioButton8.Checked = False + RadioButton9.Checked = False + RadioButton10.Checked = False + RadioButton11.Checked = False + RadioButton12.Checked = False + RadioButton13.Checked = False + RadioButton14.Checked = False + RadioButton15.Checked = False + RadioButton16.Checked = False + RadioButton17.Checked = False + RadioButton18.Checked = False + EditText1.Text = "" + EditText2.Text = "" + EditText3.Text = "" + EditText4.Text = "" + EditText5.Text = "" + EditText6.Text = "" + EditText7.Text = "" + EditText8.Text = "" + EditText9.Text = "" + ImageView1.Bitmap = LoadBitmap(File.DirAssets,"camara1.png") + ImageView2.Bitmap = LoadBitmap(File.DirAssets,"camara1.png") + ImageView3.Bitmap = LoadBitmap(File.DirAssets,"camara1.png") + ImageView4.Bitmap = LoadBitmap(File.DirAssets,"camara1.png") + ImageView5.Bitmap = LoadBitmap(File.DirAssets,"camara1.png") + ImageView6.Bitmap = LoadBitmap(File.DirAssets,"camara1.png") + ImageView7.Bitmap = LoadBitmap(File.DirAssets,"camara1.png") + ImageView8.Bitmap = LoadBitmap(File.DirAssets,"camara1.png") + ImageView9.Bitmap = LoadBitmap(File.DirAssets,"camara1.png") + nombrefoto = 0 + nombrefoto1 = 0 + nombrefoto2 = 0 + nombrefoto3 = 0 + nombrefoto4 = 0 + nombrefoto5 = 0 + nombrefoto6 = 0 + nombrefoto7 = 0 + nombrefoto8 = 0 +End Sub + +Sub Timerconteo_tick + Dim fotox() As Byte + Dim cmd As DBCommand + c = Starter.skmt.ExecQuery("SELECT cuenta, latitud, longitud FROM CUENTAA") + d = Starter.skmt.ExecQuery("SELECT CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO FROM HIST_PREGUNTAS") + e = Starter.skmt.ExecQuery("SELECT RUTA FROM CARGA") + c.Position = 0 + e.Position = 0 + Dim Dirp As String = File.DirInternal + Dim Dir As String + Dim Dir2 As String + Dir = "/promotoriakmts" + Dir2 = "/reduccion" + + For i = 0 To d.RowCount - 1 + d.Position = i + Log(File.Exists(Dirp&Dir&Dir2,d.GetString("NOMBRE_FOTO"))) + fotox = Bit.InputStreamToBytes(File.OpenInput(Dirp&Dir&Dir2,d.GetString("NOMBRE_FOTO"))) + cmd.Initialize + cmd.Name = "insert_promotoria_INTMEX" + cmd.Parameters = Array As Object(Starter.almacen, e.GetString("RUTA"),B4XPages.MainPage.user,d.GetString("CLIENTE"),d.GetString("CATEGORIA"),d.GetString("PREGUNTA1"),d.GetString("COMENTARIOS"),fotox,c.GetString("latitud"),c.GetString("longitud"),c.GetString("lalitud"),c.GetString("longitud")) + B4XPages.MainPage.reqManager.ExecuteCommand(cmd, $"insert_promotoria_${d.GetString("CLIENTE")}_${d.GetString("CATEGORIA")}"$) + Next + + c.Close + d.Close + e.Close + timer.Enabled = False +End Sub + +Sub Timerconteo2_tick + Dim fotox() As Byte + Dim cmd As DBCommand + c = Starter.skmt.ExecQuery("SELECT cuenta, latitud, longitud FROM CUENTAA") + d = Starter.skmt.ExecQuery("SELECT CLIENTE, CATEGORIA, PREGUNTA1, COMENTARIOS, NOMBRE_FOTO FROM HIST_PREGUNTAS") + e = Starter.skmt.ExecQuery("SELECT RUTA FROM CARGA") + c.Position = 0 + e.Position = 0 + Dim Dirp As String = File.DirInternal + Dim Dir As String + Dim Dir2 As String + Dir = "/promotoriakmts" + Dir2 = "/reduccion" + + For i = 0 To d.RowCount - 1 + d.Position = i + Log(File.Exists(Dirp&Dir&Dir2,d.GetString("NOMBRE_FOTO"))) + fotox = Bit.InputStreamToBytes(File.OpenInput(Dirp&Dir&Dir2,d.GetString("NOMBRE_FOTO"))) + cmd.Initialize + cmd.Name = "insert_promotoria_INTMEX" + cmd.Parameters = Array As Object(Starter.almacen, e.GetString("RUTA"),B4XPages.MainPage.user,d.GetString("CLIENTE"),d.GetString("CATEGORIA"),d.GetString("PREGUNTA1"),d.GetString("COMENTARIOS"),fotox,c.GetString("latitud"),c.GetString("longitud"), Starter.latitud, Starter.longitud) + B4XPages.MainPage.reqManager.ExecuteCommand(cmd, $"insert_promotoria_${d.GetString("CLIENTE")}_${d.GetString("CATEGORIA")}"$) + Next + + c.Close + d.Close + e.Close + timer2.Enabled = False +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. \ No newline at end of file diff --git a/B4A/C_principal.bas b/B4A/C_principal.bas new file mode 100644 index 0000000..a130fca --- /dev/null +++ b/B4A/C_principal.bas @@ -0,0 +1,190 @@ +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 + Private CustomListView1 As CustomListView + Dim cmd As DBCommand + Private teclado As IME + Private e_ruta As EditText + Dim ALMACEN As String + Dim reqManager As DBRequestManager + Dim trabajos = 0 As Int + Private l_ruta As Label + Private p_clientes As Panel + Private nombrecliente As Label + Private numerocliente As Label + Private direccion As Label + Private p_datosclie As Panel + Dim c As Cursor + Dim d As Cursor + Dim ruta As String + Dim e As Cursor +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") + 'load the layout to Root + ALMACEN = Starter.almacen + reqManager.Initialize(Me, Starter.DBReqServer) + p_clientes.Visible = False +End Sub + + +Sub B4XPage_Appear + e = Starter.skmt.ExecQuery("SELECT USUARIO, RUTA FROM CARGA WHERE CARGADO = 1") + e.Position = 0 + If e.RowCount = 1 Then + l_ruta.Text = e.GetString("RUTA") + p_clientes.Visible = True + c=Starter.skmt.ExecQuery("select CAT_CL_NOMBRE, CAT_CL_CALLE, CAT_CL_CODIGO from DATOS_CLIENTE WHERE ESTATUS = '0' ORDER BY CAT_CL_CODIGO ") + CustomListView1.Clear + For i = 0 To c.RowCount - 1 + c.Position = i + CustomListView1.Add(CreateListItem(c.GetString("CAT_CL_NOMBRE"),c.GetString("CAT_CL_CALLE"),c.GetString("CAT_CL_CODIGO")),i) + Next + c.Close + End If +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Private Sub b_carga_Click + trabajos = 0 + cmd.Initialize + cmd.Name = "select_cat_clientes_INTMEXP" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "kmt_datos") + trabajos = trabajos + 1 + ProgressDialogShow ("Cargando") + Log(Starter.latitud & " " & Starter.longitud) + teclado.HideKeyboard + ruta = e_ruta.Text + l_ruta.Text = ruta + e_ruta.Text = "" +End Sub + +Sub CreateListItem(mostrar As String, mostrar1 As String, mostrar2 As String) As Panel + Dim p As B4XView = xui.CreatePanel("") + p.SetLayoutAnimated(0, 0, 0, 1, 220) + p.LoadLayout("datos_cliente") + p.Height= 60dip +' p.Width = clv_orden.GetBase.Width + nombrecliente.Text = mostrar + direccion.Text = mostrar1 + numerocliente.Text = mostrar2 + p_datosclie.Tag = mostrar2 +' cxc.Text = mostrar3 +' Log(p.Width) + Return p +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 = "kmt_datos" Then 'query tag + trabajos = trabajos - 1 + Starter.skmt.ExecNonQuery("delete from DATOS_CLIENTE") + Starter.skmt.ExecNonQuery("delete from HIST_PREGUNTAS") +' Starter.skmt.ExecNonQuery("delete from CARGA") + Starter.skmt.ExecNonQuery2("UPDATE CARGA SET CARGADO = '1' WHERE USUARIO = ?", Array As Object(B4XPages.MainPage.user)) + Starter.skmt.ExecNonQuery2("UPDATE CARGA SET RUTA = ? WHERE USUARIO = ?", Array As Object(ruta, B4XPages.MainPage.user)) + For Each records() As Object In result.Rows + Dim CAT_CL_CODIGO As String = records(result.Columns.Get("CAT_CL_CODIGO")) + Dim CAT_CL_RUTA As String = records(result.Columns.Get("CAT_CL_RUTA")) + Dim CAT_CL_NOMBRE As String = records(result.Columns.Get("CAT_CL_NOMBRE")) + Dim CAT_CL_ATIENDE1 As String = records(result.Columns.Get("CAT_CL_ATIENDE1")) + Dim CAT_CL_ATIENTE2 As String = records(result.Columns.Get("CAT_CL_ATIENTE2")) + Dim CAT_CL_TELEFONO As String = records(result.Columns.Get("CAT_CL_TELEFONO")) + Dim CAT_CL_EMAIL As String = records(result.Columns.Get("CAT_CL_EMAIL")) + Dim CAT_CL_CALLE As String = records(result.Columns.Get("CAT_CL_CALLE")) + Dim CAT_CL_NOEXT As String = records(result.Columns.Get("CAT_CL_NOEXT")) + Dim CAT_CL_NOINT As String = records(result.Columns.Get("CAT_CL_NOINT")) + Dim CAT_CL_CALLE1 As String = records(result.Columns.Get("CAT_CL_CALLE1")) + Dim CAT_CL_CALLE2 As String = records(result.Columns.Get("CAT_CL_CALLE2")) + Dim CAT_CL_COLONIA As String = records(result.Columns.Get("CAT_CL_COLONIA")) + Dim CAT_CL_MUNI As String = records(result.Columns.Get("CAT_CL_MUNI")) + Dim CAT_CL_EDO As String = records(result.Columns.Get("CAT_CL_EDO")) + Dim CAT_CL_CP As String = records(result.Columns.Get("CAT_CL_CP")) + Dim CAT_CL_LONG As String = records(result.Columns.Get("CAT_CL_LONG")) + Dim CAT_CL_LAT As String = records(result.Columns.Get("CAT_CL_LAT")) + Starter.skmt.ExecNonQuery2("INSERT INTO DATOS_CLIENTE(CAT_CL_CODIGO,CAT_CL_RUTA,CAT_CL_NOMBRE,CAT_CL_ATIENDE1,CAT_CL_ATIENTE2,CAT_CL_TELEFONO,CAT_CL_EMAIL,CAT_CL_CALLE,CAT_CL_NOEXT,CAT_CL_NOINT,CAT_CL_CALLE1,CAT_CL_CALLE2,CAT_CL_COLONIA,CAT_CL_MUNI,CAT_CL_EDO,CAT_CL_CP,CAT_CL_LONG,CAT_CL_LAT, ESTATUS) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object (CAT_CL_CODIGO, CAT_CL_RUTA, CAT_CL_NOMBRE, CAT_CL_ATIENDE1, CAT_CL_ATIENTE2, CAT_CL_TELEFONO, CAT_CL_EMAIL, CAT_CL_CALLE, CAT_CL_NOEXT, CAT_CL_NOINT, CAT_CL_CALLE1, CAT_CL_CALLE2, CAT_CL_COLONIA, CAT_CL_MUNI, CAT_CL_EDO, CAT_CL_CP, CAT_CL_LONG, CAT_CL_LAT,"0")) + Next + p_clientes.Visible = True + c=Starter.skmt.ExecQuery("select CAT_CL_NOMBRE, CAT_CL_CALLE, CAT_CL_CODIGO from DATOS_CLIENTE WHERE ESTATUS = '0' ORDER BY CAT_CL_CODIGO ") + CustomListView1.Clear + For i = 0 To c.RowCount - 1 + c.Position = i + CustomListView1.Add(CreateListItem(c.GetString("CAT_CL_NOMBRE"),c.GetString("CAT_CL_CALLE"),c.GetString("CAT_CL_CODIGO")),i) + Next + c.Close + End If + + End If + + If trabajos = 0 Then + ProgressDialogHide +' l_ruta.Text = e_ruta.Text +' e_ruta.Text = "" + p_clientes.Visible = True + End If + + End If +End Sub + + + +Private Sub p_datosclie_Click + + Dim index As Int = CustomListView1.GetItemFromView(Sender) + Dim pnl As B4XView = CustomListView1.GetPanel(index).GetView(0) + Private lb As Label = pnl.GetView(0) + Log(lb.Text) + + c = Starter.skmt.ExecQuery2("SELECT cuenta FROM CUENTAA WHERE cuenta = ?", Array As String (lb.Text)) + d = Starter.skmt.ExecQuery("SELECT asignado FROM CUENTAA") + c.Position = 0 + d.position = 0 + + If d.rowcount = 0 Then + Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?,?,?,?)", Array As Object(lb.Text,1,Starter.latitud,Starter.longitud)) + B4XPages.ShowPage ("cliente") + Log(Starter.latitud & Starter.longitud) + Log("1") + Else if c.RowCount = 0 And d.GetString("asignado") = 0 Then + Starter.skmt.ExecNonQuery("delete from CUENTAA") + Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?,?,?,?)", Array As Object(lb.Text,1,Starter.latitud,Starter.longitud)) + B4XPages.ShowPage ("cliente") + Log(Starter.latitud & Starter.longitud) + Log("2") + Else if c.RowCount = 0 And d.GetString("asignado") = "1" Then + MsgboxAsync("Tienes que hacer check out del cliente anterior","Atención") + Log("3") + Else if c.RowCount = 1 And d.GetString("asignado") = "1" Then + B4XPages.ShowPage ("cliente") + Log("4") + + End If + + c.Close + d.Close + +End Sub + diff --git a/B4A/CameraExClass2.bas b/B4A/CameraExClass2.bas new file mode 100644 index 0000000..bc84bf4 --- /dev/null +++ b/B4A/CameraExClass2.bas @@ -0,0 +1,399 @@ +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 + 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/camara.ai b/B4A/Files/camara.ai new file mode 100644 index 0000000..55a7f00 --- /dev/null +++ b/B4A/Files/camara.ai @@ -0,0 +1,338 @@ +%PDF-1.6 % +1 0 obj <>/OCGs[18 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + xmp.did:7fa98f89-b13d-164c-860f-c482f9fa880e + uuid:81f31a60-e036-410c-87fa-d0bced80e2f1 + xmp.did:7fa98f89-b13d-164c-860f-c482f9fa880e + proof:pdf + + + + EmbedByReference + + C:\Users\USUARIO\Desktop\intmex promotoria\Intmex-Promotoria\B4A\Files\camara.png + 0 + 0 + + + + + + + + C:\Users\USUARIO\Desktop\intmex promotoria\Intmex-Promotoria\B4A\Files\camara.png + 0 + 0 + + + + + + + + saved + xmp.iid:7fa98f89-b13d-164c-860f-c482f9fa880e + 2023-05-15T16:58:50-06:00 + Adobe Illustrator 25.4 (Windows) + / + + + + application/pdf + + + camara + + + Adobe Illustrator 25.4 (Windows) + 2023-05-15T16:58:52-05:00 + 2023-05-15T16:58:53-06:00 + 2023-05-15T16:58:53-06:00 + + + + 256 + 188 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAvAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FUHrGq2ek6ZdaleP6dtaRSTStRjRY0LtsoY9F7DJQgZEAdWMpACy+bvzM/5yS1W4vJLHyhL 9WtI6Uv+KSerVY2/uriDkvFuS9d+ubzS9mgC58/x3F1mfWkmovHbvzd5hu5jNcXfORurenEOgA6B R4ZshhiOQcI5JFR/xFrH/LR/wif804fDijjLv8Rax/y0f8In/NOPhxXjLv8AEWsf8tH/AAif804+ HFeMu/xFrH/LR/wif804+HFeMu/xFrH/AC0f8In/ADTj4cV4y7/EWsf8tH/CJ/zTj4cV4yvh80a7 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 + + + + 1 + True + False + + 55.329936 + 80.891720 + Millimeters + + + + Cyan + Magenta + Yellow + Black + + + + + + Grupo de muestras por defecto + 0 + + + + Document + AIRobin + Adobe PDF library 16.00 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 5 0 obj <>/Resources<>/ExtGState<>/ProcSet[/PDF/ImageC/ImageI]/Properties<>/XObject<>>>/Thumb 25 0 R/TrimBox[0.0 0.0 156.841 229.299]/Type/Page>> endobj 20 0 obj <>stream +HwVu6PprqV*w6PH/242PA sC =#c CSsC=CK3 hr.gK>W /P3@T +endstream endobj 21 0 obj <> endobj 25 0 obj <>stream +8;Xp,IAd0A%Nn.Si]n4\o/M[PU)^+X5dW7N&"("iX9r)MWX>aF=k26l(ofP\1=t-N +fZ;Hki\jOAA4XT\U(@;/!);-O,Q~> +endstream endobj 26 0 obj [/Indexed/DeviceRGB 255 27 0 R] endobj 27 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 24 0 obj <>stream +H P?=Vi@nV"c+h@P5X=upms0*]UM.`0Jʊ K/ymͺxnT/2QTf.h*Xz -.:> 'bâp>Yel`bxVhV;a$KbsX.7W rZec\v}uo'$l4Ej8'^<]jxl6†K `#ꂾoCvPM4!  +endstream endobj 22 0 obj [/Indexed/DeviceRGB 1 29 0 R] endobj 28 0 obj <>/Filter/FlateDecode/Height 87/Intent/RelativeColorimetric/Length 845/Name/X/Subtype/Image/Type/XObject/Width 120>>stream +Hԗ} + IJ  H@[GWJ=#$0 p6Å7_aW)r  bg 6Zrà w-jB,pn% .YBg4% Xa4 A!+Fj0َ]7>ᆠIh{^=n8kr'޻5FKc^S9rW3kgp@SY +YN1 vRT 1nJ٧Lp7?u-=nbv+T:]\pSϹ_47< zums :W>ϲ f稍N GgY+}~y@Zrs p~:7&SPڻλ<7̛<' | yuh=#]^%uVHan* dIEd5岆q?%"BcW-cgU~n뾄]NɵcMJ^*fh̍9iZynɑ$x g+a v0T?"U. +endstream endobj 29 0 obj <>stream +5 +endstream endobj 18 0 obj <> endobj 30 0 obj [/View/Design] endobj 31 0 obj <>>> endobj 23 0 obj <> endobj 8 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 24.0 +%%AI8_CreatorVersion: 25.4.1 +%%For: (DESARROLLOKMT) () +%%Title: (camara.png) +%%CreationDate: 5/15/2023 4:58 PM +%%Canvassize: 16383 +%%BoundingBox: 898 505 1019 593 +%%HiResBoundingBox: 898.11464968153 505.264331210194 1018.11464968153 592.264331210193 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%AI5_FileFormat 14.0 +%AI12_BuildNumber: 498 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Registro]) +%AI3_Cropmarks: 879.694267515925 434.114649681531 1036.53503184714 663.414012738853 +%AI3_TemplateBox: 959.5 540.5 959.5 540.5 +%AI3_TileBox: 672.454646019422 142.204364169176 1243.77465334364 955.32432304674 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 1 +%AI24_LargeCanvasScale: 1 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI17_Begin_Content_if_version_gt:24 4 +%AI10_OpenToVie: 29.4522292993643 761.554140127391 1.09027777777778 0 7995.2101910828 8404.73885350318 1608 932 26 0 0 50 91 0 0 0 1 1 0 1 1 0 1 +%AI17_Alternate_Content +%AI9_OpenToView: 29.4522292993643 761.554140127391 1.09027777777778 1608 932 26 0 0 50 91 0 0 0 1 1 0 1 1 0 1 +%AI17_End_Versioned_Content +%AI5_OpenViewLayers: 7 +%AI17_Begin_Content_if_version_gt:24 4 +%AI17_Alternate_Content +%AI17_End_Versioned_Content +%%PageOrigin:0 0 +%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MS +%%EndComments + +endstream endobj 16 0 obj <>stream +%AI24_ZStandard_Data(/Xd>0E@UUu0000B隐bGH}\?\  ǵSR0`:>  +n`/`~[M=&8z[AE>cXp+bmvvS|ݪ\5Vܒ/z;c1,"AM EqZ_C4\O9f1-2f{_,Ϯ6˚|lk&`e. [g9[a_`[noZZk5=@5hslv[<ۙK[۳VXg[۶t^op8h+άS!v9׸dnYs, X=\݅#n+Ϩ`E]2|ïE/gVdycE@r9 +5_| &[EclAg߶vۀ/h%MzfF1!\6[V@ ~c]_o-|˭Àk_{6koiS{lkѓ.0wa?finن5Yk]m mgCm xvga}Z3`[?Zא!l}smԾ Eۙuקz}c쐲Y"xIau9iN? % !AC4]XڢkAj56d8&A񾄐!Gz lXnIwk4rrTZ-ϨJ]zjb3ųAwխHE6VΛǭըFߵ} 8T_9Z$.E/^IF8"P}^:GA?v1:Fr$GR#,tD󱏠phc.rR$AȻGqH_|8X:"6nc\/Ps}۰ :E*+H.6vQ=wH%BQԟqUT_ήmês۸`o[v9Q\{nfewQ$9d81%w)!ZĀW#DZ x45s=$ȿTKnci߰E-DLG@gȒvZU#:8" ' ^[zgq|ѴH=Q#4Ϛ߳l\R$QxGiժkUi@`H;7#6.;%vo5]-ڴJt9Y:*S8ChqYd#Qx% +.p2:G(4NFg.gLI4GNF_'QQIT ynb9U1fV,G8X{h"n$C/$>P7'20D3L̤0!nD#}"QBvZM_Aﴛp»Qrp96_l,嗃[ ۼQ*U&Q,]K#%J@}}גDkL6~: ^WDgTf(ݷ(b0S",Slj G@Q`T#bL &'t|ޟ)X Y8Bj4+ [6'p2z~f'2(p> +9BK+'ϛYmkiR%V,TxL/%`IH scz룯SDoGPTЀ ԳМF9|LJ@BV@i5 hVDh40Cv88@1Y +U@*,D<$oXWpǧ"R9G(j(y/Ax07Wkx$ +o=ĶNF_$px 4"h $ BlBb`1t4=/VP+X +RI-HMHEwH?%A} +5 +Xc/I_ĉty*5ȘC /G Jd`=JĒ :?"%H!p,~;a1ڜtIl M%\=#>ǥLT< ҞHq+I$=m!#R°FCoި)ZhM:@Ӹ *Rkbx)r`HG"Zz0Qs;GŐ:3~JIg$jYN,h3bMŦLo b956g`u@66_׶hD gR{`d#J-> /&OL$Z *1]2)fYf +P0W(/z> ,/9Hi#n8XÐpIM(GsV7Iɞ,2 +&i B͹iMNh$EfWOEgp#D{Hq2z ,i|ADlQ!}"i".;~"YE%M0+8 Q(rNAH FO 'zGZ|Ke4VJ@r&G|FB.ޯn,{H) \jP /ig_@ gfY+S2" 5mY k>pۘ1A| z~pڍ;^oreI!4.y"<]6 ǭ͚ 6,>j[\Ay[3՚17fs r ~ my/=,{ k5Mݏ^|pν%Yt=m<׷< pX4X4XӴY׮_ m6 g/iw@fo?[f6Y3VcЦmsѼ0ssi8vAڀg6g-o8ewVYAv'-ho]Wn[rr8|aa51a6Z]~ 8]5P[8>5O-䱈:Zcz.ln5"SO0IBI<'HR۾^llimx66S<G(Tm @]Rop[t,,6dnr>|(u9tsܪbu +/&CY6753dUg2z4h־.FWeC\V"Dj4!Min,{9h*U|7!2Tj:ki(IȐ{3X҄ٿcIU筅`"rdFyFH !ÊЄf-}ۧz"6Pim"llalmc^QG\ +xͫ_fTl 1tH#OF;C4!, V?r6Ê!(8XJ//kCCj.Ɽy2Ekw!q~J`!H3]C6ޢ֛FR!a etD_/"k냌0HJ#5o冁ցx6-Հ4XE1f*Lƹhp׶e_" f"Rw mQpz'K?Hh +&QKh@Y516^q,^yqȔZBcBa9B#e2 @br%D՜jAzۆU#Nt(0QZ%ā\9-vg=9H=7y +1XD9^87>t48+YC @`l*9l}u}Ɛwլ&}V '-۬$-TUJxB+Ag7'q|R܄j4\Źhx\*??GX,#f,L y Rl'+wⶺ; s3%^L)^&ߐ' -hz: J`x8c9 6-1gfQ 4L mq$VRTxiR@v"( mG *C[[h)Z6$yfTd@TP&'R4+1d8qD2ts#D&h"f-(+8`b.'03}q\^9x].;&vWcYۼYYZ_TTS? O*IQhX9qTա1?D^Y,@@,YUJ9#wpx2*[հcIxu⡰=,\ VV ɄZ Hi1 ЈB<&M8|Sɳzf(MRLXA;,IXtkN^B@:/̛ eҟۼnN9YzfPUJvZ00DPZ (;TH$t8)7b4*0sCg&#P_jpɖ31$#fpFcbA`bDA '4jZr@JϺĐe9Y{ܓۼ׷󞨶ddIYd05HԠx!gj;O'W^ddI96K-8B!/j(BnGP1c %YmZ2`*0=Txpx p52 ##R#((6 zm׷J4x66Kȍ$FV0`ukW1)PԬ~"8H4 +:Bd!d*l +-XUvHf)£"<e'[6ޝ)Z[Йdt[=ĐC(jҦPiFYU3'2Q!0}aDL`bCOftmL,HeF"(M,݄#. FyvިJޥGL.LXmcO+'#apV\I)wz~ +y;]8hJs60>^<8w̬x-#? ~zN{hAm,^$BOT~3z@_+O 5/> P0`FV(Kz^!M/kopHksaH 34~=׻L Y +AY),izTǒg EHvcCfr2&Lud q50AG9C!m,x)j"ψ"MotmbGLHEBJ H\Z ŎKW^,S~yAX +Hs,~ Hӛ :iz 8AH@^~RO>&E L 廈4=y ,0b:]H4] +i +H2YxizZŊ!Mr=% W6y CXDЄC6)qX݈!M!=B?Ri. ڠTvŃ$oiz`wcT&e\yX$xq(qg-H)szsHn$#+>!6˽j}+3iCoV_!G(c+TkK8o%64uJ2(uMf:A0Ro#Y +,6J)d4GfC0m+:ڎ;!G*DQ T!Z@Bl,6KⵃOO9u^' [&Գ߂dN0 !rG(m. FIv?T1Lr)#%2RC#G(FMx{z+tS|h$VΡ:UnfK[?1PPLom^|B|UfI Z-N o〮^ߦ + Mc=(49 F )[Z.ẻ $DFPCq,VID$Pmm -D(_xE3@ᄠt?ɧ"v +Ha9B"H##XOdR.G(pG(\ b)9u*܁rMQ8kndx8pa(uTL9BpG((n?:PѩJQ1rY"" HU{P`؅FRC +210ɺ4PFQ32PѶ =^,t ؊d +(Jsmn@DWSpB*- [*Bd)PYY:p78ΪRp'`rAEIҁO>:jD(ց*Id~d#kvl>i< rLU 1\zƱs˂B.e?wc_N.޽54EV =w߆-W7Р^ťX4RM07YC,/mE6'Qk~OZ{ޑ'p,˝ A0q>{PP1,U y"23gB50;(+Cy5ZU0;oY,LV#/C +l +It_^LU+ּf)W ~&R}o|_لWak7jXc=Y-%MjWjl/L"KڋsMD9)|将r1%'m5梋i օXv/~K/jrYkm` wߍ ӫ){ݱU/`yJB^6.ぐ V,."%rzM2!.kTNG\Ϛ*thS QJxiR)a&= x=Z|:ZvGx<њ+bhj hfV::%zw֦ &Ţ;aIc7 -H'&N&V>4g7/sOH*~3Ƨݓ }lC%W +d<85_|q|zi7)4 䎇4@0lG8)].kؠ+l:D6*hlF2;LwmmCpؤ(4DVXmXPmrokXSs:H % W5Tܓ,98(ӌ5k$E`yqIHzJ0<„D#C#$={pIDAxweeyp0*w\3( 0_Q:ϠxNgv+[?}iQoj,`9(']=@@1N. jG:.0BFU‘y!Hځu@ 'Ǫ_b!Bl"E_ \z&f5dA~GmGlKbj}7ZWok@IMsK ncJgvjKeY\aZ qs*i=QЅ3XL}5ؙ#f>q-3MMYD{iM5WFq\shVE_mmCh HY<^<ͥĹ3hBV@B_-B,ݣ€>ƴ@%S7{0Mg~*_]aL`\./!i.pss%٣c =w&yDa,g׈>R,DMitc'PNVj!'?:;}BU\ӕ<`EP J۽ ӖN*6pnfNq6r{G7f @D`@f,&g?HlfRsk.N(p DTyߡ RY1!-t]oy?]AL^j[mb5Nw3.[JK ~@>xp>?6 -ZH}6TnhYkq jpz' Cٵǖ*- rDj@KbJXP)ïv@ +Gp+/Ix,9`^XZU?W +*Ȏ(2F큻9|@YXS@κ>5?@Pp~ zVKeNb4g1iFDmP3;pc/~SĆ34b@'P?侷^2~(;UB1"pBk`0e[DAGM;i;m" ᖕZըEP -Qaxݱ(mKw;`4TT"G +{cٖ*&2hPo(F $ D\D P!žs /jnwSЇxзc'mXֈG:Ƽ?#Z;8pE}IAAdѲ-7C 4pf/8,Pd-cRkxJR {A=59 (a-v "@( +G(^̈́@d pyOp 9!qӅ*IIvyTBt+y"^}.NPr +\#mY#Fo +|G `2\^v2#I1~t}\_~d!sS-H@ȞsT?RHpiO[{Aiɭ5'D8MqՆНLB&$s7EyeYXtQb +jWC"̹ /׉)d*CF@>["UAiW[/%Y)fw4: 7B ?j,+ TlDjni!Px=v cKpH2 @iG=4WPȄ4bDء+S_`-HY˭a:18Yv7)etѠlTxzJ{Y='Q|%:|#mYM]"DNr"a_Tg> ZpabҀx D2k6Kv^ɯotv!z*&KxC%kF !2]ưW~_X@q=~w_Xc ;0י|'V5r̠`lJԚR|J nAGDLK-SmI09D } +zixR?LM Z6)A~MM|&w9P1V瘨-Dby:Rsk̶eT/>1/ V{꾼L{WyĈT//?##2\qi)48K1OlhO:bs-aKi/Z0"1?XNwĩn%~g!b_I{1hzz6t_B 4pnnK.R6/7V2&>r4+!19*au>dW5\Տů ܮLI fbYMT[j*^v/93-(iF5T,|WQw!3> πBaQY3 ,|Ls3OR81Q8AKO7ـFʬNJ*)AXH]'(h6^*)H@5 ];6AJERV#%lEݗ4eLudS ?8Vh@.td(Q?+Te_4캁>jX^BB@ 8L (z +zQw%~n,a(W9$^=[Tt=`*bއD3WjE_]rE6zIUДkzG |Q6^;Jr/ ~sݓ0VaW>nEJ8(279'4}AEfK?;O@oֶ5a3vIu/ӓ]F6C/)gqDjXR+J֮̈Z2Q%HZhV2QY"DB,hr.˗]z?[%Qcb.a4@b΢4maz\NN +1^`%Q.י-RcQ3đ6 ĭ*_q2*쥺}8FL}03~41)>>X'/uFMjb@YTVȸhRqy\4WPVְW﵉IsO?hȗs/@BŤ-yoIl "D+OT'RZf\*q͹?,#9t:j"9kM%@d D=O2K ](PBՑ(>34H$ +Ldz3K +OYB}b}‚,:mP#2Tfѝa[sU+ICȪbJ3> &AtOQm[513xL/}9RSDO-)0R@Su t\k.G~j<"^(>]s2֑Ul1&e^JN)?Τ DZl7cFoL9&Y]zg/,WKgZ`!A-"dQTI@mj.AqMKj=#ʆ 7;…Ki0Q .,ˉ,mTsb%(q6x YI;̨6uMxW֏PG 6&=XbFbԜ(Y|>up5M'59/h: +)o^ rO".s}кXAj>5:0u4ѕ+M}i5 >)k!\m-3ʨM|7m@3E}@e Nqg@֑(h&VCGk3LP;1~b^G1ïMeiV#I + 6!>>Qp#ClENQoHM ue)!~I!޽hF?Qov&bX}aa@ϡ|{]!V4L» gbB`'ftez`,;vJZLJE*L*Ş\=ʺ+0P6.1ZL}3>x d}] а|8䟊<%҂H׊{GsPE3KmkŸլtNJ" .OʳŘY̭iw (k +Iǹt8΅Gj>DhC% y.DɰM N +7 +x\Z0ժY*]sBCF()8p B?gmLԵS˶L*`fb屠TFuTς8! +_q5p5* s͞ȚJU F0Y?`[SϿA_и,x-&L0dóN ckǥ@R!tzsyXp88ĩȺG Uԥ9w DpCqjH#K 4-QQJcw9:<{@NWsP2*osE_xa]4VB_9vu M(cT6I2* +ָҿI+uuzh+4*^*k&] C`F8ebm_,VbJl ǁ s>bHXur&I2׾GKde]NYT3J4-ԍB[Tɶ[[k߇˛ 8{>6&Wo&LDb:nMPKorA"#,Ӏ7Wp<x:]BBsJ{ފ{O"~hs O 7&^AUjH٦[ucOy--m7l0,Rm,2瓅l鬇 .^&6X^%zÀer0 ` >i w+ (=2{+MI;Wj$Rh ҼYU(7rX|EAàw`Z=R.1~:q 1|npSV9( Iwv]7(9 Z,X^pvYJ(C "nj _+ShF9 R3 o>wyVceT`x4_lӋLńCEm%| +{z:iXXT&MW@*)L,]d*FpjvPOi{i0NHۦ\c}}?4[0(L+E'B#ρ."4{* TP# +ΰcW47b(Q"XIOyb㊠dHQp*xV5& +TZǂ +</@ԛ@(U7ЊI"ΰc)]Zo&Xw-`kA + +`0J4~.J~<nx]M if䯮7&!*7$VE)0ʱ&M0Y@75+D.C|@v%'iܽ$a޸t~c 招F-cߡoy^dژ=EAd 5 HR WT5޻Z<,%BӖt!s][zEUAL$R4.qO5!Eb;3Riwޖ N/LPI_} 5]߾Z)P39r\,3&O3UƁuk5翽Oɢ2:I&JjpGZrI=yלv'M#hai觊\3)k)')̞ W3.»*_,G -J|ml`gd> dicaNҨ|}QBsI{}~|!}dpps}a% SL#i$B~bkV)1 <|Tm,C# "'186PqxԾW(m Z )9,88mx˂ =ru{0*m5 /et|`HtPl~m;1ع$rnXr%tR4"U"4<18!\ES 0Wu$ +|h*d+ We +kLX*|(jVԯpxŏh>bPr@x6A_?_I4s[ ƪkEI|7֛)B}c "CEQϐ1k85.V_̵egž55Fbaxfː*c(5\'4,17 %0ZVʷy43I< _2 t]O֝Кgn<D +&=מRdOR0 Y{!^Z]ۂ +li\$l%G?Ty' +<؏ʰ EB 6?}MfB?ᩥ |4{7{gqqJ+xcM1/޴uPxSwrJxZSY{]9n/CB!Zdo)Y.|”\(g"3g-'k8T]-7PNRLwHyĀ_((?Js!o? 62@!MCq5˄dbji,XG6 =@7h'Y 8%k, @Ûjr*s2_CZѪ8F>?!C>*dʳV;200I +'nL-=:(\_Ca,Ei~ eV'ȎW/5w/zq%qG@bn{M(xgJU~ybs?~dIp8㑥$BTõ%,^$h3kt' g [ kphX#as04;mj:]Ulf`IMBĢxHU>Hh՜MXꟛǻUJNpJAr{'fetJpt 4cvwV7H 5g] \Iȝ f냢݌DONwRRܾ AGI|&qLt;`p _Lа\,E,f̓iٺp+r>lyQCpۢHS;ܥyam + N80c$N綄/R`XZWӭ~%--u㵈nZ/#"h5GЏfD)hyyp6 wY&}qg7Qg%V>IIYF$}s &Z_S#k"W+P|h >Q@9U| : _z !J[;HJ uΠ%=5I  + %(ZB#IDlV4, 6^>HK@a ]Uo]ć`@Q¢yVP+$QTjb]Y F9Ocmٰm8nP{1u#hխ=;.vn ܦϤ?ʟFnq)s{/ xJ$OOϒX\Y9K ?YҁK\~T "P@~ttHvz}=I_͌VJuq3׼蓦-mhxՐSpfh[dh\BNd"_6tk>7=N }$ӀJcTVFiP D~)2\&FDЁ"C!B;c sGC|k>g9TifޖAep04LŒ)`@hNo^>"ǕDcD837$W6yrk̼]9ssnFmn2ɣ'OO I1rzDXM؝2£{;l6 +CA4w憼N >Sp8\eߺm6ԗ}TYhxC%8MP2u¤",57Ek!eZf7FV.PsOwP" )d7rˌ(6'>{gFoc +6牪%cjcbo,r">ebDGۮ8-&xu M^Hvyo48o#g |S)^?1cqX8T|<otfWؼI4'H&]& hY%D4Jb;_gE5?2U&+Fp a~ =UX Q3Wf ,_QD;>cn3Sn@տ&S\'U(mp:`E +TnRn~c?@gN]b3+V(Y3$P$AHb-D Mx./utYADsLܖAcd8uʊi I;Z:a]#ד$A,Y^X۷MPh +]C=AS.,Nb|Qfȅ9. r:)Y#KۉŃXqk5x*p)x :p%0|@n!*iZB!N9 wڔ$рj#k^+̉cb7%fc%QRiOnI9T/JCt>&" w\@Sݑi]Bn܉j7K{C +¯u 1u/ Vty F!`8g¶fEJZ\zKU)QX+XKGՐ\a +{ߟd!t6 Uwg3i+z&:z7"WW[ddaM RݬXtSRE#=PVJ3+ÿ30%$Eb^f׈ٚE> ɟ J0z PI>1,BRl535pPE7l +9# WN!RNV TH:U`I'Û. hX|3eyR{hcV $L q͎k'^˵W)<Աx(A\۽wGHoǭ@v#88v2ܫZqnf SU_ZxᖂXc@oIBc\ #787x۩6"xГ1'n ю-0O8ir;>19H`PoW1pיug^﹒ʷa9dMXK!)7\ɫ7/ \OvZm @v/Sij_ 3;b.kV:)#4i9e L*0Aalց&Rg1ÞJ$r*@Rp $1#lRe2:B9 V D7i5Vt".xWnqrsH>~JC2GۄLP.ޫ28<߬*ea[i/;֤ S; LppVf˹*pT[8FF֏+2b CxkfwJ0qWailX6T6G"ЫR~##xvD ǖ2lŬ2be\J|u̹ Lj0(lzq-=w3g>rhum.t҈)my|tiZUf-u&V( f6.+E{;2OK?]UPAÇd]DD cd"'Qf5sBF%}ɆhuqUHڹ~,{.aX cu:l;DM`EٺOiUPY`:0P焈-i|,gr l}c@?n]~%J=H'THIlUE?&) ~Zf9w+S YdPxdaZ ا1;HL1|:e^E__xO5{u~ O铠v +C'%e"E[^bP;BuHWk:XzH: D } +ziLn?(KeipnBe6330+EP)Y_k?L!':uiߥG5!1  +cbC)qDg8%9*5'-L7:B$lA?sYOxjxXI\SrG<~\y-2vCz)Y?XXI,]-_8?Z't)OmzJGRC)C65h4"ESa(}PTh4c u?ۃW><`}֤&10}B=e|wQMV 4Q}`2&tW-?V6ZK*TS@ +.f +YzC}z$Y"8ʭ[sHF˻ ֕h [#EZq.S$XT,ł [2ȁM.b(8>8+5sblvm B. +nSC% G:5זZ60}G=`OrcȾ "+T\UlDodD?VG$vFڅ j4L^J0tx.V %'E3gk]Y yb&SB?Kae5%49}m?e;`مܟ,N+m5fda3Ձ 8ݵ2E1^C}o*'Ve@UK*_`A:%ӎe~Aꊍn.T땼b!AGqW"$-bVᯧ:H}3sX>bV$θ`~^<,o0zoMUűP͔ k*Fcw_?)8}8;m˴>3dkJ@fCGAۂ4 ?[sfX ݨ]m ogӄe_?&⚙?e}̏l-#k[_MTOhĘb PEzwu0ԛOGMە8V?^ e%V X8a2ruF7Pof耥oFG!s *Fׯ?3 [kqFw?8i:fwT$KA l~Z!(-vW3i*SpJYCovɺ`a`f?$xxF7=@L;u6mbf1e334OSϫwoo獿٫>RH[USUی=-gcCZW5aտi+)kT N7J݇a\4cݝr)Ao1 0c, +,88xx4 +0N,Xc W-%X>6)ϖ#v7i + XXx#&(ʣDԋ8 z\%@y{cx00XEf,@R8[EBID81x﹂X•F3I*1 Bs2$I:@@0GS 000 b!ccjc@fڤ0'eDLa-,\ +dN@Z؟VBT?ͪd9i)mSp꜠ѭZFNnT +s)ʡ#iRhtRwQÛ`,8tb|aB[X2+Oɵ1͆T!%7íWqٿ1D2` !A!;%鸏;Q|bKƱ;rm!% Rp~-oۚ3jj$?жyl &F7s}D# ŪZ:R / oN +$-A8W:ph0TbywVrZk,Œ[1OtYdϩ^A[CE +ҙi"'< v v&`vߖfp!f%k5D* K,L̸rd薖! <a)#-qkXpG Vrk Ply{[9 +2w8=FJ^54H]:&t!G 6uPXRoeOX2H s-^ #!v@dI7a*+ A E*ɕ\>6Scl}R3xhYuY^GiYH %19. {$P1BE t7,+YN芋,"2[F+B)OrU)Bry[3cL.g(,@*.D*#&,I!$9:S6HncE$,aKL{T#*S +endstream endobj 19 0 obj [18 0 R] endobj 32 0 obj <> endobj xref +0 33 +0000000004 65535 f +0000000016 00000 n +0000000147 00000 n +0000020814 00000 n +0000000000 00000 f +0000020865 00000 n +0000000000 00000 f +0000000000 00000 f +0000024373 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000024446 00000 n +0000024587 00000 n +0000026234 00000 n +0000000000 00000 f +0000024074 00000 n +0000053333 00000 n +0000021334 00000 n +0000021484 00000 n +0000022879 00000 n +0000024260 00000 n +0000022347 00000 n +0000021549 00000 n +0000021785 00000 n +0000021833 00000 n +0000022925 00000 n +0000024019 00000 n +0000024144 00000 n +0000024175 00000 n +0000053358 00000 n +trailer +<<4F5C75E2F9A2A24EA4C46AE752741457>]>> +startxref +53542 +%%EOF diff --git a/B4A/Files/camara.png b/B4A/Files/camara.png new file mode 100644 index 0000000..b774c7c Binary files /dev/null and b/B4A/Files/camara.png differ diff --git a/B4A/Files/camara1.png b/B4A/Files/camara1.png new file mode 100644 index 0000000..1b2b980 Binary files /dev/null and b/B4A/Files/camara1.png differ diff --git a/B4A/Files/candado.png b/B4A/Files/candado.png new file mode 100644 index 0000000..8122600 Binary files /dev/null and b/B4A/Files/candado.png differ diff --git a/B4A/Files/cliente.bal b/B4A/Files/cliente.bal new file mode 100644 index 0000000..fb18d12 Binary files /dev/null and b/B4A/Files/cliente.bal differ diff --git a/B4A/Files/datos_cliente.bal b/B4A/Files/datos_cliente.bal new file mode 100644 index 0000000..4986975 Binary files /dev/null and b/B4A/Files/datos_cliente.bal differ diff --git a/B4A/Files/fondo.png b/B4A/Files/fondo.png new file mode 100644 index 0000000..c67c967 Binary files /dev/null and b/B4A/Files/fondo.png differ diff --git a/B4A/Files/icon_22-[convertido].png b/B4A/Files/icon_22-[convertido].png new file mode 100644 index 0000000..6a82555 Binary files /dev/null and b/B4A/Files/icon_22-[convertido].png differ diff --git a/B4A/Files/kmt.db b/B4A/Files/kmt.db new file mode 100644 index 0000000..2cbbb8e Binary files /dev/null and b/B4A/Files/kmt.db differ diff --git a/B4A/Files/logointmex.jpg b/B4A/Files/logointmex.jpg new file mode 100644 index 0000000..013fbb7 Binary files /dev/null and b/B4A/Files/logointmex.jpg differ diff --git a/B4A/Files/mainpage.bal b/B4A/Files/mainpage.bal new file mode 100644 index 0000000..e8c0e17 Binary files /dev/null and b/B4A/Files/mainpage.bal differ diff --git a/B4A/Files/p_cuest.bal b/B4A/Files/p_cuest.bal new file mode 100644 index 0000000..f085ef8 Binary files /dev/null and b/B4A/Files/p_cuest.bal differ diff --git a/B4A/Files/principal.bal b/B4A/Files/principal.bal new file mode 100644 index 0000000..0b5f12e Binary files /dev/null and b/B4A/Files/principal.bal differ diff --git a/B4A/Files/usuario.png b/B4A/Files/usuario.png new file mode 100644 index 0000000..2935f41 Binary files /dev/null and b/B4A/Files/usuario.png differ diff --git a/B4A/Intmex-Promotoria.b4a b/B4A/Intmex-Promotoria.b4a new file mode 100644 index 0000000..6ec9aed --- /dev/null +++ b/B4A/Intmex-Promotoria.b4a @@ -0,0 +1,131 @@ +Build1=Default,intmex_preenta.keymon +File1=camara.png +File10=p_cuest.bal +File11=principal.bal +File12=usuario.png +File2=camara1.png +File3=candado.png +File4=cliente.bal +File5=datos_cliente.bal +File6=fondo.png +File7=Icon_22-[Convertido].png +File8=logointmex.jpg +File9=MainPage.bal +FileGroup1=Default Group +FileGroup10=Default Group +FileGroup11=Default Group +FileGroup12=Default Group +FileGroup2=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=okhttputils2 +Library11=phone +Library12=randomaccessfile +Library13=reflection +Library14=runtimepermissions +Library15=sql +Library16=stringutils +Library17=xcustomlistview +Library18=xui +Library19=xui views +Library2=b4xpages +Library20=fusedlocationprovider +Library3=bctoast +Library4=byteconverter +Library5=camera +Library6=compressstrings +Library7=core +Library8=gps +Library9=ime +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. +Module1=|relative|..\B4XMainPage +Module2=C_cliente +Module3=C_principal +Module4=CameraExClass2 +Module5=DBRequestManager +Module6=Starter +Module7=Subs +Module8=Tracker +NumberOfFiles=12 +NumberOfLibraries=20 +NumberOfModules=8 +Version=11.5 +@EndOfDesignText@ +#Region Project Attributes + #AdditionalJar: com.android.support:support-v4 + #AdditionalJar: com.google.android.gms:play-services-location + #ApplicationLabel: INTMEX Promotoria + #VersionCode: 1 + #VersionName: + 'SupportedOrientations possible values: unspecified, landscape or portrait. + #SupportedOrientations: portrait + #CanInstallToExternalStorage: False +#End Region + +#Region Activity Attributes + #FullScreen: False + #IncludeTitle: False +#End Region + +'#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/Starter.bas b/B4A/Starter.bas new file mode 100644 index 0000000..a80bbb1 --- /dev/null +++ b/B4A/Starter.bas @@ -0,0 +1,52 @@ +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:1787" '"http://keymon.lat:1782" "http://10.0.0.205:1782" "http://keymon.lat:1783" "http://11.0.0.48:1783" ""' CAMBIAR HACIA AFUERA O DENTRO DE LA OFNA +' Dim server As String = "http://10.0.0.205:1782" + Dim rutaBD As String = File.DirInternal + Dim skmt As SQL + Dim almacen As String + Dim GPS As GPS + Public rp As RuntimePermissions + Public FLP As FusedLocationProvider + Private flpStarted As Boolean + Dim latitud As Double = 0 + Dim longitud As Double = 0 + Dim ubicacionActual As Location +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. + GPS.Initialize("GPS") + 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. +End Sub + +Sub Service_Destroy + +End Sub + \ No newline at end of file diff --git a/B4A/Subs.bas b/B4A/Subs.bas new file mode 100644 index 0000000..0c53795 --- /dev/null +++ b/B4A/Subs.bas @@ -0,0 +1,26 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=StaticCode +Version=11.5 +@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 + +'Revisa que exista la BD y si es necesario crea algunas tablas dentro de ella +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 DATOS_CLIENTE(CAT_CL_CODIGO TEXT, CAT_CL_RUTA TEXT, CAT_CL_NOMBRE TEXT, CAT_CL_ATIENDE1 TEXT, CAT_CL_ATIENTE2 TEXT, CAT_CL_TELEFONO TEXT, CAT_CL_EMAIL TEXT, CAT_CL_CALLE TEXT, CAT_CL_NOEXT TEXT, CAT_CL_NOINT TEXT, CAT_CL_CALLE1 TEXT, CAT_CL_CALLE2 TEXT, CAT_CL_COLONIA TEXT, CAT_CL_MUNI TEXT, CAT_CL_EDO TEXT, CAT_CL_CP TEXT, CAT_CL_LONG TEXT, CAT_CL_LAT TEXT, ESTATUS TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CUENTAA (cuenta text, asignado text, latitud text, longitud text)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_PREGUNTAS(CLIENTE TEXT, CATEGORIA TEXT, PREGUNTA1 TEXT, COMENTARIOS TEXT, NOMBRE_FOTO TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CARGA(USUARIO TEXT, CONTRASEÑA TEXT,RUTA TEXT, CARGADO TEXT)") +' Starter.skmt.ExecNonQuery("DROP TABLE IF EXISTS DATOS_CLIENTE") +' Starter.skmt.ExecNonQuery("DROP TABLE IF EXISTS CUENTAA") +' Starter.skmt.ExecNonQuery("DROP TABLE IF EXISTS HIST_PREGUNTAS") +' Starter.skmt.ExecNonQuery("DROP TABLE IF EXISTS CARGA") +End Sub \ No newline at end of file diff --git a/B4A/Tracker.bas b/B4A/Tracker.bas new file mode 100644 index 0000000..e542b09 --- /dev/null +++ b/B4A/Tracker.bas @@ -0,0 +1,218 @@ +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 = true +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("Kelloggs", "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 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 + + '/////// para la ultima ubicacion FL + Dim sDate,sTime As String + DateTime.DateFormat = "MM/dd/yyyy" + 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 + + +End Sub + +Sub CreateNotification (Body As String) As Notification 'ignore + Dim notification As Notification + notification.Initialize2(notification.IMPORTANCE_LOW) + notification.Icon = "icon" + notification.SetInfo("This", 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/B4XMainPage.bas b/B4XMainPage.bas new file mode 100644 index 0000000..a4a66ea --- /dev/null +++ b/B4XMainPage.bas @@ -0,0 +1,142 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=9.85 +@EndOfDesignText@ +#Region Shared Files +'#CustomBuildAction: folders ready, %WINDIR%\System32\Robocopy.exe,"..\..\Shared Files" "..\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=..\..\gitpull.bat +'########################################################################################################### +'###################### PUSH ############################################################# +'Ctrl + click ide://run?file=%WINDIR%\System32\cmd.exe&Args=/c&Args=github&Args=..\..\ +'########################################################################################################### +#End Region + +'Ctrl + click to export as zip: ide://run?File=%B4X%\Zipper.jar&Args=Project.zip + +Sub Class_Globals + Private Root As B4XView + Private xui As XUI + Private b_iniciar As Button + Private Usuario As EditText + Private Contraseña As EditText + Dim reqManager As DBRequestManager + Dim user As String + + Dim principal As C_principal + Dim cliente As C_cliente + Dim user As String + Dim password As String + Dim e As Cursor +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") + reqManager.Initialize(Me, Starter.DBReqServer) + principal.Initialize + B4XPages.AddPage("principal", principal) + cliente.Initialize + B4XPages.AddPage("cliente", cliente) + 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 + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_ACCESS_COARSE_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) + +' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_READ_EXTERNAL_STORAGE) +' Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) +' If Result Then +' Log("conpermisos para escritura") +' Else +' ToastMessageShow("No permission!!!", True) +' End If +' +' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_WRITE_EXTERNAL_STORAGE) +' Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) +' If Result Then +' Log("conpermisos para escritura") +' Else +' ToastMessageShow("No permission!!!", True) +' End If + + Log("inicio1") + StartService(Tracker) +End Sub + +Sub B4XPage_Appear +End Sub + + +Private Sub b_iniciar_Click + + If Usuario.Text <> "" Then + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_usuario_INTMEXP" + cmd.Parameters = Array As Object(Usuario.Text, Contraseña.Text) + reqManager.ExecuteQuery(cmd , 0, "usuario") + user = Usuario.Text + End If + e = Starter.skmt.ExecQuery2("SELECT USUARIO FROM CARGA WHERE USUARIO = ?", Array As String(B4XPages.MainPage.user)) + e.Position = 0 + If e.RowCount = 0 Then + Starter.skmt.ExecNonQuery2("INSERT INTO CARGA (USUARIO, CARGADO)VALUES(?, ?)",Array As String(B4XPages.MainPage.user,0)) + 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")) + user = Usuario.Text + password = Contraseña.Text + B4XPages.ShowPage ("Principal") + Log(Starter.almacen) + Else + ToastMessageShow ("Datos incorrectos",True) + End If + Next + If result.Rows.Size = 0 Then + ToastMessageShow ("Datos incorrectos",True) + End If + End If + + End If + End If +End Sub \ No newline at end of file diff --git a/camara.png b/camara.png new file mode 100644 index 0000000..b774c7c Binary files /dev/null and b/camara.png differ diff --git a/fondo.png b/fondo.png new file mode 100644 index 0000000..c67c967 Binary files /dev/null and b/fondo.png differ 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 diff --git a/logointmex.jpg b/logointmex.jpg new file mode 100644 index 0000000..013fbb7 Binary files /dev/null and b/logointmex.jpg differ