From 2f3449e347f4fab195efe91b04d08d8d195c0d4a Mon Sep 17 00:00:00 2001 From: cvaldes1201 Date: Tue, 10 Mar 2026 10:47:09 -0600 Subject: [PATCH] 6.02.16 --- .gitattributes | 16 + .gitignore | 2 + B4A/B4XMainPage.bas | 2382 +++++ B4A/B4XUpdateAvailable.bas | 24 + B4A/BatteryUtilities.bas | 125 + B4A/C_Buscar.bas | 109 + B4A/C_Cheklist.bas | 800 ++ B4A/C_Cliente.bas | 7764 +++++++++++++++++ B4A/C_Clientes.bas | 850 ++ B4A/C_DetalleVenta.bas | 1378 +++ B4A/C_Detalle_Promo.bas | 112 + B4A/C_Foto.bas | 167 + B4A/C_Historico.bas | 609 ++ B4A/C_Mapas.bas | 24 + B4A/C_NoVenta.bas | 442 + B4A/C_NuevoCliente.bas | 24 + B4A/C_Pedidos.bas | 24 + B4A/C_Principal.bas | 3816 ++++++++ B4A/C_Productos.bas | 1108 +++ B4A/C_TicketsDia.bas | 24 + B4A/C_UpdateAvailable.bas | 74 + B4A/C_tabulador.bas | 134 + B4A/CameraExClass.bas | 290 + B4A/DBRequestManager.bas | 272 + B4A/EscPosPrinter.bas | 1158 +++ B4A/Files/alert2.png | Bin 0 -> 632 bytes B4A/Files/alerta.jpg | Bin 0 -> 1459 bytes B4A/Files/atras.png | Bin 0 -> 3208 bytes B4A/Files/atras1.png | Bin 0 -> 6372 bytes B4A/Files/buscar.bal | Bin 0 -> 2653 bytes B4A/Files/calificarcliente.png | Bin 0 -> 15744 bytes B4A/Files/check.bal | Bin 0 -> 44953 bytes B4A/Files/checklist.bal | Bin 0 -> 3088 bytes B4A/Files/cliente.bal | Bin 0 -> 57737 bytes B4A/Files/clienteblanco.png | Bin 0 -> 4737 bytes B4A/Files/clientes.bal | Bin 0 -> 8354 bytes B4A/Files/clientes_visitados.jpg | Bin 0 -> 24466 bytes B4A/Files/clientes_visitados.png | Bin 0 -> 4886 bytes B4A/Files/comentario.png | Bin 0 -> 2943 bytes B4A/Files/contrasena.png | Bin 0 -> 293 bytes B4A/Files/datoscliente.bal | Bin 0 -> 3719 bytes B4A/Files/dbc.png | Bin 0 -> 53433 bytes B4A/Files/derecha.png | Bin 0 -> 8551 bytes B4A/Files/derecha1.png | Bin 0 -> 5956 bytes B4A/Files/detalle_promo.bal | Bin 0 -> 2747 bytes B4A/Files/detalleventa.bal | Bin 0 -> 9210 bytes B4A/Files/dulce.png | Bin 0 -> 4237 bytes B4A/Files/durakelo1.png | Bin 0 -> 5896 bytes B4A/Files/engrane.jpg | Bin 0 -> 4132 bytes B4A/Files/engrane1.png | Bin 0 -> 2346 bytes B4A/Files/folioabono.bal | Bin 0 -> 3404 bytes B4A/Files/fondo_kmt.jpg | Bin 0 -> 33689 bytes B4A/Files/foto.bal | Bin 0 -> 2561 bytes B4A/Files/frintal.png | Bin 0 -> 3236 bytes B4A/Files/frontal1.gif | Bin 0 -> 5004 bytes B4A/Files/frontal1.png | Bin 0 -> 7491 bytes B4A/Files/guardagestion.bal | Bin 0 -> 13086 bytes B4A/Files/guna_viejo.png | Bin 0 -> 20988 bytes B4A/Files/guna_viejo2.png | Bin 0 -> 3543 bytes B4A/Files/historico.bal | Bin 0 -> 7732 bytes B4A/Files/images.png | Bin 0 -> 4960 bytes B4A/Files/infonavit1.jpg | Bin 0 -> 30576 bytes B4A/Files/intmex_logo_192x192.jpg | Bin 0 -> 8284 bytes B4A/Files/intmex_logo_192x192.png | Bin 0 -> 8284 bytes B4A/Files/inventarios.jpg | Bin 0 -> 5639 bytes B4A/Files/inventarios.png | Bin 0 -> 1209 bytes B4A/Files/itembuttonblue.png | Bin 0 -> 2647 bytes B4A/Files/izquierda.png | Bin 0 -> 8613 bytes B4A/Files/izquierda1.png | Bin 0 -> 6486 bytes B4A/Files/kelloggs.png | Bin 0 -> 4718 bytes B4A/Files/keymon_logo.png | Bin 0 -> 10983 bytes B4A/Files/kmt.db | Bin 0 -> 40960 bytes B4A/Files/kmt2.db | Bin 0 -> 2891776 bytes B4A/Files/kmt3.db | Bin 0 -> 2279424 bytes B4A/Files/login.bal | Bin 0 -> 32471 bytes B4A/Files/logo sanfer.jpg | Bin 0 -> 7991 bytes B4A/Files/logo-guna-18.jpg | Bin 0 -> 92595 bytes B4A/Files/logo-guna-18.png | Bin 0 -> 31580 bytes B4A/Files/logo-guna-blanco.png | Bin 0 -> 2760 bytes B4A/Files/logo-guna-contorno.png | Bin 0 -> 5355 bytes B4A/Files/logo_exitus1.jpg | Bin 0 -> 30576 bytes B4A/Files/logo_mariana.jpg | Bin 0 -> 7295 bytes B4A/Files/mainpage.bal | Bin 0 -> 1584 bytes B4A/Files/malo.jpg | Bin 0 -> 8764 bytes B4A/Files/mapa.bal | Bin 0 -> 3090 bytes B4A/Files/mapa_cliente.bal | Bin 0 -> 5212 bytes B4A/Files/mapa_rutas.bal | Bin 0 -> 6377 bytes B4A/Files/mariana.jpg | Bin 0 -> 32700 bytes B4A/Files/mariana_logo_192x192.jpg | Bin 0 -> 6004 bytes B4A/Files/marker-amarillo.png | Bin 0 -> 894 bytes B4A/Files/marker-azul.png | Bin 0 -> 4374 bytes B4A/Files/marker-azul1.png | Bin 0 -> 3496 bytes B4A/Files/marker-azul2.png | Bin 0 -> 3390 bytes B4A/Files/marker-azul3.png | Bin 0 -> 3916 bytes B4A/Files/marker-azul4.png | Bin 0 -> 3867 bytes B4A/Files/marker-azul5.png | Bin 0 -> 2652 bytes B4A/Files/marker-rojo.png | Bin 0 -> 2488 bytes B4A/Files/marker-rojo1.png | Bin 0 -> 4356 bytes B4A/Files/marker-rojo2.png | Bin 0 -> 3844 bytes B4A/Files/marker-verde.png | Bin 0 -> 4135 bytes B4A/Files/no_venta.bal | Bin 0 -> 10109 bytes B4A/Files/nuevocliente.bal | Bin 0 -> 3261 bytes B4A/Files/panel_pick_ciego.bal | Bin 0 -> 2599 bytes B4A/Files/pedido.bal | Bin 0 -> 11335 bytes B4A/Files/planfia_logo.png | Bin 0 -> 22355 bytes B4A/Files/planfia_logo_old.png | Bin 0 -> 34019 bytes B4A/Files/planfia_logo_old2.png | Bin 0 -> 40821 bytes B4A/Files/principal.bal | Bin 0 -> 44212 bytes B4A/Files/proditem.bal | Bin 0 -> 5136 bytes B4A/Files/proditem2.bal | Bin 0 -> 8275 bytes B4A/Files/productos.bal | Bin 0 -> 21448 bytes B4A/Files/profina.jpg | Bin 0 -> 4738 bytes B4A/Files/profina.png | Bin 0 -> 5080 bytes B4A/Files/rechazos.jpg | Bin 0 -> 17491 bytes B4A/Files/rechazos.png | Bin 0 -> 3040 bytes B4A/Files/rechazosblanco.png | Bin 0 -> 3239 bytes B4A/Files/sync.png | Bin 0 -> 763 bytes B4A/Files/tabulador.bal | Bin 0 -> 18960 bytes B4A/Files/tabulador.jpg | Bin 0 -> 22722 bytes B4A/Files/tabulador.png | Bin 0 -> 4933 bytes B4A/Files/tabuladorblanco.png | Bin 0 -> 5288 bytes B4A/Files/telefonos.bal | Bin 0 -> 8167 bytes B4A/Files/ubicacionblanco.png | Bin 0 -> 4572 bytes B4A/Files/ubicar_clientes.jpg | Bin 0 -> 25095 bytes B4A/Files/ubicarcliente.png | Bin 0 -> 4181 bytes B4A/Files/usuario.png | Bin 0 -> 295 bytes ...und-design-abstract-geometric_22231666.jpg | Bin 0 -> 149923 bytes B4A/Files/visitaazul.png | Bin 0 -> 5234 bytes B4A/Files/visitaazul1.png | Bin 0 -> 5233 bytes B4A/Files/visitadosblanco.png | Bin 0 -> 5169 bytes B4A/Intmex_Reparto.b4a.meta | 96 + B4A/MAPA_CLIENTE.bas | 115 + B4A/MAPA_RUTAS.bas | 432 + B4A/ManageExternalStorage.bas | 81 + B4A/Mariana_Reparto.b4a.meta | 96 + B4A/Marquez_Reparto.b4a.meta | 96 + B4A/Mazapa_Reparto.b4a.meta | 96 + B4A/QRGenerator.bas | 491 ++ B4A/Starter.bas | 178 + B4A/Subs.bas | 1173 +++ B4A/Tracker.bas | 331 + B4A/appUpdater.bas | 284 + B4A/barcodeGenerator.bas | 710 ++ B4A/cheklist.bas | 24 + B4A/foto.bas | 190 + B4A/guna_reparto.b4a | 329 + B4A/guna_reparto.b4a.meta | 102 + README.md | 3 +- 148 files changed, 26554 insertions(+), 1 deletion(-) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 B4A/B4XMainPage.bas create mode 100644 B4A/B4XUpdateAvailable.bas create mode 100644 B4A/BatteryUtilities.bas create mode 100644 B4A/C_Buscar.bas create mode 100644 B4A/C_Cheklist.bas create mode 100644 B4A/C_Cliente.bas create mode 100644 B4A/C_Clientes.bas create mode 100644 B4A/C_DetalleVenta.bas create mode 100644 B4A/C_Detalle_Promo.bas create mode 100644 B4A/C_Foto.bas create mode 100644 B4A/C_Historico.bas create mode 100644 B4A/C_Mapas.bas create mode 100644 B4A/C_NoVenta.bas create mode 100644 B4A/C_NuevoCliente.bas create mode 100644 B4A/C_Pedidos.bas create mode 100644 B4A/C_Principal.bas create mode 100644 B4A/C_Productos.bas create mode 100644 B4A/C_TicketsDia.bas create mode 100644 B4A/C_UpdateAvailable.bas create mode 100644 B4A/C_tabulador.bas create mode 100644 B4A/CameraExClass.bas create mode 100644 B4A/DBRequestManager.bas create mode 100644 B4A/EscPosPrinter.bas create mode 100644 B4A/Files/alert2.png create mode 100644 B4A/Files/alerta.jpg create mode 100644 B4A/Files/atras.png create mode 100644 B4A/Files/atras1.png create mode 100644 B4A/Files/buscar.bal create mode 100644 B4A/Files/calificarcliente.png create mode 100644 B4A/Files/check.bal create mode 100644 B4A/Files/checklist.bal create mode 100644 B4A/Files/cliente.bal create mode 100644 B4A/Files/clienteblanco.png create mode 100644 B4A/Files/clientes.bal create mode 100644 B4A/Files/clientes_visitados.jpg create mode 100644 B4A/Files/clientes_visitados.png create mode 100644 B4A/Files/comentario.png create mode 100644 B4A/Files/contrasena.png create mode 100644 B4A/Files/datoscliente.bal create mode 100644 B4A/Files/dbc.png create mode 100644 B4A/Files/derecha.png create mode 100644 B4A/Files/derecha1.png create mode 100644 B4A/Files/detalle_promo.bal create mode 100644 B4A/Files/detalleventa.bal create mode 100644 B4A/Files/dulce.png create mode 100644 B4A/Files/durakelo1.png create mode 100644 B4A/Files/engrane.jpg create mode 100644 B4A/Files/engrane1.png create mode 100644 B4A/Files/folioabono.bal create mode 100644 B4A/Files/fondo_kmt.jpg create mode 100644 B4A/Files/foto.bal create mode 100644 B4A/Files/frintal.png create mode 100644 B4A/Files/frontal1.gif create mode 100644 B4A/Files/frontal1.png create mode 100644 B4A/Files/guardagestion.bal create mode 100644 B4A/Files/guna_viejo.png create mode 100644 B4A/Files/guna_viejo2.png create mode 100644 B4A/Files/historico.bal create mode 100644 B4A/Files/images.png create mode 100644 B4A/Files/infonavit1.jpg create mode 100644 B4A/Files/intmex_logo_192x192.jpg create mode 100644 B4A/Files/intmex_logo_192x192.png create mode 100644 B4A/Files/inventarios.jpg create mode 100644 B4A/Files/inventarios.png create mode 100644 B4A/Files/itembuttonblue.png create mode 100644 B4A/Files/izquierda.png create mode 100644 B4A/Files/izquierda1.png create mode 100644 B4A/Files/kelloggs.png create mode 100644 B4A/Files/keymon_logo.png create mode 100644 B4A/Files/kmt.db create mode 100644 B4A/Files/kmt2.db create mode 100644 B4A/Files/kmt3.db create mode 100644 B4A/Files/login.bal create mode 100644 B4A/Files/logo sanfer.jpg create mode 100644 B4A/Files/logo-guna-18.jpg create mode 100644 B4A/Files/logo-guna-18.png create mode 100644 B4A/Files/logo-guna-blanco.png create mode 100644 B4A/Files/logo-guna-contorno.png create mode 100644 B4A/Files/logo_exitus1.jpg create mode 100644 B4A/Files/logo_mariana.jpg create mode 100644 B4A/Files/mainpage.bal create mode 100644 B4A/Files/malo.jpg create mode 100644 B4A/Files/mapa.bal create mode 100644 B4A/Files/mapa_cliente.bal create mode 100644 B4A/Files/mapa_rutas.bal create mode 100644 B4A/Files/mariana.jpg create mode 100644 B4A/Files/mariana_logo_192x192.jpg create mode 100644 B4A/Files/marker-amarillo.png create mode 100644 B4A/Files/marker-azul.png create mode 100644 B4A/Files/marker-azul1.png create mode 100644 B4A/Files/marker-azul2.png create mode 100644 B4A/Files/marker-azul3.png create mode 100644 B4A/Files/marker-azul4.png create mode 100644 B4A/Files/marker-azul5.png create mode 100644 B4A/Files/marker-rojo.png create mode 100644 B4A/Files/marker-rojo1.png create mode 100644 B4A/Files/marker-rojo2.png create mode 100644 B4A/Files/marker-verde.png create mode 100644 B4A/Files/no_venta.bal create mode 100644 B4A/Files/nuevocliente.bal create mode 100644 B4A/Files/panel_pick_ciego.bal create mode 100644 B4A/Files/pedido.bal create mode 100644 B4A/Files/planfia_logo.png create mode 100644 B4A/Files/planfia_logo_old.png create mode 100644 B4A/Files/planfia_logo_old2.png create mode 100644 B4A/Files/principal.bal create mode 100644 B4A/Files/proditem.bal create mode 100644 B4A/Files/proditem2.bal create mode 100644 B4A/Files/productos.bal create mode 100644 B4A/Files/profina.jpg create mode 100644 B4A/Files/profina.png create mode 100644 B4A/Files/rechazos.jpg create mode 100644 B4A/Files/rechazos.png create mode 100644 B4A/Files/rechazosblanco.png create mode 100644 B4A/Files/sync.png create mode 100644 B4A/Files/tabulador.bal create mode 100644 B4A/Files/tabulador.jpg create mode 100644 B4A/Files/tabulador.png create mode 100644 B4A/Files/tabuladorblanco.png create mode 100644 B4A/Files/telefonos.bal create mode 100644 B4A/Files/ubicacionblanco.png create mode 100644 B4A/Files/ubicar_clientes.jpg create mode 100644 B4A/Files/ubicarcliente.png create mode 100644 B4A/Files/usuario.png create mode 100644 B4A/Files/vecteezy_abstract-color-polygon-background-design-abstract-geometric_22231666.jpg create mode 100644 B4A/Files/visitaazul.png create mode 100644 B4A/Files/visitaazul1.png create mode 100644 B4A/Files/visitadosblanco.png create mode 100644 B4A/Intmex_Reparto.b4a.meta create mode 100644 B4A/MAPA_CLIENTE.bas create mode 100644 B4A/MAPA_RUTAS.bas create mode 100644 B4A/ManageExternalStorage.bas create mode 100644 B4A/Mariana_Reparto.b4a.meta create mode 100644 B4A/Marquez_Reparto.b4a.meta create mode 100644 B4A/Mazapa_Reparto.b4a.meta create mode 100644 B4A/QRGenerator.bas create mode 100644 B4A/Starter.bas create mode 100644 B4A/Subs.bas create mode 100644 B4A/Tracker.bas create mode 100644 B4A/appUpdater.bas create mode 100644 B4A/barcodeGenerator.bas create mode 100644 B4A/cheklist.bas create mode 100644 B4A/foto.bas create mode 100644 B4A/guna_reparto.b4a create mode 100644 B4A/guna_reparto.b4a.meta diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..a3f49d9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,16 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# linguist-language +*.b4a linguist-language=B4X +*.b4i linguist-language=B4X +*.b4j linguist-language=B4X +*.b4r linguist-language=B4X +*.bas linguist-language=B4X + +# linguist-detectable +*.b4a linguist-detectable=true +*.b4i linguist-detectable=true +*.b4j linguist-detectable=true +*.b4r linguist-detectable=true +*.bas linguist-detectable=true \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..af94e9d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +**/Objects +**/AutoBackups \ No newline at end of file diff --git a/B4A/B4XMainPage.bas b/B4A/B4XMainPage.bas new file mode 100644 index 0000000..fd8450b --- /dev/null +++ b/B4A/B4XMainPage.bas @@ -0,0 +1,2382 @@ +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=git&Args=pull +' '########################################################################################################### +' '###################### PUSH ############################################################# +' 'Ctrl + click ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=github&Args=..\..\ +' '########################################################################################################### +' '###################### PUSH TORTOISE GIT ######################################################### +' 'Ctrl + click ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=TortoiseGitProc&Args=/command:commit&Args=/path:"./../../"&Args=/closeonend:2 +' '########################################################################################################### +'#End Region +' +''Ctrl + click to export as zip: ide://run?File=%B4X%\Zipper.jar&Args=Project.zip +' +'Sub Class_Globals +' Dim rp As RuntimePermissions +' Private Root As B4XView +' Private xui As XUI +' Private Root As B4XView +' Public rp As RuntimePermissions +' Public login As B4XMainPage +' Public principal As C_Principal +' Public clientes As C_Clientes +' Public cliente As C_Cliente +'' Public foto As C_Foto +' Public productos As C_Productos +' Public updateAvailable As C_UpdateAvailable +' Public mapas As C_Mapas +' Public nuevoCliente As C_NuevoCliente +' Public ticketsDia As C_TicketsDia +' Public noVenta As C_NoVenta +' Public pedidos As C_Pedidos +' Public buscar As C_Buscar +'' Public historico As C_Historico +' Public detalleVenta As C_DetalleVenta +' Public detalle_promo As C_Detalle_Promo +' Dim reqManager As DBRequestManager +'' Dim ruta As String +' Dim usuario As String +' Dim logger As Boolean = True +' Dim lat_gps, lon_gps As String +'' Dim skmt As SQL +' Dim usuario As String +' Dim server As String +' Dim montoActual, clientesTotal, clientesVenta, clientesRechazo, clientesVisitados, almacen, rutaPreventa, CANTIDADPROD As String +' Dim ultimaActualizacionGPS As String = 235959 +' Dim fechaRuta As String +'' Public wsServerLink As String = "ws://187.189.244.154:51042/push/b4a_ws2" +'' Public wsServerLink As String = "ws://10.0.0.214:51042/push/b4a_ws2" +' Dim srvIp As String +' Dim phn As Phone +' Dim user As EditText +' Dim pass As EditText +' Dim c As Cursor +' Dim existe As String +' Dim paso1,paso2,paso3 As String +' Private IMEN As Label +' Dim IMEI As String +' Private Label1 As Label +' Dim server As String +' Private p_principal As Panel +' Private Entrar As Button +' Public checklist As C_Cheklist +' Public tabulador As C_tabulador +' Dim batt As Int +' Dim monto_entregadoactual As String +' Dim piezas_entregdas As String +' Dim porVisitar, entregas, rechazos, montoEntregado, montoRechazado As String +' Private p_appUpdate As Panel +' Private i_engrane As ImageView +' Private b_server As Button +' Private b_apk As Button +' Private b_envioBD As Button +' Private b_regesar As Button +' Private et_server As EditText +' Private p_serverList As Panel +' Private lv_server As ListView +' Public Provider As FileProvider +' Public rutaBDBackup As String = "" +' Private B_Can_Monto As Button +' Private B_Aceptar_Monto As Button +' Private ET_Add_Monto As EditText +' Private p_add_monto As Panel +' Dim sDate, sTime As String +' Private p_validacion As Panel +' Private b_cancelarcodigo As Button +' Private b_aceptar As Button +' Private et_codigo As EditText +' Private P_CIEGO As Panel +' Private b_terpc As Button +' Private B_PC_ENV As Button +' Private CLV_PICK_CIEGO As CustomListView +' Private et_buspc As EditText +' Dim q_buscar As String +' Dim d As Cursor +' Private L_PICK_CIEGO As Label +' Private ET_PICK_CIEGO As EditText +' Dim a As Cursor +' Dim f As Cursor +' Private b_abono As Button +' +' Dim codigo, usuariocheck As Int +'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 +' B4XPages.GetManager.LogEvents = True +' Root.LoadLayout("login") +'' B4XPages.SetTitle(Me, "Guna Reparto") +' login.Initialize +' B4XPages.AddPage("Login", login) +' principal.Initialize +' B4XPages.AddPage("Principal", principal) +' clientes.Initialize +' B4XPages.AddPage("Clientes", clientes) +' cliente.Initialize +' B4XPages.AddPage("Cliente", cliente) +'' foto.Initialize +'' B4XPages.AddPage("Foto", foto) +' productos.Initialize +' B4XPages.AddPage("Productos", productos) +' updateAvailable.Initialize +' B4XPages.AddPage("updateAvailable", updateAvailable) +' mapas.Initialize +' B4XPages.AddPage("Mapas", mapas) +' nuevoCliente.Initialize +' B4XPages.AddPage("NuevoCliente", nuevoCliente) +' ticketsDia.Initialize +' B4XPages.AddPage("TicketsDia", ticketsDia) +' noVenta.Initialize +' B4XPages.AddPage("NoVenta", noVenta) +' pedidos.Initialize +' B4XPages.AddPage("Pedidos", pedidos) +' buscar.Initialize +' B4XPages.AddPage("Buscar", buscar) +'' historico.Initialize +'' B4XPages.AddPage("Historico", historico) +' detalleVenta.Initialize +' B4XPages.AddPage("DetalleVenta", detalleVenta) +' detalle_promo.Initialize +' B4XPages.AddPage("Detalle_Promo", detalle_promo) +' tabulador.Initialize +' B4XPages.AddPage("tabulador", tabulador) +' checklist.Initialize +' B4XPages.AddPage("checklist",checklist) +'' p_principal.Width = Root.Width +'' p_principal.Height = Root.Height * .90 +' Entrar.Left = (p_principal.Width - Entrar.Width) / 2 +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CAT_GUNAPROD3 (CAT_GP_INICIATIVA TEXT, CAT_GP_TIPOPROD TEXT, CAT_GP_DEV TEXT, CAT_GP_ALMACEN NUMERIC, CAT_GP_ID TEXT, CAT_GP_NOMBRE TEXT, CAT_GP_IMP1 TEXT, CAT_GP_IMP2 TEXT, CAT_GP_PRECIO TEXT, CAT_GP_CLASIF TEXT, CAT_GP_STS TEXT, CAT_GP_TIPO TEXT, CAT_GP_SUBTIPO TEXT, CAT_GP_IMG BLOB)") +' Subs.agregaColumna("CAT_GUNAPROD3", "CAT_DP_CONVERSION1", "TEXT") +' Subs.agregaColumna("CAT_GUNAPROD3", "CAT_DP_PRECIO4", "TEXT") +' Subs.agregaColumna("CAT_GUNAPROD3", "CAT_DP_CANT_MIN_VENTA", "TEXT") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS ABONOS (a_usuario TEXT, a_ruta TEXT, a_cliente TEXT, a_abono TEXT, a_fecha TEXT, a_enviado TEXT)") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS PAGARES (PA_ALMACEN TEXT, PA_RUTA_REP TEXT, PA_RUTAPREV TEXT, PA_FECHA_PREV TEXT, PA_CAPTURA TEXT, PA_MONTO TEXT, PA_USUARIO TEXT, PA_CLIENTE TEXT)") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS PICK_CIEGO (PC_ID_PROD TEXT, PC_NOM_PROD TEXT, PC_CANT TEXT, PC_ALMACEN TEXT, PC_RUTA TEXT, PC_FECHA TEXT)") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS ENV_MONTO_LIQ (EML_MONTO TEXT, EML_ALMACEN TEXT, EML_RUTA TEXT, EML_USUARIO TEXT, EML_FECHA_PED TEXT)") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS TABULADOR_MONEDAS(VEINTE TEXT, DIEZ TEXT, CINCO TEXT, DOS TEXT, PESO TEXT, CENTAVO TEXT, TOTAL TEXT)") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS TABULADOR_BILLETES(MIL TEXT, QUINIENTOS TEXT, DOCIENTOS TEXT, CIEN TEXT, CINCUENTA TEXT, VEINTE TEXT)") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_VENTAS2 (HVD_PARCIAL TEXT, HVD_RECHAZO TEXT, HVD_NUM_REGISTRO TEXT, HVD_NUM_TICKET TEXT, HVD_PROID TEXT, HVD_CODPROMO TEXT, HVD_FECHA TEXT, HVD_ESTATUS TEXT, HVD_CLIENTE TEXT, HVD_PRONOMBRE TEXT, HVD_CANT TEXT, HVD_COSTO_TOT TEXT)") +'' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS VENTAS (V_FECHA TEXT, V_CLIENTE TEXT, V_CLIENTE_ORIG TEXT, V_PRODNOMBRE TEXT, V_PRODID TEXT, V_CANTIDAD TEXT, V_PRECIO TEXT, V_TOTAL TEXT, V_PRODREGISTRO TEXT)") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS RECHAZOS (R_FECHA TEXT, R_CLIENTE TEXT, R_CLI_ORIG TEXT, R_PRODID TEXT, R_CANT TEXT, R_RECHAZO INT)") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS VENTAS (V_FECHA TEXT, V_CLIENTE TEXT, V_CLI_ORIG TEXT, V_PRODID TEXT, V_CANT TEXT, V_RECHAZO INT)") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS ABONOSP(NOTA TEXT, CLIENTE TEXT, SALDO_PENDIENTE TEXT)") +'' Starter.skmt.ExecNonQuery("DROP TABLE IF EXISTS PAGARES") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CHECADO_CHECK(CHECADO TEXT)") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CODIGO_UNICO(CODIGO TEXT)") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS INICIO_SESION(CONECTADO TEXT)") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS BLOCKENVIO(ENVIADO TEXT)") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_REPARTO_GEO(HIST_RG_MONTO TEXT, HIST_RG_CREDITO TEXT, HIST_RG_MONTO_CREDITO TEXT, HIST_RG_LAT TEXT, HIST_RG_LONG TEXT, HIST_RG_RECHAZO TEXT, HIST_RG_MOTIVO TEXT, HIST_RG_USUARIO_ENTREGO TEXT, HIST_RG_RUTA_REP TEXT, HIST_RG_ESTATUS_ENTREGA TEXT, HIST_RG_COMENTARIO_ENTREGA TEXT, HIST_RG_FORMA_PAGO TEXT, HIST_RG_GEOCERCA_MTS TEXT, HIST_RG_NO_ART TEXT, HIST_RG_CLIENTE TEXT, HIST_RG_FECHA TEXT, HIST_RG_ALMACEN TEXT, HIST_RG_RUTA_PRE TEXT)") +' +'' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS PAGARES(TMP_MONTO_PAGARE TEXT, TMP_CLIENTE TEXT)") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CHECKLIST(USUARIO TEXT, PLACA TEXT, FECHA_CAPTURA TEXT, TARJETA_CIRCULACION TEXT , POLIZA_SEGURO TEXT, LICENCIA_CONDUCIR TEXT, LIMPIA_EXTERNA TEXT, LIMPIA_INTERNA TEXT, TRIANGULO TEXT, GATO TEXT, LLANTA_REFACCION TEXT, CARROCERIA_BUENESTADO TEXT, CARROCERIA_MALESTADO TEXT, CARROCERIA_COMENTARIOS TEXT, LUCES_CORRECTO TEXT, LUCES_INCORRECTO TEXT, LUCES_COMENTARIOS TEXT, CONDICION_PLACAS_CORRECTO TEXT, CONDICION_PLACAS_INCORRECTO TEXT, CONDICION_PLACAS_COMENTARIOS TEXT, CONDICION_LLANTAS_DEL_DER TEXT, CONDICION_LLANTAS_DEL_IZQ TEXT, CONDICION_LLANTAS_TRASERA_DER TEXT, CONDICION_LLANTAS_TRASERA_IZQ TEXT, ACEITE TEXT, ANTICONGELANTE TEXT, FRENOS TEXT, AIRE TEXT, FUGAS TEXT, COMETARIOS_FUGAS TEXT, FOTO1 BLOB, FOTO12 BLOB, FOTO3 BLOB, FOTO4 BLOB)") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CHECKLIST2(USUARIO TEXT, PLACA TEXT, FECHA_CAPTURA TEXT, TARJETA_CIRCULACION TEXT, POLIZA_SEGURO TEXT, LICENCIA_CONDUCIR TEXT, LIMPIA_EXTERNA TEXT, LIMPIA_INTERNA TEXT, TRIANGULO TEXT, GATO TEXT, LLANTA_REFACCION TEXT, CARROCERIA TEXT, CARROCERIA_COMENTARIOS TEXT, LUCES TEXT, LUCES_COMENTARIOS TEXT, CONDICION_PLACAS TEXT, CONDICION_PLACAS_COMENTARIOS TEXT, CONDICION_LLANTAS_DEL_DER TEXT, CONDICION_LLANTAS_DEL_IZQ TEXT, CONDICION_LLANTAS_TRASERA_DER TEXT, CONDICION_LLANTAS_TRASERA_IZQ TEXT, ACEITE TEXT, ANTICONGELANTE TEXT, FRENOS TEXT, AIRE TEXT, FUGAS TEXT, COMETARIOS_FUGAS TEXT, FOTO1 BLOB, FOTO12 BLOB, FOTO3 BLOB, FOTO4 BLOB, KILIMETRAJE TEXT, RUTA TEXT)") +' Subs.agregaColumna("REPARTO", "REP_PRODREGISTRO", "TEXT") +' Subs.agregaColumna("NOVENTA", "NV_RUTA", "TEXT") +' Subs.agregaColumna("ABONOS", "a_ticket", "TEXT") +' Subs.agregaColumna("ABONOS", "a_tipoabono", "TEXT") +' +' Subs.agregaColumna("PAGARES", "PA_CANCELADO", "TEXT") +' Subs.agregaColumna("ABONOSP", "NOMBRE", "TEXT") +' Subs.agregaColumna("kmt_info", "SECUENCIA", "INT") +' Subs.agregaColumna("kmt_info", "HORAENT", "TEXT") +' Subs.agregaColumna("REPARTO", "REP_PRODID", "TEXT") +' Subs.agregaColumna("PEDIDO", "PE_CLIENTEOR", "TEXT") +' Subs.agregaColumna("PAGARES", "PA_TICKET", "TEXT") +' Subs.agregaColumna("PEDIDO", "PE_CAJAS", "TEXT") +' Subs.agregaColumna("PEDIDO", "PE_REGALO", "TEXT") +' Subs.agregaColumna("PEDIDO", "PE_BCAJAS", "TEXT") +' Subs.agregaColumna("PEDIDO", "CONSECUTIVO", "TEXT") +' Subs.agregaColumna("PEDIDO", "FECHA_PREV", "TEXT") +' Subs.agregaColumna("PEDIDO", "RUTA_REP", "TEXT") +' Subs.agregaColumna("REPARTO", "REP_CLI_ORIG", "TEXT") +' Subs.agregaColumna("REPARTO", "REP_PRECIO", "TEXT") +' Subs.agregaColumna("REPARTO", "REP_RECHAZO", "INTEGER") +' Subs.agregaColumna("RECHAZOS", "R_PRECIO", "TEXT") +' Subs.agregaColumna("VENTAS", "V_PRECIO", "TEXT") +' Subs.agregaColumna("HIST_VENTAS","PLACA","TEXT") +' Subs.agregaColumna("HIST_VENTAS","HVD_RECHAZOCANT","TEXT") +' Subs.agregaColumna("HIST_VENTAS","CONSECUTIVO","TEXT") +' Subs.agregaColumna("HIST_VENTAS","HVD_RECHAZOCANT","TEXT") +' Subs.agregaColumna("HIST_VENTAS","ESPROMO","TEXT") +' Subs.agregaColumna("HIST_VENTAS","HVD_RECHAZOCANTC","TEXT") +' Subs.agregaColumna("HIST_VENTAS","BCAJAS","TEXT") +' Subs.agregaColumna("HIST_VENTAS","CANTC","TEXT") +' Subs.agregaColumna("HIST_VENTAS","BCAJAS_OR","TEXT") +' Subs.agregaColumna("HIST_VENTAS","CANTC_OR","TEXT") +' Subs.agregaColumna("CAT_GUNAPROD","CONVERSION","TEXT") +' Subs.agregaColumna("kmt_info","CAT_CL_LIMITECREDITO","TEXT") +' Subs.agregaColumna("CAT_GUNAPROD","PRECIOCONVER","TEXT") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS RUTAA (RUTAA TEXT)") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS wayPoints (codigo TEXT, indice INT)") +' Dim server As String = "http://keymon.net:1782" +'' Dim server As String = "http://192.168.100.10:1781" +'' Dim server As String = "http://keymon.lat:9000" +'' server = "http://10.0.0.205:1782" +'' Dim server As String = "http://192.168.100.10:1781" +'' server = "http://11.0.0.44:1782" +' reqManager.Initialize(Me, B4XPages.MainPage.server) +' LogColor($"ReqServer = ${B4XPages.MainPage.server}"$, Colors.red) +' Label1.Text = Application.VersionName +'' Dim P As PhoneId +' Log("provider") +' Provider.Initialize +' +' Subs.guardaAppInfo +' +'' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_READ_PHONE_STATE) +'' Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) +'' If Result Then +'' IMEN.Text = "" 'P.GetDeviceId +'' IMEI = "" 'P.GetDeviceId +'' End If +'End Sub +' +'Sub B4XPage_Appear +' If Starter.muestraProgreso = 1 Then +' muestraProgreso("Descargando actualización") +' Starter.muestraProgreso = 0 +' End If +' Subs.centraPanel(p_principal, Root.Width) +' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION) +'' LogColor("Start Tracker1", Colors.red) +' Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) +' If Result Then +' If Not(Tracker.Tracking) Then StartService(Tracker) +'' LogColor("Start Tracker", Colors.red) +' Else +' ToastMessageShow("No permission", True) +' Log("Sin permisos") +' End If +'' LogColor("Start Tracker3", Colors.red) +' c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") +' If c.RowCount > 0 Then +'' c.Position=0 +'' c=skmt.ExecQuery("select USUARIO from usuarioa") +' c.Position=0 +' usuario = c.GetString("USUARIO") +' End If +' c.Close +'' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_WRITE_EXTERNAL_STORAGE) +'' Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) +'' If Result Then +'' Log("Con permisos de escritura externa") +'' End If +' +' c=Starter.skmt.ExecQuery("select CODIGO from CODIGO_UNICO") ''''Codigo de acceso unico +' If c.RowCount = 0 Then +' Dim Random5Digits As String +' Random5Digits = NumberFormat2(Rnd(0, 100000), 5, 0, 0,False) ' Rellenado con ceros a la izquierda +' Log("Número aleatorio de 5 dígitos (con ceros): " & Random5Digits) +' Dim pascon As Cursor = Starter.skmt.ExecQuery("select * from USUARIOA") +' pascon.Position = 0 +' Starter.skmt.ExecNonQuery2("INSERT INTO CODIGO_UNICO VALUES (?)", Array As Object(Random5Digits)) +' End If +' c.Close +'End Sub +' +''You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. +' +'Sub Entrar_Click +' If pass.Text = "YA" Then +' Starter.skmt.ExecNonQuery("delete from usuarioa") +' Starter.skmt.ExecNonQuery("delete from VERSION") +' Starter.skmt.ExecNonQuery2("INSERT INTO USUARIOA VALUES (?,?)", Array As Object("ROOT", "ROOT")) +' Starter.skmt.ExecNonQuery("delete from cat_almacen") +' Starter.skmt.ExecNonQuery2("INSERT INTO CAT_ALMACEN(ID_ALMACEN) VALUES (?)", Array As Object (user.Text)) +' Starter.skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object ("2.1")) +'' principal.B_REGRESA_Click +'' B4XPages.MainPage.principal.Subir.Visible = True +' B4XPages.ShowPage("Principal") +' Else +' c=Starter.skmt.ExecQuery2("select count(*) as EXISTE1 from usuarioa where usuario = ?", Array As String(user.Text)) +' c.Position=0 +' existe = c.GetString("EXISTE1") +' c.Close +' 'existe = 1 +' If existe = 0 Then +' 'skmt.ExecNonQuery("delete from usuarioa") +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "select_usuario_GUNA_REPG_VN" +' cmd.Parameters = Array As Object(user.Text, pass.Text) +' reqManager.ExecuteQuery(cmd , 0, "usuario") +' +' +'' Dim cmd As DBCommand +'' cmd.Initialize +'' cmd.Name = "select_version_INTMEX" +'' reqManager.ExecuteQuery(cmd , 0, "version") +' Else +' +' +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "select_cont_usuario_GUNA_REPG_VN" +' cmd.Parameters = Array As Object(user.Text) +' reqManager.ExecuteQuery(cmd , 0, "cuentausuario") +' +' c=Starter.skmt.ExecQuery("select CODIGO from CODIGO_UNICO") ''''Codigo de acceso unico +' c.Position = 0 +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "select_cont_codigo_GUNA_REPG_VN" +' cmd.Parameters = Array As Object(c.GetString("CODIGO")) +' reqManager.ExecuteQuery(cmd , 0, "cuentacodigo") +' c.Close +' End If +' End If +'End Sub +' +'Sub JobDone(Job As HttpJob) +' If Job.Success = False Then +' ToastMessageShow("Error: " & Job.ErrorMessage, True) +' Else +' If Job.JobName = "DBRequest" Then +' Dim result As DBResult = reqManager.HandleJob(Job) +' If result.Tag = "version" Then 'query tag +' For Each records() As Object In result.Rows +' Starter.skmt.ExecNonQuery("delete from VERSION") +' Dim CAT_VE_VERSION As String = records(result.Columns.Get("CAT_VE_VERSION")) +' Starter.skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object (CAT_VE_VERSION)) +' Next +' End If +' End If +' +' If Job.JobName = "DBRequest" Then +' Dim result As DBResult = reqManager.HandleJob(Job) +' If result.Tag = "agencia" Then 'query tag +' For Each records() As Object In result.Rows +' +' Dim ID_ALMACEN As String = records(result.Columns.Get("ID_ALMACEN")) +' Next +' almacen = ID_ALMACEN +' End If +' End If +' +' If Job.JobName = "DBRequest" Then +' Dim result As DBResult = reqManager.HandleJob(Job) +' If result.Tag = "coords_almacen" Then 'query tag +' For Each records() As Object In result.Rows +' Log("Coordenadas del almacen: " & records(result.Columns.Get("CAT_AL_LATITUD")) & "," & records(result.Columns.Get("CAT_AL_LONGITUD"))) +' Private lat, lon As Double +' lat = 0.0 +' lon = 0.0 +' If IsNumber(records(result.Columns.Get("CAT_AL_LATITUD"))) And IsNumber(records(result.Columns.Get("CAT_AL_LONGITUD"))) Then +' lat = records(result.Columns.Get("CAT_AL_LATITUD")) +' lon = records(result.Columns.Get("CAT_AL_LONGITUD")) +' End If +' Starter.cedisLocation.Latitude = lat +' Starter.cedisLocation.Longitude = lon +' Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("COORDS_ALMACEN")) +' Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("COORDS_ALMACEN",lon&","&lat)) +' '19.48118148992086,-99.15295579261536 +' Next +' End If +' End If +' +' If Job.JobName = "DBRequest" Then ''' Codigo unico +' Dim result As DBResult = reqManager.HandleJob(Job) +' If result.Tag = "usuario" Then 'query tag +' Log("si hice 4") +' For Each records() As Object In result.Rows +' Dim name As String = records(result.Columns.Get("USUARIO")) +' Dim ID_ALMACEN As String = records(result.Columns.Get("CAT_LO_AGENCIA")) +'' Dim IMEI_BASE As String = records(result.Columns.Get("CAT_LO_IDTELEFONO")) +' Next +' +'' B4XPages.ShowPage("Principal") '''mover +' +' +' If name = "OKActivo" Then +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "select_cont_usuario_GUNA_REPG_VN" +' cmd.Parameters = Array As Object(user.Text) +' reqManager.ExecuteQuery(cmd , 0, "cuentausuario") +' +' c=Starter.skmt.ExecQuery("select CODIGO from CODIGO_UNICO") ''''Codigo de acceso unico +' c.Position = 0 +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "select_cont_codigo_GUNA_REPG_VN" +' cmd.Parameters = Array As Object(c.GetString("CODIGO")) +' reqManager.ExecuteQuery(cmd , 0, "cuentacodigo") +' c.Close +' +' Else If name = "OKExpirado"& IMEI Then +' Msgbox("Usuario Expirado llamar al administrador","") 'ignore +' Else If name = "OKCancelado"& IMEI Then +' Msgbox("Usuario Cancelado llamar al administrador","") 'ignore +' Else +' Msgbox("Usuario o password No validos","") 'ignore +' End If +' +'' paso1 = 1 +' End If +' End If +' +' If Job.JobName = "DBRequest" Then ''' Codigo unico +' Dim result As DBResult = reqManager.HandleJob(Job) +' If result.Tag = "cuentacodigo" Then 'query tag +' Log("si hice 1") +' For Each records() As Object In result.Rows +' Dim CUENTA_CODIGO As Int = records(result.Columns.Get("CUENTA_CODIGO")) +' Next +' codigo = CUENTA_CODIGO +' Log(CUENTA_CODIGO) +' paso1 = 1 +' entrada +' End If +' End If +' +' If Job.JobName = "DBRequest" Then ''' Codigo unico +' Dim result As DBResult = reqManager.HandleJob(Job) +' If result.Tag = "cuentausuario" Then 'query tag +' Log("si hice 2") +' For Each records() As Object In result.Rows +' Dim CUENTA_USUARIO As Int = records(result.Columns.Get("CUENTA_USUARIO")) +' Next +' usuariocheck = CUENTA_USUARIO +' Log(CUENTA_USUARIO) +' paso2 = 1 +' entrada +' End If +' End If +' +' If Job.JobName = "DBRequest" Then ''' Codigo unico +' Dim result As DBResult = reqManager.HandleJob(Job) +' If result.Tag = "cuentacodigo2" Then 'query tag +' Log("si hice 3") +' For Each records() As Object In result.Rows +' Dim TMP_CR_CODIGO As Int = records(result.Columns.Get("TMP_CR_CODIGO")) +' Next +' +' +' If TMP_CR_CODIGO = 1 Then +' Log("si hice 5") +' Starter.skmt.ExecNonQuery("delete from usuarioa") +' Starter.skmt.ExecNonQuery2("INSERT INTO USUARIOA VALUES (?,?)", Array As Object(user.Text, pass.Text)) +' Starter.skmt.ExecNonQuery("delete from cat_almacen") +' Starter.skmt.ExecNonQuery2("INSERT INTO CAT_ALMACEN(ID_ALMACEN) VALUES (?)", Array As Object (almacen)) +' B4XPages.ShowPage("Principal") +' +' End If +' +' End If +' End If +' +' +' If Job.JobName = "DBRequest" Then +' Dim result As DBResult = reqManager.HandleJob(Job) +' If result.Tag = "contrasena" Then 'query tag +' For Each records() As Object In result.Rows +' Dim CAT_PA_PASS As String = records(result.Columns.Get("CAT_PA_PASS")) +' If CAT_PA_PASS = et_codigo.Text Then +' Log(CAT_PA_PASS) +' p_validacion.Visible = False +' et_codigo.Text = "" +' +' Subs.panelVisible(P_CIEGO,0,0) +' +' Else +' MsgboxAsync("Contraseña incorrecta","Atención") +' End If +' Next +' End If +' End If +' +'' If Job.JobName = "DBRequest" Then +'' Dim result As DBResult = reqManager.HandleJob(Job) +'' If result.Tag.As(String).IndexOf("PICK_C_") > -1 Then 'query tag +' '' Subs.logJobDoneResultados(result) +'' Private id As String= result.Tag +'' id = id.SubString(id.IndexOf("_")+3) +'' For Each records() As Object In result.Rows +'' Dim CUENTA As String = records(result.Columns.Get("CUENTA")) +'' Log(CUENTA) +'' Log(id) +'' If CUENTA = 0 Then +'' c = Starter.skmt.ExecQuery2("SELECT * FROM PICK_CIEGO WHERE PC_ID_PROD = ?", Array As String (id)) +'' If c.RowCount > 0 Then +' '' For i=0 To c.RowCount -1 +'' c.Position=0 +'' Dim cmd As DBCommand +'' cmd.Initialize +'' cmd.Name = "insert_PICKCIEGO_MAZAPA" +'' cmd.Parameters = Array As Object(c.GetString("PC_ID_PROD"), c.GetString("PC_NOM_PROD"), c.GetString("PC_CANT"), c.GetString("PC_ALMACEN"), c.GetString("PC_RUTA"), c.GetString("PC_FECHA"),"REPARTO") +'' reqManager.ExecuteCommand(cmd , "ins_PC") +' '' Next +'' End If +'' c.Close +'' Else if CUENTA > 0 Then +'' c = Starter.skmt.ExecQuery2("SELECT * FROM PICK_CIEGO WHERE PC_ID_PROD= ?", Array As String (id)) +'' If c.RowCount > 0 Then +' '' For i=0 To c.RowCount -1 +'' c.Position = 0 +'' Dim cmd As DBCommand +'' cmd.Initialize +'' cmd.Name = "update_PICKCIEGO_MAZAPA" +'' Log("FECHA" & c.GetString("PC_FECHA")) +'' cmd.Parameters = Array As Object(c.GetString("PC_CANT"), c.GetString("PC_ID_PROD"), c.GetString("PC_ALMACEN"), c.GetString("PC_RUTA"), c.GetString("PC_FECHA"),"REPARTO") +'' reqManager.ExecuteCommand(cmd, "update_PC") +' '' Next +'' End If +'' c.Close +'' End If +' ' +'' Next +'' End If +'' End If +' +' If Job.JobName = "DBRequest" Then +' Dim result As DBResult = reqManager.HandleJob(Job) +' If result.Tag = "estatus" Then 'query tag +' For Each records() As Object In result.Rows +' Dim hvd_estatus As String = records(result.Columns.Get("HVD_ESTATUS")) +' If hvd_estatus = "Liquidado" Then +' ' ToastMessageShow("rojo val ok 1 cuantosp." , True) +' MsgboxAsync("La venta ya fue liquidada","Atención") +' Else +' enviarmonto +' End If +' Next +' End If +' End If +' +' If Job.JobName = "DBRequest" Then +' Dim result As DBResult = reqManager.HandleJob(Job) +' If result.Tag = "estatus2" Then 'query tag +' For Each records() As Object In result.Rows +' Dim hvd_estatus As String = records(result.Columns.Get("HVD_ESTATUS")) +' If hvd_estatus = "Liquidado" Then +' ' ToastMessageShow("rojo val ok 1 cuantosp." , True) +' MsgboxAsync("La venta ya fue liquidada","Atención") +' Else +' passaquci +' End If +' Next +' End If +' End If +' +' If Job.JobName = "DBRequest" Then +' Dim result As DBResult = reqManager.HandleJob(Job) +' If result.Tag = "SelectMontoLiq" Then +' For Each records() As Object In result.Rows +' Dim CUENTA As String = records(result.Columns.Get("CUENTA")) +' +' DateTime.DateFormat = "MM/dd/yyyy" +' sDate=DateTime.Date(DateTime.Now) +' sTime=DateTime.Time(DateTime.Now) +' Private f As Cursor=Starter.skmt.ExecQuery("select RUTAA from RUTAA") +' f.Position=0 +' Private a As Cursor =Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") +' a.Position = 0 +' +' Private c2 As Cursor +' c2=Starter.skmt.ExecQuery("select USUARIO from usuarioa") +' c2.Position=0 +' If c2.RowCount > 0 Then c2.GetString("USUARIO") +' +' Log(CUENTA & "----------------------!!") +' If CUENTA = "0" Then +' +'' c = Starter.skmt.ExecQuery2("SELECT * FROM ENV_MONTO_LIQ WHERE EML_USUARIO = ? AND EML_ALMACEN = ? AND EML_RUTA = ?", Array As String (c2.GetString("USUARIO"), a.GetString("ID_ALMACEN"), f.GetString("RUTAA"))) +'' If c.RowCount > 0 Then +' '' For i=0 To c.RowCount -1 +'' c.Position=0 +'' Dim cmd As DBCommand +'' cmd.Initialize +'' cmd.Name = "insert_Monto_Liq_MAZAPArep" +'' cmd.Parameters = Array As Object(c.GetString("EML_MONTO"), c.GetString("EML_ALMACEN"), f.GetString("RUTAA"), c.GetString("EML_USUARIO"), "REPARTO", c.GetString("EML_FECHA_PED")) +'' reqManager.ExecuteCommand(cmd , "ins_Mon_Liq") +'' MsgboxAsync("Monto Enviado", "Atención") +' '' Next +'' End If +'' c.Close +' Else if CUENTA > "0" Then +' +'' c = Starter.skmt.ExecQuery2("SELECT * FROM ENV_MONTO_LIQ WHERE EML_USUARIO = ? AND EML_ALMACEN = ? AND EML_RUTA = ?", Array As String (c2.GetString("USUARIO"), a.GetString("ID_ALMACEN"), f.GetString("RUTAA"))) +'' If c.RowCount > 0 Then +' '' For i=0 To c.RowCount -1 +'' c.Position = 0 +'' cmd.Initialize +'' cmd.Name = "update_MontoCuenta_MAZAPArep" +'' cmd.Parameters = Array As Object(c.GetString("EML_MONTO"), c.GetString("EML_ALMACEN"), c.GetString("EML_RUTA"), c.GetString("EML_USUARIO"),c.GetString("EML_FECHA_PED"),"REPARTO") +'' +'' Log(c.GetString("EML_MONTO")& " " & c.GetString("EML_ALMACEN")& " " & c.GetString("EML_RUTA")& " " & c.GetString("EML_USUARIO")) +'' reqManager.ExecuteCommand(cmd, "update_MC") +'' MsgboxAsync("Se sobre escribio el Monto", "Atención") +' '' Next +'' End If +'' c2.Close +'' c.Close +' End If +' f.Close +' a.Close +' Next +' End If +' End If +' +' Job.Release +' End If +' +' +' +' +'End Sub +' +'Sub entrada +' If paso1 = 1 And paso2 = 1 Then +' +' +' Log(codigo) +' Log(usuariocheck) +' If codigo = 1 And usuariocheck = 1 Then +' c=Starter.skmt.ExecQuery("select CODIGO from CODIGO_UNICO") ''''Codigo de acceso unico +' c.Position = 0 +' +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "select_codigo_cuantosGUNA_REPG_VN" +' cmd.Parameters = Array As Object(user.Text, c.GetString("CODIGO")) +' reqManager.ExecuteQuery(cmd , 0, "cuentacodigo2") +' +' c.Close +' Else If (codigo = 1 And usuariocheck = 0) Or (codigo = 0 And usuariocheck = 1) Then +' MsgboxAsync("El celular ya esta registrado en otra cuenta, o el usuario esta registrado en otro telefono, favoir de contactar a tu supervisor","Atención") +' Else If codigo = 0 And usuariocheck = 0 Then +' Dim cod As Cursor=Starter.skmt.ExecQuery("select CODIGO from CODIGO_UNICO") ''''Codigo de acceso unico +' cod.Position = 0 +' +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "insert_codigo_REP_GUNA_VN" +' cmd.Parameters = Array As Object(user.Text.Trim, pass.Text, cod.GetString("CODIGO")) +' reqManager.ExecuteCommand(cmd , "ins_codigo") +' +' cod.Close +' +' +' Starter.skmt.ExecNonQuery("delete from usuarioa") +' Starter.skmt.ExecNonQuery2("INSERT INTO USUARIOA VALUES (?,?)", Array As Object(user.Text, pass.Text)) +' Starter.skmt.ExecNonQuery("delete from cat_almacen") +' Starter.skmt.ExecNonQuery2("INSERT INTO CAT_ALMACEN(ID_ALMACEN) VALUES (?)", Array As Object (almacen)) +' Starter.skmt.ExecNonQuery2("INSERT INTO INICIO_SESION(CONECTADO) VALUES (?)", Array As Object (1)) +' +' B4XPages.ShowPage("Principal") +' End If +' End If +'End Sub +' +'Private Sub i_engrane_Click +' p_appUpdate.Width = Root.Width +' p_appUpdate.Height = Root.Height +' Subs.centraPanel(p_serverList, Root.Width) +' Subs.centraBoton(b_server, Root.Width) +' Subs.centraBoton(b_apk, Root.Width) +' Subs.centraBoton(b_envioBD, Root.Width) +' Subs.centraBoton(b_regesar, Root.Width) +' Subs.centraBoton(b_server, p_serverList.Width) +' lv_server.Clear +' lv_server.AddSingleLine("http://keymon.net:1782") +' +' If user.Text = "KMTS1" Then lv_server.AddSingleLine("http://10.0.0.205:1782") +'' l_server.Text = Starter.server +' et_server.Text = server +' Subs.panelVisible(p_appUpdate, 0, 0) +'End Sub +' +'Private Sub B4XPage_CloseRequest As ResumableSub +'' Log("closreq") +' If p_appUpdate.Visible Then +' p_appUpdate.Visible = False +' Else +' Sleep(0) +' ExitApplication +' End If +' Return False +'End Sub +' +'Private Sub b_regesar_Click +' p_principal.Visible = True +' p_appUpdate.Visible = False +'End Sub +' +''Enviamos la base de datos por correo o Whatsapp +'Private Sub b_envioBD_Click +'' copiaDB +'' Sleep(1000) +' Dim FileName As String = "kmt.db" +' 'copy the shared file to the shared folder +' Log("xxxxxx:"&Provider.SharedFolder) +' Sleep(1000) +' File.Copy(File.DirInternal, FileName, Provider.SharedFolder, FileName) +' Dim email As Email +' email.To.Add("soporte@keymonsoft.com") +' email.Subject = "Base de datos para revisión" +' email.Attachments.Add(Provider.GetFileUri(FileName)) +'' email.Attachments.Add(Provider.GetFileUri(FileName)) 'second attachment +' Dim in As Intent = email.GetIntent +' in.Flags = 1 'FLAG_GRANT_READ_URI_PERMISSION +' StartActivity(in) +'End Sub +' +'Private Sub b_apk_Click +' StartService(appUpdater) +'End Sub +' +'Private Sub b_server_Click +' Log("Guardar servidor") +' Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("SERVER")) +' Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("SERVER",et_server.text)) +' B4XPages.MainPage.server = et_server.text +' Starter.server = B4XPages.MainPage.server +' If logger Then Log("Inicializamos reqManager con " & B4XPages.MainPage.server) +' reqManager.Initialize(Me, B4XPages.MainPage.server) +' LogColor($"ReqServer = ${B4XPages.MainPage.server}"$, Colors.red) +' reinicializaReqManager +' p_appUpdate.Visible = False +'' Entrar.Visible = True +'End Sub +' +'Private Sub lv_server_ItemClick (Position As Int, Value As Object) +' server = Value +'' l_server.Text = Value +' et_server.Text = Value +' reqManager.Initialize(Me, Value) +' LogColor($"ReqServer = ${Value}"$, Colors.red) +' ToastMessageShow("Servidor modificado", False) +'End Sub +' +'Sub reinicializaReqManager +' reqManager.Initialize(Me, B4XPages.MainPage.server) +' If logger Then Log(B4XPages.MainPage.server) +' LogColor($"ReqServer = ${B4XPages.MainPage.server}"$, Colors.red) +'End Sub +' +''appUpdater - Mostramos el anuncio de que se esta descargando el nuevo apk +'Sub muestraProgreso(mensaje As String) +' ProgressDialogShow(mensaje) +'End Sub +' +''appUpdater - Ocultamos el anuncio de que se esta descargando el nuevo apk +'Sub ocultaProgreso +' ProgressDialogHide +'End Sub +' +'Private Sub b_CargarMonto_Click +' +' c = Starter.skmt.ExecQuery("SELECT * FROM kmt_info") +' c.Position = 0 +' If c.RowCount < 0 Or c.RowCount = 0 Then +' MsgboxAsync("No hay ruta cargada, favor de cargar día","Atención") +' Else +' Subs.panelVisible(p_add_monto,0,0) +' End If +' c.Close +' +'End Sub +' +'Private Sub p_add_monto_Click +' +'End Sub +' +''Private Sub B_Aceptar_Monto_Click +'' Private f As Cursor=Starter.skmt.ExecQuery("select RUTAA from RUTAA") +'' f.Position=0 +'' Private a As Cursor =Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") +'' a.Position = 0 +'' Dim cmd As DBCommand +'' cmd.Initialize +'' cmd.Name = "select_estatus_MAZAPA" +'' cmd.Parameters = Array As Object(a.GetString("ID_ALMACEN"),f.GetString("RUTAA")) +'' reqManager.ExecuteQuery(cmd , 0, "estatus") +'' f.Close +'' a.Close +''End Sub +' +'Sub enviarmonto +' +' DateTime.DateFormat = "MM/dd/yyyy" +' sDate=DateTime.Date(DateTime.Now) +' sTime=DateTime.Time(DateTime.Now) +' +' Private f As Cursor=Starter.skmt.ExecQuery("select RUTAA from RUTAA") +' f.Position=0 +' +' Private a As Cursor=Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") +' If a.RowCount>0 Then +' a.Position=0 +' End If +' +' Private a2 As Cursor = Starter.skmt.ExecQuery("SELECT HVD_FECHA FROM HIST_VENTAS") +' If a2.RowCount>0 Then +' a2.Position=0 +' Dim fecha() As String = Regex.Split(" ", a2.GetString("HVD_FECHA")) +' Dim fecha2() As String = Regex.Split("-", fecha(0)) +' Dim fecha3 As String = fecha2(2)&"/"&fecha2(1)&"/"&fecha2(0) +' Log(fecha3) +' Dim hora() As String = Regex.Split("\.", fecha(1)) +' Log(hora(0)) +' End If +' +' +' +' Private cI As Cursor +' Private u As String = "SinUsuario" +' cI=Starter.skmt.ExecQuery("select USUARIO from usuarioa") +' cI.Position=0 +' If cI.RowCount > 0 Then u = cI.GetString("USUARIO") +' Private g As Cursor = Starter.skmt.ExecQuery("select * from ENV_MONTO_LIQ") +'' If g.RowCount = 0 Then +'' Starter.skmt.ExecNonQuery2("INSERT INTO ENV_MONTO_LIQ VALUES (?,?,?,?,?)", Array As Object(ET_Add_Monto.Text, a.GetString("ID_ALMACEN"), f.GetString("RUTAA"), u, fecha3 & " " & hora(0))) +'' f.Close +'' a.Close +'' +'' c = Starter.skmt.ExecQuery("SELECT * FROM ENV_MONTO_LIQ") +'' If c.RowCount > 0 Then +'' c.Position = 0 +'' Dim cmd As DBCommand +'' cmd.Initialize +'' cmd.Name = "select_MontoCuenta_MAZAPArep" +'' cmd.Parameters = Array As Object(c.GetString("EML_USUARIO"), c.GetString("EML_ALMACEN"), c.GetString("EML_RUTA"),c.GetString("EML_FECHA_PED")) +'' reqManager.ExecuteQuery(cmd , 0, "SelectMontoLiq") +'' End If +'' c.Close +'' Else +'' Starter.skmt.ExecNonQuery2("UPDATE ENV_MONTO_LIQ SET EML_MONTO = ? WHERE EML_ALMACEN = ? AND EML_RUTA = ? AND EML_USUARIO = ?", Array As String (ET_Add_Monto.Text ,a.GetString("ID_ALMACEN"), f.GetString("RUTAA"), cI.GetString("USUARIO"))) +'' f.Close +'' a.Close +'' +'' c = Starter.skmt.ExecQuery("SELECT * FROM ENV_MONTO_LIQ") +'' If c.RowCount > 0 Then +'' c.Position = 0 +'' Dim cmd As DBCommand +'' cmd.Initialize +'' cmd.Name = "select_MontoCuenta_MAZAPArep" +'' cmd.Parameters = Array As Object(c.GetString("EML_USUARIO"), c.GetString("EML_ALMACEN"), c.GetString("EML_RUTA"),c.GetString("EML_FECHA_PED")) +'' reqManager.ExecuteQuery(cmd , 0, "SelectMontoLiq") +'' End If +'' c.Close +'' End If +' +' p_add_monto.Visible = False +' +'End Sub +' +'Private Sub B_Can_Monto_Click +' p_add_monto.Visible = False +'End Sub +' +'Private Sub b_arqueocieego_Click +' c = Starter.skmt.ExecQuery("SELECT * FROM CAT_GUNAPROD3") +' If c.RowCount > 0 Then +' Subs.panelVisible(p_validacion,0,0) +' Else +' MsgboxAsync("No hay ruta cargada, favor de cargar día","Atención") +' End If +'End Sub +' +'Private Sub et_buspc_TextChanged (Old As String, New As String) +' If New = "" Then +' CLV_PICK_CIEGO.Clear +' Else If New.Length >= 3 Then +' CLV_PICK_CIEGO.Clear +' +' q_buscar = "%" & et_buspc.Text & "%" +' Log(q_buscar) +' c=Starter.skmt.ExecQuery2($"select CAT_GP_NOMBRE, CAT_GP_ID , ifnull(PC_CANT,0) AS PC_CANT FROM CAT_GUNAPROD3 INNER JOIN PICK_CIEGO ON PC_ID_PROD = CAT_GP_ID AND PC_NOM_PROD = CAT_GP_NOMBRE WHERE (CAT_GP_NOMBRE LIKE ? OR CAT_GP_ID LIKE ? ) and CAT_GP_CLASIF <> 'PROMOS'"$, Array As String(q_buscar,q_buscar)) +' If c.RowCount > 0 Then +' +' +' For i = 0 To c.RowCount - 1 +' c.Position = i +' CLV_PICK_CIEGO.Add(CreateListItem(c.GetString("CAT_GP_ID"), c.GetString("CAT_GP_NOMBRE"), c.GetString("PC_CANT")),i) +'' Log(c.GetString("CAT_GP_ID") & ", " & c.GetString("CAT_GP_NOMBRE") & " ," & c.GetString("PC_CANT")) +' Next +' c.Close +' +' d=Starter.skmt.ExecQuery2($"select CAT_GP_NOMBRE, CAT_GP_ID FROM CAT_GUNAPROD3 WHERE (CAT_GP_NOMBRE LIKE ? OR CAT_GP_ID LIKE ? ) and CAT_GP_CLASIF <> 'PROMOS'AND CAT_GP_ID NOT IN (SELECT PC_ID_PROD FROM PICK_CIEGO)"$, Array As String(q_buscar,q_buscar)) +' +' For i = 0 To d.RowCount - 1 +' d.Position = i +' CLV_PICK_CIEGO.Add(CreateListItem2(d.GetString("CAT_GP_ID"), d.GetString("CAT_GP_NOMBRE")),i) +'' Log(d.GetString("CAT_GP_ID") & ", " & d.GetString("CAT_GP_NOMBRE")) +' Next +' d.Close +' +' Else If c.RowCount = 0 Then +' d=Starter.skmt.ExecQuery2($"select CAT_GP_NOMBRE, CAT_GP_ID FROM CAT_GUNAPROD3 WHERE (CAT_GP_NOMBRE LIKE ? OR CAT_GP_ID LIKE ? ) and CAT_GP_CLASIF <> 'PROMOS'"$, Array As String(q_buscar,q_buscar)) +' +' For i = 0 To d.RowCount - 1 +' d.Position = i +' CLV_PICK_CIEGO.Add(CreateListItem2(d.GetString("CAT_GP_ID"), d.GetString("CAT_GP_NOMBRE")),i) +'' Log(d.GetString("CAT_GP_ID") & ", " & d.GetString("CAT_GP_NOMBRE")) +' Next +' d.Close +' End If +' End If +'End Sub +' +'Private Sub B_PC_ENV_Click +' Dim sDate, sTime As String +' DateTime.DateFormat = "dd/MM/yyyy" +' DateTime.TimeFormat = "HH:mm:ss" +' sDate = DateTime.Date(DateTime.Now) +' sTime = DateTime.Time(DateTime.Now) +' +' +' For i = 0 To CLV_PICK_CIEGO.Size - 1 +' ' Retrieve the panel and child views for the current item +' Dim itemPanel As B4XView = CLV_PICK_CIEGO.GetPanel(i) +' Dim innerPanel As B4XView = itemPanel.GetView(0) +' Dim editText As B4XView = innerPanel.GetView(1) +' Dim inputText As String = editText.As(EditText).Text +' +' ' Check if the input text matches the regex pattern for zeros or if it's empty +' If Regex.IsMatch("^[0]+$", inputText) Or inputText = "" Then +' inputText = "0" +' End If +' +' ' Retrieve and process the ID label +' Dim idLabel As B4XView = innerPanel.GetView(0) +' Dim idText As String = idLabel.As(Label).Text +' Dim idParts() As String = Regex.Split(CRLF, idText) +'' Log(idParts(1)) +' f=Starter.skmt.ExecQuery("select RUTAA from RUTAA") +' f.Position=0 +' Log(f.GetString("RUTAA")) +' a=Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") +' If a.RowCount>0 Then +' a.Position=0 +' End If +' Dim k As Cursor = Starter.skmt.ExecQuery("SELECT HVD_FECHA FROM HIST_VENTAS") +' k.Position = 0 +' Dim fechatabulador() As String = Regex.Split(" ", k.GetString("HVD_FECHA")) +' Dim fechatabulador2() As String = Regex.Split("-", fechatabulador(0)) +' Dim fechatabulador3 As String = fechatabulador2(2)&"/"&fechatabulador2(1)&"/"&fechatabulador2(0) +' k.Close +' If inputText <> "" Then +' c = Starter.skmt.ExecQuery2("SELECT * FROM PICK_CIEGO where PC_ID_PROD = ?", Array As String (idParts(0))) +' If c.RowCount = 0 Then +' ' Insert data into the database +' Log(f.GetString("RUTAA")) +' Starter.skmt.ExecNonQuery2("INSERT INTO PICK_CIEGO(PC_ID_PROD, PC_NOM_PROD, PC_CANT, PC_ALMACEN, PC_RUTA, PC_FECHA) VALUES(?,?,?,?,?,?)", Array As String(idParts(0), idParts(1), inputText, a.GetString("ID_ALMACEN"), f.GetString("RUTAA"), fechatabulador3&" "&sTime)) +' +' Else +' Log(f.GetString("RUTAA")) +' Starter.skmt.ExecNonQuery2("Update PICK_CIEGO set PC_CANT = ? WHERE PC_ID_PROD = ?" , Array As String(inputText ,idParts(0))) +' End If +' +' End If +' f.Close +' a.Close +' Log("Processed item " & i) +' Next +' et_buspc.Text = "" +' CLV_PICK_CIEGO.Clear +'End Sub +' +'Private Sub b_terpc_Click +' Msgbox2Async("Una vez enviada la información no podras hacer modificaciones","Atención","SI","", "",LoadBitmap(File.DirAssets,"alert2.png"), False) +' Wait For Msgbox_Result (resultado As Int) +' If resultado = DialogResponse.POSITIVE Then +' Msgbox2Async("Estas seguro de enviar la información?","Atención","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) +' Wait For Msgbox_Result (resultado As Int) +' If resultado = DialogResponse.POSITIVE Then +' +' Dim sDate, sTime As String +' DateTime.DateFormat = "dd/MM/yyyy" +' DateTime.TimeFormat = "HH:mm:ss" +' sDate = DateTime.Date(DateTime.Now) +' sTime = DateTime.Time(DateTime.Now) +' +' For i = 0 To CLV_PICK_CIEGO.Size - 1 +' ' Retrieve the panel and child views for the current item +' Dim itemPanel As B4XView = CLV_PICK_CIEGO.GetPanel(i) +' Dim innerPanel As B4XView = itemPanel.GetView(0) +' Dim editText As B4XView = innerPanel.GetView(1) +' Dim inputText As String = editText.As(EditText).Text +' +' ' Check if the input text matches the regex pattern for zeros or if it's empty +' If Regex.IsMatch("^[0]+$", inputText) Or inputText = "" Then +' inputText = "0" +' End If +' +' ' Retrieve and process the ID label +' Dim idLabel As B4XView = innerPanel.GetView(0) +' Dim idText As String = idLabel.As(Label).Text +' Dim idParts() As String = Regex.Split(CRLF, idText) +'' Log(idParts(1)) +' f=Starter.skmt.ExecQuery("select RUTAA from RUTAA") +' f.Position=0 +' Log(f.GetString("RUTAA")) +' +' a=Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") +' If a.RowCount>0 Then +' a.Position=0 +' End If +' Log(a.GetString("ID_ALMACEN")) +' +' Dim k As Cursor = Starter.skmt.ExecQuery("SELECT HVD_FECHA FROM HIST_VENTAS") +' k.Position = 0 +' Dim fechatabulador() As String = Regex.Split(" ", k.GetString("HVD_FECHA")) +' Dim fechatabulador2() As String = Regex.Split("-", fechatabulador(0)) +' Dim fechatabulador3 As String = fechatabulador2(2)&"/"&fechatabulador2(1)&"/"&fechatabulador2(0) +' k.Close +' If inputText <> "" Then +' c = Starter.skmt.ExecQuery2("SELECT * FROM PICK_CIEGO where PC_ID_PROD = ?", Array As String (idParts(0))) +' If c.RowCount = 0 Then +' ' Insert data into the database +' Starter.skmt.ExecNonQuery2("INSERT INTO PICK_CIEGO(PC_ID_PROD, PC_NOM_PROD, PC_CANT, PC_ALMACEN, PC_RUTA, PC_FECHA) VALUES(?,?,?,?,?,?)", Array As String(idParts(0), idParts(1), inputText, a.GetString("ID_ALMACEN"), f.GetString("RUTAA"), fechatabulador3&" "&sTime)) +' Else +' Starter.skmt.ExecNonQuery2("Update PICK_CIEGO set PC_CANT = ? WHERE PC_ID_PROD = ?" , Array As String(inputText ,idParts(0))) +' End If +' End If +' f.Close +' a.Close +' Log("Processed item " & i) +' Next +' Log("Finished processing all items") +' P_CIEGO.Visible = False +' et_buspc.Text = "" +' CLV_PICK_CIEGO.Clear +' c = Starter.skmt.ExecQuery("SELECT PC_ID_PROD, PC_ALMACEN, PC_RUTA, PC_FECHA FROM PICK_CIEGO") +'' If c.RowCount > 0 Then +'' For i = 0 To c.RowCount - 1 +'' c.Position = i +'' Dim cmd As DBCommand +'' cmd.Initialize +'' cmd.Name = "select_HIST_PICKCIEGO_MAZAPA" ' +'' cmd.Parameters = Array As Object(c.GetString("PC_ID_PROD"), c.GetString("PC_ALMACEN"), c.GetString("PC_RUTA"), c.GetString("PC_FECHA"),"REPARTO") +'' reqManager.ExecuteQuery(cmd , 0, $"PICK_C_${c.GetString("PC_ID_PROD")}"$) +'' Next +'' End If +' c.close +' Else +' +' End If +' End If +'End Sub +' +'Private Sub P_CIEGO_Click +' +'End Sub +' +'Private Sub b_aceptar_Click +' Private f As Cursor=Starter.skmt.ExecQuery("select RUTAA from RUTAA") +' f.Position=0 +' Private a As Cursor =Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") +' a.Position = 0 +'' Dim cmd As DBCommand +'' cmd.Initialize +'' cmd.Name = "select_estatus_MAZAPA" +'' cmd.Parameters = Array As Object(a.GetString("ID_ALMACEN"),f.GetString("RUTAA")) +'' reqManager.ExecuteQuery(cmd , 0, "estatus2") +' f.Close +' a.Close +'' p_validacion.Visible = False +'' et_codigo.Text = "" +'' +'' Subs.panelVisible(P_CIEGO,0,0) +'End Sub +' +'Sub passaquci +' f=Starter.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info") +' f.Position=0 +' +' a=Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") +' If a.RowCount>0 Then +' a.Position=0 +' End If +' Log(a.GetString("ID_ALMACEN")) +' Log(f.GetString("CAT_CL_RUTA")) +' +'' If et_codigo.Text = "KMTS1" Then +'' p_validacion.Visible = False +'' et_codigo.Text = "" +'' Subs.panelVisible(P_CIEGO,0,0) +'' Else +'' Dim cmd As DBCommand +'' cmd.Initialize +'' cmd.Name = "select_CAT_PASS_ARQUEO_MAZAPA" +'' cmd.Parameters = Array As Object(f.GetString("CAT_CL_RUTA"),a.GetString("ID_ALMACEN"),"REPARTO") +'' reqManager.ExecuteQuery(cmd , 0, "contrasena") +'' f.Close +'' a.Close +'' End If +'End Sub +' +'Private Sub b_cancelarcodigo_Click +' p_validacion.Visible = False +'End Sub +' +'Private Sub p_validacion_Click +' +'End Sub +' +'Sub CreateListItem(Id_prod As String, Prod As String,cant As String) As Panel +' Dim pa As B4XView = xui.CreatePanel("") +' pa.SetLayoutAnimated(0, 0, 0, 1, 10) +' pa.LoadLayout("PANEL_PICK_CIEGO") +' pa.Height = 55dip +' pa.Width = 298dip +' 'pa.Width = clv_orden.GetBase.Width +' L_PICK_CIEGO.Text = Id_prod & CRLF & Prod +' L_PICK_CIEGO.TextSize = 12 +' L_PICK_CIEGO.Gravity = Bit.Or(Gravity.CENTER_VERTICAL, Gravity.CENTER_HORIZONTAL) +' ET_PICK_CIEGO.Text = cant +' 'cxc.Id_prod = mostrar3 +' 'Log(pa.Width) +' Return pa +'End Sub +' +'Sub CreateListItem2(Id_prod As String, Prod As String) As Panel +' Dim pa As B4XView = xui.CreatePanel("") +' pa.SetLayoutAnimated(0, 0, 0, 1, 10) +' pa.LoadLayout("PANEL_PICK_CIEGO") +' pa.Height = 55dip +' pa.Width = 298dip +' 'pa.Width = clv_orden.GetBase.Width +' L_PICK_CIEGO.Text = Id_prod & CRLF & Prod +' L_PICK_CIEGO.TextSize = 12 +' L_PICK_CIEGO.Gravity = Bit.Or(Gravity.CENTER_VERTICAL, Gravity.CENTER_HORIZONTAL) +' 'cxc.Id_prod = mostrar3 +' 'Log(pa.Width) +' Return pa +'End Sub +' +'Private Sub ImageView1_LongClick +' +'End Sub +' +'Private Sub p_appUpdate_Click +' +'End Sub +' + +#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=git&Args=pull + '########################################################################################################### + '###################### PUSH ############################################################# + 'Ctrl + click ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=github&Args=..\..\ + '########################################################################################################### + '###################### PUSH TORTOISE GIT ######################################################### + 'Ctrl + click ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=TortoiseGitProc&Args=/command:commit&Args=/path:"./../../"&Args=/closeonend:2 + '########################################################################################################### +#End Region + +'Ctrl + click to export as zip: ide://run?File=%B4X%\Zipper.jar&Args=Project.zip + +Sub Class_Globals + Dim rp As RuntimePermissions + Private Root As B4XView + Private xui As XUI + Private Root As B4XView + Public rp As RuntimePermissions + Public login As B4XMainPage + Public principal As C_Principal + Public clientes As C_Clientes + Public cliente As C_Cliente +' Public foto As C_Foto + Public productos As C_Productos + Public updateAvailable As C_UpdateAvailable + Public mapas As C_Mapas + Public nuevoCliente As C_NuevoCliente + Public ticketsDia As C_TicketsDia + Public noVenta As C_NoVenta + Public pedidos As C_Pedidos + Public buscar As C_Buscar +' Public historico As C_Historico + Public detalleVenta As C_DetalleVenta + Public detalle_promo As C_Detalle_Promo + Dim reqManager As DBRequestManager +' Dim ruta As String + Dim usuario As String + Dim logger As Boolean = True + Dim lat_gps, lon_gps As String +' Dim skmt As SQL + Dim usuario As String + Dim server As String + Dim montoActual, clientesTotal, clientesVenta, clientesRechazo, clientesVisitados, almacen, rutaPreventa, CANTIDADPROD As String + Dim ultimaActualizacionGPS As String = 235959 + Dim fechaRuta As String +' Public wsServerLink As String = "ws://187.189.244.154:51042/push/b4a_ws2" +' Public wsServerLink As String = "ws://10.0.0.214:51042/push/b4a_ws2" + Dim srvIp As String + Dim phn As Phone + Dim user As EditText + Dim pass As EditText + Dim c As Cursor + Dim existe As String + Dim paso1 As String + Private IMEN As Label + Dim IMEI As String + Private Label1 As Label + Dim server As String + Private p_principal As Panel + Private Entrar As Button + Public checklist As C_Cheklist + Public tabulador As C_tabulador + Dim batt As Int + Dim monto_entregadoactual As String + Dim piezas_entregdas As String + Dim porVisitar, entregas, rechazos, montoEntregado, montoRechazado As String + Private p_appUpdate As Panel + Private i_engrane As ImageView + Private b_server As Button + Private b_apk As Button + Private b_envioBD As Button + Private b_regesar As Button + Private et_server As EditText + Private p_serverList As Panel + Private lv_server As ListView + Public Provider As FileProvider + Public rutaBDBackup As String = "" + Private B_Can_Monto As Button + Private B_Aceptar_Monto As Button + Private ET_Add_Monto As EditText + Private p_add_monto As Panel + Dim sDate, sTime As String + Private p_validacion As Panel + Private b_cancelarcodigo As Button + Private b_aceptar As Button + Private et_codigo As EditText + Private P_CIEGO As Panel + Private b_terpc As Button + Private B_PC_ENV As Button + Private CLV_PICK_CIEGO As CustomListView + Private et_buspc As EditText + Dim q_buscar As String + Dim d As Cursor + Private L_PICK_CIEGO As Label + Private ET_PICK_CIEGO As EditText + Dim a As Cursor + Dim f As Cursor + Private b_abono As Button + Private cb_importarBDWA As CheckBox + Private p_importarBDWA As Panel + + Dim intentUsado As Boolean = False + Private p_bypass As Panel + Private et_bypass As EditText + Private b_cancelabypass As Button + Private b_acepbypass As Button + Private b_bypass As Button + + Private p_finDia As Panel + Private b_findiaOk As Button + Private b_fdCancelar As Button + Private et_autSup As EditText + Private b_borrarFinDia As Button + Private p_transFinDia As Panel + Private b_cancelarFD As Button + Private b_aceptarFD As Button + Private Panel10 As Panel + Private et_passFinDia As EditText + + Private teclado As IME +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 + B4XPages.GetManager.LogEvents = True + Root.LoadLayout("login") +' B4XPages.SetTitle(Me, "Guna Reparto") + login.Initialize + B4XPages.AddPage("Login", login) + principal.Initialize + B4XPages.AddPage("Principal", principal) + clientes.Initialize + B4XPages.AddPage("Clientes", clientes) + cliente.Initialize + B4XPages.AddPage("Cliente", cliente) +' foto.Initialize +' B4XPages.AddPage("Foto", foto) + productos.Initialize + B4XPages.AddPage("Productos", productos) + updateAvailable.Initialize + B4XPages.AddPage("updateAvailable", updateAvailable) + mapas.Initialize + B4XPages.AddPage("Mapas", mapas) + nuevoCliente.Initialize + B4XPages.AddPage("NuevoCliente", nuevoCliente) + ticketsDia.Initialize + B4XPages.AddPage("TicketsDia", ticketsDia) + noVenta.Initialize + B4XPages.AddPage("NoVenta", noVenta) + pedidos.Initialize + B4XPages.AddPage("Pedidos", pedidos) + buscar.Initialize + B4XPages.AddPage("Buscar", buscar) +' historico.Initialize +' B4XPages.AddPage("Historico", historico) + detalleVenta.Initialize + B4XPages.AddPage("DetalleVenta", detalleVenta) + detalle_promo.Initialize + B4XPages.AddPage("Detalle_Promo", detalle_promo) + tabulador.Initialize + B4XPages.AddPage("tabulador", tabulador) + checklist.Initialize + B4XPages.AddPage("checklist",checklist) +' p_principal.Width = Root.Width +' p_principal.Height = Root.Height * .90 + Entrar.Left = (p_principal.Width - Entrar.Width) / 2 + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CAT_GUNAPROD3 (CAT_GP_INICIATIVA TEXT, CAT_GP_TIPOPROD TEXT, CAT_GP_DEV TEXT, CAT_GP_ALMACEN NUMERIC, CAT_GP_ID TEXT, CAT_GP_NOMBRE TEXT, CAT_GP_IMP1 TEXT, CAT_GP_IMP2 TEXT, CAT_GP_PRECIO TEXT, CAT_GP_CLASIF TEXT, CAT_GP_STS TEXT, CAT_GP_TIPO TEXT, CAT_GP_SUBTIPO TEXT, CAT_GP_IMG BLOB)") + Subs.agregaColumna("CAT_GUNAPROD3", "CAT_DP_CONVERSION1", "TEXT") + Subs.agregaColumna("CAT_GUNAPROD3", "CAT_DP_PRECIO4", "TEXT") + Subs.agregaColumna("CAT_GUNAPROD3", "CAT_DP_CANT_MIN_VENTA", "TEXT") + Subs.agregaColumna("ABONOS","TIPO_PAGO","TEXT") + Subs.agregaColumna("ABONOS","a_numpago","TEXT") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS COMENTARIOS (COMENTARTIO TEXT, CLIENTE TEXT, DESCARGADO TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS GEOCERCA (ACTIVA TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS BARRAS (BARRA BLOB)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS ABONOS (a_usuario TEXT, a_ruta TEXT, a_cliente TEXT, a_abono TEXT, a_fecha TEXT, a_enviado TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS PAGARES (PA_ALMACEN TEXT, PA_RUTA_REP TEXT, PA_RUTAPREV TEXT, PA_FECHA_PREV TEXT, PA_CAPTURA TEXT, PA_MONTO TEXT, PA_USUARIO TEXT, PA_CLIENTE TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS PICK_CIEGO (PC_ID_PROD TEXT, PC_NOM_PROD TEXT, PC_CANT TEXT, PC_ALMACEN TEXT, PC_RUTA TEXT, PC_FECHA TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS ENV_MONTO_LIQ (EML_MONTO TEXT, EML_ALMACEN TEXT, EML_RUTA TEXT, EML_USUARIO TEXT, EML_FECHA_PED TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS TABULADOR_MONEDAS(VEINTE TEXT, DIEZ TEXT, CINCO TEXT, DOS TEXT, PESO TEXT, CENTAVO TEXT, TOTAL TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS TABULADOR_BILLETES(MIL TEXT, QUINIENTOS TEXT, DOCIENTOS TEXT, CIEN TEXT, CINCUENTA TEXT, VEINTE TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_VENTAS2 (HVD_PARCIAL TEXT, HVD_RECHAZO TEXT, HVD_NUM_REGISTRO TEXT, HVD_NUM_TICKET TEXT, HVD_PROID TEXT, HVD_CODPROMO TEXT, HVD_FECHA TEXT, HVD_ESTATUS TEXT, HVD_CLIENTE TEXT, HVD_PRONOMBRE TEXT, HVD_CANT TEXT, HVD_COSTO_TOT TEXT)") +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS VENTAS (V_FECHA TEXT, V_CLIENTE TEXT, V_CLIENTE_ORIG TEXT, V_PRODNOMBRE TEXT, V_PRODID TEXT, V_CANTIDAD TEXT, V_PRECIO TEXT, V_TOTAL TEXT, V_PRODREGISTRO TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS RECHAZOS (R_FECHA TEXT, R_CLIENTE TEXT, R_CLI_ORIG TEXT, R_PRODID TEXT, R_CANT TEXT, R_RECHAZO INT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS VENTAS (V_FECHA TEXT, V_CLIENTE TEXT, V_CLI_ORIG TEXT, V_PRODID TEXT, V_CANT TEXT, V_RECHAZO INT)") + + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS FOTOS (CLIENTE TEXT, FOTO BLOB, MOVIMIENTO TEXT, FECHA TEXT)") + + + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CONTADOS (RUTA_PREV TEXT, RUTA_REP TEXT, FECHA_PREV TEXT, FECHA TEXT, ALMACEN TEXT, NUM_TICKET TEXT, MONTO TEXT, METODO_PAGO TEXT, USUARIO TEXT, CLIENTE TEXT, NUM_PAGO TEXT)") + + +' Starter.skmt.ExecNonQuery("DROP TABLE IF EXISTS ABONOSP") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CHECADO_CHECK(CHECADO TEXT)") + + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CODIGO_CREDITO(CLIENTE TEXT, CAT_CL_CORERROR TEXT)") + + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS BLOCKENVIO(ENVIADO TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_REPARTO_GEO(HIST_RG_MONTO TEXT, HIST_RG_CREDITO TEXT, HIST_RG_MONTO_CREDITO TEXT, HIST_RG_LAT TEXT, HIST_RG_LONG TEXT, HIST_RG_RECHAZO TEXT, HIST_RG_MOTIVO TEXT, HIST_RG_USUARIO_ENTREGO TEXT, HIST_RG_RUTA_REP TEXT, HIST_RG_ESTATUS_ENTREGA TEXT, HIST_RG_COMENTARIO_ENTREGA TEXT, HIST_RG_FORMA_PAGO TEXT, HIST_RG_GEOCERCA_MTS TEXT, HIST_RG_NO_ART TEXT, HIST_RG_CLIENTE TEXT, HIST_RG_FECHA TEXT, HIST_RG_ALMACEN TEXT, HIST_RG_RUTA_PRE TEXT)") + +' Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS PAGARES(TMP_MONTO_PAGARE TEXT, TMP_CLIENTE TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CHECKLIST(USUARIO TEXT, PLACA TEXT, FECHA_CAPTURA TEXT, TARJETA_CIRCULACION TEXT , POLIZA_SEGURO TEXT, LICENCIA_CONDUCIR TEXT, LIMPIA_EXTERNA TEXT, LIMPIA_INTERNA TEXT, TRIANGULO TEXT, GATO TEXT, LLANTA_REFACCION TEXT, CARROCERIA_BUENESTADO TEXT, CARROCERIA_MALESTADO TEXT, CARROCERIA_COMENTARIOS TEXT, LUCES_CORRECTO TEXT, LUCES_INCORRECTO TEXT, LUCES_COMENTARIOS TEXT, CONDICION_PLACAS_CORRECTO TEXT, CONDICION_PLACAS_INCORRECTO TEXT, CONDICION_PLACAS_COMENTARIOS TEXT, CONDICION_LLANTAS_DEL_DER TEXT, CONDICION_LLANTAS_DEL_IZQ TEXT, CONDICION_LLANTAS_TRASERA_DER TEXT, CONDICION_LLANTAS_TRASERA_IZQ TEXT, ACEITE TEXT, ANTICONGELANTE TEXT, FRENOS TEXT, AIRE TEXT, FUGAS TEXT, COMETARIOS_FUGAS TEXT, FOTO1 BLOB, FOTO12 BLOB, FOTO3 BLOB, FOTO4 BLOB)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CHECKLIST2(USUARIO TEXT, PLACA TEXT, FECHA_CAPTURA TEXT, TARJETA_CIRCULACION TEXT, POLIZA_SEGURO TEXT, LICENCIA_CONDUCIR TEXT, LIMPIA_EXTERNA TEXT, LIMPIA_INTERNA TEXT, TRIANGULO TEXT, GATO TEXT, LLANTA_REFACCION TEXT, CARROCERIA TEXT, CARROCERIA_COMENTARIOS TEXT, LUCES TEXT, LUCES_COMENTARIOS TEXT, CONDICION_PLACAS TEXT, CONDICION_PLACAS_COMENTARIOS TEXT, CONDICION_LLANTAS_DEL_DER TEXT, CONDICION_LLANTAS_DEL_IZQ TEXT, CONDICION_LLANTAS_TRASERA_DER TEXT, CONDICION_LLANTAS_TRASERA_IZQ TEXT, ACEITE TEXT, ANTICONGELANTE TEXT, FRENOS TEXT, AIRE TEXT, FUGAS TEXT, COMETARIOS_FUGAS TEXT, FOTO1 BLOB, FOTO12 BLOB, FOTO3 BLOB, FOTO4 BLOB, KILIMETRAJE TEXT, RUTA TEXT)") + Subs.agregaColumna("REPARTO", "REP_PRODREGISTRO", "TEXT") + Subs.agregaColumna("NOVENTA", "NV_RUTA", "TEXT") + Subs.agregaColumna("ABONOS", "a_ticket", "TEXT") + Subs.agregaColumna("ABONOS", "a_tipoabono", "TEXT") + + Subs.agregaColumna("PAGARES", "PA_CANCELADO", "TEXT") + + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS ABONOSP(NOTA TEXT, CLIENTE TEXT, SALDO_PENDIENTE TEXT)") + Subs.agregaColumna("ABONOSP", "NOMBRE", "TEXT") + Subs.agregaColumna("ABONOSP", "FECHA_PREVENTA", "DATE") + Subs.agregaColumna("ABONOSP", "DIAS", "DATE") + Subs.agregaColumna("ABONOSP", "DIASATRASO", "DATE") + + + Subs.agregaColumna("kmt_info", "SECUENCIA", "INT") + Subs.agregaColumna("NOVENTA", "NV_FOTO2", "BLOB") + Subs.agregaColumna("kmt_info", "CAT_CL_SALDODISPONIBLE", "TEXT") + Subs.agregaColumna("kmt_info", "CAT_CL_DIASCREDITO", "INT") + + Subs.agregaColumna("kmt_info", "CAT_CL_CORERROR", "INT") + + Subs.agregaColumna("kmt_info", "HORAENT", "TEXT") + Subs.agregaColumna("REPARTO", "REP_PRODID", "TEXT") + Subs.agregaColumna("PEDIDO", "PE_CLIENTEOR", "TEXT") + Subs.agregaColumna("PAGARES", "PA_TICKET", "TEXT") + Subs.agregaColumna("PEDIDO", "PE_CAJAS", "TEXT") + Subs.agregaColumna("PEDIDO", "PE_REGALO", "TEXT") + Subs.agregaColumna("PEDIDO", "PE_BCAJAS", "TEXT") + Subs.agregaColumna("PEDIDO", "CONSECUTIVO", "TEXT") + Subs.agregaColumna("PEDIDO", "FECHA_PREV", "TEXT") + Subs.agregaColumna("PEDIDO", "RUTA_REP", "TEXT") + Subs.agregaColumna("REPARTO", "REP_CLI_ORIG", "TEXT") + Subs.agregaColumna("REPARTO", "REP_PRECIO", "TEXT") + Subs.agregaColumna("REPARTO", "REP_RECHAZO", "INTEGER") + Subs.agregaColumna("RECHAZOS", "R_PRECIO", "TEXT") + Subs.agregaColumna("VENTAS", "V_PRECIO", "TEXT") + Subs.agregaColumna("HIST_VENTAS","PLACA","TEXT") + Subs.agregaColumna("HIST_VENTAS","HVD_RECHAZOCANT","TEXT") + Subs.agregaColumna("HIST_VENTAS","CONSECUTIVO","TEXT") + Subs.agregaColumna("HIST_VENTAS","HVD_RECHAZOCANT","TEXT") + Subs.agregaColumna("HIST_VENTAS","ESPROMO","TEXT") + Subs.agregaColumna("HIST_VENTAS","HVD_RECHAZOCANTC","TEXT") + Subs.agregaColumna("HIST_VENTAS","BCAJAS","TEXT") + Subs.agregaColumna("HIST_VENTAS","CANTC","TEXT") + Subs.agregaColumna("HIST_VENTAS","BCAJAS_OR","TEXT") + Subs.agregaColumna("HIST_VENTAS","CANTC_OR","TEXT") + Subs.agregaColumna("CAT_GUNAPROD","CONVERSION","TEXT") + Subs.agregaColumna("kmt_info","CAT_CL_LIMITECREDITO","TEXT") + Subs.agregaColumna("kmt_info","CAT_CL_TIPOCLIENTE","TEXT") + Subs.agregaColumna("kmt_info","CAT_CL_VCREDITO","TEXT") + Subs.agregaColumna("kmt_info","CAT_CL_VCODIGO","TEXT") + Subs.agregaColumna("CAT_GUNAPROD","PRECIOCONVER","TEXT") + Subs.agregaColumna("CAT_GUNAPROD","CAT_GP_PRECIO2","TEXT") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS RUTAA (RUTAA TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS wayPoints (codigo TEXT, indice INT)") + Dim server As String = "http://keymon.net:1782" +' Dim server As String = "http://192.168.100.10:1781" +' Dim server As String = "http://keymon.lat:9000" +' server = "http://10.0.0.205:1782" +' Dim server As String = "http://192.168.100.10:1781" +' server = "http://11.0.0.44:1782" + reqManager.Initialize(Me, B4XPages.MainPage.server) + LogColor($"ReqServer = ${B4XPages.MainPage.server}"$, Colors.red) + Label1.Text = Application.VersionName +' Dim P As PhoneId + Log("provider") + Provider.Initialize + + Subs.guardaAppInfo + +' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_READ_PHONE_STATE) +' Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) +' If Result Then +' IMEN.Text = "" 'P.GetDeviceId +' IMEI = "" 'P.GetDeviceId +' End If + + 'Revisamos si se disparo el intent de cargar la base de datos desde WhatApp. + If Subs.traeUsarIntentBDWA Then + Subs.importaBDDesdeWhatsApp + End If + + p_transFinDia.top = 0 : p_transFinDia.Left = 0 + p_transFinDia.Width = Root.Width : p_transFinDia.Height = Root.Height + Subs.centraPanel(Panel10, Root.Width) +End Sub + +Sub B4XPage_Appear + If Starter.muestraProgreso = 1 Then + muestraProgreso("Descargando actualización") + Starter.muestraProgreso = 0 + End If + Subs.centraPanel(p_principal, Root.Width) + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION) +' LogColor("Start Tracker1", Colors.red) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) + If Result Then + If Not(Tracker.Tracking) Then StartService(Tracker) +' LogColor("Start Tracker", Colors.red) + Else + ToastMessageShow("No permission", True) + Log("Sin permisos") + End If +' LogColor("Start Tracker3", Colors.red) + c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + If c.RowCount > 0 Then +' c.Position=0 +' c=skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + End If + c.Close + + cb_importarBDWA.Checked = Subs.traeUsarIntentBDWA + If user.Text.Trim = "KMTS1" Then + p_importarBDWA.Visible = True + Else + p_importarBDWA.Visible = False + 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("Con permisos de escritura externa") +' End If +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub Entrar_Click + If pass.Text = "YA" Then + Starter.skmt.ExecNonQuery("delete from usuarioa") + Starter.skmt.ExecNonQuery("delete from VERSION") + Starter.skmt.ExecNonQuery2("INSERT INTO USUARIOA VALUES (?,?)", Array As Object("ROOT", "ROOT")) + Starter.skmt.ExecNonQuery("delete from cat_almacen") + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_ALMACEN(ID_ALMACEN) VALUES (?)", Array As Object (user.Text)) + Starter.skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object ("2.1")) +' principal.B_REGRESA_Click +' B4XPages.MainPage.principal.Subir.Visible = True + B4XPages.ShowPage("Principal") + Else + c=Starter.skmt.ExecQuery2("select count(*) as EXISTE1 from usuarioa where usuario = ?", Array As String(user.Text)) + c.Position=0 + existe = c.GetString("EXISTE1") + c.Close + 'existe = 1 + If existe = 0 Then + 'skmt.ExecNonQuery("delete from usuarioa") + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_usuario_GUNA_REPG_VN" + cmd.Parameters = Array As Object(user.Text, pass.Text) + reqManager.ExecuteQuery(cmd , 0, "usuario") + +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "select_version_INTMEX" +' reqManager.ExecuteQuery(cmd , 0, "version") + Else +' principal.B_REGRESA_Click + B4XPages.ShowPage("Principal") + End If + End If +End Sub + +Sub JobDone(Job As HttpJob) + If Job.Success = False Then + ToastMessageShow("Error: " & Job.ErrorMessage, True) + Else + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "version" Then 'query tag + For Each records() As Object In result.Rows + Starter.skmt.ExecNonQuery("delete from VERSION") + Dim CAT_VE_VERSION As String = records(result.Columns.Get("CAT_VE_VERSION")) + Starter.skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object (CAT_VE_VERSION)) + Next + End If + End If + + If result.Tag = "codigoAutorizacion" Then + If result.Rows.Size > 0 Then + Log("Si hay codigo de autorizaion") + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log(k & ": " & records(result.Columns.Get(k))) + Next + Next + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "delete_codigoAutorizacion_REP" + cmd.Parameters = Array As Object(et_passFinDia.Text.Trim, Subs.traeRutaReparto, Subs.traeAlmacen) + reqManager.ExecuteCommand(cmd , "deleteCodigoAutorizacion") + DateTime.DateFormat = "YYYY/MM/dd HH:mm:ss" + Starter.skmt.ExecNonQuery("UPDATE CAT_VARIABLES SET CAT_VA_VALOR = '' where CAT_VA_DESCRIPCION = 'FINDIA_FECHA'") + p_transFinDia.Visible = False + et_passFinDia.Text = "" + teclado.HideKeyboard + ToastMessageShow("Listo, ya se puede hacer FIN DIA.", True) + Else + ToastMessageShow("El codigo es incorrecto, por favor revise y vuelva a intentar!!", True) + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "agencia" Then 'query tag + For Each records() As Object In result.Rows + + Dim ID_ALMACEN As String = records(result.Columns.Get("ID_ALMACEN")) + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "coords_almacen" Then 'query tag + For Each records() As Object In result.Rows + Log("Coordenadas del almacen: " & records(result.Columns.Get("CAT_AL_LATITUD")) & "," & records(result.Columns.Get("CAT_AL_LONGITUD"))) + Private lat, lon As Double + lat = 0.0 + lon = 0.0 + If IsNumber(records(result.Columns.Get("CAT_AL_LATITUD"))) And IsNumber(records(result.Columns.Get("CAT_AL_LONGITUD"))) Then + lat = records(result.Columns.Get("CAT_AL_LATITUD")) + lon = records(result.Columns.Get("CAT_AL_LONGITUD")) + End If + Starter.cedisLocation.Latitude = lat + Starter.cedisLocation.Longitude = lon + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("COORDS_ALMACEN")) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("COORDS_ALMACEN",lon&","&lat)) + '19.48118148992086,-99.15295579261536 + Next + End If + End If + + 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 + Dim name As String = records(result.Columns.Get("USUARIO")) + Dim ID_ALMACEN As String = records(result.Columns.Get("CAT_LO_AGENCIA")) + Dim IMEI_BASE As String = records(result.Columns.Get("CAT_LO_IDTELEFONO")) + Next + paso1 = 1 + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "contrasena" Then 'query tag + For Each records() As Object In result.Rows + Dim CAT_PA_PASS As String = records(result.Columns.Get("CAT_PA_PASS")) + If CAT_PA_PASS = et_codigo.Text Then + Log(CAT_PA_PASS) + p_validacion.Visible = False + et_codigo.Text = "" + + Subs.panelVisible(P_CIEGO,0,0) + + Else + MsgboxAsync("Contraseña incorrecta","Atención") + End If + Next + End If + End If + +' If Job.JobName = "DBRequest" Then +' Dim result As DBResult = reqManager.HandleJob(Job) +' If result.Tag.As(String).IndexOf("PICK_C_") > -1 Then 'query tag + '' Subs.logJobDoneResultados(result) +' Private id As String= result.Tag +' id = id.SubString(id.IndexOf("_")+3) +' For Each records() As Object In result.Rows +' Dim CUENTA As String = records(result.Columns.Get("CUENTA")) +' Log(CUENTA) +' Log(id) +' If CUENTA = 0 Then +' c = Starter.skmt.ExecQuery2("SELECT * FROM PICK_CIEGO WHERE PC_ID_PROD = ?", Array As String (id)) +' If c.RowCount > 0 Then + '' For i=0 To c.RowCount -1 +' c.Position=0 +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "insert_PICKCIEGO_MAZAPA" +' cmd.Parameters = Array As Object(c.GetString("PC_ID_PROD"), c.GetString("PC_NOM_PROD"), c.GetString("PC_CANT"), c.GetString("PC_ALMACEN"), c.GetString("PC_RUTA"), c.GetString("PC_FECHA"),"REPARTO") +' reqManager.ExecuteCommand(cmd , "ins_PC") + '' Next +' End If +' c.Close +' Else if CUENTA > 0 Then +' c = Starter.skmt.ExecQuery2("SELECT * FROM PICK_CIEGO WHERE PC_ID_PROD= ?", Array As String (id)) +' If c.RowCount > 0 Then + '' For i=0 To c.RowCount -1 +' c.Position = 0 +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "update_PICKCIEGO_MAZAPA" +' Log("FECHA" & c.GetString("PC_FECHA")) +' cmd.Parameters = Array As Object(c.GetString("PC_CANT"), c.GetString("PC_ID_PROD"), c.GetString("PC_ALMACEN"), c.GetString("PC_RUTA"), c.GetString("PC_FECHA"),"REPARTO") +' reqManager.ExecuteCommand(cmd, "update_PC") + '' Next +' End If +' c.Close +' End If + ' +' Next +' End If +' End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "estatus" Then 'query tag + For Each records() As Object In result.Rows + Dim hvd_estatus As String = records(result.Columns.Get("HVD_ESTATUS")) + If hvd_estatus = "Liquidado" Then + ' ToastMessageShow("rojo val ok 1 cuantosp." , True) + MsgboxAsync("La venta ya fue liquidada","Atención") + Else + enviarmonto + End If + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "estatus2" Then 'query tag + For Each records() As Object In result.Rows + Dim hvd_estatus As String = records(result.Columns.Get("HVD_ESTATUS")) + If hvd_estatus = "Liquidado" Then + ' ToastMessageShow("rojo val ok 1 cuantosp." , True) + MsgboxAsync("La venta ya fue liquidada","Atención") + Else + passaquci + End If + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "SelectMontoLiq" Then + For Each records() As Object In result.Rows + Dim CUENTA As String = records(result.Columns.Get("CUENTA")) + + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Private f As Cursor=Starter.skmt.ExecQuery("select RUTAA from RUTAA") + f.Position=0 + Private a As Cursor =Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + a.Position = 0 + + Private c2 As Cursor + c2=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c2.Position=0 + If c2.RowCount > 0 Then c2.GetString("USUARIO") + + Log(CUENTA & "----------------------!!") + If CUENTA = "0" Then + +' c = Starter.skmt.ExecQuery2("SELECT * FROM ENV_MONTO_LIQ WHERE EML_USUARIO = ? AND EML_ALMACEN = ? AND EML_RUTA = ?", Array As String (c2.GetString("USUARIO"), a.GetString("ID_ALMACEN"), f.GetString("RUTAA"))) +' If c.RowCount > 0 Then + '' For i=0 To c.RowCount -1 +' c.Position=0 +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "insert_Monto_Liq_MAZAPArep" +' cmd.Parameters = Array As Object(c.GetString("EML_MONTO"), c.GetString("EML_ALMACEN"), f.GetString("RUTAA"), c.GetString("EML_USUARIO"), "REPARTO", c.GetString("EML_FECHA_PED")) +' reqManager.ExecuteCommand(cmd , "ins_Mon_Liq") +' MsgboxAsync("Monto Enviado", "Atención") + '' Next +' End If +' c.Close + Else if CUENTA > "0" Then + +' c = Starter.skmt.ExecQuery2("SELECT * FROM ENV_MONTO_LIQ WHERE EML_USUARIO = ? AND EML_ALMACEN = ? AND EML_RUTA = ?", Array As String (c2.GetString("USUARIO"), a.GetString("ID_ALMACEN"), f.GetString("RUTAA"))) +' If c.RowCount > 0 Then + '' For i=0 To c.RowCount -1 +' c.Position = 0 +' cmd.Initialize +' cmd.Name = "update_MontoCuenta_MAZAPArep" +' cmd.Parameters = Array As Object(c.GetString("EML_MONTO"), c.GetString("EML_ALMACEN"), c.GetString("EML_RUTA"), c.GetString("EML_USUARIO"),c.GetString("EML_FECHA_PED"),"REPARTO") +' +' Log(c.GetString("EML_MONTO")& " " & c.GetString("EML_ALMACEN")& " " & c.GetString("EML_RUTA")& " " & c.GetString("EML_USUARIO")) +' reqManager.ExecuteCommand(cmd, "update_MC") +' MsgboxAsync("Se sobre escribio el Monto", "Atención") + '' Next +' End If +' c2.Close +' c.Close + End If + f.Close + a.Close + Next + End If + End If + + Job.Release + End If + + If paso1 = 1 Then + If name = "OKActivo" Then + Starter.skmt.ExecNonQuery("delete from usuarioa") + Starter.skmt.ExecNonQuery2("INSERT INTO USUARIOA VALUES (?,?)", Array As Object(user.Text, pass.Text)) + Starter.skmt.ExecNonQuery("delete from cat_almacen") + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_ALMACEN(ID_ALMACEN) VALUES (?)", Array As Object (ID_ALMACEN)) + B4XPages.ShowPage("Principal") + Else If name = "OKExpirado"& IMEI Then + Msgbox("Usuario Expirado llamar al administrador","") 'ignore + Else If name = "OKCancelado"& IMEI Then + Msgbox("Usuario Cancelado llamar al administrador","") 'ignore + Else + Msgbox("Usuario o password No validos","") 'ignore + End If + paso1 = 0 + End If +End Sub + +Private Sub i_engrane_Click + p_appUpdate.Width = Root.Width + p_appUpdate.Height = Root.Height + Subs.centraPanel(p_serverList, Root.Width) + Subs.centraPanel(p_serverList, Root.Width) + Subs.centraBoton(b_server, Root.Width) + Subs.centraBoton(b_apk, Root.Width) + Subs.centraBoton(b_envioBD, Root.Width) + Subs.centraBoton(b_regesar, Root.Width) + Subs.centraBoton(b_bypass, Root.Width) + Subs.centraBoton(b_borrarFinDia, Root.Width) + Subs.centraBoton(b_server, p_serverList.Width) + lv_server.Clear + lv_server.AddSingleLine("http://keymon.net:1782") + + If user.Text = "KMTS1" Then lv_server.AddSingleLine("http://10.0.0.205:1782") +' l_server.Text = Starter.server + et_server.Text = server + Subs.panelVisible(p_appUpdate, 0, 0) + Subs.panelVisible(p_transFinDia, 0, 0) + p_transFinDia.Visible = False + + If user.Text.Trim = "KMTS1" Then + p_importarBDWA.Visible = False + Else + p_importarBDWA.Visible = False + End If + If user.Text.trim = "KMTS1" Then b_bypass.Visible = True Else b_bypass.Visible = False +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub +' Log("closreq") + If p_appUpdate.Visible Then + p_appUpdate.Visible = False + Else + Sleep(0) + ExitApplication + End If + Return False +End Sub + +Private Sub b_regesar_Click + p_principal.Visible = True + p_appUpdate.Visible = False +End Sub + +'Enviamos la base de datos por correo o Whatsapp +Private Sub b_envioBD_Click +' copiaDB +' Sleep(1000) + Dim FileName As String = "kmt.db" + 'copy the shared file to the shared folder + Log("xxxxxx:"&Provider.SharedFolder) + Sleep(1000) + File.Copy(File.DirInternal, FileName, Provider.SharedFolder, FileName) + Dim email As Email + email.To.Add("soporte@keymonsoft.com") + email.Subject = "Base de datos para revisión" + email.Attachments.Add(Provider.GetFileUri(FileName)) +' email.Attachments.Add(Provider.GetFileUri(FileName)) 'second attachment + Dim in As Intent = email.GetIntent + in.Flags = 1 'FLAG_GRANT_READ_URI_PERMISSION + StartActivity(in) +End Sub + +Private Sub b_apk_Click + StartService(appUpdater) +End Sub + +Private Sub b_server_Click + Log("Guardar servidor") + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("SERVER")) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("SERVER",et_server.text)) + B4XPages.MainPage.server = et_server.text + Starter.server = B4XPages.MainPage.server + If logger Then Log("Inicializamos reqManager con " & B4XPages.MainPage.server) + reqManager.Initialize(Me, B4XPages.MainPage.server) + LogColor($"ReqServer = ${B4XPages.MainPage.server}"$, Colors.red) + reinicializaReqManager + p_appUpdate.Visible = False +' Entrar.Visible = True +End Sub + +Private Sub lv_server_ItemClick (Position As Int, Value As Object) + server = Value +' l_server.Text = Value + et_server.Text = Value + reqManager.Initialize(Me, Value) + LogColor($"ReqServer = ${Value}"$, Colors.red) + ToastMessageShow("Servidor modificado", False) +End Sub + +Sub reinicializaReqManager + reqManager.Initialize(Me, B4XPages.MainPage.server) + If logger Then Log(B4XPages.MainPage.server) + LogColor($"ReqServer = ${B4XPages.MainPage.server}"$, Colors.red) +End Sub + +'appUpdater - Mostramos el anuncio de que se esta descargando el nuevo apk +Sub muestraProgreso(mensaje As String) + ProgressDialogShow(mensaje) +End Sub + +'appUpdater - Ocultamos el anuncio de que se esta descargando el nuevo apk +Sub ocultaProgreso + ProgressDialogHide +End Sub + +Private Sub b_CargarMonto_Click + + c = Starter.skmt.ExecQuery("SELECT * FROM kmt_info") + c.Position = 0 + If c.RowCount < 0 Or c.RowCount = 0 Then + MsgboxAsync("No hay ruta cargada, favor de cargar día","Atención") + Else + Subs.panelVisible(p_add_monto,0,0) + End If + c.Close + +End Sub + +Private Sub p_add_monto_Click + +End Sub + +'Private Sub B_Aceptar_Monto_Click +' Private f As Cursor=Starter.skmt.ExecQuery("select RUTAA from RUTAA") +' f.Position=0 +' Private a As Cursor =Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") +' a.Position = 0 +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "select_estatus_MAZAPA" +' cmd.Parameters = Array As Object(a.GetString("ID_ALMACEN"),f.GetString("RUTAA")) +' reqManager.ExecuteQuery(cmd , 0, "estatus") +' f.Close +' a.Close +'End Sub + +Sub enviarmonto + + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + + Private f As Cursor=Starter.skmt.ExecQuery("select RUTAA from RUTAA") + f.Position=0 + + Private a As Cursor=Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + If a.RowCount>0 Then + a.Position=0 + End If + + Private a2 As Cursor = Starter.skmt.ExecQuery("SELECT HVD_FECHA FROM HIST_VENTAS") + If a2.RowCount>0 Then + a2.Position=0 + Dim fecha() As String = Regex.Split(" ", a2.GetString("HVD_FECHA")) + Dim fecha2() As String = Regex.Split("-", fecha(0)) + Dim fecha3 As String = fecha2(2)&"/"&fecha2(1)&"/"&fecha2(0) + Log(fecha3) + Dim hora() As String = Regex.Split("\.", fecha(1)) + Log(hora(0)) + End If + + + + Private cI As Cursor + Private u As String = "SinUsuario" + cI=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + cI.Position=0 + If cI.RowCount > 0 Then u = cI.GetString("USUARIO") + Private g As Cursor = Starter.skmt.ExecQuery("select * from ENV_MONTO_LIQ") +' If g.RowCount = 0 Then +' Starter.skmt.ExecNonQuery2("INSERT INTO ENV_MONTO_LIQ VALUES (?,?,?,?,?)", Array As Object(ET_Add_Monto.Text, a.GetString("ID_ALMACEN"), f.GetString("RUTAA"), u, fecha3 & " " & hora(0))) +' f.Close +' a.Close +' +' c = Starter.skmt.ExecQuery("SELECT * FROM ENV_MONTO_LIQ") +' If c.RowCount > 0 Then +' c.Position = 0 +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "select_MontoCuenta_MAZAPArep" +' cmd.Parameters = Array As Object(c.GetString("EML_USUARIO"), c.GetString("EML_ALMACEN"), c.GetString("EML_RUTA"),c.GetString("EML_FECHA_PED")) +' reqManager.ExecuteQuery(cmd , 0, "SelectMontoLiq") +' End If +' c.Close +' Else +' Starter.skmt.ExecNonQuery2("UPDATE ENV_MONTO_LIQ SET EML_MONTO = ? WHERE EML_ALMACEN = ? AND EML_RUTA = ? AND EML_USUARIO = ?", Array As String (ET_Add_Monto.Text ,a.GetString("ID_ALMACEN"), f.GetString("RUTAA"), cI.GetString("USUARIO"))) +' f.Close +' a.Close +' +' c = Starter.skmt.ExecQuery("SELECT * FROM ENV_MONTO_LIQ") +' If c.RowCount > 0 Then +' c.Position = 0 +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "select_MontoCuenta_MAZAPArep" +' cmd.Parameters = Array As Object(c.GetString("EML_USUARIO"), c.GetString("EML_ALMACEN"), c.GetString("EML_RUTA"),c.GetString("EML_FECHA_PED")) +' reqManager.ExecuteQuery(cmd , 0, "SelectMontoLiq") +' End If +' c.Close +' End If + + p_add_monto.Visible = False + +End Sub + +Private Sub B_Can_Monto_Click + p_add_monto.Visible = False +End Sub + +Private Sub b_arqueocieego_Click + c = Starter.skmt.ExecQuery("SELECT * FROM CAT_GUNAPROD3") + If c.RowCount > 0 Then + Subs.panelVisible(p_validacion,0,0) + Else + MsgboxAsync("No hay ruta cargada, favor de cargar día","Atención") + End If +End Sub + +Private Sub et_buspc_TextChanged (Old As String, New As String) + If New = "" Then + CLV_PICK_CIEGO.Clear + Else If New.Length >= 3 Then + CLV_PICK_CIEGO.Clear + + q_buscar = "%" & et_buspc.Text & "%" + Log(q_buscar) + c=Starter.skmt.ExecQuery2($"select CAT_GP_NOMBRE, CAT_GP_ID , ifnull(PC_CANT,0) AS PC_CANT FROM CAT_GUNAPROD3 INNER JOIN PICK_CIEGO ON PC_ID_PROD = CAT_GP_ID AND PC_NOM_PROD = CAT_GP_NOMBRE WHERE (CAT_GP_NOMBRE LIKE ? OR CAT_GP_ID LIKE ? ) and CAT_GP_CLASIF <> 'PROMOS'"$, Array As String(q_buscar,q_buscar)) + If c.RowCount > 0 Then + + + For i = 0 To c.RowCount - 1 + c.Position = i + CLV_PICK_CIEGO.Add(CreateListItem(c.GetString("CAT_GP_ID"), c.GetString("CAT_GP_NOMBRE"), c.GetString("PC_CANT")),i) +' Log(c.GetString("CAT_GP_ID") & ", " & c.GetString("CAT_GP_NOMBRE") & " ," & c.GetString("PC_CANT")) + Next + c.Close + + d=Starter.skmt.ExecQuery2($"select CAT_GP_NOMBRE, CAT_GP_ID FROM CAT_GUNAPROD3 WHERE (CAT_GP_NOMBRE LIKE ? OR CAT_GP_ID LIKE ? ) and CAT_GP_CLASIF <> 'PROMOS'AND CAT_GP_ID NOT IN (SELECT PC_ID_PROD FROM PICK_CIEGO)"$, Array As String(q_buscar,q_buscar)) + + For i = 0 To d.RowCount - 1 + d.Position = i + CLV_PICK_CIEGO.Add(CreateListItem2(d.GetString("CAT_GP_ID"), d.GetString("CAT_GP_NOMBRE")),i) +' Log(d.GetString("CAT_GP_ID") & ", " & d.GetString("CAT_GP_NOMBRE")) + Next + d.Close + + Else If c.RowCount = 0 Then + d=Starter.skmt.ExecQuery2($"select CAT_GP_NOMBRE, CAT_GP_ID FROM CAT_GUNAPROD3 WHERE (CAT_GP_NOMBRE LIKE ? OR CAT_GP_ID LIKE ? ) and CAT_GP_CLASIF <> 'PROMOS'"$, Array As String(q_buscar,q_buscar)) + + For i = 0 To d.RowCount - 1 + d.Position = i + CLV_PICK_CIEGO.Add(CreateListItem2(d.GetString("CAT_GP_ID"), d.GetString("CAT_GP_NOMBRE")),i) +' Log(d.GetString("CAT_GP_ID") & ", " & d.GetString("CAT_GP_NOMBRE")) + Next + d.Close + End If + End If +End Sub + +Private Sub B_PC_ENV_Click + Dim sDate, sTime As String + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate = DateTime.Date(DateTime.Now) + sTime = DateTime.Time(DateTime.Now) + + + For i = 0 To CLV_PICK_CIEGO.Size - 1 + ' Retrieve the panel and child views for the current item + Dim itemPanel As B4XView = CLV_PICK_CIEGO.GetPanel(i) + Dim innerPanel As B4XView = itemPanel.GetView(0) + Dim editText As B4XView = innerPanel.GetView(1) + Dim inputText As String = editText.As(EditText).Text + + ' Check if the input text matches the regex pattern for zeros or if it's empty + If Regex.IsMatch("^[0]+$", inputText) Or inputText = "" Then + inputText = "0" + End If + + ' Retrieve and process the ID label + Dim idLabel As B4XView = innerPanel.GetView(0) + Dim idText As String = idLabel.As(Label).Text + Dim idParts() As String = Regex.Split(CRLF, idText) +' Log(idParts(1)) + f=Starter.skmt.ExecQuery("select RUTAA from RUTAA") + f.Position=0 + Log(f.GetString("RUTAA")) + a=Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + If a.RowCount>0 Then + a.Position=0 + End If + Dim k As Cursor = Starter.skmt.ExecQuery("SELECT HVD_FECHA FROM HIST_VENTAS") + k.Position = 0 + Dim fechatabulador() As String = Regex.Split(" ", k.GetString("HVD_FECHA")) + Dim fechatabulador2() As String = Regex.Split("-", fechatabulador(0)) + Dim fechatabulador3 As String = fechatabulador2(2)&"/"&fechatabulador2(1)&"/"&fechatabulador2(0) + k.Close + If inputText <> "" Then + c = Starter.skmt.ExecQuery2("SELECT * FROM PICK_CIEGO where PC_ID_PROD = ?", Array As String (idParts(0))) + If c.RowCount = 0 Then + ' Insert data into the database + Log(f.GetString("RUTAA")) + Starter.skmt.ExecNonQuery2("INSERT INTO PICK_CIEGO(PC_ID_PROD, PC_NOM_PROD, PC_CANT, PC_ALMACEN, PC_RUTA, PC_FECHA) VALUES(?,?,?,?,?,?)", Array As String(idParts(0), idParts(1), inputText, a.GetString("ID_ALMACEN"), f.GetString("RUTAA"), fechatabulador3&" "&sTime)) + + Else + Log(f.GetString("RUTAA")) + Starter.skmt.ExecNonQuery2("Update PICK_CIEGO set PC_CANT = ? WHERE PC_ID_PROD = ?" , Array As String(inputText ,idParts(0))) + End If + + End If + f.Close + a.Close + Log("Processed item " & i) + Next + et_buspc.Text = "" + CLV_PICK_CIEGO.Clear +End Sub + +Private Sub b_terpc_Click + Msgbox2Async("Una vez enviada la información no podras hacer modificaciones","Atención","SI","", "",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + Msgbox2Async("Estas seguro de enviar la información?","Atención","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + + Dim sDate, sTime As String + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate = DateTime.Date(DateTime.Now) + sTime = DateTime.Time(DateTime.Now) + + For i = 0 To CLV_PICK_CIEGO.Size - 1 + ' Retrieve the panel and child views for the current item + Dim itemPanel As B4XView = CLV_PICK_CIEGO.GetPanel(i) + Dim innerPanel As B4XView = itemPanel.GetView(0) + Dim editText As B4XView = innerPanel.GetView(1) + Dim inputText As String = editText.As(EditText).Text + + ' Check if the input text matches the regex pattern for zeros or if it's empty + If Regex.IsMatch("^[0]+$", inputText) Or inputText = "" Then + inputText = "0" + End If + + ' Retrieve and process the ID label + Dim idLabel As B4XView = innerPanel.GetView(0) + Dim idText As String = idLabel.As(Label).Text + Dim idParts() As String = Regex.Split(CRLF, idText) +' Log(idParts(1)) + f=Starter.skmt.ExecQuery("select RUTAA from RUTAA") + f.Position=0 + Log(f.GetString("RUTAA")) + + a=Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + If a.RowCount>0 Then + a.Position=0 + End If + Log(a.GetString("ID_ALMACEN")) + + Dim k As Cursor = Starter.skmt.ExecQuery("SELECT HVD_FECHA FROM HIST_VENTAS") + k.Position = 0 + Dim fechatabulador() As String = Regex.Split(" ", k.GetString("HVD_FECHA")) + Dim fechatabulador2() As String = Regex.Split("-", fechatabulador(0)) + Dim fechatabulador3 As String = fechatabulador2(2)&"/"&fechatabulador2(1)&"/"&fechatabulador2(0) + k.Close + If inputText <> "" Then + c = Starter.skmt.ExecQuery2("SELECT * FROM PICK_CIEGO where PC_ID_PROD = ?", Array As String (idParts(0))) + If c.RowCount = 0 Then + ' Insert data into the database + Starter.skmt.ExecNonQuery2("INSERT INTO PICK_CIEGO(PC_ID_PROD, PC_NOM_PROD, PC_CANT, PC_ALMACEN, PC_RUTA, PC_FECHA) VALUES(?,?,?,?,?,?)", Array As String(idParts(0), idParts(1), inputText, a.GetString("ID_ALMACEN"), f.GetString("RUTAA"), fechatabulador3&" "&sTime)) + Else + Starter.skmt.ExecNonQuery2("Update PICK_CIEGO set PC_CANT = ? WHERE PC_ID_PROD = ?" , Array As String(inputText ,idParts(0))) + End If + End If + f.Close + a.Close + Log("Processed item " & i) + Next + Log("Finished processing all items") + P_CIEGO.Visible = False + et_buspc.Text = "" + CLV_PICK_CIEGO.Clear + c = Starter.skmt.ExecQuery("SELECT PC_ID_PROD, PC_ALMACEN, PC_RUTA, PC_FECHA FROM PICK_CIEGO") +' If c.RowCount > 0 Then +' For i = 0 To c.RowCount - 1 +' c.Position = i +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "select_HIST_PICKCIEGO_MAZAPA" ' +' cmd.Parameters = Array As Object(c.GetString("PC_ID_PROD"), c.GetString("PC_ALMACEN"), c.GetString("PC_RUTA"), c.GetString("PC_FECHA"),"REPARTO") +' reqManager.ExecuteQuery(cmd , 0, $"PICK_C_${c.GetString("PC_ID_PROD")}"$) +' Next +' End If + c.close + Else + + End If + End If +End Sub + +Private Sub P_CIEGO_Click + +End Sub + +Private Sub b_aceptar_Click + Private f As Cursor=Starter.skmt.ExecQuery("select RUTAA from RUTAA") + f.Position=0 + Private a As Cursor =Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + a.Position = 0 +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "select_estatus_MAZAPA" +' cmd.Parameters = Array As Object(a.GetString("ID_ALMACEN"),f.GetString("RUTAA")) +' reqManager.ExecuteQuery(cmd , 0, "estatus2") + f.Close + a.Close +' p_validacion.Visible = False +' et_codigo.Text = "" +' +' Subs.panelVisible(P_CIEGO,0,0) +End Sub + +Sub passaquci + f=Starter.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info") + f.Position=0 + + a=Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + If a.RowCount>0 Then + a.Position=0 + End If + Log(a.GetString("ID_ALMACEN")) + Log(f.GetString("CAT_CL_RUTA")) + +' If et_codigo.Text = "KMTS1" Then +' p_validacion.Visible = False +' et_codigo.Text = "" +' Subs.panelVisible(P_CIEGO,0,0) +' Else +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "select_CAT_PASS_ARQUEO_MAZAPA" +' cmd.Parameters = Array As Object(f.GetString("CAT_CL_RUTA"),a.GetString("ID_ALMACEN"),"REPARTO") +' reqManager.ExecuteQuery(cmd , 0, "contrasena") +' f.Close +' a.Close +' End If +End Sub + +Private Sub b_cancelarcodigo_Click + p_validacion.Visible = False +End Sub + +Private Sub p_validacion_Click + +End Sub + +Sub CreateListItem(Id_prod As String, Prod As String,cant As String) As Panel + Dim pa As B4XView = xui.CreatePanel("") + pa.SetLayoutAnimated(0, 0, 0, 1, 10) + pa.LoadLayout("PANEL_PICK_CIEGO") + pa.Height = 55dip + pa.Width = 298dip + 'pa.Width = clv_orden.GetBase.Width + L_PICK_CIEGO.Text = Id_prod & CRLF & Prod + L_PICK_CIEGO.TextSize = 12 + L_PICK_CIEGO.Gravity = Bit.Or(Gravity.CENTER_VERTICAL, Gravity.CENTER_HORIZONTAL) + ET_PICK_CIEGO.Text = cant + 'cxc.Id_prod = mostrar3 + 'Log(pa.Width) + Return pa +End Sub + +Sub CreateListItem2(Id_prod As String, Prod As String) As Panel + Dim pa As B4XView = xui.CreatePanel("") + pa.SetLayoutAnimated(0, 0, 0, 1, 10) + pa.LoadLayout("PANEL_PICK_CIEGO") + pa.Height = 55dip + pa.Width = 298dip + 'pa.Width = clv_orden.GetBase.Width + L_PICK_CIEGO.Text = Id_prod & CRLF & Prod + L_PICK_CIEGO.TextSize = 12 + L_PICK_CIEGO.Gravity = Bit.Or(Gravity.CENTER_VERTICAL, Gravity.CENTER_HORIZONTAL) + 'cxc.Id_prod = mostrar3 + 'Log(pa.Width) + Return pa +End Sub + +Private Sub ImageView1_LongClick + +End Sub + +Private Sub p_appUpdate_Click + +End Sub + +Private Sub cb_importarBDWA_CheckedChange(Checked As Boolean) +' LogColor($"cb_importarBDWA_CheckedChange = ${Checked}"$, Colors.Red) + Starter.skmt.ExecNonQuery("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'IMPORTAR_BD_WA'") + Starter.skmt.ExecNonQuery($"insert into CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) values ('IMPORTAR_BD_WA', '${Checked}')"$) +End Sub + + + +Private Sub b_bypass_Click + c = Starter.skmt.ExecQuery("SELECT * FROM kmt_info") + If c.RowCount > 0 Then + Subs.panelVisible(p_bypass,0,0) + p_bypass.Visible = True + Else + MsgboxAsync("No hay ruta cargada, favor de cargar día","Atención") + End If +End Sub + +Private Sub b_acepbypass_Click + DateTime.TimeFormat = "HH:mm:ss" + DateTime.DateFormat = "dd/MM/yyyy" + sDate = DateTime.Date(DateTime.Now) + sTime = DateTime.Time(DateTime.Now) + + Dim datebypass() As String = Regex.Split("/",sDate) + Dim timebypass() As String = Regex.Split(":",sTime) + + If et_bypass.Text = datebypass(0) & timebypass(0) & timebypass(1) Then + Starter.skmt.ExecNonQuery2("UPDATE GEOCERCA set ACTIVA = ? ", Array As Object(0)) + et_bypass.Text = "" + MsgboxAsync("Geocerca Deshabilitada","Atención") + p_bypass.Visible = False + End If +End Sub + +Private Sub b_cancelabypass_Click + p_bypass.Visible = False + et_bypass.Text = "" +End Sub + +Private Sub p_bypass_Click + +End Sub + +Private Sub b_fdCancelar_Click + +End Sub + + + +Private Sub p_finDia_Click + +End Sub + +Private Sub b_borrarFinDia_Click + p_transFinDia.Visible = True +End Sub + +Private Sub p_transFinDia_Click + +End Sub + +Private Sub b_aceptarFD_Click + If et_passFinDia.Text <> "KMTS1BAT" Then + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_codigoAutorizacion_rep" + cmd.Parameters = Array As Object(et_passFinDia.Text.Trim, Subs.traeRutaReparto, Subs.traeAlmacen) + reqManager.ExecuteQuery(cmd , 0, "codigoAutorizacion") + Else + Starter.skmt.ExecNonQuery("UPDATE CAT_VARIABLES SET CAT_VA_VALOR = '' where CAT_VA_DESCRIPCION = 'FINDIA_FECHA'") + p_transFinDia.Visible = False + et_passFinDia.Text = "" + End If + teclado.HideKeyboard +End Sub + +Private Sub b_cancelarFD_Click + p_transFinDia.Visible = False +End Sub \ No newline at end of file diff --git a/B4A/B4XUpdateAvailable.bas b/B4A/B4XUpdateAvailable.bas new file mode 100644 index 0000000..36fa8d1 --- /dev/null +++ b/B4A/B4XUpdateAvailable.bas @@ -0,0 +1,24 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=11.5 +@EndOfDesignText@ +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + +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/BatteryUtilities.bas b/B4A/BatteryUtilities.bas new file mode 100644 index 0000000..b80fd5a --- /dev/null +++ b/B4A/BatteryUtilities.bas @@ -0,0 +1,125 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=9.95 +@EndOfDesignText@ +'Class module +Sub Class_Globals + Private nativeMe As JavaObject +End Sub + +'Initializes the object. +Public Sub Initialize + nativeMe = Me +End Sub +'Return information about the battery status. It returns the following 11 values in an integer Array: +'0 - EXTRA_LEVEL = current battery level, from 0 To EXTRA_SCALE. +'1 - EXTRA_SCALE = the maximum battery level possible. +'2 - EXTRA_HEALTH = the current health constant. +'3 - EXTRA_ICON_SMALL = the resource ID of a small status bar icon indicating the current battery state. +'4 - EXTRA_PLUGGED = whether the device is plugged into a Power source; 0 means it is on battery, other constants are different types of Power sources. +'5 - EXTRA_STATUS = the current status constant. +'6 - EXTRA_TEMPERATURE = the current battery temperature. +'7 - EXTRA_VOLTAGE = the current battery voltage level. +'8 - A value indicating if the battery is being charged or fully charged (If neither it returns 0 Else it returns 1) +'9 - A value indicating if it is charging via USB (0 = Not USB, 2 = USB) +'10 - A value indicating if it is charging via AC (0 = Not AC, 1 = AC) +Public Sub getBatteryInformation () As Int() + + Dim batteryInfo(11) As Int + batteryInfo = nativeMe.RunMethod("getBatteryInformation",Null) + Return batteryInfo +End Sub + +Public Sub getBatteryTechnolgy() As String + + Dim batterytech As String + batterytech = nativeMe.RunMethod("getBatteryTechnology",Null) + Return batterytech + +End Sub + + + +#If Java + +import android.os.BatteryManager; +import android.os.Bundle; +import android.app.Activity; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; + + public int[] getBatteryInformation() { + + int[] mybat = new int[11]; + + Intent batteryIntent = ba.context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + + int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); + mybat[0] = level; + int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); + mybat[1] = scale; + int health = batteryIntent.getIntExtra(BatteryManager.EXTRA_HEALTH,-1); + mybat[2] = health; + int icon_small = batteryIntent.getIntExtra(BatteryManager.EXTRA_ICON_SMALL,-1); + mybat[3] = icon_small; + int plugged = batteryIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED,-1); + mybat[4] = plugged; +// boolean present = batteryIntent.getExtras().getBoolean(BatteryManager.EXTRA_PRESENT); + int status = batteryIntent.getIntExtra(BatteryManager.EXTRA_STATUS,-1); + mybat[5] = status; +// String technology = batteryIntent.getExtras().getString(BatteryManager.EXTRA_TECHNOLOGY); +// BA.Log("Technology = " + technology); + int temperature = batteryIntent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE,-1); + mybat[6] = temperature; + int voltage = batteryIntent.getIntExtra(BatteryManager.EXTRA_VOLTAGE,-1); + mybat[7] = voltage; +// int ac = batteryIntent.getIntExtra("plugged",BatteryManager.BATTERY_PLUGGED_AC); +// mybat[8] = ac; +// int usb = batteryIntent.getIntExtra("plugged",BatteryManager.BATTERY_PLUGGED_USB); +// mybat[9] = usb; + + boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || + status == BatteryManager.BATTERY_STATUS_FULL; + mybat[8] = 0; + if (isCharging == true) { + mybat[8] = 1; + } + + // How are we charging? + mybat[9] = 0; + mybat[10] = 0; + int chargePlug = batteryIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); + boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; + if (usbCharge == true) { + mybat[9] = 2; + } + + boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; + if (acCharge == true) { + mybat[10] = 1; + } + + return mybat; + } + + + public String getBatteryTechnology() { + + Intent batteryIntent = ba.context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + + String technology = batteryIntent.getExtras().getString(BatteryManager.EXTRA_TECHNOLOGY); + + return technology; + } + + + + + + + +#End If \ No newline at end of file diff --git a/B4A/C_Buscar.bas b/B4A/C_Buscar.bas new file mode 100644 index 0000000..21bf3f7 --- /dev/null +++ b/B4A/C_Buscar.bas @@ -0,0 +1,109 @@ +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 + Dim c As Cursor + Dim ListView1 As ListView + Dim b_noventa As Button + Private p_principal As Panel +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + Root.LoadLayout("buscar") + c=Starter.skmt.ExecQuery("select REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT FROM REPARTO") + ListView1.Clear + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Dim label1 As Label + label1 = ListView1.TwoLinesLayout.Label + label1.TextSize = 10 + label1.TextColor = Colors.Black + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 10 + label2.TextColor = Colors.Blue + ListView1.AddTwoLines(c.GetString("REP_CLIENTE"),c.GetString("REP_PRONOMBRE") &" Cantidad #"& c.GetString("REP_CANT")& " SubTotal $"& c.GetString("REP_COSTO_TOT")) + Next + End If + c.Close +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub B4XPage_Appear + p_principal.Width = Root.Width + p_principal.Height = Root.Height + Subs.centraPanel(p_principal, Root.Width) + + c=Starter.skmt.ExecQuery("select REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT FROM REPARTO") + ListView1.Clear + + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Dim label1 As Label + label1 = ListView1.TwoLinesLayout.Label + label1.TextSize = 10 + label1.TextColor = Colors.Black + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 10 + label2.TextColor = Colors.Blue + ListView1.AddTwoLines(c.GetString("REP_CLIENTE"),c.GetString("REP_PRONOMBRE") &" Cantidad #"& c.GetString("REP_CANT")& " SubTotal $"& c.GetString("REP_COSTO_TOT")) + Next + End If + c.Close +End Sub + +Sub Regresar_Click + B4XPages.ShowPage("Cliente") +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub + ' BACK key pressed + ' I want to capture the key here so I return True + B4XPages.ShowPage("Principal") + 'Return True + ' Returning False signals the system to handle the key + Return False +End Sub + +Sub ListView1_ItemLongClick (Position As Int, Value As Object) + Starter.skmt.ExecNonQuery("delete from CUENTAA") + Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object(Value)) + B4XPages.ShowPage("Cliente") +End Sub + +Sub b_noventa_Click + c=Starter.skmt.ExecQuery("select NV_CLIENTE,NV_MOTIVO,NV_COMM FROM NOVENTA ORDER BY NV_CLIENTE asc") + ListView1.Clear + + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Dim label1 As Label + label1 = ListView1.TwoLinesLayout.Label + label1.TextSize = 10 + label1.TextColor = Colors.Black + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 10 + label2.TextColor = Colors.Blue + ListView1.AddTwoLines(c.GetString("NV_CLIENTE"),"Motivo #"& c.GetString("NV_MOTIVO")& " Comentario $"& c.GetString("NV_COMM")) + Next + End If +End Sub \ No newline at end of file diff --git a/B4A/C_Cheklist.bas b/B4A/C_Cheklist.bas new file mode 100644 index 0000000..6fa1c33 --- /dev/null +++ b/B4A/C_Cheklist.bas @@ -0,0 +1,800 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=12.5 +@EndOfDesignText@ +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore + Private p_check As Panel + Private sv_datos As ScrollView + + Private camEx As CameraExClass + 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" + Private p_camara As Panel + Private teclado As IME + Dim fototomada As String + Private ImageView1 As ImageView + Private ImageView3 As ImageView + Private ImageView2 As ImageView + Private ImageView4 As ImageView + Private b_foto As Button + Dim device As Phone + Dim MES1 As ManageExternalStorage + Dim x As Int = 0 + Private rb_docsi1 As RadioButton + Private rb_docno1 As RadioButton + Private rb_docsi2 As RadioButton + Private rb_docno2 As RadioButton + Private rb_docsi3 As RadioButton + Private rb_docno3 As RadioButton + Private rb_docsi4 As RadioButton + Private rb_docno4 As RadioButton + Private rb_docsi5 As RadioButton + Private rb_docno5 As RadioButton + Private rb_docsi6 As RadioButton + Private rb_docno6 As RadioButton + Private rb_docsi7 As RadioButton + Private rb_docno7 As RadioButton + Private rb_docsi8 As RadioButton + Private rb_docno8 As RadioButton + Private rb_docsi9 As RadioButton + Private rb_docno9 As RadioButton + Private rb_docsi10 As RadioButton + Private rb_docno10 As RadioButton + Private rb_docsi11 As RadioButton + Private rb_docno11 As RadioButton + Private rb_docsi12 As RadioButton + Private rb_docno12 As RadioButton + Private rb_docsi13 As RadioButton + Private rb_docno13 As RadioButton + Private rb_docsi14 As RadioButton + Private rb_docno14 As RadioButton + Private rb_docsi15 As RadioButton + Private rb_docno15 As RadioButton + Private rb_docsi16 As RadioButton + Private rb_docno16 As RadioButton + Private rb_docsi17 As RadioButton + Private rb_docno17 As RadioButton + Private rb_docsi18 As RadioButton + Private rb_docno18 As RadioButton + Private rb_docsi19 As RadioButton + Private rb_docno19 As RadioButton + Private et_carroceria As EditText + Private et_luces As EditText + Private et_placas As EditText + Private et_liquidos 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 + Dim p10 As String + Dim p11 As String + Dim p12 As String + Dim p13 As String + Dim p14 As String + Dim p15 As String + Dim p16 As String + Dim p17 As String + Dim p18 As String + Dim p19 As String + Private cb_izqdel As B4XComboBox + Private cb_derdel As B4XComboBox + Private cb_izqatras As B4XComboBox + Private cb_deratras As B4XComboBox + Dim itemselect1 As String + Dim itemselect2 As String + Dim itemselect3 As String + Dim itemselect4 As String + Dim foto1() As Byte + Dim foto2() As Byte + Dim foto3() As Byte + Dim foto4() As Byte + Dim c As Cursor + Dim reqManager As DBRequestManager + Private l_placa As Label + Private et_km As EditText +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("checklist") + + sv_datos.Height = Root.Height + sv_datos.Width = Root.Width + sv_datos.Panel.LoadLayout("check") + sv_datos.Panel.Height = p_check.Height + p_check.Width = Root.Width + p_camara.Width = Root.Width + p_camara.Height = Root.Height + + + Dim items As List + items.Initialize + items.Add("100%") + items.Add("75%") + items.Add("50%") + items.Add("25%") + cb_deratras.SetItems(items) + cb_izqatras.SetItems(items) + cb_derdel.SetItems(items) + cb_izqdel.SetItems(items) + itemselect1 = "100%" + itemselect2 = "100%" + itemselect3 = "100%" + itemselect4 = "100%" + + reqManager.Initialize(Me, B4XPages.MainPage.server) +End Sub + +Private Sub B4XPage_Appear + c = Starter.skmt.ExecQuery("SELECT PLACA FROM HIST_VENTAS") + c.Position = 0 + Log(c.GetString("PLACA")) + l_placa.Text = c.GetString("PLACA") + c.Close + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_CAMERA) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) + If Result Then +' camEx.Initialize(p_cam, frontCamera, Me, "Camera1") +' frontCamera = camEx.Front + Log("inicializamos Camara") + Else + ToastMessageShow("No permission Camara!!!", True) + End If + MES1.Initialize(Me, "MES1") + + ' get the device SDK version + Dim SdkVersion As Int = device.SdkVersion + + ' Choose which permission to request in order to access external storgage + If SdkVersion < 30 Then + Log("SDK = " & SdkVersion & " : Requesting WRITE_EXTERNAL_STORAGE permission") + Dim rp As RuntimePermissions + rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE) ' Implicit read capability if granted + Wait For Activity_PermissionResult (Permission As String, Result As Boolean) + Log($"PERMISSION_WRITE_EXTERNAL_STORAGE = ${Result}"$) + Else + Log("SDK = " & SdkVersion & " : Requesting MANAGE_EXTERNAL_STORAGE permission") + Log("On Entry MANAGE_EXTERNAL_STORAGE = " & MES1.HasPermission) + If Not(MES1.HasPermission) Then + MsgboxAsync("Esta aplicación requiere acceso a todos los archivos, habilite la opción", "Administrar todos los archivos") + Wait For Msgbox_Result(Res As Int) + Log("Getting permission") + MES1.GetPermission + Wait For MES_StorageAvailable + End If + End If + p_camara.Visible = False + + +' 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 Escritura!!!", 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 Lectura!!!", True) +' End If +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub + ' BACK key pressed + If p_camara.visible Then + p_camara.visible = False + StopCamera2 + Else + B4XPages.ShowPage("principal") + End If + ' Returning False signals the system to handle the key + Return False +End Sub + +Private Sub InitializeCamera2 + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_CAMERA) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) + If Result Then + camEx.Initialize(p_cam, frontCamera, Me, "Camera1") + frontCamera = camEx.Front + Log("inicializamos Camara") + Else + ToastMessageShow("No permission Camara!!!", True) + End If +End Sub + +Sub Camera1_Ready (Success As Boolean) + Log("Camara ready") + If Success Then + camEx.SetJpegQuality(90) + camEx.SetContinuousAutoFocus + camEx.CommitParameters + camEx.StartPreview + Log(camEx.GetPreviewSize) + Else + ToastMessageShow("Cannot open camera.", True) + Log("Cannot open camera") + End If +End Sub + +Sub Camera1_PictureTaken (Data()As Byte) + If x = 1 Then + DateTime.DateFormat="ddMMyyyyHHmmss" + nombrefoto = DateTime.Now & "_FOTO1.jpg" + teclado.HideKeyboard + fototomada = nombrefoto + + Else If x = 2 Then + DateTime.DateFormat="ddMMyyyyHHmmss" + nombrefoto1 = DateTime.Now & "_FOTO2.jpg" + teclado.HideKeyboard + fototomada = nombrefoto1 + + Else If x = 3 Then + DateTime.DateFormat="ddMMyyyyHHmmss" + nombrefoto2 = DateTime.Now & "_FOTO3.jpg" + teclado.HideKeyboard + fototomada = nombrefoto2 + + Else If x = 4 Then + DateTime.DateFormat="ddMMyyyyHHmmss" + nombrefoto3 = DateTime.Now & "_FOTO4.jpg" + teclado.HideKeyboard + fototomada = nombrefoto3 + + End If + + Log("tome foto") + Dim filename As String = fototomada + Dim Dirp As String = File.DirInternal + Dim Dir As String + Dim Dir2 As String + Try + File.MakeDir(Dirp,"/md") + Dir = "/md" + 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 + + camEx.SavePictureToFile(Data, Dirp&Dir, filename) + camEx.StartPreview 'restart preview +' ToastMessageShow("Picture saved." & CRLF & "File size: " & File.Size(Dir, filename) & Dir &"," & filename, True) + Log("Picture saved." & CRLF & "File size: " & File.Size(Dir, filename) & Dir &"," & filename) + p_camara.Visible = False + + Log(nombrefoto) + Log(nombrefoto1) + Log(nombrefoto2) + Log(nombrefoto3) + + If nombrefoto <> "0" Then + Dim img As B4XBitmap = xui.LoadBitmapResize(File.DirInternal & Dir, filename, 450, 600, True) + Dim out As OutputStream = File.OpenOutput(File.DirInternal & Dir & Dir2, filename, True) + img.WriteToStream(out, 100, "PNG") +' foto1 = File.ReadBytes(File.DirInternal & Dir & Dir2, nombrefoto) + + 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, 450, 600, True) + Dim out As OutputStream = File.OpenOutput(File.DirInternal & Dir & Dir2, filename, False) + img.WriteToStream(out, 100, "PNG") +' foto2 = File.ReadBytes(File.DirInternal & Dir & Dir2, nombrefoto1) + + 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, 450, 600, True) + Dim out As OutputStream = File.OpenOutput(File.DirInternal & Dir & Dir2, filename, False) + img.WriteToStream(out, 100, "PNG") +' foto3 = File.ReadBytes(File.DirInternal & Dir & Dir2, nombrefoto2) + + 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, 450, 600, True) + Dim out As OutputStream = File.OpenOutput(File.DirInternal & Dir & Dir2, filename, False) + img.WriteToStream(out, 100, "PNG") +' foto4 = File.ReadBytes(File.DirInternal & Dir & Dir2, nombrefoto3) + + out.Close + ImageView4.Bitmap = LoadBitmap(File.DirInternal & Dir & Dir2,nombrefoto3) + End If + + StopCamera2 + +End Sub + +Private Sub p_camara_Click + +End Sub + +Private Sub b_foto_Click + camEx.TakePicture + p_camara.Visible = False +' StopCamera2 +End Sub + +Private Sub StopCamera2 +' Capturing = False + If camEx.IsInitialized Then + camEx.Release + End If +End Sub + +Private Sub ImageView1_Click + + x = 1 + InitializeCamera2 + p_camara.Visible = True + +End Sub + +Private Sub ImageView2_Click + + x = 2 + InitializeCamera2 + p_camara.Visible = True + +End Sub + +Private Sub ImageView3_Click + + x = 3 + InitializeCamera2 + p_camara.Visible = True + +End Sub + +Private Sub ImageView4_Click + + x = 4 + InitializeCamera2 + p_camara.Visible = True + +End Sub + +Private Sub rb_docno1_CheckedChange(Checked As Boolean) + p1 = "No" +End Sub + +Private Sub rb_docsi1_CheckedChange(Checked As Boolean) + p1 = "Si" +End Sub + +Private Sub rb_docno2_CheckedChange(Checked As Boolean) + p2 = "No" +End Sub + +Private Sub rb_docsi2_CheckedChange(Checked As Boolean) + p2 = "Si" +End Sub + +Private Sub rb_docno3_CheckedChange(Checked As Boolean) + p3 = "No" +End Sub + +Private Sub rb_docsi3_CheckedChange(Checked As Boolean) + p3 = "Si" +End Sub + +Private Sub rb_docno4_CheckedChange(Checked As Boolean) + p4 = "No" +End Sub + +Private Sub rb_docsi4_CheckedChange(Checked As Boolean) + p4 = "Si" +End Sub + +Private Sub rb_docno5_CheckedChange(Checked As Boolean) + p5 = "No" +End Sub + +Private Sub rb_docsi5_CheckedChange(Checked As Boolean) + p5 = "Si" +End Sub + +Private Sub rb_docno6_CheckedChange(Checked As Boolean) + p6 = "No" +End Sub + +Private Sub rb_docsi6_CheckedChange(Checked As Boolean) + p6 = "Si" +End Sub + +Private Sub rb_docno7_CheckedChange(Checked As Boolean) + p7 = "No" +End Sub + +Private Sub rb_docsi7_CheckedChange(Checked As Boolean) + p7 = "Si" +End Sub + +Private Sub rb_docno8_CheckedChange(Checked As Boolean) + p8 = "No" +End Sub + +Private Sub rb_docsi8_CheckedChange(Checked As Boolean) + p8 = "Si" +End Sub + +Private Sub rb_docno9_CheckedChange(Checked As Boolean) + p9 = "Incorrecto" +End Sub + +Private Sub rb_docsi9_CheckedChange(Checked As Boolean) + p9 = "Correcto" +End Sub + +Private Sub rb_docno11_CheckedChange(Checked As Boolean) + p11 = "Incorrecto" +End Sub + +Private Sub rb_docsi11_CheckedChange(Checked As Boolean) + p11 = "Correcto" +End Sub + +Private Sub rb_docno13_CheckedChange(Checked As Boolean) + p13 = "Incorrecto" +End Sub + +Private Sub rb_docsi13_CheckedChange(Checked As Boolean) + p13 = "Correcto" +End Sub + +Private Sub rb_docno15_CheckedChange(Checked As Boolean) + p15 = "Incorrecto" +End Sub + +Private Sub rb_docsi15_CheckedChange(Checked As Boolean) + p15 = "Correcto" +End Sub + +Private Sub rb_docno16_CheckedChange(Checked As Boolean) + p16 = "Incorrecto" +End Sub + +Private Sub rb_docsi16_CheckedChange(Checked As Boolean) + p16 = "Correcto" +End Sub + +Private Sub rb_docno17_CheckedChange(Checked As Boolean) + p17 = "Incorrecto" +End Sub + +Private Sub rb_docsi17_CheckedChange(Checked As Boolean) + p17 = "Correcto" +End Sub + +Private Sub rb_docno18_CheckedChange(Checked As Boolean) + p18 = "Incorrecto" +End Sub + +Private Sub rb_docsi18_CheckedChange(Checked As Boolean) + p18 = "Correcto" +End Sub + +Private Sub rb_docno19_CheckedChange(Checked As Boolean) + p19 = "Incorrecto" +End Sub + +Private Sub rb_docsi19_CheckedChange(Checked As Boolean) + p19 = "Correcto" +End Sub + +Private Sub cb_izqdel_SelectedIndexChanged (Index As Int) + itemselect1 = cb_izqdel.SelectedItem + Log(itemselect1) +End Sub + +Private Sub cb_izqatras_SelectedIndexChanged (Index As Int) + itemselect2 = cb_izqatras.SelectedItem + Log(itemselect2) +End Sub + +Private Sub cb_derdel_SelectedIndexChanged (Index As Int) + itemselect3 = cb_derdel.SelectedItem + Log(itemselect3) +End Sub + +Private Sub cb_deratras_SelectedIndexChanged (Index As Int) + itemselect4 = cb_deratras.SelectedItem + Log(itemselect4) +End Sub + +Private Sub b_guardar_Click + + Dim Dirp As String = File.DirInternal + Dim Dir As String + Dim Dir2 As String + Try + File.MakeDir(Dirp,"/md") + Dir = "/md" + Log("creado en promotoria " & Dirp & Dir) + Catch + Dir = "" + Log("creado en raiz") + End Try + + Try + File.MakeDir(Dirp & Dir,"/reduccion") + Dir2 = "/reduccion" + Log("creado en promotoria " & Dirp & Dir & Dir2) + Catch + Dir = "" + Log("creado en raiz") + End Try + + DateTime.TimeFormat="HH:mm:ss" + DateTime.DateFormat="dd/MM/yyyy" + Dim checkdate As String = DateTime.Date(DateTime.Now) + Dim checktime As String = DateTime.Time(DateTime.Now) + If et_km.Text <> "" Then + If rb_docno1.Checked Or rb_docsi1.Checked Then + If rb_docno2.Checked Or rb_docsi2.Checked Then + If rb_docno3.Checked Or rb_docsi3.Checked Then + If rb_docno4.Checked Or rb_docsi4.Checked Then + If rb_docno5.Checked Or rb_docsi5.Checked Then + If rb_docno6.Checked Or rb_docsi6.Checked Then + If rb_docno7.Checked Or rb_docsi7.Checked Then + If rb_docno8.Checked Or rb_docsi8.Checked Then + If rb_docno9.Checked Or rb_docsi9.Checked Then + If (rb_docno9.Checked And et_carroceria.Text <> "") Or (rb_docsi9.Checked And et_carroceria.Text = "") Then + If rb_docno11.Checked Or rb_docsi11.Checked Then + If (rb_docno11.Checked And et_luces.Text <> "") Or (rb_docsi11.Checked And et_luces.Text = "") Then + If rb_docno13.Checked Or rb_docsi13.Checked Then + If (rb_docno12.Checked And et_placas.Text <> "") Or (rb_docsi13.Checked And et_placas.Text = "") Then + If rb_docno15.Checked Or rb_docsi15.Checked Then + If rb_docno16.Checked Or rb_docsi16.Checked Then + If rb_docno17.Checked Or rb_docsi17.Checked Then + If rb_docno18.Checked Or rb_docsi18.Checked Then + If rb_docno19.Checked Or rb_docsi19.Checked Then + If et_liquidos.Text <> "" And (rb_docno15.Checked Or rb_docno16.Checked Or rb_docno17.Checked Or rb_docno18.Checked Or rb_docno19.Checked) Or et_liquidos.Text = "" And (rb_docsi15.Checked And rb_docsi16.Checked And rb_docsi17.Checked And rb_docsi18.Checked And rb_docsi19.Checked) Then + If nombrefoto <> "0" And nombrefoto1 <> "0" And nombrefoto2 <> "0" And nombrefoto3 <> "0" Then + c = Starter.skmt.ExecQuery("SELECT RUTAA FROM RUTAA") + c.Position = 0 + Private rutacheck As String = c.GetString("RUTAA") + c.Close + Starter.skmt.ExecNonQuery("DELETE FROM CHECKLIST2") + Starter.skmt.ExecNonQuery2("INSERT INTO CHECKLIST2(USUARIO, PLACA, FECHA_CAPTURA, TARJETA_CIRCULACION , POLIZA_SEGURO, LICENCIA_CONDUCIR, LIMPIA_EXTERNA, LIMPIA_INTERNA, TRIANGULO, GATO, LLANTA_REFACCION, CARROCERIA, CARROCERIA_COMENTARIOS, LUCES, LUCES_COMENTARIOS, CONDICION_PLACAS, CONDICION_PLACAS_COMENTARIOS, CONDICION_LLANTAS_DEL_DER, CONDICION_LLANTAS_DEL_IZQ, CONDICION_LLANTAS_TRASERA_DER, CONDICION_LLANTAS_TRASERA_IZQ, ACEITE, ANTICONGELANTE, FRENOS, AIRE, FUGAS, COMETARIOS_FUGAS, FOTO1, FOTO12, FOTO3, FOTO4, KILIMETRAJE,RUTA) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",Array As Object(B4XPages.MainPage.usuario,l_placa.Text,checkdate&" "&checktime,p1,p2,p3,p4,p5,p6,p7,p8,p9,et_carroceria.Text,p11,et_luces.Text,p13,et_placas.Text,itemselect1,itemselect2,itemselect3,itemselect4,p15,p16,p17,p18,p19,et_liquidos.Text,File.ReadBytes(File.DirInternal & Dir & Dir2, nombrefoto),File.ReadBytes(File.DirInternal & Dir & Dir2, nombrefoto1),File.ReadBytes(File.DirInternal & Dir & Dir2, nombrefoto2),File.ReadBytes(File.DirInternal & Dir & Dir2, nombrefoto3), et_km.Text, rutacheck)) + + + mandaPendientes + + rb_docno1.Checked = False + rb_docno2.Checked = False + rb_docno3.Checked = False + rb_docno4.Checked = False + rb_docno5.Checked = False + rb_docno6.Checked = False + rb_docno7.Checked = False + rb_docno8.Checked = False + rb_docno9.Checked = False + rb_docno11.Checked = False + rb_docno13.Checked = False + rb_docno15.Checked = False + rb_docno16.Checked = False + rb_docno17.Checked = False + rb_docno18.Checked = False + rb_docno19.Checked = False + + rb_docsi1.Checked = False + rb_docsi2.Checked = False + rb_docsi3.Checked = False + rb_docsi4.Checked = False + rb_docsi5.Checked = False + rb_docsi6.Checked = False + rb_docsi7.Checked = False + rb_docsi8.Checked = False + rb_docsi9.Checked = False + rb_docsi11.Checked = False + rb_docsi13.Checked = False + rb_docsi15.Checked = False + rb_docsi16.Checked = False + rb_docsi17.Checked = False + rb_docsi18.Checked = False + rb_docsi19.Checked = False + + cb_deratras.SelectedIndex = 0 + cb_derdel.SelectedIndex = 0 + cb_izqatras.SelectedIndex = 0 + cb_izqdel.SelectedIndex = 0 + + et_carroceria.Text = "" + et_liquidos.Text = "" + et_luces.Text = "" + et_placas.Text = "" + + ImageView1.Bitmap = LoadBitmap(File.DirAssets,"frontal1.png") + ImageView2.Bitmap = LoadBitmap(File.DirAssets,"derecha1.png") + ImageView3.Bitmap = LoadBitmap(File.DirAssets,"atras1.png") + ImageView4.Bitmap = LoadBitmap(File.DirAssets,"izquierda1.png") + + nombrefoto = "0" + nombrefoto1 = "0" + nombrefoto2 = "0" + nombrefoto3 = "0" + + B4XPages.ShowPage("Principal") + Else + MsgboxAsync("Favor de tomar todas las fotos","Atención") + End If + Else + MsgboxAsync("Especifica Fugas o detallaes en los liquidos","Atención") + End If + Else + MsgboxAsync("Seleeciona una opción en Niveles de Liquidos y aire de Fugas","Atención") + End If + Else + MsgboxAsync("Seleeciona una opción en Niveles de Liquidos y aire de Aire","Atención") + End If + Else + MsgboxAsync("Seleeciona una opción en Niveles de Liquidos y aire de Frenos","Atención") + End If + Else + MsgboxAsync("Seleeciona una opción en Niveles de Liquidos y aire de Anticongelante","Atención") + End If + Else + MsgboxAsync("Seleeciona una opción en Niveles de Liquidos y aire de Aceite","Atención") + End If + Else + MsgboxAsync("Especifica daños en las condiciones de placas","Atención") + End If + Else + MsgboxAsync("Seleeciona una opción en Conciciones de placas de Correcto","Atención") + End If + Else + MsgboxAsync("Especifica daños en las luces","Atención") + End If + Else + MsgboxAsync("Seleeciona una opción en Funcionamiento de luces de Correcto","Atención") + End If + Else + MsgboxAsync("Especifica daños en la carrocería","Atención") + End If + Else + MsgboxAsync("Seleeciona una opción en Carrocería de Buen estado","Atención") + End If + Else + MsgboxAsync("Seleeciona una opción en Seguridad y refación de Llanta de refacción","Atención") + End If + Else + MsgboxAsync("Seleeciona una opción en Seguridad y refación de gato","Atención") + End If + Else + MsgboxAsync("Seleeciona una opción en Seguridad y refación de Triagulo reflectante","Atención") + End If + Else + MsgboxAsync("Seleeciona una opción en Limpieza unidad interna","Atención") + End If + Else + MsgboxAsync("Seleeciona una opción en Limpieza unidad externa","Atención") + End If + Else + MsgboxAsync("Seleeciona una opción en Documentación viegnte de Licencia de conducir","Atención") + End If + Else + MsgboxAsync("Seleeciona una opción en Documentación viegnte de Póliza de seguro","Atención") + End If + Else + MsgboxAsync("Seleeciona una opción en Documentación viegnte de tarjeta de circulación","Atención") + End If + Else + MsgboxAsync("Captura el kilometraje inicial.","Atención") + End If + +End Sub + +Sub mandaPendientes + Log("MandaPendientes") + 'PEDIDO (Pendientes) + c=Starter.skmt.ExecQuery("SELECT USUARIO, PLACA, FECHA_CAPTURA, TARJETA_CIRCULACION , POLIZA_SEGURO, LICENCIA_CONDUCIR, LIMPIA_EXTERNA, LIMPIA_INTERNA, TRIANGULO, GATO, LLANTA_REFACCION, CARROCERIA, CARROCERIA_COMENTARIOS, LUCES, LUCES_COMENTARIOS, CONDICION_PLACAS, CONDICION_PLACAS_COMENTARIOS, CONDICION_LLANTAS_DEL_DER, CONDICION_LLANTAS_DEL_IZQ, CONDICION_LLANTAS_TRASERA_DER, CONDICION_LLANTAS_TRASERA_IZQ, ACEITE, ANTICONGELANTE, FRENOS, AIRE, FUGAS, COMETARIOS_FUGAS, FOTO1, FOTO12, FOTO3, FOTO4 FROM CHECKLIST2") + Log($"Pedido PENDIENTE: ${c.RowCount}"$) + If c.RowCount > 0 Then + For i = 0 To c.RowCount -1 + c.Position=i + Dim cmd As DBCommand + + foto1 = c.GetBlob("FOTO1") + foto2 = c.GetBlob("FOTO12") + foto3 = c.GetBlob("FOTO3") + foto4 = c.GetBlob("FOTO4") + + cmd.Initialize + cmd.Name = "insert_CHECK_MARDS" + cmd.Parameters = Array As Object(C.GetString("USUARIO"),C.GetString("PLACA"),C.GetString("FECHA_CAPTURA"),C.GetString("TARJETA_CIRCULACION"),C.GetString("POLIZA_SEGURO"),C.GetString("LICENCIA_CONDUCIR"),C.GetString("LIMPIA_EXTERNA"),C.GetString("LIMPIA_INTERNA"),C.GetString("TRIANGULO"),C.GetString("GATO"), C.GetString("LLANTA_REFACCION"),C.GetString("CARROCERIA"),c.GetString("CARROCERIA_COMENTARIOS"),c.GetString("LUCES"),c.GetString("LUCES_COMENTARIOS"),c.GetString("CONDICION_PLACAS"),c.GetString("CONDICION_PLACAS_COMENTARIOS"))'c.GetString("CONDICION_PLACAS_INCORRECTO"),c.GetString("CONDICION_PLACAS_COMENTARIOS"),c.GetString("CONDICION_LLANTAS_DEL_DER"),c.GetString("CONDICION_LLANTAS_DEL_IZQ"),c.GetString("CONDICION_LLANTAS_TRASERA_DER"),c.GetString("CONDICION_LLANTAS_TRASERA_IZQ"),c.GetString("ACEITE"),c.GetString("ANTICONGELANTE"),c.GetString("FRENOS"),c.GetString("AIRE"),c.GetString("FUGAS"),c.GetString("COMETARIOS_FUGAS"),foto1,foto2,foto3,foto4,B4XPages.MainPage.principal.ALMACEN) + reqManager.ExecuteCommand(cmd , $"ins_checkliPendientes_head_${c.GetString("USUARIO")}"$) + Next + End If +End Sub + +Sub JobDone(Job As HttpJob) + Log("JOBDONE CLIENTE . " & Job.Success) + If Job.Success = False Then +' ToastMessageShow("Error: " & Job.ErrorMessage, True) +' LogColor("JobDone Error: '" & reqManager.HandleJob(Job).tag, Colors.red) 'Mod por CHV - 211027 + LogColor("Error: " & Job.tag & " : " & Job.ErrorMessage, Colors.Blue) + Else + LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) + If Job.JobName = "DBRequest" Then + Dim resultado As DBResult = reqManager.HandleJob(Job) + If resultado.Tag.As(String).IndexOf("ins_checkliPendientes_head_") > -1 Then + Private cliente As String= resultado.Tag + cliente = cliente.SubString(cliente.IndexOf("_")+24) + Log($"Cliente1:${cliente}"$) + + c=Starter.skmt.ExecQuery("SELECT USUARIO, PLACA, FECHA_CAPTURA, TARJETA_CIRCULACION , POLIZA_SEGURO, LICENCIA_CONDUCIR, LIMPIA_EXTERNA, LIMPIA_INTERNA, TRIANGULO, GATO, LLANTA_REFACCION, CARROCERIA, CARROCERIA_COMENTARIOS, LUCES, LUCES_COMENTARIOS, CONDICION_PLACAS, CONDICION_PLACAS_COMENTARIOS, CONDICION_LLANTAS_DEL_DER, CONDICION_LLANTAS_DEL_IZQ, CONDICION_LLANTAS_TRASERA_DER, CONDICION_LLANTAS_TRASERA_IZQ, ACEITE, ANTICONGELANTE, FRENOS, AIRE, FUGAS, COMETARIOS_FUGAS, FOTO1, FOTO12, FOTO3, FOTO4, KILIMETRAJE, RUTA FROM CHECKLIST2") + Log($"Pedido PENDIENTE: ${c.RowCount}"$) + If c.RowCount > 0 Then + For i = 0 To c.RowCount -1 + c.Position=i + Dim cmd As DBCommand + + foto1 = c.GetBlob("FOTO1") + foto2 = c.GetBlob("FOTO12") + foto3 = c.GetBlob("FOTO3") + foto4 = c.GetBlob("FOTO4") + + cmd.Initialize + cmd.Name = "update_CHECK_MARDS" + cmd.Parameters = Array As Object(c.GetString("CONDICION_LLANTAS_DEL_DER"),c.GetString("CONDICION_LLANTAS_DEL_IZQ"),c.GetString("CONDICION_LLANTAS_TRASERA_DER"),c.GetString("CONDICION_LLANTAS_TRASERA_IZQ"),c.GetString("ACEITE"),c.GetString("ANTICONGELANTE"),c.GetString("FRENOS"),c.GetString("AIRE"),c.GetString("FUGAS"),c.GetString("COMETARIOS_FUGAS"),foto1,foto2,foto3,foto4,B4XPages.MainPage.principal.ALMACEN, C.GetString("KILIMETRAJE"),C.GetString("RUTA"), C.GetString("USUARIO"),C.GetString("PLACA"),C.GetString("FECHA_CAPTURA")) + reqManager.ExecuteCommand(cmd , "update") + Next + End If + + For Each records() As Object In resultado.Rows + For Each k As String In resultado.Columns.Keys + Log(resultado.Tag & ": " & k & ": " & records(resultado.Columns.Get(k))) + Next + Next + Starter.skmt.ExecNonQuery("UPDATE CHECADO_CHECK set CHECADO = 1 ") +' B4XPages.MainPage.principal.checachek + End If + End If + + Job.Release + End If + +End Sub diff --git a/B4A/C_Cliente.bas b/B4A/C_Cliente.bas new file mode 100644 index 0000000..17d1f9a --- /dev/null +++ b/B4A/C_Cliente.bas @@ -0,0 +1,7764 @@ +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 + Dim g As GPS + Dim clie_id As String + Dim sDate,sTime As String + Dim usuario As String + Dim cuenta As String + Dim btAdmin As BluetoothAdmin + Dim cmp20 As Serial + Dim printer As TextWriter + Dim PairedDevices As Map + Dim L As List + Dim TAMANO As Int + Dim ESPACIO As Int + Dim BLANCO As String + Dim impresoraConectada As Boolean = False + Dim LONGITUD As String + Dim LATITUD As String + Dim NOMBRE As String + Dim c As Cursor + Dim s As Cursor + Dim limite_credito As Double + Dim banderaabono As String + Dim m_lat_al, m_lon_al As String + Dim distance2 As Long + Dim metopago As String + Dim ListView1 As ListView + Dim la_cuenta As Label + Dim La_nombre As Label + Dim la_Calle As Label + Dim la_numero As Label + Dim la_nint As Label + Dim la_edo As Label + Dim la_pob As Label + Dim la_col As Label + Dim la_cp As Label + Dim la_zona As Label + Dim gest As Button + Dim la_saldotot As Label + Dim la_saldooper As Label + Dim reqManager As DBRequestManager + Dim b_noEntrega As Button + Dim Label10 As Label + Dim Label11 As Label + Dim d As Cursor + Dim ime As IME + Dim Tar As Button + Private L_QR As Label + Private BT_QR As Button + Dim Printer1 As EscPosPrinter + Dim la_comm As Label + Dim la_actdte As Label + Dim la_usuario As Label + Dim la_resultado As Label + Dim l_entre1 As Label + Dim l_entre2 As Label + Dim l_atiende As Label + Dim l_atiende2 As Label + Dim DATOS As Button + Dim Guardar As Button + Dim NUEVO As Button + Private l_total As Label + Private HIST As Button + Dim PASA_IMP As String + Private B_IMP As Button + Dim total_cliente As String + Dim CREDITO As String + Private p_principal As Panel + Private B_PASO2 As Button + Private L_CANT As Label + Dim errorImpresora As Int = 0 + Dim banderaimp As Int + Private l_credi As Label + Private l_pagare As Label + Private l_montopag As Label + Private l_efectivo As Label + Private l_montoefec As Label + Private p_credito As Panel + Private b_acred As Button + Private b_cancred As Button + Private et_montoacredito As EditText + Private Label16 As Label + Private l_limite As Label + Dim almacen As String + Dim fechaprev As String + Dim rutaprev As String + Dim rutarep As String + Dim montopagare As String + Private qr As QRGenerator + Private p_abono As Panel + Private clv_abonos As CustomListView + Private et_abono As EditText + Private b_cancelar As Button + Private b_abono As Button + Private l_montoabonostotal As Label + Dim h, j,b, f As Cursor + Private l_folio As Label + Private l_saldo As Label + Private b_cxc As Button + Dim Tipoentrega As String + Private b_cancel_pagare As Button + Private p_transPagare2 As Panel + Private i_qr As B4XImageView + Private qr As QRGenerator + Private b_cerrarqr As Button + Private b_confirmar As Button + Dim NOTA As String + Private p_qr As Panel + Private ChangingCheckboxesProgrammatically As Boolean = False + Dim tipo_abonox As String + Private cb_tipopago As B4XComboBox + Dim itemselect As String + Dim escreditoono As String + Dim m_lat, m_lon As String + Dim distance As Long + Private b_imprimesegun As Button + Private iv_foto As ImageView + Dim Folio As String + Private l_telefono As Label + Private l_fecha As Label + Private CheckBox1 As CheckBox + Private ImageView1 As ImageView + + Private barcode As barcodeGenerator + Private B4XImageView1 As B4XImageView + Private ImageView2 As ImageView + Private p_tipopago As Panel + Private rb_Cheque As RadioButton + Private rb_tranfe As RadioButton + Private rb_efectivo As RadioButton + Private b_cancel_tp As Button + Private b_acept_tp As Button + Private p_comentario As Panel + Private lv_comentarios As ListView + Private b_agregarcom As Button + Private b_cerarcom As Button + Private p_contado As Panel + Private et_cont_efectivo As EditText + Private et_cont_transfe As EditText + Private et_cont_cheque As EditText + Private b_cancel_contado As Button + Private b_acep_contado As Button + Private Panel13 As Panel + Private ch_cont_efectivo As CheckBox + Private ch_cont_transfe As CheckBox + Private ch_cont_cheque As CheckBox + Private l_contado As Label + Private p_codigo As Panel + Private et_codigo As EditText + Private b_cancelcodigo As Button + Private b_acepcodigo As Button + + Dim indicanum As Int + Dim numeropago As Int + Dim textedit As Double + Dim Impimir As Int + + Dim reimpresion As Int = 0 + + Private p_transFinDia As Panel + Dim f1,f2,f3,f4,f5 As Double + Private b_cancelarFD As Button + Private b_aceptarFD As Button + Private et_passFinDia As EditText + Private teclado As IME +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + g.Initialize("GPS") +' Activity.LoadLayout("info_gral") + Root.LoadLayout("cliente") + c=Starter.skmt.ExecQuery("select 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 from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)") + s=Starter.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + s.Position=0 + c.Position=0 + la_cuenta.Text = c.GetString("CAT_CL_CODIGO") + La_nombre.Text = c.GetString("CAT_CL_NOMBRE") + la_Calle.Text = c.GetString("CAT_CL_CALLE") & c.GetString("CAT_CL_NOEXT") + la_col.Text = c.GetString("CAT_CL_COLONIA") + la_edo.Text = c.GetString("CAT_CL_EDO") + la_cp.Text = c.GetString("CAT_CL_CP") + l_entre1.Text = c.GetString("CAT_CL_CALLE1") + l_entre2.Text = c.GetString("CAT_CL_CALLE2") + p_transPagare2.left = 0 : p_transPagare2.Top = 0 + p_transPagare2.Width = Root.Width : p_transPagare2.Height = Root.Height + Subs.centraPanel(p_qr, p_transPagare2.Width) + qr.Initialize(i_qr.mBase.Width) + If c.GetString("CAT_CL_ATIENDE1") <> Null And c.GetString("CAT_CL_ATIENDE1") <> "null" Then + l_atiende.Text = c.GetString("CAT_CL_ATIENDE1") + Else + l_atiende.Text = " " + End If + If c.GetString("CAT_CL_ATIENTE2") <> Null And c.GetString("CAT_CL_ATIENTE2") <> "NULL" Then + l_atiende2.Text = c.GetString("CAT_CL_ATIENTE2") + Log("|"&c.GetString("CAT_CL_ATIENTE2")&"|") + Else + l_atiende2.Text = " " + End If + la_saldotot.Text = c.GetString("CAT_CL_TELEFONO") + la_saldooper.Text = c.GetString("CAT_CL_EMAIL") +' l_total.Text = s.GetString("TOTAL_CLIE") + btAdmin.Initialize("BlueTeeth") + cmp20.Initialize("Printer") + reqManager.Initialize(Me, B4XPages.MainPage.SERVER) + + p_transFinDia.top = 0 : p_transFinDia.Left = 0 + p_transFinDia.Width = Root.Width : p_transFinDia.Height = Root.Height +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub B4XPage_Appear + iv_foto.Bitmap = LoadBitmap(File.DirAssets,"images.png") + reimpresion = 0 + banderaimp = 0 + banderaabono = 0 + escreditoono = 0 + Tipoentrega = "CONTADO" +' Subs.centraPanel(p_principal, Root.Width) + Starter.skmt.Initialize(Starter.ruta,"kmt.db", True) + reqManager.Initialize(Me, B4XPages.MainPage.SERVER) + c=Starter.skmt.ExecQuery("select 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, CAT_CL_BCREDITO from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)") + s=Starter.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + s.Position=0 + c.Position=0 + la_cuenta.Text = c.GetString("CAT_CL_CODIGO") + La_nombre.Text = c.GetString("CAT_CL_NOMBRE") + NOMBRE = c.GetString("CAT_CL_NOMBRE") + LONGITUD = c.GetString("CAT_CL_LONG") + LATITUD = c.GetString("CAT_CL_LAT") + la_Calle.Text = c.GetString("CAT_CL_CALLE") & c.GetString("CAT_CL_NOEXT") + la_col.Text = c.GetString("CAT_CL_COLONIA") + la_edo.Text = c.GetString("CAT_CL_EDO") + la_cp.Text = c.GetString("CAT_CL_CP") + l_entre1.Text = c.GetString("CAT_CL_CALLE1") + l_entre2.Text = c.GetString("CAT_CL_CALLE2") + l_telefono.Text= c.GetString("CAT_CL_TELEFONO") + If c.GetString("CAT_CL_ATIENDE1") <> Null And c.GetString("CAT_CL_ATIENDE1") <> "null" Then + l_atiende.Text = c.GetString("CAT_CL_ATIENDE1") + Else + l_atiende.Text = " " + End If + If c.GetString("CAT_CL_ATIENTE2") <> Null And c.GetString("CAT_CL_ATIENTE2") <> "NULL" Then + l_atiende2.Text = c.GetString("CAT_CL_ATIENTE2") + Else + l_atiende2.Text = " " + End If + la_saldotot.Text = c.GetString("CAT_CL_TELEFONO") + la_saldooper.Text = c.GetString("CAT_CL_EMAIL") +' l_total.Text = s.GetString("TOTAL_CLIE") + CREDITO = C.GetString("CAT_CL_BCREDITO") + p_abono.Width = Root.Width + p_abono.Height = Root.Height + p_principal.Width = Root.Width + + Dim cor_al As Cursor = Starter.skmt.ExecQuery("SELECT CAT_VA_VALOR FROM CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = 'COORDS_ALMACEN' ") + If cor_al.RowCount > 0 Then + cor_al.Position = 0 + Dim latlong() As String = Regex.Split(",",cor_al.GetString("CAT_VA_VALOR")) + m_lat_al = latlong(1) + m_lon_al = latlong(0) + + End If + + barcode.Initialize + qr.Initialize(B4XImageView1.mBase.Width) + + Private cym As Map = Subs.traeCantYMonto2(Subs.traeCliente) + L_CANT.Text = cym.Get("cantidad") + l_total.Text = Round2(cym.Get("monto"), 2) + + CallSubDelayed(Tracker, "Track") + CallSubDelayed(Tracker, "StartFLPSmall") + CallSubDelayed(Tracker, "StartFLP2") + If Tracker.FLP.GetLastKnownLocation.IsInitialized Then 'Si tenemos "UltimaUbicaccionConocida" la usamos. + B4XPages.MainPage.lat_gps = Tracker.FLP.GetLastKnownLocation.Latitude + B4XPages.MainPage.lon_gps = Tracker.FLP.GetLastKnownLocation.Longitude +' Log($"Tenemos UUC: ${Tracker.FLP.GetLastKnownLocation.Latitude},${Tracker.FLP.GetLastKnownLocation.Longitude}"$) + GPS_LocationChanged(Tracker.FLP.GetLastKnownLocation) + End If + + Dim mostrarimp As Cursor = Starter.skmt.ExecQuery($"SELECT gestion from kmt_info where CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)"$) + mostrarimp.Position = 0 + If mostrarimp.GetString("gestion") = "0" Then + b_imprimesegun.Visible = False + Else if mostrarimp.GetString("gestion") = "2" Then + b_imprimesegun.Visible = True + End If + mostrarimp.Close + + Dim cdias As Cursor = Starter.skmt.ExecQuery("select CAT_CL_DIASCREDITO from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)") + cdias.Position = 0 + Dim pagarepen As Cursor = Starter.skmt.ExecQuery("select FECHA_PREVENTA, NOTA, CLIENTE FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + If pagarepen.RowCount > 0 Then + For pagadias = 0 To pagarepen.RowCount-1 + pagarepen.Position = pagadias + DateTime.DateFormat="dd/MM/yyyy" + Dim FechaInicio As String = pagarepen.GetString("FECHA_PREVENTA") ' Formato: dd/MM/yyyy + Log(pagarepen.GetString("FECHA_PREVENTA")) + + ' Convertir las fechas a milisegundos (desde 01/01/1970) + Dim TicksInicio As Long = DateTime.DateParse(FechaInicio) + Dim TicksHoy As Long = DateTime.DateParse(DateTime.Date(DateTime.Now)) + + ' Calcular diferencia en días + Dim DiferenciaDias As Int = (TicksHoy - TicksInicio) / DateTime.TicksPerDay + + ' Mostrar resultado + Log($"Días transcurridos: ${DiferenciaDias}"$) + + Starter.skmt.ExecNonQuery2("UPDATE ABONOSP set DIAS = ?, DIASATRASO = ? where NOTA = ? AND CLIENTE IN (SELECT CUENTA FROM CUENTAA)",Array As String(DiferenciaDias,cdias.GetInt("CAT_CL_DIASCREDITO")-DiferenciaDias, pagarepen.GetString("NOTA"))) + Next + End If + + Dim geo As Cursor = Starter.skmt.ExecQuery("SELECT ACTIVA FROM GEOCERCA") + If geo.RowCount > 0 Then + geo.Position = 0 + If geo.GetInt("ACTIVA") = 0 Then + HIST.Visible = True +' b_cxc.Visible = True + b_noEntrega.Visible = True + gest.Visible = True + Else If geo.GetInt("ACTIVA") = 1 Then + HIST.Visible = False +' b_cxc.Visible = False + b_noEntrega.Visible = False + gest.Visible = False + End If + End If + + Dim fotomostrar As Cursor = Starter.skmt.ExecQuery("SELECT FOTO FROM FOTOS where CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + If fotomostrar.RowCount > 0 Then + + fotomostrar.Position = 0 + Private fotomostrarfinal() As Byte = fotomostrar.GetBlob("FOTO") + Dim InputStream1 As InputStream + InputStream1.InitializeFromBytesArray(fotomostrarfinal, 0, fotomostrarfinal.Length) + Dim Bitmap1 As Bitmap + Bitmap1.Initialize2(InputStream1) + InputStream1.Close + iv_foto.Bitmap = Bitmap1 + Log("aqui si hay foto") + Else + iv_foto.Bitmap = LoadBitmap(File.DirAssets,"images.png") + Log("aqui no hay foto") + End If + +' If CREDITO = "1" Then +' Msgbox("AVISO","SE TIENE QUE IMPRIMIR PAGARÉ") 'ignore +' End If +' Private cym As Map = Subs.traemosCantYMonto(clv_pedido) +' L_CANT.Text = cym.Get("cantidad") +' l_total.Text = cym.Get("monto") + Starter.skmt.ExecNonQuery("UPDATE HIST_VENTAS set ESPROMO = 1 where HVD_CODPROMO = HVD_PROID AND HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + Private vc As Cursor = Starter.skmt.ExecQuery($"select HVD_PROID,HVD_COSTO_TOT, HVD_CANT, IFNULL(HVD_RECHAZOCANT, 0) AS HVD_RECHAZOCANT from HIST_VENTAS where BCAJAS = 0 and HVD_CODPROMO ='${Subs.traealmacen}' and HVD_CLIENTE in (select cuenta from cuentaa)"$) + + Private cuenta0 As String = 0 + Private arti As String = 0 + If vc.RowCount > 0 Then + For i = 0 To vc.RowCount - 1 + vc.Position = i + + LogColor(cuenta0,Colors.Red) + + LogColor(vc.GetString("HVD_PROID"),Colors.Blue) + LogColor("------------"&((vc.GetString("HVD_CANT") - vc.GetString("HVD_RECHAZOCANT"))*(vc.GetString("HVD_COSTO_TOT")/vc.GetString("HVD_CANT"))),Colors.Red) + + cuenta0 = cuenta0 + ((vc.GetString("HVD_CANT") - vc.GetString("HVD_RECHAZOCANT"))*(vc.GetString("HVD_COSTO_TOT")/vc.GetString("HVD_CANT"))) +' Log(vc.GetString("HVD_CANT")&","&vc.GetString("HVD_RECHAZOCANT")) + arti = arti + (vc.GetString("HVD_CANT") - vc.GetString("HVD_RECHAZOCANT")) +' Log(vc.GetString("HVD_CANT") &" - "& vc.GetString("HVD_RECHAZOCANT")&" * "& vc8.GetString("CAT_GP_PRECIO")) + Next + End If +' Log(cuenta0) + + Private vc2 As Cursor = Starter.skmt.ExecQuery("select HVD_PROID, HVD_CANT, IFNULL(HVD_RECHAZOCANT, 0) AS HVD_RECHAZOCANT, CANTC,HVD_COSTO_TOT from HIST_VENTAS where HVD_CLIENTE in (select cuenta from cuentaa) AND BCAJAS = 1") + Private Cuenta1 As String = 0 + Private arti1 As String = 0 + If vc2.RowCount > 0 Then + For i = 0 To vc2.RowCount - 1 + vc2.Position = i + Dim preu As Float = NumberFormat2(vc2.GetString("HVD_COSTO_TOT")/vc2.GetString("CANTC"),0,2,2,False) + Private vc3 As Cursor = Starter.skmt.ExecQuery($"select PRECIOCONVER, CONVERSION from CAT_GUNAPROD where CAT_GP_ID = '${vc2.GetString("HVD_PROID")}'"$) + If vc3.RowCount > 0 Then + vc3.Position = 0 + Cuenta1 = Cuenta1 + ((vc2.GetString("CANTC")-(vc2.GetString("HVD_RECHAZOCANT")/vc3.GetString("CONVERSION")))*preu) + arti1 = arti1 + (vc2.GetString("HVD_CANT") - vc2.GetString("HVD_RECHAZOCANT")) + End If + Next + End If +' Log(Cuenta1) + + Private vc4 As Cursor = Starter.skmt.ExecQuery($"select HVD_PROID,HVD_PRONOMBRE,HVD_COSTO_TOT, HVD_CANT, IFNULL(HVD_RECHAZOCANT, 0) AS HVD_RECHAZOCANT, CANTC,HVD_COSTO_TOT, HVD_RECHAZO, HVD_CODPROMO from HIST_VENTAS where HVD_CLIENTE in (select cuenta from cuentaa) AND BCAJAS = 0 and HVD_CODPROMO <> '${Subs.traeAlmacen}'"$) + Private Cuenta2 As String = 0 + Private arti2 As String = 0 + If vc4.RowCount > 0 Then + For i = 0 To vc4.RowCount - 1 + vc4.Position = i + If vc4.GetString("HVD_PROID") <> vc4.GetString("HVD_CODPROMO") Then + If vc4.GetString("HVD_RECHAZO") = 0 Then + Cuenta2 = Cuenta2 + vc4.GetString("HVD_COSTO_TOT") + arti2 = arti2 + vc4.GetString("HVD_CANT") + Else + Private vc5 As Cursor = Starter.skmt.ExecQuery($"select CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${vc4.GetString("HVD_PROID")}'"$) + If vc5.RowCount > 0 Then + vc5.Position= 0 +' Log(vc5.GetString("CAT_GP_PRECIO")) + Cuenta2 = Cuenta2 +((vc4.GetString("HVD_CANT")- vc4.GetString("HVD_RECHAZOCANT"))*(vc4.GetString("HVD_COSTO_TOT")/vc4.GetString("HVD_CANT"))) + arti2 = arti2 +(vc4.GetString("HVD_CANT")- vc4.GetString("HVD_RECHAZOCANT")) + End If + End If + End If + Next + End If +' Log(arti2) + Subs.centraPanel(p_credito, Root.Width) + Private c4 As Cursor = Starter.skmt.ExecQuery($"SELECT IFNULL(PE_CANT,0) AS PE_CANT, iFNULL(PE_COSTO_TOT,0) AS PE_COSTO_TOT FROM PEDIDO WHERE PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA)"$) + Private Cuenta3 As String = 0 + Private arti3 As String = 0 + If c4.RowCount > 0 Then + For i = 0 To c4.RowCount -1 + c4.Position = i + arti3 = arti3 + c4.GetString("PE_CANT") + Cuenta3 = Cuenta3 + c4.GetString("PE_COSTO_TOT") + Next + End If + Log(cuenta0) + Log(Cuenta1) + Log(Cuenta2) + Log(Cuenta3) + l_total.Text = NumberFormat2((cuenta0 + Cuenta1 + Cuenta2 + Cuenta3),0,2,2,True) + L_CANT.Text = NumberFormat2((arti + arti1 +arti2 + arti3),0,0,0,True) +' l_total.Text = cuenta + Cuenta1 + Cuenta2 +' L_CANT.Text = arti + arti1 +arti2 + c = Starter.skmt.ExecQuery2("select CAT_VA_VALOR from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("MACIMP")) + If c.RowCount > 0 Then + c.Position = 0 + Starter.MAC_IMPRESORA = c.GetString("CAT_VA_VALOR") + End If + If Starter.MAC_IMPRESORA = "" Then Starter.MAC_IMPRESORA = "0" +' Log("|" & Starter.MAC_IMPRESORA & "|") + Printer1.Initialize(Me, "Printer1") + If Printer1.IsConnected = False Then +' Printer1.Connect +' Log("1") + Else + Printer1.DisConnect + Printer1.Connect + Log("2") + End If + +' Dim pag As Cursor = Starter.skmt.ExecQuery("select * FROM PAGARES WHERE TMP_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") +' If pag.RowCount > 0 Then +' pag.Position = 0 +' l_credi.Visible = True +' l_pagare.Visible = True +' l_montoefec.Visible = True +' l_efectivo.Visible = True +' l_montopag.Visible = True +' l_montopag.Text = pag.GetString("TMP_MONTO_PAGARE") +' Dim PAGAREMONTO As Float = cuenta0 + Cuenta1 + Cuenta2 + Cuenta3 +' Dim PAGAREMONTO2 As Float = pag.GetString("TMP_MONTO_PAGARE") + '' Log +' If PAGAREMONTO - PAGAREMONTO2 < 0 Then +' l_montoefec.Text = 0 +' Else +' l_montoefec.Text = PAGAREMONTO - PAGAREMONTO2 +' End If +' Else If pag.RowCount = 0 Then +' l_credi.Visible = False +' l_pagare.Visible = False +' l_montoefec.Visible = False +' l_efectivo.Visible = False +' l_montopag.Visible = False +' End If + + c=Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + c.Position = 0 + almacen = c.GetString("ID_ALMACEN") + c.Close + +' If almacen = "3" Or almacen = 3 Or almacen = "5" Or almacen = 5 Then + Tar.Visible = False + Log("SI AQUI") + b = Starter.skmt.ExecQuery("select COUNT(*) AS CLIENTE FROM ABONOSP WHERE CLIENTE IN (Select CUENTA from cuentaa) AND SALDO_PENDIENTE <> 0") + b.Position = 0 + Dim cabonos As String = b.GetString("CLIENTE") + If cabonos = 0 Then + b_cxc.Visible = False + Else + b_cxc.Visible = True + End If +' End If + + Dim cp As Cursor = Starter.skmt.ExecQuery("SELECT * FROM PAGARES WHERE PA_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND PA_CANCELADO IS NULL") + If cp.RowCount > 0 Then + + Dim x2 As Cursor =Starter.skmt.ExecQuery("SELECT gestion FROM kmt_info where CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + x2.Position = 0 + If x2.GetString("gestion") = 2 Then + b_cancel_pagare.Visible = True + Else + b_cancel_pagare.Visible = False + End If + + Else + b_cancel_pagare.Visible = False + End If + +' CallSubDelayed(Tracker, "Track") +' CallSubDelayed(Tracker, "StartFLPSmall") +' If Tracker.FLP.IsInitialized And Tracker.FLP.GetLastKnownLocation.IsInitialized Then 'Si tenemos "UltimaUbicaccionConocida" la usamos. +' B4XPages.MainPage.lat_gps = Tracker.FLP.GetLastKnownLocation.Latitude +' B4XPages.MainPage.lon_gps = Tracker.FLP.GetLastKnownLocation.Longitude +'' Log($"Tenemos UUC: ${Tracker.FLP.GetLastKnownLocation.Latitude},${Tracker.FLP.GetLastKnownLocation.Longitude}"$) +' GPS_LocationChanged(Tracker.FLP.GetLastKnownLocation) +' End If + + Dim x1 As Cursor =Starter.skmt.ExecQuery("SELECT IFNULL(CAT_CL_LIMITECREDITO,0) AS CAT_CL_LIMITECREDITO FROM kmt_info where CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + x1.Position = 0 + limite_credito = 0 + l_montopag.Text = x1.GetString("CAT_CL_LIMITECREDITO") + +' Dim fotomostrar As Cursor = Starter.skmt.ExecQuery("SELECT foto FROM FOTOS where CLIENTE IN (SELECT CUENTA FROM CUENTAA)") +' If fotomostrar.RowCount > 0 Then +' Dim fotomostrar1 As Cursor = Starter.skmt.ExecQuery("SELECT foto FROM FOTOS where CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND foto IS NULL") +' If fotomostrar1.RowCount > 0 Then +' iv_foto.Bitmap = LoadBitmap(File.DirAssets,"images.png") +' Log("aqui no hay foto") +' Else +' fotomostrar.Position = 0 +' Private fotomostrarfinal() As Byte = fotomostrar.GetBlob("foto") +' Dim InputStream1 As InputStream +' InputStream1.InitializeFromBytesArray(fotomostrarfinal, 0, fotomostrarfinal.Length) +' Dim Bitmap1 As Bitmap +' Bitmap1.Initialize2(InputStream1) +' InputStream1.Close +' iv_foto.Bitmap = Bitmap1 +' +' Log("aqui si hay foto") +' End If +' +' End If + + If (almacen = 81 Or almacen = 94) Then + HIST.Visible = True +' b_cxc.Visible = True + b_noEntrega.Visible = True + gest.Visible = True + End If + + + If p_abono.Visible Then + b_cxc_Click + Impimir = 0 + End If +End Sub + +Sub Activity_Pause (UserClosed As Boolean) + +End Sub + +'Sub GPS_LocationChanged (Location1 As Location) +'' lat_gps=Location1.ConvertToSeconds(Location1.Latitude) +'' lon_gps=Location1.ConvertToSeconds(Location1.Longitude) +' Dim sDate,sTime As String +' DateTime.DateFormat = "MM/dd/yyyy" +' sDate=DateTime.Date(DateTime.Now) +' sTime=DateTime.Time(DateTime.Now) +' Starter.skmt.ExecNonQuery("DELETE FROM HIST_GPS") +' Starter.skmt.ExecNonQuery2("INSERT INTO HIST_GPS (HGDATE, HGLAT, HGLON) VALUES(?,?,?) ", Array As Object (sDate & sTime, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps)) +'End Sub + +Sub GPS_LocationChanged (Location1 As Location) +' LogColor($"Entrando a Cliente.GPS_LocationChanged"$, Colors.red) + If Tracker.FLP.GetLastKnownLocation.IsInitialized And Tracker.FLP.GetLastKnownLocation.Latitude <> 0 Then + B4XPages.MainPage.lat_gps = Tracker.FLP.GetLastKnownLocation.Latitude + B4XPages.MainPage.lon_gps = Tracker.FLP.GetLastKnownLocation.Longitude + Log("Coords set to: " & B4XPages.MainPage.lat_gps & " and " & B4XPages.MainPage.lon_gps) + End If + + If LATITUD.Length < 5 Then + + Else + + + Dim l1, l2,l3 As Location + l1.Initialize2(B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps) + Log($"Coordenadas de la tienda - lat:${LATITUD}, lon:${LONGITUD}"$) + l2.Initialize2(LATITUD, LONGITUD) + l3.Initialize2(m_lat_al,m_lon_al) + + + 'now we need the distance between our location and the target location + distance = l1.DistanceTo(l2) 'the result is in meter + distance2 = l1.DistanceTo(l3) 'the result is in meter + Log("DISTANCIA "&distance) + + + Dim geo As Cursor = Starter.skmt.ExecQuery("SELECT ACTIVA FROM GEOCERCA") + If geo.RowCount > 0 Then + geo.Position = 0 + If geo.GetInt("ACTIVA") = 1 Then + + If (almacen = 88 Or almacen = 92) Then + + If distance2 < 100 Then + HIST.Visible = True + b = Starter.skmt.ExecQuery("select COUNT(*) AS CLIENTE FROM ABONOSP WHERE CLIENTE IN (Select CUENTA from cuentaa) AND SALDO_PENDIENTE <> 0") + b.Position = 0 + Dim cabonos As String = b.GetString("CLIENTE") + If cabonos = 0 Then + b_cxc.Visible = False + Else + b_cxc.Visible = True + End If + b_noEntrega.Visible = True + gest.Visible = True + Else + + If distance < 100 Then + HIST.Visible = True + b = Starter.skmt.ExecQuery("select COUNT(*) AS CLIENTE FROM ABONOSP WHERE CLIENTE IN (Select CUENTA from cuentaa) AND SALDO_PENDIENTE <> 0") + b.Position = 0 + Dim cabonos As String = b.GetString("CLIENTE") + If cabonos = 0 Then + b_cxc.Visible = False + Else + b_cxc.Visible = True + End If + b_noEntrega.Visible = True + gest.Visible = True + Else + HIST.Visible = False + b_cxc.Visible = False + b_noEntrega.Visible = False + gest.Visible = False + End If + + End If + + Else + HIST.Visible = True + b = Starter.skmt.ExecQuery("select COUNT(*) AS CLIENTE FROM ABONOSP WHERE CLIENTE IN (Select CUENTA from cuentaa) AND SALDO_PENDIENTE <> 0") + b.Position = 0 + Dim cabonos As String = b.GetString("CLIENTE") + If cabonos = 0 Then + b_cxc.Visible = False + Else + b_cxc.Visible = True + End If + b_noEntrega.Visible = True + gest.Visible = True + End If + Else If geo.GetInt("ACTIVA") = 0 Then + HIST.Visible = True + b = Starter.skmt.ExecQuery("select COUNT(*) AS CLIENTE FROM ABONOSP WHERE CLIENTE IN (Select CUENTA from cuentaa) AND SALDO_PENDIENTE <> 0") + b.Position = 0 + Dim cabonos As String = b.GetString("CLIENTE") + If cabonos = 0 Then + b_cxc.Visible = False + Else + b_cxc.Visible = True + End If + b_noEntrega.Visible = True + gest.Visible = True + End If + + + + End If + End If + + Dim sDate,sTime As String + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Starter.skmt.ExecNonQuery("DELETE FROM HIST_GPS") + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_GPS (HGDATE, HGLAT, HGLON) VALUES(?,?,?) ", Array As Object (sDate & sTime, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps)) + CallSubDelayed(Tracker, "CreateLocationRequest") +End Sub + + +Sub ListView1_ItemLongClick (Position As Int, Value As Object) + +End Sub + +'Sub gest_Click +' Dim x2 As Cursor =Starter.skmt.ExecQuery("SELECT gestion FROM kmt_info where CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") +' x2.Position = 0 +' If x2.GetString("gestion") = 2 Then +' Msgbox2Async("Ya se gestiono el cliente, no se pueden hacer modificaciones","Atención","","","Ok",LoadBitmap(File.DirAssets,"alert2.png"),False) +' Wait For Msgbox_Result (Result As Int) +' If Result= DialogResponse.NEGATIVE Then +' B4XPages.ShowPage("Principal") +' End If +' Else +' If (Subs.traeAlmacen = 92 Or Subs.traeAlmacen = 94) Then +' +' Dim k As Cursor = Starter.skmt.ExecQuery("SELECT CUENTA from CUENTAA") +' k.Position = 0 +' Log(k.GetString("CUENTA")) +' Dim cliecred As Cursor = Starter.skmt.ExecQuery("SELECT CAT_CL_LIMITECREDITO from kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") +' cliecred.Position = 0 +' +' Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente = ?", Array As String(k.GetString("CUENTA"))) +' y.position = 0 +' Dim u As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(SALDO_PENDIENTE),0) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE = ?", Array As String(k.GetString("CUENTA"))) +' u.Position = 0 +' If u.RowCount > 0 Then +' If u.GetString("SALDO_PENDIENTE") <> 0 Then +' If y.GetString("a_abono") > 0 Then +' If cliecred.GetString("CAT_CL_LIMITECREDITO") >= (u.GetString("SALDO_PENDIENTE") - y.GetString("a_abono") + l_total.Text.Replace(",","")) Then +' checacredito +' Else +' Dim creditofaltante As Float = (cliecred.GetString("CAT_CL_LIMITECREDITO") - ( u.GetString("SALDO_PENDIENTE") + l_total.Text.Replace(",","")- y.GetString("a_abono"))) * -1 +' Log("aqui") +'' MsgboxAsync($"Para poder hacer una entrega se necesita liberar '${creditofaltante}' de credito."$,"Atención") +' +' Msgbox2Async("Para poder hacer una entrega se necesita liberar" & NumberFormat2(creditofaltante,0,2,2,False) & " de credito.","Atención","","Hacer pago","Cancelar",LoadBitmap(File.DirAssets,"alert2.png"),False) +' Wait For Msgbox_Result (Result As Int) +' If Result= DialogResponse.CANCEL Then +' checacredito +' End If +' +' End If +'' Else If cliecred.GetString("CAT_CL_LIMITECREDITO") >= u.GetString("SALDO_PENDIENTE") + l_total.Text.Replace(",","") Then 'AQUI VAMOS A VALIDAR SI EL CREDITO ALCANZA' +'' MsgboxAsync("Para poder hacer una entrega se necesita liquidar el(los) pagare(s)","Atención") +' Else If cliecred.GetString("CAT_CL_LIMITECREDITO") >= (u.GetString("SALDO_PENDIENTE") + l_total.Text.Replace(",","")) Then +' checacredito +' Else +' Dim creditofaltante As Float = (cliecred.GetString("CAT_CL_LIMITECREDITO") - ( u.GetString("SALDO_PENDIENTE") + l_total.Text.Replace(",",""))) * -1 +' +' MsgboxAsync($"Para poder hacer una entrega se necesita liberar '${creditofaltante}' de credito."$,"Atención") +' End If +' Else If u.GetString("SALDO_PENDIENTE") = 0 Then +' checacredito +' End If +' Else +' checacredito +' End If +' +' Else +' Dim k As Cursor = Starter.skmt.ExecQuery("SELECT CUENTA from CUENTAA") +' k.Position = 0 +' Log(k.GetString("CUENTA")) +' Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente = ?", Array As String(k.GetString("CUENTA"))) +' y.position = 0 +' Dim u As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(SALDO_PENDIENTE),0) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE = ?", Array As String(k.GetString("CUENTA"))) +' u.Position = 0 +' If u.RowCount > 0 Then +' If u.GetString("SALDO_PENDIENTE") <> 0 Then +' If y.RowCount > 0 Then +' Log(NumberFormat2(u.GetDouble("SALDO_PENDIENTE"),0,2,2,False) &" = " & NumberFormat2(y.GetDouble("a_abono"),0,2,2,False)) +' If NumberFormat2(u.GetDouble("SALDO_PENDIENTE"),0,2,2,False) = NumberFormat2(y.GetDouble("a_abono"),0,2,2,False) Then +' checacredito +' Else +' Log("aqui") +' MsgboxAsync("Para poder hacer una entrega se necesita liquidar el(los) pagare(s)","Atención") +' End If +' Else +' Log("aqui") +' MsgboxAsync("Para poder hacer una entrega se necesita liquidar el(los) pagare(s)","Atención") +' End If +' Else If u.GetString("SALDO_PENDIENTE") = 0 Then +' checacredito +' End If +' Else +' checacredito +' End If +' End If +' End If +'End Sub + +Sub gest_Click + If l_total.Text = ".00" And L_CANT.Text = "0" Then + + MsgboxAsync("Para poder hacer una entrega primero reversa la venta","Atención") + + Else + + Dim x2 As Cursor =Starter.skmt.ExecQuery("SELECT gestion FROM kmt_info where CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + x2.Position = 0 + If x2.GetString("gestion") = 2 Then + Msgbox2Async("Ya se gestiono el cliente, no se pueden hacer modificaciones","Atención","","","Ok",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (Result As Int) + If Result= DialogResponse.NEGATIVE Then + B4XPages.ShowPage("Principal") + End If + Else + If (Subs.traeAlmacen = 92 Or Subs.traeAlmacen = 94) Then + + Dim k As Cursor = Starter.skmt.ExecQuery("SELECT CUENTA from CUENTAA") + k.Position = 0 + Log(k.GetString("CUENTA")) + Dim cliecred As Cursor = Starter.skmt.ExecQuery("SELECT CAT_CL_LIMITECREDITO from kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + cliecred.Position = 0 + + Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente = ? and a_tipoabono is null", Array As String(k.GetString("CUENTA"))) + y.position = 0 + Dim u As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(SALDO_PENDIENTE),0) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE = ?", Array As String(k.GetString("CUENTA"))) + u.Position = 0 + If u.RowCount > 0 Then + If u.GetString("SALDO_PENDIENTE") <> 0 Then + If y.GetString("a_abono") > 0 Then + If cliecred.GetString("CAT_CL_LIMITECREDITO") >= (u.GetString("SALDO_PENDIENTE") - y.GetString("a_abono") + l_total.Text.Replace(",","")) Then + checacredito + Else + Dim creditofaltante As Float = (cliecred.GetString("CAT_CL_LIMITECREDITO") - ( u.GetString("SALDO_PENDIENTE") + l_total.Text.Replace(",","")- y.GetString("a_abono"))) * -1 + + MsgboxAsync($"Para poder hacer una entrega se necesita liberar '${creditofaltante}' de credito."$,"Atención") + + checacredito + End If +' Else If cliecred.GetString("CAT_CL_LIMITECREDITO") >= u.GetString("SALDO_PENDIENTE") + l_total.Text.Replace(",","") Then 'AQUI VAMOS A VALIDAR SI EL CREDITO ALCANZA' +' MsgboxAsync("Para poder hacer una entrega se necesita liquidar el(los) pagare(s)","Atención") + Else If cliecred.GetString("CAT_CL_LIMITECREDITO") >= (u.GetString("SALDO_PENDIENTE") + l_total.Text.Replace(",","")) Then + checacredito + Else + Dim creditofaltante As Float = (cliecred.GetString("CAT_CL_LIMITECREDITO") - ( u.GetString("SALDO_PENDIENTE") + l_total.Text.Replace(",",""))) * -1 + + MsgboxAsync($"Para poder hacer una entrega se necesita liberar '${creditofaltante}' de credito."$,"Atención") + checacredito + End If + Else If u.GetString("SALDO_PENDIENTE") = 0 Then + checacredito + End If + Else + checacredito + End If + + Else + Dim k As Cursor = Starter.skmt.ExecQuery("SELECT CUENTA from CUENTAA") + k.Position = 0 + Log(k.GetString("CUENTA")) + Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente = ? and a_tipoabono is null", Array As String(k.GetString("CUENTA"))) + y.position = 0 + Dim u As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(SALDO_PENDIENTE),0) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE = ?", Array As String(k.GetString("CUENTA"))) + u.Position = 0 + If u.RowCount > 0 Then + If u.GetString("SALDO_PENDIENTE") <> 0 Then + If y.RowCount > 0 Then + Log(NumberFormat2(u.GetDouble("SALDO_PENDIENTE"),0,2,2,False) &" = " & NumberFormat2(y.GetDouble("a_abono"),0,2,2,False)) + If NumberFormat2(u.GetDouble("SALDO_PENDIENTE"),0,2,2,False) = NumberFormat2(y.GetDouble("a_abono"),0,2,2,False) Then + checacredito + Else + Log("aqui") + MsgboxAsync("Para poder hacer una entrega se necesita liquidar el(los) pagare(s)","Atención") + End If + Else + Log("aqui") + MsgboxAsync("Para poder hacer una entrega se necesita liquidar el(los) pagare(s)","Atención") + End If + Else If u.GetString("SALDO_PENDIENTE") = 0 Then + checacredito + End If + Else + checacredito + End If + End If + End If + End If +End Sub + +Sub checacredito + If l_total.Text = ".00" And (L_CANT.Text = 1 Or L_CANT.Text = 2) Then + Guardado + Else If l_total.Text = ".00" And L_CANT.Text > 2 Then + Log("Aqui") + Dim pagacheca As Cursor = Starter.skmt.ExecQuery("SELECT * FROM PAGARES WHERE PA_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + + If pagacheca.RowCount > 0 Then + esPagoACreditoGuardamosPagare + Else + + + + Dim x1 As Cursor =Starter.skmt.ExecQuery("SELECT IFNULL(CAT_CL_LIMITECREDITO,0) AS CAT_CL_LIMITECREDITO FROM kmt_info where CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + x1.Position = 0 + limite_credito = 0 + If CREDITO = 1 And x1.GetString("CAT_CL_LIMITECREDITO") <> 0 Then '''' se debe de cambiar a si acepta o no credito, aparte de tener la bandera a credito + + If Subs.traeAlmacen = 81 Or Subs.traeAlmacen = 94 Or Subs.traeAlmacen = 6 Then + + Log(12) + escreditoono = 1 + limite_credito = x1.GetString("CAT_CL_LIMITECREDITO") + If l_total.Text <> ".00" Then + esPagoACreditoGuardamosPagare + Else If l_total.Text = ".00" And L_CANT.Text > 2 Then + esPagoACreditoGuardamosPagare + End If + + Else + + + Msgbox2Async("EL CLIENTE TIENE CREDITO DISPONIBLE, UNA VEZ SELECCIONADA UNA OPCION NO SE PODRA MODIFICAR!!!!!","Forma de pago","","Credito","Efectivo",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (Result As Int) + If Result= DialogResponse.POSITIVE Then + Log(1) + Else If Result = DialogResponse.NEGATIVE Then + escreditoono = 0 + Log(2) + Tipoentrega = "CONTADO" + B_IMP_Click + banderaimp = 1 + Else If Result = DialogResponse.CANCEL Then + Log(12) + escreditoono = 1 + limite_credito = x1.GetString("CAT_CL_LIMITECREDITO") + esPagoACreditoGuardamosPagare + Log(3) + + End If + End If + Else + Log(4) + + p_contado.Visible= True + p_contado.Width = Root.Width + p_contado.Height = Root.Height + et_cont_transfe.Visible = False + et_cont_efectivo.Visible = False + et_cont_cheque.Visible = False + et_cont_transfe.Text = "" + et_cont_efectivo.Text = "" + et_cont_cheque.Text = "" + ch_cont_efectivo.Checked = False + ch_cont_transfe.Checked = False + ch_cont_cheque.Checked = False + l_contado.Text = "Seleccione el metodo de pago." &CRLF&CRLF&"Total :" & l_total.Text + + escreditoono = 0 +' B_IMP_Click + banderaimp = 1 + End If + End If + + Else + + Dim pagacheca As Cursor = Starter.skmt.ExecQuery("SELECT * FROM PAGARES WHERE PA_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + + If pagacheca.RowCount > 0 Then + esPagoACreditoGuardamosPagare + Else + + + + Dim x1 As Cursor =Starter.skmt.ExecQuery("SELECT IFNULL(CAT_CL_LIMITECREDITO,0) AS CAT_CL_LIMITECREDITO FROM kmt_info where CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + x1.Position = 0 + limite_credito = 0 + If CREDITO = 1 And x1.GetString("CAT_CL_LIMITECREDITO") <> 0 Then '''' se debe de cambiar a si acepta o no credito, aparte de tener la bandera a credito + + If Subs.traeAlmacen = 81 Or Subs.traeAlmacen = 94 Or Subs.traeAlmacen = 6 Then + + + Dim c4 As Cursor = Starter.skmt.ExecQuery("SELECT IFNULL(CAT_CL_VCREDITO,0) AS CAT_CL_VCREDITO, IFNULL(CAT_CL_VCODIGO,0) AS CAT_CL_VCODIGO FROM kmt_info where CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + c4.Position = 0 + If c4.GetString("CAT_CL_VCREDITO") = "1" Then + + Dim c9 As Cursor = Starter.skmt.ExecQuery("SELECT IFNULL(CAT_CL_CORERROR,0) AS CAT_CL_CORERROR FROM CODIGO_CREDITO where CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + If c9.RowCount > 0 Then + c9.Position = 0 + Log("Aqui") + If c9.GetString("CAT_CL_CORERROR") >= 3 Then + Log(4) + p_contado.Visible= True + p_contado.Width = Root.Width + p_contado.Height = Root.Height + et_cont_transfe.Visible = False + et_cont_efectivo.Visible = False + et_cont_cheque.Visible = False + et_cont_transfe.Text = "" + et_cont_efectivo.Text = "" + et_cont_cheque.Text = "" + ch_cont_efectivo.Checked = False + ch_cont_transfe.Checked = False + ch_cont_cheque.Checked = False + l_contado.Text = "Seleccione el metodo de pago." &CRLF&CRLF&"Total: " & l_total.Text + + escreditoono = 0 +' B_IMP_Click + banderaimp = 1 + Else + p_codigo.Visible= True + p_codigo.Width = Root.Width + p_codigo.Height = Root.Height + et_codigo.Text = "" + End If + Else + p_codigo.Visible= True + p_codigo.Width = Root.Width + p_codigo.Height = Root.Height + et_codigo.Text = "" + End If + c9.Position = 0 + + + + + Else If c4.GetString("CAT_CL_VCREDITO") = "0" Then + Log(4) + p_contado.Visible= True + p_contado.Width = Root.Width + p_contado.Height = Root.Height + et_cont_transfe.Visible = False + et_cont_efectivo.Visible = False + et_cont_cheque.Visible = False + et_cont_transfe.Text = "" + et_cont_efectivo.Text = "" + et_cont_cheque.Text = "" + ch_cont_efectivo.Checked = False + ch_cont_transfe.Checked = False + ch_cont_cheque.Checked = False + l_contado.Text = "Seleccione el metodo de pago." &CRLF&CRLF&"Total: " & l_total.Text + + escreditoono = 0 +' B_IMP_Click + banderaimp = 1 + + End If + + Else + + + Msgbox2Async("EL CLIENTE TIENE CREDITO DISPONIBLE, UNA VEZ SELECCIONADA UNA OPCION NO SE PODRA MODIFICAR!!!!!","Forma de pago","","Credito","Efectivo",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (Result As Int) + If Result= DialogResponse.POSITIVE Then + Log(1) + Else If Result = DialogResponse.NEGATIVE Then + escreditoono = 0 + Log(2) + Tipoentrega = "CONTADO" + B_IMP_Click + banderaimp = 1 + Else If Result = DialogResponse.CANCEL Then + Log(12) + escreditoono = 1 + limite_credito = x1.GetString("CAT_CL_LIMITECREDITO") + esPagoACreditoGuardamosPagare + Log(3) + + End If + End If + Else + Log(4) + + p_contado.Visible= True + p_contado.Width = Root.Width + p_contado.Height = Root.Height + et_cont_transfe.Visible = False + et_cont_efectivo.Visible = False + et_cont_cheque.Visible = False + et_cont_transfe.Text = "" + et_cont_efectivo.Text = "" + et_cont_cheque.Text = "" + ch_cont_efectivo.Checked = False + ch_cont_transfe.Checked = False + ch_cont_cheque.Checked = False + l_contado.Text = "Seleccione el metodo de pago." &CRLF&CRLF&"Total: " & l_total.Text + + escreditoono = 0 +' B_IMP_Click + banderaimp = 1 + End If + End If + End If +End Sub + +Sub esPagoACreditoGuardamosPagare + Tipoentrega = "CREDITO" + Log(3) + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + 'cliente + c=Starter.skmt.ExecQuery("select CUENTA from cuentaa") + c.Position = 0 + cuenta = c.GetString("CUENTA") + c.Close + 'usuario + c=Starter.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c.Close + 'Almacen + c=Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + c.Position = 0 + almacen = c.GetString("ID_ALMACEN") + c.Close + 'FECHA PREVENTA + c=Starter.skmt.ExecQuery("select HVD_FECHA from HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + c.Position = 0 + fechaprev = c.GetString("HVD_FECHA") + c.Close + 'RUTAPREVENTA + c=Starter.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + c.Position = 0 + rutaprev = c.GetString("CAT_CL_RUTA") + c.Close + 'RUTA rep + rutarep = Subs.traeRutaReparto + c.Close + 'monto + c=Starter.skmt.ExecQuery("select sum(HVD_COSTO_TOT) AS MONTO from HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND HVD_RECHAZO = 0 AND HVD_PARCIAL = 0") + c.Position = 0 + montopagare = c.GetString("MONTO") + c.Close + + c = Starter.skmt.ExecQuery($"select distinct hvd_num_ticket from hist_ventas where hvd_cliente = '${la_cuenta.Text}'"$) + If c.RowCount > 0 Then + c.Position = 0 + NOTA = c.GetString("HVD_NUM_TICKET") + End If + c.Close + Dim pagacheca As Cursor = Starter.skmt.ExecQuery("SELECT * FROM PAGARES WHERE PA_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + + If pagacheca.RowCount > 0 Then + If l_total.Text.Replace(",","") <= l_montopag.Text Then + + B_IMP_Click + banderaimp = 1 + + Else + + Log("AQUI") + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Log(limite_credito) + Msgbox2Async("Se debe de realizar un pago por " & NumberFormat2((l_total.Text.Replace(",","")-l_montopag.Text),0,2,2,False) & " por que excede el limite de credito","Atención","Aceptar","","Cancelar",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (Result As Int) + If Result= DialogResponse.POSITIVE Then + + p_tipopago.Visible= True + p_tipopago.Width = Root.Width + p_tipopago.Height = Root.Height + End If + + End If + Else + If l_total.Text.Replace(",","") <= limite_credito Then + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Starter.skmt.ExecNonQuery2("INSERT INTO PAGARES (PA_ALMACEN, PA_RUTA_REP, PA_RUTAPREV, PA_FECHA_PREV, PA_CAPTURA, PA_MONTO, PA_USUARIO, PA_CLIENTE,PA_TICKET) VALUES(?,?,?,?,?,?,?,?,?) ", Array As Object (almacen,rutarep,rutaprev,fechaprev,(sDate),l_total.Text.Replace(",",""),usuario,cuenta,NOTA)) + B_IMP_Click + banderaimp = 1 + Log("AQUI ENTOCES") + Else + Log("AQUI") + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Log(limite_credito) + Msgbox2Async("Se debe de realizar un pago por " & NumberFormat2((l_total.Text.Replace(",","")-limite_credito),0,2,2,False) & " por que excede el limite de credito","Atención","Aceptar","","Cancelar",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (Result As Int) + If Result= DialogResponse.POSITIVE Then + + p_tipopago.Visible= True + p_tipopago.Width = Root.Width + p_tipopago.Height = Root.Height + End If + End If + + End If +End Sub + +Sub Guardado + Log(escreditoono) + DateTime.DateFormat = "MM/dd/yyyy" + DateTime.TimeFormat="HHmmss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=Starter.skmt.ExecQuery("select CUENTA from cuentaa") + c.Position = 0 + cuenta = c.GetString("CUENTA") + c=Starter.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c.Close + d = Starter.skmt.ExecQuery("SELECT RUTAA FROM RUTAA") + d.Position = 0 + Dim ruta As String = d.GetString("RUTAA") + d.Close + d = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + d.Position = 0 + Dim rutapre As String = d.GetString("CAT_CL_RUTA") + d.Close + +' d = Starter.skmt.ExecQuery("SELECT HVD_FECHA FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") +' d.Position = 0 + Dim fechaprev As String = Subs.traefECHAPREV +' d.Close + + Dim rutaactualizar As String + Dim rut As Cursor = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If rut.RowCount > 0 Then + rut.Position = 0 + rutaactualizar = rut.GetString("CAT_CL_RUTA") + End If + + Starter.skmt.ExecNonQuery($"DELETE FROM NOVENTA WHERE NV_CLIENTE IN (select cuenta from cuentaa)"$) + Starter.skmt.ExecNonQuery2("INSERT INTO NOVENTA (NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON,NV_RUTA) VALUES(?,?,?,?,?,?,?,?) ", Array As Object (Subs.traeCliente,sDate &" "& sTime, usuario, "ENTREGA","ENTREGA COMPLETA", B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,rutaactualizar)) + Starter.skmt.ExecNonQuery2("INSERT INTO REPARTO_GEO (CLIENTE, USUARIO, FECHA_PUNTEO, LATITUD, LONGITUD, ALMACEN, RUTA_REPARTO, RUTA_PREV, FECHA_PREVENTA, TIPO,ENVIO) VALUES(?,?,?,?,?,?,?,?,?,?,0)",Array As String (la_cuenta.Text, usuario, sDate &" "&sTime, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,B4XPages.MainPage.almacen,ruta,rutapre,fechaprev, "ENTREGADO")) + Starter.skmt.ExecNonQuery($"UPDATE kmt_info set gestion = 2, HORAENT = '${sDate & " " & sTime}' where CAT_CL_CODIGO In (select cuenta from cuentaa) and CAT_CL_RUTA = '${rutaactualizar}' "$) + Starter.skmt.ExecNonQuery("update HIST_VENTAS SET HVD_ESTATUS = 1 WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + mandaPendientesreparto + + If escreditoono = "1" Then + + Dim g5 As Cursor = Starter.skmt.ExecQuery("SELECT SUM(HVD_COSTO_TOT) as HVD_COSTO_TOT FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + g5.Position = 0 + Dim totaltotal As String = NumberFormat2(g5.GetString("HVD_COSTO_TOT"),0,2,2,False) + g5.Close + LogColor(totaltotal,Colors.Red) + LogColor(l_total.Text.Replace(",",""),Colors.Red) + If totaltotal = l_total.Text.Replace(",","") Then + Dim entregatotaloparial As String = "ENTREGA TOTAL" + Else + Dim entregatotaloparial As String = "ENTREGA PARCIAL" + End If + + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "UPDATE_ACTUAL_GEO_GUNA_VN" +' cmd.Parameters = Array As String(l_total.Text,"1", l_total.Text,B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,"","",usuario,ruta,"ENTREGA", entregatotaloparial,"CREDITO", distance, L_CANT.text,la_cuenta.Text,fechaprev,almacen,Subs.traerUTAPREV) + cmd.Parameters = Array As String(l_total.Text.Replace(",",""),"1", l_total.Text.Replace(",",""),B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,"","",usuario,ruta,"ENTREGA", entregatotaloparial,"CREDITO", distance, L_CANT.text,la_cuenta.Text,fechaprev,almacen,Subs.traerUTAPREV) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_REPARTO_GEO(HIST_RG_MONTO , HIST_RG_CREDITO , HIST_RG_MONTO_CREDITO , HIST_RG_LAT , HIST_RG_LONG , HIST_RG_RECHAZO , HIST_RG_MOTIVO , HIST_RG_USUARIO_ENTREGO , HIST_RG_RUTA_REP , HIST_RG_ESTATUS_ENTREGA , HIST_RG_COMENTARIO_ENTREGA , HIST_RG_FORMA_PAGO , HIST_RG_GEOCERCA_MTS , HIST_RG_NO_ART , HIST_RG_CLIENTE , HIST_RG_FECHA , HIST_RG_ALMACEN , HIST_RG_RUTA_PRE) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object(l_total.Text.Replace(",",""),"1", l_total.Text.Replace(",",""),B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,"","",usuario,ruta,"ENTREGA", entregatotaloparial,"CREDITO", distance, L_CANT.text,la_cuenta.Text,fechaprev,almacen,Subs.traerUTAPREV)) + reqManager.ExecuteCommand(cmd, "up_geo") + +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "UPDATE_ACTUAL_GEO_GUNA_VN" +' cmd.Parameters = Array As String(l_total.Text,"fue credito", "MONTO SI FUE A CREDITO",B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,"RECHAZO O NO",usuario,ruta,"entrega o rechazo", "parcial o total","efectivo o credito", "mts", L_CANT.text,la_cuenta.Text,fechaprev,almacen,rutaprev) +' reqManager.ExecuteCommand(cmd, "up_geo") + + Else + + Dim g5 As Cursor = Starter.skmt.ExecQuery("SELECT SUM(HVD_COSTO_TOT) as HVD_COSTO_TOT FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + g5.Position = 0 + Dim totaltotal As String = NumberFormat2(g5.GetString("HVD_COSTO_TOT"),0,2,2,False) + g5.Close + LogColor(totaltotal,Colors.Red) + LogColor(l_total.Text.Replace(",",""),Colors.Red) + If totaltotal = l_total.Text.Replace(",","") Then + Dim entregatotaloparial As String = "ENTREGA TOTAL" + Else + Dim entregatotaloparial As String = "ENTREGA PARCIAL" + End If + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "UPDATE_ACTUAL_GEO_GUNA_VN" + cmd.Parameters = Array As String(l_total.Text.Replace(",",""),"0", "",B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,"","",usuario,ruta,"ENTREGA", entregatotaloparial,"EFECTIVO", distance, L_CANT.text,la_cuenta.Text,fechaprev,almacen,Subs.traerUTAPREV) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_REPARTO_GEO(HIST_RG_MONTO , HIST_RG_CREDITO , HIST_RG_MONTO_CREDITO , HIST_RG_LAT , HIST_RG_LONG , HIST_RG_RECHAZO , HIST_RG_MOTIVO , HIST_RG_USUARIO_ENTREGO , HIST_RG_RUTA_REP , HIST_RG_ESTATUS_ENTREGA , HIST_RG_COMENTARIO_ENTREGA , HIST_RG_FORMA_PAGO , HIST_RG_GEOCERCA_MTS , HIST_RG_NO_ART , HIST_RG_CLIENTE , HIST_RG_FECHA , HIST_RG_ALMACEN , HIST_RG_RUTA_PRE) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object(l_total.Text.Replace(",",""),"0", "",B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,"","",usuario,ruta,"ENTREGA", entregatotaloparial,"EFECTIVO", distance, L_CANT.text,la_cuenta.Text,fechaprev,almacen,Subs.traerUTAPREV)) + reqManager.ExecuteCommand(cmd, "up_geo") + + End If + + Log("FECHA "& rutaprev) + +' Dim mandamapa As Cursor = Starter.skmt.ExecQuery("SELECT * FROM kmt_info WHERE gestion = 0 and CAT_CL_CODIGO <> 63403") +' If mandamapa.RowCount > 0 Then +' StartActivity(MAPA_RUTAS) +' Else If mandamapa.RowCount = 0 Then +' If (almacen = 81 Or almacen = 94) Then +' +' +' Else + + B4XPages.ShowPage("Principal") +' End If +' End If +End Sub + +Sub b_noEntrega_Click + Dim x2 As Cursor =Starter.skmt.ExecQuery("SELECT gestion FROM kmt_info where CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + x2.Position = 0 + If x2.GetString("gestion") = 2 Then + Msgbox2Async("Ya se gestiono el cliente, no se pueden hacer modificaciones","Atención","","","Ok",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (Result As Int) + If Result= DialogResponse.NEGATIVE Then + B4XPages.ShowPage("Principal") + End If + Else + +' Dim k As Cursor = Starter.skmt.ExecQuery("SELECT CUENTA from CUENTAA") +' k.Position = 0 +' Log(k.GetString("CUENTA")) +' Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente = ?", Array As String(k.GetString("CUENTA"))) +' y.position = 0 +' Dim u As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(SALDO_PENDIENTE),0) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE = ?", Array As String(k.GetString("CUENTA"))) +' u.Position = 0 + ' +' If u.RowCount > 0 Then +' If u.GetString("SALDO_PENDIENTE") <> 0 Then +' If y.RowCount > 0 Then +' +' If u.GetString("SALDO_PENDIENTE") = y.GetString("a_abono") Then + B4XPages.ShowPage("noVenta") +' Else +' MsgboxAsync("Para poder hacer una entrega se necesita liquidar el(los) pagare(s)","Atención") +' End If +' Else +' MsgboxAsync("Para poder hacer una entrega se necesita liquidar el(los) pagare(s)","Atención") +' End If +' Else If u.GetString("SALDO_PENDIENTE") = 0 Then +' B4XPages.ShowPage("noVenta") +' +' End If +' Else +' B4XPages.ShowPage("noVenta") +' End If + End If +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub + ' BACK key pressed + ' I want to capture the key here so I return True + If p_credito.Visible Then + et_montoacredito.Text = "" + p_credito.Visible = False + Return False + Else If p_abono.Visible Then + p_abono.Visible = False + et_abono.Text = "" + Return False + Else + B4XPages.ShowPage("Clientes") + Return False + End If +' B4XPages.ShowPage("Clientes") +End Sub + +Sub Tar_Click +' StartActivity(colonia2) + B4XPages.ShowPage("Productos") +End Sub + +Sub DATOS_Click +' StartActivity(telefonos) +End Sub + +Sub Guardar_Click +' Dim mandamapa As Cursor = Starter.skmt.ExecQuery("SELECT * FROM kmt_info WHERE gestion = 0 AND cat_cl_codigo <> 63403") +' If mandamapa.RowCount > 0 Then +' StartActivity(MAPA_RUTAS) +' Else If mandamapa.RowCount = 0 Then + B4XPages.ShowPage("Principal") +' End If +End Sub + +Sub NUEVO_Click + StartActivity(MAPA_CLIENTE) +End Sub + +Sub HIST_Click + + Dim pagacheca2 As Cursor = Starter.skmt.ExecQuery("SELECT * FROM PAGARES WHERE PA_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + If pagacheca2.RowCount > 0 Then + Msgbox2Async("El pagare ya fue generdo, no se puede realizar modificación.","Atención","","","Ok",LoadBitmap(File.DirAssets,"alert2.png"),False) + Wait For Msgbox_Result (Result As Int) + If Result= DialogResponse.POSITIVE Then + Log("Aqui") + End If + Else + If (Subs.traeAlmacen = 92 Or Subs.traeAlmacen = 94) Then + Dim k As Cursor = Starter.skmt.ExecQuery("SELECT CUENTA from CUENTAA") + k.Position = 0 + Log(k.GetString("CUENTA")) + Dim cliecred As Cursor = Starter.skmt.ExecQuery("SELECT CAT_CL_LIMITECREDITO from kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + cliecred.Position = 0 + Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente = ?", Array As String(k.GetString("CUENTA"))) + y.position = 0 + Dim u As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(SALDO_PENDIENTE),0) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE = ?", Array As String(k.GetString("CUENTA"))) + u.Position = 0 + If u.RowCount > 0 Then + If u.GetString("SALDO_PENDIENTE") <> 0 Then + Log("AQUI ESTOY") + If y.GetString("a_abono") > 0 Then + Log("AQUI AHORA") + If cliecred.GetString("CAT_CL_LIMITECREDITO") >= (u.GetString("SALDO_PENDIENTE") - y.GetString("a_abono") + l_total.Text.Replace(",","")) Then + B4XPages.MainPage.detalleVenta.prodsMap.Initialize + B4XPages.ShowPage("DetalleVenta") + Else + Dim creditofaltante As Float = (cliecred.GetString("CAT_CL_LIMITECREDITO") - ( u.GetString("SALDO_PENDIENTE") + l_total.Text.Replace(",","")- y.GetString("a_abono"))) * -1 + B4XPages.ShowPage("DetalleVenta") + MsgboxAsync($"Para poder hacer una entrega se necesita liberar '${creditofaltante}' de credito."$,"Atención") + End If + ' Else If cliecred.GetString("CAT_CL_LIMITECREDITO") >= u.GetString("SALDO_PENDIENTE") + l_total.Text.Replace(",","") Then 'AQUI VAMOS A VALIDAR SI EL CREDITO ALCANZA' + ' MsgboxAsync("Para poder hacer una entrega se necesita liquidar el(los) pagare(s)","Atención") + Else If cliecred.GetString("CAT_CL_LIMITECREDITO") >= (u.GetString("SALDO_PENDIENTE") + l_total.Text.Replace(",","")) Then + B4XPages.MainPage.detalleVenta.prodsMap.Initialize + B4XPages.ShowPage("DetalleVenta") + Else + Dim creditofaltante As Float = (cliecred.GetString("CAT_CL_LIMITECREDITO") - ( u.GetString("SALDO_PENDIENTE") + l_total.Text.Replace(",",""))) * -1 + MsgboxAsync($"Para poder hacer una entrega se necesita liberar '${creditofaltante}' de credito."$,"Atención") + End If + Else If u.GetString("SALDO_PENDIENTE") = 0 Then + B4XPages.MainPage.detalleVenta.prodsMap.Initialize + B4XPages.ShowPage("DetalleVenta") + End If + Else + B4XPages.MainPage.detalleVenta.prodsMap.Initialize + B4XPages.ShowPage("DetalleVenta") + End If + Else + Dim k As Cursor = Starter.skmt.ExecQuery("SELECT CUENTA from CUENTAA") + k.Position = 0 + Log(k.GetString("CUENTA")) + Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente = ?", Array As String(k.GetString("CUENTA"))) + y.position = 0 + Dim u As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(SALDO_PENDIENTE),0) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE = ?", Array As String(k.GetString("CUENTA"))) + u.Position = 0 + If u.RowCount > 0 Then + If u.GetString("SALDO_PENDIENTE") <> 0 Then + If y.RowCount > 0 Then + If u.GetString("SALDO_PENDIENTE") = y.GetString("a_abono") Then + B4XPages.MainPage.detalleVenta.prodsMap.Initialize + B4XPages.ShowPage("DetalleVenta") + Else + MsgboxAsync("Para poder hacer una entrega se necesita liquidar el(los) pagare(s)","Atención") + End If + Else + MsgboxAsync("Para poder hacer una entrega se necesita liquidar el(los) pagare(s)","Atención") + End If + Else If u.GetString("SALDO_PENDIENTE") = 0 Then + B4XPages.MainPage.detalleVenta.prodsMap.Initialize + B4XPages.ShowPage("DetalleVenta") + End If + Else + B4XPages.MainPage.detalleVenta.prodsMap.Initialize + B4XPages.ShowPage("DetalleVenta") + End If + End If + End If + ' B4XPages.MainPage.historico.prodsMap.Initialize + '' B4XPages.MainPage.historico.clv_pedido.Clear + ' B4XPages.ShowPage("Historico") + ' B4XPages.MainPage.historico.clv_pedido.Clear + +End Sub + +Sub B_IMP_Click + c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + + DateTime.DateFormat = "MM/dd/yyyy" + DateTime.TimeFormat="HHmmss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=Starter.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c.Close + d = Starter.skmt.ExecQuery("SELECT RUTAA FROM RUTAA") + d.Position = 0 + Dim ruta As String = d.GetString("RUTAA") + d.Close + d = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + d.Position = 0 + Dim rutapre As String = d.GetString("CAT_CL_RUTA") + d.Close + +' d = Starter.skmt.ExecQuery("SELECT HVD_FECHA FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") +' d.Position = 0 + Dim fechaprev As String = Subs.traefECHAPREV +' d.Close + + Dim rutaactualizar As String + Dim rut As Cursor = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If rut.RowCount > 0 Then + rut.Position = 0 + rutaactualizar = rut.GetString("CAT_CL_RUTA") + End If + + Starter.skmt.ExecNonQuery($"DELETE FROM NOVENTA WHERE NV_CLIENTE IN (select cuenta from cuentaa)"$) + Starter.skmt.ExecNonQuery2("INSERT INTO NOVENTA (NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON,NV_RUTA) VALUES(?,?,?,?,?,?,?,?) ", Array As Object (Subs.traeCliente,sDate &" "& sTime, usuario, "ENTREGA","ENTREGA COMPLETA", B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,rutaactualizar)) + Starter.skmt.ExecNonQuery2("INSERT INTO REPARTO_GEO (CLIENTE, USUARIO, FECHA_PUNTEO, LATITUD, LONGITUD, ALMACEN, RUTA_REPARTO, RUTA_PREV, FECHA_PREVENTA, TIPO,ENVIO) VALUES(?,?,?,?,?,?,?,?,?,?,0)",Array As String (la_cuenta.Text, usuario, sDate &" "&sTime, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,B4XPages.MainPage.almacen,ruta,rutapre,fechaprev, "ENTREGADO")) + Starter.skmt.ExecNonQuery($"UPDATE kmt_info set gestion = 2, HORAENT = '${sDate & " " & sTime}' where CAT_CL_CODIGO In (select cuenta from cuentaa) and CAT_CL_RUTA = '${rutaactualizar}' "$) + Starter.skmt.ExecNonQuery("update HIST_VENTAS SET HVD_ESTATUS = 1 WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + + +' DateTime.DateFormat = "MM/dd/yyyy" + DateTime.DateFormat = "dd/MM/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c.Close +' ProgressDialogShow("Imprimiendo, un momento ...") +' Printer1.DisConnect +' If Not(Printer1.IsConnected) Then +'' Log("Conectando a impresora ...") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) +' Sleep(1000) +'' Log("++++++ " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect 'Tratamos de reconectar +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' Else +'' Log("conectando 2") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) +' Sleep(1000) +'' Log("****** " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' End If + + ProgressDialogShow2("Imprimiendo, un momento ...",False) + Printer1.DisConnect + If Not(Printer1.IsConnected) Then +' If logger Then Log("conectando 1") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) + Sleep(1000) + cont = cont + 1 + If cont = 7 Then Printer1.Connect 'Tratamos de reconectar + If cont > 15 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + Else +' If logger Then Log("conectando 2") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) + Sleep(1000) + cont = cont + 1 + If cont = 7 Then Printer1.Connect + If cont > 15 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + End If + + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + Dim bmp As Bitmap + bmp.InitializeResize(File.DirAssets, "logo-guna-18.jpg", 192, 192, True) 'ignore + Dim myimage As AnImage = Printer1.ImageToBWIMage(bmp) + myimage = Printer1.DitherImage2D(myimage, 128) + myimage= Printer1.PackImage(myimage) + Printer1.WriteString(CRLF) ' nudge the printer to show the user something is happening + Printer1.WriteString(Printer1.REVERSE) + Printer1.PrintImage(myimage) + Printer1.WriteString(Printer1.UNREVERSE) +' Dim Ticket As String = 0 +' Dim c6 As Cursor = Starter.skmt.ExecQuery("select distinct HVD_NUM_TICKET FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") +' If c6.RowCount > 0 Then +' c6.Position = 0 +' Ticket = c6.GetString("HVD_NUM_TICKET") +' End If +' c6.Close + Dim telefono As String = "" + Dim c7 As Cursor = Starter.skmt.ExecQuery("select IFNULL(CAT_CL_TELEFONO,' ') AS CAT_CL_TELEFONO FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If c7.RowCount > 0 Then + c7.Position = 0 + telefono = c7.GetString("CAT_CL_TELEFONO") + End If + c7.Close + DateTime.DateFormat = "dd/MM/yyyy" + Printer1.WriteString("DISTRIBUIDORA ROCHA TULA PACHUCA" & CRLF) + Printer1.WriteString(sDate & CRLF) + Printer1.WriteString(sTime & CRLF) + Printer1.WriteString("Reparto:" & usuario & CRLF) + Printer1.WriteString("Ruta:" & Subs.traeRutaReparto & CRLF) + Printer1.WriteString("Ruta preventa:" & Subs.traerUTAPREV & CRLF) + Printer1.WriteString("Tienda: " & La_nombre.Text & CRLF) + Printer1.WriteString("ID.Cliente: " & la_cuenta.Text & CRLF) + Printer1.WriteString("Calle: " & la_Calle.Text & CRLF) + Printer1.WriteString("Colonia: " & la_col.Text & CRLF) + Printer1.WriteString("Telefono: " & telefono & CRLF) + + Dim Ticket As String = 0 + Dim c6 As Cursor = Starter.skmt.ExecQuery("select distinct HVD_NUM_TICKET FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + If c6.RowCount > 0 Then + For k = 0 To c6.RowCount -1 + c6.Position = k + Ticket = c6.GetString("HVD_NUM_TICKET") + Printer1.WriteString("Num. Ticket " & (k +1)&": " & Ticket & CRLF) + Next + End If + c6.Close + + Printer1.WriteString(" " & CRLF) + c = Starter.skmt.ExecQuery("SELECT * FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + + Dim totaltotal As Double + Dim cobranza As Cursor = Starter.skmt.ExecQuery("SELECT * FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA) and HVD_PRONOMBRE = 'Cobranza Pendiente'") + Dim restacobranza As Int = 0 + If cobranza.RowCount > 0 Then + restacobranza = 1 + End If + If c.RowCount > 0 Then + ' aqui es donde esta el pedo de julieta de los descuentos quitar el precio2 pero meter un if para saber si es ruta especial o es normal o que show. ''CAT_TIPO_BONIFICACIONES +' s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, HVD_CANT, length(HVD_CANT) as L_CANT, HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID, HVD_CODPROMO,IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) and (HVD_CODPROMO <> 'MI RETO' or HVD_CODPROMO <> 'MI RETO' or HVD_CODPROMO <> 'MI RETO') AND (HVD_COSTO_TOT/HVD_CANT) > 0.01 order by HVD_PROID"$) + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) and (HVD_CODPROMO <> 'MIRETO' or HVD_CODPROMO <> 'SOCIOBAT' or HVD_CODPROMO <> 'BIGCOMMERCE') AND HVD_CODPROMO = '${Subs.traeAlmacen}' AND (HVD_COSTO_TOT/HVD_CANT) > 0.01 GROUP by HVD_PROID"$) + If S.RowCount>0 Then + + Printer1.WriteString("-------ENTREGA A "& Tipoentrega &"------" & CRLF) +' Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString("Cant. Precio Importe" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + For i=0 To S.RowCount -1 + S.Position=i + Log(s.GetString("HVD_RECHAZO")) + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then + If s.GetInt("HVD_RECHAZO") = 0 Then + Printer1.Justify = 0 + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + Dim punit As String = NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) + TAMANO = punit.Length + TAMANO +' Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + TAMANO = ptot.Length + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString( ptot & CRLF ) + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + totaltotal = totaltotal + ptot + Else If s.GetInt("HVD_RECHAZO") > 0 Then + Printer1.Justify = 0 + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + Private vc5 As Cursor = Starter.skmt.ExecQuery($"select iFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + vc5.Position = 0 + Dim punit As String = NumberFormat2((vc5.GetString("CAT_GP_PRECIO")),0,2,2,False) + TAMANO = punit.Length + TAMANO + vc5.Close + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + TAMANO = ptot.Length + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString(ptot& CRLF ) + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + Printer1.Justify = 0 + totaltotal = totaltotal + ptot + End If + End If + Next + End If + End If + Printer1.Justify = 0 + s.Close + Printer1.WriteString(" " & CRLF) + + +' s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, HVD_CANT, length(HVD_CANT) as L_CANT, HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID, HVD_CODPROMO,IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_RECHAZO = 0 AND HVD_CODPROMO <> '${Subs.traeAlmacen}' order by HVD_CODPROMO, ESPROMO DESC, HVD_PROID"$) + s=Starter.skmt.ExecQuery($"SELECT HVD_CODPROMO, HVD_PROID, HVD_PRONOMBRE, SUM(HVD_CANT) AS HVD_CANT, LENGTH(SUM(HVD_CANT)) AS L_CANT, SUM(HVD_COSTO_TOT) AS HVD_COSTO_TOT, LENGTH(SUM(HVD_COSTO_TOT)) AS L_COSTOU, HVD_PROID, SUM(IFNULL(HVD_RECHAZOCANT, 0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM cuentaa) AND HVD_CODPROMO <> HVD_PROID AND HVD_CODPROMO NOT IN ('SOCIOBAT', 'MIRETO', 'BIGCOMMERCE') AND HVD_PRONOMBRE <> 'Cobranza Pendiente' AND HVD_CODPROMO <> '${Subs.traeAlmacen}' GROUP BY HVD_PROID, HVD_CODPROMO"$) + + + If S.RowCount>0 Then + Printer1.WriteString("------- BONIFICACIONES --------" & CRLF) + Printer1.WriteString("Cant. Precio Importe" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + For i=0 To S.RowCount -1 + S.Position=i + + + + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then +' If s.GetString("HVD_CODPROMO") <> Subs.traeAlmacen Then + Printer1.Justify = 0 +' If s.GetString("HVD_CODPROMO") = s.GetString("HVD_PROID") Then + '' Printer1.WriteString("* "&s.GetString("HVD_PRONOMBRE") & CRLF) +' +' Else + + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + + Dim punit As String =NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) + TAMANO = punit.Length + TAMANO + Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) + TAMANO = ptot.Length + TAMANO +3 + ESPACIO = (ESPACIO - TAMANO)/2 + Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString(ptot & CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + + TAMANO = 0 + ESPACIO = 29 + BLANCO = " " + Printer1.Justify = 0 + totaltotal = totaltotal + (checaprecio.GETSTRING("CAT_GP_PRECIO") * s.GetString("HVD_CANT")) +' End If +' Else +' End If + End If + + Next + End If + +' Printer1.WriteString(" " & CRLF) +' s=Starter.skmt.ExecQuery($"select PE_PRONOMBRE, PE_CANT, length(PE_CANT) as L_CANT, PE_COSTO_TOT, length(PE_COSTO_TOT) as L_COSTOU,PE_PROID FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) order BY PE_PROID"$) + ' +' If S.RowCount>0 Then +' Printer1.WriteString("-----------VENTA------------" & CRLF) +' Printer1.WriteString("Cant. Precio Importe" & CRLF) +' Printer1.WriteString("------------------------------" & CRLF) +' +' For i=0 To S.RowCount -1 +' S.Position=i + ' +' Printer1.Justify = 0 +' Printer1.WriteString(s.GetString("PE_PRONOMBRE") & CRLF) +' Dim punit As String =NumberFormat2( (s.GETSTRING("PE_COSTO_TOT")/s.GetString("PE_CANT")),0,2,2,False) +' TAMANO = punit.Length + TAMANO +' Private ptot As String = NumberFormat2((punit*s.GetString("PE_CANT")),0,2,2,False) +' TAMANO = ptot.Length + TAMANO +' ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) +' For E=0 To ESPACIO -1 +' BLANCO = " " & BLANCO +' Next +' Printer1.Justify = 0 +' Printer1.WriteString( s.GetString("PE_CANT") & BLANCO) +' Printer1.Justify = 1 +' Printer1.WriteString( punit & BLANCO) +' Printer1.Justify = 2 +' Printer1.WriteString(ptot & CRLF ) +' TAMANO = 0 +' ESPACIO = 29 +' BLANCO = " " +' Printer1.Justify = 0 +' Next +' End If +Printer1.WriteString(" " & CRLF) + + + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_CODPROMO = 'MIRETO' GROUP by HVD_PROID"$) + If S.RowCount>0 Then + Printer1.WriteString("----------- MI RETO ------------" & CRLF) +' Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString("Cant. Precio Importe" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + For i=0 To S.RowCount -1 + S.Position=i + Log(s.GetString("HVD_RECHAZO")) + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then + If s.GetInt("HVD_RECHAZO") = 0 Then + Printer1.Justify = 0 + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + Dim punit As String = NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) + TAMANO = punit.Length + TAMANO +' Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + TAMANO = ptot.Length + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString( ptot & CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + totaltotal = totaltotal + ptot + Else If s.GetInt("HVD_RECHAZO") > 0 Then + Printer1.Justify = 0 + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + Private vc5 As Cursor = Starter.skmt.ExecQuery($"select iFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + vc5.Position = 0 + Dim punit As String = NumberFormat2((vc5.GetString("CAT_GP_PRECIO")),0,2,2,False) + TAMANO = punit.Length + TAMANO + vc5.Close + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + TAMANO = ptot.Length + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString(ptot& CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + Printer1.Justify = 0 + totaltotal = totaltotal + ptot + End If + End If + Next + End If + Printer1.Justify = 0 + s.Close + + Printer1.WriteString(" " & CRLF) + + + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_CODPROMO = 'BIGCOMMERCE' GROUP by HVD_PROID"$) +' s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_CODPROMO = 'SOCIOBAT' GROUP by HVD_PROID"$) + If S.RowCount>0 Then + Printer1.WriteString("---------- CONECTADOS ----------" & CRLF) +' Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString("Cant. Precio Importe" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + For i=0 To S.RowCount -1 + S.Position=i + Log(s.GetString("HVD_RECHAZO")) + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then + If s.GetInt("HVD_RECHAZO") = 0 Then + Printer1.Justify = 0 + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + Dim punit As String = NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) + TAMANO = punit.Length + TAMANO +' Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + TAMANO = ptot.Length + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString( ptot & CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + totaltotal = totaltotal + ptot + Else If s.GetInt("HVD_RECHAZO") > 0 Then + Printer1.Justify = 0 + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + Private vc5 As Cursor = Starter.skmt.ExecQuery($"select iFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + vc5.Position = 0 + Dim punit As String = NumberFormat2((vc5.GetString("CAT_GP_PRECIO")),0,2,2,False) + TAMANO = punit.Length + TAMANO + vc5.Close + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + TAMANO = ptot.Length + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString(ptot& CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + Printer1.Justify = 0 + totaltotal = totaltotal + ptot + End If + End If + Next + End If + Printer1.Justify = 0 + s.Close + +' s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_CODPROMO = 'CONECTADOS' GROUP by HVD_PROID"$) + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_CODPROMO = 'SOCIOBAT' GROUP by HVD_PROID"$) + If S.RowCount>0 Then + Printer1.WriteString("---------- SOCIO BAT ----------" & CRLF) +' Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString("Cant. Precio Importe" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + For i=0 To S.RowCount -1 + S.Position=i + Log(s.GetString("HVD_RECHAZO")) + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then + If s.GetInt("HVD_RECHAZO") = 0 Then + Printer1.Justify = 0 + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + Dim punit As String = NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) + TAMANO = punit.Length + TAMANO +' Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + TAMANO = ptot.Length + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString( ptot & CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + totaltotal = totaltotal + ptot + Else If s.GetInt("HVD_RECHAZO") > 0 Then + Printer1.Justify = 0 + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + Private vc5 As Cursor = Starter.skmt.ExecQuery($"select iFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + vc5.Position = 0 + Dim punit As String = NumberFormat2((vc5.GetString("CAT_GP_PRECIO")),0,2,2,False) + TAMANO = punit.Length + TAMANO + vc5.Close + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + TAMANO = ptot.Length + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString(ptot& CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + Printer1.Justify = 0 + totaltotal = totaltotal + ptot + End If + End If + Next + End If + Printer1.Justify = 0 + s.Close + + + Printer1.WriteString(" " & CRLF) + + + + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString("Subtotal: $" & NumberFormat2(totaltotal,0,2,2,False)& CRLF) + Printer1.WriteString("Total Articulos: " & (L_CANT.Text.Replace(",","") -restacobranza) & CRLF) + Printer1.WriteString("Descuento: %" & NumberFormat2((100-((l_total.Text.Replace(",","")*100)/totaltotal)),0,2,2,False)& CRLF) + Printer1.WriteString("Monto descuento: %" & NumberFormat2((totaltotal-l_total.Text.Replace(",","")),0,2,2,False)& CRLF) + + Printer1.WriteString("Total: $" & l_total.Text) + Printer1.WriteString(" " & CRLF) + + If almacen = "81" Then + Printer1.WriteString("Telefono de atencion:" & CRLF) + Printer1.WriteString("" & CRLF) + End If + + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString("----ESTE TICKET NO ES UN -----" & CRLF) + Printer1.WriteString("--COMPROBANTE FISCAL, SOLO ES-" & CRLF) + Printer1.WriteString("--------INFORMATIVO-----------" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + + + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Sleep(1000) + Printer1.DisConnect + ProgressDialogHide + If banderaimp = 1 Then + Msgbox2Async("Deseas imprimir de nuevo el ticket?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + B_IMP_Click + Else + If Tipoentrega = "CREDITO" Then + imprime_pagare + Else + Guardado + End If + End If +' printer.Flush + ' printer.Close + Else If banderaimp = 0 Then + Msgbox2Async("Deseas imprimir de nuevo el ticket?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + B_IMP_Click + End If + End If +' Guardado +End Sub + +Sub Printer1_Connected (Success As Boolean) +' If Logger Then Log("Printer1_Connected") + If Success Then + ToastMessageShow("Impresora conectada", False) + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("MACIMP")) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("MACIMP",Starter.mac_impresora)) +' If logger Then LogColor("Impresora conectada", Colors.Green) +' B_IMP2.Enabled = True + impresoraConectada = True + Else +' Msgbox(Printer1.ConnectedErrorMsg, "Error connecting.") 'ignore +' ToastMessageShow("Error conectando la impresora", False) + LogColor("Error conectando la impresora", Colors.Red) + errorImpresora = errorImpresora + 1 + If errorImpresora > 1 Then + Starter.MAC_IMPRESORA = "0" + errorImpresora = 0 + End If + End If +End Sub + +Sub Printer1_Error + Log("error printer") +End Sub + +Sub Printer_Connected (Success As Boolean) + If Success Then +' B_IMP.Enabled = True +' PASA_IMP = "1" + Else +' B_IMP.Enabled = False + If Msgbox2("", "Printer Error","Reprint","Cancel","",Null) = DialogResponse.POSITIVE Then 'ignore + StartPrinter + End If + End If +End Sub + +Sub StartPrinter + Dim PairedDevices As Map + Dim L1 As List + Dim resimp As Int + ToastMessageShow("Printing.....",True) + PairedDevices.Initialize + Try + PairedDevices = cmp20.GetPairedDevices + Catch + Msgbox("Getting Paired Devices","Printer Error") 'ignore + printer.Close + cmp20.Disconnect + End Try + + If PairedDevices.Size = 0 Then + Msgbox("Error Connecting to Printer - Printer Not Found","") 'ignore + Return + End If + + If PairedDevices.Size = 1 Then + Try + cmp20.Connect(PairedDevices.Get(PairedDevices.GetKeyAt(0))) + Catch + Msgbox("Connecting","Printer Error") 'ignore + printer.Close + cmp20.Disconnect + End Try + Else + L1.Initialize + For i = 0 To PairedDevices.Size - 1 + L1.Add(PairedDevices.GetKeyAt(i)) + Next + resimp = InputList(L1, "Choose device", -1) 'ignore + If resimp <> DialogResponse.CANCEL Then + cmp20.Connect(PairedDevices.Get(L1.Get(resimp))) + End If + End If +End Sub + + +Sub B_PASO2_Click + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=Starter.skmt.ExecQuery("select CUENTA from cuentaa") + c.Position = 0 + cuenta = c.GetString("CUENTA") + c=Starter.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c.Close + Starter.skmt.ExecNonQuery("DELETE FROM NOVENTA WHERE NV_CLIENTE IN (select cuenta from cuentaa)") + Starter.skmt.ExecNonQuery2("INSERT INTO NOVENTA (NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON) VALUES(?,?,?,?,?,?,?) ", Array As Object (cuenta,sDate & sTime, usuario, "PASO","PASO ESPERA", B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps)) +' Dim mandamapa As Cursor = Starter.skmt.ExecQuery("SELECT * FROM kmt_info WHERE gestion = 0") +' If mandamapa.RowCount > 0 Then +' StartActivity(MAPA_RUTAS) +' Else If mandamapa.RowCount = 0 Then + B4XPages.ShowPage("Principal") +' End If +End Sub + + +Sub mandaPendientesreparto +' c=Starter.skmt.ExecQuery("SELECT CLIENTE, USUARIO, FECHA_PUNTEO, LATITUD, LONGITUD, ALMACEN, RUTA_REPARTO, RUTA_PREV, FECHA_PREVENTA, MOTIVO, COMENTARIO,TIPO FROM REPARTO_GEO where ENVIO <> 1") +' Log($"REPARTO_Cliente PENDIENTE: ${c.RowCount}"$) +' If c.RowCount>0 Then +' For i=0 To c.RowCount -1 +' c.Position=i +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "insert_REPARTO_MARDS"'Ojala no Truene +' cmd.Parameters = Array As Object(c.GetString("CLIENTE"), c.GetString("USUARIO"), c.GetString("FECHA_PUNTEO"), c.GetString("LATITUD"), c.GetString("LONGITUD"), c.GetString("ALMACEN"), c.GetString("RUTA_REPARTO"), c.GetString("RUTA_PREV"), c.GetString("FECHA_PREVENTA"), c.GetString("MOTIVO"), c.GetString("COMENTARIO"),c.GetString("TIPO")) +' reqManager.ExecuteCommand(cmd , $"ins_REPARTOPendientes_head_${c.GetString("CLIENTE")}"$) +' +' Next +' End If +' c.Close +End Sub + +Sub JobDone(Job As HttpJob) + Log(Job.Success) + If Job.Success = False Then +' ToastMessageShow("Error: " & Job.ErrorMessage, True) + Else + LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211027 + If Job.JobName = "DBRequest" Then + Dim resultado As DBResult = reqManager.HandleJob(Job) + If resultado.Tag.As(String).IndexOf("ins_REPARTOPendientes_head_") > -1 Then + Private cliente As String= resultado.Tag + cliente = cliente.SubString(cliente.IndexOf("_")+24) + Log($"Cliente1:${cliente}"$) + Starter.skmt.ExecNonQuery2("update REPARTO_GEO SET ENVIO = ? WHERE CLIENTE = ? AND ENVIO <> ?",Array As String ("1", cliente,"1")) + For Each records() As Object In resultado.Rows + For Each k As String In resultado.Columns.Keys + Log(resultado.Tag & ": " & k & ": " & records(resultado.Columns.Get(k))) + Next + Next + End If + + If resultado.Tag = "codigoAutorizacionimp" Then + If resultado.Rows.Size > 0 Then + Log("Si hay codigo de autorizaion") + For Each records() As Object In resultado.Rows + For Each k As String In resultado.Columns.Keys + Log(k & ": " & records(resultado.Columns.Get(k))) + Next + Next + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "delete_codigoAutorizacion_IMP_REP" + cmd.Parameters = Array As Object(et_passFinDia.Text.Trim, Subs.traeRutaReparto, Subs.traeAlmacen) + reqManager.ExecuteCommand(cmd , "delete_codigoAutorizacion_IMP_REP") + p_transFinDia.Visible = False + et_passFinDia.Text = "" + teclado.HideKeyboard + imp + Else + ToastMessageShow("El codigo es incorrecto, por favor revise y vuelva a intentar!!", True) + End If + End If + + If resultado.Tag.As(String).IndexOf("insertaPagare_") > -1 Then + ProgressDialogHide + Private NOTA As String= resultado.Tag + NOTA = NOTA.SubString(NOTA.IndexOf("_")+1) + Log(NOTA) + p_transPagare2.Visible = True + CrearQR(NOTA) + + + + + End If + If resultado.Tag.As(String).IndexOf("pagareConfirmado_") > -1 Then + ProgressDialogHide + Subs.logJobDoneResultados(resultado) + Private NOTA As String= resultado.Tag + NOTA = NOTA.SubString(NOTA.IndexOf("_")+1) +' Log(NOTA) +' Log(resultado.Rows.Size) + If resultado.Rows.Size > 0 Then + p_transPagare2.Visible = False +' guardaVenta + esPagoACreditoGuardamosPagare +' Msgbox("¡Pagare confirmado!", "AVISO") 'ignore + Else + ToastMessageShow("El pagare NO ha sido confirmado por el cliente!", True) + End If + End If + + If resultado.Tag.As(String).IndexOf("mandaAbonosPendientes_") > -1 Then + Private NOTA As String= resultado.Tag + NOTA = NOTA.SubString(NOTA.IndexOf("_")+1) + Log("---> ABONO MANDADO: " & NOTA) + Starter.skmt.ExecNonQuery($"update ABONOS set a_enviado = 1 where a_cliente = '${NOTA}'"$) + End If + + End If + Job.Release + End If +End Sub + +Private Sub b_acred_Click + If et_montoacredito.Text > l_total.Text Then + MsgboxAsync("El monto del pagare no puede ser mayor a la venta","Atención") + Else + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + 'cliente + c=Starter.skmt.ExecQuery("select CUENTA from cuentaa") + c.Position = 0 + cuenta = c.GetString("CUENTA") + c.Close + 'usuario + c=Starter.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c.Close + 'Almacen + c=Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + c.Position = 0 + almacen = c.GetString("ID_ALMACEN") + c.Close + 'FECHA PREVENTA + c=Starter.skmt.ExecQuery("select HVD_FECHA from HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + c.Position = 0 + fechaprev = c.GetString("HVD_FECHA") + c.Close + 'RUTAPREVENTA + c=Starter.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + c.Position = 0 + rutaprev = c.GetString("CAT_CL_RUTA") + c.Close + 'RUTA rep + c=Starter.skmt.ExecQuery("select RUTAA from RUTAA") + c.Position = 0 + rutarep = c.GetString("RUTAA") + c.Close + Starter.skmt.ExecNonQuery2("INSERT INTO PAGARES (PA_ALMACEN, PA_RUTA_REP, PA_RUTAPREV, PA_FECHA_PREV, PA_CAPTURA, PA_MONTO, PA_USUARIO, PA_CLIENTE) VALUES(?,?,?,?,?,?,?,?) ", Array As Object (almacen,rutarep,rutaprev,fechaprev,(sDate),et_montoacredito.Text,usuario,cuenta)) + et_montoacredito.Text = "" + p_credito.Visible = False + Guardado + End If +End Sub + +Private Sub b_cancred_Click + et_montoacredito.Text = "" + p_credito.Visible = False +End Sub + +Private Sub p_credito_Click + +End Sub + +Private Sub cb_tipopago_SelectedIndexChanged (Index As Int) + itemselect = cb_tipopago.SelectedItem +End Sub + +Private Sub b_cxc_Click + tipo_abonox = "cxc" + Folio = "" + h = Starter.skmt.ExecQuery("SELECT CUENTA from CUENTAA") + h.Position = 0 + Log(h.GetString("CUENTA")) + + Dim Items As List + Items.Initialize + + Items.Add("SELECCIONA UNA OPCION") + Items.Add("TRANSFERENCIA") + Items.Add("EFECTIVO") + Items.Add("CHEQUE") + + cb_tipopago.SetItems(Items) + + itemselect= "SELECCIONA UNA OPCION" + + j = Starter.skmt.ExecQuery2("SELECT a_abono FROM ABONOS WHERE a_cliente = ?", Array As String(h.GetString("CUENTA"))) + j.position = 0 + Log(j.RowCount) + If j.RowCount = 0 Then + p_abono.Visible = True + et_abono.text = "" + Dim total As Double = 0 + f = Starter.skmt.ExecQuery("SELECT CUENTA FROM CUENTAA") + f.Position = 0 + d = Starter.skmt.ExecQuery2("SELECT NOTA, SALDO_PENDIENTE,FECHA_PREVENTA FROM ABONOSP WHERE CLIENTE = ? AND SALDO_PENDIENTE <> 0 ORDER BY FECHA_PREVENTA DESC", Array As String (f.GetString("CUENTA"))) + clv_abonos.Clear + For i = 0 To d.RowCount - 1 + d.Position = i + Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) AND a_ticket = ?", Array As String(d.GetString("NOTA"))) + Log(Folio) + y.position = 0 + + clv_abonos.Add(CreateListItem(d.GetString("NOTA"),"$ " &NumberFormat2(d.GetString("SALDO_PENDIENTE")-y.GetString("a_abono"),0,2,2,False),d.GetString("FECHA_PREVENTA")),i) + Log(d.GetString("NOTA")) + Log(d.GetString("SALDO_PENDIENTE")) + total = total + d.GetString("SALDO_PENDIENTE") + Log(total) + Next + d.Close + d = Starter.skmt.ExecQuery2("SELECT a_abono,a_fecha FROM ABONOS WHERE a_cliente = ? and a_tipoabono is null ORDER BY a_fecha DESC ", Array As String (f.GetString("CUENTA"))) + If d.RowCount > 0 Then + For i = 0 To d.RowCount - 1 + d.Position = i + clv_abonos.Add(CreateListItem("ABONO","$ " & d.GetString("a_abono"),d.GetString("a_fecha")),i) + total = total - d.GetString("a_abono") + Log(total) + Next + End If + l_montoabonostotal.Text = NumberFormat2(total,0,2,2,False) + d.Close + f.Close + Else If j.RowCount > 0 Then + p_abono.Visible = True + et_abono.text = "" + Dim total As Double = 0 + f = Starter.skmt.ExecQuery("SELECT CUENTA FROM CUENTAA") + f.Position = 0 + d = Starter.skmt.ExecQuery2("SELECT NOTA, SALDO_PENDIENTE,FECHA_PREVENTA FROM ABONOSP WHERE CLIENTE = ? AND SALDO_PENDIENTE <> 0 ORDER BY FECHA_PREVENTA DESC", Array As String (f.GetString("CUENTA"))) + clv_abonos.Clear + For i = 0 To d.RowCount - 1 + d.Position = i + Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) AND a_ticket = ?", Array As String(d.GetString("NOTA"))) + Log(Folio) + y.position = 0 + + clv_abonos.Add(CreateListItem(d.GetString("NOTA"),"$ " & NumberFormat2(d.GetString("SALDO_PENDIENTE")-y.GetString("a_abono"),0,2,2,False),d.GetString("FECHA_PREVENTA")),i) + Log(d.GetString("NOTA")) + Log(d.GetString("SALDO_PENDIENTE")) + total = total + d.GetString("SALDO_PENDIENTE") + Log(total) + Next + d.Close + d = Starter.skmt.ExecQuery2("SELECT a_abono,a_fecha FROM ABONOS WHERE a_cliente = ? and a_tipoabono is null ORDER BY a_fecha DESC", Array As String (f.GetString("CUENTA"))) + If d.RowCount > 0 Then + For i = 0 To d.RowCount - 1 + d.Position = i + clv_abonos.Add(CreateListItem("ABONO","$ " & d.GetString("a_abono"),d.GetString("a_fecha")),i) + total = total - d.GetString("a_abono") + Log(total) + Next + End If + l_montoabonostotal.Text = NumberFormat2(total,0,2,2,False) + d.Close + f.Close +' MsgboxAsync("Este cliente ya tiene un pago capturado","Atención") + End If + h.Close + j.Close +End Sub + +Private Sub p_abono_Click + +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, 10) +' p.LoadLayout("folioabono") +' p.Height= 32dip +' p.Width = 80dip +'' p.Width = clv_orden.GetBase.Width +' l_folio.Text = mostrar +' l_saldo.Text = mostrar1 +' l_fecha.Text = mostrar2 +'' cxc.Text = mostrar3 + '' Log(p.Width) +' Return p +'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, 10) +' p.LoadLayout("folioabono") +' p.Height= 32dip +' p.Width = 80dip +' +' l_folio.Text = mostrar +' l_saldo.Text = mostrar1 +' l_fecha.Text = mostrar2 +' +' CheckBox1.Checked = False +' p.Tag = mostrar +' Return p +'End Sub + + + +' Evento del checkbox +'Sub CheckBox1_CheckedChange(Checked As Boolean) +' Dim chk As CheckBox = Sender +' +' If Checked Then +' For i = 0 To clv_abonos.Size - 1 +' Dim p As Panel = clv_abonos.GetPanel(i) +' Log("Folio: " & p.Tag) +' +' ' OBTENER EL TEXTO DIRECTAMENTE DEL TAG +' +' ' Buscar y desmarcar otros checkboxes... +' For Each v As View In p.GetAllViewsRecursive +' If v Is CheckBox Then +' Dim otherChk As CheckBox = v +' If otherChk <> chk Then +' otherChk.Checked = False +' End If +' Exit +' End If +' Next +' Next +' End If +'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, 10) + p.LoadLayout("folioabono") + p.Height= 32dip + p.Width = 80dip + Folio = "" + l_folio.Text = mostrar + l_saldo.Text = mostrar1 + l_fecha.Text = mostrar2 + If mostrar = "ABONO" Then + CheckBox1.Visible = False + Else + CheckBox1.Visible = True + End If + ' Guardar referencia al label en el Tag del checkbox + CheckBox1.Tag = l_folio + + + Return p +End Sub + +Sub CheckBox1_CheckedChange(Checked As Boolean) + + + If ChangingCheckboxesProgrammatically Then Return + + Dim chk As CheckBox = Sender + If chk.Checked = False Then + + et_abono.Text = "" + End If + + If Checked Then + ' Obtener directamente el label desde el Tag del checkbox + Dim l_folio As Label = chk.Tag + + Log("Folio seleccionado: " & l_folio.Text) + Folio = l_folio.Text + ' Indicar que estamos cambiando checkboxes programáticamente + ChangingCheckboxesProgrammatically = True + + If tipo_abonox = "cxc" Then + Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) AND a_ticket = ?", Array As String(Folio)) + Log(Folio) + y.position = 0 + Dim u As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(SALDO_PENDIENTE),0) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND NOTA = ?", Array As String(Folio)) + u.Position = 0 + + et_abono.Text = u.GetDouble("SALDO_PENDIENTE") - y.GetDouble("a_abono") + Else If tipo_abonox = "abono" Then + Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) AND a_ticket = ?", Array As String(Folio)) + Log(Folio) + y.position = 0 + c = Starter.skmt.ExecQuery($"select iFNULL(sum(PA_MONTO),0) AS SALDO_PENDIENTE from PAGARES where PA_CLIENTE = '${la_cuenta.Text}'"$) + c.Position = 0 + + et_abono.Text = c.GetDouble("SALDO_PENDIENTE") - y.GetDouble("a_abono") + End If + + ' Desmarcar todos los demás checkboxes + For i = 0 To clv_abonos.Size - 1 + Dim p As Panel = clv_abonos.GetPanel(i) + Dim panelCheckbox As CheckBox = GetCheckboxFromPanel(p) + + If panelCheckbox <> Null And panelCheckbox <> chk Then + panelCheckbox.Checked = False + End If + Next + + ' Restaurar flag + ChangingCheckboxesProgrammatically = False + End If + +End Sub + +Sub GetCheckboxFromPanel(p As Panel) As CheckBox + For Each v As View In p.GetAllViewsRecursive + If v Is CheckBox Then + Return v + End If + Next + Return Null + End Sub + + + +Private Sub b_cancelar_Click + et_abono.Text = "" + p_abono.Visible = False + ime.HideKeyboard +End Sub + +Private Sub b_abono_Click +' p_abono.Visible = False + If et_abono.Text <> "" Then + textedit = et_abono.Text + Impimir = 1 + Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) AND a_ticket = ?", Array As String(Folio)) + Log(Folio) + y.position = 0 + Dim u As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(SALDO_PENDIENTE),0) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND NOTA = ?", Array As String(Folio)) + u.Position = 0 + + If y.GetDouble("a_abono") > 0 Then + If tipo_abonox = "cxc" Then + Log((u.GetDouble("SALDO_PENDIENTE") + y.GetDouble("a_abono"))) + If et_abono.text > (u.GetDouble("SALDO_PENDIENTE") - y.GetDouble("a_abono")) Then + Log("aqui") + MsgboxAsync("El monto a abonar no puede ser mayor que el monto del pagare seleccionado","Atención" ) + Else + If et_abono.Text <> "" And et_abono.Text > 0 Then + If itemselect <> "SELECCIONA UNA OPCION" Then + If Folio <> "" Then +' Msgbox2Async($"¿Seguro que quieres realizar un abono de $${et_abono.text} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True) + Msgbox2Async($"¿Seguro que quieres realizar un abono de ${et_abono.text} en ${itemselect} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + imprime_abonopagare + indicanum = 0 + End If + Else + MsgboxAsync("Por favor selecciona un pagare para aplicar el pago","Atención") + End If + Else + MsgboxAsync("Por favor selecciona un metodo de pago","Atención") + End If + End If + End If + + Else If tipo_abonox = "abono" Then + + If Folio <> "" Then + c = Starter.skmt.ExecQuery($"select iFNULL(sum(PA_MONTO),0) AS SALDO_PENDIENTE from PAGARES where PA_CLIENTE = '${la_cuenta.Text}'"$) + c.Position = 0 +' Log(c.GetString("SALDO_PENDIENTE") &" "& u.GetString("SALDO_PENDIENTE")) + If et_abono.text > (c.GetDouble("SALDO_PENDIENTE") - y.GetDouble("a_abono")) Then + Log("aqui") + MsgboxAsync("El monto a abonar no puede ser mayor que el monto del pagare seleccionado","Atención" ) + Else + If et_abono.Text <> "" And et_abono.Text > 0 Then + If itemselect <> "SELECCIONA UNA OPCION" Then + +' Msgbox2Async($"¿Seguro que quieres realizar un abono de $${et_abono.text} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True) + Msgbox2Async($"¿Seguro que quieres realizar un abono de ${et_abono.text} en ${itemselect} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + + imprime_abonopagare + End If + + Else + MsgboxAsync("Por favor selecciona un metodo de pago","Atención") + End If + End If + End If + Else + MsgboxAsync("Por favor selecciona un pagare para aplicar el pago","Atención") + End If + + End If + + + Else + + Log("entramos aqui") + If tipo_abonox = "cxc" Then + If Folio <> "" Then + If et_abono.text > u.GetDouble("SALDO_PENDIENTE") Then + Log("aqui") + MsgboxAsync("El monto a abonar no puede ser mayor que el monto del pagare seleccionado","Atención" ) + Else + If et_abono.Text <> "" And et_abono.Text > 0 Then + If itemselect <> "SELECCIONA UNA OPCION" Then + +' Msgbox2Async($"¿Seguro que quieres realizar un abono de $${et_abono.text} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True) + Msgbox2Async($"¿Seguro que quieres realizar un abono de ${et_abono.text} en ${itemselect} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + imprime_abonopagare + End If + + Else + MsgboxAsync("Por favor selecciona un metodo de pago","Atención") + End If + End If + End If + Else + MsgboxAsync("Por favor selecciona un pagare para aplicar el pago","Atención") + End If + Else If tipo_abonox = "abono" Then + + '''checar + + If Folio <> "" Then + c = Starter.skmt.ExecQuery($"select iFNULL(sum(PA_MONTO),0) AS SALDO_PENDIENTE from PAGARES where PA_CLIENTE = '${la_cuenta.Text}'"$) + c.Position = 0 +' Log(c.GetString("SALDO_PENDIENTE") &" "& u.GetString("SALDO_PENDIENTE")) + If et_abono.text > c.GetDouble("SALDO_PENDIENTE") Then + Log("aqui") + MsgboxAsync("El monto a abonar no puede ser mayor que el monto del pagare seleccionado","Atención" ) + Else + If et_abono.Text <> "" And et_abono.Text > 0 Then + If itemselect <> "SELECCIONA UNA OPCION" Then + + Msgbox2Async($"¿Seguro que quieres realizar un abono de ${et_abono.text} en ${itemselect} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + imprime_abonopagare + End If + + Else + MsgboxAsync("Por favor selecciona un metodo de pago","Atención") + End If + End If + End If + Else + MsgboxAsync("Por favor selecciona un pagare para aplicar el pago","Atención") + End If + End If + + End If + + +' End If + End If + ime.HideKeyboard +End Sub + +Sub Guardaabono(numpago As Int) + Dim notaabono As String + Dim saldopendiente As Double + Dim saldopendiente2 As Double + If tipo_abonox = "abono" Then + Log("AQUI ABONO") + + c = Starter.skmt.ExecQuery($"select distinct hvd_num_ticket from hist_ventas where hvd_cliente = '${la_cuenta.Text}' and HVD_PRONOMBRE <> 'Cobranza Pendiente' "$) + If c.RowCount > 0 Then + c.Position = 0 + notaabono = c.GetString("HVD_NUM_TICKET") + End If + c.Close + + c = Starter.skmt.ExecQuery($"select iFNULL(sum(PA_MONTO),0) AS SALDO_PENDIENTE from PAGARES where PA_CLIENTE = '${la_cuenta.Text}'"$) + If c.RowCount > 0 Then + c.Position = 0 + saldopendiente = c.GetDouble("SALDO_PENDIENTE") + Log(c.GetString("SALDO_PENDIENTE")) + End If + c.Close + + + Dim saldopendiente1 As Double = 0 + Dim c4 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(SUM(a_abono),0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is not null") + If c4.RowCount > 0 Then + c4.Position = 0 + Dim c5 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(a_abono,0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is not null") + saldopendiente1 = c4.GetDouble("SALDO_PENDIENTE") + + + End If + c4.Close + + Else If tipo_abonox = "cxc" Then + c = Starter.skmt.ExecQuery("SELECT NOTA, SUM(SALDO_PENDIENTE) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + If c.RowCount > 0 Then + c.Position = 0 + notaabono = c.GetString("NOTA") + saldopendiente = c.GetDouble("SALDO_PENDIENTE") + End If + c.Close + + Dim saldopendiente1 As Double = 0 + Dim c4 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(SUM(a_abono),0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null") + If c4.RowCount > 0 Then + c4.Position = 0 + Dim c5 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(a_abono,0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null") + saldopendiente1 = c4.GetDouble("SALDO_PENDIENTE") + End If + c4.Close + + + c = Starter.skmt.ExecQuery2("SELECT SUM(SALDO_PENDIENTE) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND NOTA = ?",Array As String(Folio)) + If c.RowCount > 0 Then + c.Position = 0 + saldopendiente2 = c.GetDouble("SALDO_PENDIENTE") + End If + c.Close + + Dim saldopendiente3 As Double = 0 + Dim c4 As Cursor= Starter.skmt.ExecQuery2("SELECT Ifnull(SUM(a_abono),0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null AND a_ticket = ?",Array As String(Folio)) + If c4.RowCount > 0 Then + c4.Position = 0 +' Dim c5 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(a_abono,0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null") + saldopendiente3 = c4.GetDouble("SALDO_PENDIENTE") + End If + c4.Close + + End If + +' bc.Initialize + +' c = Starter.skmt.ExecQuery("SELECT NOTA FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA)") +' If c.RowCount > 0 Then +' c.Position = 0 +' notaabono = c.GetString("NOTA") +' End If + DateTime.DateFormat = "ddMMyyyy" + sDate=DateTime.Date(DateTime.Now) + + + + ''aquitrabajar + + If Subs.traeAlmacen = "92" Then + + ''mayoreo + If tipo_abonox = "abono" Then + Dim checaabono As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM ABONOS WHERE a_usuario = '${Subs.traeUsuarioDeBD}' AND a_ruta = '${Subs.traeRuta(Subs.traeCliente)}' AND a_cliente = '${Subs.traeCliente}' AND a_abono = '${et_abono.text}' AND a_tipoabono = '1' AND TIPO_PAGO = '${itemselect}' AND a_ticket = '${Folio}' and a_numpago = '${numpago}' "$$) + If checaabono.RowCount = 0 Then + Starter.skmt.ExecNonQuery($"INSERT INTO ABONOS(a_usuario, a_ruta, a_cliente, a_abono, a_fecha,a_tipoabono,TIPO_PAGO,a_ticket,a_numpago) VALUES ('${Subs.traeUsuarioDeBD}', '${Subs.traeRuta(Subs.traeCliente)}', '${Subs.traeCliente}' ,'${et_abono.text}', '${Subs.fechaKMT(DateTime.now)}', 1,'${itemselect}','${Folio}','${numpago}')"$) + ToastMessageShow("Abono guardado", False) + End If + + +' Starter.skmt.ExecNonQuery($"INSERT INTO ABONOS(a_usuario, a_ruta, a_cliente, a_abono, a_fecha,a_tipoabono,TIPO_PAGO,a_ticket,a_numpago) VALUES ('${Subs.traeUsuarioDeBD}', '${Subs.traeRuta(Subs.traeCliente)}', '${Subs.traeCliente}' ,'${et_abono.text}', '${Subs.fechaKMT(DateTime.now)}', 1,'${itemselect}','${Folio}','${numpago}')"$) +' ToastMessageShow("Abono guardado", False) + + Else If tipo_abonox = "cxc" Then + + Dim checaabono As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM ABONOS WHERE a_usuario = '${Subs.traeUsuarioDeBD}' AND a_ruta = '${Subs.traeRuta(Subs.traeCliente)}' AND a_cliente = '${Subs.traeCliente}' AND a_abono = '${et_abono.text}' AND a_tipoabono IS NULL AND TIPO_PAGO = '${itemselect}' AND a_ticket = '${Folio}' and a_numpago = '${numpago}' "$$) + If checaabono.RowCount = 0 Then + Starter.skmt.ExecNonQuery($"INSERT INTO ABONOS(a_usuario, a_ruta, a_cliente, a_abono, a_fecha,TIPO_PAGO,a_ticket,a_numpago) VALUES ('${Subs.traeUsuarioDeBD}', '${Subs.traeRuta(Subs.traeCliente)}', '${Subs.traeCliente}' ,'${et_abono.text}', '${Subs.fechaKMT(DateTime.now)}','${itemselect}','${Folio}','${numpago}')"$) + ToastMessageShow("Abono guardado", False) + End If + End If + + ''mayoreo + + Else + If tipo_abonox = "abono" Then + + Dim checaabono As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM ABONOS WHERE a_usuario = '${Subs.traeUsuarioDeBD}' AND a_ruta = '${Subs.traeRuta(Subs.traeCliente)}' AND a_cliente = '${Subs.traeCliente}' AND a_abono = '${et_abono.text}' AND a_tipoabono = '1' AND TIPO_PAGO = '${itemselect}' AND a_ticket = '${Folio}' and a_numpago = '${numpago}' "$$) + If checaabono.RowCount = 0 Then + Starter.skmt.ExecNonQuery($"INSERT INTO ABONOS(a_usuario, a_ruta, a_cliente, a_abono, a_fecha,a_tipoabono,TIPO_PAGO,a_ticket,a_numpago) VALUES ('${Subs.traeUsuarioDeBD}', '${Subs.traeRuta(Subs.traeCliente)}', '${Subs.traeCliente}' ,'${et_abono.text}', '${Subs.fechaKMT(DateTime.now)}', 1,'${itemselect}','${Folio}','${numpago}')"$) + ToastMessageShow("Abono guardado", False) + End If + + + Else If tipo_abonox = "cxc" Then + + Dim checaabono As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM ABONOS WHERE a_usuario = '${Subs.traeUsuarioDeBD}' AND a_ruta = '${Subs.traeRuta(Subs.traeCliente)}' AND a_cliente = '${Subs.traeCliente}' AND a_abono = '${et_abono.text}' AND a_tipoabono IS NULL AND TIPO_PAGO = '${itemselect}' AND a_ticket = '${Folio}' and a_numpago = '${numpago}' "$$) + If checaabono.RowCount = 0 Then + Starter.skmt.ExecNonQuery($"INSERT INTO ABONOS(a_usuario, a_ruta, a_cliente, a_abono, a_fecha,TIPO_PAGO,a_ticket,a_numpago) VALUES ('${Subs.traeUsuarioDeBD}', '${Subs.traeRuta(Subs.traeCliente)}', '${Subs.traeCliente}' ,'${et_abono.text}', '${Subs.fechaKMT(DateTime.now)}','${itemselect}','${Folio}','${numpago}')"$) + ToastMessageShow("Abono guardado", False) + End If + +' Dim checaabono As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM ABONOS WHERE a_usuario = '${Subs.traeUsuarioDeBD}' AND a_ruta = '${Subs.traeRuta(Subs.traeCliente)}' AND a_cliente = '${Subs.traeCliente}' AND a_abono = '${et_abono.text}' AND a_tipoabono IS NULL AND TIPO_PAGO = '${itemselect}' AND a_ticket = '${Folio}' "$$) +' If checaabono.RowCount = 0 Then +' Starter.skmt.ExecNonQuery($"INSERT INTO ABONOS(a_usuario, a_ruta, a_cliente, a_abono, a_fecha,TIPO_PAGO,a_ticket,a_numpago) VALUES ('${Subs.traeUsuarioDeBD}', '${Subs.traeRuta(Subs.traeCliente)}', '${Subs.traeCliente}' ,'${et_abono.text}', '${Subs.fechaKMT(DateTime.now)}','${itemselect}','${Folio}','${numpago}')"$) +' End If +' ToastMessageShow("Abono guardado", False) + + End If + End If + mandaAbonosPendientes + mandaAbonosPANUEPendientes +End Sub + + +Sub imprime_abonopagare2 + c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") +' DateTime.DateFormat = "MM/dd/yyyy" + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c.Close +' ProgressDialogShow("Imprimiendo, un momento ...") +' Printer1.DisConnect +' If Not(Printer1.IsConnected) Then +' Log("Conectando a impresora ...") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) +' Sleep(1000) +' Log("++++++ " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect 'Tratamos de reconectar +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' Else +' Log("conectando 2") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) +' Sleep(1000) +' Log("****** " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' End If + + ProgressDialogShow2("Imprimiendo, un momento ...",False) + Printer1.DisConnect + If Not(Printer1.IsConnected) Then +' If logger Then Log("conectando 1") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) + Sleep(1000) + cont = cont + 1 + If cont = 7 Then Printer1.Connect 'Tratamos de reconectar + If cont > 15 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + Else +' If logger Then Log("conectando 2") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) + Sleep(1000) + cont = cont + 1 + If cont = 2 Then Printer1.Connect + If cont > 4 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + End If + TAMANO = 0 + ESPACIO = 22 + BLANCO = " " + + + Dim bmp As Bitmap + bmp.InitializeResize(File.DirAssets, "logo-guna-18.jpg", 192, 192, True) 'ignore + Dim myimage As AnImage = Printer1.ImageToBWIMage(bmp) + myimage = Printer1.DitherImage2D(myimage, 128) + myimage= Printer1.PackImage(myimage) + Printer1.WriteString(CRLF) ' nudge the printer to show the user something is happening + Printer1.WriteString(Printer1.REVERSE) + Printer1.PrintImage(myimage) + Printer1.WriteString(Printer1.UNREVERSE) + Dim telefono As String = "" + Dim c7 As Cursor = Starter.skmt.ExecQuery("select IFNULL(CAT_CL_TELEFONO,' ') AS CAT_CL_TELEFONO FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If c7.RowCount > 0 Then + c7.Position = 0 + telefono = c7.GetString("CAT_CL_TELEFONO") + End If + c7.Close + + + + Printer1.WriteString("DISTRIBUIDORA ROCHA TULA PACHUCA" & CRLF) +' Printer1.WriteString(sucursal & CRLF) + Printer1.WriteString(sDate & CRLF) + Printer1.WriteString(sTime & CRLF) + Printer1.WriteString("Reparto:" & usuario & CRLF) + Printer1.WriteString("Ruta:" & Subs.traeRutaReparto & CRLF) + Printer1.WriteString("Ruta preventa:" & Subs.traerUTAPREV & CRLF) + Printer1.WriteString("Tienda: " & La_nombre.Text & CRLF) + Printer1.WriteString("ID.Cliente: " & la_cuenta.Text & CRLF) + Printer1.WriteString("Calle: " & la_Calle.Text & CRLF) + Printer1.WriteString("Colonia: " & la_col.Text & CRLF) + Printer1.WriteString("Telefono: " & telefono & CRLF) + Printer1.WriteString(" " & CRLF) + Dim notaabono As String + Dim saldopendiente As Double + Dim saldopendiente2 As Double + + If tipo_abonox = "abono" Then + + + c = Starter.skmt.ExecQuery($"select distinct hvd_num_ticket from hist_ventas where hvd_cliente = '${la_cuenta.Text}' and HVD_PRONOMBRE <> 'Cobranza Pendiente' "$) + If c.RowCount > 0 Then + c.Position = 0 + notaabono = c.GetString("HVD_NUM_TICKET") + End If + c.Close + + c = Starter.skmt.ExecQuery($"select iFNULL(sum(PA_MONTO),0) AS SALDO_PENDIENTE from PAGARES where PA_CLIENTE = '${la_cuenta.Text}'"$) + If c.RowCount > 0 Then + c.Position = 0 + saldopendiente = c.GetDouble("SALDO_PENDIENTE") + Log(c.GetString("SALDO_PENDIENTE")) + End If + c.Close + + + Dim saldopendiente1 As Double = 0 + Dim c4 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(SUM(a_abono),0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is not null") + If c4.RowCount > 0 Then + c4.Position = 0 + Dim c5 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(a_abono,0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is not null") + saldopendiente1 = c4.GetDouble("SALDO_PENDIENTE") + + + End If + c4.Close + + Else If tipo_abonox = "cxc" Then + c = Starter.skmt.ExecQuery("SELECT NOTA, SUM(SALDO_PENDIENTE) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + If c.RowCount > 0 Then + c.Position = 0 + notaabono = c.GetString("NOTA") + saldopendiente = c.GetDouble("SALDO_PENDIENTE") + End If + c.Close + + Dim saldopendiente1 As Double = 0 + Dim c4 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(SUM(a_abono),0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null") + If c4.RowCount > 0 Then + c4.Position = 0 + Dim c5 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(a_abono,0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null") + saldopendiente1 = c4.GetDouble("SALDO_PENDIENTE") + End If + c4.Close + + + c = Starter.skmt.ExecQuery2("SELECT SUM(SALDO_PENDIENTE) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND NOTA = ?",Array As String(Folio)) + If c.RowCount > 0 Then + c.Position = 0 + saldopendiente2 = c.GetDouble("SALDO_PENDIENTE") + End If + c.Close + + Dim saldopendiente3 As Double = 0 + Dim c4 As Cursor= Starter.skmt.ExecQuery2("SELECT Ifnull(SUM(a_abono),0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null AND a_ticket = ?",Array As String(Folio)) + If c4.RowCount > 0 Then + c4.Position = 0 +' Dim c5 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(a_abono,0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null") + saldopendiente3 = c4.GetDouble("SALDO_PENDIENTE") + End If + c4.Close + + End If + Dim numpago As Int = 1 + + + + + + Dim tipopagotick As String = "" + If metopago.ToUpperCase = "TRANSFERENCIA" Then + tipopagotick = "T" + Else If metopago.ToUpperCase = "EFECTIVO" Then + tipopagotick = "E" + Else If metopago.ToUpperCase = "CHEQUE" Then + tipopagotick = "C" + End If + + '' codigo de barras +' ImageView1.Bitmap = barcode.CODE128(notaabono&sDate&tipopagotick&numpago) + '' codigo de qr + B4XImageView1.SetBitmap(qr.Create(notaabono&sDate&tipopagotick&numpago)) + + + Dim Dirp As String = File.DirInternal + Dim Dir As String + Dim Dir2 As String + Try + File.MakeDir(Dirp,"/md") + Dir = "/md" + 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 + + '' codigo de barras +' Dim Out As OutputStream +' Out = File.OpenOutput(File.DirInternal & Dir & Dir2, "Test.png", False) +' barcode.CODE128(notaabono&sDate&tipopagotick&numpago).WriteToStream(Out, 100, "PNG") +' Out.Close + + '' codigo de qr + Dim Out As OutputStream + Out = File.OpenOutput(File.DirInternal & Dir & Dir2, "qr.png", False) + qr.Create(notaabono&sDate&tipopagotick&numpago).WriteToStream(Out, 100, "PNG") + Out.Close + + + +' c = Starter.skmt.ExecQuery("SELECT NOTA FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA)") +' If c.RowCount > 0 Then +' c.Position = 0 +' notaabono = c.GetString("NOTA") +' End If + + Log(notaabono) + Log(et_abono.Text) + Printer1.WriteString("Comprobante de pago del pagare" & CRLF) + Printer1.WriteString("Folio: " & NOTA &"-"&(numpago)& CRLF) + Printer1.WriteString("Monto deuda: " & (NumberFormat2(l_total.Text.Replace(",",""),0,2,2,False)) & CRLF) + Printer1.WriteString("Monto abono: " & (NumberFormat2((l_total.Text.Replace(",","")-l_montopag.Text),0,2,2,False)) & CRLF) + Printer1.WriteString("Tipo de pago: " & metopago & CRLF) + Printer1.WriteString("Restante "&NOTA&": " &(NumberFormat(l_montopag.Text,0,2)) & CRLF) + Printer1.WriteString("Fecha Abono: " & sDate & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString("-------------FIRMA------------" & CRLF) + + DateTime.DateFormat = "ddMMyyyy" + sDate=DateTime.Date(DateTime.Now) + itemselect = "EFECTIVO" + +' Items.Add("TRANSFERENCIA") +' Items.Add("EFECTIVO") +' Items.Add("CHEQUE") + + + + + +' Dim bmp As Bitmap + '' bmp.InitializeResize(File.DirAssets, "logo-guna-18.jpg", 192, 192, True) 'ignore + + Dim bmp2 As Bitmap + bmp2.InitializeResize(File.DirInternal & Dir & Dir2, "qr.png", 192, 192, True) 'ignore +' bmp.Initialize(File.DirInternal & Dir & Dir2, "qr.png") 'ignore + Dim myimage2 As AnImage = Printer1.ImageToBWIMage(bmp2) + myimage2 = Printer1.DitherImage2D(myimage2, 128) + myimage2= Printer1.PackImage(myimage2) + Printer1.WriteString(CRLF) ' nudge the printer to show the user something is happening + Printer1.WriteString(Printer1.REVERSE) + Printer1.PrintImage(myimage2) + Printer1.WriteString(Printer1.UNREVERSE) + + +' Printer1.WriteBarCode("I",NOTA&sDate&tipopagotick&numpago) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Sleep(1000) + Printer1.DisConnect + ProgressDialogHide + + +' Msgbox2Async("Deseas imprimir de nuevo el ticket?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) +' +' Wait For Msgbox_Result (resultado As Int) +' If resultado = DialogResponse.POSITIVE Then +' imprime_abonopagare +' Else +' p_abono.Visible = False +' Starter.skmt.ExecNonQuery($"INSERT INTO ABONOS(a_usuario, a_ruta, a_cliente, a_abono, a_fecha,a_tipoabono,TIPO_PAGO,a_ticket,a_numpago) VALUES ('${Subs.traeUsuarioDeBD}', '${Subs.traeRuta(Subs.traeCliente)}', '${Subs.traeCliente}' ,'${NumberFormat2((l_total.Text.Replace(",","")-limite_credito),0,2,2,False) }', '${Subs.fechaKMT(DateTime.now)}', 1,'${itemselect}','${Folio}','${numpago}')"$) +' ToastMessageShow("Abono guardado", False) +' End If + + If banderaimp = 1 Then + Msgbox2Async("Deseas imprimir de nuevo el abono?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + imprime_abonopagare2 + Else + Guardado + End If +' printer.Flush + ' printer.Close + Else If banderaimp = 0 Then + Msgbox2Async("Deseas imprimir de nuevo el PAGARE?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + imprime_abonopagare2 + End If + End If + + mandaAbonosPANUEPendientes + +End Sub + +'Sub hazpago +' h = Starter.skmt.ExecQuery("SELECT CUENTA from CUENTAA") +' h.Position = 0 +' Log(h.GetString("CUENTA")) +' j = Starter.skmt.ExecQuery2("SELECT a_abono FROM ABONOS WHERE a_cliente = ?", Array As String(h.GetString("CUENTA"))) +' j.position = 0 +' If j.RowCount = 0 Then +' p_abono.Visible = False +' Starter.skmt.ExecNonQuery($"INSERT INTO ABONOS(a_usuario, a_ruta, a_cliente, a_abono, a_fecha) VALUES ('${Subs.traeUsuarioDeBD}', '${Subs.traeRuta(Subs.traeCliente)}', '${Subs.traeCliente}' ,'${et_abono.text}', '${Subs.fechaKMT(DateTime.now)}')"$) +' ToastMessageShow("Abono guardado", False) +' et_abono.Text = "" +' Else +' p_abono.Visible = False +'' skmt.ExecNonQuery($"INSERT INTO ABONOS(a_usuario, a_ruta, a_cliente, a_abono, a_fecha) VALUES ('${Subs.traeUsuarioDeBD}', '${Subs.traeRuta(Subs.traeCliente)}', '${Subs.traeCliente}' ,'${et_abono.text}', '${Subs.fechaKMT(DateTime.now)}')"$) +' Starter.skmt.ExecNonQuery($"UPDATE ABONOS set a_abono = '${et_abono.text}' where a_usuario = '${Subs.traeUsuarioDeBD}' and a_ruta = '${Subs.traeRuta(Subs.traeCliente)}' and a_cliente In (select cuenta from cuentaa)"$) +' ToastMessageShow("Abono guardado", False) +' et_abono.Text = "" +' End If +'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 + +Sub imprime_abonopagare + c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") +' DateTime.DateFormat = "MM/dd/yyyy" + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c.Close +' ProgressDialogShow("Imprimiendo, un momento ...") +' Printer1.DisConnect +' If Not(Printer1.IsConnected) Then +' Log("Conectando a impresora ...") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) +' Sleep(1000) +' Log("++++++ " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect 'Tratamos de reconectar +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' Else +' Log("conectando 2") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) +' Sleep(1000) +' Log("****** " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' End If + + ProgressDialogShow2("Imprimiendo, un momento ...",False) + Printer1.DisConnect + If Not(Printer1.IsConnected) Then +' If logger Then Log("conectando 1") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) + Sleep(1000) + cont = cont + 1 + If cont = 7 Then Printer1.Connect 'Tratamos de reconectar + If cont > 15 Then impresoraConectada = True + Loop + Sleep(500) + Log("asasdas") + impresoraConectada = False + Else +' If logger Then Log("conectando 2") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) + Sleep(1000) + Log("asasdas") + cont = cont + 1 + If cont = 7 Then Printer1.Connect + If cont > 15 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + End If + TAMANO = 0 + ESPACIO = 22 + BLANCO = " " + Printer1.Justify = 0 + Dim bmp As Bitmap + bmp.InitializeResize(File.DirAssets, "logo-guna-18.jpg", 192, 192, True) 'ignore + Dim myimage As AnImage = Printer1.ImageToBWIMage(bmp) + myimage = Printer1.DitherImage2D(myimage, 128) + myimage= Printer1.PackImage(myimage) + Printer1.WriteString(CRLF) ' nudge the printer to show the user something is happening + Printer1.WriteString(Printer1.REVERSE) + Printer1.PrintImage(myimage) + Printer1.WriteString(Printer1.UNREVERSE) + Dim telefono As String = "" + Dim c7 As Cursor = Starter.skmt.ExecQuery("select IFNULL(CAT_CL_TELEFONO,' ') AS CAT_CL_TELEFONO FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If c7.RowCount > 0 Then + c7.Position = 0 + telefono = c7.GetString("CAT_CL_TELEFONO") + End If + c7.Close + + + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("DISTRIBUIDORA ROCHA TULA PACHUCA" & CRLF) +' Printer1.WriteString(sucursal & CRLF) + Printer1.WriteString(sDate & CRLF) + Printer1.WriteString(sTime & CRLF) + Printer1.WriteString("Reparto:" & usuario & CRLF) + Printer1.WriteString("Ruta:" & Subs.traeRutaReparto & CRLF) + Printer1.WriteString("Ruta preventa:" & Subs.traerUTAPREV & CRLF) + Printer1.WriteString("Tienda: " & La_nombre.Text & CRLF) + Printer1.WriteString("ID.Cliente: " & la_cuenta.Text & CRLF) + Printer1.WriteString("Calle: " & la_Calle.Text & CRLF) + Printer1.WriteString("Colonia: " & la_col.Text & CRLF) + Printer1.WriteString("Telefono: " & telefono & CRLF) + Printer1.WriteString(" " & CRLF) + Dim notaabono As String + Dim saldopendiente As Double + Dim saldopendiente2 As Double +' Items.Add("TRANSFERENCIA") +' Items.Add("EFECTIVO") +' Items.Add("CHEQUE") + Dim tipopagotick As String = "" + If itemselect = "TRANSFERENCIA" Then + tipopagotick = "T" + Else If itemselect = "EFECTIVO" Then + tipopagotick = "E" + Else If itemselect = "CHEQUE" Then + tipopagotick = "C" + End If + + LogColor("reimpresion es igual a " & reimpresion,Colors.Red) + If reimpresion = 0 Then + + If tipo_abonox = "abono" Then + Log("AQUI ABONO") + + c = Starter.skmt.ExecQuery($"select distinct hvd_num_ticket from hist_ventas where hvd_cliente = '${la_cuenta.Text}' and HVD_PRONOMBRE <> 'Cobranza Pendiente' "$) + If c.RowCount > 0 Then + c.Position = 0 + notaabono = c.GetString("HVD_NUM_TICKET") + f1 = notaabono + End If + c.Close + + c = Starter.skmt.ExecQuery($"select iFNULL(sum(PA_MONTO),0) AS SALDO_PENDIENTE from PAGARES where PA_CLIENTE = '${la_cuenta.Text}'"$) + If c.RowCount > 0 Then + c.Position = 0 + saldopendiente = c.GetDouble("SALDO_PENDIENTE") + Log(c.GetString("SALDO_PENDIENTE")) + f2 = saldopendiente + End If + c.Close + + + Dim saldopendiente1 As Double = 0 + Dim c4 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(SUM(a_abono),0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is not null") + If c4.RowCount > 0 Then + c4.Position = 0 + Dim c5 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(a_abono,0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is not null") + saldopendiente1 = c4.GetDouble("SALDO_PENDIENTE") + + f3 = saldopendiente1 + End If + c4.Close + + Else If tipo_abonox = "cxc" Then + c = Starter.skmt.ExecQuery("SELECT NOTA, SUM(SALDO_PENDIENTE) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + If c.RowCount > 0 Then + c.Position = 0 + notaabono = c.GetString("NOTA") + saldopendiente = c.GetDouble("SALDO_PENDIENTE") + f1 = notaabono + f2 = saldopendiente + End If + c.Close + + Dim saldopendiente1 As Double = 0 + Dim c4 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(SUM(a_abono),0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null") + If c4.RowCount > 0 Then + c4.Position = 0 + Dim c5 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(a_abono,0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null") + saldopendiente1 = c4.GetDouble("SALDO_PENDIENTE") + f3 = saldopendiente1 + End If + c4.Close + + + c = Starter.skmt.ExecQuery2("SELECT SUM(SALDO_PENDIENTE) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND NOTA = ?",Array As String(Folio)) + If c.RowCount > 0 Then + c.Position = 0 + saldopendiente2 = c.GetDouble("SALDO_PENDIENTE") + f4 = saldopendiente2 + End If + c.Close + + Dim saldopendiente3 As Double = 0 + Dim c4 As Cursor= Starter.skmt.ExecQuery2("SELECT Ifnull(SUM(a_abono),0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null AND a_ticket = ?",Array As String(Folio)) + If c4.RowCount > 0 Then + c4.Position = 0 +' Dim c5 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(a_abono,0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null") + saldopendiente3 = c4.GetDouble("SALDO_PENDIENTE") + f5 = saldopendiente3 + End If + c4.Close + + End If + Else + + If tipo_abonox = "abono" Then + Log("AQUI ABONO") + + c = Starter.skmt.ExecQuery($"select distinct hvd_num_ticket from hist_ventas where hvd_cliente = '${la_cuenta.Text}' and HVD_PRONOMBRE <> 'Cobranza Pendiente' "$) + If c.RowCount > 0 Then + c.Position = 0 + notaabono = c.GetString("HVD_NUM_TICKET") +' f1 = notaabono + End If + c.Close + + c = Starter.skmt.ExecQuery($"select iFNULL(sum(PA_MONTO),0) AS SALDO_PENDIENTE from PAGARES where PA_CLIENTE = '${la_cuenta.Text}'"$) + If c.RowCount > 0 Then + c.Position = 0 + saldopendiente = c.GetDouble("SALDO_PENDIENTE") + Log(c.GetString("SALDO_PENDIENTE")) +' f2 = saldopendiente + End If + c.Close + + + Dim saldopendiente1 As Double = 0 + Dim c4 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(SUM(a_abono),0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is not null") + If c4.RowCount > 0 Then + c4.Position = 0 + Dim c5 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(a_abono,0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is not null") + saldopendiente1 = c4.GetDouble("SALDO_PENDIENTE") + +' f3 = saldopendiente1 + End If + c4.Close + + Else If tipo_abonox = "cxc" Then + c = Starter.skmt.ExecQuery("SELECT NOTA, SUM(SALDO_PENDIENTE) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + If c.RowCount > 0 Then + c.Position = 0 + notaabono = c.GetString("NOTA") + saldopendiente = c.GetDouble("SALDO_PENDIENTE") +' f1 = notaabono +' f2 = saldopendiente + End If + c.Close + + Dim saldopendiente1 As Double = 0 + Dim c4 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(SUM(a_abono),0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null") + If c4.RowCount > 0 Then + c4.Position = 0 + Dim c5 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(a_abono,0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null") + saldopendiente1 = c4.GetDouble("SALDO_PENDIENTE") +' f3 = saldopendiente1 + End If + c4.Close + + + c = Starter.skmt.ExecQuery2("SELECT SUM(SALDO_PENDIENTE) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND NOTA = ?",Array As String(Folio)) + If c.RowCount > 0 Then + c.Position = 0 + saldopendiente2 = c.GetDouble("SALDO_PENDIENTE") +' f4 = saldopendiente2 + End If + c.Close + + Dim saldopendiente3 As Double = 0 + Dim c4 As Cursor= Starter.skmt.ExecQuery2("SELECT Ifnull(SUM(a_abono),0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null AND a_ticket = ?",Array As String(Folio)) + If c4.RowCount > 0 Then + c4.Position = 0 +' Dim c5 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(a_abono,0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null") + saldopendiente3 = c4.GetDouble("SALDO_PENDIENTE") +' f5 = saldopendiente3 + End If + c4.Close + + End If + + + End If + +' bc.Initialize + DateTime.DateFormat = "ddMMyyyy" + sDate=DateTime.Date(DateTime.Now) + Dim numpago As Int = c5.RowCount + 1 + If indicanum = 0 Then + numeropago = numpago + Else If indicanum = 1 Then + numeropago = numeropago + End If + +' c = Starter.skmt.ExecQuery("SELECT NOTA FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA)") +' If c.RowCount > 0 Then +' c.Position = 0 +' notaabono = c.GetString("NOTA") +' End If + Guardaabono(numeropago) + '' codigo de barras +' ImageView1.Bitmap = barcode.CODE128(notaabono&sDate&tipopagotick&numpago) + '' codigo de qr + B4XImageView1.SetBitmap(qr.Create(f1&sDate&tipopagotick&numeropago)) + + + Dim Dirp As String = File.DirInternal + Dim Dir As String + Dim Dir2 As String + Try + File.MakeDir(Dirp,"/md") + Dir = "/md" + 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 + + '' codigo de barras +' Dim Out As OutputStream +' Out = File.OpenOutput(File.DirInternal & Dir & Dir2, "Test.png", False) +' barcode.CODE128(notaabono&sDate&tipopagotick&numpago).WriteToStream(Out, 100, "PNG") +' Out.Close + + '' codigo de qr + Dim Out As OutputStream + Out = File.OpenOutput(File.DirInternal & Dir & Dir2, "qr.png", False) + qr.Create(f1&sDate&tipopagotick&numeropago).WriteToStream(Out, 100, "PNG") + Out.Close + + Log(notaabono) + Log(et_abono.Text) + Printer1.WriteString("Comprobante de pago del pagare" & CRLF) + Printer1.WriteString("Folio: " & Folio &"-"&(numeropago)& CRLF) + + If tipo_abonox = "abono" Then + Printer1.WriteString("Monto deuda: " & (NumberFormat(f2 - f3,0,2)) & CRLF) + Else + If reimpresion = 1 Then + Printer1.WriteString("Monto deuda: " & (NumberFormat(f4 - f5,0,2)) & CRLF) + Else If reimpresion = 0 Then + Printer1.WriteString("Monto deuda: " & (NumberFormat(f4 - f5,0,2)) & CRLF) + End If + End If + + Printer1.WriteString("Monto abono: " & (NumberFormat(et_abono.Text,0,2)) & CRLF) + + Printer1.WriteString("Tipo de pago: " & itemselect & CRLF) + + If tipo_abonox = "abono" Then + Printer1.WriteString("Restante "&Folio&": " &(NumberFormat(f2-et_abono.Text ,0,2)) & CRLF) + Else + Printer1.WriteString("Restante "&Folio&": " &(NumberFormat(f4-et_abono.Text - f5,0,2)) & CRLF) + End If + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + Printer1.WriteString("Restante pagares: " &(NumberFormat(f2-et_abono.Text - f3,0,2)) & CRLF) + Printer1.WriteString("Fecha Abono: " & sDate & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString("-------------FIRMA------------" & CRLF) + + + + +' Dim bmp As Bitmap + '' bmp.InitializeResize(File.DirAssets, "logo-guna-18.jpg", 192, 192, True) 'ignore + + Dim bmp2 As Bitmap + bmp2.InitializeResize(File.DirInternal & Dir & Dir2, "qr.png", 192, 192, True) 'ignore +' bmp.Initialize(File.DirInternal & Dir & Dir2, "qr.png") 'ignore + Dim myimage2 As AnImage = Printer1.ImageToBWIMage(bmp2) + myimage2 = Printer1.DitherImage2D(myimage2, 128) + myimage2= Printer1.PackImage(myimage2) + Printer1.WriteString(CRLF) ' nudge the printer to show the user something is happening + Printer1.WriteString(Printer1.REVERSE) + Printer1.PrintImage(myimage2) + Printer1.WriteString(Printer1.UNREVERSE) + +' Printer1.WriteBarCode("I",notaabono&sDate&tipopagotick&numpago) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + + Sleep(2000) + Printer1.DisConnect + ProgressDialogHide + + If Impimir = 1 Then + + If Subs.traeAlmacen = "92" Then + + ''mayoreo + If tipo_abonox = "abono" Then + Msgbox2Async("Deseas imprimir de nuevo el ticket?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + indicanum = 1 + reimpresion = 1 + imprime_abonopagare + Else + p_abono.Visible = False + + + End If + + Else If tipo_abonox = "cxc" Then + Msgbox2Async("Deseas imprimir de nuevo el ticket?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + indicanum = 1 + reimpresion = 1 + imprime_abonopagare +' p_abono.Visible = False +' Starter.skmt.ExecNonQuery($"INSERT INTO ABONOS(a_usuario, a_ruta, a_cliente, a_abono, a_fecha) VALUES ('${Subs.traeUsuarioDeBD}', '${Subs.traeRuta(Subs.traeCliente)}', '${Subs.traeCliente}' ,'${et_abono.text}', '${Subs.fechaKMT(DateTime.now)}')"$) +' ToastMessageShow("Abono guardado", False) + Else + + h = Starter.skmt.ExecQuery("SELECT CUENTA from CUENTAA") + h.Position = 0 + Log(h.GetString("CUENTA")) + j = Starter.skmt.ExecQuery2("SELECT a_abono FROM ABONOS WHERE a_cliente = ?", Array As String(h.GetString("CUENTA"))) + j.position = 0 + If j.RowCount = 0 Then + p_abono.Visible = False + + ToastMessageShow("Abono guardado", False) + Dim rutaactualizar As String + Dim rut As Cursor = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If rut.RowCount > 0 Then + rut.Position = 0 + rutaactualizar = rut.GetString("CAT_CL_RUTA") + End If + Starter.skmt.ExecNonQuery($"UPDATE kmt_info set gestion = 0, HORAENT = '${sDate & " " & sTime}' where CAT_CL_CODIGO In (select cuenta from cuentaa) and CAT_CL_RUTA = '${rutaactualizar}'"$) + Starter.skmt.ExecNonQuery($"DELETE FROM NOVENTA WHERE NV_CLIENTE IN (select cuenta from cuentaa)"$) + Private c3 As Cursor = Starter.skmt.ExecQuery("SELECT * FROM PEDIDO WHERE PE_CLIENTEOR IN (SELECT CUENTA FROM CUENTAA)") + If c3.RowCount = 0 Then + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 0, HVD_RECHAZOCANT = 0, BCAJAS = BCAJAS_OR, CANTC = CANTC_OR WHERE HVD_cliente in (Select CUENTA from cuentaa)"$) + B4XPage_Appear + Else + MsgboxAsync("Hay productos que ya se vendieron, no se puede regresar la venta","Atención") + End If +' Dim textedit As Double = et_abono.Text + Dim sumaresta As Double = saldopendiente-textedit-saldopendiente1 + Log(NumberFormat2(sumaresta,0,2,2,False)) + If NumberFormat2(sumaresta,0,2,2,False) <> "-.00" Then + If NumberFormat2(sumaresta,0,2,2,False) <> ".00" Then + Dim rutaactualizar As String + Dim rut As Cursor = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If rut.RowCount > 0 Then + rut.Position = 0 + rutaactualizar = rut.GetString("CAT_CL_RUTA") + End If + + End If + End If + Else + p_abono.Visible = False +' Starter.skmt.ExecNonQuery($"INSERT INTO ABONOS(a_usuario, a_ruta, a_cliente, a_abono, a_fecha,TIPO_PAGO,a_ticket,a_numpago) VALUES ('${Subs.traeUsuarioDeBD}', '${Subs.traeRuta(Subs.traeCliente)}', '${Subs.traeCliente}' ,'${et_abono.text}', '${Subs.fechaKMT(DateTime.now)}','${itemselect}','${Folio}','${numpago}')"$) + ToastMessageShow("Abono guardado", False) + Dim rutaactualizar As String + Dim rut As Cursor = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If rut.RowCount > 0 Then + rut.Position = 0 + rutaactualizar = rut.GetString("CAT_CL_RUTA") + End If + Starter.skmt.ExecNonQuery($"UPDATE kmt_info set gestion = 0, HORAENT = '${sDate & " " & sTime}' where CAT_CL_CODIGO In (select cuenta from cuentaa) and CAT_CL_RUTA = '${rutaactualizar}'"$) + Starter.skmt.ExecNonQuery($"DELETE FROM NOVENTA WHERE NV_CLIENTE IN (select cuenta from cuentaa)"$) + Private c3 As Cursor = Starter.skmt.ExecQuery("SELECT * FROM PEDIDO WHERE PE_CLIENTEOR IN (SELECT CUENTA FROM CUENTAA)") + If c3.RowCount = 0 Then + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 0, HVD_RECHAZOCANT = 0, BCAJAS = BCAJAS_OR, CANTC = CANTC_OR WHERE HVD_cliente in (Select CUENTA from cuentaa)"$) + B4XPage_Appear + Else + MsgboxAsync("Hay productos que ya se vendieron, no se puede regresar la venta","Atención") + End If +' Dim textedit As Double = et_abono.Text + Dim sumaresta As Double = saldopendiente-textedit-saldopendiente1 +' Log(NumberFormat2(sumaresta,0,2,2,False)) + If NumberFormat2(sumaresta,0,2,2,False) <> "-.00" Then + If NumberFormat2(sumaresta,0,2,2,False) <> ".00" Then + Dim rutaactualizar As String + Dim rut As Cursor = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If rut.RowCount > 0 Then + rut.Position = 0 + rutaactualizar = rut.GetString("CAT_CL_RUTA") + End If + End If + End If + + End If + End If + End If + + ''mayoreo + + Else + If tipo_abonox = "abono" Then + Msgbox2Async("Deseas imprimir de nuevo el ticket?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + indicanum = 1 + reimpresion = 1 + imprime_abonopagare + Else + p_abono.Visible = False + + End If + + Else If tipo_abonox = "cxc" Then + Msgbox2Async("Deseas imprimir de nuevo el ticket?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + reimpresion = 1 + indicanum = 1 + imprime_abonopagare +' p_abono.Visible = False +' Starter.skmt.ExecNonQuery($"INSERT INTO ABONOS(a_usuario, a_ruta, a_cliente, a_abono, a_fecha) VALUES ('${Subs.traeUsuarioDeBD}', '${Subs.traeRuta(Subs.traeCliente)}', '${Subs.traeCliente}' ,'${et_abono.text}', '${Subs.fechaKMT(DateTime.now)}')"$) +' ToastMessageShow("Abono guardado", False) + Else + + h = Starter.skmt.ExecQuery("SELECT CUENTA from CUENTAA") + h.Position = 0 + Log(h.GetString("CUENTA")) + j = Starter.skmt.ExecQuery2("SELECT a_abono FROM ABONOS WHERE a_cliente = ?", Array As String(h.GetString("CUENTA"))) + j.position = 0 + If j.RowCount = 0 Then + p_abono.Visible = False + ToastMessageShow("Abono guardado", False) + Dim rutaactualizar As String + Dim rut As Cursor = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If rut.RowCount > 0 Then + rut.Position = 0 + rutaactualizar = rut.GetString("CAT_CL_RUTA") + End If + Starter.skmt.ExecNonQuery($"UPDATE kmt_info set gestion = 0, HORAENT = '${sDate & " " & sTime}' where CAT_CL_CODIGO In (select cuenta from cuentaa) and CAT_CL_RUTA = '${rutaactualizar}'"$) + Starter.skmt.ExecNonQuery($"DELETE FROM NOVENTA WHERE NV_CLIENTE IN (select cuenta from cuentaa)"$) + Private c3 As Cursor = Starter.skmt.ExecQuery("SELECT * FROM PEDIDO WHERE PE_CLIENTEOR IN (SELECT CUENTA FROM CUENTAA)") + If c3.RowCount = 0 Then + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 0, HVD_RECHAZOCANT = 0, BCAJAS = BCAJAS_OR, CANTC = CANTC_OR WHERE HVD_cliente in (Select CUENTA from cuentaa)"$) + B4XPage_Appear + Else + MsgboxAsync("Hay productos que ya se vendieron, no se puede regresar la venta","Atención") + End If + + Dim sumaresta As Double = f2-textedit-f3 + Log(NumberFormat2(sumaresta,0,2,2,False)) + If NumberFormat2(sumaresta,0,2,2,False) <> "-.00" Then + If NumberFormat2(sumaresta,0,2,2,False) <> ".00" Then + Dim rutaactualizar As String + Dim rut As Cursor = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If rut.RowCount > 0 Then + rut.Position = 0 + rutaactualizar = rut.GetString("CAT_CL_RUTA") + End If + Starter.skmt.ExecNonQuery($"UPDATE kmt_info set gestion = 3, HORAENT = '${sDate & " " & sTime}' where CAT_CL_CODIGO In (select cuenta from cuentaa) and CAT_CL_RUTA = '${rutaactualizar}'"$) + Starter.skmt.ExecNonQuery($"DELETE FROM NOVENTA WHERE NV_CLIENTE IN (select cuenta from cuentaa)"$) + Starter.skmt.ExecNonQuery2("INSERT INTO NOVENTA (NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON,NV_FOTO,NV_REPROGRAMAR) VALUES(?,?,?,?,?,?,?,?,?) ", Array As Object (Subs.traeCliente,sDate & sTime, usuario, "PAGO INCOMPLETO","PAGO INCOMPLETO", B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,rutaactualizar,0)) + Starter.skmt.ExecNonQuery("update HIST_VENTAS SET HVD_RECHAZO = 1, HVD_RECHAZOCANT = HVD_CANT, HVD_RECHAZOCANTC = CANTC, BCAJAS = 0 , CANTC = 0 WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 2, HVD_RECHAZOCANT = HVD_RECHAZOCANT WHERE HVD_PROID = HVD_CODPROMO and HVD_CLIENTE in (Select CUENTA from cuentaa)"$) + Starter.skmt.ExecNonQuery("DELETE FROM PEDIDO WHERE PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + d = Starter.skmt.ExecQuery("SELECT RUTAA FROM RUTAA") + d.Position = 0 + Dim ruta As String = d.GetString("RUTAA") + d.Close + d = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + d.Position = 0 + Dim rutapre As String = d.GetString("CAT_CL_RUTA") + d.Close + d = Starter.skmt.ExecQuery("SELECT HVD_FECHA FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + d.Position = 0 + Dim fechaprev As String = d.GetString("HVD_FECHA") + d.Close + d = Starter.skmt.ExecQuery("SELECT CUENTA FROM CUENTAA") + d.Position = 0 + Starter.skmt.ExecNonQuery2("INSERT INTO REPARTO_GEO (CLIENTE, USUARIO, FECHA_PUNTEO, LATITUD, LONGITUD, ALMACEN, RUTA_REPARTO, RUTA_PREV, FECHA_PREVENTA, MOTIVO, COMENTARIO,TIPO,ENVIO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,0)",Array As String (cuenta, usuario, sDate &" "&sTime, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,B4XPages.MainPage.almacen,ruta,rutapre,fechaprev, "PAGO INCOMPLETO", "PAGO INCOMPLETO","NO ENTREGADO")) + B4XPages.ShowPage("Principal") + End If + End If + Else + p_abono.Visible = False + ToastMessageShow("Abono guardado", False) + Dim rutaactualizar As String + Dim rut As Cursor = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If rut.RowCount > 0 Then + rut.Position = 0 + rutaactualizar = rut.GetString("CAT_CL_RUTA") + End If + Starter.skmt.ExecNonQuery($"UPDATE kmt_info set gestion = 0, HORAENT = '${sDate & " " & sTime}' where CAT_CL_CODIGO In (select cuenta from cuentaa) and CAT_CL_RUTA = '${rutaactualizar}'"$) + Starter.skmt.ExecNonQuery($"DELETE FROM NOVENTA WHERE NV_CLIENTE IN (select cuenta from cuentaa)"$) + Private c3 As Cursor = Starter.skmt.ExecQuery("SELECT * FROM PEDIDO WHERE PE_CLIENTEOR IN (SELECT CUENTA FROM CUENTAA)") + If c3.RowCount = 0 Then + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 0, HVD_RECHAZOCANT = 0, BCAJAS = BCAJAS_OR, CANTC = CANTC_OR WHERE HVD_cliente in (Select CUENTA from cuentaa)"$) + B4XPage_Appear + Else + MsgboxAsync("Hay productos que ya se vendieron, no se puede regresar la venta","Atención") + End If +' Dim textedit As Double = et_abono.Text + Dim sumaresta As Double = f2-textedit-f3 +' Log(NumberFormat2(sumaresta,0,2,2,False)) + If NumberFormat2(sumaresta,0,2,2,False) <> "-.00" Then + If NumberFormat2(sumaresta,0,2,2,False) <> ".00" Then + Dim rutaactualizar As String + Dim rut As Cursor = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If rut.RowCount > 0 Then + rut.Position = 0 + rutaactualizar = rut.GetString("CAT_CL_RUTA") + End If + Starter.skmt.ExecNonQuery($"UPDATE kmt_info set gestion = 3, HORAENT = '${sDate & " " & sTime}' where CAT_CL_CODIGO In (select cuenta from cuentaa) and CAT_CL_RUTA = '${rutaactualizar}'"$) + Starter.skmt.ExecNonQuery($"DELETE FROM NOVENTA WHERE NV_CLIENTE IN (select cuenta from cuentaa)"$) + Starter.skmt.ExecNonQuery2("INSERT INTO NOVENTA (NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON,NV_FOTO,NV_REPROGRAMAR) VALUES(?,?,?,?,?,?,?,?,?) ", Array As Object (Subs.traeCliente,sDate & sTime, usuario, "PAGO INCOMPLETO","PAGO INCOMPLETO", B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,rutaactualizar,0)) + Starter.skmt.ExecNonQuery("update HIST_VENTAS SET HVD_RECHAZO = 1, HVD_RECHAZOCANT = HVD_CANT, HVD_RECHAZOCANTC = CANTC, BCAJAS = 0 , CANTC = 0 WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 2, HVD_RECHAZOCANT = HVD_RECHAZOCANT WHERE HVD_PROID = HVD_CODPROMO and HVD_CLIENTE in (Select CUENTA from cuentaa)"$) + Starter.skmt.ExecNonQuery("DELETE FROM PEDIDO WHERE PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + d = Starter.skmt.ExecQuery("SELECT RUTAA FROM RUTAA") + d.Position = 0 + Dim ruta As String = d.GetString("RUTAA") + d.Close + d = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + d.Position = 0 + Dim rutapre As String = d.GetString("CAT_CL_RUTA") + d.Close + d = Starter.skmt.ExecQuery("SELECT HVD_FECHA FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + d.Position = 0 + Dim fechaprev As String = d.GetString("HVD_FECHA") + d.Close + d = Starter.skmt.ExecQuery("SELECT CUENTA FROM CUENTAA") + d.Position = 0 + Starter.skmt.ExecNonQuery2("INSERT INTO REPARTO_GEO (CLIENTE, USUARIO, FECHA_PUNTEO, LATITUD, LONGITUD, ALMACEN, RUTA_REPARTO, RUTA_PREV, FECHA_PREVENTA, MOTIVO, COMENTARIO,TIPO,ENVIO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,0)",Array As String (cuenta, usuario, sDate &" "&sTime, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,B4XPages.MainPage.almacen,ruta,rutapre,fechaprev, "PAGO INCOMPLETO", "PAGO INCOMPLETO","NO ENTREGADO")) + B4XPages.ShowPage("Principal") + End If + End If + + End If + End If + End If + End If + Else If Impimir = 0 Then + End If +End Sub + +Sub imprime_pagare + c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") +' DateTime.DateFormat = "MM/dd/yyyy" + DateTime.DateFormat = "dd/MM/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c.Close +' ProgressDialogShow("Imprimiendo, un momento ...") +' Printer1.DisConnect +' If Not(Printer1.IsConnected) Then +'' Log("Conectando a impresora ...") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) +' Sleep(1000) +'' Log("++++++ " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect 'Tratamos de reconectar +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' Else +'' Log("conectando 2") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) +' Sleep(1000) +'' Log("****** " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' End If + + ProgressDialogShow2("Imprimiendo, un momento ...",False) + Printer1.DisConnect + If Not(Printer1.IsConnected) Then +' If logger Then Log("conectando 1") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) + Sleep(1000) + cont = cont + 1 + If cont = 7 Then Printer1.Connect 'Tratamos de reconectar + If cont > 15 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + Else +' If logger Then Log("conectando 2") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) + Sleep(1000) + cont = cont + 1 + If cont = 2 Then Printer1.Connect + If cont > 4 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + End If + + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + + Dim telefono As String = "" + Dim c7 As Cursor = Starter.skmt.ExecQuery("select IFNULL(CAT_CL_TELEFONO,' ') AS CAT_CL_TELEFONO FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If c7.RowCount > 0 Then + c7.Position = 0 + telefono = c7.GetString("CAT_CL_TELEFONO") + End If + c7.Close + + Dim bmp As Bitmap + bmp.InitializeResize(File.DirAssets, "logo-guna-18.jpg", 192, 192, True) 'ignore + Dim myimage As AnImage = Printer1.ImageToBWIMage(bmp) + myimage = Printer1.DitherImage2D(myimage, 128) + myimage= Printer1.PackImage(myimage) + Printer1.WriteString(CRLF) ' nudge the printer to show the user something is happening + Printer1.WriteString(Printer1.REVERSE) + Printer1.PrintImage(myimage) + Printer1.WriteString(Printer1.UNREVERSE) + +' Dim Ticket As String = 0 +' Dim c6 As Cursor = Starter.skmt.ExecQuery("select distinct HVD_NUM_TICKET FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") +' If c6.RowCount > 0 Then +' c6.Position = 0 +' Ticket = c6.GetString("HVD_NUM_TICKET") +' End If +' c6.Close + + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Printer1.WriteString("DISTRIBUIDORA ROCHA TULA PACHUCA" & CRLF) + Printer1.WriteString(sDate & CRLF) + Printer1.WriteString(sTime & CRLF) + Printer1.WriteString("Reparto:" & usuario & CRLF) + Printer1.WriteString("Ruta:" & Subs.traeRutaReparto & CRLF) + Printer1.WriteString("Ruta preventa:" & Subs.traerUTAPREV & CRLF) + Printer1.WriteString("Tienda: " & La_nombre.Text & CRLF) + Printer1.WriteString("ID.Cliente: " & la_cuenta.Text & CRLF) + Printer1.WriteString("Calle: " & la_Calle.Text & CRLF) + Printer1.WriteString("Colonia: " & la_col.Text & CRLF) + Printer1.WriteString("Telefono: " & telefono & CRLF) + Dim Ticket As String = 0 + Dim c6 As Cursor = Starter.skmt.ExecQuery("select distinct HVD_NUM_TICKET FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND HVD_PRONOMBRE <> 'Cobranza Pendiente'") + If c6.RowCount > 0 Then + For k = 0 To c6.RowCount -1 + c6.Position = k + Ticket = c6.GetString("HVD_NUM_TICKET") + Printer1.WriteString("Num. Ticket " & (k +1)&": " & Ticket & CRLF) + Next + End If + c6.Close + Printer1.WriteString("Fecha: " & sDate &" " & sTime & CRLF) + Printer1.WriteString(" " & CRLF) + c = Starter.skmt.ExecQuery("SELECT * FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + If c.RowCount > 0 Then + Printer1.WriteString("------------PAGARE------------" & CRLF) + Printer1.WriteString("" & CRLF) + Printer1.WriteString("Pagare por los articulos" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + ' aqui es donde esta el pedo de julieta de los descuentos quitar el precio2 pero meter un if para saber si es ruta especial o es normal o que show. + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, HVD_CANT, length(HVD_CANT) as L_CANT, HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID, HVD_CODPROMO,IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) order by HVD_PROID"$) + If S.RowCount>0 Then + For i=0 To S.RowCount -1 + S.Position=i + Log(s.GetString("HVD_RECHAZO")) + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then + If s.GetString("HVD_CODPROMO") = Subs.traeAlmacen Then + Printer1.Justify = 0 +' Printer1.WriteString((s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") ) &" "&s.GetString("HVD_PRONOMBRE") & CRLF) + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + + Dim punit As String = NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) + TAMANO = punit.Length + TAMANO + + ' Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + TAMANO = ptot.Length + TAMANO + + ESPACIO = (ESPACIO - TAMANO)/2 + ' Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString( ptot & CRLF ) + TAMANO = 0 + ESPACIO = 29 + BLANCO = " " + Else If s.GetString("HVD_RECHAZO") = 1 Then + Printer1.Justify = 0 +' Printer1.WriteString((s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) &" "&s.GetString("HVD_PRONOMBRE") & CRLF) + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + + Private vc5 As Cursor = Starter.skmt.ExecQuery($"select iFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + vc5.Position = 0 + Dim punit As String = NumberFormat2((vc5.GetString("CAT_GP_PRECIO")),0,2,2,False) + TAMANO = punit.Length + TAMANO + vc5.Close + + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + TAMANO = ptot.Length + TAMANO + + ESPACIO = (ESPACIO - TAMANO)/2 + ' Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString(ptot& CRLF ) + TAMANO = 0 + ESPACIO = 29 + BLANCO = " " + Printer1.Justify = 0 + End If + End If + Next + End If + End If + Printer1.Justify = 0 + s.Close + Printer1.WriteString(" " & CRLF) + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, HVD_CANT, length(HVD_CANT) as L_CANT, HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID, HVD_CODPROMO,IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_RECHAZO = 0 and HVD_PRONOMBRE <> 'Cobranza Pendiente' AND HVD_CODPROMO <> '${Subs.traeAlmacen}' order by HVD_CODPROMO, ESPROMO DESC, HVD_PROID"$) + If S.RowCount>0 Then + Printer1.WriteString("-------BONIFICACIONES--------" & CRLF) + Printer1.WriteString("Cant. Precio Importe" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + For i=0 To S.RowCount -1 + S.Position=i + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then + If s.GetString("HVD_CODPROMO") <> Subs.traeAlmacen Then + Printer1.Justify = 0 + If s.GetString("HVD_CODPROMO") = s.GetString("HVD_PROID") Then +' Printer1.WriteString("* "&s.GetString("HVD_PRONOMBRE") & CRLF) + Else + If s.GetString("HVD_PRONOMBRE") <> "Cobranza Pendiente" Then + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) +' Printer1.WriteString((s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") ) &" "&s.GetString("HVD_PRONOMBRE") & CRLF) + End If + End If + Dim punit As String =NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) + TAMANO = punit.Length + TAMANO + Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) + TAMANO = ptot.Length + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 + Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString(ptot & CRLF ) + TAMANO = 0 + ESPACIO = 29 + BLANCO = " " + Printer1.Justify = 0 + Else + End If + End If + Next + End If + + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("Por monto de $" &l_total.Text& CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("Debo(mos) y pagare(mos) incon" & CRLF) + Printer1.WriteString("dicionalmente en _____________" & CRLF) + Printer1.WriteString("o en el lugar donde se me " & CRLF) + Printer1.WriteString("requiera por el presente pagare" & CRLF) + Printer1.WriteString("a GUNA la cantidad de $"&l_total.Text & CRLF) + Printer1.WriteString("valor recibido a entera " & CRLF) + Printer1.WriteString("satisfaccion. La falta de pago" & CRLF) + Printer1.WriteString("a la fecha indicada causara " & CRLF) + Printer1.WriteString("intereses moratorios a razon " & CRLF) + Printer1.WriteString("de ______% mensual a la fecha." & CRLF) + Printer1.WriteString("" & CRLF) + Printer1.WriteString("" & CRLF) + Printer1.WriteString(" Recibi " & CRLF) + Printer1.WriteString("" & CRLF) + Printer1.WriteString("" & CRLF) + Printer1.WriteString("______________________________" & CRLF) + + + DateTime.DateFormat = "ddMMyyyy" + sDate=DateTime.Date(DateTime.Now) +' Printer1.WriteString("JHGHGH " & CRLF) + + + + + + '' codigo de barras +' ImageView1.Bitmap = barcode.CODE128(notaabono&sDate&tipopagotick&numpago) + '' codigo de qr + B4XImageView1.SetBitmap(qr.Create(la_cuenta.Text&sDate)) + + + Dim Dirp As String = File.DirInternal + Dim Dir As String + Dim Dir2 As String + Try + File.MakeDir(Dirp,"/md") + Dir = "/md" + 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 + + '' codigo de barras +' Dim Out As OutputStream +' Out = File.OpenOutput(File.DirInternal & Dir & Dir2, "Test.png", False) +' barcode.CODE128(la_cuenta.Text&sDate).WriteToStream(Out, 100, "PNG") +' Out.Close + + '' codigo de qr + Dim Out As OutputStream + Out = File.OpenOutput(File.DirInternal & Dir & Dir2, "qr.png", False) + qr.Create(la_cuenta.Text&sDate).WriteToStream(Out, 100, "PNG") + Out.Close + + + + + + Dim bmp2 As Bitmap + bmp2.InitializeResize(File.DirInternal & Dir & Dir2, "qr.png", 192, 192, True) 'ignore +' bmp.Initialize(File.DirInternal & Dir & Dir2, "qr.png") 'ignore + Dim myimage2 As AnImage = Printer1.ImageToBWIMage(bmp2) + myimage2 = Printer1.DitherImage2D(myimage2, 128) + myimage2= Printer1.PackImage(myimage2) + Printer1.WriteString(CRLF) ' nudge the printer to show the user something is happening + Printer1.WriteString(Printer1.REVERSE) + Printer1.PrintImage(myimage2) + Printer1.WriteString(Printer1.UNREVERSE) + +' Printer1.WriteBarCode("I",la_cuenta.Text&sDate) + + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Sleep(1000) + Printer1.DisConnect + ProgressDialogHide + If banderaimp = 1 Then + + Msgbox2Async("Deseas imprimir de nuevo el PAGARE?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + imprime_pagare + Else + If banderaabono = 1 Then + imprime_abonopagare2 + Else + Guardado + End If + End If +' printer.Flush + ' printer.Close + Else If banderaimp = 0 Then + Msgbox2Async("Deseas imprimir de nuevo el PAGARE?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + imprime_pagare + End If + End If +' Guardado +End Sub + +Private Sub b_cancel_pagare_Click + tipo_abonox = "abono" + + Dim Items As List + Items.Initialize + + Items.Add("SELECCIONA UNA OPCION") + Items.Add("TRANSFERENCIA") + Items.Add("EFECTIVO") + Items.Add("CHEQUE") + + cb_tipopago.SetItems(Items) + + itemselect= "SELECCIONA UNA OPCION" + +' Msgbox2Async($"¿Que deseas realizar?"$,"Atención", "","", "Abono pagare", Null, True) +' Wait For Msgbox_Result (resultado As Int) +' If resultado = DialogResponse.POSITIVE Then +' Msgbox2Async($"¿Seguro que quieres cancelar el pagare con monto de $${l_total.Text} para este cliente?"$,"Atención", "Aceptar","Cancelar", "", Null, True) +' Wait For Msgbox_Result (resultado As Int) +' If resultado = DialogResponse.POSITIVE Then +' Starter.skmt.ExecNonQuery("update PAGARES SET PA_CANCELADO = 2 WHERE PA_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") +' imprime_cancelarpagare +' +' d = Starter.skmt.ExecQuery("SELECT RUTAA FROM RUTAA") +' d.Position = 0 +' Dim ruta As String = d.GetString("RUTAA") +' d.Close +' +' Dim g5 As Cursor = Starter.skmt.ExecQuery("SELECT SUM(HVD_COSTO_TOT) as HVD_COSTO_TOT FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") +' g5.Position = 0 +' Dim totaltotal As String = g5.GetString("HVD_COSTO_TOT") +' g5.Close +' If totaltotal = l_total.Text.Replace(",","") Then +' Dim entregatotaloparial As String = "ENTREGA TOTAL" +' Else +' Dim entregatotaloparial As String = "ENTREGA PARCIAL" +' End If +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "UPDATE_ACTUAL_GEO_GUNA_VN" +'' cmd.Parameters = Array As String(l_total.Text.Replace(",",""),"0", "",B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,"","",usuario,ruta,"ENTREGA", entregatotaloparial,"EFECTIVO", distance, L_CANT.text,la_cuenta.Text,fechaprev,almacen,Subs.traerUTAPREV) +' cmd.Parameters = Array As String(l_total.Text.Replace(",",""),"0", "",B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,"","",usuario,ruta,"ENTREGA", entregatotaloparial,"EFECTIVO", distance, L_CANT.text,la_cuenta.Text,fechaprev,almacen,Subs.traerUTAPREV) +' Starter.skmt.ExecNonQuery2("INSERT INTO HIST_REPARTO_GEO(HIST_RG_MONTO , HIST_RG_CREDITO , HIST_RG_MONTO_CREDITO , HIST_RG_LAT , HIST_RG_LONG , HIST_RG_RECHAZO , HIST_RG_MOTIVO , HIST_RG_USUARIO_ENTREGO , HIST_RG_RUTA_REP , HIST_RG_ESTATUS_ENTREGA , HIST_RG_COMENTARIO_ENTREGA , HIST_RG_FORMA_PAGO , HIST_RG_GEOCERCA_MTS , HIST_RG_NO_ART , HIST_RG_CLIENTE , HIST_RG_FECHA , HIST_RG_ALMACEN , HIST_RG_RUTA_PRE) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object(l_total.Text.Replace(",",""),"0", "",B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,"","",usuario,ruta,"ENTREGA", entregatotaloparial,"EFECTIVO", distance, L_CANT.text,la_cuenta.Text,fechaprev,almacen,Subs.traerUTAPREV)) +' reqManager.ExecuteCommand(cmd, "up_geo") +' banderaimp = 1 +' End If +' Else If resultado = DialogResponse.NEGATIVE Then + + h = Starter.skmt.ExecQuery("SELECT CUENTA from CUENTAA") + h.Position = 0 + Log(h.GetString("CUENTA")) + j = Starter.skmt.ExecQuery2("SELECT a_abono FROM ABONOS WHERE a_cliente = ? and a_tipoabono is null", Array As String(h.GetString("CUENTA"))) + j.position = 0 + Log(j.RowCount) + If j.RowCount = 0 Then + p_abono.Visible = True + et_abono.text = "" + Dim total As Double = 0 + f = Starter.skmt.ExecQuery("SELECT CUENTA FROM CUENTAA") + f.Position = 0 + d = Starter.skmt.ExecQuery2("SELECT distinct PA_TICKET, PA_MONTO,PA_CAPTURA FROM PAGARES WHERE PA_CLIENTE = ? AND PA_CANCELADO IS NULL ORDER BY PA_CAPTURA", Array As String (f.GetString("CUENTA"))) + clv_abonos.Clear + For i = 0 To d.RowCount - 1 + d.Position = i + + Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) AND a_ticket = ?", Array As String(d.GetString("PA_TICKET"))) + Log(Folio) + y.position = 0 + + clv_abonos.Add(CreateListItem(d.GetString("PA_TICKET"),"$ " & NumberFormat2((d.GetString("PA_MONTO")-y.GetString("a_abono")),0,2,2,False),d.GetString("PA_CAPTURA")),i) + + + + total = total + d.GetString("PA_MONTO") + Log(total) + Next + d.Close + d = Starter.skmt.ExecQuery2("SELECT a_abono,a_fecha FROM ABONOS WHERE a_cliente = ? and a_tipoabono is not null ORDER BY a_fecha", Array As String (f.GetString("CUENTA"))) + If d.RowCount > 0 Then + For i = 0 To d.RowCount - 1 + d.Position = i + clv_abonos.Add(CreateListItem("ABONO","$ " & d.GetString("a_abono"),d.GetString("a_fecha")),i) + total = total - d.GetString("a_abono") + Log(total) + Next + End If + l_montoabonostotal.Text = NumberFormat2(total,0,2,2,False) + d.Close + f.Close + Else If j.RowCount > 0 Then + p_abono.Visible = True + et_abono.text = "" + Dim total As Double = 0 + f = Starter.skmt.ExecQuery("SELECT CUENTA FROM CUENTAA") + f.Position = 0 + d = Starter.skmt.ExecQuery2("SELECT distinct PA_TICKET, PA_MONTO,PA_CAPTURA FROM PAGARES WHERE PA_CLIENTE = ? AND PA_CANCELADO IS NULL ORDER BY PA_CAPTURA", Array As String (f.GetString("CUENTA"))) + clv_abonos.Clear + For i = 0 To d.RowCount - 1 + d.Position = i + Dim y As Cursor = Starter.skmt.ExecQuery2("SELECT IFNULL(SUM(a_abono),0) AS a_abono FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) AND a_ticket = ?", Array As String(d.GetString("PA_TICKET"))) + Log(Folio) + y.position = 0 + + clv_abonos.Add(CreateListItem(d.GetString("PA_TICKET"),"$ " &NumberFormat2((d.GetString("PA_MONTO")-y.GetString("a_abono")),0,2,2,False),d.GetString("PA_CAPTURA")),i) + + total = total + d.GetString("PA_MONTO").Replace(",","") + Log(total) + Next + d.Close + d = Starter.skmt.ExecQuery2("SELECT a_abono,a_fecha FROM ABONOS WHERE a_cliente = ? and a_tipoabono is not null ORDER BY a_fecha", Array As String (f.GetString("CUENTA"))) + If d.RowCount > 0 Then + For i = 0 To d.RowCount - 1 + d.Position = i + clv_abonos.Add(CreateListItem("ABONO","$ " & d.GetString("a_abono"),d.GetString("a_fecha")),i) + total = total - d.GetString("a_abono") + Log(total) + Next + End If + l_montoabonostotal.Text = NumberFormat2(total,0,2,2,False) + d.Close + f.Close +' MsgboxAsync("Este cliente ya tiene un pago capturado","Atención") + End If + h.Close + j.Close + +' End If + + + + +End Sub + +Sub imprime_cancelarpagare + c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") +' DateTime.DateFormat = "MM/dd/yyyy" + DateTime.DateFormat = "dd/MM/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c.Close +' ProgressDialogShow("Imprimiendo, un momento ...") +' Printer1.DisConnect +' If Not(Printer1.IsConnected) Then +'' Log("Conectando a impresora ...") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) +' Sleep(1000) +'' Log("++++++ " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect 'Tratamos de reconectar +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' Else +'' Log("conectando 2") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) +' Sleep(1000) +'' Log("****** " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' End If + + ProgressDialogShow2("Imprimiendo, un momento ...",False) + Printer1.DisConnect + If Not(Printer1.IsConnected) Then +' If logger Then Log("conectando 1") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) + Sleep(1000) + cont = cont + 1 + If cont = 7 Then Printer1.Connect 'Tratamos de reconectar + If cont > 15 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + Else +' If logger Then Log("conectando 2") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) + Sleep(1000) + cont = cont + 1 + If cont = 2 Then Printer1.Connect + If cont > 4 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + End If + + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + Dim telefono As String = "" + Dim c7 As Cursor = Starter.skmt.ExecQuery("select IFNULL(CAT_CL_TELEFONO,' ') AS CAT_CL_TELEFONO FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If c7.RowCount > 0 Then + c7.Position = 0 + telefono = c7.GetString("CAT_CL_TELEFONO") + End If + c7.Close + Dim bmp As Bitmap + bmp.InitializeResize(File.DirAssets, "logo-guna-18.jpg", 192, 192, True) 'ignore + Dim myimage As AnImage = Printer1.ImageToBWIMage(bmp) + myimage = Printer1.DitherImage2D(myimage, 128) + myimage= Printer1.PackImage(myimage) + Printer1.WriteString(CRLF) ' nudge the printer to show the user something is happening + Printer1.WriteString(Printer1.REVERSE) + Printer1.PrintImage(myimage) + Printer1.WriteString(Printer1.UNREVERSE) + Printer1.WriteString("DISTRIBUIDORA ROCHA TULA PACHUCA" & CRLF) + Printer1.WriteString(sDate & CRLF) + Printer1.WriteString(sTime & CRLF) + Printer1.WriteString("Reparto:" & usuario & CRLF) + Printer1.WriteString("Tienda: " & La_nombre.Text & CRLF) + Printer1.WriteString("ID.Cliente: " & la_cuenta.Text & CRLF) + Printer1.WriteString("Calle: " & la_Calle.Text & CRLF) + Printer1.WriteString("Colonia: " & la_col.Text & CRLF) + Printer1.WriteString("Telefono: " & telefono & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("-----CANCELACION DE PAGARE----" & CRLF) + Printer1.WriteString("" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString("Se cancela el pagare " & CRLF) + Printer1.WriteString("Por monto de $" &l_total.Text& CRLF) + Printer1.WriteString("por el cual se pagara el " & CRLF) + Printer1.WriteString("total en efectivo" & CRLF) +' Printer1.WriteString("dicionalmente en _____________" & CRLF) +' Printer1.WriteString("o en el lugar donde se me " & CRLF) +' Printer1.WriteString("requiera por el presente pagare" & CRLF) +' Printer1.WriteString("a GUNA la cantidad de $"&l_total.Text & CRLF) +' Printer1.WriteString("valor recibido a entera " & CRLF) +' Printer1.WriteString("satisfacciOn. La falta de pago" & CRLF) +' Printer1.WriteString("a la fecha indicada causara " & CRLF) +' Printer1.WriteString("intereses moratorios a razOn " & CRLF) +' Printer1.WriteString("de ______% mensual a la fecha." & CRLF) + Printer1.WriteString("" & CRLF) + Printer1.WriteString("" & CRLF) + Printer1.WriteString(" Recibi " & CRLF) + Printer1.WriteString("" & CRLF) + Printer1.WriteString("" & CRLF) + Printer1.WriteString("______________________________" & CRLF) + + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Sleep(1000) + Printer1.DisConnect + ProgressDialogHide + If banderaimp = 1 Then + Msgbox2Async("Deseas imprimir de nuevo el PAGARE?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + imprime_cancelarpagare + Else + Guardado + End If +' printer.Flush + ' printer.Close + Else If banderaimp = 0 Then + Msgbox2Async("Deseas imprimir de nuevo el PAGARE?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + imprime_cancelarpagare + End If + End If +' Guardado +End Sub + +Private Sub CrearQR(NOTA2 As String) +' Private texto As String = $"https://wa.me/5215637241894?text=PAGARE ${NOTA2}"$ 'Bow 2.0 G + Private texto As String = $"https://wa.me/5215611769317?text=PAGARE_${NOTA2}"$ 'Bow2024 + i_qr.Clear + If texto.Length>0 Then + i_qr.SetBitmap(qr.Create(texto)) + Log("QR Creado ->"&texto) + End If +End Sub + +Private Sub b_confirmar_Click + ProgressDialogShow("Un momento por favor!!") + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "selectPagareConfirmado_Demo" +' cmd.Parameters = Array As Object(Subs.traeCliente, NOTA) + cmd.Parameters = Array As Object(NOTA) + reqManager.ExecuteQuery(cmd, 0, $"pagareConfirmado_${NOTA}"$) +End Sub + +Private Sub p_transPagare2_Click + +End Sub + +Private Sub b_cerrarqr_Click + i_qr.Clear + p_transPagare2.Visible = False +End Sub + +Private Sub b_imprimesegun_Click + + Dim pagacheca As Cursor = Starter.skmt.ExecQuery("SELECT * FROM PAGARES WHERE PA_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + + If pagacheca.RowCount > 0 Then + Tipoentrega = "CREDITO" + Else + Tipoentrega = "CONTADO" + End If + + c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c.Close +' ProgressDialogShow("Imprimiendo, un momento ...") +' Printer1.DisConnect +' If Not(Printer1.IsConnected) Then +'' Log("Conectando a impresora ...") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) +' Sleep(1000) +'' Log("++++++ " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect 'Tratamos de reconectar +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' Else +'' Log("conectando 2") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) +' Sleep(1000) +'' Log("****** " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' End If + + ProgressDialogShow2("Imprimiendo, un momento ...",False) + Printer1.DisConnect + If Not(Printer1.IsConnected) Then +' If logger Then Log("conectando 1") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) + Sleep(1000) + cont = cont + 1 + If cont = 7 Then Printer1.Connect 'Tratamos de reconectar + If cont > 15 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + Else +' If logger Then Log("conectando 2") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) + Sleep(1000) + cont = cont + 1 + If cont = 2 Then Printer1.Connect + If cont > 4 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + End If + + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + Dim bmp As Bitmap + bmp.InitializeResize(File.DirAssets, "logo-guna-18.jpg", 192, 192, True) 'ignore + Dim myimage As AnImage = Printer1.ImageToBWIMage(bmp) + myimage = Printer1.DitherImage2D(myimage, 128) + myimage= Printer1.PackImage(myimage) + Printer1.WriteString(CRLF) ' nudge the printer to show the user something is happening + Printer1.WriteString(Printer1.REVERSE) + Printer1.PrintImage(myimage) + Printer1.WriteString(Printer1.UNREVERSE) +' Dim Ticket As String = 0 +' Dim c6 As Cursor = Starter.skmt.ExecQuery("select distinct HVD_NUM_TICKET FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") +' If c6.RowCount > 0 Then +' c6.Position = 0 +' Ticket = c6.GetString("HVD_NUM_TICKET") +' End If +' c6.Close + Dim telefono As String = "" + Dim c7 As Cursor = Starter.skmt.ExecQuery("select IFNULL(CAT_CL_TELEFONO,' ') AS CAT_CL_TELEFONO FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If c7.RowCount > 0 Then + c7.Position = 0 + telefono = c7.GetString("CAT_CL_TELEFONO") + End If + c7.Close + + Printer1.WriteString("DISTRIBUIDORA ROCHA TULA PACHUCA" & CRLF) + Printer1.WriteString(sDate & CRLF) + Printer1.WriteString(sTime & CRLF) + Printer1.WriteString("Reparto:" & usuario & CRLF) + Printer1.WriteString("Tienda: " & La_nombre.Text & CRLF) + Printer1.WriteString("ID.Cliente: " & la_cuenta.Text & CRLF) + Printer1.WriteString("Calle: " & la_Calle.Text & CRLF) + Printer1.WriteString("Colonia: " & la_col.Text & CRLF) + Printer1.WriteString("Telefono: " & telefono & CRLF) + + Dim Ticket As String = 0 + Dim c6 As Cursor = Starter.skmt.ExecQuery("select distinct HVD_NUM_TICKET FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + If c6.RowCount > 0 Then + For k = 0 To c6.RowCount -1 + c6.Position = k + Ticket = c6.GetString("HVD_NUM_TICKET") + Printer1.WriteString("Num. Ticket " & (k +1)&": " & Ticket & CRLF) + Next + End If + c6.Close + + Printer1.WriteString(" " & CRLF) + c = Starter.skmt.ExecQuery("SELECT * FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + + Dim totaltotal As Double + Dim cobranza As Cursor = Starter.skmt.ExecQuery("SELECT * FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA) and HVD_PRONOMBRE = 'Cobranza Pendiente'") + Dim restacobranza As Int = 0 + If cobranza.RowCount > 0 Then + restacobranza = 1 + End If + If c.RowCount > 0 Then + ' aqui es donde esta el pedo de julieta de los descuentos quitar el precio2 pero meter un if para saber si es ruta especial o es normal o que show. ''CAT_TIPO_BONIFICACIONES +' s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, HVD_CANT, length(HVD_CANT) as L_CANT, HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID, HVD_CODPROMO,IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) and (HVD_CODPROMO <> 'MI RETO' or HVD_CODPROMO <> 'MI RETO' or HVD_CODPROMO <> 'MI RETO') AND (HVD_COSTO_TOT/HVD_CANT) > 0.01 order by HVD_PROID"$) + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) and (HVD_CODPROMO <> 'MIRETO' or HVD_CODPROMO <> 'SOCIOBAT' or HVD_CODPROMO <> 'BIGCOMMERCE') AND (HVD_COSTO_TOT/HVD_CANT) > 0.01 GROUP by HVD_PROID"$) + If S.RowCount>0 Then + Printer1.WriteString("-------ENTREGA A "& Tipoentrega &"------" & CRLF) +' Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString("Cant. Precio Importe" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + For i=0 To S.RowCount -1 + S.Position=i + Log(s.GetString("HVD_RECHAZO")) + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then + If s.GetInt("HVD_RECHAZO") = 0 Then + Printer1.Justify = 0 + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + Dim punit As String = NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) + TAMANO = punit.Length + TAMANO +' Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + TAMANO = ptot.Length + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString( ptot & CRLF ) + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + Else If s.GetInt("HVD_RECHAZO") > 0 Then + Printer1.Justify = 0 + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + Private vc5 As Cursor = Starter.skmt.ExecQuery($"select iFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + vc5.Position = 0 + Dim punit As String = NumberFormat2((vc5.GetString("CAT_GP_PRECIO")),0,2,2,False) + TAMANO = punit.Length + TAMANO + vc5.Close + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + TAMANO = ptot.Length + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString(ptot& CRLF ) + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + Printer1.Justify = 0 + End If + End If + Next + End If + End If + Printer1.Justify = 0 + s.Close + Printer1.WriteString(" " & CRLF) + + +' s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, HVD_CANT, length(HVD_CANT) as L_CANT, HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID, HVD_CODPROMO,IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_RECHAZO = 0 AND HVD_CODPROMO <> '${Subs.traeAlmacen}' order by HVD_CODPROMO, ESPROMO DESC, HVD_PROID"$) + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) and (HVD_CODPROMO <> 'MIRETO' or HVD_CODPROMO <> 'SOCIOBAT' or HVD_CODPROMO <> 'BIGCOMMERCE') AND (HVD_COSTO_TOT/HVD_CANT) = 0.01 GROUP by HVD_PROID"$) + + + If S.RowCount>0 Then + Printer1.WriteString("------- BONIFICACIONES --------" & CRLF) + Printer1.WriteString("Cant. Precio Importe" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + For i=0 To S.RowCount -1 + S.Position=i + + + + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then +' If s.GetString("HVD_CODPROMO") <> Subs.traeAlmacen Then + Printer1.Justify = 0 +' If s.GetString("HVD_CODPROMO") = s.GetString("HVD_PROID") Then + '' Printer1.WriteString("* "&s.GetString("HVD_PRONOMBRE") & CRLF) +' +' Else + + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + + Dim punit As String =NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) + TAMANO = punit.Length + TAMANO + Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) + TAMANO = ptot.Length + TAMANO +3 + ESPACIO = (ESPACIO - TAMANO)/2 + Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString(ptot & CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + + TAMANO = 0 + ESPACIO = 29 + BLANCO = " " + Printer1.Justify = 0 + totaltotal = totaltotal + (checaprecio.GETSTRING("CAT_GP_PRECIO") * s.GetString("HVD_CANT")) +' End If +' Else +' End If + End If + + Next + End If + +' Printer1.WriteString(" " & CRLF) +' s=Starter.skmt.ExecQuery($"select PE_PRONOMBRE, PE_CANT, length(PE_CANT) as L_CANT, PE_COSTO_TOT, length(PE_COSTO_TOT) as L_COSTOU,PE_PROID FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) order BY PE_PROID"$) + ' +' If S.RowCount>0 Then +' Printer1.WriteString("-----------VENTA------------" & CRLF) +' Printer1.WriteString("Cant. Precio Importe" & CRLF) +' Printer1.WriteString("------------------------------" & CRLF) +' +' For i=0 To S.RowCount -1 +' S.Position=i + ' +' Printer1.Justify = 0 +' Printer1.WriteString(s.GetString("PE_PRONOMBRE") & CRLF) +' Dim punit As String =NumberFormat2( (s.GETSTRING("PE_COSTO_TOT")/s.GetString("PE_CANT")),0,2,2,False) +' TAMANO = punit.Length + TAMANO +' Private ptot As String = NumberFormat2((punit*s.GetString("PE_CANT")),0,2,2,False) +' TAMANO = ptot.Length + TAMANO +' ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) +' For E=0 To ESPACIO -1 +' BLANCO = " " & BLANCO +' Next +' Printer1.Justify = 0 +' Printer1.WriteString( s.GetString("PE_CANT") & BLANCO) +' Printer1.Justify = 1 +' Printer1.WriteString( punit & BLANCO) +' Printer1.Justify = 2 +' Printer1.WriteString(ptot & CRLF ) +' TAMANO = 0 +' ESPACIO = 29 +' BLANCO = " " +' Printer1.Justify = 0 +' Next +' End If + Printer1.WriteString(" " & CRLF) + + + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_CODPROMO = 'MIRETO' GROUP by HVD_PROID"$) + If S.RowCount>0 Then + Printer1.WriteString("----------- MI RETO ------------" & CRLF) +' Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString("Cant. Precio Importe" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + For i=0 To S.RowCount -1 + S.Position=i + Log(s.GetString("HVD_RECHAZO")) + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then + If s.GetInt("HVD_RECHAZO") = 0 Then + Printer1.Justify = 0 + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + Dim punit As String = NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) + TAMANO = punit.Length + TAMANO +' Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + TAMANO = ptot.Length + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString( ptot & CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + Else If s.GetInt("HVD_RECHAZO") > 0 Then + Printer1.Justify = 0 + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + Private vc5 As Cursor = Starter.skmt.ExecQuery($"select iFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + vc5.Position = 0 + Dim punit As String = NumberFormat2((vc5.GetString("CAT_GP_PRECIO")),0,2,2,False) + TAMANO = punit.Length + TAMANO + vc5.Close + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + TAMANO = ptot.Length + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString(ptot& CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + Printer1.Justify = 0 + End If + End If + Next + End If + Printer1.Justify = 0 + s.Close + + Printer1.WriteString(" " & CRLF) + + + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_CODPROMO = 'BIGCOMMERCE' GROUP by HVD_PROID"$) +' s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_CODPROMO = 'SOCIOBAT' GROUP by HVD_PROID"$) + If S.RowCount>0 Then + Printer1.WriteString("---------- CONECTADOS ----------" & CRLF) +' Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString("Cant. Precio Importe" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + For i=0 To S.RowCount -1 + S.Position=i + Log(s.GetString("HVD_RECHAZO")) + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then + If s.GetInt("HVD_RECHAZO") = 0 Then + Printer1.Justify = 0 + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + Dim punit As String = NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) + TAMANO = punit.Length + TAMANO +' Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + TAMANO = ptot.Length + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString( ptot & CRLF ) + + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + Else If s.GetInt("HVD_RECHAZO") > 0 Then + Printer1.Justify = 0 + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + Private vc5 As Cursor = Starter.skmt.ExecQuery($"select iFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + vc5.Position = 0 + Dim punit As String = NumberFormat2((vc5.GetString("CAT_GP_PRECIO")),0,2,2,False) + TAMANO = punit.Length + TAMANO + vc5.Close + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + TAMANO = ptot.Length + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString(ptot& CRLF ) + + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + Printer1.Justify = 0 + End If + End If + Next + End If + Printer1.Justify = 0 + s.Close + +' s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_CODPROMO = 'CONECTADOS' GROUP by HVD_PROID"$) + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_CODPROMO = 'SOCIOBAT' GROUP by HVD_PROID"$) + If S.RowCount>0 Then + Printer1.WriteString("---------- SOCIO BAT ----------" & CRLF) +' Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString("Cant. Precio Importe" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + For i=0 To S.RowCount -1 + S.Position=i + Log(s.GetString("HVD_RECHAZO")) + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then + If s.GetInt("HVD_RECHAZO") = 0 Then + Printer1.Justify = 0 + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + Dim punit As String = NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) + TAMANO = punit.Length + TAMANO +' Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + TAMANO = ptot.Length + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString( ptot & CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + Else If s.GetInt("HVD_RECHAZO") > 0 Then + Printer1.Justify = 0 + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + Private vc5 As Cursor = Starter.skmt.ExecQuery($"select iFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + vc5.Position = 0 + Dim punit As String = NumberFormat2((vc5.GetString("CAT_GP_PRECIO")),0,2,2,False) + TAMANO = punit.Length + TAMANO + vc5.Close + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + TAMANO = ptot.Length + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString(ptot& CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + Printer1.Justify = 0 + End If + End If + Next + End If + Printer1.Justify = 0 + s.Close + + + Printer1.WriteString(" " & CRLF) + + + + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString("Subtotal: $" & NumberFormat2(totaltotal,0,2,2,False)& CRLF) + Printer1.WriteString("Total Articulos: " & (L_CANT.Text.Replace(",","") -restacobranza) & CRLF) + Printer1.WriteString("Descuento: %" & NumberFormat2((100-((l_total.Text.Replace(",","")*100)/totaltotal)),0,2,2,False)& CRLF) + Printer1.WriteString("Monto descuento: %" & NumberFormat2((totaltotal-l_total.Text.Replace(",","")),0,2,2,False)& CRLF) + Printer1.WriteString("Total: $" & l_total.Text) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString("----ESTE TICKET NO ES UN -----" & CRLF) + Printer1.WriteString("--COMPROBANTE FISCAL, SOLO ES-" & CRLF) + Printer1.WriteString("--------INFORMATIVO-----------" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Sleep(1000) + Printer1.DisConnect + ProgressDialogHide +End Sub + + + +Private Sub l_telefono_LongClick As ResumableSub + Dim numeroTel As String = l_telefono.Text + + numeroTel = numeroTel.Replace(" ", "").Replace("-", "").Replace("(", "").Replace(")", "") + + If numeroTel.Length > 0 Then + Dim Intent1 As Intent + Intent1.Initialize("android.intent.action.DIAL", "tel:" & numeroTel) + StartActivity(Intent1) + Else + ToastMessageShow("Número no válido", False) + End If + + Return True +End Sub + +Private Sub HIST_LongClick + c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") +' DateTime.DateFormat = "MM/dd/yyyy" + DateTime.DateFormat = "dd/MM/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c.Close +' ProgressDialogShow("Imprimiendo, un momento ...") +' Printer1.DisConnect +' If Not(Printer1.IsConnected) Then + '' Log("Conectando a impresora ...") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) +' Sleep(1000) + '' Log("++++++ " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect 'Tratamos de reconectar +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' Else + '' Log("conectando 2") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) +' Sleep(1000) + '' Log("****** " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' End If + + ProgressDialogShow2("Imprimiendo, un momento ...",False) + Printer1.DisConnect + If Not(Printer1.IsConnected) Then +' If logger Then Log("conectando 1") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) + Sleep(1000) + cont = cont + 1 + If cont = 7 Then Printer1.Connect 'Tratamos de reconectar + If cont > 15 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + Else +' If logger Then Log("conectando 2") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) + Sleep(1000) + cont = cont + 1 + If cont = 2 Then Printer1.Connect + If cont > 4 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + End If + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + Dim Ticket As String = 0 + Dim c6 As Cursor = Starter.skmt.ExecQuery("select distinct HVD_NUM_TICKET FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + If c6.RowCount > 0 Then + c6.Position = 0 + Ticket = c6.GetString("HVD_NUM_TICKET") + End If + c6.Close + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Printer1.WriteString("Tienda: " & B4XPages.MainPage.cliente.La_nombre.Text & CRLF) + Printer1.WriteString("ID.Cliente: " & B4XPages.MainPage.cliente.la_cuenta.Text & CRLF) + Printer1.WriteString("Num. Ticket: " & Ticket & CRLF) + Printer1.WriteString("Fecha: " & sDate &" " & sTime & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + c = Starter.skmt.ExecQuery("SELECT * FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + If c.RowCount > 0 Then + Printer1.WriteString("------------Picking------------" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString("ESTE NO ES UN TICKET DE ENTREGA" & CRLF) + Printer1.WriteString("SOLO ES INFORMATIVO" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString(" " & CRLF) + + + + s=Starter.skmt.ExecQuery($"SELECT HVD_PRONOMBRE, SUM(HVD_CANT) AS HVD_CANT FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND HVD_PROID <> HVD_CODPROMO GROUP BY HVD_PRONOMBRE"$) + If S.RowCount>0 Then + For i=0 To S.RowCount -1 + S.Position=i + + + If s.GetString("HVD_CANT") > 0 Then +' + Printer1.Justify = 0 + + + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + Printer1.WriteString("Cantidad: " &(s.GetString("HVD_CANT")) & CRLF) + + Printer1.WriteString(" " & CRLF) + + End If + Next + End If + End If + Printer1.Justify = 0 + s.Close + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString("ESTE NO ES UN TICKET DE ENTREGA" & CRLF) + Printer1.WriteString("SOLO ES INFORMATIVO" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Sleep(1000) + Printer1.DisConnect + ProgressDialogHide +' Guardado +End Sub + + + +Private Sub b_acept_tp_Click + + If rb_efectivo.Checked Or rb_tranfe.Checked Or rb_Cheque.Checked Then + + If rb_efectivo.Checked Then + metopago = "EFECTIVO" + Else If rb_tranfe.Checked Then + metopago = "TRANSFERENCIA" + Else If rb_Cheque.Checked Then + metopago = "CHEQUE" + End If + Dim checaabono As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM ABONOS WHERE a_usuario = '${Subs.traeUsuarioDeBD}' AND a_ruta = '${Subs.traeRuta(Subs.traeCliente)}' AND a_cliente = '${Subs.traeCliente}' AND a_abono = '${NumberFormat2((l_total.Text.Replace(",","")-l_montopag.Text),0,2,2,False)}' AND a_tipoabono = '1' AND TIPO_PAGO = '${metopago}' AND a_ticket = '${NOTA}' and a_numpago = 1 "$$) + If checaabono.RowCount = 0 Then + Log(NumberFormat2((l_total.Text.Replace(",","")-l_montopag.Text),0,2,2,False)) + ToastMessageShow("Abono guardado", False) + + Starter.skmt.ExecNonQuery($"INSERT INTO ABONOS(a_usuario, a_ruta, a_cliente, a_abono, a_fecha,a_tipoabono,TIPO_PAGO,a_ticket,a_numpago) VALUES ('${Subs.traeUsuarioDeBD}', '${Subs.traeRuta(Subs.traeCliente)}', '${Subs.traeCliente}' ,'${NumberFormat2((l_total.Text.Replace(",","")-l_montopag.Text),0,2,2,False) }', '${Subs.fechaKMT(DateTime.now)}', 1,'${metopago}','${NOTA}',1)"$) +' Starter.skmt.ExecNonQuery($"INSERT INTO ABONOS(a_usuario, a_ruta, a_cliente, a_abono, a_fecha,a_tipoabono,TIPO_PAGO,a_ticket,a_numpago) VALUES ('${Subs.traeUsuarioDeBD}', '${Subs.traeRuta(Subs.traeCliente)}', '${Subs.traeCliente}' ,'${et_abono.text}', '${Subs.fechaKMT(DateTime.now)}', 1,'${itemselect}','${Folio}','${numpago}')"$) + ToastMessageShow("Abono guardado", False) + End If + + Starter.skmt.ExecNonQuery($"DELETE FROM PAGARES WHERE PA_CLIENTE IN (select cuenta from cuentaa)"$) + Starter.skmt.ExecNonQuery2("INSERT INTO PAGARES (PA_ALMACEN, PA_RUTA_REP, PA_RUTAPREV, PA_FECHA_PREV, PA_CAPTURA, PA_MONTO, PA_USUARIO, PA_CLIENTE,PA_TICKET) VALUES(?,?,?,?,?,?,?,?,?) ", Array As Object (almacen,rutarep,rutaprev,fechaprev,(sDate),l_total.Text.Replace(",",""),usuario,cuenta,NOTA)) + tipo_abonox = "abono" + banderaabono = 1 + banderaimp = 1 + p_tipopago.Visible = False + rb_efectivo.Checked = False + rb_tranfe.Checked = False + rb_Cheque.Checked = False + mandaAbonosPANUEPendientes + mandaAbonosPendientes + B_IMP_Click + Else + MsgboxAsync("Selecciona un metodo de pago valido","Atención") + End If + + +End Sub + +Private Sub b_cancel_tp_Click + p_tipopago.Visible = False + rb_efectivo.Checked = False + rb_tranfe.Checked = False + rb_Cheque.Checked = False +End Sub + +Private Sub p_tipopago_Click + +End Sub + +Sub mandaAbonosPendientes +' Log("--->>>> MANDAMOS ABONO MANDAPENDIENTES") +'' almacen = 99999999 +' Private ab As Cursor = Starter.skmt.ExecQuery($"SELECT * from ABONOS where a_enviado is null and a_tipoabono IS NULL"$) +' Log(ab.RowCount) +' If ab.RowCount > 0 Then +' For i=0 To ab.RowCount -1 +' ab.Position = i +' Dim ab1 As Cursor = Starter.skmt.ExecQuery($"SELECT a_abono from ABONOS where a_cliente = '${ab.GetString("a_cliente")}' and a_tipoabono IS NULL"$) +' ab1.Position = 0 +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "insert_abono_REP_GUNA_VN2" +' cmd.Parameters = Array As Object( ab.GetString("a_usuario"), ab.GetString("a_ruta"), ab.GetString("a_cliente"), NumberFormat2(ab.GetString("a_abono"),0,2,2,False), ab.GetString("a_fecha"), almacen, "REPARTO", Subs.traeRutaReparto, "", ab.GetString("TIPO_PAGO"), ab.GetString("a_ticket"), ab.GetString("a_numpago")) +' reqManager.ExecuteCommand(cmd , $"mandaAbonosPendientes_${ab.GetString("a_cliente")}"$) +' ab1.Close +' Log($"ins_abonosPendientes_${ab.GetString("a_cliente")}"$) +' Next +' End If +' ab.Close +End Sub + +Sub mandaAbonosPANUEPendientes +' Log("--->>>> MANDAMOS ABONO MANDAPENDIENTES") +'' almacen = 99999999 +' Private ab As Cursor = Starter.skmt.ExecQuery($"SELECT * from ABONOS where a_enviado is null and a_tipoabono IS NOT NULL"$) +' Log(ab.RowCount) +' If ab.RowCount > 0 Then +' For i=0 To ab.RowCount -1 +' ab.Position = i +' Dim ab1 As Cursor = Starter.skmt.ExecQuery($"SELECT a_abono from ABONOS where a_cliente = '${ab.GetString("a_cliente")}' and a_tipoabono IS NOT NULL"$) +' ab1.Position = 0 +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "insert_abono_REP_GUNA_VN2" +' cmd.Parameters = Array As Object( ab.GetString("a_usuario"), ab.GetString("a_ruta"), ab.GetString("a_cliente"), NumberFormat2(ab.GetString("a_abono"),0,2,2,False), ab.GetString("a_fecha"), almacen, "REPARTO", Subs.traeRutaReparto, "1", ab.GetString("TIPO_PAGO"), ab.GetString("a_ticket"), ab.GetString("a_numpago")) +' reqManager.ExecuteCommand(cmd , $"mandaAbonosPendientes_${ab.GetString("a_cliente")}"$) +' ab1.Close +' Log($"ins_abonosPendientes_${ab.GetString("a_cliente")}"$) +' Next +' End If +' ab.Close +End Sub + +Private Sub iv_comentario_Click + p_comentario.Visible = True + p_comentario.Width = Root.Width + p_comentario.Height = Root.Height + + + p_comentario.Visible = True + + Dim label1 As Label + label1 = lv_comentarios.SingleLineLayout.Label + label1.TextSize = 16 + label1.TextColor = Colors.White + + + + + label1.Typeface = Typeface.CreateNew(Typeface.DEFAULT_BOLD, Typeface.STYLE_BOLD) + + +' Subs.centraListView(lv_comentarios,Root.Width) + + Private c As Cursor = Starter.skmt.ExecQuery("select COMENTARTIO FROM COMENTARIOS WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + lv_comentarios.SingleLineLayout.Label.TextColor = Colors.BlacK + lv_comentarios.Clear + If c.RowCount > 0 Then + For i = 0 To c.RowCount - 1 + c.Position = i + Dim itemText As String + + itemText = $"${c.GetString("COMENTARTIO")}"$ + lv_comentarios.AddSingleLine(itemText) + + Next + Else + lv_comentarios.AddSingleLine("No hay datos disponibles.") + End If +' skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS COMENTARIOS (COMENTARTIO TEXT, CLIENTE TEXT, DESCARGADO TEXT)") +End Sub + +Private Sub b_cerarcom_Click + p_comentario.Visible =False +End Sub + +Private Sub b_agregarcom_Click + +End Sub + +Private Sub p_comentario_Click + +End Sub + +Private Sub b_acep_contado_Click + Starter.skmt.ExecNonQuery("DELETE FROM CONTADOS WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Dim foliocontado As String + Dim numticket As Cursor = Starter.skmt.ExecQuery("SELECT DISTINCT HVD_NUM_TICKET as HVD_NUM_TICKET FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND HVD_PROID <> 9999") + If numticket.RowCount = 1 Then + numticket.Position = 0 + foliocontado = numticket.GetString("HVD_NUM_TICKET") + Else + For gdfg = 0 To numticket.RowCount -1 + numticket.Position = gdfg + If foliocontado.Length = 0 Then + foliocontado = numticket.GetString("HVD_NUM_TICKET") + Else + foliocontado = foliocontado &","& numticket.GetString("HVD_NUM_TICKET") + End If + Next + End If + If et_cont_efectivo.Visible Then + If et_cont_transfe.Visible = True Then + If et_cont_cheque.Visible = True Then + If et_cont_efectivo.Text <> "" And et_cont_transfe.Text <> "" And et_cont_cheque.Text <> "" Then + If NumberFormat2((et_cont_efectivo.Text.Replace(",","") + et_cont_transfe.Text.Replace(",","") + et_cont_cheque.Text.Replace(",","")),0,2,2,False) = l_total.Text.Replace(",","") Then + '' aqui si insertar + Starter.skmt.ExecNonQuery($"INSERT INTO CONTADOS(RUTA_PREV, RUTA_REP, FECHA_PREV, FECHA, ALMACEN, NUM_TICKET, MONTO, METODO_PAGO, USUARIO, CLIENTE, NUM_PAGO) VALUES ('${Subs.traeRuta(Subs.traeCliente)}','${Subs.traeRutaReparto}','${Subs.traefECHAPREV}','${sDate}','${almacen}','${foliocontado}','${et_cont_efectivo.Text}','EFECTIVO','${Subs.traeUsuario}','${Subs.traeCliente}','1')"$) + Starter.skmt.ExecNonQuery($"INSERT INTO CONTADOS(RUTA_PREV, RUTA_REP, FECHA_PREV, FECHA, ALMACEN, NUM_TICKET, MONTO, METODO_PAGO, USUARIO, CLIENTE, NUM_PAGO) VALUES ('${Subs.traeRuta(Subs.traeCliente)}','${Subs.traeRutaReparto}','${Subs.traefECHAPREV}','${sDate}','${almacen}','${foliocontado}','${et_cont_transfe.Text}','TRANSFERENCIA','${Subs.traeUsuario}','${Subs.traeCliente}','2')"$) + Starter.skmt.ExecNonQuery($"INSERT INTO CONTADOS(RUTA_PREV, RUTA_REP, FECHA_PREV, FECHA, ALMACEN, NUM_TICKET, MONTO, METODO_PAGO, USUARIO, CLIENTE, NUM_PAGO) VALUES ('${Subs.traeRuta(Subs.traeCliente)}','${Subs.traeRutaReparto}','${Subs.traefECHAPREV}','${sDate}','${almacen}','${foliocontado}','${et_cont_cheque.Text}','CHEQUE','${Subs.traeUsuario}','${Subs.traeCliente}','3')"$) + p_contado.Visible= False + et_cont_transfe.Visible = False + et_cont_efectivo.Visible = False + et_cont_cheque.Visible = False + et_cont_transfe.Text = "" + et_cont_efectivo.Text = "" + et_cont_cheque.Text = "" + ch_cont_efectivo.Checked = False + ch_cont_transfe.Checked = False + ch_cont_cheque.Checked = False + B_IMP_Click + Else If NumberFormat2((et_cont_efectivo.Text.Replace(",","") + et_cont_transfe.Text.Replace(",","") + et_cont_cheque.Text.Replace(",","")),0,2,2,False) > l_total.Text.Replace(",","") Then + MsgboxAsync("El monto no puede ser mayor al total de la entrega","Atención") + Else If NumberFormat2((et_cont_efectivo.Text.Replace(",","") + et_cont_transfe.Text.Replace(",","") + et_cont_cheque.Text.Replace(",","")),0,2,2,False) < l_total.Text.Replace(",","") Then + MsgboxAsync("El monto no puede ser menor al total de la entrega","Atención") + End If + Else + Log(1) + MsgboxAsync("Coloque un monto de pago valido o desmarque la casilla","Atención") + End If + Else + If et_cont_efectivo.Text <> "" And et_cont_transfe.Text <> "" Then + If NumberFormat2((et_cont_efectivo.Text.Replace(",","") + et_cont_transfe.Text.Replace(",","")),0,2,2,False) = l_total.Text.Replace(",","") Then + '' aqui si insertar + Starter.skmt.ExecNonQuery($"INSERT INTO CONTADOS(RUTA_PREV, RUTA_REP, FECHA_PREV, FECHA, ALMACEN, NUM_TICKET, MONTO, METODO_PAGO, USUARIO, CLIENTE, NUM_PAGO) VALUES ('${Subs.traeRuta(Subs.traeCliente)}','${Subs.traeRutaReparto}','${Subs.traefECHAPREV}','${sDate}','${almacen}','${foliocontado}','${et_cont_efectivo.Text}','EFECTIVO','${Subs.traeUsuario}','${Subs.traeCliente}','1')"$) + Starter.skmt.ExecNonQuery($"INSERT INTO CONTADOS(RUTA_PREV, RUTA_REP, FECHA_PREV, FECHA, ALMACEN, NUM_TICKET, MONTO, METODO_PAGO, USUARIO, CLIENTE, NUM_PAGO) VALUES ('${Subs.traeRuta(Subs.traeCliente)}','${Subs.traeRutaReparto}','${Subs.traefECHAPREV}','${sDate}','${almacen}','${foliocontado}','${et_cont_transfe.Text}','TRANSFERENCIA','${Subs.traeUsuario}','${Subs.traeCliente}','2')"$) + p_contado.Visible= False + et_cont_transfe.Visible = False + et_cont_efectivo.Visible = False + et_cont_cheque.Visible = False + et_cont_transfe.Text = "" + et_cont_efectivo.Text = "" + et_cont_cheque.Text = "" + ch_cont_efectivo.Checked = False + ch_cont_transfe.Checked = False + ch_cont_cheque.Checked = False + B_IMP_Click + Else If NumberFormat2((et_cont_efectivo.Text.Replace(",","") + et_cont_transfe.Text.Replace(",","")),0,2,2,False) > l_total.Text.Replace(",","") Then + MsgboxAsync("El monto no puede ser mayor al total de la entrega","Atención") + Else If NumberFormat2((et_cont_efectivo.Text.Replace(",","") + et_cont_transfe.Text.Replace(",","")),0,2,2,False) < l_total.Text.Replace(",","") Then + MsgboxAsync("El monto no puede ser menor al total de la entrega","Atención") + End If + Else + Log(1) + MsgboxAsync("Coloque un monto de pago valido o desmarque la casilla","Atención") + End If + End If + Else + If et_cont_cheque.Visible = True Then + If et_cont_efectivo.Text <> "" And et_cont_cheque.Text <> "" Then + If NumberFormat2((et_cont_efectivo.Text.Replace(",","") + et_cont_cheque.Text.Replace(",","")),0,2,2,False) = l_total.Text.Replace(",","") Then + '' aqui si insertar + Starter.skmt.ExecNonQuery($"INSERT INTO CONTADOS(RUTA_PREV, RUTA_REP, FECHA_PREV, FECHA, ALMACEN, NUM_TICKET, MONTO, METODO_PAGO, USUARIO, CLIENTE, NUM_PAGO) VALUES ('${Subs.traeRuta(Subs.traeCliente)}','${Subs.traeRutaReparto}','${Subs.traefECHAPREV}','${sDate}','${almacen}','${foliocontado}','${et_cont_efectivo.Text}','EFECTIVO','${Subs.traeUsuario}','${Subs.traeCliente}','1')"$) + Starter.skmt.ExecNonQuery($"INSERT INTO CONTADOS(RUTA_PREV, RUTA_REP, FECHA_PREV, FECHA, ALMACEN, NUM_TICKET, MONTO, METODO_PAGO, USUARIO, CLIENTE, NUM_PAGO) VALUES ('${Subs.traeRuta(Subs.traeCliente)}','${Subs.traeRutaReparto}','${Subs.traefECHAPREV}','${sDate}','${almacen}','${foliocontado}','${et_cont_cheque.Text}','CHEQUE','${Subs.traeUsuario}','${Subs.traeCliente}','2')"$) + p_contado.Visible= False + et_cont_transfe.Visible = False + et_cont_efectivo.Visible = False + et_cont_cheque.Visible = False + et_cont_transfe.Text = "" + et_cont_efectivo.Text = "" + et_cont_cheque.Text = "" + ch_cont_efectivo.Checked = False + ch_cont_transfe.Checked = False + ch_cont_cheque.Checked = False + B_IMP_Click + Else If NumberFormat2((et_cont_efectivo.Text.Replace(",","") + et_cont_cheque.Text.Replace(",","")),0,2,2,False) > l_total.Text.Replace(",","") Then + MsgboxAsync("El monto no puede ser mayor al total de la entrega","Atención") + Else If NumberFormat2((et_cont_efectivo.Text.Replace(",","") + et_cont_cheque.Text.Replace(",","")),0,2,2,False) < l_total.Text.Replace(",","") Then + MsgboxAsync("El monto no puede ser menor al total de la entrega","Atención") + End If + Else + Log(1) + MsgboxAsync("Coloque un monto de pago valido o desmarque la casilla","Atención") + End If + Else + If et_cont_efectivo.Text <> "" Then + If NumberFormat2((et_cont_efectivo.Text.Replace(",","")),0,2,2,False) = l_total.Text.Replace(",","") Then + '' aqui si insertar + Starter.skmt.ExecNonQuery($"INSERT INTO CONTADOS(RUTA_PREV, RUTA_REP, FECHA_PREV, FECHA, ALMACEN, NUM_TICKET, MONTO, METODO_PAGO, USUARIO, CLIENTE, NUM_PAGO) VALUES ('${Subs.traeRuta(Subs.traeCliente)}','${Subs.traeRutaReparto}','${Subs.traefECHAPREV}','${sDate}','${almacen}','${foliocontado}','${et_cont_efectivo.Text}','EFECTIVO','${Subs.traeUsuario}','${Subs.traeCliente}','1')"$) + p_contado.Visible= False + et_cont_transfe.Visible = False + et_cont_efectivo.Visible = False + et_cont_cheque.Visible = False + et_cont_transfe.Text = "" + et_cont_efectivo.Text = "" + et_cont_cheque.Text = "" + ch_cont_efectivo.Checked = False + ch_cont_transfe.Checked = False + ch_cont_cheque.Checked = False + B_IMP_Click + Else If NumberFormat2((et_cont_efectivo.Text.Replace(",","")),0,2,2,False) > l_total.Text.Replace(",","") Then + MsgboxAsync("El monto no puede ser mayor al total de la entrega","Atención") + Else If NumberFormat2((et_cont_efectivo.Text.Replace(",","")),0,2,2,False) < l_total.Text.Replace(",","") Then + MsgboxAsync("El monto no puede ser menor al total de la entrega","Atención") + End If + Else + Log(1) + MsgboxAsync("Coloque un monto de pago valido o desmarque la casilla","Atención") + End If + End If + End If + Else If et_cont_efectivo.Visible = False Then + If et_cont_transfe.Visible = True Then + If et_cont_cheque.Visible = True Then + If et_cont_transfe.Text <> "" And et_cont_cheque.Text <> "" Then + If NumberFormat2((et_cont_transfe.Text.Replace(",","") + et_cont_cheque.Text.Replace(",","")),0,2,2,False) = l_total.Text.Replace(",","") Then + '' aqui si insertar + Starter.skmt.ExecNonQuery($"INSERT INTO CONTADOS(RUTA_PREV, RUTA_REP, FECHA_PREV, FECHA, ALMACEN, NUM_TICKET, MONTO, METODO_PAGO, USUARIO, CLIENTE, NUM_PAGO) VALUES ('${Subs.traeRuta(Subs.traeCliente)}','${Subs.traeRutaReparto}','${Subs.traefECHAPREV}','${sDate}','${almacen}','${foliocontado}','${et_cont_transfe.Text}','TRANSFERENCIA','${Subs.traeUsuario}','${Subs.traeCliente}','1')"$) + Starter.skmt.ExecNonQuery($"INSERT INTO CONTADOS(RUTA_PREV, RUTA_REP, FECHA_PREV, FECHA, ALMACEN, NUM_TICKET, MONTO, METODO_PAGO, USUARIO, CLIENTE, NUM_PAGO) VALUES ('${Subs.traeRuta(Subs.traeCliente)}','${Subs.traeRutaReparto}','${Subs.traefECHAPREV}','${sDate}','${almacen}','${foliocontado}','${et_cont_cheque.Text}','CHEQUE','${Subs.traeUsuario}','${Subs.traeCliente}','2')"$) + p_contado.Visible= False + et_cont_transfe.Visible = False + et_cont_efectivo.Visible = False + et_cont_cheque.Visible = False + et_cont_transfe.Text = "" + et_cont_efectivo.Text = "" + et_cont_cheque.Text = "" + ch_cont_efectivo.Checked = False + ch_cont_transfe.Checked = False + ch_cont_cheque.Checked = False + B_IMP_Click + Else If NumberFormat2((et_cont_transfe.Text.Replace(",","") + et_cont_cheque.Text.Replace(",","")),0,2,2,False) > l_total.Text.Replace(",","") Then + MsgboxAsync("El monto no puede ser mayor al total de la entrega","Atención") + Else If NumberFormat2((et_cont_transfe.Text.Replace(",","") + et_cont_cheque.Text.Replace(",","")),0,2,2,False) < l_total.Text.Replace(",","") Then + MsgboxAsync("El monto no puede ser menor al total de la entrega","Atención") + End If + Else + Log(1) + MsgboxAsync("Coloque un monto de pago valido o desmarque la casilla","Atención") + End If + Else + If et_cont_transfe.Text <> "" Then + If NumberFormat2((et_cont_transfe.Text.Replace(",","")),0,2,2,False) = l_total.Text.Replace(",","") Then + '' aqui si insertar + Starter.skmt.ExecNonQuery($"INSERT INTO CONTADOS(RUTA_PREV, RUTA_REP, FECHA_PREV, FECHA, ALMACEN, NUM_TICKET, MONTO, METODO_PAGO, USUARIO, CLIENTE, NUM_PAGO) VALUES ('${Subs.traeRuta(Subs.traeCliente)}','${Subs.traeRutaReparto}','${Subs.traefECHAPREV}','${sDate}','${almacen}','${foliocontado}','${et_cont_transfe.Text}','TRANSFERENCIA','${Subs.traeUsuario}','${Subs.traeCliente}','1')"$) + p_contado.Visible= False + et_cont_transfe.Visible = False + et_cont_efectivo.Visible = False + et_cont_cheque.Visible = False + et_cont_transfe.Text = "" + et_cont_efectivo.Text = "" + et_cont_cheque.Text = "" + ch_cont_efectivo.Checked = False + ch_cont_transfe.Checked = False + ch_cont_cheque.Checked = False + B_IMP_Click + Else If NumberFormat2((et_cont_transfe.Text.Replace(",","")),0,2,2,False) > l_total.Text.Replace(",","") Then + MsgboxAsync("El monto no puede ser mayor al total de la entrega","Atención") + Else If NumberFormat2((et_cont_transfe.Text.Replace(",","")),0,2,2,False) < l_total.Text.Replace(",","") Then + MsgboxAsync("El monto no puede ser menor al total de la entrega","Atención") + End If + Else + Log(1) + MsgboxAsync("Coloque un monto de pago valido o desmarque la casilla","Atención") + End If + End If + Else + If et_cont_cheque.Visible = True Then + If et_cont_cheque.Text <> "" Then + If NumberFormat2((et_cont_cheque.Text.Replace(",","")),0,2,2,False) = l_total.Text.Replace(",","") Then + '' aqui si insertar + Starter.skmt.ExecNonQuery($"INSERT INTO CONTADOS(RUTA_PREV, RUTA_REP, FECHA_PREV, FECHA, ALMACEN, NUM_TICKET, MONTO, METODO_PAGO, USUARIO, CLIENTE, NUM_PAGO) VALUES ('${Subs.traeRuta(Subs.traeCliente)}','${Subs.traeRutaReparto}','${Subs.traefECHAPREV}','${sDate}','${almacen}','${foliocontado}','${et_cont_cheque.Text}','CHEQUE','${Subs.traeUsuario}','${Subs.traeCliente}','1')"$) + p_contado.Visible= False + et_cont_transfe.Visible = False + et_cont_efectivo.Visible = False + et_cont_cheque.Visible = False + et_cont_transfe.Text = "" + et_cont_efectivo.Text = "" + et_cont_cheque.Text = "" + ch_cont_efectivo.Checked = False + ch_cont_transfe.Checked = False + ch_cont_cheque.Checked = False + B_IMP_Click + Else If NumberFormat2((et_cont_cheque.Text.Replace(",","")),0,2,2,False) > l_total.Text.Replace(",","") Then + MsgboxAsync("El monto no puede ser mayor al total de la entrega","Atención") + Else If NumberFormat2((et_cont_cheque.Text.Replace(",","")),0,2,2,False) < l_total.Text.Replace(",","") Then + MsgboxAsync("El monto no puede ser menor al total de la entrega","Atención") + End If + Else + Log(1) + MsgboxAsync("Coloque un monto de pago valido o desmarque la casilla","Atención") + End If + Else + MsgboxAsync("Seleccione al menos un metodo de pago","Atención") + End If + End If + End If +End Sub + +Private Sub b_cancel_contado_Click + p_contado.Visible = False + et_cont_transfe.Visible = False + et_cont_efectivo.Visible = False + et_cont_cheque.Visible = False + et_cont_transfe.Text = "" + et_cont_efectivo.Text = "" + et_cont_cheque.Text = "" + ch_cont_efectivo.Checked = False + ch_cont_transfe.Checked = False + ch_cont_cheque.Checked = False +End Sub + +Private Sub p_contado_Click + +End Sub + +Private Sub ch_cont_cheque_CheckedChange(Checked As Boolean) + If ch_cont_cheque.Checked Then + et_cont_cheque.Visible = True + Else + et_cont_cheque.Visible = False + et_cont_cheque.Text = "" + + End If +End Sub + +Private Sub ch_cont_transfe_CheckedChange(Checked As Boolean) + If ch_cont_transfe.Checked Then + et_cont_transfe.Visible = True + Else + et_cont_transfe.Visible = False + et_cont_transfe.Text = "" + End If +End Sub + +Private Sub ch_cont_efectivo_CheckedChange(Checked As Boolean) + If ch_cont_efectivo.Checked Then + et_cont_efectivo.Visible = True + et_cont_efectivo.Text = l_total.Text.Replace(",","") + Else + et_cont_efectivo.Visible = False + et_cont_efectivo.Text = "" + End If +End Sub + +Private Sub b_acepcodigo_Click + If et_codigo.Text <> "" Then + Dim c4 As Cursor = Starter.skmt.ExecQuery("SELECT IFNULL(CAT_CL_VCREDITO,0) AS CAT_CL_VCREDITO, IFNULL(CAT_CL_VCODIGO,0) AS CAT_CL_VCODIGO, IFNULL(CAT_CL_LIMITECREDITO,0) AS CAT_CL_LIMITECREDITO FROM kmt_info where CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + c4.Position = 0 + If c4.GetString("CAT_CL_VCODIGO") = et_codigo.Text Then + + p_codigo.Visible= False + et_codigo.Text = "" + + + Log(12) + escreditoono = 1 + limite_credito = c4.GetString("CAT_CL_LIMITECREDITO") + If l_total.Text <> ".00" Then + esPagoACreditoGuardamosPagare + End If + Else + + Dim c5 As Cursor = Starter.skmt.ExecQuery("SELECT IFNULL(CAT_CL_CORERROR,0) AS CAT_CL_CORERROR FROM CODIGO_CREDITO where CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + If c5.RowCount = 0 Then + + Dim cs As CSBuilder + cs.Initialize + + ' 1. Iniciamos el constructor y definimos el tamaño general más grande (ej. 20) + cs.Size(16).Append("Codigo incorrecto. intentos restantes: ") + + ' 2. Activamos Negrita (Bold) para el código + cs.Bold.Append("2").Pop ' .Pop cierra la negrita + + Starter.skmt.ExecNonQuery2("INSERT INTO CODIGO_CREDITO (CLIENTE, CAT_CL_CORERROR) VALUES(?,?) ", Array As Object (Subs.traeCliente,1)) + Log("aqui") + Msgbox2Async(cs,"Atención", "Ok", "", "", LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + End If + + + Else + c5.Position = 0 + If (c5.GetString("CAT_CL_CORERROR")+1) = 2 Then + Dim cs As CSBuilder + cs.Initialize + + ' 1. Iniciamos el constructor y definimos el tamaño general más grande (ej. 20) + cs.Size(16).Append("Codigo incorrecto. intentos restantes: ") + + ' 2. Activamos Negrita (Bold) para el código + cs.Bold.Append("1").Pop ' .Pop cierra la negrita + Log("aqui") + Starter.skmt.ExecNonQuery($"update CODIGO_CREDITO set CAT_CL_CORERROR = '${NumberFormat2((c5.GetString("CAT_CL_CORERROR")+1),0,2,2,False)}'"$) + + Msgbox2Async(cs,"Atención", "Ok", "", "", LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + End If + + Else If (c5.GetString("CAT_CL_CORERROR")+1) = 3 Then + Dim cs As CSBuilder + cs.Initialize + + ' 1. Iniciamos el constructor y definimos el tamaño general más grande (ej. 20) + cs.Size(16).Append("Codigo incorrecto. intentos restantes: ") + + ' 2. Activamos Negrita (Bold) para el código + cs.Bold.Append("0").Pop ' .Pop cierra la negrita + + ' 3. Continuamos con el texto normal y cerramos todo + cs.Append(", la entrega sera a contado").PopAll + + Log("aqui") + Starter.skmt.ExecNonQuery($"update CODIGO_CREDITO set CAT_CL_CORERROR = '${NumberFormat2((c5.GetString("CAT_CL_CORERROR")+1),0,2,2,False)}'"$) + Msgbox2Async(cs,"Atención", "Ok", "", "", LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + p_codigo.Visible = False + et_codigo.Text = "" + End If + + End If + + End If + + End If + Else + MsgboxAsync("Captura un codigo valido.","Atención") + End If +End Sub + +Private Sub b_cancelcodigo_Click + p_codigo.Visible= False + et_codigo.Text = "" +End Sub + +Private Sub p_codigo_Click + +End Sub + + + +Private Sub b_imprimesegun_LongClick + Subs.panelVisible(p_transFinDia, 0, 0) +End Sub + +Private Sub p_transFinDia_Click + +End Sub + +Private Sub b_aceptarFD_Click + If et_passFinDia.Text <> "KMTS1BAT" Then + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_codigoAutorizacion_IMP_rep" + cmd.Parameters = Array As Object(et_passFinDia.Text.Trim, Subs.traeRutaReparto, Subs.traeAlmacen) + reqManager.ExecuteQuery(cmd , 0, "codigoAutorizacionimp") + Else + Starter.skmt.ExecNonQuery("UPDATE CAT_VARIABLES SET CAT_VA_VALOR = '' where CAT_VA_DESCRIPCION = 'FINDIA_FECHA'") + p_transFinDia.Visible = False + et_passFinDia.Text = "" + End If + teclado.HideKeyboard +End Sub + +Private Sub b_cancelarFD_Click + p_transFinDia.Visible = False +End Sub + +Sub imp + + c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + + c.Position=0 + + usuario = c.GetString("USUARIO") + + DateTime.DateFormat = "MM/dd/yyyy" + DateTime.TimeFormat="HHmmss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=Starter.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c.Close + d = Starter.skmt.ExecQuery("SELECT RUTAA FROM RUTAA") + d.Position = 0 + Dim ruta As String = d.GetString("RUTAA") + d.Close + d = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + d.Position = 0 + Dim rutapre As String = d.GetString("CAT_CL_RUTA") + d.Close + +' d = Starter.skmt.ExecQuery("SELECT HVD_FECHA FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") +' d.Position = 0 + Dim fechaprev As String = Subs.traefECHAPREV +' d.Close + + Dim rutaactualizar As String + Dim rut As Cursor = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If rut.RowCount > 0 Then + rut.Position = 0 + rutaactualizar = rut.GetString("CAT_CL_RUTA") + End If + + Starter.skmt.ExecNonQuery($"DELETE FROM NOVENTA WHERE NV_CLIENTE IN (select cuenta from cuentaa)"$) + Starter.skmt.ExecNonQuery2("INSERT INTO NOVENTA (NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON,NV_RUTA) VALUES(?,?,?,?,?,?,?,?) ", Array As Object (Subs.traeCliente,sDate &" "& sTime, usuario, "ENTREGA","ENTREGA COMPLETA", B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,rutaactualizar)) + Starter.skmt.ExecNonQuery2("INSERT INTO REPARTO_GEO (CLIENTE, USUARIO, FECHA_PUNTEO, LATITUD, LONGITUD, ALMACEN, RUTA_REPARTO, RUTA_PREV, FECHA_PREVENTA, TIPO,ENVIO) VALUES(?,?,?,?,?,?,?,?,?,?,0)",Array As String (la_cuenta.Text, usuario, sDate &" "&sTime, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,B4XPages.MainPage.almacen,ruta,rutapre,fechaprev, "ENTREGADO")) + Starter.skmt.ExecNonQuery($"UPDATE kmt_info set gestion = 2, HORAENT = '${sDate & " " & sTime}' where CAT_CL_CODIGO In (select cuenta from cuentaa) and CAT_CL_RUTA = '${rutaactualizar}' "$) + Starter.skmt.ExecNonQuery("update HIST_VENTAS SET HVD_ESTATUS = 1 WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + + ' DateTime.DateFormat = "MM/dd/yyyy" + + DateTime.DateFormat = "dd/MM/yyyy" + + sDate=DateTime.Date(DateTime.Now) + + sTime=DateTime.Time(DateTime.Now) + + c.Close + + ' ProgressDialogShow("Imprimiendo, un momento ...") + + ' Printer1.DisConnect + + ' If Not(Printer1.IsConnected) Then + + '' Log("Conectando a impresora ...") + + ' Printer1.Connect + + ' Private cont As Int = 0 + + ' Do While Not(impresoraConectada) + + ' Sleep(1000) + + '' Log("++++++ " & cont) + + ' cont = cont + 1 + + ' If cont = 2 Then Printer1.Connect 'Tratamos de reconectar + + ' If cont > 3 Then impresoraConectada = True + + ' Loop + + ' Sleep(500) + + ' impresoraConectada = False + + ' Else + + '' Log("conectando 2") + + ' Printer1.Connect + + ' Private cont As Int = 0 + + ' Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) + + ' Sleep(1000) + + '' Log("****** " & cont) + + ' cont = cont + 1 + + ' If cont = 2 Then Printer1.Connect + + ' If cont > 3 Then impresoraConectada = True + + ' Loop + + ' Sleep(500) + + ' impresoraConectada = False + + ' End If + + + + ProgressDialogShow2("Imprimiendo, un momento ...",False) + + Printer1.DisConnect + + If Not(Printer1.IsConnected) Then + + ' If logger Then Log("conectando 1") + + Printer1.Connect + + Private cont As Int = 0 + + Do While Not(impresoraConectada) + + Sleep(1000) + + cont = cont + 1 + + If cont = 7 Then Printer1.Connect 'Tratamos de reconectar + + If cont > 15 Then impresoraConectada = True + + Loop + + Sleep(500) + + impresoraConectada = False + + Else + + ' If logger Then Log("conectando 2") + + Printer1.Connect + + Private cont As Int = 0 + + Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) + + Sleep(1000) + + cont = cont + 1 + + If cont = 7 Then Printer1.Connect + + If cont > 15 Then impresoraConectada = True + + Loop + + Sleep(500) + + impresoraConectada = False + + End If + + + TAMANO = 0 + + ESPACIO = 28 + + BLANCO = " " + + Dim bmp As Bitmap + + bmp.InitializeResize(File.DirAssets, "logo-guna-18.jpg", 192, 192, True) 'ignore + + Dim myimage As AnImage = Printer1.ImageToBWIMage(bmp) + + myimage = Printer1.DitherImage2D(myimage, 128) + + myimage= Printer1.PackImage(myimage) + + Printer1.WriteString(CRLF) ' nudge the printer to show the user something is happening + + Printer1.WriteString(Printer1.REVERSE) + + Printer1.PrintImage(myimage) + + Printer1.WriteString(Printer1.UNREVERSE) + + ' Dim Ticket As String = 0 + + ' Dim c6 As Cursor = Starter.skmt.ExecQuery("select distinct HVD_NUM_TICKET FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + + ' If c6.RowCount > 0 Then + + ' c6.Position = 0 + + ' Ticket = c6.GetString("HVD_NUM_TICKET") + + ' End If + + ' c6.Close + + Dim telefono As String = "" + + Dim c7 As Cursor = Starter.skmt.ExecQuery("select IFNULL(CAT_CL_TELEFONO,' ') AS CAT_CL_TELEFONO FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + + If c7.RowCount > 0 Then + + c7.Position = 0 + + telefono = c7.GetString("CAT_CL_TELEFONO") + + End If + + c7.Close + + DateTime.DateFormat = "dd/MM/yyyy" + + Printer1.WriteString("DISTRIBUIDORA ROCHA TULA PACHUCA" & CRLF) + + Printer1.WriteString(sDate & CRLF) + + Printer1.WriteString(sTime & CRLF) + + Printer1.WriteString("Reparto:" & usuario & CRLF) + + Printer1.WriteString("Ruta:" & Subs.traeRutaReparto & CRLF) + + Printer1.WriteString("Ruta preventa:" & Subs.traerUTAPREV & CRLF) + + Printer1.WriteString("Tienda: " & La_nombre.Text & CRLF) + + Printer1.WriteString("ID.Cliente: " & la_cuenta.Text & CRLF) + + Printer1.WriteString("Calle: " & la_Calle.Text & CRLF) + + Printer1.WriteString("Colonia: " & la_col.Text & CRLF) + + Printer1.WriteString("Telefono: " & telefono & CRLF) + + + Dim Ticket As String = 0 + + Dim c6 As Cursor = Starter.skmt.ExecQuery("select distinct HVD_NUM_TICKET FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + + If c6.RowCount > 0 Then + + For k = 0 To c6.RowCount -1 + + c6.Position = k + + Ticket = c6.GetString("HVD_NUM_TICKET") + + Printer1.WriteString("Num. Ticket " & (k +1)&": " & Ticket & CRLF) + + Next + + End If + + c6.Close + + + + Printer1.WriteString(" " & CRLF) + + c = Starter.skmt.ExecQuery("SELECT * FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + + + Dim totaltotal As Double + Dim cobranza As Cursor = Starter.skmt.ExecQuery("SELECT * FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA) and HVD_PRONOMBRE = 'Cobranza Pendiente'") + + Dim restacobranza As Int = 0 + + If cobranza.RowCount > 0 Then + + restacobranza = 1 + + End If + + Dim credtio As Cursor= Starter.skmt.ExecQuery("SELECT * FROM PAGARES WHERE PA_CLIENTE IN (SELECT CUENTA FROM CUENTAA) ") + If credtio.RowCount > 0 Then + Tipoentrega = "CREDITO" + Printer1.WriteString("-------ENTREGA A "& Tipoentrega &"------" & CRLF) + Else If credtio.RowCount = 0 Then + Tipoentrega = "CONTADO" + Printer1.WriteString("-------ENTREGA A "& Tipoentrega &"------" & CRLF) + End If + + If c.RowCount > 0 Then + + ' aqui es donde esta el pedo de julieta de los descuentos quitar el precio2 pero meter un if para saber si es ruta especial o es normal o que show. ''CAT_TIPO_BONIFICACIONES + + ' s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, HVD_CANT, length(HVD_CANT) as L_CANT, HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID, HVD_CODPROMO,IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) and (HVD_CODPROMO <> 'MI RETO' or HVD_CODPROMO <> 'MI RETO' or HVD_CODPROMO <> 'MI RETO') AND (HVD_COSTO_TOT/HVD_CANT) > 0.01 order by HVD_PROID"$) + + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) and (HVD_CODPROMO <> 'MIRETO' or HVD_CODPROMO <> 'SOCIOBAT' or HVD_CODPROMO <> 'BIGCOMMERCE') AND HVD_CODPROMO = '${Subs.traeAlmacen}' AND (HVD_COSTO_TOT/HVD_CANT) > 0.01 GROUP by HVD_PROID"$) + + If S.RowCount>0 Then + + + + + ' Printer1.WriteString("--------------------------------" & CRLF) + + Printer1.WriteString("Cant. Precio Importe" & CRLF) + + Printer1.WriteString("------------------------------" & CRLF) + + For i=0 To S.RowCount -1 + + S.Position=i + +' Log(s.GetString("HVD_RECHAZO")) + + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then + + If s.GetInt("HVD_RECHAZO") = 0 Then + + Printer1.Justify = 0 + + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + + Dim punit As String = NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) + + TAMANO = punit.Length + TAMANO + + ' Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) + + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + + TAMANO = ptot.Length + TAMANO + + ESPACIO = (ESPACIO - TAMANO)/2 + + ' Log(ESPACIO) + + For E=0 To ESPACIO -1 + + BLANCO = " " & BLANCO + + Next + + Printer1.Justify = 0 + + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + + Printer1.Justify = 1 + + Printer1.WriteString( punit & BLANCO) + + Printer1.Justify = 2 + + Printer1.WriteString( ptot & CRLF ) + + TAMANO = 0 + + ESPACIO = 28 + + BLANCO = " " + + Else If s.GetInt("HVD_RECHAZO") > 0 Then + + Printer1.Justify = 0 + + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + + Private vc5 As Cursor = Starter.skmt.ExecQuery($"select iFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + + vc5.Position = 0 + + Dim punit As String = NumberFormat2((vc5.GetString("CAT_GP_PRECIO")),0,2,2,False) + + TAMANO = punit.Length + TAMANO + + vc5.Close + + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + + TAMANO = ptot.Length + TAMANO + + ESPACIO = (ESPACIO - TAMANO)/2 + + ' Log(ESPACIO) + + For E=0 To ESPACIO -1 + + BLANCO = " " & BLANCO + + Next + + Printer1.Justify = 0 + + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + + Printer1.Justify = 1 + + Printer1.WriteString( punit & BLANCO) + + Printer1.Justify = 2 + + Printer1.WriteString(ptot& CRLF ) + + TAMANO = 0 + + ESPACIO = 28 + + BLANCO = " " + + Printer1.Justify = 0 + + End If + + End If + + Next + + End If + + End If + + Printer1.Justify = 0 + + s.Close + + Printer1.WriteString(" " & CRLF) + + + + ' s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, HVD_CANT, length(HVD_CANT) as L_CANT, HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID, HVD_CODPROMO,IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_RECHAZO = 0 AND HVD_CODPROMO <> '${Subs.traeAlmacen}' order by HVD_CODPROMO, ESPROMO DESC, HVD_PROID"$) + + s=Starter.skmt.ExecQuery($"SELECT HVD_CODPROMO, HVD_PRONOMBRE, SUM(HVD_CANT) AS HVD_CANT, LENGTH(SUM(HVD_CANT)) AS L_CANT, SUM(HVD_COSTO_TOT) AS HVD_COSTO_TOT, LENGTH(SUM(HVD_COSTO_TOT)) AS L_COSTOU, HVD_PROID, SUM(IFNULL(HVD_RECHAZOCANT, 0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM cuentaa) AND HVD_CODPROMO <> HVD_PROID AND HVD_CODPROMO NOT IN ('SOCIOBAT', 'MIRETO', 'BIGCOMMERCE') AND HVD_PRONOMBRE <> 'Cobranza Pendiente' AND HVD_CODPROMO <> '${Subs.traeAlmacen}' GROUP BY HVD_PROID, HVD_CODPROMO"$) + + + + + If S.RowCount>0 Then + + Printer1.WriteString("------- BONIFICACIONES --------" & CRLF) + + Printer1.WriteString("Cant. Precio Importe" & CRLF) + + Printer1.WriteString("------------------------------" & CRLF) + + For i=0 To S.RowCount -1 + + S.Position=i + + + + + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then +' If s.GetString("HVD_CODPROMO") <> Subs.traeAlmacen Then + Printer1.Justify = 0 +' If s.GetString("HVD_CODPROMO") = s.GetString("HVD_PROID") Then + '' Printer1.WriteString("* "&s.GetString("HVD_PRONOMBRE") & CRLF) +' +' Else + + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + + Dim punit As String =NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) + TAMANO = punit.Length + TAMANO + Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) + TAMANO = ptot.Length + TAMANO +3 + ESPACIO = (ESPACIO - TAMANO)/2 + Log(ESPACIO) + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( punit & BLANCO) + Printer1.Justify = 2 + Printer1.WriteString(ptot & CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + + TAMANO = 0 + ESPACIO = 29 + BLANCO = " " + Printer1.Justify = 0 + totaltotal = totaltotal + (checaprecio.GETSTRING("CAT_GP_PRECIO") * s.GetString("HVD_CANT")) +' End If +' Else +' End If + End If + + + Next + + End If + + + ' Printer1.WriteString(" " & CRLF) + + ' s=Starter.skmt.ExecQuery($"select PE_PRONOMBRE, PE_CANT, length(PE_CANT) as L_CANT, PE_COSTO_TOT, length(PE_COSTO_TOT) as L_COSTOU,PE_PROID FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) order BY PE_PROID"$) + + ' + + ' If S.RowCount>0 Then + + ' Printer1.WriteString("-----------VENTA------------" & CRLF) + + ' Printer1.WriteString("Cant. Precio Importe" & CRLF) + + ' Printer1.WriteString("------------------------------" & CRLF) + + ' + + ' For i=0 To S.RowCount -1 + + ' S.Position=i + + ' + + ' Printer1.Justify = 0 + + ' Printer1.WriteString(s.GetString("PE_PRONOMBRE") & CRLF) + + ' Dim punit As String =NumberFormat2( (s.GETSTRING("PE_COSTO_TOT")/s.GetString("PE_CANT")),0,2,2,False) + + ' TAMANO = punit.Length + TAMANO + + ' Private ptot As String = NumberFormat2((punit*s.GetString("PE_CANT")),0,2,2,False) + + ' TAMANO = ptot.Length + TAMANO + + ' ESPACIO = (ESPACIO - TAMANO)/2 + + ' Log(ESPACIO) + + ' For E=0 To ESPACIO -1 + + ' BLANCO = " " & BLANCO + + ' Next + + ' Printer1.Justify = 0 + + ' Printer1.WriteString( s.GetString("PE_CANT") & BLANCO) + + ' Printer1.Justify = 1 + + ' Printer1.WriteString( punit & BLANCO) + + ' Printer1.Justify = 2 + + ' Printer1.WriteString(ptot & CRLF ) + + ' TAMANO = 0 + + ' ESPACIO = 29 + + ' BLANCO = " " + + ' Printer1.Justify = 0 + + ' Next + + ' End If + + Printer1.WriteString(" " & CRLF) + + + + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_CODPROMO = 'MIRETO' GROUP by HVD_PROID"$) + + If S.RowCount>0 Then + + Printer1.WriteString("----------- MI RETO ------------" & CRLF) + + ' Printer1.WriteString("--------------------------------" & CRLF) + + Printer1.WriteString("Cant. Precio Importe" & CRLF) + + Printer1.WriteString("------------------------------" & CRLF) + + For i=0 To S.RowCount -1 + + S.Position=i + + Log(s.GetString("HVD_RECHAZO")) + + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then + + If s.GetInt("HVD_RECHAZO") = 0 Then + + Printer1.Justify = 0 + + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + + Dim punit As String = NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) + + TAMANO = punit.Length + TAMANO + + ' Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) + + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + + TAMANO = ptot.Length + TAMANO + + ESPACIO = (ESPACIO - TAMANO)/2 + + ' Log(ESPACIO) + + For E=0 To ESPACIO -1 + + BLANCO = " " & BLANCO + + Next + + Printer1.Justify = 0 + + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + + Printer1.Justify = 1 + + Printer1.WriteString( punit & BLANCO) + + Printer1.Justify = 2 + + Printer1.WriteString( ptot & CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + + TAMANO = 0 + + ESPACIO = 28 + + BLANCO = " " + + Else If s.GetInt("HVD_RECHAZO") > 0 Then + + Printer1.Justify = 0 + + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + + Private vc5 As Cursor = Starter.skmt.ExecQuery($"select iFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + + vc5.Position = 0 + + Dim punit As String = NumberFormat2((vc5.GetString("CAT_GP_PRECIO")),0,2,2,False) + + TAMANO = punit.Length + TAMANO + + vc5.Close + + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + + TAMANO = ptot.Length + TAMANO + + ESPACIO = (ESPACIO - TAMANO)/2 + + ' Log(ESPACIO) + + For E=0 To ESPACIO -1 + + BLANCO = " " & BLANCO + + Next + + Printer1.Justify = 0 + + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + + Printer1.Justify = 1 + + Printer1.WriteString( punit & BLANCO) + + Printer1.Justify = 2 + + Printer1.WriteString(ptot& CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + + TAMANO = 0 + + ESPACIO = 28 + + BLANCO = " " + + Printer1.Justify = 0 + + End If + + End If + + Next + + End If + + Printer1.Justify = 0 + + s.Close + + + Printer1.WriteString(" " & CRLF) + + + + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_CODPROMO = 'BIGCOMMERCE' GROUP by HVD_PROID"$) + + ' s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_CODPROMO = 'SOCIOBAT' GROUP by HVD_PROID"$) + + If S.RowCount>0 Then + + Printer1.WriteString("---------- CONECTADOS ----------" & CRLF) + + ' Printer1.WriteString("--------------------------------" & CRLF) + + Printer1.WriteString("Cant. Precio Importe" & CRLF) + + Printer1.WriteString("------------------------------" & CRLF) + + For i=0 To S.RowCount -1 + + S.Position=i + + Log(s.GetString("HVD_RECHAZO")) + + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then + + If s.GetInt("HVD_RECHAZO") = 0 Then + + Printer1.Justify = 0 + + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + + Dim punit As String = NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) + + TAMANO = punit.Length + TAMANO + + ' Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) + + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + + TAMANO = ptot.Length + TAMANO + + ESPACIO = (ESPACIO - TAMANO)/2 + + ' Log(ESPACIO) + + For E=0 To ESPACIO -1 + + BLANCO = " " & BLANCO + + Next + + Printer1.Justify = 0 + + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + + Printer1.Justify = 1 + + Printer1.WriteString( punit & BLANCO) + + Printer1.Justify = 2 + + Printer1.WriteString( ptot & CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + + TAMANO = 0 + + ESPACIO = 28 + + BLANCO = " " + + Else If s.GetInt("HVD_RECHAZO") > 0 Then + + Printer1.Justify = 0 + + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + + Private vc5 As Cursor = Starter.skmt.ExecQuery($"select iFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + + vc5.Position = 0 + + Dim punit As String = NumberFormat2((vc5.GetString("CAT_GP_PRECIO")),0,2,2,False) + + TAMANO = punit.Length + TAMANO + + vc5.Close + + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + + TAMANO = ptot.Length + TAMANO + + ESPACIO = (ESPACIO - TAMANO)/2 + + ' Log(ESPACIO) + + For E=0 To ESPACIO -1 + + BLANCO = " " & BLANCO + + Next + + Printer1.Justify = 0 + + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + + Printer1.Justify = 1 + + Printer1.WriteString( punit & BLANCO) + + Printer1.Justify = 2 + + Printer1.WriteString(ptot& CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + + TAMANO = 0 + + ESPACIO = 28 + + BLANCO = " " + + Printer1.Justify = 0 + + End If + + End If + + Next + + End If + + Printer1.Justify = 0 + + s.Close + + + ' s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_CODPROMO = 'CONECTADOS' GROUP by HVD_PROID"$) + + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, sum(HVD_CANT) as HVD_CANT, length(HVD_CANT) as L_CANT, sum(HVD_COSTO_TOT) as HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID,SUM(IFNULL(HVD_RECHAZOCANT,0)) AS HVD_RECHAZOCANT, SUM(HVD_RECHAZO) AS HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_CODPROMO = 'SOCIOBAT' GROUP by HVD_PROID"$) + + If S.RowCount>0 Then + + Printer1.WriteString("---------- SOCIO BAT ----------" & CRLF) + + ' Printer1.WriteString("--------------------------------" & CRLF) + + Printer1.WriteString("Cant. Precio Importe" & CRLF) + + Printer1.WriteString("------------------------------" & CRLF) + + For i=0 To S.RowCount -1 + + S.Position=i + + Log(s.GetString("HVD_RECHAZO")) + + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then + + If s.GetInt("HVD_RECHAZO") = 0 Then + + Printer1.Justify = 0 + + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + + Dim punit As String = NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) + + TAMANO = punit.Length + TAMANO + + ' Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) + + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + + TAMANO = ptot.Length + TAMANO + + ESPACIO = (ESPACIO - TAMANO)/2 + + ' Log(ESPACIO) + + For E=0 To ESPACIO -1 + + BLANCO = " " & BLANCO + + Next + + Printer1.Justify = 0 + + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + + Printer1.Justify = 1 + + Printer1.WriteString( punit & BLANCO) + + Printer1.Justify = 2 + + Printer1.WriteString( ptot & CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + + TAMANO = 0 + + ESPACIO = 28 + + BLANCO = " " + + Else If s.GetInt("HVD_RECHAZO") > 0 Then + + Printer1.Justify = 0 + + Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + + Private vc5 As Cursor = Starter.skmt.ExecQuery($"select iFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + + vc5.Position = 0 + + Dim punit As String = NumberFormat2((vc5.GetString("CAT_GP_PRECIO")),0,2,2,False) + + TAMANO = punit.Length + TAMANO + + vc5.Close + + Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) + + TAMANO = ptot.Length + TAMANO + + ESPACIO = (ESPACIO - TAMANO)/2 + + ' Log(ESPACIO) + + For E=0 To ESPACIO -1 + + BLANCO = " " & BLANCO + + Next + + Printer1.Justify = 0 + + Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) + + Printer1.Justify = 1 + + Printer1.WriteString( punit & BLANCO) + + Printer1.Justify = 2 + + Printer1.WriteString(ptot& CRLF ) + Printer1.WriteString(CRLF) + Printer1.Justify = 1 + + + + Dim checaprecio As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) + If checaprecio.RowCount > 0 Then + checaprecio.Position = 0 + If checaprecio.GETSTRING("CAT_GP_PRECIO") <> punit Then + Dim descuento As Double = NumberFormat2((100-(punit*100)/checaprecio.GETSTRING("CAT_GP_PRECIO")),0,2,2,False) + + Printer1.WriteString(BLANCO & "PL $" & checaprecio.GETSTRING("CAT_GP_PRECIO") & " Desc.: " & descuento &"%" & CRLF & CRLF) + + End If + End If + + TAMANO = 0 + + ESPACIO = 28 + + BLANCO = " " + + Printer1.Justify = 0 + + End If + + End If + + Next + + End If + + Printer1.Justify = 0 + + s.Close + + + + + Printer1.WriteString(" " & CRLF) + + + + + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString("Subtotal: $" & NumberFormat2(totaltotal,0,2,2,False)& CRLF) + Printer1.WriteString("Total Articulos: " & (L_CANT.Text.Replace(",","") -restacobranza) & CRLF) + Printer1.WriteString("Descuento: %" & NumberFormat2((100-((l_total.Text.Replace(",","")*100)/totaltotal)),0,2,2,False)& CRLF) + Printer1.WriteString("Monto descuento: %" & NumberFormat2((totaltotal-l_total.Text.Replace(",","")),0,2,2,False)& CRLF) + Printer1.WriteString("Total: $" & l_total.Text) + + Printer1.WriteString(" " & CRLF) + + + If almacen = "81" Then + + Printer1.WriteString("Telefono de atencion:" & CRLF) + + Printer1.WriteString("" & CRLF) + + End If + + + Printer1.WriteString("------------------------------" & CRLF) + + Printer1.WriteString("----ESTE TICKET NO ES UN -----" & CRLF) + + Printer1.WriteString("--COMPROBANTE FISCAL, SOLO ES-" & CRLF) + + Printer1.WriteString("--------INFORMATIVO-----------" & CRLF) + + Printer1.WriteString("------------------------------" & CRLF) + + + + Printer1.WriteString(" " & CRLF) + + Printer1.WriteString(" " & CRLF) + + Printer1.WriteString(" " & CRLF) + + Sleep(1000) + + Printer1.DisConnect + + ProgressDialogHide + +' If banderaimp = 1 Then + + Msgbox2Async("Deseas imprimir de nuevo el ticket?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + + Wait For Msgbox_Result (resultado As Int) + + If resultado = DialogResponse.POSITIVE Then + + imp + + Else + + If Tipoentrega = "CREDITO" Then + + imprime_pagare2 + + + End If + + End If + + ' printer.Flush + + ' printer.Close + +' Else If banderaimp = 0 Then + ' +' Msgbox2Async("Deseas imprimir de nuevo el ticket?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + ' +' Wait For Msgbox_Result (resultado As Int) + ' +' If resultado = DialogResponse.POSITIVE Then + ' +' B_IMP_Click + ' +' End If + ' +' End If + + ' Guardado + +End Sub + +Sub imprime_pagare2 + c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") +' DateTime.DateFormat = "MM/dd/yyyy" + DateTime.DateFormat = "dd/MM/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c.Close +' ProgressDialogShow("Imprimiendo, un momento ...") +' Printer1.DisConnect +' If Not(Printer1.IsConnected) Then + '' Log("Conectando a impresora ...") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) +' Sleep(1000) + '' Log("++++++ " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect 'Tratamos de reconectar +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' Else + '' Log("conectando 2") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) +' Sleep(1000) + '' Log("****** " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' End If + + ProgressDialogShow2("Imprimiendo, un momento ...",False) + Printer1.DisConnect + If Not(Printer1.IsConnected) Then +' If logger Then Log("conectando 1") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) + Sleep(1000) + cont = cont + 1 + If cont = 7 Then Printer1.Connect 'Tratamos de reconectar + If cont > 15 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + Else +' If logger Then Log("conectando 2") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) + Sleep(1000) + cont = cont + 1 + If cont = 2 Then Printer1.Connect + If cont > 4 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + End If + + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + + Dim telefono As String = "" + Dim c7 As Cursor = Starter.skmt.ExecQuery("select IFNULL(CAT_CL_TELEFONO,' ') AS CAT_CL_TELEFONO FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If c7.RowCount > 0 Then + c7.Position = 0 + telefono = c7.GetString("CAT_CL_TELEFONO") + End If + c7.Close + + Dim bmp As Bitmap + bmp.InitializeResize(File.DirAssets, "logo-guna-18.jpg", 192, 192, True) 'ignore + Dim myimage As AnImage = Printer1.ImageToBWIMage(bmp) + myimage = Printer1.DitherImage2D(myimage, 128) + myimage= Printer1.PackImage(myimage) + Printer1.WriteString(CRLF) ' nudge the printer to show the user something is happening + Printer1.WriteString(Printer1.REVERSE) + Printer1.PrintImage(myimage) + Printer1.WriteString(Printer1.UNREVERSE) + +' Dim Ticket As String = 0 +' Dim c6 As Cursor = Starter.skmt.ExecQuery("select distinct HVD_NUM_TICKET FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") +' If c6.RowCount > 0 Then +' c6.Position = 0 +' Ticket = c6.GetString("HVD_NUM_TICKET") +' End If +' c6.Close + + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Printer1.WriteString("DISTRIBUIDORA ROCHA TULA PACHUCA" & CRLF) + Printer1.WriteString(sDate & CRLF) + Printer1.WriteString(sTime & CRLF) + Printer1.WriteString("Reparto:" & usuario & CRLF) + Printer1.WriteString("Ruta:" & Subs.traeRutaReparto & CRLF) + Printer1.WriteString("Ruta preventa:" & Subs.traerUTAPREV & CRLF) + Printer1.WriteString("Tienda: " & La_nombre.Text & CRLF) + Printer1.WriteString("ID.Cliente: " & la_cuenta.Text & CRLF) + Printer1.WriteString("Calle: " & la_Calle.Text & CRLF) + Printer1.WriteString("Colonia: " & la_col.Text & CRLF) + Printer1.WriteString("Telefono: " & telefono & CRLF) + Dim Ticket As String = 0 + Dim c6 As Cursor = Starter.skmt.ExecQuery("select distinct HVD_NUM_TICKET FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND HVD_PRONOMBRE <> 'Cobranza Pendiente'") + If c6.RowCount > 0 Then + For k = 0 To c6.RowCount -1 + c6.Position = k + Ticket = c6.GetString("HVD_NUM_TICKET") + Printer1.WriteString("Num. Ticket " & (k +1)&": " & Ticket & CRLF) + Next + End If + c6.Close + Printer1.WriteString("Fecha: " & sDate &" " & sTime & CRLF) + Printer1.WriteString(" " & CRLF) + c = Starter.skmt.ExecQuery("SELECT * FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + If c.RowCount > 0 Then + Printer1.WriteString("------------PAGARE------------" & CRLF) + Printer1.WriteString("" & CRLF) + Printer1.WriteString("Pagare por los articulos" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + ' aqui es donde esta el pedo de julieta de los descuentos quitar el precio2 pero meter un if para saber si es ruta especial o es normal o que show. + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, HVD_CANT, length(HVD_CANT) as L_CANT, HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID, HVD_CODPROMO,IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) order by HVD_PROID"$) + If S.RowCount>0 Then + For i=0 To S.RowCount -1 + S.Position=i + Log(s.GetString("HVD_RECHAZO")) + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then + If s.GetString("HVD_CODPROMO") = Subs.traeAlmacen Then + Printer1.Justify = 0 + Printer1.WriteString((s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") ) &" "&s.GetString("HVD_PRONOMBRE") & CRLF) +' Dim punit As String = NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) +' TAMANO = punit.Length + TAMANO + ' + '' Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) +' Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) +' TAMANO = ptot.Length + TAMANO +' +' ESPACIO = (ESPACIO - TAMANO)/2 + '' Log(ESPACIO) +' For E=0 To ESPACIO -1 +' BLANCO = " " & BLANCO +' Next +' Printer1.Justify = 0 +' Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) +' Printer1.Justify = 1 +' Printer1.WriteString( punit & BLANCO) +' Printer1.Justify = 2 +' Printer1.WriteString( ptot & CRLF ) +' TAMANO = 0 +' ESPACIO = 29 +' BLANCO = " " + Else If s.GetString("HVD_RECHAZO") = 1 Then + Printer1.Justify = 0 + Printer1.WriteString((s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) &" "&s.GetString("HVD_PRONOMBRE") & CRLF) + +' Private vc5 As Cursor = Starter.skmt.ExecQuery($"select iFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) +' vc5.Position = 0 +' Dim punit As String = NumberFormat2((vc5.GetString("CAT_GP_PRECIO")),0,2,2,False) +' TAMANO = punit.Length + TAMANO +' vc5.Close +' +' Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) +' TAMANO = ptot.Length + TAMANO +' +' ESPACIO = (ESPACIO - TAMANO)/2 + '' Log(ESPACIO) +' For E=0 To ESPACIO -1 +' BLANCO = " " & BLANCO +' Next +' Printer1.Justify = 0 +' Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) +' Printer1.Justify = 1 +' Printer1.WriteString( punit & BLANCO) +' Printer1.Justify = 2 +' Printer1.WriteString(ptot& CRLF ) +' TAMANO = 0 +' ESPACIO = 29 +' BLANCO = " " + Printer1.Justify = 0 + End If + End If + Next + End If + End If + Printer1.Justify = 0 + s.Close + Printer1.WriteString(" " & CRLF) + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, HVD_CANT, length(HVD_CANT) as L_CANT, HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID, HVD_CODPROMO,IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_RECHAZO = 0 and HVD_PRONOMBRE <> 'Cobranza Pendiente' AND HVD_CODPROMO <> '${Subs.traeAlmacen}' order by HVD_CODPROMO, ESPROMO DESC, HVD_PROID"$) + If S.RowCount>0 Then + Printer1.WriteString("-------PROMOS ENTREGA--------" & CRLF) + Printer1.WriteString("Cant. Precio Importe" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + For i=0 To S.RowCount -1 + S.Position=i + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then + If s.GetString("HVD_CODPROMO") <> Subs.traeAlmacen Then + Printer1.Justify = 0 + If s.GetString("HVD_CODPROMO") = s.GetString("HVD_PROID") Then +' Printer1.WriteString("* "&s.GetString("HVD_PRONOMBRE") & CRLF) + Else + If s.GetString("HVD_PRONOMBRE") <> "Cobranza Pendiente" Then +' Printer1.WriteString(s.GetString("HVD_PRONOMBRE") & CRLF) + Printer1.WriteString((s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") ) &" "&s.GetString("HVD_PRONOMBRE") & CRLF) + End If + End If +' Dim punit As String =NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) +' TAMANO = punit.Length + TAMANO +' Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) +' TAMANO = ptot.Length + TAMANO +' ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) +' For E=0 To ESPACIO -1 +' BLANCO = " " & BLANCO +' Next +' Printer1.Justify = 0 +' Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) +' Printer1.Justify = 1 +' Printer1.WriteString( punit & BLANCO) +' Printer1.Justify = 2 +' Printer1.WriteString(ptot & CRLF ) +' TAMANO = 0 +' ESPACIO = 29 +' BLANCO = " " + Printer1.Justify = 0 + Else + End If + End If + Next + End If + + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("Por monto de $" &l_total.Text& CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("Debo(mos) y pagare(mos) incon" & CRLF) + Printer1.WriteString("dicionalmente en _____________" & CRLF) + Printer1.WriteString("o en el lugar donde se me " & CRLF) + Printer1.WriteString("requiera por el presente pagare" & CRLF) + Printer1.WriteString("a GUNA la cantidad de $"&l_total.Text & CRLF) + Printer1.WriteString("valor recibido a entera " & CRLF) + Printer1.WriteString("satisfaccion. La falta de pago" & CRLF) + Printer1.WriteString("a la fecha indicada causara " & CRLF) + Printer1.WriteString("intereses moratorios a razon " & CRLF) + Printer1.WriteString("de ______% mensual a la fecha." & CRLF) + Printer1.WriteString("" & CRLF) + Printer1.WriteString("" & CRLF) + Printer1.WriteString(" Recibi " & CRLF) + Printer1.WriteString("" & CRLF) + Printer1.WriteString("" & CRLF) + Printer1.WriteString("______________________________" & CRLF) + + + DateTime.DateFormat = "ddMMyyyy" + sDate=DateTime.Date(DateTime.Now) +' Printer1.WriteString("JHGHGH " & CRLF) + + + + + + '' codigo de barras +' ImageView1.Bitmap = barcode.CODE128(notaabono&sDate&tipopagotick&numpago) + '' codigo de qr + B4XImageView1.SetBitmap(qr.Create(la_cuenta.Text&sDate)) + + + Dim Dirp As String = File.DirInternal + Dim Dir As String + Dim Dir2 As String + Try + File.MakeDir(Dirp,"/md") + Dir = "/md" + 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 + + '' codigo de barras +' Dim Out As OutputStream +' Out = File.OpenOutput(File.DirInternal & Dir & Dir2, "Test.png", False) +' barcode.CODE128(la_cuenta.Text&sDate).WriteToStream(Out, 100, "PNG") +' Out.Close + + '' codigo de qr + Dim Out As OutputStream + Out = File.OpenOutput(File.DirInternal & Dir & Dir2, "qr.png", False) + qr.Create(la_cuenta.Text&sDate).WriteToStream(Out, 100, "PNG") + Out.Close + + + + + + Dim bmp2 As Bitmap + bmp2.InitializeResize(File.DirInternal & Dir & Dir2, "qr.png", 192, 192, True) 'ignore +' bmp.Initialize(File.DirInternal & Dir & Dir2, "qr.png") 'ignore + Dim myimage2 As AnImage = Printer1.ImageToBWIMage(bmp2) + myimage2 = Printer1.DitherImage2D(myimage2, 128) + myimage2= Printer1.PackImage(myimage2) + Printer1.WriteString(CRLF) ' nudge the printer to show the user something is happening + Printer1.WriteString(Printer1.REVERSE) + Printer1.PrintImage(myimage2) + Printer1.WriteString(Printer1.UNREVERSE) + +' Printer1.WriteBarCode("I",la_cuenta.Text&sDate) + + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Sleep(1000) + Printer1.DisConnect + ProgressDialogHide +' If banderaimp = 1 Then + + Msgbox2Async("Deseas imprimir de nuevo el PAGARE?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + imprime_pagare2 + Else If resultado = DialogResponse.NEGATIVE Then + Log(Tipoentrega) + If Tipoentrega = "CREDITO" Then + Log("aQUI") + If l_total.Text.Replace(",","") > l_montopag.Text Then + Log("aQUI") + tipo_abonox = "abono" + imprime_abonopagare3 + End If + End If + End If +' printer.Flush + ' printer.Close +' Else If banderaimp = 0 Then +' Msgbox2Async("Deseas imprimir de nuevo el PAGARE?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) +' Wait For Msgbox_Result (resultado As Int) +' If resultado = DialogResponse.POSITIVE Then +' imprime_pagare +' End If +' End If +' Guardado +End Sub + + +Sub imprime_abonopagare3 + c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") +' DateTime.DateFormat = "MM/dd/yyyy" + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c.Close +' ProgressDialogShow("Imprimiendo, un momento ...") +' Printer1.DisConnect +' If Not(Printer1.IsConnected) Then +' Log("Conectando a impresora ...") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) +' Sleep(1000) +' Log("++++++ " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect 'Tratamos de reconectar +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' Else +' Log("conectando 2") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) +' Sleep(1000) +' Log("****** " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' End If + + ProgressDialogShow2("Imprimiendo, un momento ...",False) + Printer1.DisConnect + If Not(Printer1.IsConnected) Then +' If logger Then Log("conectando 1") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) + Sleep(1000) + cont = cont + 1 + If cont = 7 Then Printer1.Connect 'Tratamos de reconectar + If cont > 15 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + Else +' If logger Then Log("conectando 2") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) + Sleep(1000) + cont = cont + 1 + If cont = 2 Then Printer1.Connect + If cont > 4 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + End If + TAMANO = 0 + ESPACIO = 22 + BLANCO = " " + + + Dim bmp As Bitmap + bmp.InitializeResize(File.DirAssets, "logo-guna-18.jpg", 192, 192, True) 'ignore + Dim myimage As AnImage = Printer1.ImageToBWIMage(bmp) + myimage = Printer1.DitherImage2D(myimage, 128) + myimage= Printer1.PackImage(myimage) + Printer1.WriteString(CRLF) ' nudge the printer to show the user something is happening + Printer1.WriteString(Printer1.REVERSE) + Printer1.PrintImage(myimage) + Printer1.WriteString(Printer1.UNREVERSE) + Dim telefono As String = "" + Dim c7 As Cursor = Starter.skmt.ExecQuery("select IFNULL(CAT_CL_TELEFONO,' ') AS CAT_CL_TELEFONO FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If c7.RowCount > 0 Then + c7.Position = 0 + telefono = c7.GetString("CAT_CL_TELEFONO") + End If + c7.Close + + + + Printer1.WriteString("DISTRIBUIDORA ROCHA TULA PACHUCA" & CRLF) +' Printer1.WriteString(sucursal & CRLF) + Printer1.WriteString(sDate & CRLF) + Printer1.WriteString(sTime & CRLF) + Printer1.WriteString("Reparto:" & usuario & CRLF) + Printer1.WriteString("Ruta:" & Subs.traeRutaReparto & CRLF) + Printer1.WriteString("Ruta preventa:" & Subs.traerUTAPREV & CRLF) + Printer1.WriteString("Tienda: " & La_nombre.Text & CRLF) + Printer1.WriteString("ID.Cliente: " & la_cuenta.Text & CRLF) + Printer1.WriteString("Calle: " & la_Calle.Text & CRLF) + Printer1.WriteString("Colonia: " & la_col.Text & CRLF) + Printer1.WriteString("Telefono: " & telefono & CRLF) + Printer1.WriteString(" " & CRLF) + Dim notaabono As String + Dim saldopendiente As Double + Dim saldopendiente2 As Double + + If tipo_abonox = "abono" Then + + + c = Starter.skmt.ExecQuery($"select distinct hvd_num_ticket from hist_ventas where hvd_cliente = '${la_cuenta.Text}' and HVD_PRONOMBRE <> 'Cobranza Pendiente' "$) + If c.RowCount > 0 Then + c.Position = 0 + notaabono = c.GetString("HVD_NUM_TICKET") + End If + c.Close + + c = Starter.skmt.ExecQuery($"select iFNULL(sum(PA_MONTO),0) AS SALDO_PENDIENTE from PAGARES where PA_CLIENTE = '${la_cuenta.Text}'"$) + If c.RowCount > 0 Then + c.Position = 0 + saldopendiente = c.GetDouble("SALDO_PENDIENTE") + Log(c.GetString("SALDO_PENDIENTE")) + End If + c.Close + + + Dim saldopendiente1 As Double = 0 + Dim TIPOPAGO As String = "" + Dim c4 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(SUM(a_abono),0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is not null") + If c4.RowCount > 0 Then + c4.Position = 0 + Dim c5 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(a_abono,0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is not null") + saldopendiente1 = c4.GetDouble("SALDO_PENDIENTE") + + End If + c4.Close + + Else If tipo_abonox = "cxc" Then + c = Starter.skmt.ExecQuery("SELECT NOTA, SUM(SALDO_PENDIENTE) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + If c.RowCount > 0 Then + c.Position = 0 + notaabono = c.GetString("NOTA") + saldopendiente = c.GetDouble("SALDO_PENDIENTE") + End If + c.Close + + Dim saldopendiente1 As Double = 0 + Dim c4 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(SUM(a_abono),0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null") + If c4.RowCount > 0 Then + c4.Position = 0 + Dim c5 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(a_abono,0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null") + saldopendiente1 = c4.GetDouble("SALDO_PENDIENTE") + End If + c4.Close + + + c = Starter.skmt.ExecQuery2("SELECT SUM(SALDO_PENDIENTE) AS SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND NOTA = ?",Array As String(Folio)) + If c.RowCount > 0 Then + c.Position = 0 + saldopendiente2 = c.GetDouble("SALDO_PENDIENTE") + End If + c.Close + + Dim saldopendiente3 As Double = 0 + Dim c4 As Cursor= Starter.skmt.ExecQuery2("SELECT Ifnull(SUM(a_abono),0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null AND a_ticket = ?",Array As String(Folio)) + If c4.RowCount > 0 Then + c4.Position = 0 +' Dim c5 As Cursor= Starter.skmt.ExecQuery("SELECT Ifnull(a_abono,0) AS SALDO_PENDIENTE FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is null") + saldopendiente3 = c4.GetDouble("SALDO_PENDIENTE") + End If + c4.Close + + End If + Dim numpago As Int = 1 + + + Dim TIPOPAGO As String = "" + Dim c8 As Cursor= Starter.skmt.ExecQuery("SELECT TIPO_PAGO FROM ABONOS WHERE a_cliente IN (SELECT CUENTA FROM CUENTAA) and a_tipoabono is not null and a_numpago = '1'") + Log(c8.RowCount) + If c8.RowCount > 0 Then + Log("SI ENTRE") + c8.Position = 0 + Log(c8.GetString("TIPO_PAGO")) + TIPOPAGO = c8.GetString("TIPO_PAGO") + + + End If + c8.Close + + + + Dim tipopagotick As String = "" + If TIPOPAGO.ToUpperCase = "TRANSFERENCIA" Then + tipopagotick = "T" + Else If TIPOPAGO.ToUpperCase = "EFECTIVO" Then + tipopagotick = "E" + Else If TIPOPAGO.ToUpperCase = "CHEQUE" Then + tipopagotick = "C" + End If + + '' codigo de barras +' ImageView1.Bitmap = barcode.CODE128(notaabono&sDate&tipopagotick&numpago) + '' codigo de qr + B4XImageView1.SetBitmap(qr.Create(notaabono&sDate&tipopagotick&numpago)) + + + Dim Dirp As String = File.DirInternal + Dim Dir As String + Dim Dir2 As String + Try + File.MakeDir(Dirp,"/md") + Dir = "/md" + 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 + + '' codigo de barras +' Dim Out As OutputStream +' Out = File.OpenOutput(File.DirInternal & Dir & Dir2, "Test.png", False) +' barcode.CODE128(notaabono&sDate&tipopagotick&numpago).WriteToStream(Out, 100, "PNG") +' Out.Close + + '' codigo de qr + Dim Out As OutputStream + Out = File.OpenOutput(File.DirInternal & Dir & Dir2, "qr.png", False) + qr.Create(notaabono&sDate&tipopagotick&numpago).WriteToStream(Out, 100, "PNG") + Out.Close + + + +' c = Starter.skmt.ExecQuery("SELECT NOTA FROM ABONOSP WHERE CLIENTE IN (SELECT CUENTA FROM CUENTAA)") +' If c.RowCount > 0 Then +' c.Position = 0 +' notaabono = c.GetString("NOTA") +' End If + + Log(notaabono) + Log(et_abono.Text) + Printer1.WriteString("Comprobante de pago del pagare" & CRLF) + Printer1.WriteString("Folio: " & notaabono &"-"&(numpago)& CRLF) + Printer1.WriteString("Monto deuda: " & (NumberFormat2(l_total.Text.Replace(",",""),0,2,2,False)) & CRLF) + Printer1.WriteString("Monto abono: " & (NumberFormat2((l_total.Text.Replace(",","")-l_montopag.Text),0,2,2,False)) & CRLF) + Printer1.WriteString("Tipo de pago: " & TIPOPAGO & CRLF) + Printer1.WriteString("Restante "¬aabono&": " &(NumberFormat(l_montopag.Text,0,2)) & CRLF) + Printer1.WriteString("Fecha Abono: " & sDate & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString("-------------FIRMA------------" & CRLF) + + DateTime.DateFormat = "ddMMyyyy" + sDate=DateTime.Date(DateTime.Now) + itemselect = "EFECTIVO" + +' Items.Add("TRANSFERENCIA") +' Items.Add("EFECTIVO") +' Items.Add("CHEQUE") + + + + + +' Dim bmp As Bitmap + '' bmp.InitializeResize(File.DirAssets, "logo-guna-18.jpg", 192, 192, True) 'ignore + + Dim bmp2 As Bitmap + bmp2.InitializeResize(File.DirInternal & Dir & Dir2, "qr.png", 192, 192, True) 'ignore +' bmp.Initialize(File.DirInternal & Dir & Dir2, "qr.png") 'ignore + Dim myimage2 As AnImage = Printer1.ImageToBWIMage(bmp2) + myimage2 = Printer1.DitherImage2D(myimage2, 128) + myimage2= Printer1.PackImage(myimage2) + Printer1.WriteString(CRLF) ' nudge the printer to show the user something is happening + Printer1.WriteString(Printer1.REVERSE) + Printer1.PrintImage(myimage2) + Printer1.WriteString(Printer1.UNREVERSE) + + +' Printer1.WriteBarCode("I",NOTA&sDate&tipopagotick&numpago) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Sleep(1000) + Printer1.DisConnect + ProgressDialogHide + + +' Msgbox2Async("Deseas imprimir de nuevo el ticket?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) +' +' Wait For Msgbox_Result (resultado As Int) +' If resultado = DialogResponse.POSITIVE Then +' imprime_abonopagare +' Else +' p_abono.Visible = False +' Starter.skmt.ExecNonQuery($"INSERT INTO ABONOS(a_usuario, a_ruta, a_cliente, a_abono, a_fecha,a_tipoabono,TIPO_PAGO,a_ticket,a_numpago) VALUES ('${Subs.traeUsuarioDeBD}', '${Subs.traeRuta(Subs.traeCliente)}', '${Subs.traeCliente}' ,'${NumberFormat2((l_total.Text.Replace(",","")-limite_credito),0,2,2,False) }', '${Subs.fechaKMT(DateTime.now)}', 1,'${itemselect}','${Folio}','${numpago}')"$) +' ToastMessageShow("Abono guardado", False) +' End If + +' If banderaimp = 1 Then +' Msgbox2Async("Deseas imprimir de nuevo el abono?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) +' Wait For Msgbox_Result (resultado As Int) +' If resultado = DialogResponse.POSITIVE Then +' imprime_abonopagare2 +' Else +' Guardado +' End If + '' printer.Flush +' ' printer.Close +' Else If banderaimp = 0 Then + Msgbox2Async("Deseas imprimir de nuevo el abono?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + tipo_abonox = "abono" + imprime_abonopagare3 + + End If +' End If + +' mandaAbonosPANUEPendientes + +End Sub \ No newline at end of file diff --git a/B4A/C_Clientes.bas b/B4A/C_Clientes.bas new file mode 100644 index 0000000..07f9ce0 --- /dev/null +++ b/B4A/C_Clientes.bas @@ -0,0 +1,850 @@ +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 + Dim q_buscar As String +' Dim skmt As SQL + Dim entro As String + Dim c As Cursor + Dim c2 As Cursor + Dim ListView1 As ListView +' Dim gest As Button + Dim lfila As Label + Dim busca As EditText + Private p_colonia As Panel +' Dim distList As List +' Dim distMap As Map + Dim laRuta As String + Private b_GetDirs As Button + Private distOrderedMap, clientesMapaO As B4XOrderedMap + Private img_getDirs As ImageView + Private l_rutaInfo As Label + Private b_getRutaInfo As Button + Private conMapa As Boolean = False + Dim listaWayPoints As List + Dim lv1Top As String + Private b_limpiarRuta As Button + Dim rutaGenerada As Boolean = False + Dim rutaacambiar As String + Dim mostrarProgressDialog As Boolean + Private nombrecliente As Label + Private numerocliente As Label + Private p_datosclie As Panel + Private CREDITO As Label + Private cxc As Label + Private direccion As Label + Dim d As Cursor + + Private CustomListView1 As CustomListView +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + Root.LoadLayout("clientes") + entro ="2" + lv1Top = ListView1.Top + clientesMapaO.Initialize + Starter.skmt.ExecNonQuery("delete from waypoints") + Log("Coordenadas del almacen: " & Starter.cedisLocation.Longitude & "," & Starter.cedisLocation.Latitude) +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub B4XPage_Appear + busca.Text = "" + b_GetDirs.Visible = False +' skmt.Initialize(Starter.ruta,"kmt.db", True) + entro ="2" + ' esto es para rutas se quito por colonia + 'SE COMENTA EL SIGUIENTE CODIGO PARA QUE TODAS LAS TIENDAS APAREZCAN. + 'c=skmt.ExecQuery("select CAT_CL_COLONIA, count(*) as cuantos from kmt_info where gestion = 0 group by CAT_CL_COLONIA order by CAT_CL_COLONIA asc") + p_colonia.Width = Root.Width + p_colonia.Height = Root.Height + p_colonia.Top = 0 + p_colonia.Left = 0 + Subs.centraListView(ListView1, p_colonia.Width) + ListView1.Height = p_colonia.Height * 0.75 + Subs.SetDivider(ListView1, Colors.White, 2) + If Not(l_rutaInfo.Visible) Then + ListView1.Top = lv1Top + Else + ListView1.Top = lv1Top + 100 + End If + + Starter.skmt.ExecNonQuery("delete from HIST_VENTAS WHERE HVD_CANT = 0") + c=Starter.skmt.ExecQuery("select distinct codigo, indice, CAT_CL_NOMBRE, CAT_CL_CALLE, CAT_CL_NOEXT from waypoints inner join kmt_info on waypoints.codigo = kmt_info.CAT_CL_CODIGO where gestion = 0 AND CAT_CL_RUTA <> 1000 order by indice") + + + + +' d = Starter.skmt.ExecQuery($"select IFNULL(CAT_CL_BCREDITO,0) AS CAT_CL_BCREDITO FROM kmt_info WHERE CAT_CL_CODIGO = '${c.GetString("CAT_CL_CODIGO")}'"$) +'' LogColor(d.RowCount,Colors.Blue) +' If d.RowCount > 0 Then +' d.Position = 0 +' If d.GetString("CAT_CL_BCREDITO") = "1" Then +' CREDITO.Visible = False +' Else +' CREDITO.Visible = False +' End If +' d.Close +' Else +' CREDITO.Visible = False +' End If + + + If c.RowCount > 0 Then 'Ya hay waypoints en la base de datos + c.Position = 0 +' Log("Ya hay waypoints.") + conMapa = True +' Private t1 As Map + ListView1.Clear + Dim cs, cs2 As CSBuilder + entro = 3 +' Log("Generamos ListView1 en Activity_Resume") + For i=0 To c.RowCount -1 'Generamos el listView con la lista ordenada. + c.Position=i + cs.Initialize + cs2.Initialize +' t1 = Starter.waypointsOrdered.Get(k) +' c.GetString("codigo") +' Log(c.GetString("indice")) + d = Starter.skmt.ExecQuery($"select CLIENTE FROM ABONOSP WHERE CLIENTE = '${c.GetString("codigo")}'"$) + If d.RowCount = 0 Then +' cxc.Visible = False + ListView1.AddTwoLines(cs.Color(Colors.RGB(100,149,237)).Append(c.GetString("codigo")).PopAll, cs2.append(c.GetString("CAT_CL_NOMBRE")).Color(Colors.RGB(100,149,237)).Append(" Calle: ").Pop.Append(c.GetString("CAT_CL_CALLE").Trim & " " & c.GetString("CAT_CL_NOEXT")).PopAll ) + Else +' cxc.Visible = False + ListView1.AddTwoLines(cs.Color(Colors.RGB(100,149,237)).Append(c.GetString("codigo")&" CXC").PopAll, cs2.append(c.GetString("CAT_CL_NOMBRE")).Color(Colors.RGB(100,149,237)).Append(" Calle: ").Pop.Append(c.GetString("CAT_CL_CALLE").Trim & " " & c.GetString("CAT_CL_NOEXT")).PopAll ) + + End If + + Next + Else + generaListViewRutas + End If + c.Close + p_colonia.Width = Root.Width + p_colonia.Height = Root.Height + Subs.centraEtiqueta(l_rutaInfo, Root.Width) + Subs.centraListView(ListView1, p_colonia.Width) + ListView1.Height = p_colonia.Height * 0.70 + Subs.centraEtiqueta(lfila, Root.Width + (b_getRutaInfo.Width / 2)) + b_getRutaInfo.Visible = True + b_getRutaInfo.BringToFront + If Starter.cedisLocation.Latitude = "0" Then + Private x As Cursor = Starter.skmt.ExecQuery("select * from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'COORDS_ALMACEN'") + If x.RowCount > 0 Then + x.Position = 0 + Private y() As String + Starter.cedisLocation.Latitude = Regex.Split(",", x.GetString("CAT_VA_VALOR"))(1) + Starter.cedisLocation.Longitude = Regex.Split(",", x.GetString("CAT_VA_VALOR"))(0) + End If + End If + Log(Starter.cedisLocation) + If mostrarProgressDialog = True Then + ProgressDialogShow2("Calculando distancia y tiempo, un momento por favor.", False) + mostrarProgressDialog = False + End If +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub + ' BACK key pressed + 'Return True to close, False to cancel + Log(entro) + If rutaGenerada Or entro = 3 Then ' Si ya generamos el ruteo o entramos a una de las rutas, nos regresamos! + b_limpiarRuta_Click + l_rutaInfo.Text = "" + rutaGenerada = False + else if entro = 2 Then ' Si estamos mostrando las rutas, nos regresamos a la principal. + B4XPages.ShowPage("Principal") + End If + Return False +End Sub + +Sub ListView1_ItemClick (Position As Int, Value As Object) +' Log($"Entro= ${entro}"$) + Log(Value) + Dim sValue As String = Value + Log(sValue.Replace("cxc","")) + ListView1.Clear + Sleep(50) + Subs.SetDivider(ListView1, Colors.White, 2) + If Not(l_rutaInfo.Visible) Then + ListView1.Top = lv1Top + Else + ListView1.Top = lv1Top + 100 + End If + l_rutaInfo.Visible = False + b_GetDirs.Visible = False + If entro = "2" Then +' b_GetDirs.Visible = True +' img_getDirs.Visible = True +' b_getRutaInfo.Visible = False + Private lrt As String + lrt = sValue.Replace("cxc","") + laRuta = lrt.SubString(6) 'Quitamos el texto "Ruta: " para obtener el numero de la ruta. + Log($"Original: ${sValue.Replace("cxc","")} - Mod: |${lrt.SubString(6)}| - laRuta: ${laRuta}"$) + rutaacambiar = laRuta + c2 = Starter.skmt.ExecQuery2("select distinct CAT_CL_NOMBRE, CAT_CL_CALLE, CAT_CL_CODIGO, CAT_CL_LAT, CAT_CL_LONG from kmt_info where CAT_CL_RUTA = ? and gestion = 0 AND CAT_CL_RUTA <> 1000 order by CAT_CL_NOMBRE ", Array As String(laRuta)) + Private thisLoc As Location + Private label1 As Label + Private label2 As Label + label1 = ListView1.TwoLinesLayout.Label + label1.TextSize = 20 + label1.TextColor = Colors.White + label1.Typeface = Typeface.CreateNew(Typeface.DEFAULT_BOLD, Typeface.STYLE_BOLD) + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 20 + label2.Typeface = Typeface.CreateNew(Typeface.DEFAULT_BOLD, Typeface.STYLE_BOLD) + label2.TextColor = Colors.White + label2.Height = 77dip + thisLoc.Initialize + If entro = 2 Then ListView1.TwoLinesLayout.ItemHeight = 120dip + lfila.text = "Nombre y Calle" + distOrderedMap.Initialize + If c2.RowCount > 0 Then + For i = 0 To c2.RowCount -1 'Generamos mapa de clientes + c2.Position = i + thisLoc.Latitude = c2.GetString("CAT_CL_LAT") + thisLoc.Longitude = c2.GetString("CAT_CL_LONG") +' Log(Tracker.UUGCoords) + Private distancia As Int = Tracker.UUGCoords.DistanceTo(thisLoc) 'Calculamos la distancia de la posicion ACTUAL a la tienda. + Private esteCliente As Map = CreateMap("distancia": distancia, "ubicacion": thisLoc.Longitude&","&thisLoc.Latitude, "codigo": c2.GetString("CAT_CL_CODIGO"), "nomDirDist": $"${c2.GetString("CAT_CL_NOMBRE")} CALLE: ${c2.GetString("CAT_CL_CALLE")} ${CRLF}Distancia: $1.1{(distancia/1000)} kms"$) + distOrderedMap.Put(distancia, esteCliente) + Next + distOrderedMap.Keys.Sort(True) 'Ordenamos la mapa de clientes por distancia. + ListView1.Clear + Private m1 As Map + For Each k As Object In distOrderedMap.Keys 'Generamos el listView con el mapa ordenada. + m1 = distOrderedMap.Get(k) + m1.Get("codigo") +' Log(m1.Get("nomDirDist")) + + d = Starter.skmt.ExecQuery($"select CLIENTE FROM ABONOSP WHERE CLIENTE = '${m1.Get("codigo")}'"$) + If d.RowCount = 0 Then +' cxc.Visible = False + ListView1.AddTwoLines(m1.Get("codigo"), m1.Get("nomDirDist")) + Else +' cxc.Visible = False + ListView1.AddTwoLines(m1.Get("codigo")&" CXC", m1.Get("nomDirDist")) + End If + + + Next + End If + c2.Close + entro = "3" + Else If entro = "3" Then +' LogColor("Guardamos CLIENTE " & Value, Colors.red) + Starter.skmt.ExecNonQuery("delete from CUENTAA") + Dim sValue As String = Value + + Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object(sValue.Replace(" CXC",""))) + B4XPages.ShowPage("Cliente") + End If +End Sub + +'Genera el listview que muestra las rutas y clientes a visitar por ruta. +Sub generaListViewRutas + ListView1.Clear + Sleep(110) + lfila.Text = "RUTA PREVENTA" + Dim label1 As Label + label1 = ListView1.TwoLinesLayout.Label + label1.TextSize = 20 + label1.Typeface = Typeface.CreateNew(Typeface.DEFAULT_BOLD, Typeface.STYLE_BOLD) + label1.TextColor = Colors.White + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 20 + label2.Typeface = Typeface.CreateNew(Typeface.DEFAULT_BOLD, Typeface.STYLE_BOLD) + label2.TextColor = Colors.White + ListView1.TwoLinesLayout.ItemHeight = 80dip + c=Starter.skmt.ExecQuery("select CAT_CL_RUTA, count(*) as cuantos from kmt_info where gestion = 0 AND CAT_CL_RUTA <> 1000 group by CAT_CL_RUTA order by CAT_CL_RUTA asc") + If c.RowCount>0 Then + ListView1.Clear + For i=0 To c.RowCount -1 + c.Position=i + ListView1.AddTwoLines("Ruta: " & c.GetString("CAT_CL_RUTA"), "Por visitar: " & c.GetString("cuantos")) + Next + End If + c.Close +End Sub + +Sub Activity_KeyPress (key As Int) As Boolean 'ignore + ' BACK key pressed + If key=KeyCodes.KEYCODE_BACK Then + If entro = 3 And Not(conMapa) Then + b_GetDirs.Visible = False +' StartActivity(Activity_Create(False)) + B4XPage_Created(Root) + Return True + End If + B4XPages.ShowPage("Principal") + Return False + 'End If + End If + ' Returning False signals the system to handle the key +End Sub + +Sub BUSCA_TextChanged (Old As String, New As String) + q_buscar = "%" & busca.Text & "%" + c2=Starter.skmt.ExecQuery2("select distinct CAT_CL_NOMBRE, CAT_CL_CALLE, CAT_CL_CODIGO from kmt_info where CAT_CL_NOMBRE like ? and gestion = 0 AND CAT_CL_RUTA <> 1000 order by CAT_CL_CODIGO ", Array As String(q_buscar)) + + + +' d = Starter.skmt.ExecQuery($"select IFNULL(CAT_CL_BCREDITO,0) AS CAT_CL_BCREDITO FROM kmt_info WHERE CAT_CL_CODIGO = '${c2.GetString("CAT_CL_CODIGO")}'"$) +'' LogColor(d.RowCount,Colors.Blue) +' If d.RowCount > 0 Then +' d.Position = 0 +'' LogColor(d.GetString("CAT_CL_BCREDITO"),Colors.Blue) +' If d.GetString("CAT_CL_BCREDITO") = "1" Then +' CREDITO.Visible = False +' Else +' CREDITO.Visible = False +' End If +' d.Close +' Else +' CREDITO.Visible = False +' End If + + + ListView1.Clear + lfila.text = "Nombre y Calle" + Subs.SetDivider(ListView1, Colors.Blue, 2) + If c2.RowCount>0 Then + For i=0 To c2.RowCount -1 + c2.Position=i + Dim label1 As Label + label1 = ListView1.TwoLinesLayout.Label + label1.TextSize = 20 + label1.Typeface = Typeface.CreateNew(Typeface.DEFAULT_BOLD, Typeface.STYLE_BOLD) + label1.TextColor = Colors.White + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 20 + label2.Typeface = Typeface.CreateNew(Typeface.DEFAULT_BOLD, Typeface.STYLE_BOLD) + label2.TextColor = Colors.White + + d = Starter.skmt.ExecQuery($"select CLIENTE FROM ABONOSP WHERE CLIENTE = '${c2.GetString("CAT_CL_CODIGO")}'"$) + If d.RowCount = 0 Then +' cxc.Visible = False + ListView1.AddTwoLines(c2.GetString("CAT_CL_CODIGO"), c2.GetString("CAT_CL_NOMBRE") &" CALLE: "& c2.GetString("CAT_CL_CALLE")) + Else +' cxc.Visible = False + ListView1.AddTwoLines(c2.GetString("CAT_CL_CODIGO")&" CXC", c2.GetString("CAT_CL_NOMBRE") &" CALLE: "& c2.GetString("CAT_CL_CALLE")) +' ListView1.AddTwoLines(cs.Color(Colors.RGB(100,149,237)).Append(c.GetString("codigo")).PopAll, cs2.append(c.GetString("CAT_CL_NOMBRE")).Color(Colors.RGB(100,149,237)).Append(" Calle: ").Pop.Append(c.GetString("CAT_CL_CALLE").Trim & " " & c.GetString("CAT_CL_NOEXT")).PopAll ) + + End If + + + Next + End If + entro = "3" + c2.Close +End Sub + +'Regresa la distancia y tiempo de la ruta entre dos puntos, usa el API del projecto OSRM. (Parte de la funcionalidad OSRM) +'Para mas información ir a esta liga: +'http://project-osrm.org/docs/v5.24.0/api/?language=cURL#route-service +Sub distanciaEntreCoords(id As String, coords1 As String, coords2 As String) As ResumableSub 'ignore + Sleep(1050) + Private distanciaTotal As String = "0" + Private tiempo As String = "0" + Dim j As HttpJob + j.Initialize("", Me) + j.Download("https://router.project-osrm.org/route/v1/driving/"&coords1&";"&coords2&"?overview=false") + Log(("https://router.project-osrm.org/route/v1/driving/"&coords1&";"&coords2&"?overview=false")) + Wait For (j) JobDone(j As HttpJob) + If j.Success Then + Dim jp As JSONParser + jp.Initialize(j.GetString) + Dim m As Map = jp.NextObject + Log($"Respuesta: ${m.Get("code")}"$) + If m.Get("code") = "Ok" Then +' Log(m) + Dim rutas As List = m.Get("routes") + Dim rutas2 As Map = rutas.Get(0) +' Log(rutas2) +' Dim legs As List = rutas2.Get("legs") +' Log(legs) + distanciaTotal = rutas2.Get("distance") + tiempo = rutas2.Get("duration") + Log($"Distancia total: ${distanciaTotal}, Tiempo: ${tiempo}"$ ) + End If + Else + Log("Error!") + End If + j.Release + Private r As List + r.Initialize + r.Add(id) + r.Add(distanciaTotal) + r.Add(tiempo) + Return r +End Sub + +'Regresa la distancia y tiempo estimado de la ruta del repartidor, utiliza el API del projecto OSRM +'para calcular la distancia y tiempo de la ruta de un mapa de coordenadas a visitar dado. (Parte de la funcionalidad OSRM) +Sub traeRutaDia(aVisitar As B4XOrderedMap) + Private coordsInicio As String = $"${Starter.cedisLocation.Longitude},${Starter.cedisLocation.Latitude}"$ + Log($"Coordenadas de inicio: ${Starter.cedisLocation.Longitude},${Starter.cedisLocation.Latitude}"$) + Private rutaCompleta As String = coordsInicio + Private preRuta As String = coordsInicio + Private distanciaTotal, distanciaTotal0, tiempo0, tiempo As Double + Private masDe100 As Boolean + Private m4 As Map + Private visitaActual As Int = 0 + Private cuantosAntes As Int = 0 + listaWayPoints.Initialize + If aVisitar.Keys.Size > 98 Then 'Si los clientes a visitar son mas de 100 entonces hacemos 2 rutas, una inicial con pocas visitas (las que pasen de 100) y la final con el resto ... + cuantosAntes = aVisitar.Keys.Size - 98 'Definimos de cuantos clientes va a ser la ruta inicial. + preRuta = coordsInicio 'Ponemos las coordenadas de inicio (Las del CEDIS). + rutaCompleta = "" + masDe100 = True + End If + Log($"a visitar: ${aVisitar.Keys.Size}"$) + For Each k As Object In aVisitar.Keys + visitaActual = visitaActual + 1 + m4 = aVisitar.Get(k) +' Log($"visitaActual: ${visitaActual} - cuantosAntes: ${cuantosAntes}"$) + If visitaActual < cuantosAntes + 2 Then 'Si estas coordenadas son de la ruta inicial las agregamos ... + preRuta = preRuta & ";" & m4.Get("coords") +' LogColor($"PreRuta - visitaActual: ${visitaActual} - coords: ${m4.Get("coords")}"$, Colors.Magenta) + End If + If visitaActual >= cuantosAntes + 2 Then 'Si estas coordenadas son de la ruta final las agregamos ... + rutaCompleta = rutaCompleta & ";" & m4.Get("coords") +' LogColor($"RutaCompleta - visitaActual: ${visitaActual} - coords: ${m4.Get("coords")} - testRuta Size: ${testRutaCompleta.size}"$, Colors.Green) + End If + Next + rutaCompleta = rutaCompleta & ";" & coordsInicio 'Agregamos las coordenadas del CEDIS al final para que sea viaje ida y vuelta. +' rutaCompleta = rutaCompleta & ";" & coordsInicio + If rutaCompleta.StartsWith(";") Then rutaCompleta = rutaCompleta.SubString(1) 'Si las cooredenadas tienen ";" al principio se lo quitamos. +' LogColor(preRuta, Colors.magenta) +' LogColor(rutaCompleta, Colors.Green) + ProgressDialogShow2("Calculando distancia y tiempo, un momento por favor.", False) + Private tiempoVisitas As Double 'TIMEPO DE 4 MINUTOS PROMEDIO POR TIENDA ESTO SE CAMBIA SEGUN EL CLIENTE + tiempoVisitas = aVisitar.Keys.Size * 4 * 60 'Aqui se calcula el tiempo que duran las visitas x 4 mins cada una en segundos. + tiempo0 = 0 + distanciaTotal0 = 0 + If masDe100 Then 'Si son mas de 100, entonces primero calculamos la ruta inicial. + Dim j0 As HttpJob + j0.Initialize("trip0", Me) + j0.Download("https://router.project-osrm.org/trip/v1/driving/"&preRuta&"?source=first&destination=last&roundtrip=false&geometries=geojson") +' LogColor("https://router.project-osrm.org/trip/v1/driving/"&preRuta&"?source=first&destination=last&roundtrip=false&geometries=geojson", Colors.Magenta) + Wait For (j0) JobDone(j0 As HttpJob) + If j0.Success Then + Dim jp0 As JSONParser + jp0.Initialize(j0.GetString) + Dim m0 As Map = jp0.NextObject + If m0.Get("code") = "Ok" Then + Dim puntos0 As List = m0.Get("waypoints") + Private esteWayPoint0 As Map + For p = 0 To puntos0.Size -1 + esteWayPoint0 = puntos0.Get(p) +' LogColor("WP:" & esteWayPoint0, Colors.magenta) +' LogColor("WP: " & esteWayPoint0.Get("waypoint_index") & ", loc: " & esteWayPoint0.Get("location") & ", name: " & esteWayPoint0.Get("name"), Colors.Magenta) + esteWayPoint0.Remove("hint") + esteWayPoint0.Remove("distance") + esteWayPoint0.Remove("trips_index") + listaWayPoints.Add(esteWayPoint0) +' LogColor("estewaypoint: "&esteWayPoint0, Colors.Magenta) + Next + Dim rutas0 As List = m0.Get("trips") + Dim rutas20 As Map = rutas0.Get(0) +' Dim geometry0 As Map = rutas20.Get("geometry") +' Private coords0 As List = geometry0.Get("coordinates") + distanciaTotal0 = rutas20.Get("distance") + tiempo0 = rutas20.Get("duration") + tiempo0 = ((tiempo0 * 2) ) 'Tiempo X 2 (es muy corto porque no toma encuenta el trafico). + Log($"Distancia total ruta inicial: $1.1{distanciaTotal0/1000} kms, tiempo aprox: $1.1{tiempo0/60} mins. ($1.1{tiempo0/60/60} hrs)"$) +' l_rutaInfo.Text = $"Distancia total: $1.1{distanciaTotal0/1000} kms, tiempo aprox: $1.1{tiempo0/60/60} hrs"$ + End If + Else + Log("Error!") + End If + j0.Release + End If + + Dim j As HttpJob + j.Initialize("trip", Me) 'Calculamos el resto de la ruta. + j.Download("https://router.project-osrm.org/trip/v1/driving/"&rutaCompleta&"?source=first&destination=last&roundtrip=false&geometries=geojson") +' LogColor("https://router.project-osrm.org/trip/v1/driving/"&rutaCompleta&"?source=first&destination=last&roundtrip=false&geometries=geojson", Colors.Green) + Wait For (j) JobDone(j As HttpJob) + If j.Success Then + Dim jp As JSONParser + jp.Initialize(j.GetString) + Dim m As Map = jp.NextObject + If m.Get("code") = "Ok" Then + Dim puntos As List = m.Get("waypoints") + Private esteWayPoint As Map + Dim twpi As Int + For p = 0 To puntos.Size -1 + esteWayPoint = puntos.Get(p) +' LogColor("WP:" & esteWayPoint, Colors.green) +' LogColor("WP: " & esteWayPoint.Get("waypoint_index") & ", loc: " & esteWayPoint.Get("location") & ", name: " & esteWayPoint.Get("name"), Colors.Green) + esteWayPoint.Remove("hint") + esteWayPoint.Remove("distance") + esteWayPoint.Remove("trips_index") + twpi = esteWayPoint.Get("waypoint_index") + esteWayPoint.Remove("waypoint_index") + esteWayPoint.Put("waypoint_index", (twpi + cuantosAntes + 2)) + listaWayPoints.Add(esteWayPoint) +' LogColor("estewaypoint: "&esteWayPoint, Colors.Green) + Next + Dim rutas As List = m.Get("trips") + Dim rutas2 As Map = rutas.Get(0) + distanciaTotal = rutas2.Get("distance") + Log("distancia ruta 2:" & (distanciaTotal) & "|" & rutas2.Get("distance")) + distanciaTotal = distanciaTotal + distanciaTotal0 + tiempo = rutas2.Get("duration") + tiempo = (((tiempo + tiempo0) * 2) + tiempoVisitas) 'Tiempo X 2 (es muy corto porque no toma encuenta el trafico) + tiempoVisitas. + Log($"Distancia total: $1.1{distanciaTotal/1000} kms, tiempo aprox: $1.1{tiempo/60} mins. ($1.1{tiempo/60/60} hrs)"$) + l_rutaInfo.Text = $"Distancia: $1.1{distanciaTotal/1000} kms, tiempo aprox: $1.1{tiempo/60/60} hrs${CRLF}Visitas restantes: ${aVisitar.Keys.Size}"$ + l_rutaInfo.Width = Root.Width * 0.9 + Subs.centraEtiqueta(l_rutaInfo, Root.Width) + l_rutaInfo.Visible = True + l_rutaInfo.BringToFront + ListView1.Top = lv1Top + 100 + End If + Else + LogColor("**************** Error! ******************", Colors.red) + End If + j.Release + ProgressDialogHide +' LogColor("clientesMapaO size: " & clientesMapaO.Size & "|" & listaWayPoints.Size, Colors.Blue) + Private r As Int = 1 + Private r1, wps As Map + Starter.skmt.ExecNonQuery("delete from waypoints") + Log("BORRAMOS WAYPOINTS") + For Each k As Object In clientesMapaO.Keys 'Guardamos en la BD el orden de los waypoints para luego generar el listview. + If listaWayPoints.Size > 0 Then + r1 = clientesMapaO.Get(k) + r1.Get("codigo") + Log(listaWayPoints.Get(r) & "|" & r1.Get("coords") & "|" & r1.Get("calle")) + wps = listaWayPoints.Get(r) + Starter.skmt.ExecNonQuery($"update kmt_info set SECUENCIA = ${wps.get("waypoint_index")} where CAT_CL_CODIGO = '${r1.Get("codigo")}'"$) + Starter.skmt.ExecNonQuery2("insert into waypoints values (?,?)", Array As Object(r1.Get("codigo"), wps.get("waypoint_index"))) + r = r + 1 + End If + Next + ListView1.Clear + Sleep(100) + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 15 + label2.Height = 100dip + ListView1.TwoLinesLayout.ItemHeight = 100dip + Dim cs, cs2 As CSBuilder + entro = 3 + Log("Generamos ListView1 en traeRutaDia") + 'Traemos las visitas restantes ordenadas por el indice de waypoints (este indice nos indica el orden en la ruta calculada). + c=Starter.skmt.ExecQuery("select codigo, indice, CAT_CL_NOMBRE, CAT_CL_CALLE, CAT_CL_NOEXT from waypoints inner join kmt_info on waypoints.codigo = kmt_info.CAT_CL_CODIGO where gestion = 0 AND CAT_CL_RUTA <> 1000 order by indice") + If c.RowCount > 0 Then + For i=0 To c.RowCount -1 'Generamos el listView con la lista ordenada. + c.Position=i + cs.Initialize + cs2.Initialize + + d = Starter.skmt.ExecQuery($"select CLIENTE FROM ABONOSP WHERE CLIENTE = '${c.GetString("codigo")}'"$) + If d.RowCount = 0 Then +' cxc.Visible = False + ListView1.AddTwoLines(cs.Color(Colors.RGB(100,149,237)).Append(c.GetString("codigo")).PopAll, cs2.append(c.GetString("CAT_CL_NOMBRE")).Color(Colors.RGB(100,149,237)).Append(" Calle: ").Pop.Append(c.GetString("CAT_CL_CALLE").Trim & " " & c.GetString("CAT_CL_NOEXT")).PopAll ) + Else +' cxc.Visible = False + ListView1.AddTwoLines(cs.Color(Colors.RGB(100,149,237)).Append(c.GetString("codigo")&" CXC").PopAll, cs2.append(c.GetString("CAT_CL_NOMBRE")).Color(Colors.RGB(100,149,237)).Append(" Calle: ").Pop.Append(c.GetString("CAT_CL_CALLE").Trim & " " & c.GetString("CAT_CL_NOEXT")).PopAll ) + + End If + +' ListView1.AddTwoLines(cs.Color(Colors.RGB(100,149,237)).Append(c.GetString("codigo")&"cxc").PopAll, cs2.append(c.GetString("CAT_CL_NOMBRE")).Color(Colors.RGB(100,149,237)).Append(" Calle: ").Pop.Append(c.GetString("CAT_CL_CALLE").Trim & " " & c.GetString("CAT_CL_NOEXT")).PopAll ) + Next + End If + c.Close +End Sub + +'Calcula distancia y tiempo de la ubicacion ACTUAL a las 8 primeras tiendas de la lista usando el API de OSRM. (Parte de la funcionalidad OSRM) +Private Sub b_GetDirs_Click + ProgressDialogShow("Calculando distancias y tiempos ...") + Private m2 As Map + Private f As Int = 0 + For Each k As Object In distOrderedMap.Keys 'Traemos la distancia y tiempo desde OSRM (2 puntos) + m2 = distOrderedMap.Get(k) + Private distancia2 As String = m2.Get("distancia") + Private thisLoc1 As String = m2.Get("ubicacion") + Private locActual As String = Tracker.UUGCoords.Longitude&","&Tracker.UUGCoords.Latitude + If locActual = "0,0" Then 'Si no tenemos ubicacion actual de GPS, buscamos la ultima guardada en la base de datos. + c = Starter.skmt.ExecQuery("select * from hist_gps") + If c.RowCount > 0 Then + c.Position = 0 + locActual = c.GetString("hglon") & "," & c.GetString("hglat") + End If + c.Close + End If + f = f+1 + If f < 8 Then + If locActual = "0,0" Then 'Si todavia no tenemos ubicacion actual, entonces avisamos. + ToastMessageShow("No se pudo obtener la ubicacion actual!!", True) + f = 8 + End If + Log($"locActual: ${locActual}, thisLoc1: ${thisLoc1}"$) + Wait For(distanciaEntreCoords(distancia2, locActual, thisLoc1)) Complete (r As List) + LogColor($"R: ${r.Get(0)} - ${r.Get(1)} - ${r.Get(2)}"$, Colors.Green) + Private tId As Int = r.Get(0) + Private tMap As Map = distOrderedMap.Get(tId) + LogColor("|" & tId & "| - " &distOrderedMap.Get(tId), Colors.Blue) + Private tempNDD As String = tMap.Get("nomDirDist") + Private indexD As Int = tempNDD.IndexOf("Distancia:") + If indexD > -1 Then tempNDD = tempNDD.SubString2(0, indexD) + Log(tempNDD) + tempNDD = tempNDD & $"Dist: $1.1{(r.Get(1)/1000)} kms, Tiempo aprox: $1.0{((r.Get(2)*2)/60)} min."$ 'Multiplicamos el tiempo X 2 porque el tiempo estimado siempre es muy corto, X2 es mucho mas real con trafico. + Private esteCliente As Map = CreateMap("distancia": distancia2, "ubicacion": tMap.Get("ubicacion"), "codigo": tMap.Get("codigo"), "nomDirDist": tempNDD) + distOrderedMap.Put(tId, esteCliente) + ListView1.Clear + Private m3 As Map + For Each k As Object In distOrderedMap.Keys 'Generamos el listView con la lista ordenada. + m3 = distOrderedMap.Get(k) + m3.Get("codigo") + ListView1.AddTwoLines(m3.Get("codigo"), m3.Get("nomDirDist")) + Next + End If + Next + ProgressDialogHide +End Sub + +'Regresa un mapa (B4XOrderedMap) con todos los clientes que tiene que visitar el repartidor. (Parte de la funcionalidad OSRM) +Sub traeTodosAVisitar As B4XOrderedMap 'ignore + Log("Iniciamos traeTodosAVisitar") +' If Starter.waypointsOrdered.isInitialized Then Log(Starter.waypointsOrdered.Size) +' Private rutaCompleta As String = "" + Private thisLoc, ubicacionInicial As Location + ubicacionInicial = Starter.cedisLocation + LogColor(ubicacionInicial, Colors.Gray) + c=Starter.skmt.ExecQuery("select sum(gestion) as hayVisitados from kmt_info") + If c.RowCount > 0 Then + c.Position = 0 +' Log(c.GetString("hayVisitados")) + If c.GetString("hayVisitados") > 0 Then ubicacionInicial = Tracker.UUGCoords 'Si ya hay clientes visitados, entonces ya no estamos en el CEDIS y la ubicacion inicial debe de ser la ACTUAL. + End If + c.Close + LogColor(ubicacionInicial, Colors.Red) + thisLoc.Initialize + clientesMapaO.Clear + 'Traemos las rutas asignadas al repartidor. + c=Starter.skmt.ExecQuery("select CAT_CL_RUTA, count(*) as cuantos from kmt_info where gestion = 0 AND CAT_CL_RUTA <> 1000 group by CAT_CL_RUTA order by CAT_CL_RUTA asc") + If c.RowCount>0 Then + 'Traemos los clientes de cada ruta. + For i=0 To c.RowCount -1 + c.Position=i +' Log($"Renglones ruta: ${c.RowCount} - i=${i} - Ruta: ${c.GetString("CAT_CL_RUTA")}"$) + c2=Starter.skmt.ExecQuery2("select CAT_CL_NOMBRE, CAT_CL_CALLE, CAT_CL_CODIGO, CAT_CL_LAT, CAT_CL_LONG from kmt_info where CAT_CL_RUTA = ? and gestion = 0 AND CAT_CL_RUTA <> 1000 order by CAT_CL_NOMBRE ", Array As String(c.GetString("CAT_CL_RUTA"))) + If c2.RowCount>0 Then + For j=0 To c2.RowCount -1 'Generamos lista de clientes + c2.Position=j +' Log($"Renglones clientes: ${c2.RowCount} - j=${j} - Ruta: ${c2.GetString("CAT_CL_CODIGO")}"$) + thisLoc.Latitude = c2.GetString("CAT_CL_LAT") + thisLoc.Longitude = c2.GetString("CAT_CL_LONG") + If Not(thisLoc.Latitude = 0.0) And Not(thisLoc.Latitude = 0) Then 'Este IF es para que si las coordenadas no son válidas, entonces no las agregue al mapeo, porque el API de OSRM nos manda error. + Private distancia As Int = ubicacionInicial.DistanceTo(thisLoc) 'Calculamos la distancia del cedis a la tienda. + If clientesMapaO.ContainsKey(distancia) Then distancia = distancia + 1 'Si por alguna extraña razon hay dos tiendas a la misma distancia del CEDIS, le sumamos 1 para que sea diferente. + Private esteCliente As Map = CreateMap("distancia": distancia, "ordenDist": j, "coords": c2.GetString("CAT_CL_LONG")&","&c2.GetString("CAT_CL_LAT"), "codigo": c2.GetString("CAT_CL_CODIGO"), "nombre": c2.GetString("CAT_CL_NOMBRE"), "calle": c2.GetString("CAT_CL_CALLE")) + clientesMapaO.Put(distancia, esteCliente) + Else + ToastMessageShow("Hay tiendas SIN coordenadas, fueron excluidas!!", False) + End If +' Log($"${thisLoc}"$) +' rutaCompleta = rutaCompleta & ";" & c2.GetString("CAT_CL_LONG")&","&c2.GetString("CAT_CL_LAT") + Next + End If + Next + End If + clientesMapaO.Keys.Sort(True) 'Ordenamos la lista de clientes por distancia. + c.Close + c2.Close + Log(c.RowCount & " rutas, " & clientesMapaO.Size & " clientes") +' LogColor(rutaCompleta, Colors.Magenta) +' Log(clientesMapaO) + Return clientesMapaO +End Sub + +'Traemos la ruta de visitas via el API de OSRM usando el sub "traeRutaDia(traeTodosAVisitar)". +Private Sub b_getRutaInfo_Click +' traeRutaDia(traeTodosAVisitar) + caculaRutaGPS(todosAVisitar, True) +End Sub + +'Mostramos u ocultamos el boton para borrar los waypoints de la ruta. +Private Sub b_getRutaInfo_LongClick + If b_limpiarRuta.Visible Then + b_limpiarRuta.Visible = False + Else + b_limpiarRuta.Visible = True + End If +End Sub + +'Borramos los waypoints de la ruta. +Private Sub b_limpiarRuta_Click + Starter.skmt.ExecNonQuery("delete from waypoints") + b_limpiarRuta.Visible = False + B4XPage_Appear +End Sub + +Sub caculaRutaGPS(coords As List, agregarActual As Boolean) + Private tmpList As List + Dim cs, cs2 As CSBuilder + tmpList.Initialize + If agregarActual Then + tmpList.AddAll(Array As String("ACTUAL", Tracker.UUGCoords.Longitude, Tracker.UUGCoords.Latitude)) + coords.InsertAt(0,tmpList) + Starter.inicioLat = Tracker.UUGCoords.Latitude + Starter.inicioLon = Tracker.UUGCoords.Longitude + End If + Log("=================================") +' Log(coords) + Private coordsStr As String = "" + For Each tienda As List In coords +' Log(tienda) + If coordsStr = "" Then + coordsStr = $"${tienda.get(0)},${tienda.get(1)},${tienda.get(2)}"$ + Else + coordsStr = $"${coordsStr};${tienda.get(0)},${tienda.get(1)},${tienda.get(2)}"$ + End If + Next + Log(coordsStr) + ProgressDialogShow2("Calculando distancia y tiempo, un momento por favor.", False) + Dim j As HttpJob + j.Initialize("trip", Me) 'Calculamos el resto de la ruta. + j.Download($"http://keymon.net:9002/ruteador?m=OSRM&r=${Subs.traeRutaReparto}&a=${Subs.traeAlmacen}&c=${coordsStr}"$) '&f=CEDIS,${Starter.cedisLocation.Longitude},${Starter.cedisLocation.Latitude} + Log($"http://keymon.net:9002/ruteador?m=OSRM&r=${Subs.traeRutaReparto}&a=${Subs.traeAlmacen}&c=${coordsStr}"$) '&f=CEDIS,${Starter.cedisLocation.Longitude},${Starter.cedisLocation.Latitude} + Wait For (j) JobDone(j As HttpJob) + If j.Success Then + Dim jp As JSONParser + jp.Initialize(j.GetString) + Dim m As Map = jp.NextObject + Log(m) + If m.Get("code") = "OK" Then + Log("===== OK") + rutaGenerada = True + Dim puntos As Int = m.Get("puntos") + Private coords As List = m.Get("coords") + Private duration As String = m.Get("duration") + Private distance As String = m.Get("distance") + Private mensaje As String = m.Get("mensaje") + Starter.skmt.ExecNonQuery("delete from waypoints") + Starter.skmt.ExecNonQuery("update kmt_info set SECUENCIA = 0") + For i = 0 To coords.Size - 1 + Private ti As Map = coords.Get(i) + Starter.skmt.ExecNonQuery($"update kmt_info set SECUENCIA = ${ti.Get("pos")} where CAT_CL_CODIGO = '${ti.Get("id").As(String).SubString(1)}'"$) ' Ponemos la secuencia con el orden del ruteo para poder verla en el mapa. + Starter.skmt.ExecNonQuery($"insert into waypoints (codigo, indice) values ('${ti.Get("id").As(String).SubString(1)}', '${ti.Get("pos")}')"$) + Next + c = Starter.skmt.ExecQuery("select codigo, indice, CAT_CL_NOMBRE, CAT_CL_CALLE, CAT_CL_NOEXT, CAT_CL_LAT, CAT_CL_LONG from waypoints inner join kmt_info on waypoints.codigo = kmt_info.CAT_CL_CODIGO where gestion = 0 AND CAT_CL_RUTA <> 1000 order by indice") + If c.RowCount > 0 Then 'Ya hay waypoints en la base de datos. + Private primerLat, primerLon, ultimaLat, ultimaLon As String + c.Position = 0 + conMapa = True + ListView1.Clear + Dim cs, cs2 As CSBuilder + entro = 3 + For i=0 To c.RowCount -1 'Generamos el listView con la lista ordenada. + If i = 0 Then 'Obtenemos las coordenadas de la primer tienda + primerLat = c.GetString("CAT_CL_LAT") + primerLon = c.GetString("CAT_CL_LONG") + End If + c.Position = i + cs.Initialize + cs2.Initialize + + d = Starter.skmt.ExecQuery($"select CLIENTE FROM ABONOSP WHERE CLIENTE = '${c.GetString("codigo")}'"$) + If d.RowCount = 0 Then +' cxc.Visible = False + ListView1.AddTwoLines(cs.Color(Colors.RGB(100,149,237)).Append(c.GetString("codigo")).PopAll, cs2.append(c.GetString("CAT_CL_NOMBRE")).Color(Colors.RGB(100,149,237)).Append(" Calle: ").Pop.Append(c.GetString("CAT_CL_CALLE").Trim & " " & c.GetString("CAT_CL_NOEXT")).PopAll ) +' ListView1.AddTwoLines(cs.Color(Colors.RGB(100,149,237)).Append(c.GetString("codigo")).PopAll, cs2.append(c.GetString("CAT_CL_NOMBRE")).Color(Colors.RGB(100,149,237)).Append(" Calle: ").Pop.Append(c.GetString("CAT_CL_CALLE").Trim & " " & c.GetString("CAT_CL_NOEXT")).PopAll ) + Else +' cxc.Visible = False + ListView1.AddTwoLines(cs.Color(Colors.RGB(100,149,237)).Append(c.GetString("codigo")&" CXC").PopAll, cs2.append(c.GetString("CAT_CL_NOMBRE")).Color(Colors.RGB(100,149,237)).Append(" Calle: ").Pop.Append(c.GetString("CAT_CL_CALLE").Trim & " " & c.GetString("CAT_CL_NOEXT")).PopAll ) + + End If + + ultimaLat = c.GetString("CAT_CL_LAT") 'Obtenemos las coordenadas de la ultima tienda. + ultimaLon = c.GetString("CAT_CL_LONG") + Next + End If + c.Close + Log(primerLat & "|" & primerLon & "|" & ultimaLat & "|" & ultimaLon) + Private pri As String = $"${primerLon},${primerLat}"$ + Private ult As String = $"${ultimaLon},${ultimaLat}"$ + Private ced As String = Starter.cedisLocation.Longitude & "," & Starter.cedisLocation.Latitude + If Starter.cedisLocation.Longitude = 0 Or Starter.cedisLocation.Latitude = 0 Then + ToastMessageShow("Las coordenadas del CEDIS NO deben estar en CERO", True) + End If + Private ubiActual As String = Starter.inicioLon & "," & Starter.inicioLat + Wait For(distanciaEntreCoords("aaaa", pri, ubiActual)) Complete (r As List) + Log("DistToPrimero: " & r) + Private distToPrimero As String = NumberFormat2((r.Get(1)/1000), 1, 2, 0, True) + Wait For(distanciaEntreCoords("aaaa", ult, ced)) Complete (r As List) + Log("DistToUltimo: " & r) + Private DistToUltimo As String = NumberFormat2((r.Get(1)/1000), 1, 2, 0, True) + duration = duration + (270 * puntos) ' Agregamoms 4.5 minutos por parada/tienda - 270 segundos = 4.5 minutos + Log($"Distancia total: $1.1{distance/1000} kms, tiempo aprox: $1.1{duration/60} mins. ($1.1{duration/60/60} hrs)"$) + l_rutaInfo.Text = $"Actual a primer tienda: ${distToPrimero} kms + Distancia: $1.1{distance/1000} kms, tiempo aprox: $1.1{duration/60/60} hrs${CRLF}Visitas restantes: ${puntos + 1} + Última tienda a CEDIS: ${DistToUltimo} kms"$ +' Distancia: $1.1{distance/1000} kms, tiempo aprox: $1.1{duration/60/60} hrs${CRLF}Visitas restantes: ${puntos - 1} + Log($"Última tienda a CEDIS: ${DistToUltimo} kms"$) + l_rutaInfo.Width = Root.Width * 0.9 + Subs.centraEtiqueta(l_rutaInfo, Root.Width) + l_rutaInfo.Visible = True +' l_rutaInfo.BringToFront + ListView1.Top = lv1Top + 100 + End If + Else + LogColor("**************** Error! ******************", Colors.red) + End If + j.Release + ProgressDialogHide +End Sub + +'Regresa lista de los clientes a visitar y sus coordenadas, iniciando con el cedis. +Sub todosAVisitar As List + Log(laRuta) + Log(entro) + Private sqlDeRuta As String = "" + If entro = 3 Then sqlDeRuta = $"and CAT_CL_RUTA = '${laRuta}'"$ + Private aVisitar, tmpList As List + aVisitar.Initialize + Private coords As ResultSet = Starter.skmt.ExecQuery($"select CAT_CL_CODIGO, CAT_CL_LAT, CAT_CL_LONG from kmt_info where gestion = 0 AND CAT_CL_RUTA <> 1000 ${sqlDeRuta}"$) + Do While coords.NextRow + tmpList.Initialize + tmpList.AddAll(Array As String(coords.GetString("CAT_CL_CODIGO"), coords.GetString("CAT_CL_LONG"), coords.GetString("CAT_CL_LAT"))) + aVisitar.Add(tmpList) + Loop + Log(aVisitar) + Return aVisitar +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("datoscliente") + 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 \ No newline at end of file diff --git a/B4A/C_DetalleVenta.bas b/B4A/C_DetalleVenta.bas new file mode 100644 index 0000000..9c09480 --- /dev/null +++ b/B4A/C_DetalleVenta.bas @@ -0,0 +1,1378 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=11.5 +@EndOfDesignText@ +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore + Dim g As GPS + Dim clie_id As String + Dim sDate,sTime As String + Dim usuario As String + Dim c As Cursor +' Dim ruta As String + Dim b_regresar As Button + Dim ListView1 As ListView + Dim L_CANT As Label + Dim L_TOTAL As Label + Dim b_borra As Button + Dim Existe As String + Dim result As String + ' Dim lat_gps, lon_gps As String + Dim cuantos As String + Dim nombre_prod As String + Dim cuantos_pedido As String + Private Titulo As Label + Private P1 As Panel + Private lv2 As ListView + Private p_principal As Panel + Dim clv_pedido As CustomListView + Private p_prods As Panel + Private l_prodX As Label + Private l_pCant As Label + Private et_pCant As EditText + Dim bmp As Bitmap + Dim etCantHasFocus As Boolean = False + Dim totalProds As Int = 0 + Dim totalCompra As Int = 0 + Dim prodsMap As Map + Dim reconstruirPedido As Boolean = False + Dim promoABorrar As String + Private b_guardar As Button + Private b_prodMas As Button + Private b_prodMenos As Button + Private b_prodMenosC As Button + Private l_pCantC As Label + Private et_pCantC As EditText + Private b_prodMasC As Button + Private p_botMasMenC As Panel + Private p_botMasMen As Panel + Private l_cajas As Label + Private l_piezas As Label + Dim printer As TextWriter + Dim Printer1 As EscPosPrinter + Dim cmp20 As Serial + Dim PASA_IMP As String + Dim impresoraConectada As Boolean = False + Dim errorImpresora As Int = 0 + Private B_IMP As Button + Dim btAdmin As BluetoothAdmin + Dim s As Cursor + Dim TAMANO As Int + Dim BLANCO As String + Dim ESPACIO As Int +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 + B4XPages.SetTitle(Me, "Detalle de venta") + 'load the layout to Root + g.Initialize("GPS") + Root.LoadLayout("detalleVenta") + b_borra.Visible = False + Titulo.Text = "Pedido" + btAdmin.Initialize("BlueTeeth") + cmp20.Initialize("Printer") +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub B4XPage_Appear + + + + Subs.centraPanel(p_principal, Root.Width) +' b_guardar.Visible = False +' Titulo.Left = Round(p_principal.Width/2)-(Titulo.Width/2) + L_CANT.Text ="" + L_TOTAL.Text="" + c=Starter.skmt.ExecQuery("select count(*) as EXISTE from HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ") + C.Position=0 + Existe = C.GetString("EXISTE") + C.Close +' c=Starter.skmt.ExecQuery("select distinct hist_ventas.hvd_num_registro, HIST_VENTAS.HVD_CLIENTE, HIST_VENTAS.HVD_PRONOMBRE, HIST_VENTAS.HVD_PROID, HIST_VENTAS.HVD_CANT, HIST_VENTAS2.HVD_CANT as HVD_CANT2, HIST_VENTAS.HVD_COSTO_TOT, HIST_VENTAS.HVD_CODPROMO from HIST_VENTAS inner join HIST_VENTAS2 on HIST_VENTAS.HVD_PROID = HIST_VENTAS2.HVD_PROID and HIST_VENTAS.HVD_CLIENTE = HIST_VENTAS2.HVD_CLIENTE WHERE HIST_VENTAS.HVD_CLIENTE IN (Select CUENTA from cuentaa) and HIST_VENTAS.HVD_RECHAZO = 0 order by HIST_VENTAS.HVD_CODPROMO desc, HIST_VENTAS.HVD_PRONOMBRE asc") + c=Starter.skmt.ExecQuery("select hvd_num_registro,CONSECUTIVO, HVD_CLIENTE, HVD_PRONOMBRE, HVD_PROID, HVD_CANT, HVD_COSTO_TOT, HVD_CODPROMO, BCAJAS, CANTC, IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT from HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) and hvd_rechazo <> 2 and hvd_cant > 0 order by HVD_CODPROMO desc, HVD_PRONOMBRE asc") + ListView1.Clear + clv_pedido.Clear + Printer1.Initialize(Me, "Printer1") + Subs.SetDivider(ListView1, Colors.LightGray, 2) + clv_pedido.GetBase.SetLayoutAnimated(100, 0dip, 60dip, Root.Width - 25, Root.Height * 0.52) 'Cambiamos el tamaño y posición de la lista de productos + clv_pedido.Base_Resize(clv_pedido.GetBase.Width, clv_pedido.GetBase.Height) 'Cambiamos el tamaño del panel interno de la lista para que ajuste al nuevo tamaño. +' Log("RC1:"&c.RowCount) + If c.RowCount>0 Then +' Log("Usamos HV") + For i=0 To c.RowCount -1 + c.Position=i + Private c4 As Cursor = Starter.skmt.ExecQuery($"SELECT IFNULL(PE_CANT,0) AS PE_CANT FROM PEDIDO WHERE PE_PROID = '${c.GetString("HVD_PROID")}' AND PE_CLIENTEOR IN (SELECT CUENTA FROM CUENTAA) AND CONSECUTIVO = '${c.GetString("CONSECUTIVO")}'"$) + If c4.RowCount > 0 Then + c4.Position = 0 + Private cantres As Int = c4.GetString("PE_CANT") + Else + cantres = 0 + End If + If c.GetString("BCAJAS") = "0" Then + If c.GetString("HVD_CANT") <> c.GetString("HVD_RECHAZOCANT") Then + 'Traemos cantidad de hvd2 + Private oc As Cursor = Starter.skmt.ExecQuery($"select HVD_CANT from HIST_VENTAS2 WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) and hvd_proid = '${c.GetString("HVD_PROID")}' and HVD_NUM_REGISTRO = '${c.GetString("HVD_NUM_REGISTRO")}'"$) + Private cant2 As Int = 0 + If oc.RowCount > 0 Then + oc.Position = 0 + cant2 = oc.GetString("HVD_CANT") + End If + oc.Close + Dim label1 As Label + label1 = ListView1.TwoLinesLayout.Label + label1.TextSize = 12 + label1.TextColor = Colors.black + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 12 + label2.TextColor = Colors.black + Private bgColor, textColor As Int + bgColor = Colors.RGB(177, 200, 249)'azul + textColor = Colors.black + If c.GetString("HVD_CODPROMO") <> Subs.traeAlmacen Then +' bgColor = Colors.RGB(255, 212, 163) 'naranja + bgColor = Colors.White + End If +' Log($"Agregamos prod a lista1 | ${c.GetString("HVD_CANT")} - ${c.GetString("HVD_CANT2")}"$) 'HVD_CANT2 es la original de la orden. +' ListView1.AddTwoLines(c.GetString("HVD_PRONOMBRE"),"Cantidad #"& c.GetString("HVD_CANT")& " SubTotal $"& c.GetString("HVD_COSTO_TOT")) +' clv_pedido.Add(CreateListItem(c.GetString("HVD_PRONOMBRE"), Subs.traePrecio2(c.GetString("HVD_PROID"), c.GetString("HVD_CODPROMO"),c.GetString("CONSECUTIVO")), (c.GetString("HVD_CANT") - c.GetString("HVD_RECHAZOCANT")), c.GetString("HVD_RECHAZOCANT")-cantres , clv_pedido.AsView.Width, 118dip, bmp, c.GetString("HVD_PROID"), bgColor, textColor, c.GetString("HVD_CODPROMO"),Subs.traeCliente,Subs.traeCliente,0,c.GetString("CONSECUTIVO")),i) + clv_pedido.Add(CreateListItem(c.GetString("HVD_PRONOMBRE"), (c.GetString("HVD_COSTO_TOT")/c.GetString("HVD_CANT")), (c.GetString("HVD_CANT") - c.GetString("HVD_RECHAZOCANT")), c.GetString("HVD_RECHAZOCANT")-cantres , clv_pedido.AsView.Width, 118dip, bmp, c.GetString("HVD_PROID"), bgColor, textColor, c.GetString("HVD_CODPROMO"),Subs.traeCliente,Subs.traeCliente,0,c.GetString("CONSECUTIVO")),i) +' Log(c.GetString("HVD_CODPROMO")) + End If + Else If c.GetString("BCAJAS") = "1" Then + If c.GetString("HVD_CANT") <> c.GetString("HVD_RECHAZOCANT") Then + 'Traemos cantidad de hvd2 + Private oc As Cursor = Starter.skmt.ExecQuery($"select HVD_CANT from HIST_VENTAS2 WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) and hvd_proid = '${c.GetString("HVD_PROID")}' and HVD_NUM_REGISTRO = '${c.GetString("HVD_NUM_REGISTRO")}'"$) + Private cant2 As Int = 0 + If oc.RowCount > 0 Then + oc.Position = 0 + cant2 = oc.GetString("HVD_CANT") + End If + oc.Close + Dim label1 As Label + label1 = ListView1.TwoLinesLayout.Label + label1.TextSize = 12 + label1.TextColor = Colors.black + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 12 + label2.TextColor = Colors.black + Private bgColor, textColor As Int + bgColor = Colors.RGB(177, 200, 249)'azul + textColor = Colors.black + If c.GetString("HVD_CODPROMO") <> Subs.traeAlmacen Then +' bgColor = Colors.RGB(255, 212, 163) 'naranja + bgColor = Colors.White + End If +' Log($"Agregamos prod a lista1 | ${c.GetString("HVD_CANT")} - ${c.GetString("HVD_CANT2")}"$) 'HVD_CANT2 es la original de la orden. +' ListView1.AddTwoLines(c.GetString("HVD_PRONOMBRE"),"Cantidad #"& c.GetString("HVD_CANT")& " SubTotal $"& c.GetString("HVD_COSTO_TOT")) + clv_pedido.Add(CreateListItem(c.GetString("HVD_PRONOMBRE"), (c.GetString("HVD_COSTO_TOT")/c.GetString("CANTC")), ((c.GetString("HVD_CANT") - c.GetString("HVD_RECHAZOCANT"))), c.GetString("HVD_RECHAZOCANT"), clv_pedido.AsView.Width, 118dip, bmp, c.GetString("HVD_PROID"), bgColor, textColor, c.GetString("HVD_CODPROMO"),Subs.traeCliente,Subs.traeCliente,0,c.GetString("CONSECUTIVO")),i) + End If + End If + Next +' cuentaProds("") + End If + Private c3 As Cursor=Starter.skmt.ExecQuery("Select * from PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + If c3.RowCount>0 Then + For i= 0 To c3.RowCount -1 + c3.Position = i + If c3.GetString("PE_BCAJAS") = "1" Then + Private bgColor, textColor As Int + bgColor = Colors.RGB(221, 132, 132)'rosa + textColor = Colors.black + clv_pedido.Add(CreateListItem2(c3.GetString("PE_PRONOMBRE"),c3.GetString("PE_COSTOU"), c3.GetString("PE_CANT"), 0 , clv_pedido.AsView.Width, 118dip, bmp, c3.GetString("PE_PROID"), bgColor, textColor, Subs.traeAlmacen,Subs.traeCliente, c3.GetString("PE_CLIENTEOR"),1,c3.GetString("CONSECUTIVO")),i) + Log("#####################"&c3.GetString("PE_PRONOMBRE")&","& c3.GetString("PE_CANT")) + Else + Private bgColor, textColor As Int + bgColor = Colors.RGB(221, 132, 132)'rosa + textColor = Colors.black + Log("#####################"&c3.GetString("PE_PRONOMBRE")&","& c3.GetString("PE_CANT")) + clv_pedido.Add(CreateListItem(c3.GetString("PE_PRONOMBRE"),c3.GetString("PE_COSTOU"), c3.GetString("PE_CANT"), 0 , clv_pedido.AsView.Width, 118dip, bmp, c3.GetString("PE_PROID"), bgColor, textColor, Subs.traeAlmacen,Subs.traeCliente, c3.GetString("PE_CLIENTEOR"),1, c3.GetString("CONSECUTIVO")),i) + End If + Next + End If + Private vc As Cursor = Starter.skmt.ExecQuery($"select HVD_PROID, HVD_CANT,HVD_COSTO_TOT, IFNULL(HVD_RECHAZOCANT, 0) AS HVD_RECHAZOCANT from HIST_VENTAS where BCAJAS = 0 and HVD_CODPROMO ='${Subs.traealmacen}' and HVD_CLIENTE in (select cuenta from cuentaa)"$) + Private Cuenta As String = 0 + Private arti As String = 0 + If vc.RowCount > 0 Then + For i = 0 To vc.RowCount - 1 + vc.Position = i + Private cantres As Int = 0 + Private c4 As Cursor = Starter.skmt.ExecQuery($"SELECT IFNULL(PE_CANT,0) AS PE_CANT FROM PEDIDO WHERE PE_PROID = '${vc.GetString("HVD_PROID")}' AND PE_CLIENTEOR IN (SELECT CUENTA FROM CUENTAA)"$) + If c4.RowCount > 0 Then + c4.Position = 0 + cantres = c4.GetString("PE_CANT") + Log(c4.GetString("PE_CANT")) + Else + cantres = 0 + End If +' Log(cantres) +' Log(cantres) +' Log(vc.GetString("HVD_CANT")&","&vc.GetString("HVD_RECHAZOCANT")) + arti = arti + (vc.GetString("HVD_CANT") - vc.GetString("HVD_RECHAZOCANT")) + Cuenta = Cuenta + ((vc.GetString("HVD_CANT") - vc.GetString("HVD_RECHAZOCANT") )*(vc.GetString("HVD_COSTO_TOT")/vc.GetString("HVD_CANT"))) +' Log(arti) +' Log(Cuenta) + Next + End If +' Log(Cuenta) + Private vc2 As Cursor = Starter.skmt.ExecQuery("select HVD_PROID, HVD_CANT, IFNULL(HVD_RECHAZOCANT, 0) AS HVD_RECHAZOCANT, CANTC,HVD_COSTO_TOT from HIST_VENTAS where HVD_CLIENTE in (select cuenta from cuentaa) AND BCAJAS = 1") + Private Cuenta1 As String = 0 + Private arti1 As String = 0 + If vc2.RowCount > 0 Then + For i = 0 To vc2.RowCount - 1 + vc2.Position = i + Dim preu As Float = NumberFormat2(vc2.GetString("HVD_COSTO_TOT")/vc2.GetString("CANTC"),0,2,2,False) + Private vc3 As Cursor = Starter.skmt.ExecQuery($"select PRECIOCONVER, CONVERSION from CAT_GUNAPROD where CAT_GP_ID = '${vc2.GetString("HVD_PROID")}'"$) + If vc3.RowCount > 0 Then + vc3.Position = 0 + Cuenta1 = Cuenta1 + ((vc2.GetString("CANTC")-(vc2.GetString("HVD_RECHAZOCANT")/vc3.GetString("CONVERSION")))*preu) + arti1 = arti1 + (vc2.GetString("HVD_CANT") - vc2.GetString("HVD_RECHAZOCANT")) + End If + Next + End If +' Log(Cuenta1) + Private vc4 As Cursor = Starter.skmt.ExecQuery($"select HVD_PROID, HVD_CANT, IFNULL(HVD_RECHAZOCANT, 0) AS HVD_RECHAZOCANT, CANTC,HVD_COSTO_TOT, HVD_RECHAZO, HVD_CODPROMO from HIST_VENTAS where HVD_CLIENTE in (select cuenta from cuentaa) AND BCAJAS = 0 and HVD_CODPROMO <> '${Subs.traeAlmacen}'"$) + Private Cuenta2 As String = 0 + Private arti2 As String = 0 + If vc4.RowCount > 0 Then + For i = 0 To vc4.RowCount - 1 + vc4.Position = i + If vc4.GetString("HVD_PROID") <> vc4.GetString("HVD_CODPROMO") Then + If vc4.GetString("HVD_RECHAZO") = 0 Then + Cuenta2 = Cuenta2 + vc4.GetString("HVD_COSTO_TOT") + arti2 = arti2 + vc4.GetString("HVD_CANT") + Else + Private vc5 As Cursor = Starter.skmt.ExecQuery($"select CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${vc4.GetString("HVD_PROID")}'"$) + If vc5.RowCount > 0 Then + vc5.Position= 0 +' Log(vc5.GetString("CAT_GP_PRECIO")) + Cuenta2 = Cuenta2 +((vc4.GetString("HVD_CANT")- vc4.GetString("HVD_RECHAZOCANT"))*vc5.GetString("CAT_GP_PRECIO")) + arti2 = arti2 +(vc4.GetString("HVD_CANT")- vc4.GetString("HVD_RECHAZOCANT")) + End If + End If + End If + + Next + End If + Private c4 As Cursor = Starter.skmt.ExecQuery($"SELECT IFNULL(PE_CANT,0) AS PE_CANT, iFNULL(PE_COSTO_TOT,0) AS PE_COSTO_TOT FROM PEDIDO WHERE PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA)"$) + Private Cuenta3 As String = 0 + Private arti3 As String = 0 + If c4.RowCount > 0 Then + For i = 0 To c4.RowCount -1 + c4.Position = i + arti3 = arti3 + c4.GetString("PE_CANT") + Cuenta3 = Cuenta3 + c4.GetString("PE_COSTO_TOT") + Next + End If + If Cuenta < 0 Then + Cuenta = 0 + End If + If Cuenta1 < 0 Then + Cuenta = 0 + End If + If Cuenta2 < 0 Then + Cuenta = 0 + End If + If Cuenta3 < 0 Then + Cuenta = 0 + End If + If arti < 0 Then + arti = 0 + End If + If arti1 < 0 Then + arti = 0 + End If + If arti2 < 0 Then + arti = 0 + End If + If arti3 < 0 Then + arti = 0 + End If + Log(Cuenta&","&Cuenta1&","&Cuenta2&","&Cuenta3) + Log(arti&","&arti1&","&arti2&","&arti3) + If Cuenta + Cuenta1 + Cuenta2 + Cuenta3 < 0 Then + L_TOTAL.Text = 0 + Else + L_TOTAL.Text = NumberFormat2((Cuenta + Cuenta1 + Cuenta2 + Cuenta3),0,2,2,True) + End If + If arti + arti1 +arti2 + arti3 < 0 Then + L_CANT.Text = 0 + Else + L_CANT.Text = NumberFormat2((arti + arti1 +arti2 + arti3),0,0,0,True) + End If + + +End Sub + +Sub GPS_LocationChanged (Location1 As Location) +' lat_gps=Location1.ConvertToSeconds(Location1.Latitude) +' lon_gps=Location1.ConvertToSeconds(Location1.Longitude) +End Sub + +Sub b_regresar_Click + B4XPages.ShowPage("Cliente") +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub + ' BACK key pressed + ' I want to capture the key here so I return True + B4XPages.ShowPage("Cliente") + ' Returning False signals the system to handle the key + Return False +End Sub + +Sub ListView1_ItemLongClick (Position As Int, Value As Object) 'BORRAR +' nombre_prod = Value +' result = Msgbox2("Seguro que desa borrar este articulo?","Borrar Articulo", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore +' If result = DialogResponse.POSITIVE Then +' c=Starter.skmt.ExecQuery2("select HVD_CANT FROM hist_ventas where HVD_pronombre = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As String(Value)) +' c.Position=0 +' If c.GetString("HVD_CANT") > 1 Then +' b_regresar.Visible =False +' b_borra.Visible=False +' P1.Visible =True +' cuantos_pedido = c.GetString("HVD_CANT") +' lv2.Clear +' lv2.SingleLineLayout.Label.TextColor = Colors.Black +' For i=1 To c.GetString("HVD_CANT") +' lv2.AddSingleLine(i) +' Next +' Else +' ' skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(c.GetString("HVD_CANT"),Value)) +' c.Close +' Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT,REP_FECHA, REP_CLI_ORIG) select HVD_CLIENTE, HVD_PRONOMBRE, HVD_CANT, HVD_COSTO_TOT, HVD_FECHA, HVD_CLIENTE from hist_ventas where HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) +' c=Starter.skmt.ExecQuery2("select HVD_CANT FROM hist_ventas where HVD_pronombre = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As String(Value)) +' c.Position=0 +' Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(c.GetString("HVD_CANT"),Value)) +' c.Close +' +' 'skmt.ExecNonQuery2("delete FROM HIST_VENTAS WHERE HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) +' ' se cambia por update para no borrarlo y tener todos los registros. +' Starter.skmt.ExecNonQuery2("update HIST_VENTAS set HVD_RECHAZO = 1 WHERE HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) + ' +' DateTime.DateFormat = "MM/dd/yyyy" +' sDate=DateTime.Date(DateTime.Now) +' sTime=DateTime.Time(DateTime.Now) +' c=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") +' c.Position=0 +' clie_id = c.GetString("CUENTA") +' c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") +' c.Position=0 +' usuario = c.GetString("USUARIO") +' 'quitar esta mamada no es ahi +' Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 3 where CAT_CL_CODIGO In (select cuenta from cuentaa)") +' B4XPage_Appear +' End If +' +' End If +End Sub + +Sub lv2_ItemClick (Position As Int, Value As Object) 'BORRAR +' ' If Value = "Todos" Then +' ' cuantos = c.GetString("HVD_CANT") +' 'Else +' cuantos = Value +' ' End If +' If cuantos = cuantos_pedido Then +' 'Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(c.GetString("HVD_CANT"),nombre_prod)) +' c.Close +' Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT, REP_FECHA, REP_CLI_ORIG) select HVD_CLIENTE, HVD_PRONOMBRE, HVD_CANT, HVD_COSTO_TOT, HVD_FECHA, HVD_CLIENTE from hist_ventas where HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(nombre_prod)) +' c=Starter.skmt.ExecQuery2("select HVD_CANT FROM hist_ventas where HVD_pronombre = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As String(nombre_prod)) +' c.Position=0 +' Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(c.GetString("HVD_CANT"),nombre_prod)) +' c.Close +' 'Starter.skmt.ExecNonQuery2("delete FROM HIST_VENTAS WHERE HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) +' ' se cambia por update para no borrarlo y tener todos los registros. +' Starter.skmt.ExecNonQuery2("update HIST_VENTAS set HVD_RECHAZO = 1 WHERE HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As String(Value)) +' DateTime.DateFormat = "MM/dd/yyyy" +' sDate=DateTime.Date(DateTime.Now) +' sTime=DateTime.Time(DateTime.Now) +' c=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") +' c.Position=0 +' clie_id = c.GetString("CUENTA") +' c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") +' c.Position=0 +' usuario = c.GetString("USUARIO") +' 'quitar esta m*m*d* no es ahi +' Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 3 where CAT_CL_CODIGO In (select cuenta from cuentaa)") +' Starter.skmt.ExecNonQuery2("update hist_Ventas set HVD_RECHAZO = 1, HVD_PARCIAL = 0, HVD_CANT = HVD_CANT - ? where HVD_pronombre = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As Object(cuantos, nombre_prod)) +' b_regresar.Visible =True +' b_borra.Visible=True +' P1.Visible =False +' B4XPage_Appear +' Else +' ' skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(cuantos,nombre_prod)) +' c.Close + ' +' 'modificar tambien esto +' 'Modificaciones para que solo quite una parte. +' Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT, REP_FECHA, REP_CLI_ORIG) select HVD_CLIENTE, HVD_PRONOMBRE, ?, ? * (HVD_COSTO_TOT/?), HVD_FECHA, HVD_CLIENTE from hist_ventas where HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As Object(cuantos,cuantos,cuantos_pedido, nombre_prod)) +' Starter.skmt.ExecNonQuery2("insert into hist_ventas(HVD_CLIENTE,HVD_PRONOMBRE,HVD_CANT,HVD_COSTO_TOT, HVD_FECHA, HVD_CODPROMO, HVD_PROID,HVD_NUM_TICKET, HVD_NUM_REGISTRO, HVD_RECHAZO, HVD_ESTATUS, HVD_PARCIAL) select HVD_CLIENTE,HVD_PRONOMBRE,?,HVD_COSTO_TOT, HVD_FECHA, HVD_CODPROMO, HVD_PROID,HVD_NUM_TICKET, HVD_NUM_REGISTRO, 1, HVD_ESTATUS, 1 from hist_ventas where HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As Object(cuantos, nombre_prod)) +' Starter.skmt.ExecNonQuery2("update hist_Ventas set HVD_RECHAZO = 0, HVD_PARCIAL = 1, HVD_CANT = HVD_CANT - ? where HVD_pronombre = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As Object(cuantos, nombre_prod)) +' Starter.skmt.ExecNonQuery2("update hist_Ventas set HVD_COSTO_TOT = HVD_CANT * (HVD_COSTO_TOT/?) where HVD_pronombre = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As Object(cuantos_pedido, nombre_prod)) +' Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(cuantos,nombre_prod)) +' 'crear nueva tabla para que guarde el resto. + '' skmt.ExecNonQuery2("delete FROM HIST_VENTAS WHERE HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) +' DateTime.DateFormat = "MM/dd/yyyy" +' sDate=DateTime.Date(DateTime.Now) +' sTime=DateTime.Time(DateTime.Now) +' c=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") +' c.Position=0 +' clie_id = c.GetString("CUENTA") +' c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") +' c.Position=0 +' usuario = c.GetString("USUARIO") +' Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 3 where CAT_CL_CODIGO In (select cuenta from cuentaa)") +' B4XPage_Appear +' b_regresar.Visible =True +' b_borra.Visible=True +' P1.Visible =False +' End If +End Sub + +'**************************************************************************** +'***************** PARA EL MAS/MENOS ************************************* +'**************************************************************************** + +Sub CreateListItem(Text As String, precioU As String, inv As Int, inv2 As Int, Width As Int, Height As Int, img As Bitmap, prodId As String, bc As Int, tc As Int, promo As String, cliente_original As String,clienterecha As String, bandera As String,consecutivo As Int) As Panel + Dim p As B4XView = xui.CreatePanel("") + Private cs As CSBuilder + cs.Initialize + p.SetLayoutAnimated(0, 0, 0, Width, Height) + p.LoadLayout("prodItem2") + p_prods.Color = bc + l_prodX.TextColor = tc + precioU = $"$1.2{precioU}"$ + l_prodX.Text = Text&CRLF&"Cant: " & inv2 & " $" & precioU + If promo <> "1" And precioU = 0 Then + l_prodX.Text = cs.Color(Colors.RGB(123,0,0)).append(Text&CRLF&"Cant: " & inv2 & " $" & precioU).PopAll + End If + l_prodX.Tag = $"ID: ${prodId}${CRLF}${Text}${CRLF}Precio: $$1.2{precioU}${CRLF}Inv: ${inv} pzs"$ +' l_pCant.Text = 0 +' Log("PRECIO " & Round2(precioU,2)&"| INV "&inv&"| ID "&prodId&"| PROMO "&promo&"| INV2? "&inv2&"| CLIENTE OR NONONO YA NO VA Y UN ESPACIO POR FAVOR "&cliente_original) + l_pCant.Tag = Round2(precioU.Replace(",",""),2)&"|"&inv&"|"&prodId&"|"&promo&"|"&inv2&"|"&cliente_original&"|"&clienterecha&"|"&bandera&"|"&consecutivo + et_pCant.Tag = Round2(precioU.Replace(",",""),2)&"|"&inv&"|"&prodId&"|"&promo&"|"&inv2&"|"&cliente_original&"|"&clienterecha&"|"&bandera&"|"&consecutivo + p_prods.Tag = l_pCant.tag +' Log($"Ponemos la cant en ${inv}"$) + l_pCant.Text = inv +' et_pCant.Text = inv +' et_pCant.BringToFront + l_pCant.BringToFront + et_pCant.SendToBack + p_botMasMenC.Visible = False + l_cajas.Visible = False +' i_prod.Bitmap = img + Return p +End Sub + +Sub CreateListItem2(Text As String, precioU As String, inv As Int, inv2 As Int, Width As Int, Height As Int, img As Bitmap, prodId As String, bc As Int, tc As Int, promo As String, cliente_original As String,clienterecha As String, bandera As String,consecutivo As Int) As Panel + Dim p As B4XView = xui.CreatePanel("") + Private cs As CSBuilder + cs.Initialize + p.SetLayoutAnimated(0, 0, 0, Width, Height) + p.LoadLayout("prodItem2") + p_prods.Color = bc + l_prodX.TextColor = tc + precioU = $"$1.2{precioU}"$ + l_prodX.Text = Text&CRLF&"Cant: " & inv2 & " $" & precioU + '' Log(Text&CRLF&"Cant: " & inv2 & " $" & precioU) + If promo <> "1" And precioU = 0 Then + l_prodX.Text = cs.Color(Colors.RGB(123,0,0)).append(Text&CRLF&"Cant: " & inv2 & " $" & precioU).PopAll + End If + l_prodX.Tag = $"ID: ${prodId}${CRLF}${Text}${CRLF}Precio: $$1.2{precioU}${CRLF}Inv: ${inv} pzs"$ +' l_pCant.Text = 0 + l_pCantC.Tag = Round2(precioU.Replace(",",""),2)&"|"&inv&"|"&prodId&"|"&promo&"|"&inv2&"|"&cliente_original&"|"&clienterecha&"|"&bandera&"|"&consecutivo + et_pCantC.Tag = Round2(precioU.Replace(",",""),2)&"|"&inv&"|"&prodId&"|"&promo&"|"&inv2&"|"&cliente_original&"|"&clienterecha&"|"&bandera&"|"&consecutivo + p_prods.Tag = l_pCantC.tag +' Log($"Ponemos la cant en ${inv}"$) + l_pCantC.Text = NumberFormat2(inv/Subs.traeConversion(prodId),0,0,0,False) +' et_pCant.Text = inv +' et_pCant.BringToFront + l_pCantC.BringToFront + et_pCantC.SendToBack + p_botMasMen.Visible = False + l_piezas.Visible = False +' i_prod.Bitmap = img + Return p +End Sub + +Sub b_prodMenos_Click + + Dim x2 As Cursor =Starter.skmt.ExecQuery("SELECT gestion FROM kmt_info where CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + x2.Position = 0 + If x2.GetString("gestion") = 2 Then + MsgboxAsync("Ya se gestiono el cliente, no se pueden hacer modificaciones","Atención") +' Wait For Msgbox_Result (result2 As Int) +' If result= DialogResponse.NEGATIVE Then +' B4XPages.ShowPage("Principal") +' End If + +' b_prodMas.Enabled = False +' b_prodMenos.Enabled = False + Else + + etCantHasFocus = False + Log("etCantHasFocus=" & etCantHasFocus) + LogColor("b_prodMenos_Click", Colors.Magenta) + Dim index As Int = clv_pedido.GetItemFromView(Sender) + Dim pnl0 As B4XView = clv_pedido.GetPanel(index) + Dim pnl As B4XView = pnl0.GetView(0) + Dim laCant As B4XView = pnl.GetView(2).GetView(3) +' Log(pnl.GetView(2).GetView(0) & "|" & pnl.GetView(2).GetView(1) & "|" & pnl.GetView(2).GetView(2)) + Dim esteTag As List = Regex.Split("\|", laCant.Tag) + Log("LC_TEXT:"&laCant.Text&"|PROMO:"&esteTag.Get(3)&"|LC_TAG:"&laCant.Tag&"|ET:"&esteTag) + Private minimoadesc As String + Dim minimos As Cursor = Starter.skmt.ExecQuery2("SELECT * FROM CAT_GUNAPROD3 WHERE CAT_GP_ID = ?", Array As String(esteTag.Get(2))) + If minimos.RowCount > 0 Then + minimos.Position = 0 + minimoadesc = minimos.GetString("CAT_DP_CANT_MIN_VENTA") + Else + minimoadesc = "1" + End If + minimos.Close + '*'${minimoadesc}') + minimoadesc = "1" + If esteTag.Get(7) = "1" Then + If laCant.Text = "" Then laCant.Text = 0 + laCant.Text = $"$1.0{laCant.Text-1}"$ + If laCant.Text < 0 Then laCant.Text = 0 + Private c3 As Cursor = Starter.skmt.ExecQuery2("SELECT PE_CANT FROM PEDIDO WHERE PE_PROID = ? AND PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND CONSECUTIVO = ?", Array As String(esteTag.Get(2),esteTag.Get(8))) + If c3.RowCount > 0 Then + c3.Position = 0 + If c3.GetString("PE_CANT") > minimoadesc Then + Private c2 As Cursor = Starter.skmt.ExecQuery2("SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = ?", Array As String(esteTag.Get(2))) + If c2.RowCount > 0 Then + c2.Position = 0 +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = HVD_RECHAZOCANT - 1 WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente = '${esteTag.Get(5)}'"$) + Starter.skmt.ExecNonQuery($"update PEDIDO set PE_CANT = IFNULL(PE_CANT,0)-(1*'${minimoadesc}'), PE_COSTO_TOT= ((IFNULL(PE_CANT,0) -(1*'${minimoadesc}'))*'${c2.GetString("CAT_GP_PRECIO")}') WHERE PE_PROID = '${esteTag.Get(2)}' and PE_CLIENTE in (Select CUENTA from cuentaa) and CONSECUTIVO = '${esteTag.Get(8)}'"$) + End If + Else If c3.GetString("PE_CANT") = minimoadesc Then + Private c2 As Cursor = Starter.skmt.ExecQuery2("SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = ?", Array As String(esteTag.Get(2))) + If c2.RowCount > 0 Then + c2.Position = 0 +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = HVD_RECHAZOCANT - 1 WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente = '${esteTag.Get(5)}'"$) +' Starter.skmt.ExecNonQuery($"update PEDIDO set PE_CANT = IFNULL(PE_CANT,0)-1, PE_COSTO_TOT= ((IFNULL(PE_CANT,0) -1)*'${c2.GetString("CAT_GP_PRECIO")}') WHERE PE_PROID_PROID = '${esteTag.Get(2)}' and PE_CLIENTE in (Select CUENTA from cuentaa)"$) + Starter.skmt.ExecNonQuery($"delete from PEDIDO where PE_PROID = '${esteTag.Get(2)}' and PE_CLIENTE in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(8)}'"$) + End If + End If + End If + B4XPage_Appear + Else + If esteTag.Get(5) = esteTag.Get(6) Then + If laCant.Text > 0 Then + If esteTag.Get(3) <> Subs.traeAlmacen Then 'Si es PROMO entonces ... + Private c2 As Cursor =Starter.skmt.ExecQuery($"select HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_PROID = '${esteTag.Get(2)}' AND HVD_CLIENTE IN (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(8)}'"$) + c2.Position = 0 + If c2.GetString("HVD_RECHAZO") = "0" Then + Log("ES PROMO") + Log(esteTag.Get(3)) + result = Msgbox2("Si se modifica una promoción, la promoción se rompe y solo quedarán los productos sueltos, ¿seguro que desea continuar?","Modificar Promoción", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore + If result = DialogResponse.POSITIVE Then 'Quitamos esta promo + prodsMap.Remove(esteTag.Get(3)) +' c=Starter.skmt.ExecQuery($"select HVD_CODPROMO FROM HIST_VENTAS WHERE HVD_CODPROMO = '${esteTag.Get(2)}' AND HVD_cliente IN (Select CUENTA from cuentaa)"$) +' For i = 0 To c.RowCount -1 +' c.Position = i + LogColor(esteTag.Get(3),Colors.Blue) +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = HVD_RECHAZOCANT + 1 WHERE HVD_CODPROMO = '${esteTag.Get(3)}' and HVD_CLIENTE in (Select CUENTA from cuentaa)"$) +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 2, HVD_RECHAZOCANT = HVD_RECHAZOCANT + 1 WHERE HVD_PROID = '${esteTag.Get(3)}' and HVD_CODPROMO = '${esteTag.Get(3)}' and HVD_CLIENTE in (Select CUENTA from cuentaa)"$) + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = HVD_CANT WHERE HVD_CODPROMO = '${esteTag.Get(3)}' and HVD_CLIENTE in (Select CUENTA from cuentaa)"$) + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 2, HVD_RECHAZOCANT = HVD_CANT WHERE HVD_PROID = '${esteTag.Get(3)}' and HVD_CODPROMO = '${esteTag.Get(3)}' and HVD_CLIENTE in (Select CUENTA from cuentaa)"$) +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_CODPROMO = '${Subs.traeAlmacen}' WHERE HVD_cliente in (Select CUENTA from cuentaa) AND HVD_CODPROMO = '${esteTag.Get(3)}'"$) +' Next + c.Close + LogColor(prodsMap, Colors.red) + reconstruirPedido = True + promoABorrar = esteTag.Get(3) + B4XPage_Appear + End If + Else + If laCant.Text = "" Then laCant.Text = 0 + laCant.Text = $"$1.0{laCant.Text-1}"$ + If laCant.Text < 0 Then laCant.Text = 0 + Log("NO ES promo") + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = IFNULL(HVD_RECHAZOCANT,0) + (1*'${minimoadesc}') WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(8)}'"$) + Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + 1 where cat_gp_id = ?", Array As Object(esteTag.Get(2))) + B4XPage_Appear + End If + Else +' If laCant.Text = "" Then laCant.Text = 0 +' laCant.Text = NumberFormat2(($"$1.0{laCant.Text-1}"$),0,0,0,False) + + If laCant.Text = "" Then laCant.Text = 0 + + ' Realizamos la resta de forma segura + Dim valorActual As Double = laCant.Text + Dim resultado As Double = valorActual - 1 + If resultado < 0 Then resultado = 0 + + ' Asignamos al Label/EditText sin comas de miles + laCant.Text = NumberFormat2(resultado, 1, 0, 0, False) + + If laCant.Text < 0 Then laCant.Text = 0 + Log("NO ES promo") + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = IFNULL(HVD_RECHAZOCANT,0) + (1*'${minimoadesc}'), BCAJAS = 0, CANTC = 0 WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(8)}'"$) + Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + 1 where cat_gp_id = ?", Array As Object(esteTag.Get(2))) + B4XPage_Appear + End If + End If + Else + If laCant.Text = "" Then laCant.Text = 0 + laCant.Text = $"$1.0{laCant.Text-1}"$ + If laCant.Text < 0 Then laCant.Text = 0 + Log("NO ES promo") +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = IFNULL(HVD_RECHAZOCANT,0) + 1 WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente = '${esteTag.Get(6)}'"$) +' Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + 1 where cat_gp_id = ?", Array As Object(esteTag.Get(2))) +' Starter.skmt.ExecNonQuery2("update PEDIDO set cat_gp_almacen = cat_gp_almacen + 1 where cat_gp_id = ?", Array As Object(esteTag.Get(2))) + + Private c3 As Cursor = Starter.skmt.ExecQuery2("SELECT PE_CANT FROM PEDIDO WHERE PE_PROID = ? AND PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND CONSECUTIVO = ?", Array As String(esteTag.Get(2), esteTag.Get(8))) + If c3.RowCount > 0 Then + c3.Position = 0 + If c3.GetString("PE_CANT") > 1 Then + Private c2 As Cursor = Starter.skmt.ExecQuery2("SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = ?", Array As String(esteTag.Get(2))) + If c2.RowCount > 0 Then + c2.Position = 0 + Starter.skmt.ExecNonQuery($"update PEDIDO set PE_CANT = IFNULL(PE_CANT,0)-(1*'${minimoadesc}'), PE_COSTO_TOT= ((IFNULL(PE_CANT,0) -(1*'${minimoadesc}'))*'${c2.GetString("CAT_GP_PRECIO")}') WHERE PE_PROID = '${esteTag.Get(2)}' and PE_CLIENTE in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(8)}'"$) + End If + Else If c3.GetString("PE_CANT") = 1 Then + Private c2 As Cursor = Starter.skmt.ExecQuery2("SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = ?", Array As String(esteTag.Get(2))) + If c2.RowCount > 0 Then + c2.Position = 0 + Starter.skmt.ExecNonQuery($"delete from PEDIDO where PE_PROID = '${esteTag.Get(2)}' and PE_CLIENTE in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(8)}'"$) + End If + End If + End If + B4XPage_Appear + End If + End If + Dim preciou As Float = esteTag.Get(0)/esteTag.Get(1) + Log("PU: " & preciou) +' LogColor("estamos aqui mmenos " & laCant.Text& " , " & (preciou * laCant.Text),Colors.Green ) +' If L_CANT.Text - 1 >= 0 Then +' L_CANT.Text = L_CANT.Text - 1 +' End If +' b_guardar.Visible = True +' Subs.prodRechazo(esteTag.Get(5), esteTag.Get(2)) +' Private cym As Map = Subs.traemosCantYMonto(clv_pedido) +' L_CANT.Text = cym.Get("cantidad") +' L_TOTAL.Text = Round2(cym.Get("monto"), 2) +' cuentaProds("-") + End If +End Sub + +Sub b_prodMas_Click + + Dim x2 As Cursor =Starter.skmt.ExecQuery("SELECT gestion FROM kmt_info where CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + x2.Position = 0 + If x2.GetString("gestion") = 2 Then + MsgboxAsync("Ya se gestiono el cliente, no se pueden hacer modificaciones","Atención") +' Wait For Msgbox_Result (result2 As Int) +' If result= DialogResponse.NEGATIVE Then +' B4XPages.ShowPage("Principal") +' End If + +' b_prodMas.Enabled = False +' b_prodMenos.Enabled = False + Else + + + + etCantHasFocus = False +' Log("etCantHasFocus=" & etCantHasFocus) + LogColor("b_prodMas_Click", Colors.Magenta) + Dim index As Int = clv_pedido.GetItemFromView(Sender) + Dim pnl0 As B4XView = clv_pedido.GetPanel(index) + Dim pnl As B4XView = pnl0.GetView(0) + Dim laCant As B4XView = pnl.GetView(2).GetView(3) +' Log(pnl.GetView(2).GetView(1).text&"|"&pnl.GetView(2).GetView(2)&"|"&pnl.GetView(2).GetView(4).text) +' Log($"precio|stock:${laCant.tag}"$) +' Log($"Indice: ${index}, cant:${laCant.Text+1}, precioU: ${laCant.tag}"$) + Dim esteTag As List = Regex.Split("\|", laCant.Tag) + Log("LC_TEXT:"&laCant.Text&"|LC_TAG:"&laCant.Tag&"|ET:"&esteTag) + If laCant.Text = "" Then laCant.Text = 0 + Private maxProds = esteTag.Get(1) + esteTag.Get(4) 'Prods disponibles + prods comprados + + LogColor($"++++++++++++++++++++++++++ ${esteTag}"$, Colors.Green) +' Log(esteTag.get(4)) + + Private minimoadesc As String + Dim minimos As Cursor = Starter.skmt.ExecQuery2("SELECT * FROM CAT_GUNAPROD3 WHERE CAT_GP_ID = ?", Array As String(esteTag.Get(2))) + If minimos.RowCount > 0 Then + minimos.Position = 0 + minimoadesc = minimos.GetString("CAT_DP_CANT_MIN_VENTA") + Else + minimoadesc = "1" + End If + minimos.Close + '*'${minimoadesc}') + minimoadesc = "1" + If esteTag.Get(7) <> "1" Then + If esteTag.Get(5) = esteTag.Get(6) Then + If laCant.Text + 1 <= maxProds Then + Log($"NuevaCant = ${laCant.Text + 1}"$) + laCant.Text = $"$1.0{laCant.Text + 1}"$ + Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen - 1 where cat_gp_id = ?", Array As Object(esteTag.Get(2))) + 'checar este por si las dudas + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = HVD_RECHAZOCANT - (1*'${minimoadesc}') WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(8)}'"$) + Subs.prodVenta(esteTag.Get(5), esteTag.Get(2)) +' Private cym As Map = Subs.traemosCantYMonto(clv_pedido) +' L_CANT.Text = cym.Get("cantidad") +' L_TOTAL.Text = Round2(cym.Get("monto"), 2) +' cuentaProds("+") + B4XPage_Appear + End If + Else + If laCant.Text + 1 <= maxProds Then + Log($"NuevaCant = ${laCant.Text + 1}"$) + laCant.Text = $"$1.0{laCant.Text + 1}"$ + Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen - 1 where cat_gp_id = ?", Array As String(esteTag.Get(2))) + c = Starter.skmt.ExecQuery2("SELECT * FROM PEDIDO WHERE PE_PROID = ? and PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND CONSECUTIVO = ?", Array As String(esteTag.Get(2),esteTag.Get(8))) + If c.RowCount > 0 Then + Private c2 As Cursor = Starter.skmt.ExecQuery2("SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = ?", Array As String(esteTag.Get(2))) + If c2.RowCount > 0 Then + c2.Position = 0 +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = HVD_RECHAZOCANT - 1 WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente = '${esteTag.Get(5)}'"$) + Starter.skmt.ExecNonQuery($"update PEDIDO set PE_CANT = IFNULL(PE_CANT,0)+(1*'${minimoadesc}'), PE_COSTO_TOT= ((IFNULL(PE_CANT,0)+(1*'${minimoadesc}'))*'${c2.GetString("CAT_GP_PRECIO")}') WHERE PE_PROID = '${esteTag.Get(2)}' and PE_CLIENTE in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(8)}'"$) + End If + Else + Private c2 As Cursor = Starter.skmt.ExecQuery2("SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = ?", Array As String(esteTag.Get(2))) + If c2.RowCount > 0 Then + c2.Position = 0 +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = HVD_RECHAZOCANT - 1 WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente = '${esteTag.Get(5)}'"$) + Starter.skmt.ExecNonQuery2("INSERT INTO PEDIDO(PE_PROID,PE_PRONOMBRE,PE_CANT,PE_CLIENTEOR,PE_CLIENTE,PE_COSTOU,PE_COSTO_TOT,PE_CAJAS,PE_BCAJAS,CONSECUTIVO) VALUES (?,?,?,?,?,?,?,0,0,?)", Array As String(esteTag.Get(2),c2.GetString("CAT_GP_NOMBRE"),1*minimoadesc,esteTag.Get(5),Subs.traeCliente,c2.GetString("CAT_GP_PRECIO"),c2.GetString("CAT_GP_PRECIO"),esteTag.Get(8))) + End If + End If + Subs.prodVenta(esteTag.Get(5), esteTag.Get(2)) +' Private cym As Map = Subs.traemosCantYMonto(clv_pedido) +' L_CANT.Text = cym.Get("cantidad") +' L_TOTAL.Text = Round2(cym.Get("monto"), 2) +' cuentaProds("+") + B4XPage_Appear + End If + End If + End If +' Dim preciou As Float = esteTag.Get(0)/esteTag.Get(1) +' Log(preciou) +' LogColor("estamos aquii mas " & laCant.Text& " , " & (preciou * laCant.Text) ,Colors.Green ) +' b_guardar.Visible = True +' Log($"Total Prods: ${totalProds}, Total Compra: $$1.2{totalCompra}"$) +' c = Starter.skmt.ExecQuery($"SELECT HVD_CANT FROM HIST_VENTAS2 WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND HVD_PROID = '${esteTag.Get(2)}' "$) +' c.Position = 0 +' Dim cantoriginal As String = 0 +' If c.RowCount > 0 Then +' cantoriginal = c.GetString("HVD_CANT") +' End If +' If cantoriginal <= esteTag.Get(1) Then +' L_CANT.Text = L_CANT.Text + 1 +' End If + + End If +End Sub + +Sub cuentaProds(accion As String) + '' Log("Entramos a cuentaProds") +' Log("*******************************************************") +' Private cantRechazada As Int = 0 +' If Not(reconstruirPedido) Then +' Log("*********** CUENTAPRODS - NO RECONSTRUIR") +' prodsMap.Initialize +' For i = 0 To clv_pedido.GetSize - 1 +' Private p0 As B4XView = clv_pedido.GetPanel(i) +' Private p As B4XView = p0.GetView(0) +' Private cant1 As B4XView = p.GetView(2).GetView(3) +' If cant1.Text = "" Then cant1.Text = 0 + '' totalProds = totalProds + cant1.Text +' Private esteTag As List = Regex.Split("\|", cant1.Tag) +' Log("-------------------------------------") +' Log($"ET: ${esteTag}"$) +' Private esteProd As String = esteTag.Get(2) +' Private estaCant As Int = cant1.Text +' Private estaCantOriginal As Int = esteTag.Get(1) +' Private esteCliente = Subs.traeCliente +' Private esteProdNombre = Subs.traeNombre(esteProd) +' Private esteClienteOriginal As Int = esteTag.Get(5) +' Private fechaReparto As String = Subs.traeFechaReparto +' Private maxProds = Subs.traeMaxCantidad(esteTag.Get(5), esteTag.Get(2)) +' +' If cant1.Text > maxProds Then cant1.Text = maxProds +' +' cantRechazada = esteTag.Get(4) - cant1.Text + '' If accion = "-" Then cantRechazada = Subs.traeCantidadRechazada(esteClienteOriginal, esteProd) + 1 + '' If accion = "+" Then cantRechazada = Subs.traeCantidadRechazada(esteClienteOriginal, esteProd) - 1 +' Log($"${Subs.traeCantidadRechazada(esteClienteOriginal, esteProd)}, ${Subs.traeCantidadVendida(esteClienteOriginal, esteProd)}"$) +' + '' LogColor($"cantRechazada = ${esteTag.Get(4)} - ${cant1.Text}"$, Colors.Magenta) +' LogColor($"cantRechazada = ${cantRechazada}"$, Colors.Magenta) +' Private estePrecio As String = 0 +' If Subs.traePrecio(esteProd, 1) <> Null Then estePrecio = Subs.traePrecio(esteProd, 1) * cantRechazada +' + '' LogColor(esteProd & "|" & cant1.Text & "|" & estaCantOriginal & "|" & cantRechazada & "|" & estePrecio, Colors.red) + '' LogColor($"cantRechazada=${cantRechazada} | ${esteProdNombre}"$, Colors.Blue) + '' Log($"Ponemos HVD_CANT ${esteProd} en ${cant1.text}"$) +' Starter.skmt.ExecNonQuery2("update HIST_VENTAS set HVD_PARCIAL = 1, HVD_CANT = ? WHERE HVD_PROID = ? and HVD_CLIENTE in (Select CUENTA from cuentaa)", Array As String(cant1.Text ,esteProd)) +' Private rr As Cursor = Starter.skmt.ExecQuery($"select count(REP_CLIENTE) as hayRechazo from REPARTO where rep_prodid = '${esteProd}' and REP_CLIENTE in (Select CUENTA from cuentaa)"$) +' rr.Position = 0 + '' Log($"HayRechazo=${rr.GetString("hayRechazo")}"$) +' If rr.GetString("hayRechazo") = 0 Then +' Log("INSERTAMOS EN REPARTO") +' Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT, REP_FECHA, REP_RECHAZO, REP_PRODID, REP_PRECIO, REP_CLI_ORIG) VALUES (?,?,?,?,?,1,?,?,?) ", Array As String(esteCliente, esteProdNombre, 0, estePrecio, fechaReparto, esteProd, estePrecio, esteCliente)) +' Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT, REP_FECHA, REP_RECHAZO, REP_PRODID, REP_PRECIO, REP_CLI_ORIG) VALUES (?,?,?,?,?,0,?,?,?) ", Array As String(esteCliente, esteProdNombre, cantRechazada, 0, fechaReparto, esteProd, estePrecio, esteCliente)) +' Else if esteClienteOriginal = "0" Then 'Actualizamos el rechazo en el cliente actual. + '' Log($"Actualizamos REP_CANT=${cantRechazada}"$) + '' Starter.skmt.ExecNonQuery($"update reparto set REP_CANT = '${cantRechazada}', REP_PRECIO = '${estePrecio}', REP_COSTO_TOT = '${estePrecio * cantRechazada}' where REP_CLIENTE in (Select CUENTA from cuentaa) and REP_CLI_ORIG = '${esteClienteOriginal}' and REP_RECHAZO = 1 and REP_PRODID = '${esteProd}'"$) +' Else 'Cliente original <> 0 entonces actualizamos el rechazo en el cliente original y NO en el actual. +' Log($"Actualizamos REP_CANT RECHAZO = ${cantRechazada}"$) + '' Starter.skmt.ExecNonQuery($"update reparto set REP_CANT = ${cantRechazada}, REP_PRECIO = '${estePrecio}', REP_COSTO_TOT = '${estePrecio * cantRechazada}' where REP_CLIENTE = '${esteClienteOriginal}' and REP_CLI_ORIG = '${esteClienteOriginal}' and REP_RECHAZO = 1 and REP_PRODID = '${esteProd}'"$) + '' Starter.skmt.ExecNonQuery($"update reparto set REP_CANT = '${cant1.Text}', REP_PRECIO = '${estePrecio}', REP_COSTO_TOT = '${estePrecio * cantRechazada}' where REP_CLIENTE in (Select CUENTA from cuentaa) and REP_CLI_ORIG = '${esteClienteOriginal}' and REP_RECHAZO = 0 and REP_PRODID = '${esteProd}'"$) +' End If +' +' If cant1.Text > 0 Then + '' totalCompra = totalCompra + (esteTag.get(0) * cant1.text) + '' Log($"Cant: ${cant1.Text}, Suma: ${totalCompra}"$) +' Private m As Map +' m=CreateMap("cant":cant1.Text, "cant2":esteTag.get(4), "precio":esteTag.get(0), "promo":esteTag.get(3), "nombre":Subs.traeNombre(esteTag.Get(2)), "cli_orig":esteTag.get(5)) + '' LogColor("PUT:" & esteTag.Get(2), Colors.Red) +' prodsMap.Put(esteTag.Get(2), m) +' End If +' Log("-------------------------------------") +' Next +' End If +' Private bgColor, textColor As Int + ' +' If reconstruirPedido Then +' Log("*********** CUENTAPRODS - SI RECONSTRUIR") +' Private newPromo, newPrecio As String +' clv_pedido.Clear +' Log("Usamos PRODSMAP") +' For Each pr As String In prodsMap.Keys +' Private pr1 As Map = prodsMap.Get(pr) +' Log("PPP: " & pr & "|PromoABorrar=" & promoABorrar & "|" & pr1) +' bgColor = Colors.RGB(177, 200, 249)'azul +' textColor = Colors.black +' newPromo = pr1.Get("promo") +' newPrecio = pr1.Get("precio") +' Log("AAA: " & newPromo & "|" & promoABorrar) +' If newPromo = promoABorrar Then +' newPromo = 1 +' newPrecio = Subs.traePrecio(pr, False) * pr1.Get("cant") +' 'Ponemos precio SIN promo y sacamos el producto de la promo. +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_COSTO_TOT = ${newPrecio}, HVD_CODPROMO ='${Subs.traeAlmacen}' WHERE HVD_PRONOMBRE = '${pr1.Get("nombre")}' and HVD_cliente in (Select CUENTA from cuentaa)"$) +' LogColor("CAMBIAMOS PROMO: " & newPromo, Colors.Magenta) +' End If +' If newPromo <> "1" Then + '' bgColor = Colors.RGB(255, 212, 163) 'naranja +' bgColor = Colors.White +' End If +' Log($"CLI: ${pr1.Get("nombre")}, ${newPrecio}, ${pr1.Get("cant")}, ${pr1.Get("cant2")}"$) +' clv_pedido.Add(CreateListItem(pr1.Get("nombre"), newPrecio, pr1.Get("cant"), pr1.Get("cant2"), clv_pedido.AsView.Width, 118dip, bmp, pr, bgColor, textColor, newPromo, pr1.Get("cli_orig")), pr1.Get("nombre")) +' reconstruirPedido = False +' Next +' promoABorrar = "" +' End If +' Log($"Total Prods: ${totalProds}, Total Compra: $$1.2{totalCompra}"$) +' LogColor("prodsMap=" & prodsMap, Colors.Green) +' + ' +' LogColor(prodsMap, Colors.Blue) +' c = Starter.skmt.ExecQuery($"SELECT sum(HVD_CANT) as CANTIDAD FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)"$) +' Dim cantidad1 As String = 0 +' If c.RowCount > 0 Then +' c.Position = 0 +' cantidad1 = c.GetString("CANTIDAD") +' L_CANT.Text = Round(cantidad1) +' End If +' c.Close +' +' Dim totalfinal As String = 0 +' For Each pr As String In prodsMap.Keys +' Private pr1 As Map = prodsMap.Get(pr) + '' LogColor(pr,Colors.Red) +' Dim x As Cursor = Starter.skmt.ExecQuery($"SELECT CAT_GP_PRECIO FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${pr}'"$) +' c = Starter.skmt.ExecQuery($"SELECT HVD_CANT FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND HVD_PROID ='${pr}' "$) +' Dim cantidady As String = 0 +' If c.RowCount >0 Then +' c.Position = 0 +' cantidady = c.GetString("HVD_CANT") +' End If + '' Log(x.RowCount) +' If x.RowCount > 0 Then +' x.Position = 0 + '' Log(x.GetString("CAT_GP_PRECIO")) +' Dim preciou As String = x.GetString("CAT_GP_PRECIO") +' Dim costototalhist As String = preciou * cantidady + '' Log("Total ==== "&costototalhist) +' End If +' totalfinal = totalfinal + costototalhist +' x.Close +' Next +' L_TOTAL.Text = Round2(totalfinal, 2) +' c.Close +' +' c = Starter.skmt.ExecQuery("select COUNT(*) AS CUANTOS from REPARTO where REP_CLIENTE in (select cuenta from cuentaa) and REP_RECHAZO = '0' and REP_CANT > 0 order by REP_PRONOMBRE") +' If c.RowCount > 0 Then +' c.Position = 0 +' If c.GetString("CUANTOS") > 0 Then +' +' Dim z As Cursor = Starter.skmt.ExecQuery($"select SUM(REP_CANT) AS CANTIDAD , SUM(REP_PRECIO) AS PRECIO from REPARTO where REP_CLIENTE in (select cuenta from cuentaa) and REP_RECHAZO = '0' and REP_CANT > 0 order by REP_PRONOMBRE"$) +' Dim cantidad2 As String = 0 + '' Log(z.RowCount) +' If z.RowCount > 0 Then +' z.Position = 0 +' cantidad2= z.GetString("CANTIDAD") + '' LogColor(z.GetString("PRECIO")&" , " & z.GetString("CANTIDAD"), Colors.Magenta) + '' Log(cantidad1 &" , "& cantidad2) +' L_CANT.Text = Round((cantidad1 + cantidad2)) +' End If +' z.Close +' +' +' End If +' End If +End Sub + +Private Sub b_guardar_Click + +End Sub + +Private Sub l_pCant_Click + +End Sub + +Sub p_prods_Click + Log(Sender.As(Panel).tag) +End Sub + +Private Sub b_prodMasC_Click + etCantHasFocus = False +' Log("etCantHasFocus=" & etCantHasFocus) + LogColor("b_prodMas_Click", Colors.Magenta) + Dim index As Int = clv_pedido.GetItemFromView(Sender) + Dim pnl0 As B4XView = clv_pedido.GetPanel(index) + Dim pnl As B4XView = pnl0.GetView(0) + Dim laCantc As B4XView = pnl.GetView(3).GetView(3) +' Log(pnl.GetView(2).GetView(1).text&"|"&pnl.GetView(2).GetView(2)&"|"&pnl.GetView(2).GetView(4).text) +' Log($"precio|stock:${laCant.tag}"$) +' Log($"Indice: ${index}, cant:${laCant.Text+1}, precioU: ${laCant.tag}"$) + Dim esteTag As List = Regex.Split("\|", laCantc.Tag) + Log("LC_TEXT:"&laCantc.Text&"|LC_TAG:"&laCantc.Tag&"|ET:"&esteTag) + If laCantc.Text = "" Then laCantc.Text = 0 + + Private maxProds As String = (esteTag.Get(1) + esteTag.Get(4))'Prods disponibles + prods comprados + LogColor(esteTag.Get(1),Colors.Red) + LogColor(esteTag.Get(4),Colors.Red) + LogColor($"++++++++++++++++++++++++++ ${esteTag}"$, Colors.Green) +' Log(esteTag.get(4)) + Log(maxProds) + +' l_pCantC.Tag = Round2(precioU,2)&"|"&inv&"|"&prodId&"|"&promo&"|"&inv2&"|"&cliente_original + If esteTag.Get(7) <> "1" Then + If laCantc.Text + 1 <= maxProds Then + Log($"NuevaCant = ${laCantc.Text + 1}"$) + laCantc.Text = $"$1.0{laCantc.Text + 1}"$ + Log(laCantc.Text) + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = IFNULL(HVD_RECHAZOCANT,0) -(1 * ${Subs.traeConversion(esteTag.Get(2))}) WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(8)}'"$) +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = HVD_RECHAZOCANT - 1 WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente in (Select CUENTA from cuentaa)"$) +' Subs.prodVenta(esteTag.Get(5), esteTag.Get(2)) +' Private cym As Map = Subs.traemosCantYMonto(clv_pedido) +' L_CANT.Text = cym.Get("cantidad") +' L_TOTAL.Text = Round2(cym.Get("monto"), 2) +' cuentaProds("+") + B4XPage_Appear + End If + End If +End Sub + +Private Sub b_prodMenosC_Click + etCantHasFocus = False + Log("etCantHasFocus=" & etCantHasFocus) + LogColor("b_prodMenos_Click", Colors.Magenta) + Dim index As Int = clv_pedido.GetItemFromView(Sender) + Dim pnl0 As B4XView = clv_pedido.GetPanel(index) + Dim pnl As B4XView = pnl0.GetView(0) + Dim laCantc As B4XView = pnl.GetView(3).GetView(3) +' Log(pnl.GetView(2).GetView(0) & "|" & pnl.GetView(2).GetView(1) & "|" & pnl.GetView(2).GetView(2)) + Dim esteTag As List = Regex.Split("\|", laCantc.Tag) + Log("LC_TEXT:"&laCantc.Text&"|PROMO:"&esteTag.Get(3)&"|LC_TAG:"&laCantc.Tag&"|ET:"&esteTag) + Log(esteTag) + + If esteTag.Get(7) = "1" Then + Private c3 As Cursor = Starter.skmt.ExecQuery2("SELECT PE_CAJAS, CONSECUTIVO FROM PEDIDO WHERE PE_PROID = ? AND PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND CONSECUTIVO = ? ", Array As String(esteTag.Get(2), esteTag.Get(8))) + Log(c3.RowCount) + Log(esteTag.Get(8)) + If c3.RowCount > 0 Then + Log("AQUI VEMOS SI ACTUALIZAMOS") + c3.Position = 0 + If c3.GetString("PE_CAJAS") > 1 Then + Starter.skmt.ExecNonQuery($"update PEDIDO set PE_CANT = (IFNULL(PE_CANT,0)-(1 * '${Subs.traeConversion(esteTag.Get(2))}')), PE_COSTO_TOT= ((IFNULL(PE_CAJAS,0)-1) *'${Subs.traePrecioC(esteTag.Get(2))}'), PE_CAJAS = IFNULL(PE_CAJAS,0) - 1 WHERE PE_PROID = '${esteTag.Get(2)}' and PE_CLIENTE in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${c3.GetString("CONSECUTIVO")}'"$) + Else If c3.GetString("PE_CAJAS") = 1 Then + Starter.skmt.ExecNonQuery($"delete from PEDIDO where PE_PROID = '${esteTag.Get(2)}' and PE_CLIENTE in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${c3.GetString("CONSECUTIVO")}'"$) + End If + End If + Log("entre al if o algo asi ") + If laCantc.Text = "" Then laCantc.Text = 0 + laCantc.Text = laCantc.Text - 1 + If laCantc.Text < 0 Then laCantc.Text = 0 + B4XPage_Appear + Else + If esteTag.Get(5) = esteTag.Get(6) Then + If laCantc.Text > 0 Then + Log("entre al if o algo asi ") + If laCantc.Text = "" Then laCantc.Text = 0 + laCantc.Text = laCantc.Text - 1 + If laCantc.Text < 0 Then laCantc.Text = 0 + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = (IFNULL(HVD_RECHAZOCANT,0) +(1 * ${Subs.traeConversion(esteTag.Get(2))})) WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(8)}'"$) + Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = (cat_gp_almacen + (1 * ?)) where cat_gp_id = ?", Array As Object(esteTag.Get(2), Subs.traeConversion(esteTag.Get(2)))) + B4XPage_Appear + Else If laCantc.Text = 0 Then + End If + Else + If laCantc.Text > 0 Then +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = (IFNULL(HVD_RECHAZOCANT,0) +(1 * ${Subs.traeConversion(esteTag.Get(2))})) WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente = '${esteTag.Get(6)}'"$) + Private c3 As Cursor = Starter.skmt.ExecQuery2("SELECT PE_CAJAS FROM PEDIDO WHERE PE_PROID = ? AND PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA) and CONSECUTIVO = ? ", Array As String(esteTag.Get(2),esteTag.Get(8))) + If c3.RowCount > 0 Then + Log("AQUI VEMOS SI ACTUALIZAMOS") + c3.Position = 0 + If c3.GetString("PE_CAJAS") > 1 Then + Starter.skmt.ExecNonQuery($"update PEDIDO set PE_CANT = (IFNULL(PE_CANT,0)-(1 * '${Subs.traeConversion(esteTag.Get(2))}')), PE_COSTO_TOT= ((IFNULL(PE_CAJAS,0)-1) *'${Subs.traePrecioC(esteTag.Get(2))}'), PE_CAJAS = IFNULL(PE_CAJAS,0) - 1 WHERE PE_PROID = '${esteTag.Get(2)}' and PE_CLIENTE in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(8)}'"$) + Else If c3.GetString("PE_CAJAS") = 1 Then + Starter.skmt.ExecNonQuery($"delete from PEDIDO where PE_PROID = '${esteTag.Get(2)}' and PE_CLIENTE in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(8)}'"$) + End If + End If + Log("entre al if o algo asi ") + If laCantc.Text = "" Then laCantc.Text = 0 + laCantc.Text = laCantc.Text - 1 + If laCantc.Text < 0 Then laCantc.Text = 0 + B4XPage_Appear +' Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = (cat_gp_almacen + (1 * ?)) where cat_gp_id = ?", Array As Object(esteTag.Get(2), Subs.traeConversion(esteTag.Get(2)))) + Else If laCantc.Text = 0 Then + End If + End If + End If + Dim preciou As Float = esteTag.Get(0)/esteTag.Get(1) + Log("PU: " & preciou) +End Sub + +Private Sub l_pCantC_Click + +End Sub + +Private Sub b_revversar_Click + Dim x2 As Cursor =Starter.skmt.ExecQuery("SELECT gestion FROM kmt_info where CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + x2.Position = 0 + If x2.GetString("gestion") = 2 Then + MsgboxAsync("Ya se gestiono el cliente, no se pueden hacer modificaciones","Atención") +' Wait For Msgbox_Result (result2 As Int) +' If result= DialogResponse.NEGATIVE Then +' B4XPages.ShowPage("Principal") +' End If + +' b_prodMas.Enabled = False +' b_prodMenos.Enabled = False + Else + Private c3 As Cursor = Starter.skmt.ExecQuery("SELECT * FROM PEDIDO WHERE PE_CLIENTEOR IN (SELECT CUENTA FROM CUENTAA)") + If c3.RowCount = 0 Then + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 0, HVD_RECHAZOCANT = 0, BCAJAS = BCAJAS_OR, CANTC = CANTC_OR WHERE HVD_cliente in (Select CUENTA from cuentaa)"$) + B4XPage_Appear + Else + MsgboxAsync("Hay productos que ya se vendieron, no se puede regresar la venta","Atención") + End If + End If +End Sub + +Sub Printer1_Connected (Success As Boolean) +' If Logger Then Log("Printer1_Connected") + If Success Then + ToastMessageShow("Impresora conectada", False) + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("MACIMP")) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("MACIMP",Starter.mac_impresora)) +' If logger Then LogColor("Impresora conectada", Colors.Green) +' B_IMP2.Enabled = True + impresoraConectada = True + Else +' Msgbox(Printer1.ConnectedErrorMsg, "Error connecting.") 'ignore +' ToastMessageShow("Error conectando la impresora", False) + LogColor("Error conectando la impresora", Colors.Red) + errorImpresora = errorImpresora + 1 + If errorImpresora > 1 Then + Starter.MAC_IMPRESORA = "0" + errorImpresora = 0 + End If + End If +End Sub + +Sub Printer1_Error + Log("error printer") +End Sub + +Sub Printer_Connected (Success As Boolean) + If Success Then +' B_IMP.Enabled = True + PASA_IMP = "1" + Else +' B_IMP.Enabled = False + If Msgbox2("", "Printer Error","Reprint","Cancel","",Null) = DialogResponse.POSITIVE Then 'ignore + StartPrinter + End If + End If +End Sub + +Sub StartPrinter + Dim PairedDevices As Map + Dim L1 As List + Dim resimp As Int + ToastMessageShow("Printing.....",True) + PairedDevices.Initialize + Try + PairedDevices = cmp20.GetPairedDevices + Catch + Msgbox("Getting Paired Devices","Printer Error") 'ignore + printer.Close + cmp20.Disconnect + End Try + + If PairedDevices.Size = 0 Then + Msgbox("Error Connecting to Printer - Printer Not Found","") 'ignore + Return + End If + + If PairedDevices.Size = 1 Then + Try + cmp20.Connect(PairedDevices.Get(PairedDevices.GetKeyAt(0))) + Catch + Msgbox("Connecting","Printer Error") 'ignore + printer.Close + cmp20.Disconnect + End Try + Else + L1.Initialize + For i = 0 To PairedDevices.Size - 1 + L1.Add(PairedDevices.GetKeyAt(i)) + Next + resimp = InputList(L1, "Choose device", -1) 'ignore + If resimp <> DialogResponse.CANCEL Then + cmp20.Connect(PairedDevices.Get(L1.Get(resimp))) + End If + End If +End Sub + +Private Sub B_IMP_Click + c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c.Close +' ProgressDialogShow("Imprimiendo, un momento ...") +' Printer1.DisConnect +' If Not(Printer1.IsConnected) Then +'' Log("Conectando a impresora ...") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) +' Sleep(1000) +'' Log("++++++ " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect 'Tratamos de reconectar +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' Else +'' Log("conectando 2") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) +' Sleep(1000) +'' Log("****** " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' End If + + ProgressDialogShow2("Imprimiendo, un momento ...",False) + Printer1.DisConnect + If Not(Printer1.IsConnected) Then +' If logger Then Log("conectando 1") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) + Sleep(1000) + cont = cont + 1 + If cont = 7 Then Printer1.Connect 'Tratamos de reconectar + If cont > 15 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + Else +' If logger Then Log("conectando 2") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) + Sleep(1000) + cont = cont + 1 + If cont = 2 Then Printer1.Connect + If cont > 4 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + End If + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + Dim Ticket As String = 0 + Dim c6 As Cursor = Starter.skmt.ExecQuery("select distinct HVD_NUM_TICKET FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + If c6.RowCount > 0 Then + c6.Position = 0 + Ticket = c6.GetString("HVD_NUM_TICKET") + End If + c6.Close + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Printer1.WriteString("Tienda: " & B4XPages.MainPage.cliente.La_nombre.Text & CRLF) + Printer1.WriteString("ID.Cliente: " & B4XPages.MainPage.cliente.la_cuenta.Text & CRLF) + Printer1.WriteString("Num. Ticket: " & Ticket & CRLF) + Printer1.WriteString("Fecha: " & sDate &" " & sTime & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + c = Starter.skmt.ExecQuery("SELECT * FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + If c.RowCount > 0 Then + Printer1.WriteString("------------Picking------------" & CRLF) + Printer1.WriteString("" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + ' aqui es donde esta el pedo de julieta de los descuentos quitar el precio2 pero meter un if para saber si es ruta especial o es normal o que show. + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, HVD_CANT, length(HVD_CANT) as L_CANT, HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID, HVD_CODPROMO,IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) order by HVD_PROID"$) + If S.RowCount>0 Then + For i=0 To S.RowCount -1 + S.Position=i + Log(s.GetString("HVD_RECHAZO")) + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then + If s.GetString("HVD_CODPROMO") = Subs.traeAlmacen Then + Printer1.Justify = 0 + Printer1.WriteString((s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") )&" "&s.GetString("HVD_PRONOMBRE") & CRLF) + + +' Dim punit As String = NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) +' TAMANO = punit.Length + TAMANO + ' + '' Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) +' Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) +' TAMANO = ptot.Length + TAMANO +' +' ESPACIO = (ESPACIO - TAMANO)/2 + '' Log(ESPACIO) +' For E=0 To ESPACIO -1 +' BLANCO = " " & BLANCO +' Next +' Printer1.Justify = 0 +' Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) +' Printer1.Justify = 1 +' Printer1.WriteString( punit & BLANCO) +' Printer1.Justify = 2 +' Printer1.WriteString( ptot & CRLF ) +' TAMANO = 0 +' ESPACIO = 29 +' BLANCO = " " + Else If s.GetString("HVD_RECHAZO") = 1 Then + Printer1.Justify = 0 + Printer1.WriteString((s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) &" "&s.GetString("HVD_PRONOMBRE") & CRLF) + +' Private vc5 As Cursor = Starter.skmt.ExecQuery($"select iFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${s.GetString("HVD_PROID")}'"$) +' vc5.Position = 0 +' Dim punit As String = NumberFormat2((vc5.GetString("CAT_GP_PRECIO")),0,2,2,False) +' TAMANO = punit.Length + TAMANO +' vc5.Close +' +' Private ptot As String = NumberFormat2(( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT")) * punit ),0,2,2,False) +' TAMANO = ptot.Length + TAMANO +' +' ESPACIO = (ESPACIO - TAMANO)/2 + '' Log(ESPACIO) +' For E=0 To ESPACIO -1 +' BLANCO = " " & BLANCO +' Next +' Printer1.Justify = 0 +' Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) +' Printer1.Justify = 1 +' Printer1.WriteString( punit & BLANCO) +' Printer1.Justify = 2 +' Printer1.WriteString(ptot& CRLF ) +' TAMANO = 0 +' ESPACIO = 29 +' BLANCO = " " + Printer1.Justify = 0 + End If + End If + Next + End If + End If + Printer1.Justify = 0 + s.Close + Printer1.WriteString(" " & CRLF) + s=Starter.skmt.ExecQuery($"select HVD_PRONOMBRE, HVD_CANT, length(HVD_CANT) as L_CANT, HVD_COSTO_TOT, length(HVD_COSTO_TOT) as L_COSTOU,HVD_PROID, HVD_CODPROMO,IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) AND HVD_RECHAZO = 0 AND HVD_CODPROMO <> '${Subs.traeAlmacen}' order by HVD_CODPROMO, ESPROMO DESC, HVD_PROID"$) + + If S.RowCount>0 Then + Printer1.WriteString("-------PROMOS ENTREGA--------" & CRLF) + Printer1.WriteString("Cant. Precio Importe" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + + For i=0 To S.RowCount -1 + S.Position=i + If s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT") > 0 Then + If s.GetString("HVD_CODPROMO") <> Subs.traeAlmacen Then + Printer1.Justify = 0 + If s.GetString("HVD_CODPROMO") = s.GetString("HVD_PROID") Then + Printer1.WriteString("* "&s.GetString("HVD_PRONOMBRE") & CRLF) + Else + Printer1.WriteString((s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))&" "&s.GetString("HVD_PRONOMBRE") & CRLF) + End If +' Dim punit As String =NumberFormat2((s.GETSTRING("HVD_COSTO_TOT")/s.GetString("HVD_CANT")),0,2,2,False) +' TAMANO = punit.Length + TAMANO + ' +' Private ptot As String = NumberFormat2((punit*s.GetString("HVD_CANT")),0,2,2,False) +' TAMANO = ptot.Length + TAMANO +' ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) +' For E=0 To ESPACIO -1 +' BLANCO = " " & BLANCO +' Next +' Printer1.Justify = 0 +' Printer1.WriteString( (s.GetString("HVD_CANT") - s.GetString("HVD_RECHAZOCANT"))& BLANCO) +' Printer1.Justify = 1 +' Printer1.WriteString( punit & BLANCO) +' Printer1.Justify = 2 +' Printer1.WriteString(ptot & CRLF ) +' TAMANO = 0 +' ESPACIO = 29 +' BLANCO = " " + Printer1.Justify = 0 + Else + End If + End If + Next + End If + + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Sleep(1000) + Printer1.DisConnect + ProgressDialogHide +' Guardado + +End Sub \ No newline at end of file diff --git a/B4A/C_Detalle_Promo.bas b/B4A/C_Detalle_Promo.bas new file mode 100644 index 0000000..0f98bdf --- /dev/null +++ b/B4A/C_Detalle_Promo.bas @@ -0,0 +1,112 @@ +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 + Dim c As Cursor +' Dim ruta As String + Dim Regresar As Button + Dim b As Cursor + Dim regalo As String + Dim ListView1 As ListView + Dim L_CANT As Label + Dim L_TOTAL As Label + Dim borra As Button + Dim Existe As String +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + Root.LoadLayout("detalle_promo") + c=Starter.skmt.ExecQuery("select CAT_DP_IDPROD, CAT_DP_PZAS, CAT_DP_PRECIO FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID)") + ListView1.Clear + Subs.SetDivider(ListView1, Colors.LightGray, 2) + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + b=Starter.skmt.ExecQuery2("select CAT_GP_NOMBRE from cat_gunaprod where CAT_GP_ID = ?", Array As String(C.GetString("CAT_DP_IDPROD"))) + B.Position =0 + Dim label1 As Label + label1 = ListView1.TwoLinesLayout.Label + label1.TextSize = 10 + label1.TextColor = Colors.White + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 10 + label2.TextColor = Colors.White + If c.GetString("CAT_DP_PRECIO") = 0 Then + regalo = "SI" + Else + regalo = "NO" + End If + ListView1.AddTwoLines(B.GetString("CAT_GP_NOMBRE"),"Cantidad # "& c.GetString("CAT_DP_PZAS")& " REGALO "& regalo) + b.Close + 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. + +Sub B4XPage_Appear + Starter.skmt.Initialize(Starter.ruta,"kmt.db", True) + c=Starter.skmt.ExecQuery("select CAT_DP_IDPROD, CAT_DP_PZAS, CAT_DP_PRECIO FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID)") + ListView1.Clear + Subs.SetDivider(ListView1, Colors.LightGray, 2) + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + b=Starter.skmt.ExecQuery2("select CAT_GP_NOMBRE from cat_gunaprod where CAT_GP_ID = ?", Array As String(C.GetString("CAT_DP_IDPROD"))) + B.Position =0 + Dim label1 As Label + label1 = ListView1.TwoLinesLayout.Label + label1.TextSize = 10 + label1.TextColor = Colors.White + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 10 + label2.TextColor = Colors.White + If c.GetString("CAT_DP_PRECIO") = 0 Then + regalo = "SI" + Else + regalo = "NO" + End If + ListView1.AddTwoLines(B.GetString("CAT_GP_NOMBRE"),"Cantidad # "& c.GetString("CAT_DP_PZAS")& " REGALO "& regalo) + b.Close + Next + c.Close + End If + 'la_no_ird.Text = c.GetString("PR_CF_SALDO_ACORT") +End Sub + +Sub Activity_Pause (UserClosed As Boolean) + +End Sub + +Sub Regresar_Click +' StartActivity(pedidos) + B4XPages.ShowPage("") +End Sub + +Sub Activity_KeyPress (key As Int) As Boolean + ' BACK key pressed + If key=KeyCodes.KEYCODE_BACK Then + ' I want to capture the key here so I return True +' StartActivity(pedidos) + B4XPages.ShowPage("") + 'Return True + End If + ' Returning False signals the system to handle the key + Return False +End Sub diff --git a/B4A/C_Foto.bas b/B4A/C_Foto.bas new file mode 100644 index 0000000..acd0486 --- /dev/null +++ b/B4A/C_Foto.bas @@ -0,0 +1,167 @@ +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 frontCamera As Boolean = False + Dim g As GPS + Private p_camara As Panel + Private camEx As CameraExClass + Dim btnTakePicture As Button + Dim c As Cursor + Dim cuenta As String + Dim lat_gps As String + Dim USUARIO As String + Dim MOTIVO As String +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + g.Initialize("GPS") + Root.LoadLayout("foto") + c=Starter.skmt.ExecQuery("select cuenta from cuentaa") + c.Position = 0 + cuenta = c.GetString("CUENTA") +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub B4XPage_Appear + InitializeCamera +End Sub + +Private Sub InitializeCamera + camEx.Initialize(p_camara, frontCamera, Me, "Camera1") + frontCamera = camEx.Front +End Sub + +Sub Activity_Pause (UserClosed As Boolean) +' camEx.Release +End Sub + +Sub GPS_LocationChanged (Location1 As Location) + +End Sub + +Sub Camera1_Ready (Success As Boolean) + If Success Then + camEx.SetJpegQuality(90) + camEx.CommitParameters + camEx.StartPreview + Log(camEx.GetPreviewSize) + Else + ToastMessageShow("Cannot open camera.", True) + End If +End Sub + +Sub btnTakePicture_Click + Dim ps As CameraSize + ps.Width =640 + ps.Height =480 + camEx.SetPictureSize(ps.Width, ps.Height) + 'ToastMessageShow(ps.Width & "x" & ps.Height, False) + camEx.CommitParameters + camEx.TakePicture +End Sub + +Sub btnFocus_Click + camEx.FocusAndTakePicture +End Sub + +Sub Camera1_PictureTaken (Data() As Byte) + Dim filename As String = "1.jpg" + Dim dir As String = File.DirInternal + + camEx.SavePictureToFile(Data, dir, filename) + camEx.StartPreview 'restart preview + 'Dim out As OutputStream + Dim sDate,sTime As String + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=Starter.skmt.ExecQuery("select CUENTA from cuentaa") + c.Position = 0 + cuenta = c.GetString("CUENTA") + c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position = 0 + USUARIO = c.GetString("USUARIO") + c.Close + Starter.skmt.ExecNonQuery("DELETE FROM NOVENTA WHERE NV_CLIENTE IN (select cuenta from cuentaa)") + c=Starter.skmt.ExecQuery("select HVD_CLIENTE,HVD_PRONOMBRE,HVD_CANT,HVD_COSTO_TOT from HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) order by HVD_PRONOMBRE asc") + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT) select HVD_CLIENTE, HVD_PRONOMBRE, HVD_CANT, HVD_COSTO_TOT from hist_ventas where HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(c.GetString("HVD_PRONOMBRE"))) + Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(c.GetString("HVD_CANT"),c.GetString("HVD_PRONOMBRE"))) + ' ANTES DE MODIFCAR + Next + End If + Starter.skmt.ExecNonQuery2("INSERT INTO NOVENTA (NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON, NV_FOTO) VALUES(?,?,?,?,?,?,?,?) ", Array As Object (cuenta,sDate & sTime, USUARIO, "CERRADO", B4XPages.MainPage.noVenta.COMENTARIO, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps, Data)) + Starter.skmt.ExecNonQuery($"UPDATE kmt_info set gestion = 3, HORAENT = '${sDate & " " & sTime}' where CAT_CL_CODIGO In (select cuenta from cuentaa)"$) + Starter.skmt.ExecNonQuery("update HIST_VENTAS SET HVD_RECHAZO = 1 WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + B4XPages.ShowPage("Cliente") +End Sub + +Sub ChangeCamera_Click + camEx.Release + frontCamera = Not(frontCamera) + InitializeCamera +End Sub + +Sub btnEffect_Click + Dim effects As List = camEx.GetSupportedColorEffects + If effects.IsInitialized = False Then + ToastMessageShow("Effects not supported.", False) + Return + End If + Dim effect As String = effects.Get((effects.IndexOf(camEx.GetColorEffect) + 1) Mod effects.Size) + camEx.SetColorEffect(effect) + ToastMessageShow(effect, False) + camEx.CommitParameters +End Sub + +Sub btnFlash_Click + Dim f() As Float = camEx.GetFocusDistances + Log(f(0) & ", " & f(1) & ", " & f(2)) + Dim flashModes As List = camEx.GetSupportedFlashModes + If flashModes.IsInitialized = False Then + ToastMessageShow("Flash not supported.", False) + Return + End If + Dim flash As String = flashModes.Get((flashModes.IndexOf(camEx.GetFlashMode) + 1) Mod flashModes.Size) + camEx.SetFlashMode(flash) + ToastMessageShow(flash, False) + camEx.CommitParameters +End Sub + +Sub btnPictureSize_Click + Dim pictureSizes() As CameraSize = camEx.GetSupportedPicturesSizes + Dim current As CameraSize = camEx.GetPictureSize + For i = 0 To pictureSizes.Length - 1 + If pictureSizes(i).Width = current.Width And pictureSizes(i).Height = current.Height Then Exit + Next + Dim ps As CameraSize = pictureSizes((i + 1) Mod pictureSizes.Length) + camEx.SetPictureSize(ps.Width, ps.Height) + ToastMessageShow(ps.Width & "x" & ps.Height & i, False) + camEx.CommitParameters +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub + ' BACK key pressed + ' I want to capture the key here so I return True + B4XPages.ShowPage("Cliente") + ' Returning False signals the system to handle the key + Return False +End Sub + diff --git a/B4A/C_Historico.bas b/B4A/C_Historico.bas new file mode 100644 index 0000000..adeba39 --- /dev/null +++ b/B4A/C_Historico.bas @@ -0,0 +1,609 @@ +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 + Dim g As GPS + Dim clie_id As String + Dim sDate,sTime As String + Dim usuario As String + Dim c As Cursor +' Dim ruta As String + Dim b_regresar As Button + Dim ListView1 As ListView + Dim L_CANT As Label + Dim L_TOTAL As Label + Dim b_borra As Button + Dim Existe As String + Dim result As String + ' Dim lat_gps, lon_gps As String + Dim cuantos As String + Dim nombre_prod As String + Dim cuantos_pedido As String + Private Titulo As Label + Private P1 As Panel + Private lv2 As ListView + Private p_principal As Panel + Dim clv_pedido As CustomListView + Private p_prods As Panel + Private l_prodX As Label + Private l_pCant As Label + Private et_pCant As EditText + Dim bmp As Bitmap + Dim etCantHasFocus As Boolean = False + Dim totalProds As Int = 0 + Dim totalCompra As Int = 0 + Dim prodsMap As Map + Dim reconstruirPedido As Boolean = False + Dim promoABorrar As String + Private b_guardar As Button + Private b_prodMas As Button + Private b_prodMenos As Button +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + g.Initialize("GPS") + Root.LoadLayout("historico") + b_borra.Visible = False + Titulo.Text = "Pedido" +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub B4XPage_Appear + Subs.centraPanel(p_principal, Root.Width) +' b_guardar.Visible = False + +' Titulo.Left = Round(p_principal.Width/2)-(Titulo.Width/2) + L_CANT.Text ="" + L_TOTAL.Text="" + c=Starter.skmt.ExecQuery("select count(*) as EXISTE from HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ") + C.Position=0 + Existe = C.GetString("EXISTE") + C.Close +' c=Starter.skmt.ExecQuery("select distinct hist_ventas.hvd_num_registro, HIST_VENTAS.HVD_CLIENTE, HIST_VENTAS.HVD_PRONOMBRE, HIST_VENTAS.HVD_PROID, HIST_VENTAS.HVD_CANT, HIST_VENTAS2.HVD_CANT as HVD_CANT2, HIST_VENTAS.HVD_COSTO_TOT, HIST_VENTAS.HVD_CODPROMO from HIST_VENTAS inner join HIST_VENTAS2 on HIST_VENTAS.HVD_PROID = HIST_VENTAS2.HVD_PROID and HIST_VENTAS.HVD_CLIENTE = HIST_VENTAS2.HVD_CLIENTE WHERE HIST_VENTAS.HVD_CLIENTE IN (Select CUENTA from cuentaa) and HIST_VENTAS.HVD_RECHAZO = 0 order by HIST_VENTAS.HVD_CODPROMO desc, HIST_VENTAS.HVD_PRONOMBRE asc") + c=Starter.skmt.ExecQuery("select hvd_num_registro, HVD_CLIENTE, HVD_PRONOMBRE, HVD_PROID, HVD_CANT, HVD_COSTO_TOT, HVD_CODPROMO from HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 and hvd_cant > 0 order by HVD_CODPROMO desc, HVD_PRONOMBRE asc") + ListView1.Clear + clv_pedido.Clear + Subs.SetDivider(ListView1, Colors.LightGray, 2) + clv_pedido.GetBase.SetLayoutAnimated(100, 0dip, 60dip, Root.Width - 50, Root.Height * 0.62) 'Cambiamos el tamaño y posición de la lista de productos + clv_pedido.Base_Resize(clv_pedido.GetBase.Width, clv_pedido.GetBase.Height) 'Cambiamos el tamaño del panel interno de la lista para que ajuste al nuevo tamaño. +' Log("RC1:"&c.RowCount) + If c.RowCount>0 Then +' Log("Usamos HV") + For i=0 To c.RowCount -1 + c.Position=i + 'Traemos cantidad de hvd2 + Private oc As Cursor = Starter.skmt.ExecQuery($"select HVD_CANT from HIST_VENTAS2 WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) and hvd_proid = '${c.GetString("HVD_PROID")}' and HVD_NUM_REGISTRO = '${c.GetString("HVD_NUM_REGISTRO")}'"$) + Private cant2 As Int = 0 + If oc.RowCount > 0 Then + oc.Position = 0 + cant2 = oc.GetString("HVD_CANT") + End If + oc.Close + Dim label1 As Label + label1 = ListView1.TwoLinesLayout.Label + label1.TextSize = 12 + label1.TextColor = Colors.black + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 12 + label2.TextColor = Colors.black + Private bgColor, textColor As Int + bgColor = Colors.RGB(177, 200, 249)'azul + textColor = Colors.black + If c.GetString("HVD_CODPROMO") <> "1" Then +' bgColor = Colors.RGB(255, 212, 163) 'naranja + bgColor = Colors.White + End If +' Log($"Agregamos prod a lista1 | ${c.GetString("HVD_CANT")} - ${c.GetString("HVD_CANT2")}"$) 'HVD_CANT2 es la original de la orden. +' ListView1.AddTwoLines(c.GetString("HVD_PRONOMBRE"),"Cantidad #"& c.GetString("HVD_CANT")& " SubTotal $"& c.GetString("HVD_COSTO_TOT")) + clv_pedido.Add(CreateListItem(c.GetString("HVD_PRONOMBRE"), Subs.traePrecio(c.GetString("HVD_PROID"), c.GetString("HVD_CODPROMO")), c.GetString("HVD_CANT"), 0, clv_pedido.AsView.Width, 50dip, bmp, c.GetString("HVD_PROID"), bgColor, textColor, c.GetString("HVD_CODPROMO"),Subs.traeCliente), c.GetString("HVD_PRONOMBRE")) + Next +' cuentaProds("") + End If + 'Traemos lo vendido + Private vc As Cursor = Starter.skmt.ExecQuery("select * from REPARTO where REP_CLIENTE in (select cuenta from cuentaa) and REP_RECHAZO = '0' and REP_CANT > 0 order by REP_PRONOMBRE") + Log($"VENTA: ${vc.RowCount}"$) + If vc.RowCount > 0 Then +' Log("Usamos REPARTO") +' bgColor = Colors.RGB(248,113,113) + textColor = Colors.RGB(0,87,142) + For i=0 To vc.RowCount -1 + vc.Position = i + Private cantCO As Int = 0 + 'Traemos la cantidad disponible del cliente original + Private cco As Cursor = Starter.skmt.ExecQuery($"select * from REPARTO where REP_CLIENTE = '${vc.GetString("REP_CLI_ORIG")}' and REP_CLI_ORIG = '${vc.GetString("REP_CLI_ORIG")}' and REP_PRODID='${vc.GetString("REP_PRODID")}' and REP_RECHAZO = '1' and REP_CANT > 0"$) + + If cco.RowCount > 0 Then + cco.Position = 0 + cantCO = cco.GetString("REP_CANT") + vc.GetString("REP_CANT") + End If + cantCO = Subs.traeCantidadRechazada(vc.GetString("REP_CLI_ORIG"), vc.GetString("REP_PRODID")) + +' Log($"${vc.GetString("REP_CLI_ORIG")}, ${vc.GetString("REP_CLIENTE")}, ${vc.GetString("REP_PRODID")}, ${vc.GetString("REP_PRONOMBRE")}, ${vc.GetString("REP_RECHAZO")}, ${vc.GetString("REP_CANT")}, ${vc.GetString("REP_PRECIO")}, ${cantCO}, ${cco.GetString("REP_CANT")}, ${vc.GetString("REP_CANT")}"$) + clv_pedido.Add(CreateListItem(vc.GetString("REP_PRONOMBRE"), Subs.traePrecio(vc.GetString("REP_PRODID"), Subs.traeAlmacen), vc.GetString("REP_CANT"), cantCO, clv_pedido.AsView.Width, 50dip, bmp, vc.GetString("REP_PRODID"), bgColor, textColor, 1, vc.GetString("REP_CLI_ORIG")), vc.GetString("REP_PRONOMBRE")) + Next + cco.Close + vc.Close + End If + + If Existe <> 0 Then + c = Starter.skmt.ExecQuery("select SUM(HVD_CANT) AS PC_NOART, SUM(HVD_COSTO_TOT) AS PC_MONTO from HIST_VENTAS where HVD_CLIENTE in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ") + C.Position=0 + L_CANT.Text = c.GetString("PC_NOART") + L_TOTAL.Text = Round2(c.GetString("PC_MONTO"), 2) + End If + c=Starter.skmt.ExecQuery("select count(*) as EXISTE from PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + c.Position=0 + Existe = C.GetString("EXISTE") + c.Close +' c=Starter.skmt.ExecQuery("select PE_PRONOMBRE,PE_COSTO_TOT, PE_CANT FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) order by PE_PRONOMBRE asc") + 'ListView1.Clear + Subs.SetDivider(ListView1, Colors.LightGray, 2) +' Log("RC2:" & c.RowCount) +' If c.RowCount > 0 Then +' For i=0 To c.RowCount -1 +' c.Position=i +' Dim label1 As Label +' label1 = ListView1.TwoLinesLayout.Label +' label1.TextSize = 12 +' label1.TextColor = Colors.White +' Dim label2 As Label +' label2 = ListView1.TwoLinesLayout.SecondLabel +' label2.TextSize = 12 +' label2.TextColor = Colors.White +' Log("Agegamos prod a lista 2") +' ListView1.AddTwoLines("VENTA" & c.GetString("PE_PRONOMBRE"),"Cantidad #"& c.GetString("PE_CANT")& " SubTotal $"& c.GetString("PE_COSTO_TOT")) +' 'folio = c.GetString("PE_FOLIO") +' Next +' End If + If Existe <> 0 Then + c=Starter.skmt.ExecQuery("select SUM(PE_CANT) AS PE_CANT, SUM(PE_COSTO_TOT) AS PE_COSTO_TOT FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + C.Position=0 + L_CANT.Text = L_CANT.Text + c.GetString("PE_CANT") + L_TOTAL.Text = Round2(L_TOTAL.Text + c.GetString("PE_COSTO_TOT"), 2) + End If + 'la_no_ird.Text = c.GetString("PR_CF_SALDO_ACORT") +' cuentaProds("") + Private cym As Map = Subs.traemosCantYMonto(clv_pedido) + L_CANT.Text = cym.Get("cantidad") + L_TOTAL.Text = Round2(cym.Get("monto"), 2) +End Sub + +Sub GPS_LocationChanged (Location1 As Location) +' lat_gps=Location1.ConvertToSeconds(Location1.Latitude) +' lon_gps=Location1.ConvertToSeconds(Location1.Longitude) +End Sub + +Sub b_regresar_Click + B4XPages.ShowPage("Cliente") +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub + ' BACK key pressed + ' I want to capture the key here so I return True + B4XPages.ShowPage("Cliente") + ' Returning False signals the system to handle the key + Return False +End Sub + +Sub ListView1_ItemLongClick (Position As Int, Value As Object) 'BORRAR +' nombre_prod = Value +' result = Msgbox2("Seguro que desa borrar este articulo?","Borrar Articulo", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore +' If result = DialogResponse.POSITIVE Then +' c=Starter.skmt.ExecQuery2("select HVD_CANT FROM hist_ventas where HVD_pronombre = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As String(Value)) +' c.Position=0 +' If c.GetString("HVD_CANT") > 1 Then +' b_regresar.Visible =False +' b_borra.Visible=False +' P1.Visible =True +' cuantos_pedido = c.GetString("HVD_CANT") +' lv2.Clear +' lv2.SingleLineLayout.Label.TextColor = Colors.Black +' For i=1 To c.GetString("HVD_CANT") +' lv2.AddSingleLine(i) +' Next +' Else +' ' skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(c.GetString("HVD_CANT"),Value)) +' c.Close +' Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT,REP_FECHA, REP_CLI_ORIG) select HVD_CLIENTE, HVD_PRONOMBRE, HVD_CANT, HVD_COSTO_TOT, HVD_FECHA, HVD_CLIENTE from hist_ventas where HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) +' c=Starter.skmt.ExecQuery2("select HVD_CANT FROM hist_ventas where HVD_pronombre = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As String(Value)) +' c.Position=0 +' Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(c.GetString("HVD_CANT"),Value)) +' c.Close +' +' 'skmt.ExecNonQuery2("delete FROM HIST_VENTAS WHERE HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) +' ' se cambia por update para no borrarlo y tener todos los registros. +' Starter.skmt.ExecNonQuery2("update HIST_VENTAS set HVD_RECHAZO = 1 WHERE HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) +' +' DateTime.DateFormat = "MM/dd/yyyy" +' sDate=DateTime.Date(DateTime.Now) +' sTime=DateTime.Time(DateTime.Now) +' c=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") +' c.Position=0 +' clie_id = c.GetString("CUENTA") +' c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") +' c.Position=0 +' usuario = c.GetString("USUARIO") +' 'quitar esta mamada no es ahi +' Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 3 where CAT_CL_CODIGO In (select cuenta from cuentaa)") +' B4XPage_Appear +' End If +' +' End If +End Sub + +Sub lv2_ItemClick (Position As Int, Value As Object) 'BORRAR +' ' If Value = "Todos" Then +' ' cuantos = c.GetString("HVD_CANT") +' 'Else +' cuantos = Value +' ' End If +' If cuantos = cuantos_pedido Then +' 'Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(c.GetString("HVD_CANT"),nombre_prod)) +' c.Close +' Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT, REP_FECHA, REP_CLI_ORIG) select HVD_CLIENTE, HVD_PRONOMBRE, HVD_CANT, HVD_COSTO_TOT, HVD_FECHA, HVD_CLIENTE from hist_ventas where HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(nombre_prod)) +' c=Starter.skmt.ExecQuery2("select HVD_CANT FROM hist_ventas where HVD_pronombre = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As String(nombre_prod)) +' c.Position=0 +' Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(c.GetString("HVD_CANT"),nombre_prod)) +' c.Close +' 'Starter.skmt.ExecNonQuery2("delete FROM HIST_VENTAS WHERE HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) +' ' se cambia por update para no borrarlo y tener todos los registros. +' Starter.skmt.ExecNonQuery2("update HIST_VENTAS set HVD_RECHAZO = 1 WHERE HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As String(Value)) +' DateTime.DateFormat = "MM/dd/yyyy" +' sDate=DateTime.Date(DateTime.Now) +' sTime=DateTime.Time(DateTime.Now) +' c=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") +' c.Position=0 +' clie_id = c.GetString("CUENTA") +' c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") +' c.Position=0 +' usuario = c.GetString("USUARIO") +' 'quitar esta m*m*d* no es ahi +' Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 3 where CAT_CL_CODIGO In (select cuenta from cuentaa)") +' Starter.skmt.ExecNonQuery2("update hist_Ventas set HVD_RECHAZO = 1, HVD_PARCIAL = 0, HVD_CANT = HVD_CANT - ? where HVD_pronombre = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As Object(cuantos, nombre_prod)) +' b_regresar.Visible =True +' b_borra.Visible=True +' P1.Visible =False +' B4XPage_Appear +' Else +' ' skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(cuantos,nombre_prod)) +' c.Close +' +' 'modificar tambien esto +' 'Modificaciones para que solo quite una parte. +' Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT, REP_FECHA, REP_CLI_ORIG) select HVD_CLIENTE, HVD_PRONOMBRE, ?, ? * (HVD_COSTO_TOT/?), HVD_FECHA, HVD_CLIENTE from hist_ventas where HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As Object(cuantos,cuantos,cuantos_pedido, nombre_prod)) +' Starter.skmt.ExecNonQuery2("insert into hist_ventas(HVD_CLIENTE,HVD_PRONOMBRE,HVD_CANT,HVD_COSTO_TOT, HVD_FECHA, HVD_CODPROMO, HVD_PROID,HVD_NUM_TICKET, HVD_NUM_REGISTRO, HVD_RECHAZO, HVD_ESTATUS, HVD_PARCIAL) select HVD_CLIENTE,HVD_PRONOMBRE,?,HVD_COSTO_TOT, HVD_FECHA, HVD_CODPROMO, HVD_PROID,HVD_NUM_TICKET, HVD_NUM_REGISTRO, 1, HVD_ESTATUS, 1 from hist_ventas where HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As Object(cuantos, nombre_prod)) +' Starter.skmt.ExecNonQuery2("update hist_Ventas set HVD_RECHAZO = 0, HVD_PARCIAL = 1, HVD_CANT = HVD_CANT - ? where HVD_pronombre = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As Object(cuantos, nombre_prod)) +' Starter.skmt.ExecNonQuery2("update hist_Ventas set HVD_COSTO_TOT = HVD_CANT * (HVD_COSTO_TOT/?) where HVD_pronombre = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As Object(cuantos_pedido, nombre_prod)) +' Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(cuantos,nombre_prod)) +' 'crear nueva tabla para que guarde el resto. +'' skmt.ExecNonQuery2("delete FROM HIST_VENTAS WHERE HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) +' DateTime.DateFormat = "MM/dd/yyyy" +' sDate=DateTime.Date(DateTime.Now) +' sTime=DateTime.Time(DateTime.Now) +' c=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") +' c.Position=0 +' clie_id = c.GetString("CUENTA") +' c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") +' c.Position=0 +' usuario = c.GetString("USUARIO") +' Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 3 where CAT_CL_CODIGO In (select cuenta from cuentaa)") +' B4XPage_Appear +' b_regresar.Visible =True +' b_borra.Visible=True +' P1.Visible =False +' End If +End Sub + +'**************************************************************************** +'***************** PARA EL MAS/MENOS ************************************* +'**************************************************************************** + +Sub CreateListItem(Text As String, precioU As String, inv As Int, inv2 As Int, Width As Int, Height As Int, img As Bitmap, prodId As String, bc As Int, tc As Int, promo As String, cliente_original As String) As Panel + Dim p As B4XView = xui.CreatePanel("") + Private cs As CSBuilder + cs.Initialize + p.SetLayoutAnimated(0, 0, 0, Width, Height) + p.LoadLayout("prodItem") + p_prods.Color = bc + l_prodX.TextColor = tc + precioU = $"$1.2{precioU}"$ + l_prodX.Text = Text&CRLF&"Cant: " & inv2 & " $" & precioU + If promo <> "1" And precioU = 0 Then + l_prodX.Text = cs.Color(Colors.RGB(123,0,0)).append(Text&CRLF&"Cant: " & inv2 & " $" & precioU).PopAll + End If + l_prodX.Tag = $"ID: ${prodId}${CRLF}${Text}${CRLF}Precio: $$1.2{precioU}${CRLF}Inv: ${inv} pzs"$ +' l_pCant.Text = 0 + l_pCant.Tag = Round2(precioU,2)&"|"&inv&"|"&prodId&"|"&promo&"|"&inv2&"|"&cliente_original + et_pCant.Tag = Round2(precioU,2)&"|"&inv&"|"&prodId&"|"&promo&"|"&inv2&"|"&cliente_original + p_prods.Tag = l_pCant.tag +' Log($"Ponemos la cant en ${inv}"$) + l_pCant.Text = inv +' et_pCant.Text = inv +' et_pCant.BringToFront + + l_pCant.BringToFront + et_pCant.SendToBack + +' i_prod.Bitmap = img + Return p +End Sub + +Sub b_prodMenos_Click + etCantHasFocus = False + Log("etCantHasFocus=" & etCantHasFocus) + LogColor("b_prodMenos_Click", Colors.Magenta) + Dim index As Int = clv_pedido.GetItemFromView(Sender) + Dim pnl0 As B4XView = clv_pedido.GetPanel(index) + Dim pnl As B4XView = pnl0.GetView(0) + Dim laCant As B4XView = pnl.GetView(2).GetView(3) +' Log(pnl.GetView(2).GetView(0) & "|" & pnl.GetView(2).GetView(1) & "|" & pnl.GetView(2).GetView(2)) + Dim esteTag As List = Regex.Split("\|", laCant.Tag) + Log("LC_TEXT:"&laCant.Text&"|PROMO:"&esteTag.Get(3)&"|LC_TAG:"&laCant.Tag&"|ET:"&esteTag) + If esteTag.Get(3) <> "1" Then 'Si es PROMO entonces ... + Log("ES PROMO") + result = Msgbox2("Si se modifica una promoción, la promoción se rompe y solo quedarán los productos sueltos, ¿seguro que desea continuar?","Modificar Promoción", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore + If result = DialogResponse.POSITIVE Then 'Quitamos esta promo + prodsMap.Remove(esteTag.Get(3)) + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1 WHERE HVD_PROID = '${esteTag.Get(3)}' and HVD_cliente in (Select CUENTA from cuentaa)"$) + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_CODPROMO = '${Subs.traeAlmacen}' WHERE HVD_cliente in (Select CUENTA from cuentaa) AND HVD_CODPROMO = '${esteTag.Get(3)}'"$) + LogColor(prodsMap, Colors.red) + reconstruirPedido = True + promoABorrar = esteTag.Get(3) + B4XPage_Appear + End If + Else + If laCant.Text = "" Then laCant.Text = 0 + laCant.Text = $"$1.0{laCant.Text-1}"$ + If laCant.Text < 0 Then laCant.Text = 0 + Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + 1 where cat_gp_id = ?", Array As Object(esteTag.Get(2))) + End If + Dim preciou As Float = esteTag.Get(0)/esteTag.Get(1) + Log("PU: " & preciou) +' LogColor("estamos aqui mmenos " & laCant.Text& " , " & (preciou * laCant.Text),Colors.Green ) +' If L_CANT.Text - 1 >= 0 Then +' L_CANT.Text = L_CANT.Text - 1 +' End If +' b_guardar.Visible = True + Subs.prodRechazo(esteTag.Get(5), esteTag.Get(2)) + Private cym As Map = Subs.traemosCantYMonto(clv_pedido) + L_CANT.Text = cym.Get("cantidad") + L_TOTAL.Text = Round2(cym.Get("monto"), 2) +' cuentaProds("-") +End Sub + +Sub b_prodMas_Click + etCantHasFocus = False +' Log("etCantHasFocus=" & etCantHasFocus) + LogColor("b_prodMas_Click", Colors.Magenta) + Dim index As Int = clv_pedido.GetItemFromView(Sender) + Dim pnl0 As B4XView = clv_pedido.GetPanel(index) + Dim pnl As B4XView = pnl0.GetView(0) + Dim laCant As B4XView = pnl.GetView(2).GetView(3) +' Log(pnl.GetView(2).GetView(1).text&"|"&pnl.GetView(2).GetView(2)&"|"&pnl.GetView(2).GetView(4).text) +' Log($"precio|stock:${laCant.tag}"$) +' Log($"Indice: ${index}, cant:${laCant.Text+1}, precioU: ${laCant.tag}"$) + Dim esteTag As List = Regex.Split("\|", laCant.Tag) + Log("LC_TEXT:"&laCant.Text&"|LC_TAG:"&laCant.Tag&"|ET:"&esteTag) + If laCant.Text = "" Then laCant.Text = 0 + + Private maxProds as string = esteTag.Get(1) + esteTag.Get(4) 'Prods disponibles + prods comprados + + LogColor($"++++++++++++++++++++++++++ ${esteTag}"$, Colors.Green) +' Log(esteTag.get(4)) + If laCant.Text + 1 <= maxProds Then + Log($"NuevaCant = ${laCant.Text + 1}"$) + laCant.Text = $"$1.0{laCant.Text + 1}"$ + Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen - 1 where cat_gp_id = ?", Array As Object(esteTag.Get(2))) + Subs.prodVenta(esteTag.Get(5), esteTag.Get(2)) + Private cym As Map = Subs.traemosCantYMonto(clv_pedido) + L_CANT.Text = cym.Get("cantidad") + L_TOTAL.Text = Round2(cym.Get("monto"), 2) +' cuentaProds("+") + End If +' Dim preciou As Float = esteTag.Get(0)/esteTag.Get(1) +' Log(preciou) +' LogColor("estamos aquii mas " & laCant.Text& " , " & (preciou * laCant.Text) ,Colors.Green ) +' b_guardar.Visible = True +' Log($"Total Prods: ${totalProds}, Total Compra: $$1.2{totalCompra}"$) +' c = Starter.skmt.ExecQuery($"SELECT HVD_CANT FROM HIST_VENTAS2 WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND HVD_PROID = '${esteTag.Get(2)}' "$) +' c.Position = 0 +' Dim cantoriginal As String = 0 +' If c.RowCount > 0 Then +' cantoriginal = c.GetString("HVD_CANT") +' End If +' If cantoriginal <= esteTag.Get(1) Then +' L_CANT.Text = L_CANT.Text + 1 +' End If +End Sub + +Sub cuentaProds(accion As String) +' Log("Entramos a cuentaProds") +Log("*******************************************************") + Private cantRechazada As Int = 0 + If Not(reconstruirPedido) Then + Log("*********** CUENTAPRODS - NO RECONSTRUIR") + prodsMap.Initialize + For i = 0 To clv_pedido.GetSize - 1 + Private p0 As B4XView = clv_pedido.GetPanel(i) + Private p As B4XView = p0.GetView(0) + Private cant1 As B4XView = p.GetView(2).GetView(3) + If cant1.Text = "" Then cant1.Text = 0 +' totalProds = totalProds + cant1.Text + Private esteTag As List = Regex.Split("\|", cant1.Tag) + Log("-------------------------------------") + Log($"ET: ${esteTag}"$) + Private esteProd As String = esteTag.Get(2) + Private estaCant As Int = cant1.Text + Private estaCantOriginal As Int = esteTag.Get(1) + Private esteCliente = Subs.traeCliente + Private esteProdNombre = Subs.traeNombre(esteProd) + Private esteClienteOriginal As Int = esteTag.Get(5) + Private fechaReparto As String = Subs.traeFechaReparto + Private maxProds = Subs.traeMaxCantidad(esteTag.Get(5), esteTag.Get(2)) + + If cant1.Text > maxProds Then cant1.Text = maxProds + + cantRechazada = esteTag.Get(4) - cant1.Text +' If accion = "-" Then cantRechazada = Subs.traeCantidadRechazada(esteClienteOriginal, esteProd) + 1 +' If accion = "+" Then cantRechazada = Subs.traeCantidadRechazada(esteClienteOriginal, esteProd) - 1 + Log($"${Subs.traeCantidadRechazada(esteClienteOriginal, esteProd)}, ${Subs.traeCantidadVendida(esteClienteOriginal, esteProd)}"$) + +' LogColor($"cantRechazada = ${esteTag.Get(4)} - ${cant1.Text}"$, Colors.Magenta) + LogColor($"cantRechazada = ${cantRechazada}"$, Colors.Magenta) + Private estePrecio As String = 0 + If Subs.traePrecio(esteProd, 1) <> Null Then estePrecio = Subs.traePrecio(esteProd, Subs.traeAlmacen) * cantRechazada + +' LogColor(esteProd & "|" & cant1.Text & "|" & estaCantOriginal & "|" & cantRechazada & "|" & estePrecio, Colors.red) +' LogColor($"cantRechazada=${cantRechazada} | ${esteProdNombre}"$, Colors.Blue) +' Log($"Ponemos HVD_CANT ${esteProd} en ${cant1.text}"$) + Starter.skmt.ExecNonQuery2("update HIST_VENTAS set HVD_PARCIAL = 1, HVD_CANT = ? WHERE HVD_PROID = ? and HVD_CLIENTE in (Select CUENTA from cuentaa)", Array As String(cant1.Text ,esteProd)) + Private rr As Cursor = Starter.skmt.ExecQuery($"select count(REP_CLIENTE) as hayRechazo from REPARTO where rep_prodid = '${esteProd}' and REP_CLIENTE in (Select CUENTA from cuentaa)"$) + rr.Position = 0 +' Log($"HayRechazo=${rr.GetString("hayRechazo")}"$) + If rr.GetString("hayRechazo") = 0 Then + Log("INSERTAMOS EN REPARTO") + Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT, REP_FECHA, REP_RECHAZO, REP_PRODID, REP_PRECIO, REP_CLI_ORIG) VALUES (?,?,?,?,?,1,?,?,?) ", Array As String(esteCliente, esteProdNombre, 0, estePrecio, fechaReparto, esteProd, estePrecio, esteCliente)) + Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT, REP_FECHA, REP_RECHAZO, REP_PRODID, REP_PRECIO, REP_CLI_ORIG) VALUES (?,?,?,?,?,0,?,?,?) ", Array As String(esteCliente, esteProdNombre, cantRechazada, 0, fechaReparto, esteProd, estePrecio, esteCliente)) + Else if esteClienteOriginal = "0" Then 'Actualizamos el rechazo en el cliente actual. +' Log($"Actualizamos REP_CANT=${cantRechazada}"$) +' Starter.skmt.ExecNonQuery($"update reparto set REP_CANT = '${cantRechazada}', REP_PRECIO = '${estePrecio}', REP_COSTO_TOT = '${estePrecio * cantRechazada}' where REP_CLIENTE in (Select CUENTA from cuentaa) and REP_CLI_ORIG = '${esteClienteOriginal}' and REP_RECHAZO = 1 and REP_PRODID = '${esteProd}'"$) + Else 'Cliente original <> 0 entonces actualizamos el rechazo en el cliente original y NO en el actual. + Log($"Actualizamos REP_CANT RECHAZO = ${cantRechazada}"$) +' Starter.skmt.ExecNonQuery($"update reparto set REP_CANT = ${cantRechazada}, REP_PRECIO = '${estePrecio}', REP_COSTO_TOT = '${estePrecio * cantRechazada}' where REP_CLIENTE = '${esteClienteOriginal}' and REP_CLI_ORIG = '${esteClienteOriginal}' and REP_RECHAZO = 1 and REP_PRODID = '${esteProd}'"$) +' Starter.skmt.ExecNonQuery($"update reparto set REP_CANT = '${cant1.Text}', REP_PRECIO = '${estePrecio}', REP_COSTO_TOT = '${estePrecio * cantRechazada}' where REP_CLIENTE in (Select CUENTA from cuentaa) and REP_CLI_ORIG = '${esteClienteOriginal}' and REP_RECHAZO = 0 and REP_PRODID = '${esteProd}'"$) + End If + + If cant1.Text > 0 Then +' totalCompra = totalCompra + (esteTag.get(0) * cant1.text) +' Log($"Cant: ${cant1.Text}, Suma: ${totalCompra}"$) + Private m As Map + m=CreateMap("cant":cant1.Text, "cant2":esteTag.get(4), "precio":esteTag.get(0), "promo":esteTag.get(3), "nombre":Subs.traeNombre(esteTag.Get(2)), "cli_orig":esteTag.get(5)) +' LogColor("PUT:" & esteTag.Get(2), Colors.Red) + prodsMap.Put(esteTag.Get(2), m) + End If + Log("-------------------------------------") + Next + End If + Private bgColor, textColor As Int + + If reconstruirPedido Then + Log("*********** CUENTAPRODS - SI RECONSTRUIR") + Private newPromo, newPrecio As String + clv_pedido.Clear + Log("Usamos PRODSMAP") + For Each pr As String In prodsMap.Keys + Private pr1 As Map = prodsMap.Get(pr) + Log("PPP: " & pr & "|PromoABorrar=" & promoABorrar & "|" & pr1) + bgColor = Colors.RGB(177, 200, 249)'azul + textColor = Colors.black + newPromo = pr1.Get("promo") + newPrecio = pr1.Get("precio") + Log("AAA: " & newPromo & "|" & promoABorrar) + If newPromo = promoABorrar Then + newPromo = 1 + newPrecio = Subs.traePrecio(pr, False) * pr1.Get("cant") + 'Ponemos precio SIN promo y sacamos el producto de la promo. + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_COSTO_TOT = ${newPrecio}, HVD_CODPROMO = '${Subs.traeAlmacen}' WHERE HVD_PRONOMBRE = '${pr1.Get("nombre")}' and HVD_cliente in (Select CUENTA from cuentaa)"$) + LogColor("CAMBIAMOS PROMO: " & newPromo, Colors.Magenta) + End If + If newPromo <> "1" Then +' bgColor = Colors.RGB(255, 212, 163) 'naranja + bgColor = Colors.White + End If + Log($"CLI: ${pr1.Get("nombre")}, ${newPrecio}, ${pr1.Get("cant")}, ${pr1.Get("cant2")}"$) + clv_pedido.Add(CreateListItem(pr1.Get("nombre"), newPrecio, pr1.Get("cant"), pr1.Get("cant2"), clv_pedido.AsView.Width, 50dip, bmp, pr, bgColor, textColor, newPromo, pr1.Get("cli_orig")), pr1.Get("nombre")) + reconstruirPedido = False + Next + promoABorrar = "" + End If + Log($"Total Prods: ${totalProds}, Total Compra: $$1.2{totalCompra}"$) + LogColor("prodsMap=" & prodsMap, Colors.Green) + + + LogColor(prodsMap, Colors.Blue) + c = Starter.skmt.ExecQuery($"SELECT sum(HVD_CANT) as CANTIDAD FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)"$) + Dim cantidad1 As String = 0 + If c.RowCount > 0 Then + c.Position = 0 + cantidad1 = c.GetString("CANTIDAD") + L_CANT.Text = Round(cantidad1) + End If + c.Close + + Dim totalfinal As String = 0 + For Each pr As String In prodsMap.Keys + Private pr1 As Map = prodsMap.Get(pr) +' LogColor(pr,Colors.Red) + Dim x As Cursor = Starter.skmt.ExecQuery($"SELECT CAT_GP_PRECIO FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${pr}'"$) + c = Starter.skmt.ExecQuery($"SELECT HVD_CANT FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND HVD_PROID ='${pr}' "$) + Dim cantidady As String = 0 + If c.RowCount >0 Then + c.Position = 0 + cantidady = c.GetString("HVD_CANT") + End If +' Log(x.RowCount) + If x.RowCount > 0 Then + x.Position = 0 +' Log(x.GetString("CAT_GP_PRECIO")) + Dim preciou As String = x.GetString("CAT_GP_PRECIO") + Dim costototalhist As String = preciou * cantidady +' Log("Total ==== "&costototalhist) + End If + totalfinal = totalfinal + costototalhist + x.Close + Next + L_TOTAL.Text = Round2(totalfinal, 2) + c.Close + + c = Starter.skmt.ExecQuery("select COUNT(*) AS CUANTOS from REPARTO where REP_CLIENTE in (select cuenta from cuentaa) and REP_RECHAZO = '0' and REP_CANT > 0 order by REP_PRONOMBRE") + If c.RowCount > 0 Then + c.Position = 0 + If c.GetString("CUANTOS") > 0 Then + + Dim z As Cursor = Starter.skmt.ExecQuery($"select SUM(REP_CANT) AS CANTIDAD , SUM(REP_PRECIO) AS PRECIO from REPARTO where REP_CLIENTE in (select cuenta from cuentaa) and REP_RECHAZO = '0' and REP_CANT > 0 order by REP_PRONOMBRE"$) + Dim cantidad2 As String = 0 +' Log(z.RowCount) + If z.RowCount > 0 Then + z.Position = 0 + cantidad2= z.GetString("CANTIDAD") +' LogColor(z.GetString("PRECIO")&" , " & z.GetString("CANTIDAD"), Colors.Magenta) +' Log(cantidad1 &" , "& cantidad2) + L_CANT.Text = Round((cantidad1 + cantidad2)) + End If + z.Close + + + End If + End If + + + +End Sub + +Private Sub b_guardar_Click + +End Sub + + +Private Sub l_pCant_Click + +End Sub + +Sub p_prods_Click + Log(Sender.As(Panel).tag) +End Sub \ No newline at end of file diff --git a/B4A/C_Mapas.bas b/B4A/C_Mapas.bas new file mode 100644 index 0000000..8371da5 --- /dev/null +++ b/B4A/C_Mapas.bas @@ -0,0 +1,24 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=12.2 +@EndOfDesignText@ +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + +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_NoVenta.bas b/B4A/C_NoVenta.bas new file mode 100644 index 0000000..dbd47f1 --- /dev/null +++ b/B4A/C_NoVenta.bas @@ -0,0 +1,442 @@ +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 + Dim g As GPS + Dim c As Cursor + Dim COMENTARIO As String + Dim CANCELA As Button + Dim GUARDA As Button + Dim r_1 As RadioButton + Dim r_2 As RadioButton + Dim r_3 As RadioButton + Dim e_comm As EditText + Dim motivo As String + Dim cuenta As String + Dim usuario As String + Dim sDate,sTime As String + Dim r_4 As RadioButton + Private p_principal As Panel + Dim d As Cursor + Dim reqManager As DBRequestManager + Private cb_reprogramar As CheckBox + Dim reprogramar As Int = 0 + + Private camEx As CameraExClass + Dim frontCamera As Boolean = False + Private p_cam As Panel + Dim nombrefoto As String = "0" + Private p_camara As Panel + Private teclado As IME + Dim fototomada As String + Private b_foto As Button + Private r_5 As RadioButton + Private r_6 As RadioButton + Private r_7 As RadioButton +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + Root.LoadLayout("no_venta") + reqManager.Initialize(Me, B4XPages.MainPage.SERVER) +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub B4XPage_Appear + reqManager.Initialize(Me, B4XPages.MainPage.SERVER) + e_comm.Text="" + r_1.Checked = False + r_2.Checked = False + r_3.Checked = False + r_4.Checked = False + r_5.Checked = False + r_6.Checked = False + r_7.Checked = False + cb_reprogramar.Checked = False + + p_camara.Width = Root.Width + p_camara.Height = Root.Height + p_camara.Visible = False + + CallSubDelayed(Tracker, "Track") + CallSubDelayed(Tracker, "StartFLPSmall") + If Tracker.FLP.IsInitialized And Tracker.FLP.GetLastKnownLocation.IsInitialized Then 'Si tenemos "UltimaUbicaccionConocida" la usamos. + B4XPages.MainPage.lat_gps = Tracker.FLP.GetLastKnownLocation.Latitude + B4XPages.MainPage.lon_gps = Tracker.FLP.GetLastKnownLocation.Longitude +' Log($"Tenemos UUC: ${Tracker.FLP.GetLastKnownLocation.Latitude},${Tracker.FLP.GetLastKnownLocation.Longitude}"$) + GPS_LocationChanged(Tracker.FLP.GetLastKnownLocation) + End If +End Sub + + + + + + +Sub GPS_LocationChanged (Location1 As Location) +' LogColor($"Entrando a Cliente.GPS_LocationChanged"$, Colors.red) + If Tracker.FLP.GetLastKnownLocation.IsInitialized And Tracker.FLP.GetLastKnownLocation.Latitude <> 0 Then + B4XPages.MainPage.lat_gps = Tracker.FLP.GetLastKnownLocation.Latitude + B4XPages.MainPage.lon_gps = Tracker.FLP.GetLastKnownLocation.Longitude + Log("Coords set to: " & B4XPages.MainPage.lat_gps & " and " & B4XPages.MainPage.lon_gps) + End If + + If B4XPages.MainPage.cliente.LATITUD.Length < 5 Then + + Else + + + Dim l1, l2 As Location + l1.Initialize2(B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps) + Log($"Coordenadas de la tienda - lat:${B4XPages.MainPage.cliente.LATITUD}, lon:${B4XPages.MainPage.cliente.LONGITUD}"$) + l2.Initialize2(B4XPages.MainPage.cliente.LATITUD, B4XPages.MainPage.cliente.LONGITUD) + + + + 'now we need the distance between our location and the target location + B4XPages.MainPage.cliente.distance = l1.DistanceTo(l2) 'the result is in meter + + Log("DISTANCIA "&B4XPages.MainPage.cliente.distance) + End If + + Dim sDate,sTime As String + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Starter.skmt.ExecNonQuery("DELETE FROM HIST_GPS") + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_GPS (HGDATE, HGLAT, HGLON) VALUES(?,?,?) ", Array As Object (sDate & sTime, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps)) + CallSubDelayed(Tracker, "CreateLocationRequest") +End Sub + +Sub CANCELA_Click + B4XPages.ShowPage("Cliente") +End Sub + +Sub GUARDA_Click + If r_1.Checked = False And r_2.Checked = False And r_3.Checked = False And r_4.Checked = False And r_5 .Checked = False And r_6.Checked = False And r_7.Checked = False Then + MsgboxAsync("Selecciona un motivo de rechazo","Atención") + Else + + If r_1.Checked Then + motivo = "CERRADO" + Else If r_2.Checked Then + motivo = "NO PIDIO" + Else If r_3.Checked Then + motivo = "CANCELA" + Else If r_5.Checked Then + motivo = "FALTA DE TIEMPO" + Else If r_6.Checked Then + motivo = "SIN DINERO" + Else If r_7.Checked Then + motivo = "SALDO NO RECONOCIDO" + Else + motivo = "NO ESTA EL ENCARGADO" + End If + + If motivo <> "CERRADO" Or motivo = "CERRADO" Then + DateTime.DateFormat = "MM/dd/yyyy" + DateTime.TimeFormat="HHmmss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=Starter.skmt.ExecQuery("select CUENTA from cuentaa") + c.Position = 0 + cuenta = c.GetString("CUENTA") + c=Starter.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c.Close + Dim rutaactualizar As String + Dim rut As Cursor = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If rut.RowCount > 0 Then + rut.Position = 0 + rutaactualizar = rut.GetString("CAT_CL_RUTA") + End If + Starter.skmt.ExecNonQuery($"DELETE FROM NOVENTA WHERE NV_CLIENTE IN (select cuenta from cuentaa)"$) + 'Traemos los productos del pedido. + c=Starter.skmt.ExecQuery("select HVD_NUM_REGISTRO, HVD_CLIENTE, HVD_PRONOMBRE, HVD_CANT, HVD_COSTO_TOT, HVD_FECHA, HVD_PROID, CAT_GP_PRECIO from HIST_VENTAS2 join CAT_GUNAPROD on CAT_GP_ID = HVD_PROID WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) order by HVD_PRONOMBRE asc") + If c.RowCount > 0 Then 'Si hay pedido en HIST_VENTAS ... + + 'Revisamos si se le ha agregado venta al pedido. + Private esteCliente As String = Subs.traeCliente + Private rv As Cursor = Starter.skmt.ExecQuery($"select * from REPARTO where REP_CLIENTE = '${esteCliente}' and REP_CLI_ORIG <> '${esteCliente}' and REP_RECHAZO = 0"$) + If rv.RowCount > 0 Then 'Si tenemos venta en el pedido ... + For i2=0 To rv.RowCount - 1 + rv.Position = i2 + Log($"Actualizamos REPARTO - cliente=${rv.GetString("REP_CLIENTE")}, cliente orignal=${rv.GetString("REP_CLI_ORIG")}, le agregamos ${rv.GetString("REP_CANT")}"$) + Starter.skmt.ExecNonQuery($"update REPARTO set REP_CANT = REP_CANT + ${rv.GetString("REP_CANT")} where REP_RECHAZO = '1' and REP_CLIENTE = '${rv.GetString("REP_CLI_ORIG")}' and REP_CLI_ORIG = '${rv.GetString("REP_CLI_ORIG")}'"$) + Next + End If + + Starter.skmt.ExecNonQuery("delete from reparto where REP_CLIENTE IN (Select CUENTA from cuentaa)") + For i=0 To c.RowCount - 1 'Insertamos los productos en REPARTO. + c.Position=i + Log($"REGISTRO= ${c.GetString("HVD_NUM_REGISTRO")}"$) + Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT, REP_FECHA, REP_RECHAZO, REP_PRODID, REP_PRECIO, REP_PRODREGISTRO, REP_CLI_ORIG) VALUES (?,?,?,?,?,1,?,?,?,?) ", Array As String(c.GetString("HVD_CLIENTE"),c.GetString("HVD_PRONOMBRE"),c.GetString("HVD_CANT"),c.GetString("HVD_COSTO_TOT"),c.GetString("HVD_FECHA"), c.GetString("HVD_PROID"), c.GetString("CAT_GP_PRECIO"), c.GetString("HVD_NUM_REGISTRO"), c.GetString("HVD_CLIENTE"))) + Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT, REP_FECHA, REP_RECHAZO, REP_PRODID, REP_PRECIO, REP_PRODREGISTRO, REP_CLI_ORIG) VALUES (?,?,?,?,?,0,?,?,?,?) ", Array As String(c.GetString("HVD_CLIENTE"),c.GetString("HVD_PRONOMBRE"),0,c.GetString("HVD_COSTO_TOT"),c.GetString("HVD_FECHA"), c.GetString("HVD_PROID"), c.GetString("CAT_GP_PRECIO"), c.GetString("HVD_NUM_REGISTRO"), c.GetString("HVD_CLIENTE"))) + Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(c.GetString("HVD_CANT"),c.GetString("HVD_PRONOMBRE"))) + Next + End If + Starter.skmt.ExecNonQuery($"DELETE FROM NOVENTA WHERE NV_CLIENTE IN (select cuenta from cuentaa)"$) + Starter.skmt.ExecNonQuery2("INSERT INTO NOVENTA (NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON,NV_FOTO,NV_REPROGRAMAR) VALUES(?,?,?,?,?,?,?,?,?) ", Array As Object (Subs.traeCliente,sDate & sTime, usuario, motivo,e_comm.text, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,rutaactualizar,reprogramar)) + Starter.skmt.ExecNonQuery($"UPDATE kmt_info set gestion = 3, HORAENT = '${sDate & " " & sTime}' where CAT_CL_CODIGO In (select cuenta from cuentaa) and CAT_CL_RUTA = '${rutaactualizar}'"$) + Starter.skmt.ExecNonQuery("update HIST_VENTAS SET HVD_RECHAZO = 1, HVD_RECHAZOCANT = HVD_CANT, HVD_RECHAZOCANTC = CANTC, BCAJAS = 0 , CANTC = 0 WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 2, HVD_RECHAZOCANT = HVD_RECHAZOCANT WHERE HVD_PROID = HVD_CODPROMO and HVD_CLIENTE in (Select CUENTA from cuentaa)"$) + Starter.skmt.ExecNonQuery("DELETE FROM PEDIDO WHERE PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + d = Starter.skmt.ExecQuery("SELECT RUTAA FROM RUTAA") + d.Position = 0 + Dim ruta As String = d.GetString("RUTAA") + d.Close + d = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + d.Position = 0 + Dim rutapre As String = d.GetString("CAT_CL_RUTA") + d.Close + d = Starter.skmt.ExecQuery("SELECT HVD_FECHA FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + d.Position = 0 + Dim fechaprev As String = d.GetString("HVD_FECHA") + d.Close + d = Starter.skmt.ExecQuery("SELECT CUENTA FROM CUENTAA") + d.Position = 0 + Starter.skmt.ExecNonQuery2("INSERT INTO REPARTO_GEO (CLIENTE, USUARIO, FECHA_PUNTEO, LATITUD, LONGITUD, ALMACEN, RUTA_REPARTO, RUTA_PREV, FECHA_PREVENTA, MOTIVO, COMENTARIO,TIPO,ENVIO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,0)",Array As String (cuenta, usuario, sDate &" "&sTime, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,B4XPages.MainPage.almacen,ruta,rutapre,fechaprev, motivo, e_comm.Text,"NO ENTREGADO")) + +' Dim mandamapa As Cursor = Starter.skmt.ExecQuery("SELECT * FROM kmt_info WHERE gestion = 0") +' If mandamapa.RowCount > 0 Then +' StartActivity(MAPA_RUTAS) +' Else If mandamapa.RowCount = 0 Then + + Dim g5 As Cursor = Starter.skmt.ExecQuery("SELECT SUM(HVD_COSTO_TOT) AS HVD_COSTO_TOT, SUM(HVD_CANT) AS HVD_CANT FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + g5.Position = 0 + + + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "UPDATE_ACTUAL_GEO_GUNA_VN" + + +' cmd.Parameters = Array As String(l_total.Text,"0", "",B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,"","",usuario,ruta,"ENTREGA", entregatotaloparial,"EFECTIVO", distance, L_CANT.text,la_cuenta.Text,fechaprev,almacen,Subs.traerUTAPREV) + Log(g5.GetString("HVD_COSTO_TOT")) + Log(g5.GetString("HVD_CANT")) + + cmd.Parameters = Array As String(g5.GetString("HVD_COSTO_TOT"),"0", "",B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,1,motivo,usuario,ruta,"RECHAZO", "RECHAZO TOTAL","", B4XPages.MainPage.cliente.distance, g5.GetString("HVD_CANT"),cuenta,fechaprev,B4XPages.MainPage.almacen,Subs.traerUTAPREV) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_REPARTO_GEO(HIST_RG_MONTO , HIST_RG_CREDITO , HIST_RG_MONTO_CREDITO , HIST_RG_LAT , HIST_RG_LONG , HIST_RG_RECHAZO , HIST_RG_MOTIVO , HIST_RG_USUARIO_ENTREGO , HIST_RG_RUTA_REP , HIST_RG_ESTATUS_ENTREGA , HIST_RG_COMENTARIO_ENTREGA , HIST_RG_FORMA_PAGO , HIST_RG_GEOCERCA_MTS , HIST_RG_NO_ART , HIST_RG_CLIENTE , HIST_RG_FECHA , HIST_RG_ALMACEN , HIST_RG_RUTA_PRE) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object(g5.GetString("HVD_COSTO_TOT"),"0", "",B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,1,motivo,usuario,ruta,"RECHAZO", "RECHAZO TOTAL","", B4XPages.MainPage.cliente.distance, g5.GetString("HVD_CANT"),cuenta,fechaprev,B4XPages.MainPage.almacen,Subs.traerUTAPREV)) + reqManager.ExecuteCommand(cmd, "up_geo") + g5.Close + B4XPages.ShowPage("Principal") +' End If + Else + COMENTARIO = e_comm.Text +' B4XPages.ShowPage("Foto") +' StartActivity(foto) + End If + End If +End Sub + + +Sub mandaPendientesreparto +' c=Starter.skmt.ExecQuery("SELECT CLIENTE, USUARIO, FECHA_PUNTEO, LATITUD, LONGITUD, ALMACEN, RUTA_REPARTO, RUTA_PREV, FECHA_PREVENTA, MOTIVO, COMENTARIO,TIPO FROM REPARTO_GEO where ENVIO <> 1") +' Log($"REPARTO_Cliente PENDIENTE: ${c.RowCount}"$) +' If c.RowCount>0 Then +' For i=0 To c.RowCount -1 +' c.Position=i +' +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "insert_REPARTO_MARDS" +' cmd.Parameters = Array As Object(c.GetString("CLIENTE"), c.GetString("USUARIO"), c.GetString("FECHA_PUNTEO"), c.GetString("LATITUD"), c.GetString("LONGITUD"), c.GetString("ALMACEN"), c.GetString("RUTA_REPARTO"), c.GetString("RUTA_PREV"), c.GetString("FECHA_PREVENTA"), c.GetString("MOTIVO"), c.GetString("COMENTARIO"),c.GetString("TIPO")) +' reqManager.ExecuteCommand(cmd , $"ins_REPARTOPendientes_head_${c.GetString("CLIENTE")}"$) +' +' Next +' End If +' c.Close +End Sub + + + +Sub JobDone(Job As HttpJob) + Log(Job.Success) + If Job.Success = False Then +' ToastMessageShow("Error: " & Job.ErrorMessage, True) + Else + LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211027 + If Job.JobName = "DBRequest" Then + Dim resultado As DBResult = reqManager.HandleJob(Job) + If resultado.Tag.As(String).IndexOf("ins_REPARTOPendientes_head_") > -1 Then + Private cliente As String= resultado.Tag + cliente = cliente.SubString(cliente.IndexOf("_")+24) + Log($"Cliente1:${cliente}"$) + Starter.skmt.ExecNonQuery2("update REPARTO_GEO SET ENVIO = ? WHERE CLIENTE = ? AND ENVIO <> ?",Array As String ("1", cliente,"1")) + For Each records() As Object In resultado.Rows + For Each k As String In resultado.Columns.Keys + Log(resultado.Tag & ": " & k & ": " & records(resultado.Columns.Get(k))) + Next + Next + End If + End If + Job.Release + End If + +End Sub + +Private Sub cb_reprogramar_CheckedChange(Checked As Boolean) + If Checked Then + reprogramar = 1 + Else + reprogramar = 0 + End If +End Sub + +Private Sub InitializeCamera2 + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_CAMERA) + Wait For B4XPage_PermissionResult (Permission As String, resultC As Boolean) + If resultC Then + camEx.Initialize(p_cam, frontCamera, Me, "Camera1") + frontCamera = camEx.Front + Log("inicializamos Camara") + Else + ToastMessageShow("No permission Camara!!!", True) + End If +End Sub + +Sub Camera1_Ready (Success As Boolean) + Log("Camara ready") + If Success Then + camEx.SetJpegQuality(90) + camEx.SetContinuousAutoFocus + camEx.CommitParameters + camEx.StartPreview + Log(camEx.GetPreviewSize) + Else + ToastMessageShow("Cannot open camera.", True) + Log("Cannot open camera") + End If +End Sub + +Sub Camera1_PictureTaken (Data()As Byte) + + DateTime.DateFormat="ddMMyyyyHHmmss" + nombrefoto = DateTime.Now & "_FOTO1.png" + teclado.HideKeyboard + fototomada = nombrefoto + + + 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,"/md") + Dir = "/md" + 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 + + camEx.SavePictureToFile(Data, Dirp&Dir, filename) + camEx.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) + + + Dim img As B4XBitmap = xui.LoadBitmapResize(File.DirInternal & Dir, filename, 225, 300, True) + Dim out As OutputStream = File.OpenOutput(File.DirInternal & Dir & Dir2, filename, False) + img.WriteToStream(out, 100, "PNG") +' foto4 = File.ReadBytes(File.DirInternal & Dir & Dir2, nombrefoto3) + + out.Close + + + + + + motivo = "CERRADO" + DateTime.DateFormat = "MM/dd/yyyy" + DateTime.TimeFormat="HHmmss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=Starter.skmt.ExecQuery("select CUENTA from cuentaa") + c.Position = 0 + cuenta = c.GetString("CUENTA") + c=Starter.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c.Close + Dim rutaactualizar As String + Dim rut As Cursor = Starter.skmt.ExecQuery("SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If rut.RowCount > 0 Then + rut.Position = 0 + rutaactualizar = rut.GetString("CAT_CL_RUTA") + End If + Starter.skmt.ExecNonQuery($"DELETE FROM NOVENTA WHERE NV_CLIENTE IN (select cuenta from cuentaa)"$) + Starter.skmt.ExecNonQuery2("INSERT INTO NOVENTA (NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON,NV_RUTA,NV_REPROGRAMAR,NV_FOTO) VALUES(?,?,?,?,?,?,?,?,?,?) ", Array As Object (Subs.traeCliente,sDate & sTime, usuario, motivo,e_comm.text, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,rutaactualizar,reprogramar,File.ReadBytes(File.DirInternal & Dir & Dir2, nombrefoto))) + Starter.skmt.ExecNonQuery($"UPDATE kmt_info set gestion = 3, HORAENT = '${sDate & " " & sTime}' where CAT_CL_CODIGO In (select cuenta from cuentaa) and CAT_CL_RUTA = '${rutaactualizar}'"$) + Starter.skmt.ExecNonQuery("DELETE FROM PEDIDO WHERE PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + Starter.skmt.ExecNonQuery("update HIST_VENTAS SET HVD_RECHAZO = 1, HVD_RECHAZOCANT = HVD_CANT, HVD_RECHAZOCANTC = CANTC, BCAJAS = 0 , CANTC = 0 WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 2, HVD_RECHAZOCANT = HVD_RECHAZOCANT WHERE HVD_PROID = HVD_CODPROMO and HVD_CLIENTE in (Select CUENTA from cuentaa)"$) + + p_camara.Visible = False + StopCamera2 + B4XPages.ShowPage("Principal") + +End Sub + +Private Sub p_camara_Click + +End Sub + +Private Sub b_foto_Click + + camEx.TakePicture + p_camara.Visible = False + +End Sub + +Private Sub StopCamera2 +' Capturing = False + If camEx.IsInitialized Then + camEx.Release + End If +End Sub + +Private Sub r_1_CheckedChange(Checked As Boolean) + InitializeCamera2 + p_camara.Visible = True + Subs.centraPanel(p_cam,p_camara.Width) + + p_camara.BringToFront +End Sub + + + +Private Sub B4XPage_CloseRequest As ResumableSub + If p_camara.Visible Then + p_camara.Visible = False + StopCamera2 + r_1.Checked = False + Else + B4XPages.ShowPage("Cliente") + End If + Return False +End Sub \ No newline at end of file diff --git a/B4A/C_NuevoCliente.bas b/B4A/C_NuevoCliente.bas new file mode 100644 index 0000000..8371da5 --- /dev/null +++ b/B4A/C_NuevoCliente.bas @@ -0,0 +1,24 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=12.2 +@EndOfDesignText@ +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + +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_Pedidos.bas b/B4A/C_Pedidos.bas new file mode 100644 index 0000000..8371da5 --- /dev/null +++ b/B4A/C_Pedidos.bas @@ -0,0 +1,24 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=12.2 +@EndOfDesignText@ +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + +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..4fbec92 --- /dev/null +++ b/B4A/C_Principal.bas @@ -0,0 +1,3816 @@ +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 + Dim reqManager As DBRequestManager + Dim conectado As String + Dim t1 As Timer + Dim sb As StringBuilder + Dim PHONE As Phone + Dim trabajar As Button + Dim c As Cursor + Dim d As Cursor + Dim b As Cursor + Dim e As Cursor + Dim f As Cursor + Dim f1 As Cursor + Dim f2 As Cursor + Dim f3 As Cursor + Dim F4 As Cursor + Dim lv As ListView + Dim cargar As Button + Dim pendiente As Button + Dim foto1() As Byte + Dim usuario As String + Dim connecta As Button + Dim conn As String + Dim Subir As Button + Dim cmd As DBCommand + Dim TOPE As Int + Dim COUNT_CLIE As Int + Dim fecha As String + Dim drop As Double + Dim efectiva As Double + Dim L As Cursor + Dim l_aLiquidar As Label + Dim l_cuantosc As Label + Dim l_montoSalida As Label +' Dim l_efectiva As Label + Dim l_ctast As Label + Dim BUSCA As Button + Dim Cuantos As String + Dim l_cuantosn As Label + Dim e_ruta As EditText + Dim l_porvisitar As Label + Dim b_mapa As Button + Dim l_ruta As Label + Dim ALMACEN As String + Private img2 As ImageView + Dim Listo1 As String + Dim Listo2 As String + Dim Listo3 As String + Dim Listo4 As String + Dim Listo5 As String + Dim EJECUTANDO As String + Dim RES As String + Dim inve As String + Dim cuantos_pedidosc As String + Dim cuantos_pedido As String + Dim cuantos_noventa As String + Dim datos_iguales As String + Dim p As PhoneId + Dim imei As String + Dim clieasing() As String + Private inv As Button +' Private cambios As Label + Private L_MONTOE As Label + Private B_CLIEPROD As Button + Private ListView1 As ListView + Private B_REGRESA As Button + Private Panel1 As Panel + Dim ESTATUS As String + Dim batterystatus(11) As Int + Private bu As BatteryUtilities + Dim RUTA_T As String + Dim compara As String + Dim reqs As List + '''''' MAPA RUTAS + Private b_Ubicar_Ru As Button + Dim cargo As String + Private p_principal As Panel + Dim ime As IME + Private b_tabulador As Button + Private l_rutasP As Label + Private l_rechazo As Label + Private Label9 As Label + Dim cp As Cursor + Private b_check As Button + Private b_rechazos As Button + Private p_prod As Panel + Private b_regreso As Button + Private lv_prod_Prin As ListView + Private b_venta_emp As Button + Private ListView2 As ListView + Private Button1 As Button + Private P_PAGARES As Panel + + Private l_montopagares As Label + Private l_numpagares As Label + Private l_pagarescobrados As Label + Private l_pagaresnuevos As Label + Private l_montoaliquidar As Label + Private Label16 As Label + Private p_multiAlmacen As Panel + Private s_almacen2 As Spinner + Private et_ruta2 As EditText + Private b_multiAlmacen As Button + Private multiAlmacen As Boolean = False + Private idAlmacenExtra As String = "" + Dim tenvio As Timer + Dim cuantosenvio As Int + Dim btAdmin As BluetoothAdmin + Dim cmp20 As Serial +' Dim printer As TextWriter + Dim TAMANO As Int + Dim ESPACIO As Int + Dim BLANCO As String + Dim Printer1 As EscPosPrinter + Dim impresoraConectada As Boolean = False + Dim errorImpresora As Int = 0 + Private inventario As ImageView + Dim PASA_IMP As String +' Private printer As EscPosPrinter + Private impresoraConectada As Boolean = False + Dim printer As TextWriter + + ''para la carga --- mover a los demas clientes + Dim t8 As Timer + Private B_carga As Button + Private P_carga As Panel + Private L_carga As Label + Private PB_carga As ProgressBar + Private PB_carga2 As ProgressBar + Private l_carga2 As Label + + Dim recibidos As Int + 'fin carga + Private b_impresion_rec As Button + Private P_ENVIO As Panel + Private l_envio As Label + Private pgb_envio As ProgressBar + Private B_OK_ENVIO As Button +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + Root.LoadLayout("principal") + EJECUTANDO=1 + reqManager.Initialize(Me, B4XPages.MainPage.server) +' LogColor($"ReqServer = ${B4XPages.MainPage.server}"$, Colors.red) +' Dim ruta As String + img2.Visible =False + DateTime.DateFormat = "MM/dd/yyyy" + fecha=DateTime.Date(DateTime.Now) +' skmt.Initialize(Starter.ruta,"kmt.db", True) + b=Starter.skmt.ExecQuery("Select count(*) as CUANTOS from pedido_cliente") + b.Position=0 + Cuantos = b.GetString("CUANTOS") + d=Starter.skmt.ExecQuery("select count(distinct(CAT_CL_NOMBRE)) as TOTAL_VISITAR from kmt_info where gestion = 0 AND CAT_CL_RUTA <> 1000") + D.Position=0 + b.Close + e=Starter.skmt.ExecQuery("select COUNT(distinct(CAT_CL_NOMBRE)) as POR_VISITAR from kmt_info WHERE CAT_CL_RUTA <> 1000") + e.Position=0 + If Cuantos = 0 Then + l_aLiquidar.Text = 0 + l_cuantosc.Text = 0 + l_cuantosn.Text = 0 + drop = 0 + l_montoSalida.Text = 0 + efectiva = 0 +' l_efectiva.text = 0 + l_ctast.Text = d.GetString("TOTAL_VISITAR") + l_porvisitar.Text = e.GetString("POR_VISITAR") + Else +' c=Starter.skmt.ExecQuery("select sum(pc_monto) as MONTO_DIA, count(pc_cliente) AS CLIENTES_DIA from pedido_cliente") +' b=Starter.skmt.ExecQuery("select count(*) as CUANTOS from noventa") +' 'where pc_fecha = ?", Array As String(fecha) +' C.Position=0 +' b.Position=0 +' l_aLiquidar.Text = c.GetString("MONTO_DIA") +' l_cuantosc.Text = c.GetString("CLIENTES_DIA") +' l_cuantosn.Text = b.GetString("CUANTOS") + '' drop = c.GetString("MONTO_DIA") / c.GetString("CLIENTES_DIA") + '' l_montoSalida.Text = Round2(drop,2) + '' efectiva = c.GetString("CLIENTES_DIA") / e.GetString("POR_VISITAR") + '' l_efectiva.text = Round2(efectiva * 100, 2) +' l_ctast.Text = d.GetString("TOTAL_VISITAR") +' l_porvisitar.Text = e.GetString("POR_VISITAR") +' b.Close +' c.Close + End If + b=Starter.skmt.ExecQuery("select id_almacen from CAT_ALMACEN") + If b.RowCount > 0 Then +' Log("Traemos almacen ..." & B4XPages.MainPage.server) + b.Position = 0 +' Log(b.GetString("ID_ALMACEN")) + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_coords_almacen_GUNA_VN" + cmd.Parameters = Array As Object(b.GetString("ID_ALMACEN")) + reqManager.ExecuteQuery(cmd , 0, "coords_almacen") + End If + + P_ENVIO.Width = Root.Width + P_ENVIO.Height = Root.Height + B4XPages.MainPage.usuario=Subs.dameUsuarioDeDB + btAdmin.Initialize("BlueTeeth") + cmp20.Initialize("Printer") +End Sub + +Sub B4XPage_Appear + reqManager.Initialize(Me, B4XPages.MainPage.server) + Starter.skmt.ExecNonQuery("DELETE FROM ABONOS where a_abono is null or a_abono = ''") + Starter.skmt.ExecNonQuery("DELETE FROM NOVENTA where NV_CLIENTE is null or NV_CLIENTE = ''") + p_principal.Width = Root.Width + p_principal.Height = Root.Height *.80 + Private c As Cursor = Starter.skmt.ExecQuery("SELECT * FROM NOVENTA") + If c.RowCount > 0 Then + Starter.skmt.ExecNonQuery("Update kmt_info set gestion = 2 WHERE CAT_CL_CODIGO IN (SELECT NV_CLIENTE FROM NOVENTA WHERE NV_MOTIVO = 'ENTREGA')") + End If + Private c As Cursor = Starter.skmt.ExecQuery("SELECT NV_CLIENTE FROM NOVENTA") + If c.RowCount > 0 Then + Starter.skmt.ExecNonQuery("Update kmt_info set gestion = 3 WHERE CAT_CL_CODIGO IN (SELECT NV_CLIENTE FROM NOVENTA WHERE NV_MOTIVO <> 'ENTREGA')") + End If + + b_check.visible = False + Subs.centraPanel(p_principal, Root.Width) +' c=Starter.skmt.ExecQuery("select noversion from version") +' c.Position=0 +' If c.RowCount > 0 And c.GetString("NOVERSION") <> "2.1" Then +' ToastMessageShow("EXISTE UNA NUEVA VERSION, ACTUALIZA POR FAVOR." , True) +' cargar.Visible = False +' Subir.Visible = False +' connecta.Visible = False +' trabajar.Visible = False +' BUSCA.Visible = False +' inv.Visible = False +' End If +' c.Close + If EJECUTANDO = 0 Then + Listo1 = 0 + Listo2 = 0 + Listo3 = 0 + Listo4 = 0 + Listo5 = 0 + inve = 0 + img2.Visible =False + End If + l_ruta.Text = 0 + f=Starter.skmt.ExecQuery("select rutaa from rutaa") + If f.RowCount > 0 Then + f.Position = 0 + l_ruta.Text = f.GetString("RUTAA") + End If + f.Close + If l_ruta.Text = 0 Then + l_ruta.Text = 0 + l_rutasP.Text = 0 + Else + f=Starter.skmt.ExecQuery("select distinct CAT_CL_RUTA from kmt_info WHERE CAT_CL_RUTA <> 1000 order by CAT_CL_RUTA") +' f.Position=0 + l_rutasP.Text = "" + For i = 0 To f.RowCount - 1 + f.Position = i + If i = 0 Then + l_rutasP.Text = f.GetString("CAT_CL_RUTA") + Else + l_rutasP.Text = l_rutasP.Text & ", " & f.GetString("CAT_CL_RUTA") + End If + Next + f.Close + End If + DateTime.DateFormat = "MM/dd/yyyy" + fecha=DateTime.Date(DateTime.Now) + b=Starter.skmt.ExecQuery("Select count(*) as CUANTOS from kmt_info") + b.Position=0 + If b.RowCount > 0 Then Cuantos = b.GetString("CUANTOS") + d=Starter.skmt.ExecQuery("select count(*) as TOTAL_VISITAR from kmt_info where gestion = 0 AND CAT_CL_RUTA <> 1000") + D.Position=0 + b.Close + e=Starter.skmt.ExecQuery("select count(*) as POR_VISITAR from kmt_info WHERE CAT_CL_RUTA <> 1000") + e.Position=0 +' f=Starter.skmt.ExecQuery("select count(*) as CAT_CL_RUTA from kmt_info") +' f.Position=0 +' l_ruta.Text = 0 +' If f.RowCount > 0 Then l_ruta.Text = f.GetString("CAT_CL_RUTA") +' f.Close +' f=Starter.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info") +' f.Position=0 +' If f.RowCount > 0 Then l_ruta.Text = f.GetString("CAT_CL_RUTA") +' f.Close + + cargar.Visible = False + cargar.Enabled = True + Subir.Visible = False + connecta.Visible = True + b_multiAlmacen.Visible = False + p_multiAlmacen.Visible = False + + If Cuantos = 0 Then + l_aLiquidar.Text = 0 + l_cuantosc.Text = 0 + l_cuantosn.Text = 0 + drop = 0 + l_montoSalida.Text = 0 + efectiva = 0 +' l_efectiva.text = 0 +' cambios.Text = 0 + L_MONTOE.Text = 0 + l_ctast.Text = 0 + If d.RowCount > 0 Then l_ctast.Text = d.GetString("TOTAL_VISITAR") + l_porvisitar.Text = 0 + If e.RowCount > 0 Then l_porvisitar.Text = e.GetString("POR_VISITAR") + d.Close + e.Close + Else + c=Starter.skmt.ExecQuery("select sum(hvd_costo_tot) as MONTO_DIA from hist_ventas where hvd_cliente in (select cat_cl_codigo from kmt_info ) AND HVD_ESTATUS = 1 ") + f1=Starter.skmt.ExecQuery("select sum(hvd_costo_tot) as MONTO_TOTAL_DIA from hist_ventas2 where hvd_cliente in (select cat_cl_codigo from kmt_info )") + f1=Starter.skmt.ExecQuery("select sum(hvd_costo_tot) as MONTO_TOTAL_DIA from hist_ventas2 where hvd_cliente in (select cat_cl_codigo from kmt_info ) AND HVD_RECHAZO = 0") + f2=Starter.skmt.ExecQuery("select sum(REP_COSTO_TOT) as MONTO_REC_DIA FROM REPARTO where REP_cliente in (Select cat_cl_codigo from kmt_info)") +' b=Starter.skmt.ExecQuery("select count(*) as CUANTOS from noventa where nv_cliente in (select cat_cl_codigo from kmt_info where gestion = 3)") + b=Starter.skmt.ExecQuery("select count(DISTINCT NV_CLIENTE) as CUANTOS from noventa where nv_motivo <> 'ENTREGA' and NV_CLIENTE <> 63403") +' L=Starter.skmt.ExecQuery("select count(*) as CLIENTES_DIA from noventa where nv_cliente in (select cat_cl_codigo from kmt_info where gestion = 2)") + L=Starter.skmt.ExecQuery("select count(DISTINCT NV_CLIENTE) as CLIENTES_DIA from noventa where nv_motivo = 'ENTREGA' and NV_CLIENTE <> 63403") + f2.Position=0 +' F4=Starter.skmt.execqUery("select count(*) as CUANTOS FROM PEDIDO") +' F4.Position = 0 + Private MONTO_REC_DIA = 0 + If f2.GetString("MONTO_REC_DIA") <> Null Then MONTO_REC_DIA = f2.GetString("MONTO_REC_DIA") +' If F4.GetString("CUANTOS") > 0 Then +' f3=Starter.skmt.execqUery("select sum(pe_costo_tot) as MONTO_VENTA FROM PEDIDO") +' f3.Position=0 + '' Log(MONTO_REC_DIA & " - " & f3.GetString("MONTO_VENTA")) +' l_efectiva.text = to_number_vb(MONTO_REC_DIA - f3.GetString("MONTO_VENTA")) & "..." +' f3.Close +' Else +' l_efectiva.text = to_number_vb(MONTO_REC_DIA) & ".." +' End If +' F4.Close + C.Position = 0 + b.Position = 0 + L.Position = 0 + f1.Position = 0 + l_aLiquidar.Text = 0 + If f1.RowCount > 0 Then l_aLiquidar.Text = to_number_vb (f1.GetString("MONTO_TOTAL_DIA")) + L_MONTOE.Text = 0 +' If C.RowCount > 0 Then L_MONTOE.Text = to_number_vb (C.GetString("MONTO_DIA")) + l_cuantosc.Text = 0 + If L.RowCount > 0 Then l_cuantosc.Text = L.GetString("CLIENTES_DIA") + l_cuantosn.Text = 0 + If b.RowCount > 0 Then l_cuantosn.Text = b.GetString("CUANTOS") + 'drop = c.GetString("MONTO_DIA") / c.GetString("CLIENTES_DIA") + If f1.GetString("MONTO_TOTAL_DIA") <> Null Then l_montoSalida.Text = Round2(f1.GetString("MONTO_TOTAL_DIA"), 2) + 'efectiva = c.GetString("CLIENTES_DIA") / e.GetString("POR_VISITAR") + l_ctast.Text = 0 + If d.RowCount > 0 Then l_ctast.Text = d.GetString("TOTAL_VISITAR") + l_porvisitar.Text = 0 + If e.RowCount > 0 Then l_porvisitar.Text = e.GetString("POR_VISITAR") + c.Close + b.Close +' c=Starter.skmt.ExecQuery2("select count(*) as CUANTOS from CAT_VARIABLES where CAT_VA_DESCRIPCION = ? ", Array As String("CAMBIOS")) +' c.Position = 0 +' If c.GetString("CUANTOS") = 0 Then + '' cambios.Text = 0 +' Else +' B=Starter.skmt.ExecQuery("select CAT_VA_VALOR from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'CAMBIOS'") +' B.Position = 0 + '' cambios.Text = b.GetString("CAT_VA_VALOR") +' b.Close +' End If + c.Close + End If + c=Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + C.Position =0 + ALMACEN = 0 + If C.RowCount > 0 Then ALMACEN = C.GetString("ID_ALMACEN") + B4XPages.MainPage.almacen = ALMACEN + C.Close + c=Starter.skmt.ExecQuery("select HGDATE, HGLAT, HGLON from HIST_GPS") + ' HACER ESTO PARA EL FORANEO + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_gps_actual_REP" + cmd.Parameters = Array As Object(c.GetString("hgdate"),c.GetString("hglat"),c.GetString("hglon"),usuario ) + Next + End If + 'Para traer la bateria + bu.Initialize + batterystatus = bu.BatteryInformation +' LogColor($"Bateria STATUS=${batterystatus(0)}, ${batterystatus(1)}, ${batterystatus(4)}, BATT: ${Starter.batt}"$, Colors.Red) + B4XPages.MainPage.batt = batterystatus(0) + c=Starter.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c.Close + c=Starter.skmt.ExecQuery("select RUTAA from RUTAA") + c.Position = 0 + RUTA_T = 0 + If c.RowCount > 0 Then RUTA_T = c.GetString("RUTAA") + B4XPages.MainPage.rutaPreventa = RUTA_T + c.Close + reqs.Initialize + + + + + Private rc As Cursor = Starter.skmt.ExecQuery($"select * from REPARTO where REP_RECHAZO = "1" and REP_CANT > 0"$) +' Log($"RECHAZOS=${rc.RowCount}"$) + If rc.RowCount > 0 Then + Starter.skmt.ExecNonQuery($"delete from RECHAZOS"$) + For i3=0 To rc.RowCount -1 'Copiamos los rechazos de REPARTO a RECHAZOS. + rc.Position = i3 +' Log($"delete from RECHAZOS where R_CLIENTE = '${rc.GetString("REP_CLIENTE")}' and R_CLI_ORIG = '${rc.GetString("REP_CLI_ORIG")}' and R_RECHAZO = '1' and R_PRODID = '${rc.GetString("REP_PRODID")}'"$) +' Starter.skmt.ExecNonQuery($"delete from RECHAZOS where R_CLIENTE = '${rc.GetString("REP_CLIENTE")}' and R_CLI_ORIG = '${rc.GetString("REP_CLI_ORIG")}' and R_RECHAZO = '1' and R_PRODID = '${rc.GetString("REP_PRODID")}'"$) + Starter.skmt.ExecNonQuery($"insert into RECHAZOS(R_FECHA, R_CLIENTE, R_CLI_ORIG, R_PRODID, R_CANT, R_RECHAZO, R_PRECIO) select REP_FECHA, REP_CLIENTE, REP_CLI_ORIG, REP_PRODID, REP_CANT, REP_RECHAZO, REP_PRECIO from REPARTO where REP_CLIENTE = '${rc.GetString("REP_CLIENTE")}' and REP_CLI_ORIG = '${rc.GetString("REP_CLI_ORIG")}' and REP_PRODID = '${rc.GetString("REP_PRODID")}' and REP_RECHAZO = '1' and REP_CANT > 0"$) + Next + End If + Private vc As Cursor = Starter.skmt.ExecQuery($"select * from REPARTO where REP_RECHAZO = "0" and REP_CANT > 0"$) +' Log($"VENTAS=${vc.RowCount}"$) + If vc.RowCount > 0 Then + Starter.skmt.ExecNonQuery($"delete from VENTAS"$) + For i4=0 To vc.RowCount -1 'Copiamos las ventas de REPARTO a VENTAS. + vc.Position = i4 +' Log($"delete from VENTAS where V_CLIENTE = '${vc.GetString("REP_CLIENTE")}' and V_CLI_ORIG = '${vc.GetString("REP_CLI_ORIG")}' and V_RECHAZO = '1' and V_PRODID = '${vc.GetString("REP_PRODID")}'"$) +' Starter.skmt.ExecNonQuery($"delete from VENTAS where V_CLIENTE = '${vc.GetString("REP_CLIENTE")}' and V_CLI_ORIG = '${vc.GetString("REP_CLI_ORIG")}' and V_RECHAZO = '0' and V_PRODID = '${vc.GetString("REP_PRODID")}'"$) + Starter.skmt.ExecNonQuery($"insert into VENTAS(V_FECHA, V_CLIENTE, V_CLI_ORIG, V_PRODID, V_CANT, V_RECHAZO, V_PRECIO) select REP_FECHA, REP_CLIENTE, REP_CLI_ORIG, REP_PRODID, REP_CANT, REP_RECHAZO, REP_PRECIO from REPARTO where REP_CLIENTE = '${vc.GetString("REP_CLIENTE")}' and REP_CLI_ORIG = '${vc.GetString("REP_CLI_ORIG")}' and REP_PRODID = '${vc.GetString("REP_PRODID")}' and REP_RECHAZO = '0' and REP_CANT > 0"$) + Next + End If + + +' Log($"ENTREGADOS: ${Subs.traeEntregados}"$) +' Log($"RECHAZADOS: ${Subs.traeRechazados}"$) +' Log($"VENDIDOS: ${Subs.traeVendidos}"$) + Dim entMap As Map = Subs.traeEntregados + Dim rechMap As Map = Subs.traeRechazados + Dim vendMap As Map = Subs.traeVendidos + l_aLiquidar.Text = entMap.Get("monto") + vendMap.Get("monto") + + Dim cancelrecha As Cursor = Starter.skmt.ExecQuery("SELECT ifnull(HVD_RECHAZOCANT,0), HVD_RECHAZO, CONSECUTIVO FROM HIST_VENTAS") + If cancelrecha.RowCount > 0 Then + For h54 = 0 To cancelrecha.RowCount - 1 + cancelrecha.Position = h54 + Starter.skmt.ExecNonQuery2("Update HIST_VENTAS set HVD_RECHAZO = '0' WHERE CONSECUTIVO = ? and (HVD_RECHAZOCANT = 0 OR HVD_RECHAZOCANT IS NULL)" , Array As String(cancelrecha.GetString("CONSECUTIVO"))) + Next + End If + cancelrecha.Close + + ''' RECHAZO - VENTA + Private r5 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(HVD_COSTO_TOT,0) AS HVD_COSTO_TOT, IFNULL(HVD_CANT,0) AS HVD_CANT, IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_PROID, HVD_CLIENTE, CONSECUTIVO from HIST_VENTAS where HVD_RECHAZO = '1' and BCAJAS = '0' ORDER BY HVD_PROID "$) + + Private rescant As String = 0 + If r5.RowCount > 0 Then + For j4 = 0 To r5.RowCount -1 + r5.Position = j4 + Private r6 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(SUM(PE_CANT),0) AS PE_CANT from PEDIDO where PE_CLIENTEOR = '${r5.GetString("HVD_CLIENTE")}' AND PE_PROID = '${r5.GetString("HVD_PROID")}' AND CONSECUTIVO = '${r5.GetString("CONSECUTIVO")}' "$) + Dim totalcantped As String + If r6.RowCount > 0 Then + r6.Position = 0 + totalcantped = r6.GetString("PE_CANT") + Else + totalcantped = 0 + End If +' Log(r5.GetString("HVD_RECHAZOCANT") &" - "& totalcantped) + rescant = rescant + ((r5.GetString("HVD_COSTO_TOT")/(r5.GetString("HVD_CANT")))*((r5.GetString("HVD_RECHAZOCANT") - totalcantped))) +' Log(rescant) + r6.Close + Next + End If + If rescant = "NaN" Then rescant = 0 +' LogColor(rescant,Colors.Red) + r5.Close + + Private r5 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(HVD_COSTO_TOT,0) AS HVD_COSTO_TOT, IFNULL(HVD_CANT,0) AS HVD_CANT,IFNULL(CANTC,0) AS CANTC, IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_PROID, HVD_CLIENTE, CONSECUTIVO from HIST_VENTAS where HVD_RECHAZO = '1' and BCAJAS = '1' "$) +' Private r5 As Cursor = Starter.skmt.ExecQuery($"select * from HIST_VENTAS where HVD_RECHAZO = '1' and BCAJAS = '1' "$) + + Private rescant2 As Double = 0 + If r5.RowCount > 0 Then + For j5 = 0 To r5.RowCount -1 + r5.Position = j5 + Private r6 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(SUM(PE_CANT),0) AS PE_CANT from PEDIDO where PE_CLIENTEOR = '${r5.GetString("HVD_CLIENTE")}' AND PE_PROID = '${r5.GetString("HVD_PROID")}' AND CONSECUTIVO = '${r5.GetString("CONSECUTIVO")}'"$) + r6.Position = 0 +' Log(r6.GetString("PE_CANT")) + rescant2 = rescant2 + ((r5.GetString("HVD_COSTO_TOT")/(r5.GetString("CANTC")))*((r5.GetString("HVD_RECHAZOCANT") - r6.GetString("PE_CANT"))/Subs.traeConversion(r5.GetString("HVD_PROID")))) + rescant2 = NumberFormat2(rescant2, 0, 2, 2, False) + r6.Close + Next + End If + If rescant2 = "NaN" Then rescant2 = 0 + Log(rescant2) + r5.Close + '''FIN RECHAZO - VENTA + + '''RECHAZO + Private r5r As Cursor = Starter.skmt.ExecQuery($"select IFNULL(HVD_COSTO_TOT,0) AS HVD_COSTO_TOT, IFNULL(HVD_CANT,0) AS HVD_CANT, IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_PROID, HVD_CLIENTE, CONSECUTIVO from HIST_VENTAS where HVD_RECHAZO = '1' and BCAJAS = '0' "$) + Private rescantr As String = 0 + If r5r.RowCount > 0 Then + For j4r = 0 To r5r.RowCount -1 + r5r.Position = j4r + Private r6r As Cursor = Starter.skmt.ExecQuery($"select IFNULL(SUM(PE_CANT),0) AS PE_CANT from PEDIDO where PE_CLIENTEOR = '${r5r.GetString("HVD_CLIENTE")}' AND PE_PROID = '${r5r.GetString("HVD_PROID")}' AND CONSECUTIVO = '${r5r.GetString("CONSECUTIVO")}' "$) + r6r.Position = 0 +' LogColor(r5.GetString("HVD_COSTO_TOT")&" / "& r5.GetString("HVD_CANT")&" * "&r5.GetString("HVD_RECHAZOCANT")&" - "&r6.GetString("PE_CANT"),Colors.Blue) +' LogColor(r6.GetString("PE_CANT"),Colors.Blue) + rescantr = rescantr + ((r5r.GetString("HVD_COSTO_TOT")/(r5r.GetString("HVD_CANT")))*(r5r.GetString("HVD_RECHAZOCANT"))) + r6r.Close + Next + End If + If rescantr = "NaN" Then rescantr = 0 +' LogColor(rescant,Colors.Red) + r5r.Close + +' Log(rescantr) + + Private r5r As Cursor = Starter.skmt.ExecQuery($"select IFNULL(HVD_COSTO_TOT,0) AS HVD_COSTO_TOT, IFNULL(HVD_CANT,0) AS HVD_CANT,IFNULL(CANTC,0) AS CANTC, IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_PROID, HVD_CLIENTE, CONSECUTIVO from HIST_VENTAS where HVD_RECHAZO = '1' and BCAJAS = '1' "$) + +' Private r5 As Cursor = Starter.skmt.ExecQuery($"select * from HIST_VENTAS where HVD_RECHAZO = '1' and BCAJAS = '1' "$) + Private rescant2r As String = 0 + If r5r.RowCount > 0 Then + For j5r = 0 To r5r.RowCount -1 + r5r.Position = j5r + Private r6r As Cursor = Starter.skmt.ExecQuery($"select IFNULL(SUM(PE_CANT),0) AS PE_CANT from PEDIDO where PE_CLIENTEOR = '${r5r.GetString("HVD_CLIENTE")}' AND PE_PROID = '${r5r.GetString("HVD_PROID")}' AND CONSECUTIVO = '${r5r.GetString("CONSECUTIVO")}'"$) + r6r.Position = 0 +' Log(r6.GetString("PE_CANT")) + rescant2r = rescant2r + ((r5r.GetString("HVD_COSTO_TOT")/(r5r.GetString("CANTC")))*((r5r.GetString("HVD_RECHAZOCANT"))/Subs.traeConversion(r5r.GetString("HVD_PROID")))) + r6r.Close + Next + End If + If rescant2r = "NaN" Then rescant2r = 0 +' Log(rescant2) + r5r.Close +' Log(rescant2r) +' Log(rescant2r+rescantr) + + '''' FIN RECHAZO + + ''''' +' Private r5 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(SUM(HVD_COSTO_TOT),0) AS HVD_COSTO_TOT from HIST_VENTAS where HVD_RECHAZO = '0' and BCAJAS = '0' "$) +' Private rescant3 As Double = 0 +' If r5.RowCount > 0 Then +' r5.Position = 0 +' rescant3 = r5.GetString("HVD_COSTO_TOT") +' +' End If +' Log(NumberFormat2(rescant3, 0, 2, 2, False)) +' r5.Close + + Private r55 As Cursor = Starter.skmt.ExecQuery($"select HVD_COSTO_TOT from HIST_VENTAS where HVD_RECHAZO = '0' and BCAJAS = '0' "$) + Private rescant3 As Double + If r55.RowCount > 0 Then + For r75 = 0 To r55.RowCount -1 + r55.Position = r75 + rescant3 = rescant3 + r55.GetString("HVD_COSTO_TOT") + rescant3 = NumberFormat2(rescant3, 0, 2, 2, False) + Next + End If +' Log(rescant3) + r55.Close + + Private r5 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(SUM(HVD_COSTO_TOT),0) AS HVD_COSTO_TOT from HIST_VENTAS where HVD_RECHAZO = '0' and BCAJAS = '1' "$) + Private rescant4 As Double + If r5.RowCount > 0 Then + r5.Position = 0 + rescant4 = r5.GetString("HVD_COSTO_TOT") + End If +' Log(rescant4) + r5.Close + + Private r5 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(SUM(PE_COSTO_TOT),0) AS PE_COSTO_TOT from PEDIDO "$) + Private rescant5 As Double + If r5.RowCount > 0 Then + r5.Position = 0 + rescant5 = r5.GetString("PE_COSTO_TOT") + End If +' Log(rescant5) + r5.Close + ''' + Private r5 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(HVD_COSTO_TOT,0) AS HVD_COSTO_TOT, IFNULL(HVD_CANT,0) AS HVD_CANT, IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_PROID, HVD_CLIENTE, CONSECUTIVO from HIST_VENTAS where HVD_RECHAZO = '1' and BCAJAS = '0' "$) + Private rescant6 As Double + If r5.RowCount > 0 Then + For j4 = 0 To r5.RowCount -1 + r5.Position = j4 + Private r6 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(SUM(PE_CANT),0) AS PE_CANT from PEDIDO where PE_CLIENTEOR = '${r5.GetString("HVD_CLIENTE")}' AND PE_PROID = '${r5.GetString("HVD_PROID")}' AND CONSECUTIVO = '${r5.GetString("CONSECUTIVO")}' "$) + r6.Position = 0 +' LogColor(r5.GetString("HVD_COSTO_TOT")&" / "& r5.GetString("HVD_CANT")&" * "&r5.GetString("HVD_RECHAZOCANT")&" - "&r6.GetString("PE_CANT"),Colors.Blue) +' LogColor(r6.GetString("PE_CANT"),Colors.Blue) + rescant6 = rescant6 + ((r5.GetString("HVD_COSTO_TOT")/(r5.GetString("HVD_CANT")))*(r5.GetString("HVD_CANT")- r5.GetString("HVD_RECHAZOCANT"))) +' Log(rescant6) + r6.Close + Next + End If + If rescant6 = "NaN" Then rescant6 = 0 +' LogColor(rescant6,Colors.Red) + r5.Close + + Private r5 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(HVD_COSTO_TOT,0) AS HVD_COSTO_TOT, IFNULL(HVD_CANT,0) AS HVD_CANT,IFNULL(CANTC,0) AS CANTC, IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_PROID, HVD_CLIENTE, CONSECUTIVO from HIST_VENTAS where HVD_RECHAZO = '1' and BCAJAS = '1' "$) + Private rescant7 As Double + If r5.RowCount > 0 Then + For j5 = 0 To r5.RowCount -1 + r5.Position = j5 + Private r6 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(SUM(PE_CANT),0) AS PE_CANT from PEDIDO where PE_CLIENTEOR = '${r5.GetString("HVD_CLIENTE")}' AND PE_PROID = '${r5.GetString("HVD_PROID")}' AND CONSECUTIVO = '${r5.GetString("CONSECUTIVO")}'"$) + r6.Position = 0 +' Log(r6.GetString("PE_CANT")) + rescant7 = rescant7 + ((r5.GetString("HVD_COSTO_TOT")/(r5.GetString("CANTC")))*((r5.GetString("HVD_CANT") - r5.GetString("HVD_RECHAZOCANT") )/Subs.traeConversion(r5.GetString("HVD_PROID")))) + r6.Close + Next + End If + If rescant7 = "NaN" Then rescant7 = 0 +' Log(rescant7) + r5.Close + l_rechazo.text = NumberFormat2((rescant + rescant2),0,2,2,False) + L_MONTOE.Text = NumberFormat2((rescant3 + rescant4 + rescant5 + rescant6 + rescant7),0,2,2,False) + + + + Private r55 As Cursor = Starter.skmt.ExecQuery($"select HVD_COSTO_TOT, HVD_CANT from HIST_VENTAS where HVD_RECHAZO = '0' and BCAJAS = '0' AND HVD_CLIENTE IN (SELECT CAT_CL_CODIGO from kmt_info WHERE gestion = 2)"$) + Private rescant10 As Double + Private pztotal As Int + If r55.RowCount > 0 Then + For r75 = 0 To r55.RowCount -1 + r55.Position = r75 + rescant10 = rescant10 + r55.GetString("HVD_COSTO_TOT") + rescant10 = NumberFormat2(rescant10, 0, 2, 2, False) + pztotal = pztotal + r55.GetString("HVD_CANT") + Next + End If +' Log(rescant10) + r55.Close + +' Private r5 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(SUM(HVD_COSTO_TOT),0) AS HVD_COSTO_TOT, HVD_CANT from HIST_VENTAS where HVD_RECHAZO = '0' and BCAJAS = '1' AND HVD_CLIENTE IN (SELECT CAT_CL_CODIGO from kmt_info WHERE gestion = 2) "$) +' Private pztotal1 As Int +' Private rescant11 As Double +' If r5.RowCount > 0 Then +' r5.Position = 0 +' rescant11 = r5.GetString("HVD_COSTO_TOT") +' pztotal1 = pztotal1 + r55.GetString("HVD_CANT") +' End If +' Log(rescant11) +' r5.Close + + Private r5 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(SUM(PE_COSTO_TOT),0) AS PE_COSTO_TOT, IFNULL(SUM(PE_CANT),0) AS PE_CANT from PEDIDO "$) + Private pztotal2 As Int + Private rescant11 As Double + If r5.RowCount > 0 Then + r5.Position = 0 + rescant11 = r5.GetString("PE_COSTO_TOT") + pztotal2 = pztotal2 + r5.GetString("PE_CANT") + End If +' Log(rescant11) + r5.Close + '' + Private r5 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(HVD_COSTO_TOT,0) AS HVD_COSTO_TOT, IFNULL(HVD_CANT,0) AS HVD_CANT, IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_PROID, HVD_CLIENTE, CONSECUTIVO from HIST_VENTAS where HVD_RECHAZO = '1' and BCAJAS = '0' AND HVD_CLIENTE IN (SELECT CAT_CL_CODIGO from kmt_info WHERE gestion = 2) "$) + Private pztotal3 As Int + Private rescant12 As Double + If r5.RowCount > 0 Then + For j4 = 0 To r5.RowCount -1 + r5.Position = j4 + Private r6 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(SUM(PE_CANT),0) AS PE_CANT from PEDIDO where PE_CLIENTEOR = '${r5.GetString("HVD_CLIENTE")}' AND PE_PROID = '${r5.GetString("HVD_PROID")}' AND CONSECUTIVO = '${r5.GetString("CONSECUTIVO")}' "$) + r6.Position = 0 +' LogColor(r5.GetString("HVD_COSTO_TOT")&" / "& r5.GetString("HVD_CANT")&" * "&r5.GetString("HVD_RECHAZOCANT")&" - "&r6.GetString("PE_CANT"),Colors.Blue) +'' LogColor(r6.GetString("PE_CANT"),Colors.Blue) + rescant12 = rescant12 + ((r5.GetString("HVD_COSTO_TOT")/(r5.GetString("HVD_CANT")))*(r5.GetString("HVD_CANT")- r5.GetString("HVD_RECHAZOCANT"))) + pztotal3 = pztotal3 + (r5.GetString("HVD_CANT")- r5.GetString("HVD_RECHAZOCANT")) +' Log(rescant12) + r6.Close + Next + End If + If rescant12 = "NaN" Then rescant12 = 0 +' LogColor(rescant12,Colors.Red) + r5.Close + +' Private r5 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(HVD_COSTO_TOT,0) AS HVD_COSTO_TOT, IFNULL(HVD_CANT,0) AS HVD_CANT,IFNULL(CANTC,0) AS CANTC, IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_PROID, HVD_CLIENTE, CONSECUTIVO from HIST_VENTAS where HVD_RECHAZO = '1' and BCAJAS = '1' AND HVD_CLIENTE IN (SELECT CAT_CL_CODIGO from kmt_info WHERE gestion = 2)"$) +' Private rescant7 As Double +' If r5.RowCount > 0 Then +' For j5 = 0 To r5.RowCount -1 +' r5.Position = j5 +' Private r6 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(SUM(PE_CANT),0) AS PE_CANT from PEDIDO where PE_CLIENTEOR = '${r5.GetString("HVD_CLIENTE")}' AND PE_PROID = '${r5.GetString("HVD_PROID")}' AND CONSECUTIVO = '${r5.GetString("CONSECUTIVO")}'"$) +' r6.Position = 0 +' ' Log(r6.GetString("PE_CANT")) +' rescant7 = rescant7 + ((r5.GetString("HVD_COSTO_TOT")/(r5.GetString("CANTC")))*((r5.GetString("HVD_CANT") - r5.GetString("HVD_RECHAZOCANT") )/Subs.traeConversion(r5.GetString("HVD_PROID")))) +' pztotal3 = pztotal3 + (r5.GetString("HVD_CANT")- r5.GetString("HVD_RECHAZOCANT")) +' r6.Close +' Next +' End If +' If rescant7 = "NaN" Then rescant7 = 0 +' Log(rescant7) +' r5.Close + + + l_rechazo.text = NumberFormat2((rescant + rescant2),0,2,2,False) + B4XPages.MainPage.piezas_entregdas = NumberFormat2((pztotal + pztotal2 + pztotal3 ),0,2,2,False) + B4XPages.MainPage.monto_entregadoactual= NumberFormat2((rescant10 + rescant11 + rescant12 ),0,2,2,False) + ' +' B4XPages.MainPage.piezas_entregdas = "0" +' B4XPages.MainPage.monto_entregadoactual= "0" + + Dim g8 As Cursor = Starter.skmt.ExecQuery("SELECT IFNULL(SUM(HVD_COSTO_TOT),0) AS HVD_COSTO_TOT FROM HIST_VENTAS") + g8.Position = 0 + + + Dim pagarescobrados As Cursor = Starter.skmt.ExecQuery("SELECT IfNULL(SUM(a_abono),0) as a_abono FROM ABONOS") + pagarescobrados.Position = 0 + l_pagarescobrados.Text = NumberFormat2(pagarescobrados.GetDouble("a_abono"),0,2,2,False) + pagarescobrados.Close + + Dim pagaresnuevos As Cursor = Starter.skmt.ExecQuery("SELECT IfNULL(SUM(PA_MONTO),0) as PA_MONTO FROM PAGARES") + pagaresnuevos.Position = 0 + l_pagaresnuevos.Text = NumberFormat2(pagaresnuevos.GetDouble("PA_MONTO"),0,2,2,False) + pagaresnuevos.Close + + l_montoaliquidar.Text = NumberFormat2((l_pagarescobrados.Text+ L_MONTOE.Text - l_pagaresnuevos.Text),0,2,2,False) + + B4XPages.MainPage.clientesVisitados = L_MONTOE.Text + B4XPages.MainPage.clientesVenta = l_cuantosc.Text + B4XPages.MainPage.clientesRechazo = l_cuantosn.Text + B4XPages.MainPage.clientestotal = l_porvisitar.Text +' B4XPages.MainPage.montoActual = Round2(l_montoSalida.Text - rechMap.Get("monto"), 2) + B4XPages.MainPage.montoActual = Round2(g8.GetString("HVD_COSTO_TOT"), 2) + B4XPages.MainPage.porVisitar = l_ctast.text + B4XPages.MainPage.entregas = l_cuantosc.text + B4XPages.MainPage.rechazos = l_cuantosn.text + B4XPages.MainPage.montoEntregado = L_MONTOE.text + B4XPages.MainPage.montoRechazado = l_rechazo.text + g8.Close +' LogColor($"ReqServer = ${B4XPages.MainPage.server}"$, Colors.red) + Starter.ENVIA_ULTIMA_GPS + + If l_ctast.Text = 0 And l_porvisitar.Text <> 0 Then + Label9.Visible = True + L_MONTOE.Visible = True + l_montoaliquidar.Visible = True + Label16.Visible = True + '' hacer validacion su hay rechazo +' c=Starter.skmt.ExecQuery("select * from HIST_VENTAS WHERE hvd_rechazo <> 2 and HVD_RECHAZOCANT > 0 order by HVD_CODPROMO desc, HVD_PRONOMBRE asc") +' If c.RowCount > 0 Then +' b_venta_emp.Visible = True +' Else +' b_venta_emp.Visible = False +' End If + b_venta_emp.Visible = False + Else + Label16.Visible = False + l_montoaliquidar.Visible = False + Label9.Visible = False + L_MONTOE.Visible = False + b_venta_emp.Visible = False + End If +' Label9.Visible = True +' L_MONTOE.Visible = True +' If l_ctast.Text = 0 Then +' Else +' StartActivity(MAPA_RUTAS) +' End If +' checachek + 'cuanto + + c = Starter.skmt.ExecQuery2("select CAT_VA_VALOR from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("MACIMP")) + If c.RowCount > 0 Then + c.Position = 0 + Starter.MAC_IMPRESORA = c.GetString("CAT_VA_VALOR") + End If + If Starter.MAC_IMPRESORA = "" Then Starter.MAC_IMPRESORA = "0" +' Log("|" & Starter.MAC_IMPRESORA & "|") + Printer1.Initialize(Me, "Printer1") + If Printer1.IsConnected = False Then +' Printer1.Connect +' Log("1") + Else + Printer1.DisConnect + Printer1.Connect + Log("2") + End If +End Sub + +Sub checachek + b = Starter.skmt.ExecQuery("SELECT CHECADO FROM CHECADO_CHECK") + If b.RowCount > 0 Then + b.Position = 0 + If b.GetString("CHECADO") = 0 Then + b_check.Visible = True + Else If b.GetString("CHECADO") = 1 Then + b_check.Visible =False + End If + b.Close + End If +End Sub + +Sub IsConnectedToInternet As Boolean 'ignore + Dim r As Reflector + r.Target = r.GetContext + r.Target = r.RunMethod2("getSystemService", "connectivity", "java.lang.String") + r.Target = r.RunMethod("getActiveNetworkInfo") + If r.Target <> Null Then + Return r.RunMethod("isConnectedOrConnecting") + End If + Return False +End Sub + +Sub to_number_vb (valor As Object) As String + Dim valstring As Int + Dim valstring2 As String = valor + valstring2.Replace(":","") + Try + valstring =valstring2.Replace(":","") + Return valstring + Catch + Return 0 + End Try +End Sub + +Sub trabajar_Click +' If b_check.Visible = True Then +' MsgboxAsync("Favor de hacer el checklist.","Atención") +' Else +' B4XPages.ShowPage("Clientes") +' End If + + If l_ctast.Text = "0" Then + cmd.Initialize + cmd.Name = "select_hvd_impreso_guna" + cmd.Parameters = Array As Object(Subs.traeRutaReparto, ALMACEN)',e_ruta.Text,ALMACEN + reqManager.ExecuteQuery(cmd , 0, "hvd_impreso2") + Else If l_ctast.Text <> "0" Then + If b_check.Visible = True Then + MsgboxAsync("Favor de hacer el checklist.","Atención") + Else + B4XPages.ShowPage("Clientes") + End If + End If + + + +End Sub + +Sub Subir_Click + + If e_ruta.Text = "FIN DIA" Then + MsgboxAsync("Para enviar escribe tu ruta y envia informacion, pon atención, el sistema no es estupido, el estupido es el que tiene el telefono en las manos.","Atención") + Else + + If Not(IsConnectedToInternet) Then MsgboxAsync("No hay conexión a conexión a Internet", "Revisa tu conexión") + c=Starter.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c.Close + + P_ENVIO.Visible = True + envioinfo + tenvio.Initialize("tenvio",60000) + tenvio.Enabled = True + End If + +End Sub + +Sub envia_reparto +' c = Starter.skmt.ExecQuery("SELECT NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON, NV_FOTO, NV_REPROGRAMAR FROM NOVENTA") +' D=Starter.skmt.ExecQuery("SELECT COUNT(*) AS CUANTOS_NOVENTA FROM NOVENTA") +' If c.RowCount>0 Then +' For i=0 To c.RowCount -1 +' c.Position=i +' foto1 = c.GetBlob("NV_FOTO") +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "insert_reparto_REPG_GUNA_VN" +' cmd.Parameters = Array As Object(C.GetString("NV_CLIENTE"),C.GetString("NV_FECHA"),C.GetString("NV_USER"),C.GetString("NV_MOTIVO"),C.GetString("NV_COMM"),C.GetString("NV_LAT"),C.GetString("NV_LON"), ALMACEN, l_ruta.Text, C.GetString("NV_REPROGRAMAR")) +' reqManager.ExecuteCommand(cmd , "inst_noventa_") +' Next +' c.Close +' End If +' d.Position=0 +' cuantos_noventa = D.GetString("CUANTOS_NOVENTA") +' d.Close +End Sub + +Sub envioinfo + cuantosenvio = 0 + recibidos = 0 + l_envio.Text = "ENVIANDO" + ' NOVENTA + c = Starter.skmt.ExecQuery("SELECT NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON, NV_FOTO,NV_FOTO2, NV_REPROGRAMAR FROM NOVENTA") + cuantosenvio = cuantosenvio + c.RowCount + D=Starter.skmt.ExecQuery("SELECT COUNT(*) AS CUANTOS_NOVENTA FROM NOVENTA") + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Dim fotoenvio() As Byte = C.GetBlob("NV_FOTO2") + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_reparto_REPG_GUNA_VN2" + cmd.Parameters = Array As Object(C.GetString("NV_CLIENTE"),C.GetString("NV_FECHA"),C.GetString("NV_USER"),C.GetString("NV_MOTIVO"),C.GetString("NV_COMM"),C.GetString("NV_LAT"),C.GetString("NV_LON"), ALMACEN, l_ruta.Text, C.GetString("NV_REPROGRAMAR"),fotoenvio) + reqManager.ExecuteCommand(cmd , "envio_inst_noventa") + Next + c.Close + End If + d.Position=0 + cuantos_noventa = D.GetString("CUANTOS_NOVENTA") + d.Close + + 'PAGARES. + Dim pa As Cursor =Starter.skmt.ExecQuery("select PA_ALMACEN,PA_RUTA_REP,PA_RUTAPREV,PA_FECHA_PREV,PA_CAPTURA,PA_MONTO,PA_USUARIO,PA_CLIENTE,IFNULL(PA_CANCELADO,0) AS PA_CANCELADO from PAGARES") + If pa.RowCount > 0 Then + For pag = 0 To pa.RowCount - 1 + pa.Position = pag + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_reparto_PAGARES_GUNA_VN" + Dim fechaenvio() As String + fechaenvio = Regex.Split(" ",pa.GetString("PA_FECHA_PREV")) +' Log(fechaenvio(0)) + Dim fechaenvio1() As String + fechaenvio1 = Regex.Split("/",fechaenvio(0)) + Dim fechaano As String = fechaenvio1(2).SubString(2) + Dim fechareal As String = fechaenvio1(0)&"/"&fechaenvio1(1)&"/"&fechaano +' Log(fechareal) + Dim fechacap() As String + fechacap = Regex.Split("/",pa.GetString("PA_CAPTURA")) + Dim fechacapano As String = fechacap(2).SubString(2) +' Dim mes As Int = DateTime.GetMonth(DateTime.Now) + If DateTime.GetMonth(DateTime.Now) = fechacap(1) Then + Dim fechacapreal As String = fechacap(0)&"/"&fechacap(1)&"/"&fechacapano + Else + Dim fechacapreal As String = fechacap(1)&"/"&fechacap(0)&"/"&fechacapano + End If + If pa.GetString("PA_CANCELADO") = "2" Then + cmd.Parameters = Array As Object(pa.GetString("PA_CLIENTE"),NumberFormat2(pa.GetString("PA_MONTO"),0,2,2,False),fechacapreal,pa.GetString("PA_ALMACEN"),pa.GetString("PA_RUTAPREV"),Subs.traeRutaReparto,fechareal,pa.GetString("PA_USUARIO"),2) + Else + cmd.Parameters = Array As Object(pa.GetString("PA_CLIENTE"),pa.GetString("PA_MONTO"),fechacapreal,pa.GetString("PA_ALMACEN"),pa.GetString("PA_RUTAPREV"),Subs.traeRutaReparto,fechareal,pa.GetString("PA_USUARIO"),"") + End If + reqManager.ExecuteCommand(cmd , "ins_pagares") + Next + End If + pa.Close + + Dim ca As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM HIST_REPARTO_GEO "$) + If ca.RowCount > 0 Then + For JQANKSN = 0 To ca.rowcount -1 + ca.Position = JQANKSN + cmd.Initialize + cmd.Name = "UPDATE_ACTUAL_GEO_GUNA_VN" +' cmd.Parameters = Array As String(l_total.Text,"1", l_total.Text,B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps,"","",usuario,ruta,"ENTREGA", entregatotaloparial,"CREDITO", distance, L_CANT.text,la_cuenta.Text,fechaprev,almacen,Subs.traerUTAPREV) + cmd.Parameters = Array As String(ca.GetString("HIST_RG_MONTO"),ca.GetString("HIST_RG_CREDITO"),ca.GetString("HIST_RG_MONTO_CREDITO"),ca.GetString("HIST_RG_LAT"),ca.GetString("HIST_RG_LONG"),ca.GetString("HIST_RG_RECHAZO"),ca.GetString("HIST_RG_MOTIVO"),ca.GetString("HIST_RG_USUARIO_ENTREGO"),ca.GetString("HIST_RG_RUTA_REP"),ca.GetString("HIST_RG_ESTATUS_ENTREGA"),ca.GetString("HIST_RG_COMENTARIO_ENTREGA"),ca.GetString("HIST_RG_FORMA_PAGO"),ca.GetString("HIST_RG_GEOCERCA_MTS"),ca.GetString("HIST_RG_NO_ART"),ca.GetString("HIST_RG_CLIENTE"),ca.GetString("HIST_RG_FECHA"),ca.GetString("HIST_RG_ALMACEN"),ca.GetString("HIST_RG_RUTA_PRE")) + reqManager.ExecuteCommand(cmd, "up_geo") + Next + End If + + + + 'ABONOS + d = Starter.skmt.ExecQuery("SELECT RUTAA FROM RUTAA") + d.Position = 0 + Dim ab As Cursor = Starter.skmt.ExecQuery($"SELECT * from ABONOS where a_tipoabono IS NULL"$) + Log(ab.RowCount) + If ab.RowCount > 0 Then + For i=0 To ab.RowCount -1 + ab.Position = i +' Dim ab1 As Cursor = Starter.skmt.ExecQuery($"SELECT SUM(a_abono) AS a_abono from ABONOS where a_cliente = '${ab.GetString("a_cliente")}' and a_tipoabono IS NULL"$) + Dim ab1 As Cursor = Starter.skmt.ExecQuery($"SELECT a_abono from ABONOS where a_cliente = '${ab.GetString("a_cliente")}' and a_tipoabono IS NULL"$) + ab1.Position = 0 + + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_abono_REP_GUNA_VN2" + cmd.Parameters = Array As Object( ab.GetString("a_usuario"), ab.GetString("a_ruta"), ab.GetString("a_cliente"), NumberFormat2(ab.GetString("a_abono"),0,2,2,False), ab.GetString("a_fecha"),ALMACEN,"REPARTO",d.GetString("RUTAA"), "", ab.GetString("TIPO_PAGO"),ab.GetString("a_ticket"),ab.GetString("a_numpago")) + reqManager.ExecuteCommand(cmd , $"ins_abonosPendientes_${ab.GetString("a_cliente")}"$) + ab1.Close + Log($"ins_abonosPendientes_${ab.GetString("a_cliente")}"$) + Next + End If + ab.Close + d.Close + + + c=Starter.skmt.ExecQuery("SELECT RUTA_PREV, RUTA_REP, FECHA_PREV, FECHA, ALMACEN, NUM_TICKET, MONTO, METODO_PAGO, USUARIO, CLIENTE, NUM_PAGO FROM CONTADOS") + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_CONTADO_GUNA_VN" + cmd.Parameters = Array As Object(c.GetString("RUTA_PREV"), c.GetString("RUTA_REP"), c.GetString("FECHA_PREV"), c.GetString("ALMACEN"), c.GetString("NUM_TICKET"),NumberFormat2(c.GetString("MONTO").Replace(",",""),0,2,2,False) , c.GetString("METODO_PAGO"), c.GetString("USUARIO"), c.GetString("CLIENTE"), c.GetString("NUM_PAGO")) + reqManager.ExecuteCommand(cmd , "ins_CONTADOS") + Next + c.Close + End If + + 'ABONOS NUEVOS + d = Starter.skmt.ExecQuery("SELECT RUTAA FROM RUTAA") + d.Position = 0 + Dim ab As Cursor = Starter.skmt.ExecQuery($"SELECT * from ABONOS where a_tipoabono IS NOT NULL"$) + Log(ab.RowCount) + If ab.RowCount > 0 Then + For i=0 To ab.RowCount -1 + ab.Position = i +' Dim ab1 As Cursor = Starter.skmt.ExecQuery($"SELECT SUM(a_abono) AS a_abono from ABONOS where a_cliente = '${ab.GetString("a_cliente")}' and a_tipoabono IS NOT NULL"$) + Dim ab1 As Cursor = Starter.skmt.ExecQuery($"SELECT a_abono from ABONOS where a_cliente = '${ab.GetString("a_cliente")}' and a_tipoabono IS NOT NULL"$) + ab1.Position = 0 + + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_abono_REP_GUNA_VN2" + cmd.Parameters = Array As Object( ab.GetString("a_usuario"), ab.GetString("a_ruta"), ab.GetString("a_cliente"), NumberFormat2(ab.GetString("a_abono"),0,2,2,False), ab.GetString("a_fecha"),ALMACEN,"REPARTO",d.GetString("RUTAA"), "1", ab.GetString("TIPO_PAGO"),ab.GetString("a_ticket"),ab.GetString("a_numpago") ) + reqManager.ExecuteCommand(cmd , $"ins_abonosPendientes_${ab.GetString("a_cliente")}"$) + ab1.Close + Log($"ins_abonosPendientes_${ab.GetString("a_cliente")}"$) + Next + End If + ab.Close + d.Close + +' pedido + c=Starter.skmt.ExecQuery("SELECT PE_TIPO, PE_RUTA, PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_FECHA, PE_USUARIO, PE_CLIENTEOR, PE_CAJAS, PE_BCAJAS, CONSECUTIVO, FECHA_PREV, RUTA_REP, PE_REGALO FROM PEDIDO") + cuantosenvio = cuantosenvio + c.RowCount + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_pedido_REP_GUNA_VN" + cmd.Parameters = Array As Object(c.GetString("PE_TIPO"), c.GetString("PE_RUTA"), c.GetString("PE_CEDIS"), c.GetString("PE_COSTO_TOT"), c.GetString("PE_COSTOU"), c.GetString("PE_CANT"), c.GetString("PE_PRONOMBRE"), c.GetString("PE_PROID"), c.GetString("PE_CLIENTE"), c.GetString("PE_FECHA"), c.GetString("PE_USUARIO"), c.GetString("PE_CLIENTEOR"), c.GetString("PE_CAJAS"), c.GetString("PE_BCAJAS"), c.GetString("CONSECUTIVO"), c.GetString("FECHA_PREV"), c.GetString("RUTA_REP"), c.GetString("PE_REGALO")) + reqManager.ExecuteCommand(cmd , "envio_ins_pedido") + Next + c.Close + End If + + 'TABULADOR + c = Starter.skmt.ExecQuery("SELECT VEINTE, DIEZ, CINCO, DOS, PESO, CENTAVO, TOTAL FROM TABULADOR_MONEDAS") + d = Starter.skmt.ExecQuery("SELECT RUTAA FROM RUTAA") + b = Starter.skmt.ExecQuery("SELECT ID_ALMACEN FROM CAT_ALMACEN") + f = Starter.skmt.ExecQuery("SELECT HVD_FECHA FROM HIST_VENTAS") + d.Position = 0 + b.Position = 0 + f.Position = 0 + cuantosenvio = cuantosenvio + c.RowCount + If c.RowCount > 0 Then + For i = 0 To c.RowCount - 1 + c.Position=i + Dim cmd As DBCommand + Dim fechatabulador() As String = Regex.Split(" ", f.GetString("HVD_FECHA")) + + Dim fechatabulador3 As String = fechatabulador(0) + cmd.Initialize + cmd.Name = "insert_tabulador_monedas_GUNA_VN" + cmd.Parameters = Array As Object(d.GetString("RUTAA"), b.GetString("ID_ALMACEN"),c.GetString("VEINTE"),c.GetString("DIEZ"),c.GetString("CINCO"),c.GetString("DOS"),c.GetString("PESO"),c.GetString("CENTAVO"),fechatabulador3) + reqManager.ExecuteCommand(cmd , "envio_ins_tabulador_mon") + Next + c.Close + d.Close + b.Close + f.Close + End If + c = Starter.skmt.ExecQuery("SELECT MIL, QUINIENTOS, DOCIENTOS, CIEN, CINCUENTA, VEINTE FROM TABULADOR_BILLETES") + d = Starter.skmt.ExecQuery("SELECT RUTAA FROM RUTAA") + b = Starter.skmt.ExecQuery("SELECT ID_ALMACEN FROM CAT_ALMACEN") + f = Starter.skmt.ExecQuery("SELECT HVD_FECHA FROM HIST_VENTAS") + d.Position = 0 + b.Position = 0 + f.Position = 0 + cuantosenvio = cuantosenvio + c.RowCount + If c.RowCount > 0 Then + For i = 0 To c.RowCount - 1 + c.Position=i + Dim cmd As DBCommand + Dim fechatabulador() As String = Regex.Split(" ", f.GetString("HVD_FECHA")) + Dim fechatabulador3 As String = fechatabulador(0) + cmd.Initialize + cmd.Name = "insert_tabulador_billetes_GUNA_VN" + cmd.Parameters = Array As Object(b.GetString("ID_ALMACEN"), d.GetString("RUTAA"),c.GetString("MIL"),c.GetString("QUINIENTOS"),c.GetString("DOCIENTOS"),c.GetString("CIEN"),c.GetString("CINCUENTA"),c.GetString("VEINTE"),fechatabulador3) + reqManager.ExecuteCommand(cmd , "envio_ins_tabulador_bill") + Next + c.Close + d.Close + b.Close + f.Close + End If + 'FIN TABULADOR + + + + c = Starter.skmt.ExecQuery("SELECT IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_CLIENTE, HVD_PROID, HVD_FECHA, HVD_CODPROMO, HVD_NUM_TICKET, HVD_CANT, CONSECUTIVO, BCAJAS, CANTC FROM HIST_VENTAS where HVD_PRONOMBRE <> 'Cobranza Pendiente'") + + If c.RowCount > 0 Then + For i=0 To c.RowCount -1 + c.Position = i +' Log(c.GetString("HVD_CLIENTE")) + Private d4 As Cursor = Starter.skmt.ExecQuery($"SELECT CAT_CL_RUTA FROM kmt_info WHERE CAT_CL_CODIGO = '${c.GetString("HVD_CLIENTE")}'"$) + d4.Position = 0 +' Log(d4.GetString("CAT_CL_RUTA")) + Private d5 As Cursor = Starter.skmt.ExecQuery($"SELECT IFNULL(Sum(PE_CANT),0) AS PE_CANT FROM PEDIDO WHERE PE_CLIENTEOR = '${c.GetString("HVD_CLIENTE")}' AND PE_PROID = '${c.GetString("HVD_PROID")}' AND CONSECUTIVO = '${c.GetString("CONSECUTIVO")}'"$) + d5.Position = 0 + Private restacant As String = d5.GetString("PE_CANT") + d5.Close + + Dim fecha1() As String = Regex.Split(" ", c.GetString("HVD_FECHA")) + + Dim fecha3 As String = fecha1(0) +' Log(fecha3) + Dim hora() As String = Regex.Split("\.", fecha1(1)) +' Log(hora(0)) + + Dim sDate, sTime As String + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate = DateTime.Date(DateTime.Now) + sTime = DateTime.Time(DateTime.Now) + If c.GetString("HVD_RECHAZOCANT") <> "0" Then +' Log((c.GetString("HVD_RECHAZOCANT")-restacant)) + cmd.Initialize + + cmd.Name = "update_HVD_GUNA_VN2" + cmd.Parameters = Array As String(c.GetString("HVD_RECHAZOCANT"),sDate& " "& sTime,1,Subs.traeUsuario, c.GetString("HVD_CLIENTE"), c.GetString("HVD_PROID"),fecha3&" "&hora(0), d4.GetString("CAT_CL_RUTA"),ALMACEN,l_ruta.Text,c.GetString("HVD_CODPROMO"),c.GetString("HVD_NUM_TICKET"), c.GetString("HVD_CANT")) + reqManager.ExecuteCommand(cmd, "update_hvd") +' Log("ENVIE RECHAZO") + Else + cmd.Initialize + cmd.Name = "update_HVD_GUNA_VN2" +' Log( c.GetString("CANTC")& c.GetString("HVD_CLIENTE")& c.GetString("HVD_PROID")&fecha3&" "&hora(0)& d4.GetString("CAT_CL_RUTA")&ALMACEN&l_ruta.Text&c.GetString("HVD_CODPROMO")&c.GetString("HVD_NUM_TICKET")& c.GetString("HVD_CANT")) + cmd.Parameters = Array As String("","","0",Subs.traeUsuario, c.GetString("HVD_CLIENTE"), c.GetString("HVD_PROID"),fecha3&" "&hora(0), d4.GetString("CAT_CL_RUTA"),ALMACEN,l_ruta.Text,c.GetString("HVD_CODPROMO"),c.GetString("HVD_NUM_TICKET"), c.GetString("HVD_CANT")) + reqManager.ExecuteCommand(cmd, "update_hvd") + End If + d4.Close + Next + End If + c.Close + + Dim ab2 As Cursor = Starter.skmt.ExecQuery($"SELECT * from ABONOS"$) + Dim ab3 As Cursor = Starter.skmt.ExecQuery($"SELECT * from ABONOS where a_tipoabono IS NULL"$) + Dim ab3_1 As Cursor = Starter.skmt.ExecQuery($"SELECT IFNULL(SUM(a_abono),0) AS SUMABO from ABONOS where a_tipoabono IS NULL"$) + ab3_1.Position = 0 + + Dim ab4 As Cursor = Starter.skmt.ExecQuery($"SELECT * from ABONOS where a_tipoabono IS NOT NULL"$) + Dim ab4_1 As Cursor = Starter.skmt.ExecQuery($"SELECT IFNULL(SUM(a_abono),0) AS SUMABO from ABONOS where a_tipoabono IS NOT NULL"$) + ab4_1.Position = 0 + + Dim pa2 As Cursor =Starter.skmt.ExecQuery("select PA_ALMACEN,PA_RUTA_REP,PA_RUTAPREV,PA_FECHA_PREV,PA_CAPTURA,PA_MONTO,PA_USUARIO,PA_CLIENTE,IFNULL(PA_CANCELADO,0) AS PA_CANCELADO from PAGARES") + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_drop_rep_GUNA_VN2" + cmd.Parameters = Array As Object(Subs.dameUsuarioDeDB, l_ruta.Text, ALMACEN, l_ctast.text, Subs.traeEntregados, Subs.traeRechazados, "ENVIO",l_pagaresnuevos.Text, pa2.RowCount, l_pagarescobrados.Text,ab2.RowCount,NumberFormat2( ab3_1.GetDouble("SUMABO"),0,2,2,False), ab3.RowCount, NumberFormat2( ab4_1.GetDouble("SUMABO"),0,2,2,False), ab4.RowCount ) + reqManager.ExecuteCommand(cmd , "inst_drop") + + ToastMessageShow("Se Actualizaran los datos, Este proceso podria tardar hasta un minuto, gracias "& l_ruta.text , True) +End Sub + +Sub cargar_Click + ime.HideKeyboard + Dim pedidodiaanterior As Boolean = False + Dim cp As Cursor = Starter.skmt.ExecQuery("select * from NOVENTA") + If cp.RowCount > 0 Then + cp.Position = 0 + Private fecha As String = cp.GetString("NV_FECHA") + Log(cp.GetString("NV_FECHA")) + Dim fecha2() As String = Regex.Split(" ",fecha) + Log(fecha2(0)) + Dim fecha3() As String = Regex.Split("/",fecha2(0)) + DateTime.DateFormat = "yyyyMMdd" + DateTime.TimeFormat = "" + If fecha3(2).Length > 4 Then + Dim dia As String = fecha3(2).SubString2(0,5)&fecha3(0)&fecha3(1) + Else + Dim dia As String = fecha3(2)&fecha3(0)&fecha3(1) + End If + Log(dia) + Dim dia2 As String = DateTime.Date(DateTime.Now) + Log(dia & " , " & dia2) + If dia < dia2 Then + pedidodiaanterior = True + End If + End If + If Not (pedidodiaanterior) Then +' P_carga.Visible = True + P_carga.Width = Root.Width + P_carga.Height = Root.Height + l_carga2.Text = "CARGANDO" + L_carga.Text = "CARGANDO" + PB_carga2.Progress = 0 + PB_carga.Progress = 0 + Log("CUMPLE") + EJECUTANDO = 1 + reqs.Initialize + TOPE = 0 + LogColor($"ReqServer = ${B4XPages.MainPage.server}"$, Colors.red) + reqManager.Initialize(Me, B4XPages.MainPage.server) + + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_drop_rep_GUNA_VN2" + cmd.Parameters = Array As Object(Subs.dameUsuarioDeDB, l_ruta.Text, ALMACEN, l_ctast.text, Subs.traeEntregados, Subs.traeRechazados, "CARGA",0,0,0,0,0,0,0,0) + reqManager.ExecuteCommand(cmd , "inst_drop") +' reqs.Add("inst_noventa") + + + Starter.skmt.ExecNonQuery("delete from kmt_info") + Starter.skmt.ExecNonQuery("delete from cod_result") + Starter.skmt.ExecNonQuery("delete from hist_gest") + Starter.skmt.ExecNonQuery("delete from CAT_DETALLES_PAQ") + Starter.skmt.ExecNonQuery("delete from telefonos") +' Starter.skmt.ExecNonQuery("delete from VENTAS") + Starter.skmt.ExecNonQuery("delete from PUNTEO_GPS") + If l_ruta.Text = "0" Then ' + Log("********************* No hay ruta, BORRAMOS TODO") + Starter.skmt.ExecNonQuery("delete from cat_gunaprod") + Starter.skmt.ExecNonQuery("delete from cat_gunaprod3") + Starter.skmt.ExecNonQuery("delete from REPARTO") + Starter.skmt.ExecNonQuery("delete from HIST_VENTAS") + Starter.skmt.ExecNonQuery("delete from HIST_VENTAS2") + Starter.skmt.ExecNonQuery("delete from NOVENTA") + Starter.skmt.ExecNonQuery("DELETE FROM ABONOSP") + Else + Log("********************* Hay ruta, NO BORRAMOS TODO") + End If + + ' NUEVOS CLIENTES + c=Starter.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + + cargaGeneral ' Cargamos los datos del almacen principal. + + If multiAlmacen Then + Sleep(100) + Log(multiAlmacen) + Log("==================== CARGAMOS SEGUNDO ALMACEN ======================") + cargaAlmacen2 ' Cargamos los datos del segundo almacen. + End If + + + + +' cmd.Initialize +' cmd.Name = "select_cat_gunaprod3_MAZAPA" +' cmd.Parameters = Array As Object(ALMACEN) +' reqManager.ExecuteQuery(cmd , 0, "gunaprod3") + +' cmd.Initialize +' cmd.Name = "select_pagares_MAZAPA" +' cmd.Parameters = Array As Object(e_ruta.text,ALMACEN) +' reqManager.ExecuteQuery(cmd , 0, "PAGARES") + +' c=Starter.skmt.ExecQuery("SELECT REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT, REP_FECHA FROM REPARTO") +' If c.RowCount > 0 Then +' For i=0 To c.RowCount -1 +' c.Position=i +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "insert_reparto_rechazo_REPG" +' cmd.Parameters = Array As Object(C.GetString("REP_CLIENTE"),C.GetString("REP_PRONOMBRE"),C.GetString("REP_CANT"),C.GetString("REP_COSTO_TOT"),C.GetString("REP_FECHA"), ALMACEN) +' reqManager.ExecuteCommand(cmd , "inst_noventa") +' reqs.Add("inst_noventa") +' Next +' End If +' c.Close + + ' NOVENTA +' c=Starter.skmt.ExecQuery("SELECT NV_CLIENTE, NV_FECHA, NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON, NV_FOTO FROM NOVENTA") +' If c.RowCount > 0 Then +' For i=0 To c.RowCount -1 +' c.Position=i +' foto1 = c.GetBlob("NV_FOTO") +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "insert_reparto_REPG" +' cmd.Parameters = Array As Object(C.GetString("NV_CLIENTE"),C.GetString("NV_FECHA"),C.GetString("NV_USER"),C.GetString("NV_MOTIVO"),C.GetString("NV_COMM"),C.GetString("NV_LAT"),C.GetString("NV_LON"), ALMACEN, l_ruta.Text, foto1) +' reqManager.ExecuteCommand(cmd , "inst_noventa") +' reqs.Add("inst_noventa") +' Next +' End If +'' c.Close + D=Starter.skmt.ExecQuery("SELECT COUNT(*) AS CUANTOS_NOVENTA FROM NOVENTA") + d.Position=0 + cuantos_noventa = D.GetString("CUANTOS_NOVENTA") + d.Close + cargar.Visible = False + Subir.Visible = False + connecta.Visible = True + inv.Visible = False + ToastMessageShow("Se actualizarán los datos, este proceso podria tardar hasta un minuto, gracias" , True) + ProgressDialogShow2("Descargando rutas, espere un momento.", False) + If Not(IsConnectedToInternet) Then MsgboxAsync("No hay conexión a Internet", "Revisa tu conexión") + Else + Log("XXXX") + MsgboxAsync("Para poder cargar día no puedes tener venta del día anterior. Por favor haz FIN DIA e intenta nuevamente.","Atención") + End If +End Sub + + +'Carga los datos generales de la ruta. +Sub cargaGeneral + Log($"****** ALMACEN: ${ALMACEN}"$) + + cmd.Initialize + cmd.Name = "select_punteo_re_REPG_GUNA_VN" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN,ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "punteo") + Log($"Pedimos Punteo - ruta:${e_ruta.Text}, almacen: ${ALMACEN}"$) + reqs.Add("punteo") + + cmd.Initialize + cmd.Name = "select_almacen_re_REPG2_GUNA_VN" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "gunaprod") + Log($"Pedimos gunaprod - ${ALMACEN}, ${e_ruta.text}"$) + reqs.Add("gunaprod") + + cmd.Initialize + cmd.Name = "select_GEOCERCA_GUNA_VN" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "GEOCERCA") + + If ALMACEN = "81" Then + + cmd.Initialize + cmd.Name = "select_abonosp_REP_GUNA_VN2" + cmd.Parameters = Array As Object(ALMACEN, e_ruta.text) + reqManager.ExecuteQuery(cmd , 0, "select_abonosp") + Else + cmd.Initialize + cmd.Name = "select_abonosp_REP_GUNA_VN" + cmd.Parameters = Array As Object(ALMACEN, e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "select_abonosp") + End If + + cmd.Initialize + cmd.Name = "select_cliente_re_REPG_GUNA_VN" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN,ALMACEN,e_ruta.text, ALMACEN,e_ruta.Text,ALMACEN,e_ruta.Text,ALMACEN,ALMACEN)',e_ruta.Text,ALMACEN + reqManager.ExecuteQuery(cmd , 0, "kmt_datos") + Log($"Pedimos kmt_datos - ruta: ${e_ruta.text}, almacen: ${ALMACEN}"$) + reqs.Add("kmt_datos") + + cmd.Initialize + cmd.Name = "traeFechaFotosGunaReparto" + cmd.Parameters = Array As Object(e_ruta.text,ALMACEN,ALMACEN,e_ruta.text,ALMACEN,e_ruta.text,ALMACEN,e_ruta.Text,ALMACEN,ALMACEN,ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "traeFechaFotosGuna") + + cmd.Initialize + cmd.Name = "select_COMENTS_GUNA_VN" + cmd.Parameters = Array As Object(e_ruta.text,ALMACEN,ALMACEN,e_ruta.text,ALMACEN,e_ruta.text,ALMACEN,e_ruta.Text,ALMACEN,ALMACEN,ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "coments") + +' cmd.Initialize +' cmd.Name = "select_cliente_fotos_re_REPG_GUNA_VN" +' cmd.Parameters = Array As Object(e_ruta.text, ALMACEN,ALMACEN,e_ruta.text, ALMACEN,e_ruta.Text,ALMACEN,ALMACEN)',e_ruta.Text,ALMACEN +' reqManager.ExecuteQuery(cmd , 0, "kmt_datos_fotos") + '' Log($"Pedimos kmt_datos_fotos - ruta: ${e_ruta.text}, almacen: ${ALMACEN}"$) + '' reqs.Add("kmt_datos_fotos") + + cmd.Initialize + cmd.Name = "select_ventad2_re_REPG_GUNA_VN" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN,e_ruta.Text,ALMACEN)',e_ruta.Text,ALMACEN + reqManager.ExecuteQuery(cmd , 0, "hist_datos") + Log($"Pedimos hist_datos - ruta: ${e_ruta.text}, almacen: ${ALMACEN}"$) + reqs.Add("hist_datos") + + cmd.Initialize + cmd.Name = "select_coords_almacen_GUNA_VN" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "coords_almacen") +End Sub + +Sub JobDone(Job As HttpJob) +' Private r As DBResult = reqManager.HandleJob(Job) + If Job.Success = False Then + LogColor("** " & Job.Tag & " Error: " & Job.ErrorMessage, Colors.Red) ' Mod by CHV - 211023 + 'ToastMessageShow("Error: " & Job.ErrorMessage, True) + Else + LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211023 + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "kmt_datos" Then 'query tag + If reqs.IndexOf("kmt_datos") > -1 Then + reqs.RemoveAt(reqs.IndexOf("kmt_datos")) +' Log(reqs.Size) + End If + Starter.skmt.BeginTransaction +' If reqManager.HandleJob(Job).Rows.Size > 0 Then + 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")) + Dim CAT_CL_BCREDITO As String = records(result.Columns.Get("CAT_CL_BCREDITO")) + Dim CAT_CL_LIMITECREDITO As String = records(result.Columns.Get("CAT_CL_LIMITECREDITO")) + Dim CAT_CL_SALDODISPONIBLE As String = records(result.Columns.Get("CAT_CL_SALDODISPONIBLE")) + Dim CAT_CL_DIASCREDITO As String = records(result.Columns.Get("CAT_CL_DIASCREDITO")) + Dim CAT_CL_VCREDITO As String = records(result.Columns.Get("CAT_CL_CTA")) + Dim CAT_CL_VCODIGO As String = records(result.Columns.Get("CAT_CL_CLABE")) + Dim CAT_CL_TIPOCLIENTE As String = records(result.Columns.Get("CAT_CL_TIPOCLIENTE")) +' Dim CAT_CL_SECUENCIA As String = records(result.Columns.Get("CAT_CL_SECUENCIA")) +' Log(" ++ insert into kmt_info: "&ALMACEN&","&CAT_CL_CODIGO&","&CAT_CL_RUTA&","&CAT_CL_NOMBRE) + Starter.skmt.ExecNonQuery2("INSERT INTO kmt_info(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,CAT_CL_BCREDITO, gestion,CAT_CL_LIMITECREDITO,CAT_CL_SALDODISPONIBLE,CAT_CL_DIASCREDITO, CAT_CL_VCREDITO, CAT_CL_VCODIGO,CAT_CL_TIPOCLIENTE) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,?,?,?,?,?,?)", 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,CAT_CL_BCREDITO,CAT_CL_LIMITECREDITO,CAT_CL_SALDODISPONIBLE,CAT_CL_DIASCREDITO, CAT_CL_VCREDITO, CAT_CL_VCODIGO,CAT_CL_TIPOCLIENTE)) + Next +' Starter.skmt.ExecNonQuery2("INSERT INTO kmt_info(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,CAT_CL_BCREDITO, gestion,SECUENCIA) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,?)", Array As Object (63403,1000, "VENTA RECHAZO","","","","","","","","","","","","","","-98.8357694","19.6906052","0","1")) +' End If + Starter.skmt.TransactionSuccessful + Starter.skmt.EndTransaction + Listo1 = 1 + If Listo1 = 1 And Listo3 = 1 Then + ToastMessageShow("Datos Actualizados." , True) + B4XPage_Appear + img2.Visible = False + EJECUTANDO=0 + End If + End If + End If + + 'cuenta todos los que tengan envios + If result.Tag.As(String).Contains("envio_") Then + + recibidos = recibidos + 1 + Log(cuantosenvio) + LogColor("Recibidos: _________"&recibidos,Colors.Red) + + + End If + + If recibidos = cuantosenvio Then + tenvio.Enabled = False + tenvio_tick + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "GEOCERCA" Then 'query tag + Starter.skmt.ExecNonQuery("DELETE FROM GEOCERCA") + For Each records() As Object In result.Rows + Dim CAT_AL_GEOCERCA As String = records(result.Columns.Get("CAT_AL_GEOCERCA")) + Starter.skmt.ExecNonQuery2("INSERT INTO GEOCERCA(ACTIVA) VALUES (?)", Array As Object (CAT_AL_GEOCERCA)) + Next + End If + End If + + If result.Tag = "coments" Then 'query tag + Starter.skmt.ExecNonQuery("DELETE FROM COMENTARIOS WHERE DESCARGADO = 1") + For Each records() As Object In result.Rows + Dim COMENTARIO As String = records(result.Columns.Get("TMP_COM_COMENTARIO")) + Dim CLIENTECOM As String = records(result.Columns.Get("TMP_COM_CLIENTE")) + Starter.skmt.ExecNonQuery2("INSERT INTO COMENTARIOS(COMENTARTIO, CLIENTE, DESCARGADO) VALUES (?,?,?)", Array As Object (COMENTARIO, CLIENTECOM,1)) + Next + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "hvd_impreso" Then 'query tag + For Each records() As Object In result.Rows + Dim HVD_IMPRESO_RECHAZO As String = records(result.Columns.Get("HVD_IMPRESO_RECHAZO")) + Log(HVD_IMPRESO_RECHAZO) + HVD_IMPRESO_RECHAZO=0 + If HVD_IMPRESO_RECHAZO = 0 Then + LogColor($"ReqServer = ${B4XPages.MainPage.server}"$, Colors.red) + If Not(IsConnectedToInternet) Then MsgboxAsync("No hay conexión a conexión a Internet", "Revisa tu conexión") + If e_ruta.Text <> "" Then + imei = "" 'p.GetDeviceId + conn = "1" + ime.HideKeyboard + + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_ruta_re_REPG_GUNA_VN" + cmd.Parameters = Array As Object() + + reqManager.ExecuteQuery(cmd , 0, "ruta") + ToastMessageShow("Validando Conexión." , True) + Starter.skmt.ExecNonQuery("DELETE FROM RUTAA") + Starter.skmt.ExecNonQuery2("INSERT INTO RUTAA(RUTAA) VALUES (?)", Array As Object (e_ruta.TEXT)) + B4XPages.MainPage.rutaPreventa = e_ruta.TEXT + + cmd.Name = "selectAgrupadorAlmacen" + cmd.Parameters = Array As Object(ALMACEN) + Log($"${ALMACEN}, ${e_ruta.text}, ${imei}"$) + reqManager.ExecuteQuery(cmd , 0, "agrupaAlmacen") + + End If + Else + MsgboxAsync("No se puede realizar ninguna modificación","Rechazo confirmado") + End If + + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "hvd_impreso2" Then 'query tag + For Each records() As Object In result.Rows + Dim HVD_IMPRESO_RECHAZO As String = records(result.Columns.Get("HVD_IMPRESO_RECHAZO")) + Log(HVD_IMPRESO_RECHAZO) + HVD_IMPRESO_RECHAZO=0 + If HVD_IMPRESO_RECHAZO = 0 Then + LogColor($"ReqServer = ${B4XPages.MainPage.server}"$, Colors.red) + If Not(IsConnectedToInternet) Then MsgboxAsync("No hay conexión a conexión a Internet", "Revisa tu conexión") + If b_check.Visible = True Then + MsgboxAsync("Favor de hacer el checklist.","Atención") + Else + B4XPages.ShowPage("Clientes") + End If + Else + MsgboxAsync("No se puede realizar ninguna modificación","Rechazo confirmado") + End If + + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "hvd_impreso4" Then 'query tag + For Each records() As Object In result.Rows + Dim HVD_IMPRESO_RECHAZO As String = records(result.Columns.Get("HVD_IMPRESO_RECHAZO")) + Log(HVD_IMPRESO_RECHAZO) +' HVD_IMPRESO_RECHAZO=0 + If HVD_IMPRESO_RECHAZO = 0 Then + LogColor($"ReqServer = ${B4XPages.MainPage.server}"$, Colors.red) + If Not(IsConnectedToInternet) Then MsgboxAsync("No hay conexión a conexión a Internet", "Revisa tu conexión") + Dim compara1() As String = Regex.Split(CRLF,compara) + Log(compara1(0)) + Log(compara1(0).Replace("NOMBRE.: ","")) + Dim g7 As Cursor = Starter.skmt.ExecQuery2("SELECT CAT_CL_CODIGO from kmt_info WHERE CAT_CL_NOMBRE = ?", Array As String (compara1(0).Replace("NOMBRE.: ","").Trim)) + If g7.RowCount > 0 Then + g7.Position = 0 + Starter.skmt.ExecNonQuery("delete from CUENTAA") + + Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object(g7.GetString("CAT_CL_CODIGO"))) + P_PAGARES.Visible = False + B4XPages.ShowPage("Cliente") + End If + Else + MsgboxAsync("No se puede realizar ninguna modificación","Rechazo confirmado") + End If + + Next + End If + End If + + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "hvd_impreso5" Then 'query tag + For Each records() As Object In result.Rows + Dim HVD_IMPRESO_RECHAZO As String = records(result.Columns.Get("HVD_IMPRESO_RECHAZO")) + Log(HVD_IMPRESO_RECHAZO) +' HVD_IMPRESO_RECHAZO=0 + If HVD_IMPRESO_RECHAZO = 0 Then + LogColor($"ReqServer = ${B4XPages.MainPage.server}"$, Colors.red) + If Not(IsConnectedToInternet) Then MsgboxAsync("No hay conexión a conexión a Internet", "Revisa tu conexión") + If b_check.Visible = True Then + MsgboxAsync("Favor de hacer el checklist.","Atención") + Else + StartActivity(MAPA_RUTAS) + End If + Else + MsgboxAsync("No se puede realizar ninguna modificación","Rechazo confirmado") + End If + + Next + End If + End If + + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "hvd_impreso3" Then 'query tag + For Each records() As Object In result.Rows + Dim HVD_IMPRESO_RECHAZO As String = records(result.Columns.Get("HVD_IMPRESO_RECHAZO")) + Log(HVD_IMPRESO_RECHAZO) +' HVD_IMPRESO_RECHAZO=0 + If HVD_IMPRESO_RECHAZO = 0 Then + LogColor($"ReqServer = ${B4XPages.MainPage.server}"$, Colors.red) + If Not(IsConnectedToInternet) Then MsgboxAsync("No hay conexión a conexión a Internet", "Revisa tu conexión") + Log(clieasing(0)) + Starter.skmt.ExecNonQuery("delete from CUENTAA") + Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object(clieasing(0))) + B4XPages.ShowPage("Cliente") + Else + MsgboxAsync("No se puede realizar ninguna modificación","Rechazo confirmado") + End If + + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "select_abonosp" Then 'query tag + Starter.skmt.ExecNonQuery("DELETE FROM ABONOSP") + For Each records() As Object In result.Rows + Dim NOTA As String = records(result.Columns.Get("NOTA")) + Dim CLIENTE As String = records(result.Columns.Get("CLIENTE")) + Dim SALDO_PENDIENTE As String = records(result.Columns.Get("SALDO_PENDIENTE")) + Dim NOMBRE As String = records(result.Columns.Get("NOMBRE")) + Dim FECHAPREVENTA As String = records(result.Columns.Get("FECHA_PREVENTA")) +' Dim DIA_VENCIMIENTO As String = records(result.Columns.Get("DIA_VENCIMIENTO")) + Starter.skmt.ExecNonQuery2("INSERT INTO ABONOSP(NOTA,CLIENTE,SALDO_PENDIENTE,NOMBRE,FECHA_PREVENTA) VALUES (?,?,?,?,?)", Array As Object (NOTA, CLIENTE,SALDO_PENDIENTE,NOMBRE,FECHAPREVENTA)) + Next + End If + End If + + +' If Job.JobName = "DBRequest" Then +' Dim result As DBResult = reqManager.HandleJob(Job) +' If result.Tag = "kmt_datos_fotos" Then 'query tag +' Starter.skmt.ExecNonQuery("DELETE FROM FOTOS") +' For Each records() As Object In result.Rows +' Dim CAT_CL_FOTO() As Byte = records(result.Columns.Get("CAT_CL_FOTO")) +' Dim CLIENTE1 As String = records(result.Columns.Get("CAT_CL_CODIGO")) +' Starter.skmt.ExecNonQuery2("INSERT INTO FOTOS(foto,CLIENTE) VALUES (?,?)", Array As Object (CAT_CL_FOTO, CLIENTE1)) +' Next +' End If +' End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "gunaprod3" Then 'query tag + If reqs.IndexOf("gunaprod3") > -1 Then + reqs.RemoveAt(reqs.IndexOf("gunaprod3")) + Log(reqs.Size) + End If + Starter.skmt.BeginTransaction + For Each records() As Object In result.Rows + Dim CAT_GP_ID As String = records(result.Columns.Get("CAT_GP_ID")) + Dim CAT_GP_NOMBRE As String = records(result.Columns.Get("CAT_GP_NOMBRE")) + Dim CAT_GP_IMP1 As String = records(result.Columns.Get("CAT_GP_IMP1")) + Dim CAT_GP_IMP2 As String = records(result.Columns.Get("CAT_GP_IMP2")) + Dim CAT_GP_PRECIO As String = records(result.Columns.Get("CAT_GP_PRECIO")) + Dim CAT_GP_CLASIF As String = records(result.Columns.Get("CAT_GP_CLASIF")) + Dim CAT_GP_STS As String = records(result.Columns.Get("CAT_GP_STS")) + Dim CAT_GP_TIPO As String = records(result.Columns.Get("CAT_GP_TIPO")) + Dim CAT_GP_SUBTIPO As String = records(result.Columns.Get("CAT_GP_SUBTIPO")) + Dim CAT_GP_IMG() As Byte = records(result.Columns.Get("CAT_GP_IMG")) + Dim CAT_GP_ALMACEN As Int = records(result.Columns.Get("CAT_GP_ALMACEN")) + ' Dim CAT_GP_DEV As String = records(RESULT.Columns.Get("CAT_GP_DEV")) + Dim CAT_GP_TIPOPROD As Int = records(result.Columns.Get("CAT_GP_TIPOPROD")) + Dim CAT_GP_INICIATIVA As Int = records(result.Columns.Get("CAT_GP_INICIATIVA")) + Dim CAT_DP_PRECIO4 As Float = records(result.Columns.Get("CAT_DP_PRECIO4")) + Dim CAT_DP_CONVERSION1 As Int = records(result.Columns.Get("CAT_DP_CONVERSION1")) + Dim CAT_DP_CANT_MIN_VENTA As Int = records(result.Columns.Get("CAT_DP_CANT_MIN_VENTA")) +' CAT_GP_INICIATIVA = 5 +' skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG,CAT_GP_ALMACEN,CAT_GP_DEV) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object (CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG, CAT_GP_ALMACEN,CAT_GP_DEV)) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD3(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG,CAT_GP_ALMACEN,CAT_GP_TIPOPROD,CAT_GP_INICIATIVA,CAT_DP_PRECIO4,CAT_DP_CONVERSION1,CAT_DP_CANT_MIN_VENTA) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object (CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG, CAT_GP_ALMACEN,CAT_GP_TIPOPROD, CAT_GP_INICIATIVA,CAT_DP_PRECIO4,CAT_DP_CONVERSION1,CAT_DP_CANT_MIN_VENTA)) + Next + Starter.skmt.TransactionSuccessful + Starter.skmt.EndTransaction + Listo2=1 + If Listo1 = 1 And Listo2 =1 And Listo3 = 1 And Listo4 = 1 Then + ToastMessageShow("Datos Actualizados." , True) + B4XPage_Appear + img2.Visible = False + EJECUTANDO=0 + End If + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "gunaprod" Then 'query tag + Log("Entramos a GUNA_PROD <---------------------------------") + If reqs.IndexOf("gunaprod") > -1 Then + reqs.RemoveAt(reqs.IndexOf("gunaprod")) + Log(reqs.Size) + End If + Starter.skmt.BeginTransaction + For Each records() As Object In result.Rows + Dim CAT_GP_ID As String = records(result.Columns.Get("CAT_GP_ID")) + Dim CAT_GP_NOMBRE As String = records(result.Columns.Get("CAT_GP_NOMBRE")) + Dim CAT_GP_IMP1 As String = records(result.Columns.Get("CAT_GP_IMP1")) + Dim CAT_GP_IMP2 As String = records(result.Columns.Get("CAT_GP_IMP2")) + Dim CAT_GP_PRECIO As String = records(result.Columns.Get("CAT_GP_PRECIO")) + Dim CAT_GP_PRECIO2 As String = records(result.Columns.Get("CAT_GP_PRECIO2")) + Dim CAT_GP_CLASIF As String = records(result.Columns.Get("CAT_GP_CLASIF")) + Dim CAT_GP_STS As String = records(result.Columns.Get("CAT_GP_STS")) + Dim CAT_GP_TIPO As String = records(result.Columns.Get("CAT_GP_TIPO")) + Dim CAT_GP_SUBTIPO As String = records(result.Columns.Get("CAT_GP_SUBTIPO")) + Dim CONVERSION As String = 0'records(result.Columns.Get("CAT_DP_CONVERSION1")) + Dim PRECIOCONVER As String = 0' records(result.Columns.Get("CAT_DP_PRECIO4")) + Dim CAT_GP_IMG() As Byte = records(result.Columns.Get("CAT_GP_IMG")) + 'Dim CAT_GP_ALMACEN As Int = records(RESULT.Columns.Get("CAT_GP_ALMACEN")) + ' Dim CAT_GP_DEV As String = records(RESULT.Columns.Get("CAT_GP_DEV")) + ' skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG,CAT_GP_ALMACEN,CAT_GP_DEV) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object (CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG, CAT_GP_ALMACEN,CAT_GP_DEV)) +' Log(" ++ insert into CAT_GUNAPROD: "&CAT_GP_ID&","&CAT_GP_NOMBRE&","&CAT_GP_IMP1) +' Log(CAT_GP_NOMBRE & "<-------------------------------------") + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG,CAT_GP_ALMACEN,CONVERSION,PRECIOCONVER,CAT_GP_PRECIO2) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object (CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG, 0,CONVERSION,PRECIOCONVER,CAT_GP_PRECIO2)) + Next + Starter.skmt.TransactionSuccessful + Starter.skmt.EndTransaction + Listo2=1 + If Listo1 = 1 And Listo2 =1 And Listo3 = 1 And Listo4 = 1 Then + ToastMessageShow("Datos Actualizados." , True) + B4XPage_Appear + img2.Visible = False + EJECUTANDO=0 + End If + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "gunaprodp" Then 'query tag + If reqs.IndexOf("gunaprodp") > -1 Then + reqs.RemoveAt(reqs.IndexOf("gunaprodp")) + Log(reqs.Size) + End If + For Each records() As Object In result.Rows + Dim CAT_GP_ID As String = records(result.Columns.Get("CAT_GP_ID")) + Dim CAT_GP_NOMBRE As String = records(result.Columns.Get("CAT_GP_NOMBRE")) + Dim CAT_GP_IMP1 As String = records(result.Columns.Get("CAT_GP_IMP1")) + Dim CAT_GP_IMP2 As String = records(result.Columns.Get("CAT_GP_IMP2")) + Dim CAT_GP_PRECIO As String = records(result.Columns.Get("CAT_GP_PRECIO")) + Dim CAT_GP_CLASIF As String = records(result.Columns.Get("CAT_GP_CLASIF")) + Dim CAT_GP_STS As String = records(result.Columns.Get("CAT_GP_STS")) + Dim CAT_GP_TIPO As String = records(result.Columns.Get("CAT_GP_TIPO")) + Dim CAT_GP_SUBTIPO As String = records(result.Columns.Get("CAT_GP_SUBTIPO")) + Dim CAT_GP_IMG() As Byte = records(result.Columns.Get("CAT_GP_IMG")) + 'Dim CAT_GP_ALMACEN As Int = records(RESULT.Columns.Get("CAT_GP_ALMACEN")) +' Log(" ++ insert into CAT_GUNAPROD: "&CAT_GP_ID&","&CAT_GP_NOMBRE&","&CAT_GP_IMP1) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG,CAT_GP_ALMACEN) VALUES (?,?,?,?,?,?,?,?,?,?,?)", Array As Object (CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG, 0)) + Next + Listo4=1 + If Listo1 = 1 And Listo2 =1 And Listo3 = 1 And Listo4 = 1 Then + ToastMessageShow("Datos Actualizados." , True) + B4XPage_Appear + img2.Visible = False + EJECUTANDO=0 + Else If Listo4 = 1 And Listo3 = 1 And inve = 1 Then + ToastMessageShow("Datos Actualizados." , True) + B4XPage_Appear + img2.Visible = False + EJECUTANDO=0 + End If + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "detallepaq" Then 'query tag + If reqs.IndexOf("detallepaq") > -1 Then + reqs.RemoveAt(reqs.IndexOf("detallepaq")) + Log(reqs.Size) + End If + For Each records() As Object In result.Rows + Dim CAT_DP_ALMACEN As String = records(result.Columns.Get("CAT_DP_ALMACEN")) + Dim CAT_DP_ID As String = records(result.Columns.Get("CAT_DP_ID")) + Dim CAT_DP_IDPROD As String = records(result.Columns.Get("CAT_DP_IDPROD")) + Dim CAT_DP_TIPO As String = records(result.Columns.Get("CAT_DP_TIPO")) + Dim CAT_DP_PZAS As String = records(result.Columns.Get("CAT_DP_PZAS")) + Dim CAT_DP_USUARIO As String = records(result.Columns.Get("CAT_DP_USUARIO")) + Dim CAT_DP_FECHA As String = records(result.Columns.Get("CAT_DP_FECHA")) + Dim CAT_DP_REGALO As String = records(result.Columns.Get("CAT_DP_REGALO")) + Dim CAT_DP_CLASIF As String = records(result.Columns.Get("CAT_DP_CLASIF")) + Dim CAT_DP_PRECIO As String = records(result.Columns.Get("CAT_DP_PRECIO")) + Dim CAT_DP_PRECIO_SIMPTOS As String = records(result.Columns.Get("CAT_DP_PRECIO_SIMPTOS")) +' Log(" ++ insert into CAT_DETALLES_PAQ: "&CAT_DP_ALMACEN&","&CAT_DP_ID&","&CAT_DP_IDPROD) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_DETALLES_PAQ(CAT_DP_ALMACEN,CAT_DP_ID,CAT_DP_IDPROD,CAT_DP_TIPO,CAT_DP_PZAS,CAT_DP_USUARIO,CAT_DP_FECHA,CAT_DP_REGALO,CAT_DP_CLASIF,CAT_DP_PRECIO,CAT_DP_PRECIO_SIMPTOS) VALUES (?,?,?,?,?,?,?,?,?,?,?)", Array As Object (CAT_DP_ALMACEN,CAT_DP_ID,CAT_DP_IDPROD,CAT_DP_TIPO,CAT_DP_PZAS,CAT_DP_USUARIO,CAT_DP_FECHA,CAT_DP_REGALO,CAT_DP_CLASIF,CAT_DP_PRECIO,CAT_DP_PRECIO_SIMPTOS)) + Next + Listo3 =1 + If Listo1 = 1 And Listo2 = 1 And Listo3 = 1 And Listo4 = 1 Then + ToastMessageShow("Datos Actualizados." , True) + B4XPage_Appear + img2.Visible=False + EJECUTANDO = 0 + Else If Listo4 = 1 And Listo3 = 1 And inve = 1 Then + ToastMessageShow("Datos Actualizados." , True) + B4XPage_Appear + img2.Visible = False + EJECUTANDO = 0 + End If + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "estatus" Then 'query tag + For Each records() As Object In result.Rows + Dim hvd_estatus As String = records(result.Columns.Get("HVD_ESTATUS")) + If hvd_estatus = "Liquidado" Then + ' ToastMessageShow("rojo val ok 1 cuantosp." , True) + MsgboxAsync("La venta ya fue liquidada","Atención") + Else + envioinfo + End If + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "punteo" Then 'query tag + If reqs.IndexOf("punteo") > -1 Then + reqs.RemoveAt(reqs.IndexOf("punteo")) +' Log(reqs.Size) + End If + If reqs.IndexOf("punteo") > 0 Then + reqs.RemoveAt(reqs.IndexOf("punteo")) + Log(reqs.Size) + End If + Starter.skmt.BeginTransaction + For Each records() As Object In result.Rows + Dim HV_CLIENTE As String = records(result.Columns.Get("HV_CLIENTE")) + Dim HV_LONG As String = records(result.Columns.Get("HV_LONG")) + Dim HV_LAT As String = records(result.Columns.Get("HV_LAT")) +' Log(" ++ insert into PUNTEO_GPS: "&HV_CLIENTE&","&HV_LONG) + Starter.skmt.ExecNonQuery2("INSERT INTO PUNTEO_GPS(HV_CLIENTE, HV_LONG, HV_LAT) VALUES (?,?,?)", Array As Object (HV_CLIENTE, HV_LONG, HV_LAT)) + Next + Starter.skmt.TransactionSuccessful + Starter.skmt.EndTransaction + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "hist_datos" Then 'query tag + If reqs.IndexOf("hist_datos") > -1 Then + reqs.RemoveAt(reqs.IndexOf("hist_datos")) +' Log(reqs.Size) + End If + Log(l_ruta.text) + Log($"******** Insertamos HV - ${result.Rows.Size}"$) + Starter.skmt.BeginTransaction + Dim consecutivo As Int= 0 + For Each records() As Object In result.Rows + Dim HVD_CLIENTE As String = records(result.Columns.Get("HVD_CLIENTE")) + Dim HVD_PRONOMBRE As String = records(result.Columns.Get("HVD_PRONOMBRE")) + Dim HVD_CANT As String = records(result.Columns.Get("HVD_CANT")) + Dim HVD_COSTO_TOT As String = records(result.Columns.Get("HVD_COSTO_TOT")) + Dim HVD_FECHA As String = records(result.Columns.Get("HVD_FECHA")) + Dim HVD_CODPROMO As String = records(result.Columns.Get("HVD_CODPROMO")) + Dim HVD_PROID As String = records(result.Columns.Get("HVD_PROID")) + Dim HVD_NUM_TICKET As String = records(result.Columns.Get("HVD_NUM_TICKET")) + Dim HVD_NUM_REGISTRO As String = records(result.Columns.Get("HVD_NUM_REGISTRO")) + Dim HVD_RECHAZO As String = records(result.Columns.Get("HVD_RECHAZO")) +' Dim HVD_PLACA As String = records(result.Columns.Get("HVD_PLACA")) + Dim bcajas As String = 0 ' records(result.Columns.Get("HVD_BCAJAS")) + Dim cantc As String = 0 'records(result.Columns.Get("HVD_CANTC")) +' Log(" ++ insert into HIST_VENTAS: "&HVD_CLIENTE&","&HVD_PRONOMBRE&","&HVD_CANT) + consecutivo = consecutivo +1 + If l_ruta.Text = "0" Then 'Si no hay ruta cargada, guardamos todos los clientes +' Log("No hay ruta, guardamos todos") + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_VENTAS(HVD_CLIENTE, HVD_PRONOMBRE, HVD_CANT,HVD_COSTO_TOT, HVD_FECHA, HVD_CODPROMO, HVD_PROID,HVD_NUM_TICKET, HVD_NUM_REGISTRO, HVD_RECHAZO, HVD_ESTATUS, HVD_PARCIAL, BCAJAS,CANTC,CONSECUTIVO,BCAJAS_OR,CANTC_OR) VALUES (?,?,?,?,?,?,?,?,?,?,0,0,?,?,?,?,?)", Array As Object (HVD_CLIENTE,HVD_PRONOMBRE,HVD_CANT,HVD_COSTO_TOT,HVD_FECHA, HVD_CODPROMO, HVD_PROID,HVD_NUM_TICKET, HVD_NUM_REGISTRO, HVD_RECHAZO, bcajas,cantc,consecutivo,bcajas,cantc)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_VENTAS2(HVD_CLIENTE,HVD_PRONOMBRE,HVD_CANT,HVD_COSTO_TOT, HVD_FECHA, HVD_CODPROMO, HVD_PROID,HVD_NUM_TICKET, HVD_NUM_REGISTRO, HVD_RECHAZO, HVD_ESTATUS, HVD_PARCIAL) VALUES (?,?,?,?,?,?,?,?,?,?,0,0)", Array As Object (HVD_CLIENTE,HVD_PRONOMBRE,HVD_CANT,HVD_COSTO_TOT,HVD_FECHA, HVD_CODPROMO, HVD_PROID,HVD_NUM_TICKET, HVD_NUM_REGISTRO, HVD_RECHAZO)) + Else 'Si ya hay ruta cargada, solo guardamos los clientes nuevos. +' Log("Hay ruta, guardamos los nuevos") + Private tc As Cursor = Starter.skmt.ExecQuery($"select HVD_CLIENTE from HIST_VENTAS where HVD_CLIENTE = '${HVD_CLIENTE}' and HVD_PROID = '${HVD_PROID}' AND HVD_CANT = '${HVD_CANT}' AND HVD_CODPROMO = '${HVD_CODPROMO}' AND HVD_COSTO_TOT = '${HVD_COSTO_TOT}' "$) + If tc.RowCount = 0 Then +' Log($"Guardamos ${HVD_CLIENTE}"$) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_VENTAS(HVD_CLIENTE,HVD_PRONOMBRE,HVD_CANT,HVD_COSTO_TOT, HVD_FECHA, HVD_CODPROMO, HVD_PROID,HVD_NUM_TICKET, HVD_NUM_REGISTRO, HVD_RECHAZO, HVD_ESTATUS, HVD_PARCIAL, BCAJAS,CANTC,CONSECUTIVO,BCAJAS_OR,CANTC_OR) VALUES (?,?,?,?,?,?,?,?,?,?,0,0,?,?,?,?,?)", Array As Object (HVD_CLIENTE,HVD_PRONOMBRE,HVD_CANT,HVD_COSTO_TOT,HVD_FECHA, HVD_CODPROMO, HVD_PROID,HVD_NUM_TICKET, HVD_NUM_REGISTRO, HVD_RECHAZO, bcajas,cantc,consecutivo,bcajas,cantc)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_VENTAS2(HVD_CLIENTE,HVD_PRONOMBRE,HVD_CANT,HVD_COSTO_TOT, HVD_FECHA, HVD_CODPROMO, HVD_PROID,HVD_NUM_TICKET, HVD_NUM_REGISTRO, HVD_RECHAZO, HVD_ESTATUS, HVD_PARCIAL) VALUES (?,?,?,?,?,?,?,?,?,?,0,0)", Array As Object (HVD_CLIENTE,HVD_PRONOMBRE,HVD_CANT,HVD_COSTO_TOT,HVD_FECHA, HVD_CODPROMO, HVD_PROID,HVD_NUM_TICKET, HVD_NUM_REGISTRO, HVD_RECHAZO)) + End If + End If + Next + Starter.skmt.TransactionSuccessful + Starter.skmt.EndTransaction + Log($"******** Terminamos HV - ${result.Rows.Size}"$) +' f2=Starter.skmt.ExecQuery2("select COUNT(*) as CAMBIOS from hist_ventas where SUBSTR(HVD_PRONOMBRE,1,6) =?", Array As String("CAMBIO")) +' f2.Position = 0 +' If f2.GetString("CAMBIOS") > 0 Then +' f1=Starter.skmt.ExecQuery2("select sum(HVD_CANT) as CAMBIOS from hist_ventas where SUBSTR(HVD_PRONOMBRE,1,6) =?", Array As String("CAMBIO")) +' f1.Position = 0 +' Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION =?", Array As Object("CAMBIOS")) +' Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES VALUES(?,?)", Array As Object("CAMBIOS",f1.GetString("CAMBIOS"))) +' f1.Close +' Else +' Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION =?", Array As Object("CAMBIOS")) +' Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES VALUES(?,?)", Array As Object("CAMBIOS","0")) +' End If +' f2.Close + + + + + + Listo3 =1 + If Listo1 = 1 And Listo3 = 1 Then + ToastMessageShow("Datos Actualizados." , True) + B4XPage_Appear + img2.Visible = False + EJECUTANDO = 0 + End If + ''para la carga --- mover a los demas clientes + t8.Initialize("t8", 15000) ' 1000 = 1 second + t8.Enabled = True + 'fin carga + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "traeFechaFotosGuna" Then 'query tag + Log(result.Rows.Size) + Starter.skmt.BeginTransaction + Subs.logJobDoneResultados(result) + Log("lo que quieras") +' B4XPages.MainPage.skmt.ExecNonQuery("delete from ABONOSP") + For Each records() As Object In result.Rows + Log("lo que quieras") + Private fecha2 As String = records(result.Columns.Get("CAT_CL_FOTO_FECHA")) + Private CLIENTE As String = records(result.Columns.Get("CAT_CL_CODIGO")) + Private f As Cursor = Starter.skmt.ExecQuery($"select * from fotos where cliente = '${CLIENTE}' and fecha = '${fecha2}'"$) + Log("==> EXISTE LA FOTO:" & f.RowCount) + If f.RowCount = 0 Then + cmd.Initialize + cmd.Name = "traeFotoGunaReparto" + cmd.Parameters = Array As Object(e_ruta.text,ALMACEN,ALMACEN,e_ruta.text,ALMACEN,e_ruta.text,ALMACEN,e_ruta.Text,ALMACEN,ALMACEN,ALMACEN) + Log("BUSCAMOS FOTO: " & ALMACEN &"|" & e_ruta.text & "|" & CLIENTE) + reqManager.ExecuteQuery(cmd , 0, $"traeFotoGuna_${CLIENTE}"$) + Log($"==>> traeFotoGuna_${CLIENTE}"$) + End If + Next + Starter.skmt.TransactionSuccessful + Starter.skmt.EndTransaction + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag.As(String).Contains("traeFotoGuna_") Then 'query tag + For Each records() As Object In result.Rows + Private foto2() As Byte = records(result.Columns.get("CAT_CL_FOTO")) + Private CLIENTE As String = records(result.Columns.Get("CAT_CL_CODIGO")) + Private fecha2 As String = records(result.Columns.Get("CAT_CL_FOTO_FECHA")) + Starter.skmt.ExecNonQuery($"DELETE from FOTOS where CLIENTE = '${CLIENTE}'"$) + Starter.skmt.ExecNonQuery2("INSERT INTO FOTOS(CLIENTE,FOTO,FECHA) VALUES (?,?,?)", Array As Object (CLIENTE,foto2,fecha2)) + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "CONTEO_DATOS" Then 'query tag + For Each records() As Object In result.Rows + Dim DETALLE As String = records(result.Columns.Get("REGISTROS")) + Dim CLIENTES1 As String = records(result.Columns.Get("CLIENTES")) + + + Next + + Dim CLIENTES As Cursor = Starter.skmt.ExecQuery("select count(*) as clientes from kmt_info") + CLIENTES.Position = 0 + + Dim detalleventa As Cursor = Starter.skmt.ExecQuery("select count(*) as detalle from hist_ventas") + detalleventa.Position = 0 + + If CLIENTES.GetString("clientes") = CLIENTES1 Then + PB_carga2.Progress = 100 + l_carga2.Text = "LISTO" + Else +' cargar_Click + End If + + If detalleventa.GetString("detalle") = DETALLE Then + PB_carga.Progress = 100 + L_carga.Text = "LISTO" + Else +' cargar_Click + End If + + CLIENTES.Close + detalleventa.Close + + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "variables" Then 'query tag + For Each records() As Object In result.Rows + Dim Cat_Va_Descripcion As String = records(result.Columns.Get("CAT_VA_DESCRIPCION")) + Dim Cat_Va_Valor As String = records(result.Columns.Get("CAT_VA_VALOR")) +' Log(" ++ insert into CAT_VARIABLES: "&Cat_Va_Descripcion&","&Cat_Va_Valor) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object (Cat_Va_Descripcion, Cat_Va_Valor)) + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "PAGARES" Then 'query tag + For Each records() As Object In result.Rows + + Dim TMP_MONTO_PAGARE As String = records(result.Columns.Get("TMP_MONTO_PAGARE")) + Dim TMP_CLIENTE As String = records(result.Columns.Get("TMP_CLIENTE")) +' Log(" ++ insert into CAT_VARIABLES: "&Cat_Va_Descripcion&","&Cat_Va_Valor) + Starter.skmt.ExecNonQuery2("INSERT INTO PAGARES(TMP_MONTO_PAGARE, TMP_CLIENTE) VALUES (?,?)", Array As Object (TMP_MONTO_PAGARE, TMP_CLIENTE)) + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "valida_pedido" Then 'query tag + For Each records() As Object In result.Rows + Dim CUANTOSP As Int = records(result.Columns.Get("CUANTOSP")) + If cuantos_pedido = CUANTOSP Then + ' ToastMessageShow("rojo val ok 1 cuantosp." , True) + datos_iguales = "ok" + Else + ToastMessageShow("No se cargo bien la info P. Sync Nuevamente" & CUANTOSP & " " & cuantos_pedido, True) + End If + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "valida_pedidoc" Then 'query tag + For Each records() As Object In result.Rows + Dim CUANTOSC As Int = records(result.Columns.Get("CUANTOSC")) + If cuantos_pedidosc = CUANTOSC Then + ' ToastMessageShow("rojo val ok 1 cuantosp." , True) + datos_iguales = "ok" + Else + ToastMessageShow("No se cargo bien la info C. Sync Nuevamente" & CUANTOSC & " " & cuantos_pedidosc, True) + End If + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "valida_noventa" Then 'query tag + For Each records() As Object In result.Rows + Dim CUANTOSN As Int = records(result.Columns.Get("CUANTOSN")) + If cuantos_noventa = CUANTOSN Then + ' ToastMessageShow("rojo val ok 1 cuantosp." , True) + datos_iguales = "ok" + Else + ToastMessageShow("No se cargo bien la info N. Sync Nuevamente" & CUANTOSN & " " & cuantos_noventa, True) + End If + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "insert_pedido" Then 'query tag + ToastMessageShow("Datos Actualizados." , True) + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "version" Then 'query tag + For Each records() As Object In result.Rows + Starter.skmt.ExecNonQuery("delete from VERSION") + Dim CAT_VE_VERSION As String = records(result.Columns.Get("CAT_VE_VERSION")) +' Log(" ++ insert into VERSION: "&CAT_VE_VERSION) + Starter.skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object (CAT_VE_VERSION)) + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "count_cli" Then 'query tag + For Each records() As Object In result.Rows + COUNT_CLIE = records(result.Columns.Get("COUNT_CLIE")) + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "ruta" Then 'query tag + If reqs.IndexOf("ruta") > -1 Then + reqs.RemoveAt(reqs.IndexOf("ruta")) + Log(reqs.Size) + End If + For Each records() As Object In result.Rows + Dim VALIDO As String = records(result.Columns.Get("VALIDO")) +' Log("VALIDO= " & VALIDO) + If VALIDO = "OK" Then + If l_ctast.Text = "0" Then + Subir.Visible = True + Else If l_ctast.Text <> "0" Then + Subir.Visible = False + End If + cargar.Visible = True + If Subs.dameUsuarioDeDB = "ROOT" Then Subir.Visible = True + connecta.Visible = False + Starter.skmt.ExecNonQuery("DELETE FROM RUTAA") +' Log(" ++ insert into RUTAA: "&e_ruta.Text) + Starter.skmt.ExecNonQuery2("INSERT INTO RUTAA(RUTAA) VALUES (?)", Array As Object (e_ruta.TEXT)) + B4XPages.MainPage.rutaPreventa = e_ruta.TEXT + If conn = "1" Then + ToastMessageShow("Existe Conexión con el Servidor." , False) + End If + Else + cargar.Visible = False + Subir.Visible = False + inv.Visible = False + connecta.Visible = False + End If + Next + End If + End If + + If Job.JobName = "DBRequest" Then 'Traemos las coordenadas del CEDIS. (Parte de la funcionalidad OSRM) + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "coords_almacen" Then 'query tag + For Each records() As Object In result.Rows + Log("Coordenadas del almacen: " & records(result.Columns.Get("CAT_AL_LATITUD")) & "," & records(result.Columns.Get("CAT_AL_LONGITUD"))) + Private lat, lon As Double + lat = 0.0 + lon = 0.0 + If IsNumber(records(result.Columns.Get("CAT_AL_LATITUD"))) And IsNumber(records(result.Columns.Get("CAT_AL_LONGITUD"))) Then + lat = records(result.Columns.Get("CAT_AL_LATITUD")) + lon = records(result.Columns.Get("CAT_AL_LONGITUD")) + End If + Starter.cedisLocation.Latitude = lat + Starter.cedisLocation.Longitude = lon + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("COORDS_ALMACEN")) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("COORDS_ALMACEN",lon&","&lat)) + '19.48118148992086,-99.15295579261536 + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "ins_reparto" Then 'query tag + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log(k & ": " & records(result.Columns.Get(k))) + Next + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "ins_rechazos" Then 'query tag + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log(k & ": " & records(result.Columns.Get(k))) + Next + Next + End If + + If result.Tag = "agrupaAlmacen" Then 'query tag + If result.Rows.Size > 1 Then + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CAT_ALMACEN_AGRUPADOR(ID TEXT, DESCRIPCION TEXT)") + Starter.skmt.ExecNonQuery($"delete from CAT_ALMACEN_AGRUPADOR"$) + b_multiAlmacen.Visible = True + s_almacen2.Clear + s_almacen2.Add("-= Seleccione =-") + For Each records() As Object In result.Rows +' For Each k As String In result.Columns.Keys +' Log(k & ": " & records(result.Columns.Get(k))) +' Next + If ALMACEN <> records(result.Columns.Get("CAT_AL_ID")) Then + s_almacen2.Add(records(result.Columns.Get("CAT_AL_DESC"))) + Starter.skmt.ExecNonQuery($"insert into CAT_ALMACEN_AGRUPADOR (ID, DESCRIPCION) values ('${records(result.Columns.Get("CAT_AL_ID"))}', '${records(result.Columns.Get("CAT_AL_DESC"))}')"$) + End If + s_almacen2.TextSize = 13 + s_almacen2.DropdownTextColor = Colors.RGB(6, 137, 0) +' s_almacen2.TextColor = Colors.Green + Next + End If + End If + + End If + + Job.Release + End If + If reqs.Size = 0 Then + ProgressDialogHide + c = Starter.skmt.ExecQuery("SELECT COUNT(*) AS CUANTOS FROM CHECADO_CHECK") + c.Position = 0 + If c.GetString("CUANTOS") = 0 Then + Starter.skmt.ExecNonQuery2("insert into CHECADO_CHECK (CHECADO) VALUES(?)", Array As String("0")) + + Else If c.GetString("CUANTOS") = 1 Then + End If + c.Close +' Log(reqs.size) +' Log("Terminamos lo descarga de ruta!") + End If +' End If +End Sub + +''para la carga --- mover a los demas clientes +Sub t8_tick + cmd.Initialize + cmd.Name = "select_conteo_GUNA" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "CONTEO_DATOS") + l_carga2.Text = "VALIDANDO" + L_carga.Text = "VALIDANDO" + PB_carga2.Progress = 50 + PB_carga.Progress = 50 + t8.Enabled = False +End Sub + +Private Sub P_carga_Click + +End Sub + +Private Sub B_carga_Click + If L_carga.Text = "LISTO" And l_carga2.Text = "LISTO" Then + P_carga.Visible = False + Else + Dim checagestion As Cursor = Starter.skmt.ExecQuery("SELECT * FROM kmt_info WHERE gestion <> 0") + If checagestion.RowCount = 0 Then + P_carga.Visible = False + e_ruta.Text = "" + Starter.skmt.ExecNonQuery("delete from PICK_CIEGO") + Starter.skmt.ExecNonQuery("delete from pedido_cliente") + Starter.skmt.ExecNonQuery("delete from PAGARES") + Starter.skmt.ExecNonQuery("delete from CHECADO_CHECK") + Starter.skmt.ExecNonQuery("delete from CHECKLIST2") + Starter.skmt.ExecNonQuery("delete from pedido") + Starter.skmt.ExecNonQuery("delete from noventa") + Starter.skmt.ExecNonQuery("delete from clie_act") + Starter.skmt.ExecNonQuery("delete from kmt_info") + Starter.skmt.ExecNonQuery("delete from cat_gunaprod") + Starter.skmt.ExecNonQuery("delete from cat_gunaprod3") + Starter.skmt.ExecNonQuery("delete from CAT_DETALLES_PAQ") + Starter.skmt.ExecNonQuery("delete from HIST_VENTAS") + Starter.skmt.ExecNonQuery("delete from REPARTO") + Starter.skmt.ExecNonQuery("DELETE FROM TABULADOR_MONEDAS") + Starter.skmt.ExecNonQuery("DELETE FROM TABULADOR_BILLETES") + Starter.skmt.ExecNonQuery("DELETE FROM RUTAA") + Starter.skmt.ExecNonQuery("DELETE FROM ABONOSP") + Starter.skmt.ExecNonQuery("DELETE FROM ABONOS") + Starter.skmt.ExecNonQuery("DELETE FROM BLOCKENVIO") + B4XPage_Appear + MsgboxAsync("No se cargo bien la informacion, favor de cargar día nuevamente","Atención") + Else + MsgboxAsync("No se cargo bien la informacion, favor de cargar día nuevamente","Atención") + P_carga.Visible = False + End If + End If +End Sub +'fin carga + +Private Sub B4XPage_CloseRequest As ResumableSub + ' BACK key pressed + If Panel1.visible Then + Log("PANEL1 VISIBLE") + B_REGRESA_Click + Else If P_PAGARES.Visible Then + P_PAGARES.Visible = False + Else If p_prod.Visible Then + p_prod.Visible = False + Else + B4XPages.ShowPage("Login") + End If + ' Returning False signals the system to handle the key + Return False +End Sub + +Sub connecta_Click + + cmd.Initialize + cmd.Name = "select_hvd_impreso_guna" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN)',e_ruta.Text,ALMACEN + reqManager.ExecuteQuery(cmd , 0, "hvd_impreso") + +End Sub + +Sub BUSCA_Click + If b_check.Visible = True Then + MsgboxAsync("Favor de hacer el checklist.","Atención") + Else +' StartActivity(BUSCAR) + B4XPages.ShowPage("Buscar") + End If +End Sub + +Sub b_mapa_Click +' StartActivity(mapas) + B4XPages.ShowPage("mapas") +End Sub + +Sub e_ruta_EnterPressed + Private adelanteFinDia As Boolean = True + c=Starter.skmt.ExecQuery("select ifnull(CAT_VA_VALOR,0) as CAT_VA_VALOR from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'FINDIA_FECHA'") 'Buscamos "FIN DIA" anterior + If c.RowCount > 0 Then + c.Position = 0 + Private FINDIA_FECHA As String = 0 + If c.GetString("CAT_VA_VALOR").Length > 4 Then FINDIA_FECHA = c.GetString("CAT_VA_VALOR") + + + Dim mescom As String = DateTime.GetMonth(DateTime.Now) + Dim mescom2 As String + If mescom.Length = 1 Then + mescom2 = "0"&DateTime.GetMonth(DateTime.Now) + Else + mescom2 = DateTime.GetMonth(DateTime.Now) + End If + + Dim diacom As String = DateTime.GetDayOfMonth(DateTime.Now) + Dim diacom2 As String + If diacom.Length = 1 Then + diacom2 = "0"&DateTime.GetDayOfMonth(DateTime.Now) + Else + diacom2 = DateTime.GetDayOfMonth(DateTime.Now) + End If + + + Dim dia2 As String = DateTime.GetYear(DateTime.Now)&mescom2&diacom2 + + If FINDIA_FECHA = dia2 Then 'Si el "FIN DIA" guardado NO es de ayer o anterior ... + adelanteFinDia = False + End If + c.Close + End If + + If e_ruta.Text = "FIN DIA" And adelanteFinDia Then +' If e_ruta.Text = "FIN DIA" Then + RES = Msgbox2("Seguro que desea hacer el cierre todos los datos se borraran?","Cierre", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore + If RES = DialogResponse.POSITIVE Then + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_drop_rep_GUNA_VN2" + cmd.Parameters = Array As Object(Subs.dameUsuarioDeDB, l_ruta.Text, ALMACEN, 0, 0, 0, "FIN DIA",0,0,0,0,0,0,0,0) + reqManager.ExecuteCommand(cmd , "inst_drop") + + e_ruta.Text = "" + Starter.skmt.ExecNonQuery("DELETE FROM CONTADOS") + Starter.skmt.ExecNonQuery("delete from COMENTARIOS") + Starter.skmt.ExecNonQuery("delete from CODIGO_CREDITO") + Starter.skmt.ExecNonQuery("delete from PICK_CIEGO") + Starter.skmt.ExecNonQuery("delete from HIST_REPARTO_GEO") + Starter.skmt.ExecNonQuery("delete from REPARTO_GEO") + Starter.skmt.ExecNonQuery("delete from pedido_cliente") + Starter.skmt.ExecNonQuery("delete from PAGARES") + Starter.skmt.ExecNonQuery("DELETE FROM GEOCERCA") + Starter.skmt.ExecNonQuery("delete from CHECADO_CHECK") + Starter.skmt.ExecNonQuery("delete from CHECKLIST2") + Starter.skmt.ExecNonQuery("delete from pedido") + Starter.skmt.ExecNonQuery("delete from noventa") + Starter.skmt.ExecNonQuery("delete from clie_act") + Starter.skmt.ExecNonQuery("delete from kmt_info") + Starter.skmt.ExecNonQuery("delete from cat_gunaprod") + Starter.skmt.ExecNonQuery("delete from cat_gunaprod3") + Starter.skmt.ExecNonQuery("delete from CAT_DETALLES_PAQ") + Starter.skmt.ExecNonQuery("delete from HIST_VENTAS") + Starter.skmt.ExecNonQuery("delete from REPARTO") + Starter.skmt.ExecNonQuery("DELETE FROM TABULADOR_MONEDAS") + Starter.skmt.ExecNonQuery("DELETE FROM TABULADOR_BILLETES") + Starter.skmt.ExecNonQuery("DELETE FROM RUTAA") + Starter.skmt.ExecNonQuery("DELETE FROM ABONOSP") + Starter.skmt.ExecNonQuery("DELETE FROM ABONOS") + Starter.skmt.ExecNonQuery("DELETE FROM BLOCKENVIO") + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("FINDIA_FECHA")) + DateTime.DateFormat = "yyyyMMdd" + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object("FINDIA_FECHA", DateTime.Date(DateTime.Now))) + DateTime.DateFormat = "dd/MM/yyyy" + b_multiAlmacen.Visible = False + p_multiAlmacen.Visible = False + s_almacen2.SelectedIndex = 0 + et_ruta2.Text = "" + B4XPage_Appear + + +' reqs.Add("inst_noventa") + End If +' Starter.waypointsOrdered.Clear + Starter.skmt.ExecNonQuery("delete from waypoints") + + Else if e_ruta.Text = "FIN DIA" Then + Msgbox("Ya se hizo FIN DIA hoy, solo se puede hacer un FIN DIA cada día, por favor comuniquese con un supervisor.", "LIMITE DIARIO SUPERADO") 'ignore + + End If +End Sub + +Sub inv_Click + ToastMessageShow("Se Actualizaran los datos, Este proceso podria tardar hasta un minuto, gracias" , True) +End Sub + +Sub t1_tick + cmd.Initialize + cmd.Name = "select_cuantos_pedido" + cmd.Parameters = Array As Object(ALMACEN,l_ruta.text) + reqManager.ExecuteQuery(cmd , 0, "valida_pedido") + + cmd.Initialize + cmd.Name = "select_cuantos_noventa_mards" + cmd.Parameters = Array As Object(ALMACEN,l_ruta.text) + reqManager.ExecuteQuery(cmd , 0, "valida_noventa") + + cmd.Initialize + cmd.Name = "select_cuantos_pedidoc" + cmd.Parameters = Array As Object(ALMACEN,l_ruta.text) + reqManager.ExecuteQuery(cmd , 0, "valida_pedidoc") + img2.Visible=False + t1.Enabled = False +End Sub + +'Sub B_CLIEPROD_Click +' If b_check.Visible = True Then +' MsgboxAsync("Favor de hacer el checklist.", "Atención") +' Else +' ' --- CONFIGURACIÓN ESTÉTICA --- +' ListView1.Width = Root.Width - (Root.Width * .10) +' ListView1.Height = Root.Height - (2 * (B_REGRESA.Height)) +' Subs.centraListView(ListView1, Root.Width) +' Panel1.SetLayoutAnimated(0, 0, 0, Root.Width, Root.Height) +' B_REGRESA.Left = (Panel1.Width - B_REGRESA.Width) / 2 +' B_REGRESA.Top = Panel1.Height - B_REGRESA.Height +' BUSCA.Visible = False +' connecta.Visible = False +' trabajar.Visible = False +' B_CLIEPROD.Visible = False +' Panel1.Visible = True +' Panel1.BringToFront +' b_Ubicar_Ru.Visible = False +' +' ' --- CONFIGURACIÓN DE DISEÑO DEL LISTVIEW --- +' ListView1.Clear +' Subs.SetDivider(ListView1, Colors.LightGray, 2) +' ListView1.TwoLinesLayout.ItemHeight = 150dip +' +' Dim lblTitle As Label = ListView1.TwoLinesLayout.Label +' lblTitle.TextSize = 20 +' lblTitle.TextColor = Colors.White +' lblTitle.Typeface = Typeface.DEFAULT_BOLD +' +' Dim lblDetail As Label = ListView1.TwoLinesLayout.SecondLabel +' lblDetail.TextSize = 18 +' lblDetail.TextColor = Colors.RGB(210, 210, 210) +' lblDetail.Typeface = Typeface.DEFAULT_BOLD +' +' ' --- PROCESAMIENTO DE DATOS --- +' c = Starter.skmt.ExecQuery("SELECT DISTINCT(CAT_CL_NOMBRE), CAT_CL_CODIGO, gestion FROM kmt_info WHERE gestion <> 0 ORDER BY HORAENT") +' +' If c.RowCount > 0 Then +' For i = 0 To c.RowCount - 1 +' c.Position = i +' Dim idCliente As String = c.GetString("CAT_CL_CODIGO") +' Dim gestion As String = c.GetString("gestion") +' Dim estatusStr As String = IIf(gestion = "2", "ENTREGADO", "RECHAZADO") +' +' Dim totalMonto As Double = 0 +' Dim totalArticulosPiezas As Int = 0 ' Conteo unificado en piezas físicas +' +' ' 1. PRODUCTOS DE PREVENTA (HIST_VENTAS) +' ' Unificamos lógica para BCAJAS 0 y 1 sumando piezas reales +' Dim vc As Cursor = Starter.skmt.ExecQuery($" +' SELECT HVD_CANT, HVD_COSTO_TOT, IFNULL(HVD_RECHAZOCANT, 0) AS HVD_RECHAZOCANT +' FROM HIST_VENTAS +' WHERE HVD_CLIENTE = '${idCliente}' AND HVD_CANT > 0"$) +' +' For a = 0 To vc.RowCount - 1 +' vc.Position = a +' Dim piezasCargadas As Int = vc.GetInt("HVD_CANT") +' Dim piezasRechazadas As Int = vc.GetInt("HVD_RECHAZOCANT") +' +' ' Cálculo de monto proporcional por pieza +' Dim precioPorPieza As Double = vc.GetDouble("HVD_COSTO_TOT") / piezasCargadas +' +' If estatusStr = "ENTREGADO" Then +' totalArticulosPiezas = totalArticulosPiezas + (piezasCargadas - piezasRechazadas) +' totalMonto = totalMonto + ((piezasCargadas - piezasRechazadas) * precioPorPieza) +' Else +' ' Si el estatus es RECHAZADO, mostramos lo que regresó al almacén +' totalArticulosPiezas = totalArticulosPiezas + piezasRechazadas +' totalMonto = totalMonto + (piezasRechazadas * precioPorPieza) +' End If +' Next +' vc.Close +' +'' ' 2. PEDIDOS NUEVOS (Tabla PEDIDO) +'' ' REGLA: Multiplicamos Cantidad por UMV para obtener piezas reales +'' Dim c4 As Cursor = Starter.skmt.ExecQuery($" +'' SELECT PE_CANT, PE_COSTO_TOT, IFNULL(PE_UVM, 1) as PE_UVM +'' FROM PEDIDO +'' WHERE PE_CLIENTE = '${idCliente}'"$) +'' +'' For po = 0 To c4.RowCount - 1 +'' c4.Position = po +'' Dim piezasPedido As Int = c4.GetInt("PE_CANT") * c4.GetInt("PE_UVM") +'' +'' ' En pedidos nuevos, si el cliente está gestionado, se suma al entregado +'' If estatusStr = "ENTREGADO" Then +'' totalArticulosPiezas = totalArticulosPiezas + piezasPedido +'' totalMonto = totalMonto + c4.GetDouble("PE_COSTO_TOT") +'' End If +'' Next +'' c4.Close +' +' ' --- AGREGAR A LA LISTA --- +' Dim infoDetalle As String = $"Piezas: ${totalArticulosPiezas} | Monto: $${NumberFormat2(totalMonto, 1, 2, 2, True)}${CRLF}Estatus: ${estatusStr}"$ +' ListView1.AddTwoLines(idCliente & " - " & c.GetString("CAT_CL_NOMBRE"), infoDetalle) +' Next +' End If +' c.Close +' End If +' +'End Sub + +Sub B_CLIEPROD_Click + If b_check.Visible = True Then + MsgboxAsync("Favor de hacer el checklist.", "Atención") + Else + ' --- CONFIGURACIÓN ESTÉTICA DEL PANEL --- + ListView1.Width = Root.Width - (Root.Width * .10) + ListView1.Height = Root.Height - (2 * (B_REGRESA.Height)) + Subs.centraListView(ListView1, Root.Width) + + Panel1.SetLayoutAnimated(0, 0, 0, Root.Width, Root.Height) + B_REGRESA.Left = (Panel1.Width - B_REGRESA.Width) / 2 + B_REGRESA.Top = Panel1.Height - B_REGRESA.Height - 10dip + + BUSCA.Visible = False + connecta.Visible = False + trabajar.Visible = False + B_CLIEPROD.Visible = False + Panel1.Visible = True + Panel1.BringToFront + b_Ubicar_Ru.Visible = False + + ' --- CONFIGURACIÓN DEL LISTVIEW (CORRECCIÓN DE AMONTONADO) --- + ListView1.Clear + Subs.SetDivider(ListView1, Colors.LightGray, 1dip) + + ' 1. Definimos un alto de item generoso + ListView1.TwoLinesLayout.ItemHeight = 120dip + + ' 2. Ajustamos la Primera Línea (Título/Nombre) + Dim lblTitle As Label = ListView1.TwoLinesLayout.Label + lblTitle.Width = ListView1.Width - 20dip + lblTitle.Height = 50dip ' Le damos espacio fijo + lblTitle.Top = 5dip ' Margen superior + lblTitle.TextSize = 18 + lblTitle.TextColor = Colors.White + lblTitle.Gravity = Gravity.CENTER_VERTICAL + lblTitle.Typeface = Typeface.DEFAULT_BOLD + + ' 3. Ajustamos la Segunda Línea (Detalles) + Dim lblDetail As Label = ListView1.TwoLinesLayout.SecondLabel + lblDetail.Width = ListView1.Width - 20dip + lblDetail.Height = 60dip ' Espacio para las dos líneas de detalle + lblDetail.Top = 55dip ' Inicia justo debajo del título + lblDetail.TextSize = 15 +' lblDetail.TextColor = Colors.RGB(200, 200, 200) + lblDetail.TextColor = Colors.White + lblDetail.Gravity = Gravity.TOP ' Alineado arriba para que el CRLF se vea bien + lblDetail.Typeface = Typeface.DEFAULT_BOLD + + ' --- PROCESAMIENTO DE DATOS --- + Dim c As Cursor = Starter.skmt.ExecQuery("SELECT DISTINCT(CAT_CL_NOMBRE), CAT_CL_CODIGO, gestion FROM kmt_info WHERE gestion <> 0 ORDER BY HORAENT") + + If c.RowCount > 0 Then + For i = 0 To c.RowCount - 1 + c.Position = i + Dim idCliente As String = c.GetString("CAT_CL_CODIGO") + Dim gestion As String = c.GetString("gestion") + Dim estatusStr As String = IIf(gestion = "2", "ENTREGADO", "RECHAZADO") + + Dim totalMonto As Double = 0 + Dim totalArticulosPiezas As Int = 0 + + ' Subconsulta de ventas + Dim vc As Cursor = Starter.skmt.ExecQuery($" + SELECT HVD_CANT, HVD_COSTO_TOT, IFNULL(HVD_RECHAZOCANT, 0) AS HVD_RECHAZOCANT + FROM HIST_VENTAS + WHERE HVD_CLIENTE = '${idCliente}' AND HVD_CANT > 0"$) + + For a = 0 To vc.RowCount - 1 + vc.Position = a + Dim piezasCargadas As Int = vc.GetInt("HVD_CANT") + Dim piezasRechazadas As Int = vc.GetInt("HVD_RECHAZOCANT") + + ' Evitar división por cero + Dim precioPorPieza As Double = 0 + If piezasCargadas > 0 Then precioPorPieza = vc.GetDouble("HVD_COSTO_TOT") / piezasCargadas + + If estatusStr = "ENTREGADO" Then + totalArticulosPiezas = totalArticulosPiezas + (piezasCargadas - piezasRechazadas) + totalMonto = totalMonto + ((piezasCargadas - piezasRechazadas) * precioPorPieza) + Else + totalArticulosPiezas = totalArticulosPiezas + piezasRechazadas + totalMonto = totalMonto + (piezasRechazadas * precioPorPieza) + End If + Next + vc.Close + + ' --- AGREGAR A LA LISTA --- + ' Usamos un formato limpio para el detalle + Dim infoDetalle As String = $"Piezas: ${totalArticulosPiezas} | Monto: $${NumberFormat2(totalMonto, 1, 2, 2, True)}${CRLF}ESTATUS: ${estatusStr}"$ + + ListView1.AddTwoLines(idCliente & " - " & c.GetString("CAT_CL_NOMBRE"), infoDetalle) + Next + End If + c.Close + End If +End Sub + +Sub B_REGRESA_Click + Log("B_REGRESA_Click") + BUSCA.Visible = False + connecta.Visible = True + trabajar.Visible = True + B_CLIEPROD.Visible = True + Panel1.Visible = False + b_Ubicar_Ru.Visible=True +End Sub + +''''''''''''''''''''''''''''MAPA RUTAS +Sub b_Ubicar_Ru_Click + + If l_ctast.Text = "0" Then + cmd.Initialize + cmd.Name = "select_hvd_impreso_guna" + cmd.Parameters = Array As Object(Subs.traeRutaReparto, ALMACEN)',e_ruta.Text,ALMACEN + reqManager.ExecuteQuery(cmd , 0, "hvd_impreso5") + Else If l_ctast.Text <> "0" Then + If b_check.Visible = True Then + MsgboxAsync("Favor de hacer el checklist.","Atención") + Else + StartActivity(MAPA_RUTAS) + End If + 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_tabulador_Click + If b_check.Visible = True Then + MsgboxAsync("Favor de hacer el checklist.","Atención") + Else + B4XPages.ShowPage("tabulador") + End If +End Sub + +Private Sub b_check_Click + B4XPages.ShowPage("checklist") +End Sub + +Private Sub ListView1_ItemClick (Position As Int, Value As Object) + Log(Value) + B_REGRESA_Click + clieasing = Regex.Split(" ", Value) + + + If l_ctast.Text = "0" Then + cmd.Initialize + cmd.Name = "select_hvd_impreso_guna" + cmd.Parameters = Array As Object(Subs.traeRutaReparto, ALMACEN)',e_ruta.Text,ALMACEN + reqManager.ExecuteQuery(cmd , 0, "hvd_impreso3") + Else If l_ctast.Text <> "0" Then + Log(clieasing(0)) + Starter.skmt.ExecNonQuery("delete from CUENTAA") + Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object(clieasing(0))) + B4XPages.ShowPage("Cliente") + End If + +End Sub + +Private Sub b_rechazos_Click + Dim label1 As Label + label1 = lv_prod_Prin.SingleLineLayout.Label + label1.TextSize = 18 + label1.TextColor = Colors.White + p_prod.Width = Root.Width + p_prod.Height = Root.Height + lv_prod_Prin.Width = Root.Width +' b_regreso.Left = (p_prod.Width - b_regreso.Width) / 2 + b_regreso.Top = p_prod.Height - b_regreso.Height + + b_impresion_rec.Top = p_prod.Height - b_impresion_rec.Height +' label1.TextSize = 20 + label1.Typeface = Typeface.CreateNew(Typeface.DEFAULT_BOLD, Typeface.STYLE_BOLD) + + If l_ctast.Text = "0" Then + b_impresion_rec.Enabled = True + Else If l_ctast.Text <> "0" Then + b_impresion_rec.Enabled = False + End If + +' lv_prod_Prin.Left = p_prod.Width / 2 + lv_prod_Prin.Width = Root.Width - (Root.Width * .10) + lv_prod_Prin.Height = Root.Height - (2 * (b_regreso.Height)) + Subs.centraListView(lv_prod_Prin,Root.Width) + p_prod.Visible = True + p_prod.BringToFront + Private c As Cursor = Starter.skmt.ExecQuery("select HVD_PRONOMBRE, IFNULL(SUM(HVD_RECHAZOCANT), 0) AS HVD_RECHAZOCANT, HVD_PROID from HIST_VENTAS WHERE hvd_rechazo <> 2 and HVD_RECHAZOCANT > 0 and HVD_PRONOMBRE <> 'Cobranza Pendiente' GROUP BY HVD_PROID order by HVD_PRONOMBRE asc") + lv_prod_Prin.SingleLineLayout.Label.TextColor = Colors.White + lv_prod_Prin.Clear + If c.RowCount > 0 Then + For i = 0 To c.RowCount - 1 + c.Position = i + Dim itemText As String + Private c3 As Cursor=Starter.skmt.ExecQuery($"select Ifnull(sum(PE_CANT),0) AS PE_CANT from PEDIDO WHERE PE_PROID ='${c.GetString("HVD_PROID")}'"$) + Private resta As String = 0 + + If c3.RowCount > 0 Then + c3.Position = 0 + resta = c3.GetString("PE_CANT") + Else + resta = 0 + End If + If ( c.GetInt("HVD_RECHAZOCANT") - resta) <= 0 Then + + Else +' If c.GetString("HVD_PRONOMBRE") <> "Cobranbra Pendiente" Then + itemText = $"${c.GetString("HVD_PRONOMBRE")} ${CRLF}Inventario: ${(c.GetInt("HVD_RECHAZOCANT") - resta)}"$ + lv_prod_Prin.AddSingleLine(itemText) +' End If + End If + Next + Else + lv_prod_Prin.AddSingleLine("No hay datos disponibles.") + End If + c.Close +End Sub + +Private Sub b_regreso_Click + p_prod.Visible = False +End Sub + +Private Sub p_prod_Click + +End Sub + +Private Sub b_venta_emp_Click + Starter.skmt.ExecNonQuery("delete from CUENTAA") + Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object("63403")) + B4XPages.ShowPage("Cliente") +End Sub + +Private Sub iv_rechazos_Click + b_rechazos_Click +End Sub + +Private Sub iv_tabulador_Click + b_tabulador_Click +End Sub + +Private Sub iv_clientesvisitados_Click + B_CLIEPROD_Click +End Sub + +Private Sub iv_calificarcliente_Click + trabajar_Click +End Sub + +Private Sub iv_ubicar_Click + b_Ubicar_Ru_Click +End Sub + +Private Sub B_PAGARES_Click + P_PAGARES.Visible = True + ListView2.Width = Root.Width - (Root.Width * .10) + ListView2.Height = Root.Height - (4 * (Button1.Height)) + P_PAGARES.BringToFront + P_PAGARES.Height = Root.Height + P_PAGARES.Width = Root.Width +' Dim LABEL1 As Label +' LABEL1.TextSize = 20 +' LABEL1.Typeface = Typeface.CreateNew(Typeface.DEFAULT_BOLD, Typeface.STYLE_BOLD) + + + + Button1.Left = (P_PAGARES.Width - Button1.Width) / 2 + Button1.Top = P_PAGARES.Height - Button1.Height + Subs.centraListView(ListView2,Root.Width) + Subs.SetDivider(ListView2, Colors.LightGray, 5) + Private g5 As Cursor = Starter.skmt.ExecQuery("SELECT SUM(SALDO_PENDIENTE) as SALDO_PENDIENTE FROM ABONOSP") + If g5.RowCount > 0 Then + g5.Position = 0 + Log(NumberFormat2( g5.GetDouble("SALDO_PENDIENTE"),0,2,2,False)) + l_montopagares.Text = NumberFormat2( g5.GetDouble("SALDO_PENDIENTE"),0,2,2,False) + Else + l_montopagares.Text = 0 + End If + g5.Close + + Private g7 As Cursor = Starter.skmt.ExecQuery("SELECT count(*) as SALDO_PENDIENTE FROM ABONOSP") + If g7.RowCount > 0 Then + g7.Position = 0 + l_numpagares.Text = g7.GetString("SALDO_PENDIENTE") + Else + l_numpagares.Text = 0 + End If + g7.Close + + Private g6 As Cursor = Starter.skmt.ExecQuery("select NOTA,NOMBRE,SALDO_PENDIENTE from ABONOSP") + + ListView2.Clear + ListView2.TwoLinesLayout.ItemHeight =80dip + Dim label1 As Label + label1 = ListView2.TwoLinesLayout.Label + label1.TextSize = 16 + label1.Height = 45dip + ' label1. + label1.Typeface = Typeface.CreateNew(Typeface.DEFAULT_BOLD, Typeface.STYLE_BOLD) + label1.TextColor = Colors.White + Dim label2 As Label + label2 = ListView2.TwoLinesLayout.SecondLabel + label2.Top = 45dip + label2.TextSize = 16 + label2.Typeface = Typeface.CreateNew(Typeface.DEFAULT_BOLD, Typeface.STYLE_BOLD) + label2.TextColor = Colors.White + If g6.RowCount > 0 Then + For i = 0 To g6.RowCount - 1 + g6.Position = i +' Dim itemText As String +' itemText = $"NOMBRE.: ${g6.GetString("NOMBRE")} ${CRLF}FOLIO: ${(g6.GetString("NOTA"))}, MONTO: $ ${(NumberFormat2(g6.GetString("SALDO_PENDIENTE"),0,2,2,False))}"$ + + ListView2.AddTwoLines("NOMBRE.: "& g6.GetString("NOMBRE"),"FOLIO: "& g6.GetString("NOTA")&", MONTO: "&(NumberFormat2(g6.GetString("SALDO_PENDIENTE"),0,2,2,False))) +' ListView2.AddSingleLine(itemText) + Next +' Else + '' ListView2.AddSingleLine("No hay datos disponibles.") +' ListView2.AddTwoLines("No hay datos disponibles.","") + End If + g6.Close + +End Sub + +Private Sub Button1_Click + P_PAGARES.Visible = False +End Sub + +Private Sub P_PAGARES_Click + +End Sub + + +Sub cuanto + ''' RECHAZO - VENTA + Private r5 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(HVD_COSTO_TOT,0) AS HVD_COSTO_TOT, IFNULL(HVD_CANT,0) AS HVD_CANT, IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_PROID, HVD_CLIENTE, CONSECUTIVO from HIST_VENTAS where HVD_RECHAZO = '1' and BCAJAS = '0' ORDER BY HVD_PROID "$) + + Private rescant As String = 0 + If r5.RowCount > 0 Then + For j4 = 0 To r5.RowCount -1 + r5.Position = j4 + Private r6 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(SUM(PE_CANT),0) AS PE_CANT from PEDIDO where PE_CLIENTEOR = '${r5.GetString("HVD_CLIENTE")}' AND PE_PROID = '${r5.GetString("HVD_PROID")}' AND CONSECUTIVO = '${r5.GetString("CONSECUTIVO")}' "$) + Dim totalcantped As String + If r6.RowCount > 0 Then + r6.Position = 0 + totalcantped = r6.GetString("PE_CANT") + Else + totalcantped = 0 + End If + Log(r5.GetString("HVD_RECHAZOCANT") &" - "& totalcantped) + rescant = rescant + ((r5.GetString("HVD_COSTO_TOT")/(r5.GetString("HVD_CANT")))*((r5.GetString("HVD_RECHAZOCANT") - totalcantped))) +' Log(rescant) + r6.Close + Next + End If + If rescant = "NaN" Then rescant = 0 +' LogColor(rescant,Colors.Red) + r5.Close + + Private r5 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(HVD_COSTO_TOT,0) AS HVD_COSTO_TOT, IFNULL(HVD_CANT,0) AS HVD_CANT,IFNULL(CANTC,0) AS CANTC, IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_PROID, HVD_CLIENTE, CONSECUTIVO from HIST_VENTAS where HVD_RECHAZO = '1' and BCAJAS = '1' "$) +' Private r5 As Cursor = Starter.skmt.ExecQuery($"select * from HIST_VENTAS where HVD_RECHAZO = '1' and BCAJAS = '1' "$) + + Private rescant2 As Double = 0 + If r5.RowCount > 0 Then + For j5 = 0 To r5.RowCount -1 + r5.Position = j5 + Private r6 As Cursor = Starter.skmt.ExecQuery($"select IFNULL(SUM(PE_CANT),0) AS PE_CANT from PEDIDO where PE_CLIENTEOR = '${r5.GetString("HVD_CLIENTE")}' AND PE_PROID = '${r5.GetString("HVD_PROID")}' AND CONSECUTIVO = '${r5.GetString("CONSECUTIVO")}'"$) + r6.Position = 0 +' Log(r6.GetString("PE_CANT")) + rescant2 = rescant2 + ((r5.GetString("HVD_COSTO_TOT")/(r5.GetString("CANTC")))*((r5.GetString("HVD_RECHAZOCANT") - r6.GetString("PE_CANT"))/Subs.traeConversion(r5.GetString("HVD_PROID")))) + rescant2 = NumberFormat2(rescant2, 0, 2, 2, False) + r6.Close + Next + End If + If rescant2 = "NaN" Then rescant2 = 0 + Log(rescant2) + r5.Close + '''FIN RECHAZO - VENTA + + '''RECHAZO + Private r5r As Cursor = Starter.skmt.ExecQuery($"select IFNULL(HVD_COSTO_TOT,0) AS HVD_COSTO_TOT, IFNULL(HVD_CANT,0) AS HVD_CANT, IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_PROID, HVD_CLIENTE, CONSECUTIVO from HIST_VENTAS where HVD_RECHAZO = '1' and BCAJAS = '0' "$) + Private rescantr As String = 0 + If r5r.RowCount > 0 Then + For j4r = 0 To r5r.RowCount -1 + r5r.Position = j4r + Private r6r As Cursor = Starter.skmt.ExecQuery($"select IFNULL(SUM(PE_CANT),0) AS PE_CANT from PEDIDO where PE_CLIENTEOR = '${r5r.GetString("HVD_CLIENTE")}' AND PE_PROID = '${r5r.GetString("HVD_PROID")}' AND CONSECUTIVO = '${r5r.GetString("CONSECUTIVO")}' "$) + r6r.Position = 0 +' LogColor(r5.GetString("HVD_COSTO_TOT")&" / "& r5.GetString("HVD_CANT")&" * "&r5.GetString("HVD_RECHAZOCANT")&" - "&r6.GetString("PE_CANT"),Colors.Blue) +' LogColor(r6.GetString("PE_CANT"),Colors.Blue) + rescantr = rescantr + ((r5r.GetString("HVD_COSTO_TOT")/(r5r.GetString("HVD_CANT")))*(r5r.GetString("HVD_RECHAZOCANT"))) + r6r.Close + Next + End If + If rescantr = "NaN" Then rescantr = 0 +' LogColor(rescant,Colors.Red) + r5r.Close + +' Log(rescantr) + + Private r5r As Cursor = Starter.skmt.ExecQuery($"select IFNULL(HVD_COSTO_TOT,0) AS HVD_COSTO_TOT, IFNULL(HVD_CANT,0) AS HVD_CANT,IFNULL(CANTC,0) AS CANTC, IFNULL(HVD_RECHAZOCANT,0) AS HVD_RECHAZOCANT, HVD_PROID, HVD_CLIENTE, CONSECUTIVO from HIST_VENTAS where HVD_RECHAZO = '1' and BCAJAS = '1' "$) + +' Private r5 As Cursor = Starter.skmt.ExecQuery($"select * from HIST_VENTAS where HVD_RECHAZO = '1' and BCAJAS = '1' "$) + Private rescant2r As String = 0 + If r5r.RowCount > 0 Then + For j5r = 0 To r5r.RowCount -1 + r5r.Position = j5r + Private r6r As Cursor = Starter.skmt.ExecQuery($"select IFNULL(SUM(PE_CANT),0) AS PE_CANT from PEDIDO where PE_CLIENTEOR = '${r5r.GetString("HVD_CLIENTE")}' AND PE_PROID = '${r5r.GetString("HVD_PROID")}' AND CONSECUTIVO = '${r5r.GetString("CONSECUTIVO")}'"$) + r6r.Position = 0 +' Log(r6.GetString("PE_CANT")) + rescant2r = rescant2r + ((r5r.GetString("HVD_COSTO_TOT")/(r5r.GetString("CANTC")))*((r5r.GetString("HVD_RECHAZOCANT"))/Subs.traeConversion(r5r.GetString("HVD_PROID")))) + r6r.Close + Next + End If + If rescant2r = "NaN" Then rescant2r = 0 +' Log(rescant2) + r5r.Close + Log(rescant2r) + Log(rescant2r+rescantr) + + '''' FIN RECHAZO +End Sub + +Private Sub ListView2_ItemClick (Position As Int, Value As Object) + Log(Value) + compara= Value + Log(compara.Replace("NOMBRE.: ","")) + + + If l_ctast.Text = "0" Then + cmd.Initialize + cmd.Name = "select_hvd_impreso_guna" + cmd.Parameters = Array As Object(Subs.traeRutaReparto, ALMACEN)',e_ruta.Text,ALMACEN + reqManager.ExecuteQuery(cmd , 0, "hvd_impreso4") + Else If l_ctast.Text <> "0" Then + Dim compara1() As String = Regex.Split(CRLF,compara) + Log(compara1(0)) + Log(compara1(0).Replace("NOMBRE.: ","")) + Dim g7 As Cursor = Starter.skmt.ExecQuery2("SELECT CAT_CL_CODIGO from kmt_info WHERE CAT_CL_NOMBRE = ?", Array As String (compara1(0).Replace("NOMBRE.: ","").Trim)) + If g7.RowCount > 0 Then + g7.Position = 0 + Starter.skmt.ExecNonQuery("delete from CUENTAA") + + Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object(g7.GetString("CAT_CL_CODIGO"))) + P_PAGARES.Visible = False + B4XPages.ShowPage("Cliente") + End If + End If + + + +End Sub + +Private Sub et_ruta2_TextChanged (Old As String, New As String) + If s_almacen2.Size > 0 Then + If s_almacen2.SelectedItem <> "-= Seleccione =-" And New <> "" Then + cargar.Enabled = True + Else + cargar.Enabled = False + End If + End If +End Sub + +Private Sub s_almacen2_ItemClick (Position As Int, Value As Object) + Private ga As ResultSet = Starter.skmt.ExecQuery($"select * from CAT_ALMACEN_AGRUPADOR where descripcion = '${Value}'"$) + Do While ga.NextRow + idAlmacenExtra = ga.GetString("ID") + Loop + Log($"${Value}, ${idAlmacenExtra}"$) + If Value <> "-= Seleccione =-" And et_ruta2.Text <> "" Then + cargar.Enabled = True + Else + cargar.Enabled = False + End If +End Sub + +Private Sub b_multiAlmacen_Click + s_almacen2.SelectedIndex = 0 + et_ruta2.Text = "" + If p_multiAlmacen.Visible Then + p_multiAlmacen.Visible = False + cargar.Enabled = True + multiAlmacen = False + Else + p_multiAlmacen.Visible = True + cargar.Enabled = False + multiAlmacen = True + End If +End Sub + +Sub cargaAlmacen2 + Log("=================================================") + Log("============ CARGAMOS ALMACEN 2 ===============") + Log("=================================================") + Private almacenPrincipal = ALMACEN + Private rutaPrincipal = e_ruta.text + ALMACEN = idAlmacenExtra + e_ruta.text = et_ruta2.text + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("MULTI_A_ALMACEN")) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("MULTI_A_ALMACEN", ALMACEN)) + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("MULTI_A_RUTA")) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("MULTI_A_RUTA", e_ruta.Text)) + l_ruta.Text = "0" + cargaGeneral + Sleep(2000) + ALMACEN = almacenPrincipal + e_ruta.text = rutaPrincipal + b_multiAlmacen.Visible = False + p_multiAlmacen.Visible = False + s_almacen2.SelectedIndex = 0 + et_ruta2.Text = "" + cargar.Enabled = True +End Sub + +Private Sub inventario_Click + +' ProgressDialogShow("Imprimiendo, un momento ...") +' Printer1.DisConnect +' If Not(Printer1.IsConnected) Then + '' Log("Conectando a impresora ...") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) +' Sleep(1000) + '' Log("++++++ " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect 'Tratamos de reconectar +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' Else + '' Log("conectando 2") +' Printer1.Connect +' Private cont As Int = 0 +' Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) +' Sleep(1000) + '' Log("****** " & cont) +' cont = cont + 1 +' If cont = 2 Then Printer1.Connect +' If cont > 3 Then impresoraConectada = True +' Loop +' Sleep(500) +' impresoraConectada = False +' End If + + ProgressDialogShow2("Imprimiendo, un momento ...",False) + Printer1.DisConnect + If Not(Printer1.IsConnected) Then +' If logger Then Log("conectando 1") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) + Sleep(1000) + cont = cont + 1 + If cont = 7 Then Printer1.Connect 'Tratamos de reconectar + If cont > 15 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + Else +' If logger Then Log("conectando 2") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) + Sleep(1000) + cont = cont + 1 + If cont = 2 Then Printer1.Connect + If cont > 4 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + End If + + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + Dim bmp As Bitmap + Printer1.Justify= 1 + bmp.InitializeResize(File.DirAssets, "inventarios.jpg", 92, 92, True) 'ignore + Dim myimage As AnImage = Printer1.ImageToBWIMage(bmp) + myimage = Printer1.DitherImage2D(myimage, 128) + myimage= Printer1.PackImage(myimage) + Printer1.WriteString(CRLF) ' nudge the printer to show the user something is happening + Printer1.WriteString(CRLF) ' nudge the printer to show the user something is happening + Printer1.WriteString(Printer1.REVERSE) + Printer1.PrintImage(myimage) + Printer1.WriteString(Printer1.UNREVERSE) + Printer1.WriteString(" " & CRLF) + Private c As Cursor = Starter.skmt.ExecQuery("select HVD_PRONOMBRE, IFNULL(SUM(HVD_CANT), 0) AS HVD_CANT, HVD_PROID from HIST_VENTAS WHERE HVD_PRONOMBRE <> 'Cobranza Pendiente' and HVD_PROID <> HVD_CODPROMO GROUP BY HVD_PROID order by HVD_PRONOMBRE asc") + lv_prod_Prin.SingleLineLayout.Label.TextColor = Colors.White + lv_prod_Prin.Clear + Printer1.Justify = 0 + Dim sDate, sTime As String + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate = DateTime.Date(DateTime.Now) + sTime = DateTime.Time(DateTime.Now) + Printer1.WriteString("Fecha: " &sDate & CRLF) + Printer1.WriteString("Hora: " &sTime & CRLF) + Printer1.WriteString("Ruta: " & l_ruta.Text & CRLF) + Printer1.WriteString("Usuario: " & Subs.dameUsuarioDeDB & CRLF) +' Printer1.WriteString("----------INVENTARIO----------" & CRLF) + Printer1.WriteString("--------------------------------" & CRLF) + If c.RowCount > 0 Then + For i = 0 To c.RowCount - 1 + c.Position = i + + Printer1.WriteString("-----------INVENTARIO-----------" & CRLF) + Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString("Cant. Producto" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + For i=0 To c.RowCount -1 + c.Position=i + + + Printer1.Justify = 0 + Printer1.WriteString( (c.GetString("HVD_CANT"))&"- ") + Printer1.Justify = 0 + Dim firstChar As String = c.GetString("HVD_PRONOMBRE").SubString2(0, 1) ' Obtiene el primer carácter + Dim productoinven As String + + ' Verificar si el primer carácter es un número + If Asc(firstChar) >= Asc("0") And Asc(firstChar) <= Asc("9") Then + ' Es un número - tomar a partir del 4to carácter + productoinven = c.GetString("HVD_PRONOMBRE").SubString(4) + Else +' Es una letra u otro carácter - tomar completo + productoinven = c.GetString("HVD_PRONOMBRE") + End If + + Log(productoinven) + Printer1.WriteString(productoinven) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + + + Next + + Next + End If + c.Close + + Dim sumainv As Cursor = Starter.skmt.ExecQuery("SELECT SUM(HVD_CANT) AS CANTIDAD FROM HIST_VENTAS WHERE HVD_CODPROMO <> HVD_PROID and HVD_PRONOMBRE <> 'Cobranza Pendiente' ") + sumainv.Position = 0 + + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString("Total piezas: " & sumainv.GetString("CANTIDAD")& CRLF) + Printer1.WriteString("------------------------------" & CRLF) + Printer1.Justify = 0 + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Sleep(1000) + Printer1.DisConnect + ProgressDialogHide +' progr + + +End Sub + +Sub Printer1_Connected (Success As Boolean) +' If Logger Then Log("Printer1_Connected") + If Success Then + ToastMessageShow("Impresora conectada", False) + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("MACIMP")) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("MACIMP",Starter.mac_impresora)) +' If logger Then LogColor("Impresora conectada", Colors.Green) +' B_IMP2.Enabled = True + impresoraConectada = True + Else +' Msgbox(Printer1.ConnectedErrorMsg, "Error connecting.") 'ignore +' ToastMessageShow("Error conectando la impresora", False) + LogColor("Error conectando la impresora", Colors.Red) + errorImpresora = errorImpresora + 1 + If errorImpresora > 1 Then + Starter.MAC_IMPRESORA = "0" + errorImpresora = 0 + End If + End If +End Sub + +Sub Printer1_Error + Log("error printer") +End Sub + +Sub Printer_Connected (Success As Boolean) + If Success Then +' B_IMP.Enabled = True + PASA_IMP = "1" + Else +' B_IMP.Enabled = False + If Msgbox2("", "Printer Error","Reprint","Cancel","",Null) = DialogResponse.POSITIVE Then 'ignore + StartPrinter + End If + End If +End Sub + +Sub StartPrinter + Dim PairedDevices As Map + Dim L1 As List + Dim resimp As Int + ToastMessageShow("Printing.....",True) + PairedDevices.Initialize + Try + PairedDevices = cmp20.GetPairedDevices + Catch + Msgbox("Getting Paired Devices","Printer Error") 'ignore + printer.Close + cmp20.Disconnect + End Try + + If PairedDevices.Size = 0 Then + Msgbox("Error Connecting to Printer - Printer Not Found","") 'ignore + Return + End If + + If PairedDevices.Size = 1 Then + Try + cmp20.Connect(PairedDevices.Get(PairedDevices.GetKeyAt(0))) + Catch + Msgbox("Connecting","Printer Error") 'ignore + printer.Close + cmp20.Disconnect + End Try + Else + L1.Initialize + For i = 0 To PairedDevices.Size - 1 + L1.Add(PairedDevices.GetKeyAt(i)) + Next + resimp = InputList(L1, "Choose device", -1) 'ignore + If resimp <> DialogResponse.CANCEL Then + cmp20.Connect(PairedDevices.Get(L1.Get(resimp))) + End If + End If +End Sub + +Private Sub ImageView1_LongClick +' ' NOVENTA +' c = Starter.skmt.ExecQuery("SELECT NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON, NV_FOTO,NV_FOTO2, NV_REPROGRAMAR FROM NOVENTA") +' D=Starter.skmt.ExecQuery("SELECT COUNT(*) AS CUANTOS_NOVENTA FROM NOVENTA") +' If c.RowCount>0 Then +' For i=0 To c.RowCount -1 +' c.Position=i +' +' Dim fotoenvia() As Byte = c.GetBlob("NV_FOTO") +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "insert_reparto_REPG_GUNA_VN2" +' cmd.Parameters = Array As Object(C.GetString("NV_CLIENTE"),C.GetString("NV_FECHA"),C.GetString("NV_USER"),C.GetString("NV_MOTIVO"),C.GetString("NV_COMM"),C.GetString("NV_LAT"),C.GetString("NV_LON"), ALMACEN, l_ruta.Text,fotoenvia) +' reqManager.ExecuteCommand(cmd , "inst_noventa_") +' Next +' c.Close +' End If +' d.Position=0 +' cuantos_noventa = D.GetString("CUANTOS_NOVENTA") +' d.Close + + 'PAGARES. + Dim pa As Cursor =Starter.skmt.ExecQuery("select PA_ALMACEN,PA_RUTA_REP,PA_RUTAPREV,PA_FECHA_PREV,PA_CAPTURA,PA_MONTO,PA_USUARIO,PA_CLIENTE,IFNULL(PA_CANCELADO,0) AS PA_CANCELADO from PAGARES") + If pa.RowCount > 0 Then + For pag = 0 To pa.RowCount - 1 + pa.Position = pag + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_reparto_PAGARES_GUNA_VN" + Dim fechaenvio() As String + fechaenvio = Regex.Split(" ",pa.GetString("PA_FECHA_PREV")) +' Log(fechaenvio(0)) + Dim fechaenvio1() As String + fechaenvio1 = Regex.Split("/",fechaenvio(0)) + Dim fechaano As String = fechaenvio1(2).SubString(2) + Dim fechareal As String = fechaenvio1(0)&"/"&fechaenvio1(1)&"/"&fechaano +' Log(fechareal) + Dim fechacap() As String + fechacap = Regex.Split("/",pa.GetString("PA_CAPTURA")) + Dim fechacapano As String = fechacap(2).SubString(2) +' Dim mes As Int = DateTime.GetMonth(DateTime.Now) + If DateTime.GetMonth(DateTime.Now) = fechacap(1) Then + Dim fechacapreal As String = fechacap(0)&"/"&fechacap(1)&"/"&fechacapano + Else + Dim fechacapreal As String = fechacap(1)&"/"&fechacap(0)&"/"&fechacapano + End If + If pa.GetString("PA_CANCELADO") = "2" Then + cmd.Parameters = Array As Object(pa.GetString("PA_CLIENTE"),pa.GetString("PA_MONTO"),fechacapreal,pa.GetString("PA_ALMACEN"),pa.GetString("PA_RUTAPREV"),pa.GetString("PA_RUTA_REP"),fechareal,pa.GetString("PA_USUARIO"),2) + Else + cmd.Parameters = Array As Object(pa.GetString("PA_CLIENTE"),pa.GetString("PA_MONTO"),fechacapreal,pa.GetString("PA_ALMACEN"),pa.GetString("PA_RUTAPREV"),pa.GetString("PA_RUTA_REP"),fechareal,pa.GetString("PA_USUARIO"),"") + End If + reqManager.ExecuteCommand(cmd , "ins_pagares") + Next + End If + pa.Close + +End Sub + +Private Sub b_impresion_rec_Click + Dim totalentrega As Int + Dim totalrechazo As Int + Dim totalpiezas As Int + Dim sDate, sTime As String + c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") +' DateTime.DateFormat = "MM/dd/yyyy" + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat="HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c.Close +' c=Starter.skmt.ExecQuery2("SELECT CAT_VA_VALOR FROM CAT_VARIABLES WHERE CAT_VA_DESCRIPCION =?", Array As String ("SUCURSAL")) +' c.Position = 0 +' sucursal = c.GetString("CAT_VA_VALOR") +' c.Close + + ProgressDialogShow2("Imprimiendo, un momento ...",False) + Printer1.DisConnect + If Not(Printer1.IsConnected) Then +' Log("Conectando a impresora ...") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) + Sleep(1000) +' Log("++++++ " & cont) + cont = cont + 1 + If cont = 2 Then Printer1.Connect 'Tratamos de reconectar + If cont > 3 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + Else +' Log("conectando 2") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) + Sleep(1000) +' Log("****** " & cont) + cont = cont + 1 + If cont = 2 Then Printer1.Connect + If cont > 3 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + End If + + TAMANO = 0 + ESPACIO = 28 + BLANCO = " " + + Printer1.WriteString("gUNA Distribuciones" & CRLF) + Printer1.WriteString(sDate & " " &sTime & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("------------RECHAZO-----------" & CRLF) + + Private c As Cursor = Starter.skmt.ExecQuery("select HVD_PRONOMBRE, IFNULL(SUM(HVD_RECHAZOCANT), 0) AS HVD_RECHAZOCANT, IFNULL(SUM(HVD_CANT), 0) AS HVD_CANT, (IFNULL(SUM(HVD_CANT), 0) - IFNULL(SUM(HVD_RECHAZOCANT), 0)) as total, HVD_PROID from HIST_VENTAS where HVD_RECHAZO = 1 AND HVD_PRONOMBRE <> 'Cobranza Pendiente' GROUP BY HVD_PROID order by HVD_PRONOMBRE asc") + If c.RowCount > 0 Then + For i = 0 To c.RowCount - 1 + c.Position = i + Printer1.WriteString(" " & CRLF) + + Private c3 As Cursor=Starter.skmt.ExecQuery($"select Ifnull(sum(PE_CANT),0) AS PE_CANT from PEDIDO WHERE PE_PROID ='${c.GetString("HVD_PROID")}'"$) + Private resta As String = 0 + + If c3.RowCount > 0 Then + c3.Position = 0 + resta = c3.GetString("PE_CANT") + Else + resta = 0 + End If + Printer1.Justify = 0 + Printer1.WriteString(c.GetString("HVD_PRONOMBRE") & CRLF) +' Printer1.Justify = 0 +' Printer1.WriteString("TP: "& c.GetInt("HVD_CANT")&" ") +' Printer1.Justify = 1 +' Printer1.WriteString(" TE: " & (c.GetInt("total") + resta)&" ") +' Printer1.Justify = 2 + Printer1.WriteString("RECHAZO: " & (c.GetInt("HVD_RECHAZOCANT") - resta)&" ") + Printer1.Justify = 0 + Printer1.WriteString(" " & CRLF) +' Printer1.WriteString(" " & CRLF) + +' itemText2 = $"${c.GetString("HVD_PRONOMBRE")} ${CRLF} TP: ${(c.GetInt("HVD_CANT"))} TE: ${( c.GetInt("total") + resta)} TR: ${(c.GetInt("HVD_RECHAZOCANT") - resta)}"$ + totalentrega = totalentrega + c.GetInt("total") + resta + totalrechazo = totalrechazo + c.GetInt("HVD_RECHAZOCANT") - resta + totalpiezas = totalpiezas + c.GetInt("HVD_CANT") +' Log(itemText2) + + Next + End If + c.Close + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString(" " & CRLF) +' Printer1.WriteString("Total Piezas: "& totalpiezas & CRLF) +' Printer1.WriteString("Total Entrega: "& totalentrega & CRLF) + Printer1.WriteString("Total Rechazo: "& totalrechazo & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Sleep(1000) + Printer1.DisConnect + + ProgressDialogHide +End Sub + +Sub imp_LIQUIDACION + + ProgressDialogShow2("Imprimiendo, un momento ...",False) + Printer1.DisConnect + If Not(Printer1.IsConnected) Then +' If logger Then Log("conectando 1") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) + Sleep(1000) + cont = cont + 1 + If cont = 7 Then Printer1.Connect 'Tratamos de reconectar + If cont > 15 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + Else +' If logger Then Log("conectando 2") + Printer1.Connect + Private cont As Int = 0 + Do While Not(impresoraConectada) Or Not(Printer1.IsConnected) + Sleep(1000) + cont = cont + 1 + If cont = 2 Then Printer1.Connect + If cont > 4 Then impresoraConectada = True + Loop + Sleep(500) + impresoraConectada = False + End If + + TAMANO = 0 + ESPACIO = 29 + BLANCO = " " + Printer1.Justify = 0 + Dim sDate, sTime As String + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate = DateTime.Date(DateTime.Now) + sTime = DateTime.Time(DateTime.Now) + Printer1.WriteString("Fecha: " &sDate & CRLF) + Printer1.WriteString("Hora: " &sTime & CRLF) + Printer1.WriteString("Ruta: " & l_ruta.Text & CRLF) + Printer1.WriteString("Usuario: " & Subs.dameUsuarioDeDB & CRLF) + Printer1.WriteString("----------LIQUIDACION----------" & CRLF) + Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString("Monto avion: $" & NumberFormat2((L_MONTOE.Text+l_rechazo.Text),0,2,2,True) & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("Monto entregado: $" & NumberFormat2(L_MONTOE.Text,0,2,2,True) & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("Monto rechazado: $" & NumberFormat2(l_rechazo.Text,0,2,2,True) & CRLF) + Printer1.WriteString(" " & CRLF) + Dim ab2 As Cursor = Starter.skmt.ExecQuery($"SELECT * from ABONOS where a_tipoabono is null"$) + Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString("Cant. cxc cobrados: " & NumberFormat2(ab2.RowCount,0,0,0,True) & CRLF) + Printer1.WriteString(" " & CRLF) + Dim ab6 As Cursor = Starter.skmt.ExecQuery($"SELECT Ifnull(sum(a_abono),0) as a_abono from ABONOS where a_tipoabono is null"$) + If ab6.RowCount > 0 Then + ab6.Position = 0 + Printer1.WriteString("cxc cobrados: $" & NumberFormat2(ab6.GetString("a_abono"),0,2,2,True) & CRLF) + Else + Printer1.WriteString("cxc cobrados: $" & NumberFormat2(0,0,2,2,True) & CRLF) + End If + Printer1.WriteString(" " & CRLF) + + If l_pagarescobrados.Text > 0 Then + Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString(" Cliente Abono" & CRLF) + Printer1.WriteString("--------------------------------" & CRLF) +' Printer1.WriteString( CRLF) + Dim abonoscreditos As Cursor = Starter.skmt.ExecQuery("SELECT a_abono, length(a_abono) as L_abono , length(a_cliente) as L_cliente , a_cliente, TIPO_PAGO FROM ABONOS where a_tipoabono is null ORDER BY a_cliente") + For g = 0 To abonoscreditos.RowCount -1 + abonoscreditos.Position = g + + TAMANO = abonoscreditos.GetInt("L_abono") + TAMANO +3 + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For j =0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( abonoscreditos.GetString("a_cliente") & BLANCO) + Printer1.Justify = 1 + Dim LETRA As String + If abonoscreditos.GetString("TIPO_PAGO") = "EFECTIVO" Then + LETRA = "E" + Else If abonoscreditos.GetString("TIPO_PAGO") = "TRANSFERENCIA" Then + LETRA = "T" + Else If abonoscreditos.GetString("TIPO_PAGO") = "CHEQUE" Then + LETRA = "C" + End If + Printer1.WriteString( NumberFormat2(abonoscreditos.GetString("a_abono"),0,2,2,True)&"-"&LETRA) + Printer1.WriteString( CRLF) + TAMANO = 0 + ESPACIO = 29 + BLANCO = " " + Printer1.Justify = 0 + Next + Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString( CRLF) + End If + + Dim ab5 As Cursor = Starter.skmt.ExecQuery($"SELECT * from ABONOS where a_tipoabono is not null"$) + + Printer1.WriteString("Cant. pagares nuevos cobrados: " & NumberFormat2(ab5.RowCount,0,0,0,True) & CRLF) + Printer1.WriteString(" " & CRLF) + + Dim ab7 As Cursor = Starter.skmt.ExecQuery($"SELECT Ifnull(sum(a_abono),0) as a_abono from ABONOS where a_tipoabono is not null"$) + If ab7.RowCount > 0 Then + ab7.Position = 0 + Printer1.WriteString("Pagares nuevos cobrados: $" & NumberFormat2(ab7.GetString("a_abono"),0,2,2,True) & CRLF) + Else + Printer1.WriteString("Pagares nuevos cobrados: $" & NumberFormat2(0,0,2,2,True) & CRLF) + End If + Printer1.WriteString(" " & CRLF) + + If l_pagarescobrados.Text > 0 Then + Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString(" Cliente Abono" & CRLF) + Printer1.WriteString("--------------------------------" & CRLF) +' Printer1.WriteString( CRLF) + Dim abonoscreditos As Cursor = Starter.skmt.ExecQuery("SELECT a_abono, length(a_abono) as L_abono , length(a_cliente) as L_cliente , a_cliente, TIPO_PAGO FROM ABONOS where a_tipoabono is not null ORDER BY a_cliente") + For g = 0 To abonoscreditos.RowCount -1 + abonoscreditos.Position = g + + TAMANO = abonoscreditos.GetInt("L_abono") + TAMANO +3 + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For j =0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( abonoscreditos.GetString("a_cliente") & BLANCO) + Printer1.Justify = 1 + Dim LETRA As String + If abonoscreditos.GetString("TIPO_PAGO") = "EFECTIVO" Then + LETRA = "E" + Else If abonoscreditos.GetString("TIPO_PAGO") = "TRANSFERENCIA" Then + LETRA = "T" + Else If abonoscreditos.GetString("TIPO_PAGO") = "CHEQUE" Then + LETRA = "C" + End If + Printer1.WriteString( NumberFormat2(abonoscreditos.GetString("a_abono"),0,2,2,True)&"-"&LETRA) + Printer1.WriteString( CRLF) + TAMANO = 0 + ESPACIO = 29 + BLANCO = " " + Printer1.Justify = 0 + Next + Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString( CRLF) + End If + + Dim pa2 As Cursor =Starter.skmt.ExecQuery("select PA_ALMACEN,PA_RUTA_REP,PA_RUTAPREV,PA_FECHA_PREV,PA_CAPTURA,PA_MONTO,PA_USUARIO,PA_CLIENTE,IFNULL(PA_CANCELADO,0) AS PA_CANCELADO from PAGARES") + + Printer1.WriteString("Cant. pagares nuevos: " & NumberFormat2(pa2.RowCount,0,0,0,True) & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("Pagares nuevos: $" & NumberFormat2(l_pagaresnuevos.Text,0,2,2,True) & CRLF) + + If l_pagaresnuevos.Text > 0 Then + Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString(" Cliente Pagare" & CRLF) + Printer1.WriteString("--------------------------------" & CRLF) +' Printer1.WriteString( CRLF) + Dim abonoscreditos As Cursor = Starter.skmt.ExecQuery("SELECT PA_MONTO, length(PA_MONTO) as L_PA_MONTO , length(PA_CLIENTE) as L_cliente , PA_CLIENTE FROM PAGARES ORDER BY PA_CLIENTE") + For g = 0 To abonoscreditos.RowCount -1 + abonoscreditos.Position = g + + TAMANO = abonoscreditos.GetInt("L_PA_MONTO") + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For j =0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( abonoscreditos.GetString("PA_CLIENTE") & BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( NumberFormat2(abonoscreditos.GetString("PA_MONTO"),0,2,2,True)) + Printer1.WriteString( CRLF) + TAMANO = 0 + ESPACIO = 29 + BLANCO = " " + Printer1.Justify = 0 + Next + Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString( CRLF) + End If + + + + Dim c As Cursor = Starter.skmt.ExecQuery("SELECT DISTINCT(CAT_CL_NOMBRE), CAT_CL_CODIGO, gestion FROM kmt_info WHERE gestion = 2 and CAT_CL_CODIGO NOT IN (SELECT PA_CLIENTE FROM PAGARES)") + + If c.RowCount > 0 Then + Printer1.WriteString("Clientes a contado: " & NumberFormat2(c.RowCount,0,0,0,False) & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("Monto a contado: $" & NumberFormat2((L_MONTOE.Text-l_pagaresnuevos.Text),0,2,2,True) & CRLF) + Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString(" Cliente Monto" & CRLF) + Printer1.WriteString("--------------------------------" & CRLF) + For i = 0 To c.RowCount - 1 + c.Position = i + Dim idCliente As String = c.GetString("CAT_CL_CODIGO") + Dim gestion As String = c.GetString("gestion") + Dim estatusStr As String = IIf(gestion = "2", "ENTREGADO", "RECHAZADO") + + Dim totalMonto As Double = 0 + Dim totalArticulosPiezas As Int = 0 + + ' Subconsulta de ventas + Dim vc As Cursor = Starter.skmt.ExecQuery($" + SELECT HVD_CANT, HVD_COSTO_TOT, IFNULL(HVD_RECHAZOCANT, 0) AS HVD_RECHAZOCANT + FROM HIST_VENTAS + WHERE HVD_CLIENTE = '${idCliente}' AND HVD_CANT > 0 and HVD_PRONOMBRE <> 'Cobranza Pendiente' "$) + + For a = 0 To vc.RowCount - 1 + vc.Position = a + + Dim piezasCargadas As Int = vc.GetInt("HVD_CANT") + Dim piezasRechazadas As Int = vc.GetInt("HVD_RECHAZOCANT") + + ' Evitar división por cero + Dim precioPorPieza As Double = 0 + If piezasCargadas > 0 Then precioPorPieza = vc.GetDouble("HVD_COSTO_TOT") / piezasCargadas + + If estatusStr = "ENTREGADO" Then + totalArticulosPiezas = totalArticulosPiezas + (piezasCargadas - piezasRechazadas) + totalMonto = totalMonto + ((piezasCargadas - piezasRechazadas) * precioPorPieza) + Else + totalArticulosPiezas = totalArticulosPiezas + piezasRechazadas + totalMonto = totalMonto + (piezasRechazadas * precioPorPieza) + End If + + + + Next + + TAMANO = totalMonto.As(String).Length + TAMANO + ESPACIO = (ESPACIO - TAMANO)/2 +' Log(ESPACIO) + For j =0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( idCliente & BLANCO) + Printer1.Justify = 1 + Printer1.WriteString( NumberFormat2(totalMonto,0,2,2,True)) + Printer1.WriteString( CRLF) + Dim CONTADOS As Cursor = Starter.skmt.ExecQuery($"SELECT * FROM CONTADOS WHERE CLIENTE = '${idCliente}' "$) + If CONTADOS.RowCount > 0 Then + For kjsdghf = 0 To CONTADOS.RowCount -1 + CONTADOS.Position = kjsdghf + + Dim LETRA2 As String + If CONTADOS.GetString("METODO_PAGO") = "EFECTIVO" Then + LETRA2 = "E" + Else If CONTADOS.GetString("METODO_PAGO") = "TRANSFERENCIA" Then + LETRA2 = "T" + Else If CONTADOS.GetString("METODO_PAGO") = "CHEQUE" Then + LETRA2 = "C" + End If + Printer1.Justify = 2 + Printer1.WriteString( NumberFormat2(CONTADOS.GetString("MONTO").Replace(",",""),0,2,2,True)&"-" &LETRA2) + Printer1.WriteString( CRLF) + Next + Printer1.WriteString( CRLF) + End If + TAMANO = 0 + ESPACIO = 29 + BLANCO = " " + Printer1.Justify = 0 + vc.Close + Next + End If + + Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString( CRLF) + + Dim abonoscreditosefe As Cursor = Starter.skmt.ExecQuery("SELECT SUM(IFNULL(a_abono,0)) AS ABONO FROM ABONOS WHERE TIPO_PAGO = 'EFECTIVO' ORDER BY a_cliente") + abonoscreditosefe.Position = 0 + Dim abonoscreditostrans As Cursor = Starter.skmt.ExecQuery("SELECT SUM(IFNULL(a_abono,0)) AS ABONO FROM ABONOS WHERE TIPO_PAGO = 'TRANSFERENCIA' ORDER BY a_cliente") + abonoscreditostrans.Position = 0 + Dim abonoscreditosche As Cursor = Starter.skmt.ExecQuery("SELECT SUM(IFNULL(a_abono,0)) AS ABONO FROM ABONOS WHERE TIPO_PAGO = 'CHEQUE' ORDER BY a_cliente") + abonoscreditosche.Position = 0 + Log(NumberFormat2(abonoscreditosefe.GetDouble("ABONO"),0,2,2,False) ) + + Dim CONTADOSEFECTIVO As Cursor = Starter.skmt.ExecQuery("SELECT SUM(IFNULL(MONTO,0)) AS MONTO FROM CONTADOS WHERE METODO_PAGO = 'EFECTIVO' ") + CONTADOSEFECTIVO.Position = 0 + Dim CONTADOTRANSFERENCIA As Cursor = Starter.skmt.ExecQuery("SELECT SUM(IFNULL(MONTO,0)) AS MONTO FROM CONTADOS WHERE METODO_PAGO = 'TRANSFERENCIA' ") + CONTADOTRANSFERENCIA.Position = 0 + Dim CONTADOCHEQUE As Cursor = Starter.skmt.ExecQuery("SELECT SUM(IFNULL(MONTO,0)) AS MONTO FROM CONTADOS WHERE METODO_PAGO = 'CHEQUE'") + CONTADOCHEQUE.Position = 0 + + Printer1.WriteString("Monto efectivo: $" & NumberFormat2((l_montoaliquidar.Text - abonoscreditosche.GetDouble("ABONO") - abonoscreditostrans.GetDouble("ABONO") - CONTADOTRANSFERENCIA.GetDouble("MONTO") - CONTADOCHEQUE.GetDouble("MONTO")),0,2,2,True) & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("Monto cheque: $" & NumberFormat2((abonoscreditosche.GetDouble("ABONO") + CONTADOCHEQUE.GetDouble("MONTO")),0,2,2,True) & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("Monto transferencia: $" & NumberFormat2((abonoscreditostrans.GetDouble("ABONO") + CONTADOTRANSFERENCIA.GetDouble("MONTO")),0,2,2,True) & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("Monto a liquidar: $" & NumberFormat2(l_montoaliquidar.Text,0,2,2,True) & CRLF) + + + c.Close + + +' Dim sumainv As Cursor = Starter.skmt.ExecQuery("SELECT SUM(HVD_CANT) AS CANTIDAD FROM HIST_VENTAS WHERE HVD_CODPROMO <> HVD_PROID") +' sumainv.Position = 0 +' +' Printer1.WriteString("------------------------------" & CRLF) +' Printer1.WriteString("Total piezas: " & sumainv.GetString("CANTIDAD")& CRLF) + Printer1.WriteString("------------------------------" & CRLF) + Printer1.Justify = 0 + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Printer1.WriteString(" " & CRLF) + Sleep(1000) + Printer1.DisConnect + ProgressDialogHide + + + Msgbox2Async("Deseas imprimir de nuevo el ticket?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + imp_LIQUIDACION + Else + + End If +End Sub + +Private Sub connecta_LongClick + +' 'PAGARES. +' Dim pa As Cursor =Starter.skmt.ExecQuery("select PA_ALMACEN,PA_RUTA_REP,PA_RUTAPREV,PA_FECHA_PREV,PA_CAPTURA,PA_MONTO,PA_USUARIO,PA_CLIENTE,IFNULL(PA_CANCELADO,0) AS PA_CANCELADO from PAGARES") +' If pa.RowCount > 0 Then +' For pag = 0 To pa.RowCount - 1 +' pa.Position = pag +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "insert_reparto_PAGARES_GUNA_VN" +' Dim fechaenvio() As String +' fechaenvio = Regex.Split(" ",pa.GetString("PA_FECHA_PREV")) +'' Log(fechaenvio(0)) +' Dim fechaenvio1() As String +' fechaenvio1 = Regex.Split("/",fechaenvio(0)) +' Dim fechaano As String = fechaenvio1(2).SubString(2) +' Dim fechareal As String = fechaenvio1(0)&"/"&fechaenvio1(1)&"/"&fechaano +'' Log(fechareal) +' Dim fechacap() As String +' fechacap = Regex.Split("/",pa.GetString("PA_CAPTURA")) +' Dim fechacapano As String = fechacap(2).SubString(2) +'' Dim mes As Int = DateTime.GetMonth(DateTime.Now) +' If DateTime.GetMonth(DateTime.Now) = fechacap(1) Then +' Dim fechacapreal As String = fechacap(0)&"/"&fechacap(1)&"/"&fechacapano +' Else +' Dim fechacapreal As String = fechacap(1)&"/"&fechacap(0)&"/"&fechacapano +' End If +' If pa.GetString("PA_CANCELADO") = "2" Then +' cmd.Parameters = Array As Object(pa.GetString("PA_CLIENTE"),NumberFormat2(pa.GetString("PA_MONTO"),0,2,2,False),fechacapreal,pa.GetString("PA_ALMACEN"),pa.GetString("PA_RUTAPREV"),Subs.traeRutaReparto,fechareal,pa.GetString("PA_USUARIO"),2) +' Else +' cmd.Parameters = Array As Object(pa.GetString("PA_CLIENTE"),pa.GetString("PA_MONTO"),fechacapreal,pa.GetString("PA_ALMACEN"),pa.GetString("PA_RUTAPREV"),Subs.traeRutaReparto,fechareal,pa.GetString("PA_USUARIO"),"") +' End If +' reqManager.ExecuteCommand(cmd , "ins_pagares") +' Next +' End If +' pa.Close + + If e_ruta.Text = "KMTS1BAT" Then + imp_LIQUIDACION + End If + + +End Sub + +Private Sub B_OK_ENVIO_Click + If l_envio.Text = "INFO OK" Then + imp_LIQUIDACION + P_ENVIO.Visible = False + Else + P_ENVIO.Visible = False + MsgboxAsync("Favor de mandar la informacion de nuevo","Atención") + End If + +End Sub + +Private Sub P_ENVIO_Click + +End Sub + +Sub tenvio_tick + tenvio.Enabled = False + If cuantosenvio = recibidos Then + l_envio.Text = "INFO OK" + pgb_envio.Progress = 100 + Else + l_envio.Text = "INFO INCOMPLETA" + pgb_envio.Progress = 50 + End If +End Sub \ No newline at end of file diff --git a/B4A/C_Productos.bas b/B4A/C_Productos.bas new file mode 100644 index 0000000..b769872 --- /dev/null +++ b/B4A/C_Productos.bas @@ -0,0 +1,1108 @@ +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 + Dim g As GPS + Dim clie_id As String + Dim sDate,sTime As String + Dim usuario As String + Dim c As Cursor +' Dim ruta As String + Dim b_regresar As Button + Dim ListView1 As ListView + Dim L_CANT As Label + Dim L_TOTAL As Label + Dim b_borra As Button + Dim Existe As String + Dim result As String + ' Dim lat_gps, lon_gps As String + Dim cuantos As String + Dim nombre_prod As String + Dim cuantos_pedido As String + Private Titulo As Label + Private P1 As Panel + Private lv2 As ListView + Private p_principal As Panel + Dim clv_pedido As CustomListView + Private p_prods As Panel + Private l_prodX As Label + Private l_pCant As Label + Private et_pCant As EditText + Dim bmp As Bitmap + Dim etCantHasFocus As Boolean = False + Dim totalProds As Int = 0 + Dim totalCompra As Int = 0 + Dim prodsMap As Map + Dim reconstruirPedido As Boolean = False + Dim promoABorrar As String + Private b_guardar As Button + Private b_prodMas As Button + Private b_prodMenos As Button + Private b_prodMenosC As Button + Private l_pCantC As Label + Private et_pCantC As EditText + Private b_prodMasC As Button + Private p_botMasMenC As Panel + Private p_botMasMen As Panel + Private b_revversar As Button + Private Label2 As Label + Private Label3 As Label + Private l_piezas As Label + Private l_cajas As Label + + Private l_cajas As Label + Private l_piezas As Label +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + B4XPages.SetTitle(Me, "Productos") + 'load the layout to Root + g.Initialize("GPS") + Root.LoadLayout("detalleVenta") + b_borra.Visible = False + Titulo.Text = "Pedido" +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub B4XPage_Appear + Label2.Visible = False + Label3.Visible = False + L_TOTAL.Visible = False + L_CANT.Visible = False + b_revversar.Visible = False + Subs.centraPanel(p_principal, Root.Width) +' b_guardar.Visible = False + +' Titulo.Left = Round(p_principal.Width/2)-(Titulo.Width/2) + L_CANT.Text ="" + L_TOTAL.Text="" + c=Starter.skmt.ExecQuery("select count(*) as EXISTE from HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ") + C.Position=0 + Existe = C.GetString("EXISTE") + C.Close +' c=Starter.skmt.ExecQuery("select distinct hist_ventas.hvd_num_registro, HIST_VENTAS.HVD_CLIENTE, HIST_VENTAS.HVD_PRONOMBRE, HIST_VENTAS.HVD_PROID, HIST_VENTAS.HVD_CANT, HIST_VENTAS2.HVD_CANT as HVD_CANT2, HIST_VENTAS.HVD_COSTO_TOT, HIST_VENTAS.HVD_CODPROMO from HIST_VENTAS inner join HIST_VENTAS2 on HIST_VENTAS.HVD_PROID = HIST_VENTAS2.HVD_PROID and HIST_VENTAS.HVD_CLIENTE = HIST_VENTAS2.HVD_CLIENTE WHERE HIST_VENTAS.HVD_CLIENTE IN (Select CUENTA from cuentaa) and HIST_VENTAS.HVD_RECHAZO = 0 order by HIST_VENTAS.HVD_CODPROMO desc, HIST_VENTAS.HVD_PRONOMBRE asc") + + + c=Starter.skmt.ExecQuery("select * from HIST_VENTAS WHERE hvd_rechazo <> 2 and HVD_RECHAZOCANT > 0 order by HVD_CODPROMO desc, HVD_PRONOMBRE asc") +' Private c2 As Cursor=Starter.skmt.ExecQuery("select from PEDIDO WHERE PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + + ListView1.Clear + clv_pedido.Clear + Subs.SetDivider(ListView1, Colors.LightGray, 2) + clv_pedido.GetBase.SetLayoutAnimated(100, 0dip, 60dip, Root.Width - 50, Root.Height * 0.62) 'Cambiamos el tamaño y posición de la lista de productos + clv_pedido.Base_Resize(clv_pedido.GetBase.Width, clv_pedido.GetBase.Height) 'Cambiamos el tamaño del panel interno de la lista para que ajuste al nuevo tamaño. +' Log("RC1:"&c.RowCount) + If c.RowCount>0 Then +' Log("Usamos HV") + + For i=0 To c.RowCount -1 + c.Position=i +' Log(c.GetString("HVD_PROID")) + If c.GetString("BCAJAS") = "0" Then +' Log("AQUI1") +' If c.GetString("HVD_CANT") <> c.GetString("HVD_RECHAZOCANT") Then +' 'Traemos cantidad de hvd2 +' Private oc As Cursor = Starter.skmt.ExecQuery($"select HVD_CANT from HIST_VENTAS2 WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) and hvd_proid = '${c.GetString("HVD_PROID")}' and HVD_NUM_REGISTRO = '${c.GetString("HVD_NUM_REGISTRO")}'"$) +' Private cant2 As Int = 0 +' If oc.RowCount > 0 Then +' oc.Position = 0 +' cant2 = oc.GetString("HVD_CANT") +' End If +' oc.Close + Dim label1 As Label + label1 = ListView1.TwoLinesLayout.Label + label1.TextSize = 12 + label1.TextColor = Colors.black + Dim Label2 As Label + Label2 = ListView1.TwoLinesLayout.SecondLabel + Label2.TextSize = 12 + Label2.TextColor = Colors.black + Private bgColor, textColor As Int + bgColor = Colors.RGB(177, 200, 249)'azul + textColor = Colors.black + If c.GetString("HVD_CODPROMO") <> Subs.traeAlmacen Then +' bgColor = Colors.RGB(255, 212, 163) 'naranja + bgColor = Colors.White + End If +' Log($"Agregamos prod a lista1 | ${c.GetString("HVD_CANT")} - ${c.GetString("HVD_CANT2")}"$) 'HVD_CANT2 es la original de la orden. +' ListView1.AddTwoLines(c.GetString("HVD_PRONOMBRE"),"Cantidad #"& c.GetString("HVD_CANT")& " SubTotal $"& c.GetString("HVD_COSTO_TOT")) + + 'aqui selecciono lo que esta en pedido del cliente actual + Private c2 As Cursor=Starter.skmt.ExecQuery($"select IFNULL(PE_CANT,0) AS PE_CANT, CONSECUTIVO, PE_BCAJAS from PEDIDO WHERE PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND PE_PROID ='${c.GetString("HVD_PROID")}' AND CONSECUTIVO = '${c.GetString("CONSECUTIVO")}'"$) + + 'aqui veo cuanto se ha vendido del rechazo del cliente original en el hist_ventas + Private d5 As Cursor = Starter.skmt.ExecQuery($"SELECT IFNULL(Sum(PE_CANT),0) AS PE_CANT FROM PEDIDO WHERE PE_CLIENTEOR = '${c.GetString("HVD_CLIENTE")}' AND PE_PROID = '${c.GetString("HVD_PROID")}' AND CONSECUTIVO = '${c.GetString("CONSECUTIVO")}'"$) + d5.Position = 0 + Private restacant As String = d5.GetString("PE_CANT") + d5.Close + + If (c.GetString("HVD_RECHAZOCANT")-restacant) <> "0" Then + If c2.RowCount > 0 Then + c2.Position = 0 + + Private c3 As Cursor=Starter.skmt.ExecQuery($"select Ifnull(sum(PE_CANT),0) AS PE_CANT from PEDIDO WHERE PE_CLIENTE NOT IN (SELECT CUENTA FROM CUENTAA) AND PE_CLIENTEOR = '${c.GetString("HVD_CLIENTE")}' AND PE_PROID ='${c.GetString("HVD_PROID")}' AND CONSECUTIVO = '${c.GetString("CONSECUTIVO")}'"$) + Private resta As String = 0 + + If c3.RowCount > 0 Then +' For i = 0 To c3.RowCount - 1 + c3.Position = 0 + resta = c3.GetString("PE_CANT") +' Next + Else + resta = 0 + End If + + Dim preciocat As Cursor = Starter.skmt.ExecQuery($"select IFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD WHERE CAT_GP_ID = '${c.GetString("HVD_PROID")}'"$) + If preciocat.RowCount > 0 Then + preciocat.Position = 0 + Dim preciofull As String = preciocat.GetString("CAT_GP_PRECIO") + End If + preciocat.Close + Log(c.GetString("HVD_CODPROMO")) + Log(Subs.traeAlmacen) + + + If c.GetString("HVD_CODPROMO") = Subs.traeAlmacen Then + clv_pedido.Add(CreateListItem(c.GetString("HVD_PRONOMBRE"), Subs.traePrecio2(c.GetString("HVD_PROID"), c.GetString("HVD_CODPROMO"),c.GetString("CONSECUTIVO")), c2.GetString("PE_CANT"), c.GetString("HVD_RECHAZOCANT")-c2.GetString("PE_CANT") -resta, clv_pedido.AsView.Width, 118dip, bmp, c.GetString("HVD_PROID"), bgColor, textColor, c.GetString("HVD_CODPROMO"),c.GetString("HVD_CLIENTE"),c.GetString("CONSECUTIVO")),i) + Else + Log("aqui arriba") + clv_pedido.Add(CreateListItem(c.GetString("HVD_PRONOMBRE"), preciofull, c2.GetString("PE_CANT"), c.GetString("HVD_RECHAZOCANT")-c2.GetString("PE_CANT") -resta, clv_pedido.AsView.Width, 118dip, bmp, c.GetString("HVD_PROID"), bgColor, textColor, c.GetString("HVD_CODPROMO"),c.GetString("HVD_CLIENTE"),c.GetString("CONSECUTIVO")),i) + End If +' clv_pedido.Add(CreateListItem(c.GetString("HVD_PRONOMBRE"), Subs.traePrecio2(c.GetString("HVD_PROID"), c.GetString("HVD_CODPROMO"),c.GetString("CONSECUTIVO")), c2.GetString("PE_CANT"), c.GetString("HVD_RECHAZOCANT")-c2.GetString("PE_CANT") -resta, clv_pedido.AsView.Width, 118dip, bmp, c.GetString("HVD_PROID"), bgColor, textColor, c.GetString("HVD_CODPROMO"),c.GetString("HVD_CLIENTE"),c.GetString("CONSECUTIVO")),i) +' Log("ENTRE A PEDIDO") + Else iF c2.RowCount = 0 Then + Private c3 As Cursor=Starter.skmt.ExecQuery($"select Ifnull(sum(PE_CANT),0) AS PE_CANT from PEDIDO WHERE PE_CLIENTE NOT IN (SELECT CUENTA FROM CUENTAA) AND PE_CLIENTEOR = '${c.GetString("HVD_CLIENTE")}' AND PE_PROID ='${c.GetString("HVD_PROID")}' AND CONSECUTIVO = '${c.GetString("CONSECUTIVO")}'"$) + Private resta As String = 0 + + If c3.RowCount > 0 Then +' For i = 0 To c3.RowCount - 1 + c3.Position = 0 + resta = c3.GetString("PE_CANT") +' Next + Else + resta = 0 + + End If + + Dim preciocat As Cursor = Starter.skmt.ExecQuery($"select IFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD WHERE CAT_GP_ID = '${c.GetString("HVD_PROID")}'"$) + If preciocat.RowCount > 0 Then + preciocat.Position = 0 + Dim preciofull As String = preciocat.GetString("CAT_GP_PRECIO") + End If + preciocat.Close + Log(c.GetString("HVD_CODPROMO")) + Log(Subs.traeAlmacen) + + If c.GetString("HVD_CODPROMO") = Subs.traeAlmacen Then + clv_pedido.Add(CreateListItem(c.GetString("HVD_PRONOMBRE"), Subs.traePrecio2(c.GetString("HVD_PROID"), c.GetString("HVD_CODPROMO"),c.GetString("CONSECUTIVO")), 0, c.GetString("HVD_RECHAZOCANT") -resta, clv_pedido.AsView.Width, 118dip, bmp, c.GetString("HVD_PROID"), bgColor, textColor, c.GetString("HVD_CODPROMO"),c.GetString("HVD_CLIENTE"),c.GetString("CONSECUTIVO")),i) + Else + Log("aqui abajo") + clv_pedido.Add(CreateListItem(c.GetString("HVD_PRONOMBRE"), preciofull, 0, c.GetString("HVD_RECHAZOCANT") -resta, clv_pedido.AsView.Width, 118dip, bmp, c.GetString("HVD_PROID"), bgColor, textColor, c.GetString("HVD_CODPROMO"),c.GetString("HVD_CLIENTE"),c.GetString("CONSECUTIVO")),i) + + End If +' clv_pedido.Add(CreateListItem(c.GetString("HVD_PRONOMBRE"), Subs.traePrecio2(c.GetString("HVD_PROID"), c.GetString("HVD_CODPROMO"),c.GetString("CONSECUTIVO")), 0, c.GetString("HVD_RECHAZOCANT") -resta, clv_pedido.AsView.Width, 118dip, bmp, c.GetString("HVD_PROID"), bgColor, textColor, c.GetString("HVD_CODPROMO"),c.GetString("HVD_CLIENTE"),c.GetString("CONSECUTIVO")),i) +' Log("ENTRE A HIST") + End If + End If + c2.Close +' Log(c.GetString("HVD_CODPROMO")) +' End If + Else If c.GetString("BCAJAS") = "1" Then + Log("AQUI1") +' If c.GetString("HVD_CANT") <> c.GetString("HVD_RECHAZOCANT") Then + 'Traemos cantidad de hvd2 + Private oc As Cursor = Starter.skmt.ExecQuery($"select HVD_CANT from HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) and hvd_proid = '${c.GetString("HVD_PROID")}' and HVD_NUM_REGISTRO = '${c.GetString("HVD_NUM_REGISTRO")}'"$) + Private cant2 As Int = 0 + If oc.RowCount > 0 Then + oc.Position = 0 + cant2 = oc.GetString("HVD_CANT") + End If + oc.Close + Dim label1 As Label + label1 = ListView1.TwoLinesLayout.Label + label1.TextSize = 12 + label1.TextColor = Colors.black + Dim Label2 As Label + Label2 = ListView1.TwoLinesLayout.SecondLabel + Label2.TextSize = 12 + Label2.TextColor = Colors.black + Private bgColor, textColor As Int + bgColor = Colors.RGB(177, 200, 249)'azul + textColor = Colors.black + If c.GetString("HVD_CODPROMO") <> Subs.traeAlmacen Then +' bgColor = Colors.RGB(255, 212, 163) 'naranja + bgColor = Colors.White + End If +' Log($"Agregamos prod a lista1 | ${c.GetString("HVD_CANT")} - ${c.GetString("HVD_CANT2")}"$) 'HVD_CANT2 es la original de la orden. +' ListView1.AddTwoLines(c.GetString("HVD_PRONOMBRE"),"Cantidad #"& c.GetString("HVD_CANT")& " SubTotal $"& c.GetString("HVD_COSTO_TOT")) + + Private c2 As Cursor=Starter.skmt.ExecQuery($"select * from PEDIDO WHERE PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA)"$) + + Private d5 As Cursor = Starter.skmt.ExecQuery($"SELECT IFNULL(Sum(PE_CANT),0) AS PE_CANT FROM PEDIDO WHERE PE_CLIENTEOR = '${c.GetString("HVD_CLIENTE")}' AND PE_PROID = '${c.GetString("HVD_PROID")}' AND CONSECUTIVO = '${c.GetString("CONSECUTIVO")}'"$) + d5.Position = 0 + Private restacant As String = d5.GetString("PE_CANT") + d5.Close + + If (c.GetString("HVD_RECHAZOCANT")-restacant) <> "0" Then + If c2.RowCount > 0 Then + c2.Position = 0 + Log("SI ENTRO A PONER CAJAS BIEN ") + Log(c2.GetString("PE_CAJAS")) + Private c3 As Cursor=Starter.skmt.ExecQuery($"select Ifnull(sum(PE_CANT),0) AS PE_CANT from PEDIDO WHERE PE_CLIENTE NOT IN (SELECT CUENTA FROM CUENTAA) AND PE_CLIENTEOR = '${c.GetString("HVD_CLIENTE")}' AND PE_PROID ='${c.GetString("HVD_PROID")}' AND CONSECUTIVO = '${c.GetString("CONSECUTIVO")}'"$) + Private resta As String = 0 + + If c3.RowCount > 0 Then +' For i = 0 To c3.RowCount - 1 + c3.Position = 0 + resta = c3.GetString("PE_CANT") +' Next + Else + resta = 0 + End If + Private puc As String = c.GetString("HVD_COSTO_TOT")/c.GetString("CANTC") + LogColor((restacant/Subs.traeConversion(c.GetString("HVD_PROID"))),Colors.Green) + clv_pedido.Add(CreateListItem2(c.GetString("HVD_PRONOMBRE"), puc, (restacant/Subs.traeConversion(c.GetString("HVD_PROID"))), ((c.GetString("HVD_RECHAZOCANT")- restacant-resta)/Subs.traeConversion(c.GetString("HVD_PROID"))), clv_pedido.AsView.Width, 118dip, bmp, c.GetString("HVD_PROID"), bgColor, textColor, c.GetString("HVD_CODPROMO"),c.GetString("HVD_CLIENTE"),c.GetString("CONSECUTIVO")),i) + Else + Log("NO ENTRO A PONER CAJAS BIEN ") + Private c3 As Cursor=Starter.skmt.ExecQuery($"select Ifnull(sum(PE_CANT),0) AS PE_CANT from PEDIDO WHERE PE_CLIENTE NOT IN (SELECT CUENTA FROM CUENTAA) AND PE_CLIENTEOR = '${c.GetString("HVD_CLIENTE")}' AND PE_PROID ='${c.GetString("HVD_PROID")}' AND CONSECUTIVO = '${c.GetString("CONSECUTIVO")}'"$) + Private resta As String = 0 + + If c3.RowCount > 0 Then +' For i = 0 To c3.RowCount - 1 + c3.Position = 0 + resta = c3.GetString("PE_CANT") +' Next + Else + resta = 0 + End If + LogColor(resta,Colors.Green) + Private puc As String = c.GetString("HVD_COSTO_TOT")/c.GetString("CANTC") +' clv_pedido.Add(CreateListItem(c.GetString("HVD_PRONOMBRE"), Subs.traePrecio(c.GetString("HVD_PROID"), c.GetString("HVD_CODPROMO")), 0, c.GetString("HVD_RECHAZOCANT") , clv_pedido.AsView.Width, 118dip, bmp, c.GetString("HVD_PROID"), bgColor, textColor, c.GetString("HVD_CODPROMO"),c.GetString("HVD_CLIENTE")),i) + clv_pedido.Add(CreateListItem2(c.GetString("HVD_PRONOMBRE"), puc, 0, ((c.GetString("HVD_RECHAZOCANT")-resta)/Subs.traeConversion(c.GetString("HVD_PROID"))), clv_pedido.AsView.Width, 118dip, bmp, c.GetString("HVD_PROID"), bgColor, textColor, c.GetString("HVD_CODPROMO"),c.GetString("HVD_CLIENTE"),c.GetString("CONSECUTIVO")),i) + End If + End If + c2.Close +' End If + End If + Next + +' cuentaProds("") + End If + +' Private vc As Cursor = Starter.skmt.ExecQuery($"select HVD_PROID, HVD_CANT, IFNULL(HVD_RECHAZOCANT, 0) AS HVD_RECHAZOCANT, CAT_GP_PRECIO from HIST_VENTAS LEFT JOIN CAT_GUNAPROD ON CAT_GP_ID = HVD_PROID where BCAJAS = 0 and HVD_CODPROMO ='${Subs.traealmacen}' and HVD_CLIENTE in (select cuenta from cuentaa)"$) +' +' Private Cuenta As String = 0 +' Private arti As String = 0 +' If vc.RowCount > 0 Then +' For i = 0 To vc.RowCount - 1 +' vc.Position = i +'' Log(vc.GetString("HVD_CANT")&","&vc.GetString("HVD_RECHAZOCANT")) +' arti = arti + (vc.GetString("HVD_CANT") - vc.GetString("HVD_RECHAZOCANT")) +' Cuenta = Cuenta + ((vc.GetString("HVD_CANT") - vc.GetString("HVD_RECHAZOCANT"))*vc.GetString("CAT_GP_PRECIO")) +' Next +' End If +'' Log(Cuenta) +' +' Private vc2 As Cursor = Starter.skmt.ExecQuery("select HVD_PROID, HVD_CANT, IFNULL(HVD_RECHAZOCANT, 0) AS HVD_RECHAZOCANT, CANTC,HVD_COSTO_TOT from HIST_VENTAS where HVD_CLIENTE in (select cuenta from cuentaa) AND BCAJAS = 1") +' Private Cuenta1 As String = 0 +' Private arti1 As String = 0 +' If vc2.RowCount > 0 Then +' For i = 0 To vc2.RowCount - 1 +' vc2.Position = i +' Dim preu As Float = NumberFormat2(vc2.GetString("HVD_COSTO_TOT")/vc2.GetString("CANTC"),0,2,2,False) +' Private vc3 As Cursor = Starter.skmt.ExecQuery($"select PRECIOCONVER, CONVERSION from CAT_GUNAPROD where CAT_GP_ID = '${vc2.GetString("HVD_PROID")}'"$) +' If vc3.RowCount > 0 Then +' vc3.Position = 0 +' Cuenta1 = Cuenta1 + ((vc2.GetString("CANTC")-(vc2.GetString("HVD_RECHAZOCANT")/vc3.GetString("CONVERSION")))*preu) +' arti1 = arti1 + (vc2.GetString("HVD_CANT") - vc2.GetString("HVD_RECHAZOCANT")) +' End If +' Next +' End If +'' Log(Cuenta1) +' +' Private vc4 As Cursor = Starter.skmt.ExecQuery($"select HVD_PROID, HVD_CANT, IFNULL(HVD_RECHAZOCANT, 0) AS HVD_RECHAZOCANT, CANTC,HVD_COSTO_TOT, HVD_RECHAZO, HVD_CODPROMO from HIST_VENTAS where HVD_CLIENTE in (select cuenta from cuentaa) AND BCAJAS = 0 and HVD_CODPROMO <> '${Subs.traeAlmacen}'"$) +' Private Cuenta2 As String = 0 +' Private arti2 As String = 0 +' If vc4.RowCount > 0 Then +' +' For i = 0 To vc4.RowCount - 1 +' vc4.Position = i +' If vc4.GetString("HVD_PROID") <> vc4.GetString("HVD_CODPROMO") Then +' If vc4.GetString("HVD_RECHAZO") = 0 Then +' Cuenta2 = vc4.GetString("HVD_COSTO_TOT") +' arti2 = vc4.GetString("HVD_CANT") +' Else +' Private vc5 As Cursor = Starter.skmt.ExecQuery($"select CAT_GP_PRECIO from CAT_GUNAPROD where CAT_GP_ID = '${vc4.GetString("HVD_PROID")}'"$) +' If vc5.RowCount > 0 Then +' vc5.Position= 0 +'' Log(vc5.GetString("CAT_GP_PRECIO")) +' Cuenta2 = Cuenta2 +((vc4.GetString("HVD_CANT")- vc4.GetString("HVD_RECHAZOCANT"))*vc5.GetString("CAT_GP_PRECIO")) +' arti2 = arti2 +(vc4.GetString("HVD_CANT")- vc4.GetString("HVD_RECHAZOCANT")) +' End If +' End If +' End If +' +' Next +' End If +'' Log(Cuenta) +' +' L_TOTAL.Text = Cuenta + Cuenta1 + Cuenta2 +' L_CANT.Text = arti + arti1 +arti2 + + +End Sub + +Sub GPS_LocationChanged (Location1 As Location) +' lat_gps=Location1.ConvertToSeconds(Location1.Latitude) +' lon_gps=Location1.ConvertToSeconds(Location1.Longitude) +End Sub + +Sub b_regresar_Click + B4XPages.ShowPage("Cliente") +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub + ' BACK key pressed + ' I want to capture the key here so I return True + B4XPages.ShowPage("Cliente") + ' Returning False signals the system to handle the key + Return False +End Sub + +Sub ListView1_ItemLongClick (Position As Int, Value As Object) 'BORRAR +' nombre_prod = Value +' result = Msgbox2("Seguro que desa borrar este articulo?","Borrar Articulo", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore +' If result = DialogResponse.POSITIVE Then +' c=Starter.skmt.ExecQuery2("select HVD_CANT FROM hist_ventas where HVD_pronombre = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As String(Value)) +' c.Position=0 +' If c.GetString("HVD_CANT") > 1 Then +' b_regresar.Visible =False +' b_borra.Visible=False +' P1.Visible =True +' cuantos_pedido = c.GetString("HVD_CANT") +' lv2.Clear +' lv2.SingleLineLayout.Label.TextColor = Colors.Black +' For i=1 To c.GetString("HVD_CANT") +' lv2.AddSingleLine(i) +' Next +' Else +' ' skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(c.GetString("HVD_CANT"),Value)) +' c.Close +' Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT,REP_FECHA, REP_CLI_ORIG) select HVD_CLIENTE, HVD_PRONOMBRE, HVD_CANT, HVD_COSTO_TOT, HVD_FECHA, HVD_CLIENTE from hist_ventas where HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) +' c=Starter.skmt.ExecQuery2("select HVD_CANT FROM hist_ventas where HVD_pronombre = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As String(Value)) +' c.Position=0 +' Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(c.GetString("HVD_CANT"),Value)) +' c.Close +' +' 'skmt.ExecNonQuery2("delete FROM HIST_VENTAS WHERE HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) +' ' se cambia por update para no borrarlo y tener todos los registros. +' Starter.skmt.ExecNonQuery2("update HIST_VENTAS set HVD_RECHAZO = 1 WHERE HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) + ' +' DateTime.DateFormat = "MM/dd/yyyy" +' sDate=DateTime.Date(DateTime.Now) +' sTime=DateTime.Time(DateTime.Now) +' c=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") +' c.Position=0 +' clie_id = c.GetString("CUENTA") +' c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") +' c.Position=0 +' usuario = c.GetString("USUARIO") +' 'quitar esta mamada no es ahi +' Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 3 where CAT_CL_CODIGO In (select cuenta from cuentaa)") +' B4XPage_Appear +' End If +' +' End If +End Sub + +Sub lv2_ItemClick (Position As Int, Value As Object) 'BORRAR +' ' If Value = "Todos" Then +' ' cuantos = c.GetString("HVD_CANT") +' 'Else +' cuantos = Value +' ' End If +' If cuantos = cuantos_pedido Then +' 'Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(c.GetString("HVD_CANT"),nombre_prod)) +' c.Close +' Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT, REP_FECHA, REP_CLI_ORIG) select HVD_CLIENTE, HVD_PRONOMBRE, HVD_CANT, HVD_COSTO_TOT, HVD_FECHA, HVD_CLIENTE from hist_ventas where HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(nombre_prod)) +' c=Starter.skmt.ExecQuery2("select HVD_CANT FROM hist_ventas where HVD_pronombre = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As String(nombre_prod)) +' c.Position=0 +' Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(c.GetString("HVD_CANT"),nombre_prod)) +' c.Close +' 'Starter.skmt.ExecNonQuery2("delete FROM HIST_VENTAS WHERE HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) +' ' se cambia por update para no borrarlo y tener todos los registros. +' Starter.skmt.ExecNonQuery2("update HIST_VENTAS set HVD_RECHAZO = 1 WHERE HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As String(Value)) +' DateTime.DateFormat = "MM/dd/yyyy" +' sDate=DateTime.Date(DateTime.Now) +' sTime=DateTime.Time(DateTime.Now) +' c=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") +' c.Position=0 +' clie_id = c.GetString("CUENTA") +' c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") +' c.Position=0 +' usuario = c.GetString("USUARIO") +' 'quitar esta m*m*d* no es ahi +' Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 3 where CAT_CL_CODIGO In (select cuenta from cuentaa)") +' Starter.skmt.ExecNonQuery2("update hist_Ventas set HVD_RECHAZO = 1, HVD_PARCIAL = 0, HVD_CANT = HVD_CANT - ? where HVD_pronombre = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As Object(cuantos, nombre_prod)) +' b_regresar.Visible =True +' b_borra.Visible=True +' P1.Visible =False +' B4XPage_Appear +' Else +' ' skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(cuantos,nombre_prod)) +' c.Close + ' +' 'modificar tambien esto +' 'Modificaciones para que solo quite una parte. +' Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT, REP_FECHA, REP_CLI_ORIG) select HVD_CLIENTE, HVD_PRONOMBRE, ?, ? * (HVD_COSTO_TOT/?), HVD_FECHA, HVD_CLIENTE from hist_ventas where HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As Object(cuantos,cuantos,cuantos_pedido, nombre_prod)) +' Starter.skmt.ExecNonQuery2("insert into hist_ventas(HVD_CLIENTE,HVD_PRONOMBRE,HVD_CANT,HVD_COSTO_TOT, HVD_FECHA, HVD_CODPROMO, HVD_PROID,HVD_NUM_TICKET, HVD_NUM_REGISTRO, HVD_RECHAZO, HVD_ESTATUS, HVD_PARCIAL) select HVD_CLIENTE,HVD_PRONOMBRE,?,HVD_COSTO_TOT, HVD_FECHA, HVD_CODPROMO, HVD_PROID,HVD_NUM_TICKET, HVD_NUM_REGISTRO, 1, HVD_ESTATUS, 1 from hist_ventas where HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As Object(cuantos, nombre_prod)) +' Starter.skmt.ExecNonQuery2("update hist_Ventas set HVD_RECHAZO = 0, HVD_PARCIAL = 1, HVD_CANT = HVD_CANT - ? where HVD_pronombre = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As Object(cuantos, nombre_prod)) +' Starter.skmt.ExecNonQuery2("update hist_Ventas set HVD_COSTO_TOT = HVD_CANT * (HVD_COSTO_TOT/?) where HVD_pronombre = ? and HVD_cliente in (Select CUENTA from cuentaa) and HVD_RECHAZO = 0 ", Array As Object(cuantos_pedido, nombre_prod)) +' Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_nombre = ?", Array As Object(cuantos,nombre_prod)) +' 'crear nueva tabla para que guarde el resto. + '' skmt.ExecNonQuery2("delete FROM HIST_VENTAS WHERE HVD_PRONOMBRE = ? and HVD_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) +' DateTime.DateFormat = "MM/dd/yyyy" +' sDate=DateTime.Date(DateTime.Now) +' sTime=DateTime.Time(DateTime.Now) +' c=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") +' c.Position=0 +' clie_id = c.GetString("CUENTA") +' c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") +' c.Position=0 +' usuario = c.GetString("USUARIO") +' Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 3 where CAT_CL_CODIGO In (select cuenta from cuentaa)") +' B4XPage_Appear +' b_regresar.Visible =True +' b_borra.Visible=True +' P1.Visible =False +' End If +End Sub + +'**************************************************************************** +'***************** PARA EL MAS/MENOS ************************************* +'**************************************************************************** + +Sub CreateListItem(Text As String, precioU As String, inv As Int, inv2 As Int, Width As Int, Height As Int, img As Bitmap, prodId As String, bc As Int, tc As Int, promo As String, cliente_original As String,consecutivo As Int) As Panel + Dim p As B4XView = xui.CreatePanel("") + Private cs As CSBuilder + cs.Initialize + p.SetLayoutAnimated(0, 0, 0, Width, Height) + p.LoadLayout("prodItem2") + p_prods.Color = bc + l_prodX.TextColor = tc + precioU = $"$1.2{precioU}"$ + l_prodX.Text = Text&CRLF&"Cant: " & inv2 & " $" & precioU + If promo <> "1" And precioU = 0 Then + l_prodX.Text = cs.Color(Colors.RGB(123,0,0)).append(Text&CRLF&"Cant: " & inv2 & " $" & precioU).PopAll + End If + l_prodX.Tag = $"ID: ${prodId}${CRLF}${Text}${CRLF}Precio: $$1.2{precioU}${CRLF}Inv: ${inv} pzs"$ +' l_pCant.Text = 0 +' Log("PRECIO " & Round2(precioU,2)&"| INV "&inv&"| ID "&prodId&"| PROMO "&promo&"| INV2? "&inv2&"| CLIENTE OR NONONO YA NO VA Y UN ESPACIO POR FAVOR "&cliente_original) + l_pCant.Tag = Round2(precioU.Replace(",",""),2)&"|"&inv&"|"&prodId&"|"&promo&"|"&inv2&"|"&cliente_original&"|"&consecutivo + et_pCant.Tag = Round2(precioU.Replace(",",""),2)&"|"&inv&"|"&prodId&"|"&promo&"|"&inv2&"|"&cliente_original&"|"&consecutivo + p_prods.Tag = l_pCant.tag +' Log($"Ponemos la cant en ${inv}"$) + l_pCant.Text = inv +' et_pCant.Text = inv +' et_pCant.BringToFront + + l_pCant.BringToFront + et_pCant.SendToBack + p_botMasMenC.Visible = False + l_cajas.Visible = False +' i_prod.Bitmap = img + Return p +End Sub + +Sub CreateListItem2(Text As String, precioU As String, inv As Int, inv2 As Int, Width As Int, Height As Int, img As Bitmap, prodId As String, bc As Int, tc As Int, promo As String, cliente_original As String,consecutivo As Int) As Panel + Dim p As B4XView = xui.CreatePanel("") + Private cs As CSBuilder + cs.Initialize + p.SetLayoutAnimated(0, 0, 0, Width, Height) + p.LoadLayout("prodItem2") + p_prods.Color = bc + l_prodX.TextColor = tc + precioU = $"$1.2{precioU}"$ + l_prodX.Text = Text&CRLF&"Cant: " & inv2 & " $" & precioU + If promo <> "1" And precioU = 0 Then + l_prodX.Text = cs.Color(Colors.RGB(123,0,0)).append(Text&CRLF&"Cant: " & inv2 & " $" & precioU).PopAll + End If + + Log(inv&" inventario 1") + Log(inv2&" inventario 2") + l_prodX.Tag = $"ID: ${prodId}${CRLF}${Text}${CRLF}Precio: $$1.2{precioU}${CRLF}Inv: ${inv} pzs"$ +' l_pCant.Text = 0 + l_pCantC.Tag = Round2(precioU.Replace(",",""),2)&"|"&inv&"|"&prodId&"|"&promo&"|"&inv2&"|"&cliente_original&"|"&consecutivo + et_pCantC.Tag = Round2(precioU.Replace(",",""),2)&"|"&inv&"|"&prodId&"|"&promo&"|"&inv2&"|"&cliente_original&"|"&consecutivo + p_prods.Tag = l_pCantC.tag +' Log($"Ponemos la cant en ${inv}"$) + l_pCantC.Text = NumberFormat2(inv,0,0,0,False) +' et_pCant.Text = inv +' et_pCant.BringToFront + + l_pCantC.BringToFront + et_pCantC.SendToBack + p_botMasMen.Visible = False + l_piezas.Visible = False +' i_prod.Bitmap = img + Return p +End Sub + +Sub b_prodMenos_Click + etCantHasFocus = False + Log("etCantHasFocus=" & etCantHasFocus) + LogColor("b_prodMenos_Click", Colors.Magenta) + Dim index As Int = clv_pedido.GetItemFromView(Sender) + Dim pnl0 As B4XView = clv_pedido.GetPanel(index) + Dim pnl As B4XView = pnl0.GetView(0) + Dim laCant As B4XView = pnl.GetView(2).GetView(3) +' Log(pnl.GetView(2).GetView(0) & "|" & pnl.GetView(2).GetView(1) & "|" & pnl.GetView(2).GetView(2)) + Dim esteTag As List = Regex.Split("\|", laCant.Tag) + Log("LC_TEXT:"&laCant.Text&"|PROMO:"&esteTag.Get(3)&"|LC_TAG:"&laCant.Tag&"|ET:"&esteTag) + + Private minimoadesc As String + Dim minimos As Cursor = Starter.skmt.ExecQuery2("SELECT * FROM CAT_GUNAPROD3 WHERE CAT_GP_ID = ?", Array As String(esteTag.Get(2))) + If minimos.RowCount > 0 Then + minimos.Position = 0 + minimoadesc = minimos.GetString("CAT_DP_CANT_MIN_VENTA") + Else + minimoadesc = "1" + End If + minimos.Close + '*'${minimoadesc}') + minimoadesc = "1" + If laCant.Text > 0 Then +' If esteTag.Get(3) <> Subs.traeAlmacen Then 'Si es PROMO entonces ... +' Private c2 As Cursor =Starter.skmt.ExecQuery($"select HVD_RECHAZO FROM HIST_VENTAS WHERE HVD_PROID = '${esteTag.Get(2)}' AND HVD_CLIENTE IN (Select CUENTA from cuentaa)"$) +' c2.Position = 0 +' If c2.GetString("HVD_RECHAZO") = "0" Then +' +' +' Log("ES PROMO") +' result = Msgbox2("Si se modifica una promoción, la promoción se rompe y solo quedarán los productos sueltos, ¿seguro que desea continuar?","Modificar Promoción", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore +' If result = DialogResponse.POSITIVE Then 'Quitamos esta promo +' prodsMap.Remove(esteTag.Get(3)) +'' c=Starter.skmt.ExecQuery($"select HVD_CODPROMO FROM HIST_VENTAS WHERE HVD_CODPROMO = '${esteTag.Get(2)}' AND HVD_cliente IN (Select CUENTA from cuentaa)"$) +'' For i = 0 To c.RowCount -1 +'' c.Position = i +' LogColor(esteTag.Get(3),Colors.Blue) +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = HVD_RECHAZOCANT + 1 WHERE HVD_CODPROMO = '${esteTag.Get(3)}' and HVD_CLIENTE = '${esteTag.Get(5)}'"$) +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 2, HVD_RECHAZOCANT = HVD_RECHAZOCANT + 1 WHERE HVD_PROID = '${esteTag.Get(3)}' and HVD_CODPROMO = '${esteTag.Get(3)}' and HVD_CLIENTE in (Select CUENTA from cuentaa)"$) +'' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_CODPROMO = '${Subs.traeAlmacen}' WHERE HVD_cliente in (Select CUENTA from cuentaa) AND HVD_CODPROMO = '${esteTag.Get(3)}'"$) +'' Next +' c.Close +' LogColor(prodsMap, Colors.red) +' reconstruirPedido = True +' promoABorrar = esteTag.Get(3) +' B4XPage_Appear +' End If +' Else +' If laCant.Text = "" Then laCant.Text = 0 +' laCant.Text = $"$1.0{laCant.Text-1}"$ +' If laCant.Text < 0 Then laCant.Text = 0 +' Log("NO ES promo") +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = IFNULL(HVD_RECHAZOCANT,0) + 1 WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente in (Select CUENTA from cuentaa)"$) +' Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + 1 where cat_gp_id = ?", Array As Object(esteTag.Get(2))) +' B4XPage_Appear +' End If +' Else + If laCant.Text = "" Then laCant.Text = 0 + laCant.Text = $"$1.0{laCant.Text-(1*minimoadesc)}"$ + If laCant.Text < 0 Then laCant.Text = 0 + Log("NO ES promo") +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = IFNULL(HVD_RECHAZOCANT,0) + 1 WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente = '${esteTag.Get(5)}'"$) +' Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + 1 where cat_gp_id = ?", Array As Object(esteTag.Get(2))) +' Starter.skmt.ExecNonQuery2("update PEDIDO set cat_gp_almacen = cat_gp_almacen + 1 where cat_gp_id = ?", Array As Object(esteTag.Get(2))) + + Private c3 As Cursor = Starter.skmt.ExecQuery2("SELECT PE_CANT FROM PEDIDO WHERE PE_PROID = ? AND PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND CONSECUTIVO = ? ", Array As String(esteTag.Get(2), esteTag.Get(6))) + If c3.RowCount > 0 Then + c3.Position = 0 + If c3.GetString("PE_CANT")> minimoadesc Then + Private c2 As Cursor = Starter.skmt.ExecQuery2("SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = ?", Array As String(esteTag.Get(2))) + If c2.RowCount > 0 Then + c2.Position = 0 +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = HVD_RECHAZOCANT - 1 WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente = '${esteTag.Get(5)}'"$) + Starter.skmt.ExecNonQuery($"update PEDIDO set PE_CANT = IFNULL(PE_CANT,0)-(1*'${minimoadesc}'), PE_COSTO_TOT= ((IFNULL(PE_CANT,0) -(1*'${minimoadesc}'))*'${c2.GetString("CAT_GP_PRECIO")}') WHERE PE_PROID = '${esteTag.Get(2)}' and PE_CLIENTE in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(6)}'"$) + End If + Else If c3.GetString("PE_CANT") = minimoadesc Then + Private c2 As Cursor = Starter.skmt.ExecQuery2("SELECT * FROM CAT_GUNAPROD WHERE CAT_GP_ID = ?", Array As String(esteTag.Get(2))) + If c2.RowCount > 0 Then + c2.Position = 0 +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = HVD_RECHAZOCANT - 1 WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente = '${esteTag.Get(5)}'"$) +' Starter.skmt.ExecNonQuery($"update PEDIDO set PE_CANT = IFNULL(PE_CANT,0)-1, PE_COSTO_TOT= ((IFNULL(PE_CANT,0) -1)*'${c2.GetString("CAT_GP_PRECIO")}') WHERE PE_PROID_PROID = '${esteTag.Get(2)}' and PE_CLIENTE in (Select CUENTA from cuentaa)"$) + Starter.skmt.ExecNonQuery($"delete from PEDIDO where PE_PROID = '${esteTag.Get(2)}' and PE_CLIENTE in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(6)}'"$) + End If + End If + + + + End If + B4XPage_Appear +'' End If + End If + Dim preciou As Float = esteTag.Get(0)/esteTag.Get(1) + Log("PU: " & preciou) +' LogColor("estamos aqui mmenos " & laCant.Text& " , " & (preciou * laCant.Text),Colors.Green ) +' If L_CANT.Text - 1 >= 0 Then +' L_CANT.Text = L_CANT.Text - 1 +' End If +' b_guardar.Visible = True +' Subs.prodRechazo(esteTag.Get(5), esteTag.Get(2)) +' Private cym As Map = Subs.traemosCantYMonto(clv_pedido) +' L_CANT.Text = cym.Get("cantidad") +' L_TOTAL.Text = Round2(cym.Get("monto"), 2) +' cuentaProds("-") +End Sub + +Sub b_prodMas_Click + etCantHasFocus = False + Dim sDate, sTime As String + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate = DateTime.Date(DateTime.Now) + sTime = DateTime.Time(DateTime.Now) +' Log("etCantHasFocus=" & etCantHasFocus) + LogColor("b_prodMas_Click", Colors.Magenta) + Dim index As Int = clv_pedido.GetItemFromView(Sender) + Dim pnl0 As B4XView = clv_pedido.GetPanel(index) + Dim pnl As B4XView = pnl0.GetView(0) + Dim laCant As B4XView = pnl.GetView(2).GetView(3) +' Log(pnl.GetView(2).GetView(1).text&"|"&pnl.GetView(2).GetView(2)&"|"&pnl.GetView(2).GetView(4).text) +' Log($"precio|stock:${laCant.tag}"$) +' Log($"Indice: ${index}, cant:${laCant.Text+1}, precioU: ${laCant.tag}"$) + Dim esteTag As List = Regex.Split("\|", laCant.Tag) + Log("LC_TEXT:"&laCant.Text&"|LC_TAG:"&laCant.Tag&"|ET:"&esteTag) + If laCant.Text = "" Then laCant.Text = 0 + + Private maxProds = esteTag.Get(1) + esteTag.Get(4) 'Prods disponibles + prods comprados + + Private minimoadesc As String + Dim minimos As Cursor = Starter.skmt.ExecQuery2("SELECT * FROM CAT_GUNAPROD3 WHERE CAT_GP_ID = ?", Array As String(esteTag.Get(2))) + If minimos.RowCount > 0 Then + minimos.Position = 0 + minimoadesc = minimos.GetString("CAT_DP_CANT_MIN_VENTA") + Else + minimoadesc = "1" + End If + minimos.Close + minimoadesc = "1" + '*'${minimoadesc}') + + LogColor($"++++++++++++++++++++++++++ ${esteTag}"$, Colors.Green) + Log(esteTag.get(4)) + If esteTag.Get(4) = "0" Then + + Else + If laCant.Text + 1 <= maxProds Then + Log($"NuevaCant = ${laCant.Text + 1}"$) + laCant.Text = $"$1.0{laCant.Text + 1}"$ + Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen - 1 where cat_gp_id = ?", Array As String(esteTag.Get(2))) + c = Starter.skmt.ExecQuery2("SELECT * FROM PEDIDO WHERE PE_PROID = ? and PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND CONSECUTIVO = ? ", Array As String(esteTag.Get(2), esteTag.Get(6))) + If c.RowCount > 0 Then + Private c2 As Cursor = Starter.skmt.ExecQuery2("SELECT * FROM HIST_VENTAS WHERE HVD_PROID = ? AND CONSECUTIVO = ? ", Array As String(esteTag.Get(2), esteTag.Get(6))) + If c2.RowCount > 0 Then + c2.Position = 0 + + Dim preciocat As Cursor = Starter.skmt.ExecQuery($"select IFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD WHERE CAT_GP_ID = '${c2.GetString("HVD_PROID")}'"$) + If preciocat.RowCount > 0 Then + preciocat.Position = 0 + Dim preciofull As String = preciocat.GetString("CAT_GP_PRECIO") + End If + preciocat.Close + + If c2.GetString("HVD_CODPROMO") = Subs.traeAlmacen Then + Private pup As String = c2.GetString("HVD_COSTO_TOT")/c2.GetString("HVD_CANT") +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = HVD_RECHAZOCANT - 1 WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente = '${esteTag.Get(5)}'"$) + Starter.skmt.ExecNonQuery($"update PEDIDO set PE_CANT = IFNULL(PE_CANT,0)+(1*'${minimoadesc}'), PE_COSTO_TOT= ((IFNULL(PE_CANT,0)+(1*'${minimoadesc}'))*'${pup}') WHERE PE_PROID = '${esteTag.Get(2)}' and PE_CLIENTE in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(6)}'"$) + Else + Starter.skmt.ExecNonQuery($"update PEDIDO set PE_CANT = IFNULL(PE_CANT,0)+(1*'${minimoadesc}'), PE_COSTO_TOT= ((IFNULL(PE_CANT,0)+(1*'${minimoadesc}'))*'${preciofull}') WHERE PE_PROID = '${esteTag.Get(2)}' and PE_CLIENTE in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(6)}'"$) + End If + + End If + Else + Private c2 As Cursor = Starter.skmt.ExecQuery2("SELECT * FROM HIST_VENTAS WHERE HVD_PROID = ? AND CONSECUTIVO = ? ", Array As String(esteTag.Get(2), esteTag.Get(6))) + If c2.RowCount > 0 Then + c2.Position = 0 + + Dim preciocat As Cursor = Starter.skmt.ExecQuery($"select IFNULL(CAT_GP_PRECIO,0) AS CAT_GP_PRECIO from CAT_GUNAPROD WHERE CAT_GP_ID = '${c2.GetString("HVD_PROID")}'"$) + If preciocat.RowCount > 0 Then + preciocat.Position = 0 + Dim preciofull As String = preciocat.GetString("CAT_GP_PRECIO") + End If + preciocat.Close + + Dim precioreg As Cursor = Starter.skmt.ExecQuery($"select IFNULL(HVD_COSTO_TOT,0) AS HVD_COSTO_TOT, HVD_CANT from HIST_VENTAS WHERE HVD_PROID = '${c2.GetString("HVD_PROID")}' AND CONSECUTIVO = '${esteTag.Get(6)}'"$) + If precioreg.RowCount > 0 Then + precioreg.Position = 0 + Dim precioregalo As String = precioreg.GetString("HVD_COSTO_TOT")/precioreg.GetString("HVD_CANT") + If precioregalo < 1 Then + Dim esregalo As String = 1 + Else + Dim esregalo As String = 0 + End If + End If + precioreg.Close + + If c2.GetString("HVD_CODPROMO") = Subs.traeAlmacen Then + Private pup As String = c2.GetString("HVD_COSTO_TOT")/c2.GetString("HVD_CANT") + +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = HVD_RECHAZOCANT - 1 WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente = '${esteTag.Get(5)}'"$) + Log("algo1") + Starter.skmt.ExecNonQuery2("INSERT INTO PEDIDO(PE_PROID,PE_PRONOMBRE,PE_CANT,PE_CLIENTEOR,PE_CLIENTE,PE_COSTOU,PE_COSTO_TOT,PE_CAJAS,PE_BCAJAS,CONSECUTIVO,PE_RUTA, PE_TIPO,PE_CEDIS,PE_FECHA,PE_USUARIO,FECHA_PREV,RUTA_REP,PE_REGALO) VALUES (?,?,?,?,?,?,?,0,0,?,?,?,?,?,?,?,?,?)", Array As String(esteTag.Get(2),c2.GetString("HVD_PRONOMBRE"),1*minimoadesc,esteTag.Get(5),Subs.traeCliente,(pup*minimoadesc),(pup*minimoadesc),esteTag.Get(6),Subs.traerUTAPREV,"PREVENTA",Subs.traeAlmacen, sDate & " " & sTime, Subs.traeUsuario,Subs.traefECHAPREV, Subs.traeRutaReparto,esregalo)) + Else + Log("|" & preciofull& "|") + Log("|" & minimoadesc& "|") +' Log("minimoadesc") + + + Log(esteTag.Get(2)) + Log(c2.GetString("HVD_PRONOMBRE")) + Log((1*minimoadesc)) + Log(esteTag.Get(5)) + Log(Subs.traeCliente) + Log((preciofull*minimoadesc)) + Log(esteTag.Get(6)) + Log(Subs.traerUTAPREV) + Log(Subs.traeAlmacen) + Log(sDate & " " & sTime) + Log(Subs.traeUsuario) + Log(Subs.traefECHAPREV) + Log(Subs.traeRutaReparto) + Log(esregalo) + +' Log(esteTag.Get(2)&"|"& c2.GetString("HVD_PRONOMBRE")&"|"& (1*minimoadesc) &"|"& esteTag.Get(5) &"|"& Subs.traeCliente &"|"& (preciofull*minimoadesc) &"|"& (preciofull*minimoadesc) &"|"& esteTag.Get(6) &"|"& Subs.traerUTAPREV &"|"& "PREVENTA" &"|"& Subs.traeAlmacen &"|"& sDate & " " & sTime &"|"& Subs.traeUsuario &"|"& Subs.traefECHAPREV &"|"& Subs.traeRutaReparto &"|"& esregalo) + Starter.skmt.ExecNonQuery2("INSERT INTO PEDIDO(PE_PROID,PE_PRONOMBRE,PE_CANT,PE_CLIENTEOR,PE_CLIENTE,PE_COSTOU,PE_COSTO_TOT,PE_CAJAS,PE_BCAJAS,CONSECUTIVO,PE_RUTA, PE_TIPO,PE_CEDIS,PE_FECHA,PE_USUARIO,FECHA_PREV,RUTA_REP,PE_REGALO) VALUES (?,?,?,?,?,?,?,0,0,?,?,?,?,?,?,?,?,?)", Array As String(esteTag.Get(2),c2.GetString("HVD_PRONOMBRE"),1*minimoadesc,esteTag.Get(5),Subs.traeCliente,(preciofull*minimoadesc),(preciofull*minimoadesc),esteTag.Get(6),Subs.traerUTAPREV,"PREVENTA",Subs.traeAlmacen, sDate & " " & sTime, Subs.traeUsuario,Subs.traefECHAPREV, Subs.traeRutaReparto,esregalo)) + End If + + End If + End If + + + Subs.prodVenta(esteTag.Get(5), esteTag.Get(2)) +' Private cym As Map = Subs.traemosCantYMonto(clv_pedido) +' L_CANT.Text = cym.Get("cantidad") +' L_TOTAL.Text = Round2(cym.Get("monto"), 2) +' cuentaProds("+") + B4XPage_Appear + End If + End If +' Dim preciou As Float = esteTag.Get(0)/esteTag.Get(1) +' Log(preciou) +' LogColor("estamos aquii mas " & laCant.Text& " , " & (preciou * laCant.Text) ,Colors.Green ) +' b_guardar.Visible = True +' Log($"Total Prods: ${totalProds}, Total Compra: $$1.2{totalCompra}"$) +' c = Starter.skmt.ExecQuery($"SELECT HVD_CANT FROM HIST_VENTAS2 WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND HVD_PROID = '${esteTag.Get(2)}' "$) +' c.Position = 0 +' Dim cantoriginal As String = 0 +' If c.RowCount > 0 Then +' cantoriginal = c.GetString("HVD_CANT") +' End If +' If cantoriginal <= esteTag.Get(1) Then +' L_CANT.Text = L_CANT.Text + 1 +' End If +End Sub + + +Private Sub b_prodMasC_Click + etCantHasFocus = False +' Log("etCantHasFocus=" & etCantHasFocus) + LogColor("b_prodMas_Click", Colors.Magenta) + Dim index As Int = clv_pedido.GetItemFromView(Sender) + Dim pnl0 As B4XView = clv_pedido.GetPanel(index) + Dim pnl As B4XView = pnl0.GetView(0) + Dim laCantc As B4XView = pnl.GetView(3).GetView(3) + LogColor(laCantc.Text&"-----------------------------",Colors.Blue) +' Log(pnl.GetView(2).GetView(1).text&"|"&pnl.GetView(2).GetView(2)&"|"&pnl.GetView(2).GetView(4).text) +' Log($"precio|stock:${laCant.tag}"$) +' Log($"Indice: ${index}, cant:${laCant.Text+1}, precioU: ${laCant.tag}"$) + Dim esteTag As List = Regex.Split("\|", laCantc.Tag) + Log("LC_TEXT:"&laCantc.Text&"|LC_TAG:"&laCantc.Tag&"|ET:"&esteTag) + If laCantc.Text = "" Then laCantc.Text = 0 + + Private maxProds As String = (esteTag.Get(1) + esteTag.Get(4))'Prods disponibles + prods comprados + LogColor(esteTag.Get(1),Colors.Red) + LogColor(esteTag.Get(4),Colors.Red) + LogColor($"++++++++++++++++++++++++++ ${esteTag}"$, Colors.Green) +' Log(esteTag.get(4)) + Log(maxProds) + +' l_pCantC.Tag = Round2(precioU,2)&"|"&inv&"|"&prodId&"|"&promo&"|"&inv2&"|"&cliente_original + Log(esteTag.Get(4)) + If esteTag.Get(4) = "0" Then + + Else + If laCantc.Text + 1 <= maxProds Then + Log($"NuevaCant = ${laCantc.Text + 1}"$) +' laCantc.Text = NumberFormat2(laCantc.Text + 1,0,0,0,False) + laCantc.Text = $"$1.0{laCantc.Text + 1}"$ + LogColor(esteTag,Colors.Magenta) + + LogColor(laCantc.Text,Colors.Red) +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = IFNULL(HVD_RECHAZOCANT,0) -(1 * ${Subs.traeConversion(esteTag.Get(2))}) WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente in (Select CUENTA from cuentaa)"$) + + c = Starter.skmt.ExecQuery2("SELECT * FROM PEDIDO WHERE PE_PROID = ? and PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND CONSECUTIVO = ? ", Array As String(esteTag.Get(2), esteTag.Get(6))) + If c.RowCount > 0 Then + Private c2 As Cursor = Starter.skmt.ExecQuery2("SELECT * FROM HIST_VENTAS WHERE HVD_PROID = ? AND CONSECUTIVO = ? ", Array As String(esteTag.Get(2), esteTag.Get(6))) + If c2.RowCount > 0 Then + c2.Position = 0 + Private puc As String = c2.GetString("HVD_COSTO_TOT")/c2.GetString("CANTC") +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT =(IFNULL(HVD_RECHAZOCANT,0) -(1 * ${Subs.traeConversion(esteTag.Get(2))}) ) WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente = '${esteTag.Get(5)}'"$) + Starter.skmt.ExecNonQuery($"update PEDIDO set PE_CANT = (IFNULL(PE_CANT,0)+(1 * '${Subs.traeConversion(esteTag.Get(2))}')), PE_COSTO_TOT= (IFNULL(PE_CAJAS,0)+1)*'${puc}', PE_CAJAS= IFNULL(PE_CAJAS,0) + 1 WHERE PE_PROID = '${esteTag.Get(2)}' and PE_CLIENTE in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(6)}'"$) + B4XPage_Appear + Log("aqui2") + End If + Else + Private c2 As Cursor = Starter.skmt.ExecQuery2("SELECT * FROM HIST_VENTAS WHERE HVD_PROID = ? AND CONSECUTIVO = ? ", Array As String(esteTag.Get(2), esteTag.Get(6))) + If c2.RowCount > 0 Then + c2.Position = 0 + Private puc As String = c2.GetString("HVD_COSTO_TOT")/c2.GetString("CANTC") + Log(puc) + +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = IFNULL(HVD_RECHAZOCANT,0) -(1 * ${Subs.traeConversion(esteTag.Get(2))}) WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente = '${esteTag.Get(5)}'"$) + Starter.skmt.ExecNonQuery2("INSERT INTO PEDIDO(PE_PROID,PE_PRONOMBRE,PE_CANT,PE_CLIENTEOR,PE_CLIENTE,PE_COSTOU,PE_COSTO_TOT,PE_CAJAS,PE_BCAJAS,CONSECUTIVO,PE_RUTA, PE_TIPO,PE_CEDIS,PE_FECHA,PE_USUARIO,FECHA_PREV,RUTA_REP,PE_REGALO) VALUES (?,?,?,?,?,?,?,1,1,?,?,?,?,?,?,?,?,?)", Array As String(esteTag.Get(2),c2.GetString("HVD_PRONOMBRE"),Subs.traeConversion(esteTag.Get(2)),esteTag.Get(5),Subs.traeCliente,puc,puc,esteTag.Get(6),Subs.traerUTAPREV,"PREVENTA",Subs.traeAlmacen, sDate & " " & sTime, Subs.traeUsuario,Subs.traefECHAPREV, Subs.traeRutaReparto,0)) + B4XPage_Appear + End If + End If + + End If + End If +End Sub + +Private Sub b_prodMenosC_Click + etCantHasFocus = False + Log("etCantHasFocus=" & etCantHasFocus) + LogColor("b_prodMenos_Click", Colors.Magenta) + Dim index As Int = clv_pedido.GetItemFromView(Sender) + Dim pnl0 As B4XView = clv_pedido.GetPanel(index) + Dim pnl As B4XView = pnl0.GetView(0) + Dim laCantc As B4XView = pnl.GetView(3).GetView(3) +' Log(pnl.GetView(2).GetView(0) & "|" & pnl.GetView(2).GetView(1) & "|" & pnl.GetView(2).GetView(2)) + Dim esteTag As List = Regex.Split("\|", laCantc.Tag) + Log("LC_TEXT:"&laCantc.Text&"|PROMO:"&esteTag.Get(3)&"|LC_TAG:"&laCantc.Tag&"|ET:"&esteTag) + + + + If laCantc.Text > 0 Then + +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 1, HVD_RECHAZOCANT = (IFNULL(HVD_RECHAZOCANT,0) +(1 * ${Subs.traeConversion(esteTag.Get(2))})) WHERE HVD_PROID = '${esteTag.Get(2)}' and HVD_cliente = '${esteTag.Get(5)}'"$) + Private c3 As Cursor = Starter.skmt.ExecQuery2("SELECT PE_CAJAS FROM PEDIDO WHERE PE_PROID = ? AND PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND CONSECUTIVO = ? ", Array As String(esteTag.Get(2), esteTag.Get(6))) + If c3.RowCount > 0 Then + c3.Position = 0 + If c3.GetString("PE_CAJAS") > 1 Then + Starter.skmt.ExecNonQuery($"update PEDIDO set PE_CANT = (IFNULL(PE_CANT,0)-(1 * '${Subs.traeConversion(esteTag.Get(2))}')), PE_COSTO_TOT= ((IFNULL(PE_CAJAS,0)-1) *'${Subs.traePrecioC(esteTag.Get(2))}'), PE_CAJAS = IFNULL(PE_CAJAS,0) - 1 WHERE PE_PROID = '${esteTag.Get(2)}' and PE_CLIENTE in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(6)}'"$) + Else If c3.GetString("PE_CAJAS") = 1 Then + Starter.skmt.ExecNonQuery($"delete from PEDIDO where PE_PROID = '${esteTag.Get(2)}' and PE_CLIENTE in (Select CUENTA from cuentaa) AND CONSECUTIVO = '${esteTag.Get(6)}'"$) + End If + End If + Log("entre al if o algo asi ") + If laCantc.Text = "" Then laCantc.Text = 0 + laCantc.Text = laCantc.Text - 1 + If laCantc.Text < 0 Then laCantc.Text = 0 + B4XPage_Appear +' Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = (cat_gp_almacen + (1 * ?)) where cat_gp_id = ?", Array As Object(esteTag.Get(2), Subs.traeConversion(esteTag.Get(2)))) + Else If laCantc.Text = 0 Then + + End If + + Dim preciou As Float = esteTag.Get(0)/esteTag.Get(1) + Log("PU: " & preciou) +End Sub + +Private Sub l_pCantC_Click + +End Sub + +Private Sub b_revversar_Click + Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_RECHAZO = 0, HVD_RECHAZOCANT = 0 WHERE HVD_cliente in (Select CUENTA from cuentaa)"$) + B4XPage_Appear +End Sub + +Sub cuentaProds(accion As String) + '' Log("Entramos a cuentaProds") +' Log("*******************************************************") +' Private cantRechazada As Int = 0 +' If Not(reconstruirPedido) Then +' Log("*********** CUENTAPRODS - NO RECONSTRUIR") +' prodsMap.Initialize +' For i = 0 To clv_pedido.GetSize - 1 +' Private p0 As B4XView = clv_pedido.GetPanel(i) +' Private p As B4XView = p0.GetView(0) +' Private cant1 As B4XView = p.GetView(2).GetView(3) +' If cant1.Text = "" Then cant1.Text = 0 + '' totalProds = totalProds + cant1.Text +' Private esteTag As List = Regex.Split("\|", cant1.Tag) +' Log("-------------------------------------") +' Log($"ET: ${esteTag}"$) +' Private esteProd As String = esteTag.Get(2) +' Private estaCant As Int = cant1.Text +' Private estaCantOriginal As Int = esteTag.Get(1) +' Private esteCliente = Subs.traeCliente +' Private esteProdNombre = Subs.traeNombre(esteProd) +' Private esteClienteOriginal As Int = esteTag.Get(5) +' Private fechaReparto As String = Subs.traeFechaReparto +' Private maxProds = Subs.traeMaxCantidad(esteTag.Get(5), esteTag.Get(2)) +' +' If cant1.Text > maxProds Then cant1.Text = maxProds +' +' cantRechazada = esteTag.Get(4) - cant1.Text + '' If accion = "-" Then cantRechazada = Subs.traeCantidadRechazada(esteClienteOriginal, esteProd) + 1 + '' If accion = "+" Then cantRechazada = Subs.traeCantidadRechazada(esteClienteOriginal, esteProd) - 1 +' Log($"${Subs.traeCantidadRechazada(esteClienteOriginal, esteProd)}, ${Subs.traeCantidadVendida(esteClienteOriginal, esteProd)}"$) +' + '' LogColor($"cantRechazada = ${esteTag.Get(4)} - ${cant1.Text}"$, Colors.Magenta) +' LogColor($"cantRechazada = ${cantRechazada}"$, Colors.Magenta) +' Private estePrecio As String = 0 +' If Subs.traePrecio(esteProd, 1) <> Null Then estePrecio = Subs.traePrecio(esteProd, 1) * cantRechazada +' + '' LogColor(esteProd & "|" & cant1.Text & "|" & estaCantOriginal & "|" & cantRechazada & "|" & estePrecio, Colors.red) + '' LogColor($"cantRechazada=${cantRechazada} | ${esteProdNombre}"$, Colors.Blue) + '' Log($"Ponemos HVD_CANT ${esteProd} en ${cant1.text}"$) +' Starter.skmt.ExecNonQuery2("update HIST_VENTAS set HVD_PARCIAL = 1, HVD_CANT = ? WHERE HVD_PROID = ? and HVD_CLIENTE in (Select CUENTA from cuentaa)", Array As String(cant1.Text ,esteProd)) +' Private rr As Cursor = Starter.skmt.ExecQuery($"select count(REP_CLIENTE) as hayRechazo from REPARTO where rep_prodid = '${esteProd}' and REP_CLIENTE in (Select CUENTA from cuentaa)"$) +' rr.Position = 0 + '' Log($"HayRechazo=${rr.GetString("hayRechazo")}"$) +' If rr.GetString("hayRechazo") = 0 Then +' Log("INSERTAMOS EN REPARTO") +' Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT, REP_FECHA, REP_RECHAZO, REP_PRODID, REP_PRECIO, REP_CLI_ORIG) VALUES (?,?,?,?,?,1,?,?,?) ", Array As String(esteCliente, esteProdNombre, 0, estePrecio, fechaReparto, esteProd, estePrecio, esteCliente)) +' Starter.skmt.ExecNonQuery2("insert into reparto(REP_CLIENTE, REP_PRONOMBRE, REP_CANT, REP_COSTO_TOT, REP_FECHA, REP_RECHAZO, REP_PRODID, REP_PRECIO, REP_CLI_ORIG) VALUES (?,?,?,?,?,0,?,?,?) ", Array As String(esteCliente, esteProdNombre, cantRechazada, 0, fechaReparto, esteProd, estePrecio, esteCliente)) +' Else if esteClienteOriginal = "0" Then 'Actualizamos el rechazo en el cliente actual. + '' Log($"Actualizamos REP_CANT=${cantRechazada}"$) + '' Starter.skmt.ExecNonQuery($"update reparto set REP_CANT = '${cantRechazada}', REP_PRECIO = '${estePrecio}', REP_COSTO_TOT = '${estePrecio * cantRechazada}' where REP_CLIENTE in (Select CUENTA from cuentaa) and REP_CLI_ORIG = '${esteClienteOriginal}' and REP_RECHAZO = 1 and REP_PRODID = '${esteProd}'"$) +' Else 'Cliente original <> 0 entonces actualizamos el rechazo en el cliente original y NO en el actual. +' Log($"Actualizamos REP_CANT RECHAZO = ${cantRechazada}"$) + '' Starter.skmt.ExecNonQuery($"update reparto set REP_CANT = ${cantRechazada}, REP_PRECIO = '${estePrecio}', REP_COSTO_TOT = '${estePrecio * cantRechazada}' where REP_CLIENTE = '${esteClienteOriginal}' and REP_CLI_ORIG = '${esteClienteOriginal}' and REP_RECHAZO = 1 and REP_PRODID = '${esteProd}'"$) + '' Starter.skmt.ExecNonQuery($"update reparto set REP_CANT = '${cant1.Text}', REP_PRECIO = '${estePrecio}', REP_COSTO_TOT = '${estePrecio * cantRechazada}' where REP_CLIENTE in (Select CUENTA from cuentaa) and REP_CLI_ORIG = '${esteClienteOriginal}' and REP_RECHAZO = 0 and REP_PRODID = '${esteProd}'"$) +' End If +' +' If cant1.Text > 0 Then + '' totalCompra = totalCompra + (esteTag.get(0) * cant1.text) + '' Log($"Cant: ${cant1.Text}, Suma: ${totalCompra}"$) +' Private m As Map +' m=CreateMap("cant":cant1.Text, "cant2":esteTag.get(4), "precio":esteTag.get(0), "promo":esteTag.get(3), "nombre":Subs.traeNombre(esteTag.Get(2)), "cli_orig":esteTag.get(5)) + '' LogColor("PUT:" & esteTag.Get(2), Colors.Red) +' prodsMap.Put(esteTag.Get(2), m) +' End If +' Log("-------------------------------------") +' Next +' End If +' Private bgColor, textColor As Int + ' +' If reconstruirPedido Then +' Log("*********** CUENTAPRODS - SI RECONSTRUIR") +' Private newPromo, newPrecio As String +' clv_pedido.Clear +' Log("Usamos PRODSMAP") +' For Each pr As String In prodsMap.Keys +' Private pr1 As Map = prodsMap.Get(pr) +' Log("PPP: " & pr & "|PromoABorrar=" & promoABorrar & "|" & pr1) +' bgColor = Colors.RGB(177, 200, 249)'azul +' textColor = Colors.black +' newPromo = pr1.Get("promo") +' newPrecio = pr1.Get("precio") +' Log("AAA: " & newPromo & "|" & promoABorrar) +' If newPromo = promoABorrar Then +' newPromo = 1 +' newPrecio = Subs.traePrecio(pr, False) * pr1.Get("cant") +' 'Ponemos precio SIN promo y sacamos el producto de la promo. +' Starter.skmt.ExecNonQuery($"update HIST_VENTAS set HVD_COSTO_TOT = ${newPrecio}, HVD_CODPROMO ='${Subs.traeAlmacen}' WHERE HVD_PRONOMBRE = '${pr1.Get("nombre")}' and HVD_cliente in (Select CUENTA from cuentaa)"$) +' LogColor("CAMBIAMOS PROMO: " & newPromo, Colors.Magenta) +' End If +' If newPromo <> "1" Then + '' bgColor = Colors.RGB(255, 212, 163) 'naranja +' bgColor = Colors.White +' End If +' Log($"CLI: ${pr1.Get("nombre")}, ${newPrecio}, ${pr1.Get("cant")}, ${pr1.Get("cant2")}"$) +' clv_pedido.Add(CreateListItem(pr1.Get("nombre"), newPrecio, pr1.Get("cant"), pr1.Get("cant2"), clv_pedido.AsView.Width, 118dip, bmp, pr, bgColor, textColor, newPromo, pr1.Get("cli_orig")), pr1.Get("nombre")) +' reconstruirPedido = False +' Next +' promoABorrar = "" +' End If +' Log($"Total Prods: ${totalProds}, Total Compra: $$1.2{totalCompra}"$) +' LogColor("prodsMap=" & prodsMap, Colors.Green) +' + ' +' LogColor(prodsMap, Colors.Blue) +' c = Starter.skmt.ExecQuery($"SELECT sum(HVD_CANT) as CANTIDAD FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA)"$) +' Dim cantidad1 As String = 0 +' If c.RowCount > 0 Then +' c.Position = 0 +' cantidad1 = c.GetString("CANTIDAD") +' L_CANT.Text = Round(cantidad1) +' End If +' c.Close +' +' Dim totalfinal As String = 0 +' For Each pr As String In prodsMap.Keys +' Private pr1 As Map = prodsMap.Get(pr) + '' LogColor(pr,Colors.Red) +' Dim x As Cursor = Starter.skmt.ExecQuery($"SELECT CAT_GP_PRECIO FROM CAT_GUNAPROD WHERE CAT_GP_ID = '${pr}'"$) +' c = Starter.skmt.ExecQuery($"SELECT HVD_CANT FROM HIST_VENTAS WHERE HVD_CLIENTE IN (SELECT CUENTA FROM CUENTAA) AND HVD_PROID ='${pr}' "$) +' Dim cantidady As String = 0 +' If c.RowCount >0 Then +' c.Position = 0 +' cantidady = c.GetString("HVD_CANT") +' End If + '' Log(x.RowCount) +' If x.RowCount > 0 Then +' x.Position = 0 + '' Log(x.GetString("CAT_GP_PRECIO")) +' Dim preciou As String = x.GetString("CAT_GP_PRECIO") +' Dim costototalhist As String = preciou * cantidady + '' Log("Total ==== "&costototalhist) +' End If +' totalfinal = totalfinal + costototalhist +' x.Close +' Next +' L_TOTAL.Text = Round2(totalfinal, 2) +' c.Close +' +' c = Starter.skmt.ExecQuery("select COUNT(*) AS CUANTOS from REPARTO where REP_CLIENTE in (select cuenta from cuentaa) and REP_RECHAZO = '0' and REP_CANT > 0 order by REP_PRONOMBRE") +' If c.RowCount > 0 Then +' c.Position = 0 +' If c.GetString("CUANTOS") > 0 Then +' +' Dim z As Cursor = Starter.skmt.ExecQuery($"select SUM(REP_CANT) AS CANTIDAD , SUM(REP_PRECIO) AS PRECIO from REPARTO where REP_CLIENTE in (select cuenta from cuentaa) and REP_RECHAZO = '0' and REP_CANT > 0 order by REP_PRONOMBRE"$) +' Dim cantidad2 As String = 0 + '' Log(z.RowCount) +' If z.RowCount > 0 Then +' z.Position = 0 +' cantidad2= z.GetString("CANTIDAD") + '' LogColor(z.GetString("PRECIO")&" , " & z.GetString("CANTIDAD"), Colors.Magenta) + '' Log(cantidad1 &" , "& cantidad2) +' L_CANT.Text = Round((cantidad1 + cantidad2)) +' End If +' z.Close +' +' +' End If +' End If +' +' +' +End Sub + +Private Sub b_guardar_Click + +End Sub + + +Private Sub l_pCant_Click + +End Sub + +Sub p_prods_Click + Log(Sender.As(Panel).tag) +End Sub \ No newline at end of file diff --git a/B4A/C_TicketsDia.bas b/B4A/C_TicketsDia.bas new file mode 100644 index 0000000..8371da5 --- /dev/null +++ b/B4A/C_TicketsDia.bas @@ -0,0 +1,24 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=12.2 +@EndOfDesignText@ +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + +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_UpdateAvailable.bas b/B4A/C_UpdateAvailable.bas new file mode 100644 index 0000000..62c83f8 --- /dev/null +++ b/B4A/C_UpdateAvailable.bas @@ -0,0 +1,74 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=11.5 +@EndOfDesignText@ +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + Root.Color = Colors.Transparent +End Sub + +Sub B4XPage_Appear + Try + Do While Not(CanRequestPackageInstalls) + MsgboxAsync($"Por favor permita que ${Application.PackageName} instale actualizaciones"$, "Instalar actualización") + Wait For Msgbox_Result(Result As Int) + Dim in As Intent + in.Initialize("android.settings.MANAGE_UNKNOWN_APP_SOURCES", "package:" & Application.PackageName) + StartActivity(in) + Loop + Catch + Log("updateAvailable() Error - " & LastException.Message) + End Try + If appUpdater.newApp.update Then + ofreceActualizacion + Else + sinActualizacion + End If +End Sub + +'//////////////////////////////////////////////////////////////////////////////////////////// +'//// Esta es una actividad usada por el servicio appUpdater para mostrar notificaciones +'//// cuando hay alguna actualizacion de apk. +'//////////////////////////////////////////////////////////////////////////////////////////// + + +public Sub CanRequestPackageInstalls As Boolean + ' // https://www.b4x.com/android/forum/threads/version-safe-apk-installation.87667/#content + Dim ctxt As JavaObject + ctxt.InitializeContext + Dim PackageManager As JavaObject = ctxt.RunMethod("getPackageManager", Null) + Return PackageManager.RunMethod("canRequestPackageInstalls", Null) +End Sub + +Sub ofreceActualizacion + If Msgbox2(appUpdater.newApp.newMsg,"Actualización disponible","Si","","No",Null) = DialogResponse.Positive Then 'ignore +' StartService(DownloadService) + CallSubDelayed(appUpdater, "download_newApk") +' ToastMessageShow("Descargando actualización", True) + End If + B4XPages.MainPage.ocultaProgreso + StartActivity(Main) +' Activity.Finish + B4XPages.ShowPage("Login") +End Sub + +Sub sinActualizacion + Msgbox(appUpdater.newApp.okMsg, "Aplicación al corriente") 'ignore +' StartActivity(Main) + B4XPages.MainPage.ocultaProgreso + B4XPages.ShowPage("Login") +End Sub \ No newline at end of file diff --git a/B4A/C_tabulador.bas b/B4A/C_tabulador.bas new file mode 100644 index 0000000..d752b11 --- /dev/null +++ b/B4A/C_tabulador.bas @@ -0,0 +1,134 @@ +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 et_mil As EditText + Private et_quinientos As EditText + Private et_docientos As EditText + Private et_cien As EditText + Private et_cincuenta As EditText + Private et_veinte As EditText + Private et_m_veinte As EditText + Private et_m_diez As EditText + Private et_m_cinco As EditText + Private et_m_dos As EditText + Private et_m_peso As EditText + Private et_m_centavo As EditText + Private b_calcular As Button + Private b_guardar As Button + Private l_total As Label + Dim sum_billetes As Int + Dim sum_monedas As Float + Dim total As Float + Dim c As Cursor + Dim d 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 + 'load the layout to Root + Root.LoadLayout("tabulador") +End Sub + +Sub B4XPage_Appear + d = Starter.skmt.ExecQuery("SELECT VEINTE, DIEZ, CINCO, DOS, PESO, CENTAVO, TOTAL FROM TABULADOR_MONEDAS") + c = Starter.skmt.ExecQuery("SELECT MIL, QUINIENTOS, DOCIENTOS, CIEN, CINCUENTA, VEINTE FROM TABULADOR_BILLETES") + c.Position = 0 + d.Position = 0 + If c.RowCount > 0 And d.RowCount > 0 Then + Log("TABULADR CON RESUKTADO") + et_mil.Text = c.GetString("MIL") + et_quinientos.Text = c.GetString("QUINIENTOS") + et_docientos.Text = c.GetString("DOCIENTOS") + et_cien.Text = c.GetString("CIEN") + et_cincuenta.Text = c.GetString("CINCUENTA") + et_veinte.Text = c.GetString("VEINTE") + et_m_veinte.Text = d.GetString("VEINTE") + et_m_diez.Text = d.GetString("DIEZ") + et_m_cinco.Text = d.GetString("CINCO") + et_m_dos.Text = d.GetString("DOS") + et_m_peso.Text = d.GetString("PESO") + et_m_centavo.Text = d.GetString("CENTAVO") + l_total.Text = d.GetString("TOTAL") + else If c.RowCount = 0 And d.RowCount = 0 Then + Log("TABULADR SIN RESUKTADO") + et_mil.Text = "" + et_quinientos.Text = "" + et_docientos.Text = "" + et_cien.Text = "" + et_cincuenta.Text = "" + et_veinte.Text = "" + et_m_veinte.Text = "" + et_m_diez.Text = "" + et_m_cinco.Text = "" + et_m_dos.Text = "" + et_m_peso.Text = "" + et_m_centavo.Text = "" + l_total.Text = "" + End If + c.Close + d.Close +End Sub + +Private Sub b_guardar_Click + b_calcular_Click + Starter.skmt.ExecNonQuery("DELETE FROM TABULADOR_MONEDAS") + Starter.skmt.ExecNonQuery("DELETE FROM TABULADOR_BILLETES") + Starter.skmt.ExecNonQuery2("INSERT INTO TABULADOR_BILLETES (MIL, QUINIENTOS, DOCIENTOS, CIEN, CINCUENTA, VEINTE) VALUES (?,?,?,?,?,?)", Array As Object(et_mil.Text,et_quinientos.Text,et_docientos.Text,et_cien.Text,et_cincuenta.Text,et_veinte.Text)) + Starter.skmt.ExecNonQuery2("INSERT INTO TABULADOR_MONEDAS (VEINTE, DIEZ, CINCO, DOS, PESO, CENTAVO, TOTAL) VALUES (?,?,?,?,?,?,?)", Array As Object(et_m_veinte.Text,et_m_diez.Text,et_m_cinco.Text,et_m_dos.Text,et_m_peso.Text,et_m_centavo.Text,l_total.Text)) + B4XPages.ShowPage("Principal") +End Sub + +Private Sub b_calcular_Click + If et_mil.Text = "" Then + et_mil.Text = 0 + End If + If et_quinientos.Text = "" Then + et_quinientos.Text = 0 + End If + If et_docientos.Text = "" Then + et_docientos.Text = 0 + End If + If et_cien.Text = "" Then + et_cien.Text = 0 + End If + If et_cincuenta.Text = "" Then + et_cincuenta.Text = 0 + End If + If et_veinte.Text = "" Then + et_veinte.Text = 0 + End If + If et_m_veinte.Text = "" Then + et_m_veinte.Text = 0 + End If + If et_m_diez.Text = "" Then + et_m_diez.Text = 0 + End If + If et_m_cinco.Text = "" Then + et_m_cinco.Text = 0 + End If + If et_m_dos.Text = "" Then + et_m_dos.Text = 0 + End If + If et_m_peso.Text = "" Then + et_m_peso.Text = 0 + End If + If et_m_centavo.Text = "" Then + et_m_centavo.Text = 0 + End If + sum_billetes = (et_mil.Text * 1000) + (et_quinientos.Text * 500) + (et_docientos.Text * 200) + ( et_cien.Text * 100 ) + ( et_cincuenta.Text * 50 ) + ( et_veinte.Text * 20 ) + sum_monedas = (et_m_veinte.Text * 20) + ( et_m_diez.Text * 10 ) + ( et_m_cinco.Text * 5 ) + ( et_m_dos.Text * 2 ) + ( et_m_peso.Text * 1 ) + ( et_m_centavo.Text * 0.50 ) + total = sum_billetes + sum_monedas + l_total.Text = Round2(total, 2) +End Sub \ No newline at end of file diff --git a/B4A/CameraExClass.bas b/B4A/CameraExClass.bas new file mode 100644 index 0000000..1743551 --- /dev/null +++ b/B4A/CameraExClass.bas @@ -0,0 +1,290 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=7.01 +@EndOfDesignText@ + +'Class module +'version 1.20 +'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 + Type CameraInfoAndId (CameraInfo As Object, Id As Int) + Type CameraSize (Width As Int, Height As Int) + 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 + 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) + 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 + 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 + +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 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 + +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 +'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 + + + diff --git a/B4A/DBRequestManager.bas b/B4A/DBRequestManager.bas new file mode 100644 index 0000000..b3d83a1 --- /dev/null +++ b/B4A/DBRequestManager.bas @@ -0,0 +1,272 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=7.01 +@EndOfDesignText@ +'Class module +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 - 211023 +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 + 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 - 211023 + jobTagAnterior = Job.Tag 'Mod por CHV - 211023 + 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 + 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/EscPosPrinter.bas b/B4A/EscPosPrinter.bas new file mode 100644 index 0000000..f0a9536 --- /dev/null +++ b/B4A/EscPosPrinter.bas @@ -0,0 +1,1158 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=9.3 +@EndOfDesignText@ +#IgnoreWarnings: 9 +' 9 = unused variable + +Sub Class_Globals + ' 1.0 Initial version + ' 2.0 Added FeedPaper, changed many WriteString(.." & Chr(number)) instances to WriteBytes(params) + ' This is to avoid Unicode code page transformations on some numbers > 32 + ' Added PrintAndFeedPaper, setRelativePrintPosn, + ' Added user defined characters, DefineCustomCharacter, DeleteCustomCharacter and setUseCustomCharacters + ' Addedhelper methods CreateCustomCharacter, CreateLine, CreateBox and CreateCircle + Private Version As Double = 2.0 ' Printer class version + + Type AnImage(Width As Int, Height As Int, Data() As Byte) + + Private EventName As String 'ignore + Private CallBack As Object 'ignore + + Private Serial1 As Serial + Private Astream As AsyncStreams + Private Connected As Boolean + Private ConnectedError As String + + Dim ESC As String = Chr(27) + Dim FS As String = Chr(28) + Dim GS As String = Chr(29) + + 'Bold and underline don't work well in reversed text + Dim UNREVERSE As String = GS & "B" & Chr(0) + Dim REVERSE As String = GS & "B" & Chr(1) + + ' Character orientation. Print upside down from right margin + Dim UNINVERT As String = ESC & "{0" + Dim INVERT As String = ESC & "{1" + + ' Character rotation clockwise. Not much use without also reversing the printed character sequence + Dim UNROTATE As String = ESC & "V0" + Dim ROTATE As String = ESC & "V1" + + ' Horizontal tab + Dim HT As String = Chr(9) + + ' Character underline + Dim ULINE0 As String = ESC & "-0" + Dim ULINE1 As String = ESC & "-1" + Dim ULINE2 As String = ESC & "-2" + + ' Character emphasis + Dim BOLD As String = ESC & "E1" + Dim NOBOLD As String = ESC & "E0" + + ' Character height and width + Dim SINGLE As String = GS & "!" & Chr(0x00) + Dim HIGH As String = GS & "!" & Chr(0x01) + Dim WIDE As String = GS & "!" & Chr(0x10) + Dim HIGHWIDE As String = GS & "!" & Chr(0x11) + + ' Default settings + Private LEFTJUSTIFY As String = ESC & "a0" + Private LINEDEFAULT As String = ESC & "2" + Private LINSET0 As String = ESC & "$" & Chr(0x0) & Chr(0x0) + Private LMARGIN0 As String = GS & "L" & Chr(0x0) & Chr(0x0) + Private WIDTH0 As String = GS & "W" & Chr(0xff) & Chr(0xff) + Private CHARSPACING0 As String = ESC & " " & Chr(0) + Private CHARFONT0 As String = ESC & "M" & Chr(0) + Dim DEFAULTS As String = CHARSPACING0 & CHARFONT0 & LMARGIN0 & WIDTH0 & LINSET0 & LINEDEFAULT & LEFTJUSTIFY _ + & UNINVERT & UNROTATE & UNREVERSE & NOBOLD & ULINE0 + +End Sub + +'********** +'PUBLIC API +'********** + +'Initialize the object with the parent and event name +Public Sub Initialize(vCallback As Object, vEventName As String) + EventName = vEventName + CallBack = vCallback + Serial1.Initialize("Serial1") + Connected = False + ConnectedError = "" +End Sub + +' Returns any error raised by the last attempt to connect a printer +Public Sub ConnectedErrorMsg As String + Return ConnectedError +End Sub + +' Returns whether a printer is connected or not +Public Sub IsConnected As Boolean + Return Connected +End Sub + +' Returns whether Bluetooth is on or off +Public Sub IsBluetoothOn As Boolean + Return Serial1.IsEnabled +End Sub + +' Ask the user to connect to a printer and return whether she tried or not +' If True then a subsequent Connected event will indicate success or failure +Public Sub Connect As Boolean + 'leos +' Serial1.Connect("88:6B:0F:3E:53:9E") +' Return True + Try + If Starter.MAC_IMPRESORA = "0" Then + Dim PairedDevices As Map + PairedDevices = Serial1.GetPairedDevices + Dim l As List + l.Initialize + Log("aqui 1") + For i = 0 To PairedDevices.Size - 1 + l.Add(PairedDevices.GetKeyAt(i)) + Log("aqui 2") + DisConnect + Next + Dim Res As Int + Res = InputList(l, "Choose a printer", -1) 'show list with paired devices 'ignore + If Res <> DialogResponse.CANCEL Then + Serial1.Connect(PairedDevices.Get(l.Get(Res))) 'convert the name to mac address + 'Msgbox(PairedDevices.Get(l.Get(Res)),"mac") + Starter.mac_impresora = PairedDevices.Get(l.Get(Res)) + Return True + DisConnect + Log("aqui 3") + End If + Log("aqui 4") + Return False + Else + Serial1.Connect(Starter.mac_impresora) + ' Starter.mac_impresora = colonia.MAC_IMPRESORA + Return True + DisConnect + Log("aqui 5") + End If + Catch + Log(LastException) + Return False + End Try +End Sub + + +' Disconnect the printer +Public Sub DisConnect + Serial1.Disconnect + Connected = False +End Sub + +' Reset the printer to the power on state +Public Sub Reset + WriteString(ESC & "@") +End Sub + +'-------------- +' Text Commands +'-------------- + +' Print any outstanding characters then feed the paper the specified number of units of 0.125mm +' This is similar to changing LineSpacing before sending CRLF but this has a one off effect +' A full character height is always fed even if units = 0. Units defines the excess over this minimum +Public Sub PrintAndFeedPaper(units As Int) + WriteString(ESC & "J") + Dim params(1) As Byte + params(0) = units + WriteBytes(params) +End Sub + +' Set the distance between characters +Public Sub setCharacterSpacing(spacing As Int) + WriteString(ESC & " ") + Dim params(1) As Byte + params(0) = spacing + WriteBytes(params) +End Sub + +' Set the left inset of the next line to be printed +' Automatically resets to 0 for the following line +' inset is specified in units of 0.125mm +Public Sub setLeftInset(inset As Int) + Dim dh As Int = inset / 256 + Dim dl As Int = inset - dh + WriteString(ESC & "$" & Chr(dl) & Chr(dh)) + Dim params(2) As Byte + params(0) = dl + params(1) = dh + WriteBytes(params) +End Sub + +' Set the left margin of the print area, must be the first item on a new line +' margin is specified in units of 0.125mm +' This affects barcodes as well as text +Public Sub setLeftMargin(margin As Int) + Dim dh As Int = margin / 256 + Dim dl As Int = margin - dh + WriteString(GS & "L") + Dim params(2) As Byte + params(0) = dl + params(1) = dh + WriteBytes(params) +End Sub + +' Set the width of the print area, must be the first item on a new line +' margin is specified in units of 0.125mm +' This affects barcodes as well as text +' This appears to function more like a right margin than a print area width when used with LeftMargin +Public Sub setPrintWidth(width As Int) + Dim dh As Int = width / 256 + Dim dl As Int = width - dh + WriteString(GS & "W") + Dim params(2) As Byte + params(0) = dl + params(1) = dh + WriteBytes(params) +End Sub + +' Set the distance between lines in increments of 0.125mm +' If spacing is < 0 then the default of 30 is set +Public Sub setLineSpacing(spacing As Int) + If spacing < 0 Then + WriteString(ESC & "2") + Else + WriteString(ESC & "3") + Dim params(1) As Byte + params(0) = spacing + WriteBytes(params) + End If +End Sub + +' Set the line content justification, must be the first item on a new line +' 0 left, 1 centre, 2 right +Public Sub setJustify(justify As Int) + WriteString(ESC & "a" & Chr(justify + 48)) +End Sub + +' Set the codepage of the printer +' You need to look at the printer documentation to establish which codepages are supported +Public Sub setCodePage(codepage As Int) + WriteString(ESC & "t") + Dim params(1) As Byte + params(0) = codepage + WriteBytes(params) +End Sub + +' Select the size of the font for printing text. 0 = Font A (12 x 24), 1 = Font B (9 x 17) +' For font B you may want to set the line spacing to a lower value than the default of 30 +' This affects only the size of printed characters. The code page determines the actual character set +' On my printer setting UseCustomCharacters = while Font B is selected crashes the printer and turns it off +Public Sub setCharacterFont(font As Int) + WriteString(ESC & "M" & Chr(Bit.And(1,font))) +End Sub + +' Set the positions of the horizontal tabs +' Each tab is specified as a number of character widths from the beginning of the line +' There may be up to 32 tab positions specified each of size up to 255 characters +' The printer default is that no tabs are defined +Public Sub setTabPositions(tabs() As Int) + WriteString(ESC & "D") + Dim data(tabs.Length+1) As Byte + For i = 0 To tabs.Length - 1 + data(i) = tabs(i) + Next + data(tabs.Length) = 0 + WriteBytes(data) +End Sub + +' Set print position relative to the current position using horizontal units of 0.125mm +' relposn can be negative +' Unless I have misundertood this doesn't work as documented on my printer +' It only seems take effect at the beginning of a line as a one off effect +Public Sub setRelativePrintPosn(relposn As Int) + Dim dh As Int = relposn / 256 + Dim dl As Int = relposn - dh + WriteString(ESC & "\") + Dim params(2) As Byte + params(0) = dl + params(1) = dh + WriteBytes(params) +End Sub + +' Send the contents of an array of bytes to the printer +' Remember that if the printer is expecting text the bytes will be printed as characters in the current code page +Public Sub WriteBytes(data() As Byte) + If Connected Then + Astream.Write(data) + End If +End Sub + +' Send the string to the printer in IBM437 encoding which is the original PC DOS codepage +' This is usually the default codepage for a printer and is CodePage = 0 +' Beware of using WriteString with Chr() to send numeric values as they may be affected by Unicode to codepage translations +' Most character level operations are pre-defined as UPPERCASE string variables for easy concatenation with other string data +Public Sub WriteString(data As String) + WriteString2(data, "IBM437") +End Sub + +' Send the string to the printer in the specified encoding +' You also need to set the printer to a matching encoding using the CodePage property +' Beware of using WriteString2 with Chr() to send numeric values as they may be affected by codepage substitutions +' Most character level operations are pre-defined as UPPERCASE string variables for easy concatenatipon with other string data +Public Sub WriteString2(data As String, encoding As String) + Try + If Connected Then + Astream.Write(data.GetBytes(encoding)) + End If + Catch + Log("Printer error : " & LastException.Message) + AStream_Error + End Try +End Sub + +'----------------------------------------- +' User defined character commands commands +'----------------------------------------- + +' Delete the specified user defined character mode +' This command deletes the pattern defined for the specified code in the font selected by ESC ! +' If the code is subsequently printed in custom character mode the present code page character is printed instead +Public Sub DeleteCustomCharacter(charcode As Int) + WriteString(ESC & "?") + Dim params(1) As Byte + params(0) = charcode + WriteBytes(params) +End Sub + +' Enable the user defined character mode if custom is True, revert to normal if custom is False +' If a custom character has not been defined for a given character code then the default character for the present font is printed +' FontA and FontB have separate definitions for custom characters +' On my printer setting UseCustomCharacters = while Font B is selected crashes the printer and turns it off +' Therefore the cuatom character routines have not been tested on ont B +Public Sub setUseCustomCharacters(custom As Boolean) + If custom Then + WriteString(ESC & "%1") + Else + WriteString(ESC & "%0") + End If +End Sub + +' Define a user defined character +' The allowable character code range is the 95 characters) from ASCII code 32 (0x20) to 126 (0x7E) +' Characters can be defined in either font A (12*24) or font B (9*17) as selected by present setting of CharacterFont +' The programmer must ensure that the correct font size definition is used for the present setting of CharacterFont +' The user-defined character definition is cleared when Reset is invoked or the printer is turned off +' The vertical and horizontal printed resolution is approximaely 180dpi +' Characters are always defined by sets of three bytes in the vertical direction and up to 9 or 12 sets horizontally +' Each byte defines a vertical line of 8 dots. The MSB of each byte is the highest image pixel, the LSB is the lowest +' Byte(0+n) defines the topmost third of the vertical line, Byte(1+n) is below and Byte(2+n) is the lowest +' Set a bit to 1 to print a dot or 0 to not print a dot +' If the lines to the right of the character are blank then there set of three bytes can be omiited from the byte array +' When the user-defined characters are defined in font B (9*17) only the most significant bit of the 3rd byte of data is used +' charcode defines the character code for the character being defined +' bitdata is a Byte array containing the character definitiopn as described above. +' If the length of bitdata is not a multiple of 3 the definition is ignored and a value of -1 returned +Public Sub DefineCustomCharacter(charcode As Int, bitdata() As Byte) As Int + Dim excess As Int = bitdata.Length Mod 3 + If excess <> 0 Then Return -1 + Dim size As Int = bitdata.Length / 3 + WriteString(ESC & "&") + Dim params(4) As Byte + params(0) = 3 + params(1) = charcode + params(2) = charcode + params(3) = size + WriteBytes(params) + WriteBytes(bitdata) + Return 0 +End Sub + +' The third triangle point is hacked into spare bits keeping the generated Int human readable i hex for other shapes +' The shape array contains the character shapes and characterfont is 0 for a 12*24 character andd 1 for a 9*17 character +' Returns a Byte(36) for characterfont = 0 and a Byte(27) for characterfont = 1 +' The returned array can be directly passed to DefineCustomCharacter +' To define a custom character requires specifying up to 288 data points +' This is a lot of data and in most cases it is mainly white space +' This method takes a character definition that defines only the shapes in the character that are to be printed black +' It will be easier use the outputs from CreateLine, CreateTriangle, CreateBox and CreateCircle rather then building the actual Int values +' Each shape is defined by a single Int value containing four parameters in hex format plugs some single bit flags +' Taking the representation of the Int as eight hex characters numbered from the MS end as 0x01234567 +' 0 contains the shape to draw. 0 = Line, 1 = Box, 2 = Circle, 3 = Triangle +' 1 contains a value between 0 and 0xF. This is either an X coordinate or for a circle the radius +' 2 and 3 contain a value between 0 and 0x1F. This is either a Y coordinate or for a circle the quadrants to draw +' 4 contains a value between 0 and 0xF. This is 0 for an empty shope or 1 for a filled shape +' 5 contains a value between 0 and 0xF. This is an X coordinate +' 5 and 6 contain a value between 0 and 0x1F. This is a Y coordinate +' The coordinate 0,0 is at the top left of the character +' Line +' One point of the vector is contained in the top part of the Int and the other in the bottom half +' To define a single point place its coordinates as both sr=start and end of a line +' Box +' The two X,Y coordinates specify the top left and bottom right corners of the box +' Circle +' The left X parameter is now the radius of the circle, the left Y is the quadrants to be drawn +' The right X and Y parameters are the centre of the circle' +' The quadrants to draw are bit ORed together, UpperRight = 0x1, LowerRight = 0x2, LowerLeft = 0x4, Upper Left = 0x8 +' Triangle +' The left X and Y parameters are now one point of the triangle, the right X and Y parameters another point +' The third triangle point is hacked into spare bits keeping the generated Int human readable in hex for the other shapes +' The bit allocations of a shape are as follows. f = fill as 0 or 1, s = shape as 0 to 7, xn as 0 to 15, yn as 0 to 31 +' Shape 0 = line, 1 = box, 2 = triangle, 3 = circle, 4 to 7 = unused +' fsss xxxx -yyy yyyy xxxx xxxx yyyy yyyy +' 0000 220 0000 2222 1111 2221 1111 +' x0 y2 y0 x2 x1 y2 y1 +' The shape array contains the character shapes and characterfont is 0 for a 12*24 character andd 1 for a 9*17 character +' Returns a Byte(36) for characterfont = 0 and a Byte(27) for characterfont = 1 +' The returned array can be directly passed to DefineCustomCharacter +Public Sub CreateCustomCharacter(shapes() As Int, characterfont As Int) As Byte() + Dim masks(8) As Byte + masks(0) = 0x80 + masks(1) = 0x40 + masks(2) = 0x20 + masks(3) = 0x10 + masks(4) = 0x08 + masks(5) = 0x04 + masks(6) = 0x02 + masks(7) = 0x01 + ' rather than try to catch errors whenever we access this array we Dim it to the maximum possible values of X and Y + ' then copy the top left of it to the final character definition array of the correct size + Dim points(16,32) As Byte + ' initialise the character to all white + For x = 0 To 15 + For y = 0 To 31 + points(x,y) = 0 + Next + Next + Dim size As Int = 12 + If characterfont = 1 Then size = 9 + Dim charbyes(size * 3) As Byte + For c = 0 To charbyes.Length - 1 + charbyes(c) = 0 + Next + ' set the points array from the shapes provided + For i = 0 To shapes.Length -1 + Dim fill As Int = Bit.UnsignedShiftRight(Bit.And(0x80000000, shapes(i)), 31) + Dim shape As Int = Bit.UnsignedShiftRight(Bit.And(0x70000000, shapes(i)), 28) + Dim x0 As Int = Bit.UnsignedShiftRight(Bit.And(0x0f000000, shapes(i)), 24) + Dim y0 As Int = Bit.UnsignedShiftRight(Bit.And(0x001f0000, shapes(i)), 16) + Dim x1 As Int = Bit.UnsignedShiftRight(Bit.And(0x00000f00, shapes(i)), 8) + Dim y1 As Int = Bit.And(0x0000001f, shapes(i)) + Dim x2 As Int = Bit.UnsignedShiftRight(Bit.And(0x0000f000, shapes(i)), 12) + Dim y2 As Int = Bit.UnsignedShiftRight(Bit.And(0x00e00000, shapes(i)), 18) + Bit.UnsignedShiftRight(Bit.And(0x000000e0, shapes(i)), 5) + ' The bit allocations of a shape are as follows. f = fill as 0 or 1, s = shape as 0 to 7, xn as 0 to 15, yn as 0 to 31 + ' Shape 0 = line, 1 = box, 2 = triangle, 3 = circle, 4 to 7 = unused + ' fsss xxxx -yyy yyyy xxxx xxxx yyyy yyyy + ' 0000 220 0000 2222 1111 2221 1111 + ' x0 y2 y0 x2 x1 y2 y1 + Dim logmsg As String = ": Fill=" & fill & " : Points " & x0 & "," & y0 & " " & x1 & "," & y1 & " " & x2 & "," & y2 + If shape = 3 Then + Log("Triangle " & logmsg) + PlotTriangle(x0, y0, x1, y1, x2, y2, points, fill) + else If shape = 2 Then + Log("Circle " & logmsg) + PlotCircle(x0, y0, x1, y1, points, fill) + Else If shape = 1 Then + Log("Box " & logmsg) + PlotBox(x0, y0, x1, y1, points, fill) + Else + Log("Line " & logmsg) + PlotLine(x0, y0, x1, y1, points) + End If + ' map the points array onto the character definition array + For x = 0 To size -1 ' 9 or 12 horizontal bytes + For y = 0 To 2 ' 3 vertical bytes + Dim bits As Byte = 0 + For b = 0 To 7 ' 8 vertical bits + If points(x, y*8+b) <> 0 Then + bits = Bit.Or(bits, masks(b)) + End If + Next + charbyes(x*3+y) = bits + Next + Next + Next + Return charbyes +End Sub + +' This is a higher level method that builds the Int values to pass to CreateCustomCharacter in the shapes array +' Create the value to draw a line in a custom character +' The line starts at X0,Y0 and ends at X1,Y1 +Public Sub CreateLine(x0 As Int, y0 As Int, x1 As Int, y1 As Int) As Int + Dim line As Int = 0 + line = line + Bit.ShiftLeft(Bit.And(0xf,x0), 24) + line = line + Bit.ShiftLeft(Bit.And(0x1f,y0), 16) + line = line + Bit.ShiftLeft(Bit.And(0xf,x1), 8) + line = line + Bit.And(0x1f,y1) + Return line +End Sub + +' This is a higher level method that builds the Int values to pass to CreateCustomCharacter in the shapes array +' Create the value to draw a circle in a custom character +' The circle is centred on X1,Y1 and the quadrants to draw are bit ORed together +' UpperRight = 0x1, LowerRight = 0x2, LowerLeft = 0x4, Upper Left = 0x8 +Public Sub CreateCircle(radius As Int, quadrants As Int, x1 As Int, y1 As Int, fill As Boolean) As Int + Dim circle As Int = 0x20000000 + If fill Then circle = circle + 0x80000000 + circle = circle + Bit.ShiftLeft(radius, 24) + circle = circle + Bit.ShiftLeft(quadrants, 16) + circle = circle + Bit.ShiftLeft(x1, 8) + circle = circle + y1 + Return circle +End Sub + + +' This is a higher level method that builds the Int values to pass to CreateCustomCharacter in the shapes array +' Create the value to draw a triangle in a custom character +' The triangles corners are at X0,Y0 X1,Y1 and X2,Y2 +Public Sub CreateTriangle(x0 As Int, y0 As Int, x1 As Int, y1 As Int, x2 As Int, y2 As Int, fill As Boolean) As Int + Dim triangle As Int = 0x30000000 + If fill Then triangle = triangle + 0x80000000 + triangle = triangle + Bit.ShiftLeft(Bit.And(0xf,x0), 24) + triangle = triangle + Bit.ShiftLeft(Bit.And(0x1f,y0), 16) + triangle = triangle + Bit.ShiftLeft(Bit.And(0xf,x1), 8) + triangle = triangle + Bit.And(0x1f,y1) + triangle = triangle + Bit.ShiftLeft(Bit.And(0xf,x2), 12) ' extra X + triangle = triangle + Bit.ShiftLeft(Bit.And(0x7,y2), 5) ' extra Y lsbits * 3 + triangle = triangle + Bit.ShiftLeft(Bit.And(0x18,y2), 18) ' extra Y msbits * 2 + Return triangle +End Sub + +' This is a higher level method that builds the Int values to pass to CreateCustomCharacter in the shapes array +' Create the value to draw a box in a custom character +' The box top left start is X0,Y0 and bottom right is X1,Y1 +Public Sub CreateBox(x0 As Int, y0 As Int, x1 As Int, y1 As Int, fill As Boolean) As Int + Dim box As Int = 0x10000000 + If fill Then box = box + 0x80000000 + box = box + Bit.ShiftLeft(Bit.And(0xf,x0), 24) + box = box + Bit.ShiftLeft(Bit.And(0x1f,y0), 16) + box = box + Bit.ShiftLeft(Bit.And(0xf,x1), 8) + box = box + Bit.And(0x1f,y1) + Return box +End Sub + +'----------------------------------------- +' Private custom character drawing methods +'----------------------------------------- + +Private Sub PlotTriangle(x0 As Int, y0 As Int, x1 As Int, y1 As Int, x2 As Int, y2 As Int, points(,) As Byte, Fill As Int) + ' This is a pretty crude algorithm, but it is simple, works and it isn't invoked often + PlotLine(x0, y0, x1, y1, points) + PlotLine(x1, y1, x2, y2, points) + PlotLine(x2, y2, x0, y0, points) + If Fill > 0 Then + FillTriangle(x0, y0, x1, y1, x2, y2, points) + End If +End Sub + +Private Sub FillTriangle(x0 As Int, y0 As Int, x1 As Int, y1 As Int, x2 As Int, y2 As Int, points(,) As Byte) + ' first sort the three vertices by y-coordinate ascending so v0 Is the topmost vertice */ + Dim tx, ty As Int + If y0 > y1 Then + tx = x0 : ty = y0 + x0 = x1 : y0 = y1 + x1 = tx : y1 = ty + End If + If y0 > y2 Then + tx = x0 : ty = y0 + x0 = x2 : y0 = y2 + x2 = tx : y2 = ty + End If + If y1 > y2 Then + tx = x1 : ty = y1 + x1 = x2 : y1 = y2 + x2 = tx : y2 = ty + End If + + Dim dx0, dx1, dx2 As Double + Dim x3, x4, y3, y4 As Double + Dim inc As Int + + If y1 - y0 > 0 Then dx0=(x1-x0)/(y1-y0) Else dx0=0 + If y2 - y0 > 0 Then dx1=(x2-x0)/(y2-y0) Else dx1=0 + If y2 - y1 > 0 Then dx2=(x2-x1)/(y2-y1) Else dx2=0 + x3 = x0 : x4 = x0 + y3 = y0 : y4 = y0 + If dx0 > dx1 Then + While + Do While y3 <= y1 + If x3 > x4 Then inc = -1 Else inc = 1 + For x = x3 To x4 Step inc + points(x, y3) = 1 + Next + y3 = y3 + 1 : y4 = y4 + 1 : x3 = x3 + dx1 : x4 = x4 + dx0 + Loop + x4=x1 + y4=y1 + Do While y3 <= y2 + If x3 > x4 Then inc = -1 Else inc = 1 + For x = x3 To x4 Step inc + points(x ,y3) = 1 + Next + y3 = y3 + 1 : y4 = y4 + 1 : x3 = x3 + dx1 : x4 = x4 + dx2 + Loop + Else + While + Do While y3 <= y1 + If x3 > x4 Then inc = -1 Else inc = 1 + For x = x3 To x4 Step inc + points(x, y3) = 1 + Next + y3 = y3 + 1 : y4 = y4 + 1 : x3 = x3 + dx0 : x4 = x4 +dx1 + Loop + x3=x1 + y3=y1 + Do While y3<=y2 + If x3 > x4 Then inc = -1 Else inc = 1 + For x = x3 To x4 Step inc + points(x, y3) = 1 + Next + y3 = y3 + 1 : y4 = y4 + 1 : x3 = x3 + dx2 : x4 = x4 + dx1 + Loop + End If +End Sub + +Private Sub PlotBox(x0 As Int, y0 As Int, x1 As Int, y1 As Int, points(,) As Byte, Fill As Int) + ' This is a pretty crude algorithm, but it is simple, works and itsn't invoked often + PlotLine(x0, y0, x0, y1, points) + PlotLine(x0, y0, x1, y0, points) + PlotLine(x1, y0, x1, y1, points) + PlotLine(x0, y1, x1, y1, points) + If Fill > 0 Then + For x = x0 To x1 + PlotLine(x, y0, x, y1, points) + Next + End If +End Sub + + +Private Sub PlotCircle(radius As Int, quadrants As Int, x1 As Int, y1 As Int, points(,) As Byte, fill As Int) + ' This is a pretty crude algorithm, but it is simple, works and itsn't invoked often + Dim mask As Int = 1 + For q = 3 To 0 Step -1 + If Bit.And(quadrants, mask) <> 0 Then + For i = q*90 To q*90+90 Step 1 + Dim x,y As Double + x = x1 - SinD(i)*radius + y = y1 - CosD(i)*radius + If fill > 0 Then + PlotLine(x1, y1, x, y, points) + Else + points(Round(x), Round(y)) = 1 + End If + Next + End If + mask = Bit.ShiftLeft(mask, 1) + Next +End Sub + +' Bresenham's line algorithm - see Wikipedia +Private Sub PlotLine(x0 As Int, y0 As Int, x1 As Int, y1 As Int, points(,) As Byte ) + If Abs(y1 - y0) < Abs(x1 - x0) Then + If x0 > x1 Then + PlotLineLow(x1, y1, x0, y0, points) + Else + PlotLineLow(x0, y0, x1, y1, points) + End If + Else + If y0 > y1 Then + PlotLineHigh(x1, y1, x0, y0, points) + Else + PlotLineHigh(x0, y0, x1, y1, points) + End If + End If +End Sub + +Private Sub PlotLineHigh(x0 As Int, y0 As Int, x1 As Int, y1 As Int, points(,) As Byte ) + Dim dx As Int = x1 - x0 + Dim dy As Int = y1 - y0 + Dim xi As Int = 1 + If dx < 0 Then + xi = -1 + dx = -dx + End If + Dim D As Int = 2*dx - dy + Dim x As Int = x0 + For y = y0 To y1 + points(x,y) = 1 + If D > 0 Then + x = x + xi + D = D - 2*dy + End If + D = D + 2*dx + Next +End Sub + +Private Sub PlotLineLow(x0 As Int, y0 As Int, x1 As Int,y1 As Int, points(,) As Byte ) + Dim dx As Int = x1 - x0 + Dim dy As Int = y1 - y0 + Dim yi As Int = 1 + If dy < 0 Then + yi = -1 + dy = -dy + End If + Dim D As Int = 2*dy - dx + Dim y As Int = y0 + For x = x0 To x1 + points(x,y) = 1 + If D > 0 Then + y = y + yi + D = D - 2*dx + End If + D = D + 2*dy + Next +End Sub + + +'------------------- +' Image commands +'------------------- +' There are two different image printing options with different pixel formats. +' PrintImage prints an entire image at once with a maximum size of 576x512 +' PrintImage2 prints a slice of an image with a height of 8 or 24 and a maximum width of 576 +' One or other may look better on your particular printer + +' Printer support method for pre-processing images to print +' Convert the bitmap supplied to an array of pixel values representing the luminance value of each original pixel +Sub ImageToBWIMage(bmp As Bitmap) As AnImage + Dim BC As BitmapCreator 'ignore + Dim W As Int = bmp.Width + Dim H As Int = bmp.Height + Dim pixels(W * H) As Byte + + For y = 0 To H - 1 + For x = 0 To W - 1 + Dim j As Int = bmp.GetPixel(x, y) + ' convert color to approximate luminance value + Dim col As ARGBColor + BC.ColorToARGB(j, col ) + Dim lum As Int = col.r * 0.2 + col.b*0.1 + col.g*0.7 + If lum> 255 Then lum = 255 + ' save the pixel luminance + pixels(y*W + x) = lum + Next + Next + Dim ret As AnImage + ret.Width = bmp.Width + ret.Height = bmp.Height + ret.Data = pixels + Return ret +End Sub + +' Printer support method for pre-processing images to print +' Convert the array of luminance values to an array of 0s and 1s according to the threshold value +Sub ThresholdImage(img As AnImage, threshold As Int) As AnImage 'ignore + Dim pixels(img.Data.Length) As Byte + For i = 0 To pixels.Length - 1 + Dim lum As Int = Bit.And(img.Data(i), 0xff) ' bytes are signed values + If lum < threshold Then + lum = 1 + Else + lum = 0 + End If + pixels(i) = lum + Next + Dim ret As AnImage + ret.Width = img.Width + ret.Height = img.Height + ret.Data = pixels + Return ret +End Sub + +' Printer support method for pre-processing images to print +' Convert the array of luminance values to a dithered array of 0s and 1s according to the threshold value +' The dithering algorithm is the simplest one-dimensional error diffusion algorithm +' Normally threshold should be 128 but some images may look better with a little more or less. +' This algorithm tends to produce vertical lines. DitherImage2D will probably look far better +Sub DitherImage1D(img As AnImage, threshold As Int) As AnImage 'ignore + Dim pixels(img.Data.Length) As Byte + Dim error As Int + For y = 0 To img.Height - 1 + error = 0 ' reset on each new line + For x = 0 To img.Width - 1 + Dim lum As Int = Bit.And(img.Data(y*img.Width + x), 0xff) ' bytes are signed values + lum = lum + error + If lum < threshold Then + error = lum + lum = 1 + Else + error = lum - 255 + lum = 0 + End If + pixels(y*img.Width + x) = lum + Next + Next + Dim ret As AnImage + ret.Width = img.Width + ret.Height = img.Height + ret.Data = pixels + Return ret +End Sub + + +' Printer support method for pre-processing images to print +' Convert the array of luminance values to a dithered array of 0s and 1s according to the threshold value +' The dithering algorithm is the simplest two-dimensional error diffusion algorithm +' Normally threshold should be 128 but some images may look better with a little more or less. +' Anything more sophisticated might be overkill considering the image quality of most thermal printers +Sub DitherImage2D(img As AnImage, threshold As Int) As AnImage + Dim pixels(img.Data.Length) As Byte + Dim xerror As Int + Dim yerrors(img.Width) As Int + For i = 0 To yerrors.Length -1 + yerrors(0) = 0 + Next + For y = 0 To img.Height - 1 + xerror = 0 ' reset on each new line + For x = 0 To img.Width - 1 + Dim lum As Int = Bit.And(img.Data(y*img.Width + x), 0xff) ' bytes are signed values + lum = lum + xerror + yerrors(x) + If lum < threshold Then + xerror = lum/2 + yerrors(x) = xerror + lum = 1 + Else + xerror = (lum - 255)/2 + yerrors(x) = xerror + lum = 0 + End If + pixels(y*img.Width + x) = lum + Next + Next + Dim ret As AnImage + ret.Width = img.Width + ret.Height = img.Height + ret.Data = pixels + Return ret +End Sub + + +' GS v0 printing +'--------------- + +' Prints the given image at the specified height and width using the "GS v" command +' Image data is supplied as bytes each containing 8 bits of horizontal image data +' The top left of the image is Byte(0) and the bottom right is Byte(width*height-1) +' MSB of the byte is the leftmost image pixel, the LSB is the rightmost +' Maximum width is 72 bytes (576 bits), Maximum height is 512 bytes +' The printed pixels are square +' Returns status 0 : OK, -1 : too wide, -2 : too high, -3 : array too small +' The printer can take a long time to process the data and start printing +Public Sub PrintImage(img As AnImage) As Int + ' max width = 72 ' 72mm/576 bits wide + ' max height = 512 ' 64mm/512 bits high + If img.width > 72 Then Return -1 + If img.height > 512 Then Return -2 + If img.data.Length < img.width * img.height Then Return -3 + Dim xh As Int = img.width / 256 + Dim xl As Int = img.width - xh * 256 + Dim yh As Int = img.height / 256 + Dim yl As Int = img.height - yh * 256 + Dim params(5) As Byte + params(0) = 0 ' + params(1) = xl + params(2) = xh + params(3) = yl + params(4) = yh + WriteString(GS & "v0") + WriteBytes(params) + WriteBytes(img.data) + WriteString(CRLF) + Return 0 +End Sub + +' Printer support method for pre-processing images to print by PrintImage +' Takes an array of image pixels and packs it for use with PrintImage +' Each byte in the imagedata array is a single pixel valued zero or non-zero for white and black +' The returned array is 8 x smaller and packs 8 horizontal black or white pixels into each byte +' If the horizontal size of the image is not a multiple of 8 it will be truncated so that it is. +Public Sub PackImage(imagedata As AnImage) As AnImage + Dim xbytes As Int = imagedata.width/8 + Dim pixels(xbytes * imagedata.height) As Byte + Dim masks(8) As Byte + masks(0) = 0x80 + masks(1) = 0x40 + masks(2) = 0x20 + masks(3) = 0x10 + masks(4) = 0x08 + masks(5) = 0x04 + masks(6) = 0x02 + masks(7) = 0x01 + Dim index As Int = 0 + For y = 0 To imagedata.Height - 1 + For x = 0 To xbytes - 1 + Dim xbyte As Byte = 0 + For b = 0 To 7 + ' get a pixel + Dim pix As Byte = imagedata.Data(index) + If pix <> 0 Then + xbyte = xbyte + masks(b) + End If + index = index + 1 + Next + pixels(y*xbytes + x) = xbyte + Next + Next + Dim ret As AnImage + ret.Width = xbytes + ret.Height = imagedata.Height + ret.Data = pixels + Return ret +End Sub + + +' ESC * printing +'--------------- + +' Prints the given image slice at the specified height and width using the "ESC *" command +' Image data is supplied as bytes each containing 8 bits of vertical image data +' Pixels are not square, the width:height ratio varies with density and line height +' Returns status 0 = OK, -1 = too wide, -2 = too high, -3 = wrong array length +' Line spacing needs to be set to 0 if printing consecutive slices +' The printed pixels are not square, the ratio varies with the highdensity and dots24 parameter settings +' The highdensity parameter chooses high or low horizontal bit density when printed +' The dots24 parameter chooses 8 or 24 bit data slice height when printed +' Not(highdensity) +' Maximum width is 288 bits. Horizontal dpi is approximately 90 +' MSB of each byte is the highest image pixel, the LSB is the lowest +' highdensity +' Maximum width is 576 bits. Horizontal dpi is approximately 180 +' Not(dots24) +' Vertical printed height is 8 bits at approximately 60dpi +' One byte in the data Array represents one vertical line when printed +' Array size is the same as the width +' MSB of each byte is the highest image pixel, the LSB is the lowest +' dots24 +' Vertical printed height is 24 bits at approximately 180dpi +' Three consecutive bytes in the data array represent one vertical 24bit line when printed +' Array size is 3 times the width +' Byte(n+0) is the highest, byte (n+2) us the lowest +' MSB of each byte is the highest image pixel, the LSB is the lowest +Public Sub PrintImage2(width As Int, data() As Byte, highdensity As Boolean, dotds24 As Boolean) As Int + Dim d As String = Chr(0) + If Not(highdensity) And Not(dotds24 ) Then + d = Chr(0) + If width > 288 Then Return -1 + If data.Length <> width Then Return -3 + Else If highdensity And Not(dotds24) Then + d = Chr(1) + If width > 576 Then Return -1 + If data.Length <> width Then Return -3 + Else If Not(highdensity) And dotds24 Then + d = Chr(32) + If width > 288 Then Return -1 + If data.Length <> width*3 Then Return -3 + Else ' highdensity And dotds24 + d = Chr(33) + If width > 576 Then Return -1 + If data.Length <> width*3 Then Return -3 + End If + Dim xh As Int = width / 256 + Dim xl As Int = width - xh * 256 + Dim params(2) As Byte + params(0) = xl + params(1) = xh + WriteString(ESC & "*" & d) + WriteBytes(params) + WriteBytes(data) + WriteString(CRLF) + Return 0 +End Sub + +' Printer support method for pre-processing images to print by PrintImage2 +' Takes an array of image pixels and packs one slice of it for use with PrintImage2 +' Each byte in the imagedata array is a single pixel valued zero or non-zero for white and black +' The returned array packs 8 vertical black or white pixels into each byte +' If dots24 is True then the slice is 24 pixels high otherwise it is 8 pixels high +Public Sub PackImageSlice(img As AnImage, slice As Int, dots24 As Boolean) As Byte() + Dim bytes As Int = img.width + If dots24 Then + Dim pixels(bytes * 3) As Byte + Dim slicestart As Int = slice * bytes * 8 * 3 + Else + Dim pixels(bytes) As Byte + Dim slicestart As Int = slice * bytes * 8 + End If + + Dim masks(8) As Byte + masks(0) = 0x80 + masks(1) = 0x40 + masks(2) = 0x20 + masks(3) = 0x10 + masks(4) = 0x08 + masks(5) = 0x04 + masks(6) = 0x02 + masks(7) = 0x01 + ' You could compress this into a single code block but I left it as two to make it more obvious what's happening + If dots24 Then + For x = 0 To bytes - 1 + For s = 0 To 2 + Dim xbyte As Byte = 0 + For b = 0 To 7 + ' get a pixel + Dim pix As Byte = img.Data(slicestart + ((b + s*8) * bytes) + x) + If pix <> 0 Then + xbyte = xbyte + masks(b) + End If + Next + pixels(x*3+s) = xbyte + Next + Next + Else + For x = 0 To bytes - 1 + Dim xbyte As Byte = 0 + For b = 0 To 7 + ' get a pixel + Dim pix As Byte = img.Data(slicestart + (b * bytes) + x) + If pix <> 0 Then + xbyte = xbyte + masks(b) + End If + Next + pixels(x) = xbyte + Next + End If + Return pixels +End Sub + +'---------------- +'Barcode commands +'---------------- + +' Set the height of a 2D bar code as number of dots vertically, 1 to 255 +' Automatically resets to the default after printing the barcode +Public Sub setBarCodeHeight(height As Int) + WriteString(GS & "h") + Dim params(1) As Byte + params(0) = height + WriteBytes(params) +End Sub + +' Set the left inset of a 2D barcode, 0 to 255 +' This does not reset on receipt of RESET +Public Sub setBarCodeLeft(left As Int) + WriteString(GS & "x") + Dim params(1) As Byte + params(0) = left + WriteBytes(params) +End Sub + +' Set the width of each bar in a 2D barcode. width value is 2 to 6, default is 3 +' 2 = 0.250, 3 - 0.375, 4 = 0.560, 5 = 0.625, 6 = 0.75 +' Resets to default after printing the barcode +Public Sub setBarCodeWidth(width As Int) + WriteString(GS & "w") + Dim params(1) As Byte + params(0) = width + WriteBytes(params) +End Sub + +'Selects the printing position of HRI (Human Readable Interpretation) characters when printing a 2D bar code. +'0 Not printed, 1 Above the bar code, 2 Below the bar code, 3 Both above And below the bar code +' Automatically resets to the default of 0 after printing the barcode +' The docs say this can be Chr(0, 1 2 or 3) or "0" "1" "2" or "3" but the numeric characters don't work +Public Sub setHriPosn(posn As Int) + WriteString(GS & "H") + Dim params(1) As Byte + params(0) = posn + WriteBytes(params) +End Sub + +'Selects the font for HRI (Human Readable Interpretation) characters when printing a 2D bar code. +'0 Font A (12 x 24), 1 Font B (9 x 17) +' Automatically resets to the default of 0 after printing the barcode +' The docs say this can be Chr(0 or 1) or "0" or "1" but the numeric characters don't work +Public Sub setHriFont(font As Int) + WriteString(GS & "f" & Chr(font)) +End Sub + +' If given invalid data no barcode is printed, only strange characters +' CODABAR needs any of A,B,C or D at the start and end of the barcode. Some decoders may not like them anywhere else +' Bartype Code Number of characters Permitted values +' A | UPC-A | 11 or 12 characters | 0 to 9 | The 12th printed character is always the check digit +' B | UPC-E | 6 characters | 0 to 9 | The 12th printed character is always the check digit +' C | EAN13 | 12 or 13 characters | 0 to 9 | The 12th printed character is always the check digit +' D | EAN8 | 7 or 8 characters | 0 to 9 | The 8th printed character is always the check digit +' E | CODE39 | 1 or more characters | 0 to 9, A to Z, Space $ % + - . / +' F | ITF | 1 or more characters | 0 to 9 | even number of characters only +' G | CODABAR| 3 to 255 characters | 0 to 9, A to D, $ + - . / : | needs any of A,B,C or D at the start and end +' H | CODE93 | 1 to 255 characters | Same as CODE39 +' I | CODE128| 2 to 255 characters | entire 7 bit ASCII set +Public Sub WriteBarCode(bartype As String, data As String) + Dim databytes() As Byte = data.GetBytes("ASCII") + Dim dlow As Int = databytes.Length + Log("Barcode " & bartype & ", Size " & dlow & ", " & data) + WriteString(GS & "k" & bartype.ToUpperCase.CharAt(0)) + Dim params(1) As Byte + params(0) = dlow + WriteBytes(params) + WriteBytes(databytes) +End Sub + +' On my printer QR codes don't seem to be able to be decoded and on high ECs look obviously wrong :( +' size is 1 to 40, 0 is auto-size. Successive versions increase module size by 4 each side +' size = 1 is 21x21, 2 = 25x25 ... size 40 = 177x177 +' EC is error correction level, "L"(7%) or "M"(15%) or "Q"(25%) or "H"(30%) +' scale is 1 to 8, 1 is smallest, 8 is largest +Public Sub WriteQRCode(size As Int, EC As String, scale As Int, data As String) + Dim databytes() As Byte = data.GetBytes("ISO-8859-1") + Dim dhigh As Int = databytes.Length / 256 + Dim dlow As Int = databytes.Length - dhigh*256 + Log("QR Code : Size " & size & ", EC " & EC & ", Scale " & scale & ", Size " & dlow & " " & dhigh & " : Data = " & data) + Dim params(3) As Byte + params(0) = scale + params(1) = dlow + params(2) = dhigh + WriteString(ESC & "Z" & Chr(size) & EC.ToUpperCase.CharAt(0)) + WriteBytes(params) + WriteBytes(databytes) +End Sub + + +'**************** +' PRIVATE METHODS +'**************** + +'----------------------- +' Internal Serial Events +'----------------------- + +Private Sub Serial1_Connected (Success As Boolean) + If Success Then + Astream.Initialize(Serial1.InputStream, Serial1.OutputStream, "astream") + Connected = True + ConnectedError = "" + Serial1.Listen + Else + Connected = False + ConnectedError = LastException.Message + End If + If SubExists(CallBack, EventName & "_Connected") Then + CallSub2(CallBack, EventName & "_Connected", Success) + End If +End Sub + +'---------------------------- +' Internal AsyncStream Events +'---------------------------- + +Private Sub AStream_NewData (Buffer() As Byte) + If SubExists(CallBack, EventName & "_NewData") Then + CallSub2(CallBack, EventName & "_NewData", Buffer) + End If + Log("Data " & Buffer(0)) +End Sub + +Private Sub AStream_Error + If SubExists(CallBack, EventName & "_Error") Then + CallSub(CallBack, EventName & "_Error") + End If +End Sub + +Private Sub AStream_Terminated + Connected = False + If SubExists(CallBack, EventName & "_Terminated") Then + CallSub(CallBack, EventName & "_Terminated") + End If +End Sub diff --git a/B4A/Files/alert2.png b/B4A/Files/alert2.png new file mode 100644 index 0000000000000000000000000000000000000000..44d3b7e651884f30ca0811371860a2c872077175 GIT binary patch literal 632 zcmV-;0*C#HP)a1y& zFeNaQ#z>D?Pp5~l@C6?oy~8sZU}IxI;&C5S^*RX4g3j(P>{qMnPinP$E4E$LLaawd zxnek%yAhe62RbqWgdrq^ANpD6_~aynggAY^(YRg~;@v0DbNvqNboym@YHBGwJq<@$ z?d@$S@9ezE?CmWRJ#%Duc*B^R3lx$242WOzK{1WrMjcw z-v5w}lckIWi}Lw_qDo3|mHN%`gnbxlHnWuTVAa-E_dYWdfCP^HQ;1ED$MadV-M-B| z?^qsqIKpekS=WQ}^2EeiLaAF}ZRSx95_bDVsrP40^RXUWeHWs5EgHQPk}^fGlYhI? z7ZShfA-TfX#^p-oQ5`+#S+9lSo8#jTvz$LL94Eq1h#qt#kt9MPaAUF7$5v}~!Lru$ zkBjl^|Gm>9vFC}z*(-*zl%(`RoYGSo*q8FFDMYE@IB%cY_Ge7}ISA*k00RI&q3etP SUq&PV000029qX%a+GMXQ$LSen>t%?#a*r8U}Olp5mHS_w@%R25Nc zdMtxVQEHiKs_n5>1tUaiQU_fyTAKN_bEe;W_uTvLeeZtn-Sf_sOh{${l$*1wGXR1B z073(h@PTwd7AdWygx;ALC5(!)iaG{^MPZcpDnXWtDh8*5(amz8V*)5AC%1doZgmt&)m&Fok3=LAO)ZF)7DSSSs`;AjL=N=e7mD@gM@Ydy zBos4%*rBXai0`Z*3`)9_)832ha4}UmtV~xj2`E4tU}!iRI10pf%YcA30=R~P0d`+a zIE8?v+#atMr)86r2ZqI$RNbiPKpnAY$#Ck$)_4JbFtfK+zCGF|xtum){_|yYZgx|0 zM6`5Cy-u+7lzYsm%cMuxJ6X@4_7U>%_UlXo=AH7n)uC3!Zv-4s(x4%IPpNg1Mi zeqh7DbtmhYZ}Rb7Dj6p_y1cLxo!V=v&5bAfic9%VybGterLO*Wxh&mWBwJVv;O(qQ zLC%#b)k^U;4y_Q@mv0doslrXpnXI5I zB3swZ1IM%xFcb25s-R)T=a)!djew=S@RW2>tRT=}#Cy5Xjyh+0dV=Y?pXs_{kYHxj zIzw%EfKK=Is^i?%WNl@ZRfn@0>npRGQYUr0^St{>IR#H|w2L|Sy*%Te_LN*OZ zvARQdfSz15S6GTA(}HYFNBJ62O$YG%_>g^qJv~s` ztkqGMD9W9_|HGX7x@U_J+3H9`IvY5y*~By6k8GSjNuBy*y1jZkzf*to%e}3d5eX11 z0bcjdl)vEf={UK{pO{pgbCFkNcNg92^ zIgK?hZrQ|z*&>H=6}N>${3t;ieM5P2xaLv*cq(&&L9UqJBfhla1dc7moP5l44^0Z? zsXq^@sa{=RZ1U|6$~D#bS~zmX_{q=H)fVyvr?|)6TGiZD3EW}wxJOObpK6+&xW!%< zWW7^S&8zK$O^H$OSmHe0q;)}zuzkK<7{spBz824M4Gjzk4M5qiAOd>CQHRU0B~8t< zwM;OAn8Mn!^`CXAuQ_y~dC{DEGcMs%){Ea~o0(UP&U84-2YBQC+Un%9-)Si9e9IG$ zsq&pJ#y^gXHQr3*^@YeA;$V3W2?wlf&&G|ZSM(~8KQKdXd88E<@A34lHgck#+d3YT99NUdD^pah=URGQclB;?u{pTn9*Ztp~4hb(-CnjWDHZr&ivu&E8CR2&M3x|WX zmKsEnU818J9kLONw7HRcvE-Uv*QLHVJ(L#nU((r(s;89c{w}}z?$XLdTqIca8EI$YCjb+0G9mImj6`OtC{>L-el*Z%?ya$i^g literal 0 HcmV?d00001 diff --git a/B4A/Files/atras.png b/B4A/Files/atras.png new file mode 100644 index 0000000000000000000000000000000000000000..1a5af22962b1bae8d23bdb2df6c7e32bd7defba8 GIT binary patch literal 3208 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 G{67H>8H7#% literal 0 HcmV?d00001 diff --git a/B4A/Files/atras1.png b/B4A/Files/atras1.png new file mode 100644 index 0000000000000000000000000000000000000000..25e195c1a5b885b202e5f7d575d3b3094b813f86 GIT binary patch literal 6372 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/calificarcliente.png b/B4A/Files/calificarcliente.png new file mode 100644 index 0000000000000000000000000000000000000000..d57dd6dcb2efcc5b1bb76812b95d7ae973eae1ff GIT binary patch literal 15744 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 VHrgh)`J0bZkX3<~y)=FQzW}){>ihrz literal 0 HcmV?d00001 diff --git a/B4A/Files/check.bal b/B4A/Files/check.bal new file mode 100644 index 0000000000000000000000000000000000000000..fc449b4995313855760904d71835e57b5e65b04c GIT binary patch literal 44953 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 E|H4`x<^TWy literal 0 HcmV?d00001 diff --git a/B4A/Files/checklist.bal b/B4A/Files/checklist.bal new file mode 100644 index 0000000000000000000000000000000000000000..9462b176865fb0c0df6d66c8e4f1a976bbb34861 GIT binary patch literal 3088 zcmb_dO>7%g5MGlwV46~XS_r=le<5vClcfBHpT5KOzUfAqfyUz~k zsZuYffK*he;>xuk#H9xgoH#(EaDo#O5}de##DSanzFF_uR@{gREY0lf%$s>L-^{Gj zmSvquS=OC+_Ji&K<;upXJ7(i<$l3ViY@n)D9rQuBytLvQ|1MgO)r|4IHd~}f!&Y4? ztF_%cbXs}ZZJwb;-g%K6QGucy)|YH${P13SER+M^br&7I-gIMnEhU5ShrH!?8+Z?> z7epJAydA{2v7CX-D7!%XodfOvkSFN3P+Z@-@#gT!kyR@r#<;aiYS3djsi@hIx+d-rgI}76d<*>9-)sH}$URI$~&Q9ylS@m>~J*AC`5oY!V=eogu4{XYF)|7F4 zZ@L!9lgZnGT35@i9_kW&x@pT!`K}+tZx7&PHg@YY5xX+a5-eTUo++p`&1>QuiQr1j zbFmy#bs})1Xit@@8Kad!a$b%E_Id;f78GQ__8~m-Y z>OOj7UHoD!BlylbrZVLR=w}!kIAzOzVCz5%YrURj;>4{i4n<`?y|yi$wA9u0WOCx=d*~)%qD|humE-!1W-d>7dI@EQ*Auj~{0pR0gg|0(0L03aGHe(j6M_38ru!gByuA?8seRx* z_k*QuFn(`D7>ET9u4p)VQUJ%KSqT#2hqC8UGLV(w;!5iKA+#zQjMc2@aZn%2c>*Mn zq8b~G#*?uIPpkJSuyjgFei~wuf#mc(G((`&UkD)x@JgxVIs}1&UeAE~1rNfO;31WM z0!>m*gohN)*ezi25&=U&?31`slK2url2#Il=Qvqb?=V;d3^!4LISAp_fVl>bPGAl} zLnN&>ghue1q>>;c!0<`|<|Hx@V0d^ZV19u;DMx^b3jf!@OyH&@n% z)N@x~0->yPxtFP#080>*e%jDTKZ%s|^E(KyfW%!I%Yd!Mvdyo8($;IjUkA?|1xwao zlA0XYF;E{iupx_a4Rbw3(=^x&h2vmJAKO-iNwrqR!!;Ta^>-soZ2$F5-+J%EO(ACg4e>pTnM%(*{iEs?Z?EDF`qFKuGTX0m4qez@Z6I Ir({|G0E=1a?f?J) literal 0 HcmV?d00001 diff --git a/B4A/Files/cliente.bal b/B4A/Files/cliente.bal new file mode 100644 index 0000000000000000000000000000000000000000..f2ddbbf8d0f7ad14795d3112a10cdaa377de9484 GIT binary patch literal 57737 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/clienteblanco.png b/B4A/Files/clienteblanco.png new file mode 100644 index 0000000000000000000000000000000000000000..7880a4df6d32f6f9827633d726121b3f0292efe2 GIT binary patch literal 4737 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/clientes.bal b/B4A/Files/clientes.bal new file mode 100644 index 0000000000000000000000000000000000000000..562c5fa0280f7f52af7d114da7069d61c3cc9341 GIT binary patch literal 8354 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/clientes_visitados.jpg b/B4A/Files/clientes_visitados.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6740b14b3571b51a6f5005d5c7c0874c4ef257b0 GIT binary patch literal 24466 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 Muy?kj+Ym1Q2lkAKo&W#< literal 0 HcmV?d00001 diff --git a/B4A/Files/contrasena.png b/B4A/Files/contrasena.png new file mode 100644 index 0000000000000000000000000000000000000000..97b3da2228cbcfd842e24cc8c17118d1b18ab366 GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^ZXnFT3?e@WZ39x0C9V-A!TD(=<%vb942~)JNvR5+ zxryniL8*x;m4zo$ZGei{0(?ST|ARqj&DR{D2vbRrU+{m1r`rv@fV}0NE{-7;x87Xy zli@xHbP0l+XkKscUzH literal 0 HcmV?d00001 diff --git a/B4A/Files/datoscliente.bal b/B4A/Files/datoscliente.bal new file mode 100644 index 0000000000000000000000000000000000000000..81e7a6ec1772df531f061db62a07b56b8c78f2f4 GIT binary patch literal 3719 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¨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 literal 0 HcmV?d00001 diff --git a/B4A/Files/derecha1.png b/B4A/Files/derecha1.png new file mode 100644 index 0000000000000000000000000000000000000000..ed3087bdac331a0cf6296581eb864a5776847a8b GIT binary patch literal 5956 zcmc&&_cI&-(-xxN>7us_qIV&2BAj00oL-{D>AgjX&YkGJMi)Iq7dc&Y!Ku-E7d;4v zH}A~%Cww#S%E#j4_DVPgfevVi-#4O)T!i8THzl2zByv9Q6?Q-J7b!dMlc z+QLGt{H*%6cAi$O+E#E2XI6-XJFAX`ldGeJrxhQoiigX88#t?r^Z%*jEG!*t++Dn! z;Q|(O1akid>)GiTc*Z%pYbGdM0}{ zb-E;#IAt|xTrt6H3vj<<;SzzU9;a#*bbmrW9W{`4*&cYobIlkqq8$-}FIiMXFcLh> zFh|ww%UARfgs3aG;(iN1P}Enw@>Fa7?0a=zFQzg%5fyxPbbOL?tai3F?EP?ce|-5s zgw-Pi_#XrSNJttIsfLT7Uqq+LeJzIVo#f^+Yd|14*&`zjxin;C3GakxZ~R%tra^OQ zvs!2^GHU9o-X6wtV~&P$ouQ-q`5ce6Zd^Bw?#W?Fnac3bpV@!^a@(kr za9Z?Xe|CH;O&2j)KPTiYEV@0SkxUy){C(c5yx#if6V<1^Ng|rLBabyTlPw4k>uw%u z^?M(@N3kBTg50uGQ*k*sE|c#;xtc3LV$!gh8dta27arSDWAD%dj5 zg<2{c6t3cC(J^5$@X^H7?TWdC>r02CzcAF3Lg|oBITYY}|L1vMp)2n#5!hy}=!q#V3pH%jy>nlR`W2UJAK?phdDh(BZfP2g2LCWT~tb!f) z7n2qkEpmQ^rB6eH`63{pcFL>@IUnUt%RuQsq_(U3M8L#$M}>r0607vgosIW_Vjv9r zhbBXDl9Mf$@mTwV79m5Qm(XdVS$P)$oJ2c}gd9f^zfLz2&XODX4Ctmz84T zNhO40J*|lNo(w)Qbu(PNZEx|3iMo7l21%6D`ya%$Okdir@U~u}bIXQyK@&yx->WXi~S10DyG3 zTjmb}wbSD7ZS9XhF)*LKxgGhV8sav2Vm*fGr5v(sGW_bYk6rE-v!+6xUOlBOL42mk zZg3l$o{Hbbol+po_aoHBE}?B@b;xTO8K14Opgrv+Nx7DR(SW?JmTkoZg8wN?f1N4naNue_62y7#Gni8xEUM%SUbAucWo@Jt=L^}aW3-Lnr3IC13Xmdz~L{(v^8a(4p}YW%{LMd5rx|1`O%l{Bn6)2|GJ`$ zrEgWt+G6CXeWsZUstzd6KQR=GlW?)=887Sa<;45h?!m+~>3Gz~E>hUSWNLWRn&Gv{ z!DTuLc-Fj9;y`0|(er3O5y+pj-$e#WMaf~0!nzl-KifAN?GlRq5q){E9|EQ>sQf~4 zdzAKM(MUn0JS`*eym}L!p!_+ZmG%n8t)BBz*9Wxr0)U5>VS7qP^!Wn6w!#hBYdexR z_T%@CCGB&5+gd}T@$L5weeRC@TQxsSP<}v@`I9(tWE9uyZSL%!RfG(>FLiuqIhwZ8Ms^S?17%ZhjK+R0FB)=`6{ zJun&*#bn7N{S<_h_3@G9F~c4#^PHbVx_@lz#oE1%wKZsLY+T*jvny3LUY=_pELnDo zkQCtI2~B*e6a^KbDyn5Wea4_VPC#KLVo3D;;cLZZsga zm8@}m@7_@hru**s<9Y3MU#7Ak5u}A-L}!R`a99c`338sV1?IpZBZ63IT_pn8`U;%D zP^7a1RJ(*7;_nakKiiY3s!z@kzZJOk@3Oum;W?E@7%fWsf?Ql0b@xVN%vtRn4px6e zZX~!}3)wO-j2}GiSyu{*_3dO&q`cd%6+@kKcQw%BY$@xslcY5@Jr~M-iNm}j@VaQ9 z^?Fg-W`~N4@0q#en=WXE%&MH$`~Bk?dz59Q zg4MMqXKG}71Z?k7^){J`Nx+%iM~6z}<(uS35jj887DeJ^@j_74R3O{@L1|b7TI8HX zO%1j80>C{tcXs_6Zk2=RL;ATbPRwKLYrQz%{>dQ8BK+)|{0G$N-fd1!j-Dn2PtBs3 zso!=7|F~!AY9y>rkw3s320jW1xa*u9Te-;sOkH}+Gq6j8bQ%lUK79CKQT8W%c*R=I ze~FswFyH<9$(8VZgZvvWaN8>MH`nvaf-h(?G_#+9qr1NLvZ<_jHbw6g4AYG1wZlt8hSuUkGHd(&nI`}Eb+|mBDC+wUy2Fhl@;>lR;%Qd#7Rf=O? z5OFk+&tk?uRMn;aT*}h-W6&62uAqPzn97kwz7A9SZO+0X&Ls^#Jh+b|;S=}D$QLJG zqbBN&x5v7;g{LqvapHcWaw5CZ5P0>%x58`H7`>!Tjh-nHG83ZYJ9@0w;4N1W<V1j0szB=g%b}osg894j$y)>lOalIXWtU3Ta%};OzJLeI3ZPEnmIc=4eyF zu}s=W=4kVRBl-Al3{_}C>wCXszU7 zUO@kj$>mScm|>1$dcJ18@t>be(_cd@i#{G~;=Z%AT*dtL$Z$KZ69vHD1b4`A7PN_D z+Q(!fEc@djrlz@#iJm(bdne;Pq|tL~f7W5Ur;0m^C?eYIekW__ak&9y&12b)x9a+Fm`fBXb_1P&Jtu@c!Onc<) ztY#J1ZjYD~+Qsv5_pksH>FAr0ZuG@=(JnngAQ0~r$r-7*tg-3F|9Rl*UTJPl`UH;P zd(n<~3a59?OUrBEoA&7Fk?dnhu7$1xNl~idzg}KmCo|g`dPM^R1Fk#|z0ovl(Sq&4 z(+)G8NgQf^TP#o5Hq(cTYrMyp*L>{`;{P3^1{Kuy4A5g+3{X%%UBGze<4~ z#TRX&bVUKd2iPm?KD_I@bHU)eyu1?%`*XgzIxAw#Biu{K@!Ib#epN|&KKJPEJBABZ z@5JbDqv>0gfJ2=Xd0RMR&(<^@h>6N!6 z%l)sqJniAzV}sFEH(Kz!Rtnr~b6+B5lP%9ne#+guxw*YROa21NgXUwl5ij@M zHs2YX_PeJVZT;B|Dd&IKclg@uVc8$oWoGt4!;`#xZYzZ2h*&KM*n^W*P=ZOJH9$A^&xIOP%nyInLZekSkMll^vdj2kk&@zK`jZesA|tD;4;`PjBpRnX{%$iEoNXqb z%q+MNkI4>lAvOv;-FYi3#2|m`5o`>7l<}n;l9x=jOdH3aB&3`~4BvU2P1(8Lcgx5} z?uOKd0yeg6VEIbk1X=qj&>}CI<3@?8u=EP*z^h?bpP)Q^D${B*f%m{Z6C=i=2+sf^ zw#xD<%1F3|S0hBuPUgcc7b-8)$wut?am)9tT%6zHfE{0DGZzkWjuSlq1FwD+g>>%k z1#g1CgS=445PJ~k(AWJ`7U}SGo9G-29GZT1j!4fxfGStJ*fPTM@FCJ$bP}UNZy05k zZM6EF*9MnS1T-pEpxzcHsrTk4DN!byk-Z)TC~*d(g(X%ZHGMNft|@yCvQoR??GnH7 zne-mP?ugbkE{@<~M0T!IpJe^?BXKMCAtd0yRVEZd~BlgS-uCB*JrOJWX zv=HDki76pReQCRvU#EmN#$}ETTu*6+4WIgvL{$|j#^VJjy&90l6x27;ig>85O#>e& zQu_)h6>9GP28G3)uY{4beH(F|HYprZ04>B)6HcG#)J%+Yo>d1thlow91^ZBqIR#9D!b5a>aad|CsrbxDZsiDwF>3h-YZn0v#%4ep@Z) z`XUb>ExJ_DCI#htmq^~w)Ih*tT&<#7I$n3vp&wb2fty;Y$~CMP5=T_*p;(|bC%2>C z;c+95zuJC#gx@PZqyS@G$}7T9l%AP2CO<62kA~E-vJ`5MoS_EfMWX>ddVw}-L^|u% zdD6x(6O)FW)JBJ9;IuZzyhljJi!ss|giKBO_U&7ELc;iugmE$;;>m*il==9TaN5ny z%d+xv#Epe)zI$c((Y7i9ku#$Ayk||WKq7{2nXtH58oFN4dwwTuEKx<6pe1QKc_#ET zsO>swQa0;FeRJItVqKiC`O#4!Pmb^)8;y8RV&@>`ySzbfne^xy$AuMfs*}{@?pG6@ zvjw^Nvi``&P;&^(N6lM{E9-Fn6%N`LdzdTQ$e_4rRrB>VyhIl%iMmeQn_FHBCu#1Z zY*v9*zrbti(?rr{8SecTdxX13Vxrcg>guXl>^Il4va)kkPF1{aCDjM}`%_fY-(>yE zcs<48!9QduM&Ei)&xoN?eV&-9#6&ydu$0S~RG&sv8l+7a;hM%T7SQvCdZlQNPe}H9 zsfoK*m6kbkQlJ&RAJMcBCt&2^a5&yj2QzPqSI*nFSterl*HBzf@pUldFL6|=EdW}W zVyeO@s$P02a?{=Nj+8CPDMvRDIMh){KAh7X8hTiy6lZ<>t37t+rw9@jwOo^S4IKn~ z8HEWzrTBfL-m5!0R#dlHUS-s7yryJ+OkM$_rQ87ew&;RJ!V%@da}yA^MpCL-)!_S} zsP*pdnC`-E!)*tSH<>9H$+s>zNRSLNb4j??l1&6;Fd*})i}Xz%kGDWj01g%P6F3z$ zjp62OK88bL@taHUYhXNWlR^QkL_sMYFDNJ|;r;X1wh4P788>)LyM8+PPIi=PQwq3$ zjRcE%M0h2PiJJ-8J0et56(j4-WX>cS_kSc|>4E3$Q+K|6;(y@(yD(j{UD8G*;jN@3lQKo;F*c;hpE>b%pHwAeS z6G=$`P11PZX1ROgo90SkEp%4a&G%wvRjUfQg7NW~t{CHJYGpj@)DOd7b(|3kw9y#V vl$9mfz^6lIZl8w7{s*7ak+HM~N^`8k3vElUFXa9IeL|}!ypgY#GY|a_w<$tV literal 0 HcmV?d00001 diff --git a/B4A/Files/detalle_promo.bal b/B4A/Files/detalle_promo.bal new file mode 100644 index 0000000000000000000000000000000000000000..0376a1dc97546bf6d3949936befce3aa2ab7df1f GIT binary patch literal 2747 zcmcIlOK%%h6dsc}V46}MEre%X9wBX06Q?{2rEy~?F}O}~Od_$Mz42Vf1CtqR=Gq}$ zRbqn*NR=ufw(MELf(2~4YLp$USiwIiJ9gpw&UnT#brC{hqtGDJidxrh{vfRad!}@3$`ClAS#|VQUV_9@ z&y$s;jlgC%5s=1x%so#U?Q@0LPtGng&J3)T->fEP4j$Hr4`t18( zZf19mTsu&^ar)=k8{ho;?cp!J96wQ+9yiwtS2hp+U`>4e)#QhWTgKr2jj+Dm)=vQy z*H!2=az!0F8=ekw7qn3^lg!w_Zy3D~!KOTCQyItiik(1ynYGXt;v$1jsR%LDvZ#q`*zPDsYr%W*ExVO~bA+ew&N8cua3gQI zr9(fe9z{Bn?N-4>XK$h&q?OfYR_I#|vfXmS_d>dbIFPF=j;G0DXtrIcWOccAp-_>F zpg%E>z*NKqab2CYb=Fnci-EuCGeHBh)RcwfrD>{$CRxSOLgD>NoqKeXR1QI!FIDTM z+NIS}tzMolRLJJ+6I?LlMn*5oov+T+5dWAq-07z3xF(iass1(ln~_<^j~naWOKxeo zR{mhQS}#qDOd`z`6T8!71X2 z?uk7MLH16vNg}}_|A*G-3809llR(1LG(exHQ?WW}7AXEhv*ftyB~1IeW(H!OdiKRE z2KKmII8DvVn3BA+5K?4TSY&>}A{+G;3|TIX#(;x#z6wp+dW~MMV@lY4gPJp#-o%jR z6TZ2@TQr@;^ftjcObKuMDsUV6eg&9H5K fyzPBPnUFBb0KzEkSq#ZOInNMA;nU-m$g=(dL*mPu literal 0 HcmV?d00001 diff --git a/B4A/Files/detalleventa.bal b/B4A/Files/detalleventa.bal new file mode 100644 index 0000000000000000000000000000000000000000..d51144d525b4a6b3dde419ed1c62b3b2d47bc64b GIT binary patch literal 9210 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 WYu1j5q^yntPQysgOt(e{8~s1dX4$;} literal 0 HcmV?d00001 diff --git a/B4A/Files/durakelo1.png b/B4A/Files/durakelo1.png new file mode 100644 index 0000000000000000000000000000000000000000..00cb4343cd75a44401cfac77698d76428ce8d9a7 GIT binary patch literal 5896 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 Qw*UYD07*qoM6N<$f=O%2DF6Tf literal 0 HcmV?d00001 diff --git a/B4A/Files/folioabono.bal b/B4A/Files/folioabono.bal new file mode 100644 index 0000000000000000000000000000000000000000..9f9617f8394e9a445011bfeae6bf5c13e21adda0 GIT binary patch literal 3404 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 N002ovPDHLkV1l*Gg!=#h literal 0 HcmV?d00001 diff --git a/B4A/Files/foto.bal b/B4A/Files/foto.bal new file mode 100644 index 0000000000000000000000000000000000000000..9cf56b7898176bebdfe18f262a558152e1d05adb GIT binary patch literal 2561 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/frontal1.png b/B4A/Files/frontal1.png new file mode 100644 index 0000000000000000000000000000000000000000..5ed81e390e95a28ee555dd3963b9506c1a4433c6 GIT binary patch literal 7491 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/guardagestion.bal b/B4A/Files/guardagestion.bal new file mode 100644 index 0000000000000000000000000000000000000000..9156db1bbad1251a33df7a9a366da2b7e944f8ef GIT binary patch literal 13086 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/guna_viejo.png b/B4A/Files/guna_viejo.png new file mode 100644 index 0000000000000000000000000000000000000000..a0c3190d89de628813950f908de2b6727367808a GIT binary patch literal 20988 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 RELZ>l002ovPDHLkV1gG_=_~*M literal 0 HcmV?d00001 diff --git a/B4A/Files/historico.bal b/B4A/Files/historico.bal new file mode 100644 index 0000000000000000000000000000000000000000..929cd7583e83376ca882e9c818dc26ca6ac7ba77 GIT binary patch literal 7732 zcmeHMU2Ggz6`qZ~PBu-;Pk_)u13XniT6_WYBb9ZKT zoOK*0fxNKNxpVHh_nv#scg{U?$4+XRc43pIZN>9`&=ydp;+sv=Klg6%13_oj)$4V` z-3-}WdCqZN{XPzlH+Ym0e@OH9XyAuVOXJb)#xlo%eEGw&D5C;wjTu zYOUp*NJvfjayBzvx|g%_`kZ04CMG$=K26D&ONCMG|AkP@D>S zEtPaS5OsmKnnU;CQ7_kB)2^6x-4ZKibUS8+^nsl=BioitzhOBIrRqoyV`jA^BxdU-QLE(5B&Q<9{}xW<39*K&;wR`3DkR@ zR?x=%U-{YAO@rHVjo*E5`BJ+7YNhW>Z+-s7H(#6Y-~QHR<7@Z#?i+o*@Pm_GU#$N% zwR!RFC%=4YVMl4~`+xcNcXy7w@~d-uzw_XxpI-Xb#fyX6kMzvG@(p{_jy=B_+jen( zCcA4_=1lLEm%9G6XaCRr;b9XM|IdXS=o*vGt1c}s|N+g#Lr z)3GNSt~}{=)zz2uIm_7HLHR^$Y#{4cjvMrd=0LD4KEwdxY*Yw2|n+6!x0B4wvzLDH>y zO;_42v+kLn6QHLH(>Y?GDg*bMcWghiWO$B>AG@4PlxrCaDZPk@Fjup==~Av(o-7on zP8X(8;A9uJK^3W#moUAe5ee&XRq{3;78-494?5jq>r7_%UcaA@h30 zpuZEjqnVTW5>++B?O9z~+n>r6OH-Ytgvr}c|?!ovV{hHT3A6e>HR!-$K zRS(gYRw<|5On%}vT__$`n-8Q;RZCk@j1D?iCLkjRcV%9)3DqUn^0(fg_MJB$caxa;r8_@@h=k>+9Weg9fAq%gwCSGSe>JxZb2Nj1|(&|sj!DF$SvOU<6 zSzY}YXU3)wRUYQYDcW7pEvlZu>)SJ`k~;+2!};}T7T-q7>>#?_`9#fGQo$Wx{n96{ zhaW)G30HMzxc)xz(GK&2qdaf|#nK=Sl%OCHsi-W=C~XVoGd5MzlR6s6h(N2fwu|b@ z>p;ZhY+ZSzMyOFH(0HL(%oOR`5k@V#@DRsh>+-{4O?zQ<49uIVqow#{KBj`}K;o+q zF<&XrQq(Tv+>zRPRwxFE2JY6gf*)&&NEodYW58cGp-d*|UW$J6;3egTkWBE7AiMH{ zAfvn`q=IXLFuWtASOgico|V7-YlYw@6RZGT528s_(eRWA(;G19faxOx()t62o$g&| zx<0~&-PA*9#L3-YBH#A};+ypy^R@1W(Qtv*<~#EzG$oBrVi}Dfz%4^h1PV^x3)&`l z5H_A2!6WoEbVuPKj#Fg>3_1!JGBW-&fJmd0H~?QmYeG$&w;GszkO?r4fLQ|=))i=8 zJ3A1yHL_y>t5T1mX@lwjx_qUIze8Yv<#J}2k`Xka-Dz|Z#7j`5eS+diFpq&`xxh(< z5u60~ASkIF;;h4HLUfN%!fbmS)U#6k`rCpxI@-rTsVC4pN#-duA#QCEU@}G#$e|Z1 zkO;g6Ng9-3j)b0snjnCSorBdZVN zMRg?@!BA*!8XZaM_?3W|#1A7C#!dPM)Mg^&&nIW{ljO$B)IGuGLInAWiY8{ z(deL_l`mX=XO5Bz8rq-46l@-9it_vh1%ONFWmEtt;jg<>j13H|j`6c=UHfR1#F&1E zwILp3D%=ZFpLzT)34OX@u!)%pHa@H*R^07Yf=%y50V|CJJG_BE14R2E6=3@V2G3TA z=fSBEFMwmLQarN}@Ma)B1LiD9&5p%Gz8qIDwgnVbW^`JC3BDYuHvV@73z7~R*HZLr zbLTx+k+@#b;>Hx6SN|L7pa^<8CytGQ)rr&kUbwzEu--}H5KT!O1}L65R2WYj2a;s_ zXYDZv!n!M84RuIV*5Hpd67)le?X6_ZtI#A0{s9G&H5VXBgVrq(&tcO4vj%77UI4*g qw=|u~jf;`n$eLv=k7o@PZa8Z^EV?sUvlW_dF>A201yr2VwEqCbZKiPm literal 0 HcmV?d00001 diff --git a/B4A/Files/images.png b/B4A/Files/images.png new file mode 100644 index 0000000000000000000000000000000000000000..d21dd9dc222e12e05448a016a64cc97de4387632 GIT binary patch literal 4960 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/infonavit1.jpg b/B4A/Files/infonavit1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b8cce4c0421c69dfd07a7b13d4487ef5edeb186c GIT binary patch literal 30576 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 HXXZZu3mh}r literal 0 HcmV?d00001 diff --git a/B4A/Files/intmex_logo_192x192.jpg b/B4A/Files/intmex_logo_192x192.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8b31f85f5dadea1d98ef113e953bef47049ab213 GIT binary patch literal 8284 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 JfOY@--vBL-39SGC literal 0 HcmV?d00001 diff --git a/B4A/Files/intmex_logo_192x192.png b/B4A/Files/intmex_logo_192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..8b31f85f5dadea1d98ef113e953bef47049ab213 GIT binary patch literal 8284 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 JfOY@--vBL-39SGC literal 0 HcmV?d00001 diff --git a/B4A/Files/inventarios.jpg b/B4A/Files/inventarios.jpg new file mode 100644 index 0000000000000000000000000000000000000000..50fdc17dd29f16c45a9d7e8c2c014184ce152479 GIT binary patch literal 5639 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 O1Rz)_JcJu`uJk_%E5)_| literal 0 HcmV?d00001 diff --git a/B4A/Files/itembuttonblue.png b/B4A/Files/itembuttonblue.png new file mode 100644 index 0000000000000000000000000000000000000000..af4dc0b6e6fb333c43e978d6194936f4a8c52d92 GIT binary patch literal 2647 zcmb_edo+~m8h@oi8KbKyF;P2_E_R)bq=_LpGOn{lcH^4Z&DfO&k&%#FS$kKMM4bw; z45Kv1Wl-8FijhksB$vr0Gn&DSnfbo+PHSbIy;`k({y2Zk%scPz{XLi8`#jJ0B|DSs zFiX}h0RUj^57@W@umFMUHr2)OTk>2h0{*D|cEIx#0NXYwK1vby2z0o)Cd~Fwm|N)4 zuyEg#fxs#t)Gu(oJ=HfT&^6FEAo9eEz&(&SWN%~T9`SafmvB5gNT+U!7uj;+kL4~K z+;O<&m;Y&e;FXV>9(h;Nx!cO!IJIRIFO{@{=?*Znr-3h0PBMoRwp558Mq;BtA?z?Kk32)B?I}>+?Y4S~n?rD4Vfs#!wsaW2& zgJ(n3qcjn7F;U&a&m}s4jB2e6fQ711@{l`uH({oKF8yw;2k*nt!vh3K^TaN&`nN0A|vw zr4)LTgDHdp8U{l1@o=xAOvZbs?Y5mTPWy9lD_Zjr8a~V1OqwB$?y2YMpt3Pb!#T!y zay0-u^mAB3LUcoI5+k=uUSl+wbT%MN9Fxvtf z%^-IDv%?JU6{0U6y75d2fQy&VH>tS#ru}gJ>S`9+lVAeCKA{=|fMfqQdK#+wWuc$A z!In&~P9#8UmPk?I+MUquF=knzmu*3#zk+-5XR|?g-54!m-;@fB&`GQe>Xbgl3@A1| zmOv|JxOhlc*xLs&@B|NlCTzjFBb%$Jic_z!sD)xv11SD|g<}QKnu54q2E8bduNJmcXxSB67ESZ;xD)NlR1rQjixjVliF&0T$`)p-2+J@Zasi^bv_j_a}oD(^iL zR#~<XxxHue*KUOE-`i?2?OTmGD;Dlj)NR{~;aar6nh>O=s(m(laK_k~9EN`J&Q) zU)7gHyNU$qEWsZ+uv$fe?J4yQiYr;Gi|mI(_V2ZtSN{9ie;=7Af1}tu@)xqAF6WWb z^rxL?71>}+_agVYP5dEtR64=yucS5nf6BE-4aHUFK^Yve=rE~gCG67C0SX;|eF1DY za)roDR;3VVZPA0}NFeWaFzg^=akjuP<)nF7RkH+E%8JucZ8;}X=Qu*# zw~I(3(J$lWG3fd09Z_5RFgGuGNMQT9TyYW@YaAcxuZ*BMiYXX*ko2en7SXXri_b#1 zb?VsE%$P&Ordo=`zLm1*f^@Txrh($wWe{L+Fvp4CaxjvD{sVpV^tAEy1HZ zXk+kUbs-~TGLa+|P6y3-M28QTOI0pX1(N3Y2L9*iMgf7U_pt4UG>)d%;EDl(Sc|yI zs|LQJlpb!p$0a?+XYdouWV(EfRAl151=0p8DeW8tvHoi3Dh z02FKx3x!lIJ}s;y-Bpwu^L9H8hxDYNz1-c|NS>}^!LJ#%z8U3dWz&m@1y%>qN7Ut@ z?l%dhA|rDoDxaD&Fc@aeLDV>hm!Rhs?Td-4Ye~cVFpN@(!M=>=>q9)ddp6#uUiryB zWam%xmzo-}viM%wtjkBbZoCnmwc!FtqJ7fyy)&hJ=R z?x$L`GmmN^Q&|lp%VKxRo3PP3uoB;R+h+=In7?(45@S78vq>KLuZL~WGi=VtI2Jy3 zR1vnTpucO*-wNKoC E01Tvq<^TWy literal 0 HcmV?d00001 diff --git a/B4A/Files/izquierda.png b/B4A/Files/izquierda.png new file mode 100644 index 0000000000000000000000000000000000000000..bb268dc798221809fc180aca37b487871257414f GIT binary patch literal 8613 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/izquierda1.png b/B4A/Files/izquierda1.png new file mode 100644 index 0000000000000000000000000000000000000000..20b153413bf82b7c6cc3cb8494d2234cfdaa806c GIT binary patch literal 6486 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 My!yKeka@^|064~V1^@s6 literal 0 HcmV?d00001 diff --git a/B4A/Files/kelloggs.png b/B4A/Files/kelloggs.png new file mode 100644 index 0000000000000000000000000000000000000000..4debf15bad095c8d26059c74de12ca143916e922 GIT binary patch literal 4718 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