From b067d11010b84d315bcd3a9db646fd2c7b9f1a0a Mon Sep 17 00:00:00 2001 From: cvaldes1201 Date: Wed, 10 Jul 2024 10:41:10 -0600 Subject: [PATCH] Intmex multiventa --- .gitignore | 2 + .ttxfolder | 3 + B4A/B4XMainPage.bas | 756 +++++++++ B4A/BatteryUtilities.bas | 126 ++ B4A/C_Cliente.bas | 1609 ++++++++++++++++++ B4A/C_Clientes.bas | 443 +++++ B4A/C_Cuestionario.bas | 179 ++ B4A/C_Historico.bas | 123 ++ B4A/C_MapaRutas.bas | 263 +++ B4A/C_Mapas.bas | 24 + B4A/C_NoVenta.bas | 178 ++ B4A/C_Nota.bas | 297 ++++ B4A/C_NuevoCliente.bas | 115 ++ B4A/C_Pedidos.bas | 584 +++++++ B4A/C_Principal.bas | 2617 +++++++++++++++++++++++++++++ B4A/C_Productos.bas | 1164 +++++++++++++ B4A/C_Promos.bas | 607 +++++++ B4A/C_RespaldoDiario.bas | 148 ++ B4A/C_Subs.bas | 608 +++++++ B4A/C_TicketsDia.bas | 164 ++ B4A/C_UpdateAvailable.bas | 73 + B4A/DBRequestManager.bas | 274 +++ B4A/EscPosPrinter.bas | 1158 +++++++++++++ B4A/FileHandler.bas | 163 ++ B4A/Files/alert2.png | Bin 0 -> 632 bytes B4A/Files/alerta_amarilla.png | Bin 0 -> 62562 bytes B4A/Files/anterior.jpg | Bin 0 -> 19358 bytes B4A/Files/carrito.png | Bin 0 -> 22596 bytes B4A/Files/celltitle.bal | Bin 0 -> 1638 bytes B4A/Files/cliente.bal | Bin 0 -> 35459 bytes B4A/Files/clientes.bal | Bin 0 -> 6747 bytes B4A/Files/datoscliente.bal | Bin 0 -> 3267 bytes B4A/Files/durakelo.png | Bin 0 -> 7098 bytes B4A/Files/engrane.jpg | Bin 0 -> 4132 bytes B4A/Files/engrane_gris.png | Bin 0 -> 12656 bytes B4A/Files/folioabono.bal | Bin 0 -> 2431 bytes B4A/Files/fondo_kmt.jpg | Bin 0 -> 33689 bytes B4A/Files/hacer pedido.jpg | Bin 0 -> 609560 bytes B4A/Files/intmex_logo_192x192.jpg | Bin 0 -> 8284 bytes B4A/Files/itembuttonblue.png | Bin 0 -> 2647 bytes B4A/Files/kmt.db | Bin 0 -> 46080 bytes B4A/Files/login.bal | Bin 0 -> 12069 bytes B4A/Files/logo_192x192.jpg | Bin 0 -> 4238 bytes B4A/Files/mainpage.bal | Bin 0 -> 1584 bytes B4A/Files/malo.jpg | Bin 0 -> 8764 bytes B4A/Files/mapa_rutas.bal | Bin 0 -> 5796 bytes B4A/Files/nota.bal | Bin 0 -> 7334 bytes B4A/Files/noventa.bal | Bin 0 -> 6118 bytes B4A/Files/nuevocliente.bal | Bin 0 -> 4443 bytes B4A/Files/nvo cliente.jpg | Bin 0 -> 592665 bytes B4A/Files/palomita_verde.png | Bin 0 -> 159519 bytes B4A/Files/pedido.bal | Bin 0 -> 11748 bytes B4A/Files/planfia_logo.png | Bin 0 -> 225383 bytes B4A/Files/principal.bal | Bin 0 -> 47239 bytes B4A/Files/proditem.bal | Bin 0 -> 5141 bytes B4A/Files/proditem2.bal | Bin 0 -> 5145 bytes B4A/Files/productos.bal | Bin 0 -> 16182 bytes B4A/Files/promociones.bal | Bin 0 -> 10725 bytes B4A/Files/resdia.bal | Bin 0 -> 42321 bytes B4A/Files/resdia.jpg | Bin 0 -> 609996 bytes B4A/Files/salma.jpg | Bin 0 -> 7839 bytes B4A/Files/salma.png | Bin 0 -> 20988 bytes B4A/Files/scrollpromos.bal | Bin 0 -> 1366 bytes B4A/Files/senial.jpg | Bin 0 -> 40104 bytes B4A/Files/sync.png | Bin 0 -> 763 bytes B4A/Files/tache_rojo.png | Bin 0 -> 254546 bytes B4A/Files/ticket dia.jpg | Bin 0 -> 588975 bytes B4A/Files/ticketsdia.bal | Bin 0 -> 2656 bytes B4A/Files/tiendita.jpg | Bin 0 -> 9042 bytes B4A/Files/verde.png | Bin 0 -> 7665 bytes B4A/FirebaseMessaging.bas | 226 +++ B4A/INTMEX.b4a | 233 +++ B4A/INTMEX.b4a.meta | 93 + B4A/MAPA_RUTAS.bas | 347 ++++ B4A/ManageExternalStorage.bas | 79 + B4A/NotificationService.bas | 218 +++ B4A/Pendientes.bas | 16 + B4A/Starter.bas | 131 ++ B4A/Subs.bas | 1473 ++++++++++++++++ B4A/Tracker.bas | 298 ++++ B4A/appUpdater.bas | 286 ++++ B4A/google-services.json | 126 ++ B4A/test.bas | 66 + B4A/updateAvailable.bas | 24 + INTMEX_LL.lnk | Bin 0 -> 1067 bytes gitpull.bat | 1 + 86 files changed, 15295 insertions(+) create mode 100644 .gitignore create mode 100644 .ttxfolder create mode 100644 B4A/B4XMainPage.bas create mode 100644 B4A/BatteryUtilities.bas create mode 100644 B4A/C_Cliente.bas create mode 100644 B4A/C_Clientes.bas create mode 100644 B4A/C_Cuestionario.bas create mode 100644 B4A/C_Historico.bas create mode 100644 B4A/C_MapaRutas.bas create mode 100644 B4A/C_Mapas.bas create mode 100644 B4A/C_NoVenta.bas create mode 100644 B4A/C_Nota.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_Promos.bas create mode 100644 B4A/C_RespaldoDiario.bas create mode 100644 B4A/C_Subs.bas create mode 100644 B4A/C_TicketsDia.bas create mode 100644 B4A/C_UpdateAvailable.bas create mode 100644 B4A/DBRequestManager.bas create mode 100644 B4A/EscPosPrinter.bas create mode 100644 B4A/FileHandler.bas create mode 100644 B4A/Files/alert2.png create mode 100644 B4A/Files/alerta_amarilla.png create mode 100644 B4A/Files/anterior.jpg create mode 100644 B4A/Files/carrito.png create mode 100644 B4A/Files/celltitle.bal create mode 100644 B4A/Files/cliente.bal create mode 100644 B4A/Files/clientes.bal create mode 100644 B4A/Files/datoscliente.bal create mode 100644 B4A/Files/durakelo.png create mode 100644 B4A/Files/engrane.jpg create mode 100644 B4A/Files/engrane_gris.png create mode 100644 B4A/Files/folioabono.bal create mode 100644 B4A/Files/fondo_kmt.jpg create mode 100644 B4A/Files/hacer pedido.jpg create mode 100644 B4A/Files/intmex_logo_192x192.jpg create mode 100644 B4A/Files/itembuttonblue.png create mode 100644 B4A/Files/kmt.db create mode 100644 B4A/Files/login.bal create mode 100644 B4A/Files/logo_192x192.jpg create mode 100644 B4A/Files/mainpage.bal create mode 100644 B4A/Files/malo.jpg create mode 100644 B4A/Files/mapa_rutas.bal create mode 100644 B4A/Files/nota.bal create mode 100644 B4A/Files/noventa.bal create mode 100644 B4A/Files/nuevocliente.bal create mode 100644 B4A/Files/nvo cliente.jpg create mode 100644 B4A/Files/palomita_verde.png create mode 100644 B4A/Files/pedido.bal create mode 100644 B4A/Files/planfia_logo.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/promociones.bal create mode 100644 B4A/Files/resdia.bal create mode 100644 B4A/Files/resdia.jpg create mode 100644 B4A/Files/salma.jpg create mode 100644 B4A/Files/salma.png create mode 100644 B4A/Files/scrollpromos.bal create mode 100644 B4A/Files/senial.jpg create mode 100644 B4A/Files/sync.png create mode 100644 B4A/Files/tache_rojo.png create mode 100644 B4A/Files/ticket dia.jpg create mode 100644 B4A/Files/ticketsdia.bal create mode 100644 B4A/Files/tiendita.jpg create mode 100644 B4A/Files/verde.png create mode 100644 B4A/FirebaseMessaging.bas create mode 100644 B4A/INTMEX.b4a create mode 100644 B4A/INTMEX.b4a.meta create mode 100644 B4A/MAPA_RUTAS.bas create mode 100644 B4A/ManageExternalStorage.bas create mode 100644 B4A/NotificationService.bas create mode 100644 B4A/Pendientes.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/google-services.json create mode 100644 B4A/test.bas create mode 100644 B4A/updateAvailable.bas create mode 100644 INTMEX_LL.lnk create mode 100644 gitpull.bat diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..af94e9d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +**/Objects +**/AutoBackups \ No newline at end of file diff --git a/.ttxfolder b/.ttxfolder new file mode 100644 index 0000000..d52a0e8 --- /dev/null +++ b/.ttxfolder @@ -0,0 +1,3 @@ +#Folder properties -- MetaCtrl +#Fri Jul 08 00:22:52 CDT 2022 +folderid=181dc42c795 diff --git a/B4A/B4XMainPage.bas b/B4A/B4XMainPage.bas new file mode 100644 index 0000000..e4c112a --- /dev/null +++ b/B4A/B4XMainPage.bas @@ -0,0 +1,756 @@ +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 + 'Ctrl + click to export as zip: ide://run?File=%B4X%\Zipper.jar&Args=Project.zip + '########################################################################################################### + '###################### 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 ide://run?file=%WINDIR%\System32\cmd.exe&Args=/c&Args=github&Args=..\..\ + +Sub Class_Globals + Private Root As B4XView + Private xui As XUI + Dim s As C_Subs + Public login As B4XMainPage + Public principal As C_Principal + Public clientes As C_Clientes + Public cliente As C_Cliente + 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 nota As C_Nota + Public pedidos As C_Pedidos + Public promos As C_Promos + Public historico As C_Historico + Public Provider As FileProvider + + 'nuevocliente -> NuevoCliente + 'buscar -> ticketsDia + 'colonia -> clientes + 'nopago -> noVenta + 'tarjeta -> Nota + 'fila -> Cliente + 'colonia2 -> Productos + + 'xxxxxxxxxxxxxxxxxxxxxxxxx + + Dim reqManager As DBRequestManager + Dim v As String = Application.VersionName + Dim ruta As String + Dim tgl As Toggle + Dim lat_gps, lon_gps As String + Dim usuario As String + Dim batt As Int + Dim skmt As SQL + Dim montoActual, clientesTotal, clientesVenta, clientesVisitados,almacen, rutaPreventa As String + Dim DBReqServer, fechaRuta As String + Dim Logger As Boolean + Dim mac_impresora As String + Dim Phn As PhoneId + + 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 = "" + Dim alterno As String + Private b_menu As Button + Dim PopupMenu As RSPopupMenu + Dim cmd As DBCommand + Private PDF As Button + Private bpv1 As BatteryProgressView + Dim batterystatus(11) As Int + Private bu As BatteryUtilities + Private b_apk As Button + Private i_engrane As ImageView + Private p_Main As Panel + Private p_appUpdate As Panel + Private b_regesar As Button + Private l_version As Label + Private ImageView1 As ImageView + Private Label2 As Label + Private Entrar As Button + Dim tipo_venta As String + Dim bTerminarClicked As Boolean = False + Private lv_server As ListView + Private l_server As Label + Private b_enviarbd As Button + Private b_importarBD As Button + Dim ime As IME + Dim MES1 As ManageExternalStorage + Dim device As Phone + Private et_server As EditText + Private b_guardar As Button +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) + B4XPages.GetManager.LogEvents = True + Root = Root1 + Root.LoadLayout("login") + s.Initialize(Me, "Subs") + B4XPages.SetTitle(Me, "Intmex Preventa") + login.Initialize + B4XPages.AddPage("Login", login) + principal.Initialize + B4XPages.AddPage("Principal", principal) + clientes.Initialize + B4XPages.AddPage("Clientes", clientes) + cliente.Initialize + B4XPages.AddPage("Cliente", cliente) + 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) + nota.Initialize + B4XPages.AddPage("Nota", nota) + pedidos.Initialize + B4XPages.AddPage("Pedidos", pedidos) + promos.Initialize + B4XPages.AddPage("Promos", promos) + historico.Initialize + B4XPages.AddPage("Historico", historico) +' respaldoDiario.Initialize +' B4XPages.AddPageAndCreate("respaldoDiario", respaldoDiario) + ruta = Starter.ruta + Provider.Initialize +' Subs.borraArribaDe100Errores ' Para Websockets +' Subs.borraArribaDe600RenglonesBitacora ' Para Websockets + If File.Exists(ruta, "kmt.db") = False Then + File.Copy(File.DirAssets, "kmt.db", ruta, "kmt.db") + LogColor("copiamos kmt.db de "&File.DirAssets & " a " & ruta,Colors.Green) + End If + +' Log(ruta) + skmt.Initialize(ruta,"kmt.db", True) + Subs.guardaAppInfo(skmt) + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_CUOTAS (HC_META6 TEXT, HC_META5 TEXT, HC_META4 TEXT, HC_META3 TEXT, HC_META2 TEXT, HC_META1 TEXT, HC_RUTA TEXT, HC_CUOTA1 TEXT, HC_CUOTA2 TEXT, HC_CUOTA3 TEXT, HC_CUOTA4 TEXT, HC_CUOTA5 TEXT, HC_CUOTA6 TEXT)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_GPS (HGDATE TEXT, HGLAT TEXT, HGLON TEXT)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CAT_GUNAPROD2 (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)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_STAY_STORE (HSS_CODIGO TEXT, HSS_IN TEXT, HSS_OUT TEXT, HSS_TOT TEXT)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_STAY_OUT (HSO_INI TEXT, HSO_FIN TEXT)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS INVENT_X_ENVIAR (ALMACEN TEXT, PROID TEXT, CANTIDAD TEXT)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_RESUM_APK (HIST_RA_OBJMES TEXT, HIST_RA_VENTA TEXT, HIST_RA_TENDENCIA TEXT, HIST_RA_ALCANCE TEXT, HISR_RA_DRAOBJ TEXT, HIST_RA_DRAVTA TEXT, HIST_RA_DSOBJ TEXT, HIST_RA_DSVTA TEXT, HIST_RA_VPOOBJ TEXT, HIST_RA_VPOVTA TEXT, HIST_RA_COBCCC TEXT, HIST_RA_CTES TEXT, HIST_RA_ECO TEXT, HIST_RA_VISITPLAN TEXT, HIST_RA_VISIREAL TEXT, HIST_RA_COBVISIT TEXT, HIST_RA_FRECCOMPOBJ TEXT, HIST_RA_FRECCOMREAL TEXT, HIST_RA_VENTAMES1 TEXT, HIST_RA_VENTAMES2 TEXT, HIST_RA_VENTAMES3 TEXT, HIST_RA_VENTAMES4 TEXT, HIST_RA_RECHAZO TEXT, HIST_RA_RECHAZOPORCEN TEXT, HIST_RA_SEMANA1 TEXT, HIST_RA_SEMANA1_DIAS TEXT, HIST_RA_SEMANA1_DRA TEXT, HIST_RA_SEMANA2 TEXT, HIST_RA_SEMANA2_DIAS TEXT, HIST_RA_SEMANA2_DRA TEXT, HIST_RA_SEMANA3 TEXT, HIST_RA_SEMANA3_DIAS TEXT, HIST_RA_SEMANA4 TEXT, HIST_RA_SEMANA3_DRA TEXT, HIST_RA_SEMANA4_DIAS TEXT, HIST_RA_SEMANA4_DRA TEXT, HIST_RA_SEMANA5 TEXT, HIST_RA_SEMANA5_DIAS TEXT, HIST_RA_SEMANA5_DRA TEXT, HIST_RA_SEMANA1_LPT TEXT, HIST_RA_SEMANA2_LPT TEXT, HIST_RA_SEMANA3_LPT TEXT, HIST_RA_SEMANA4_LPT TEXT, HIST_RA_SEMANA5_LPT TEXT, HIST_RA_RUTA TEXT, HIST_RA_IDALMACEN TEXT)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_COMISIONES_MOVIL (HCM_IDALMACEN TEXT, HCM_RUTA TEXT, HCM_TOTAL_V TEXT, HCM_TOTAL_VIVE TEXT, HCM_TOTAL_GUNA TEXT, HCM_TOTAL_BEB TEXT)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_GEOCERCA (HGCLIENTE TEXT, HGDATE TEXT, HGLAT TEXT, HGLON TEXT)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_FACE (HFCLIENTE TEXT, HFALIAS TEXT, HFRUTA TEXT, HFALMACEN TEXT)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS RUTA_GPS(FECHA INTEGER, LAT TEXT, LON TEXT)") + skmt.ExecNonQuery("CREATE VIEW IF NOT EXISTS CATALOGO AS Select CAT_GP_CLASIF, CAT_GP_ID FROM CAT_GUNAPROD UNION Select CAT_GP_CLASIF, CAT_GP_ID FROM CAT_GUNAPROD GROUP BY CAT_GP_CLASIF, CAT_GP_ID") + skmt.ExecNonQuery("CREATE VIEW IF NOT EXISTS total_marcas AS Select cat_gp_clasif, sum(pe_costo_tot) As total from CATALOGO, pedido where pe_proid = cat_gp_id And pe_cliente <> 0 group by cat_gp_clasif") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_MARCAS_CUOTAS ( HMC_MARCA TEXT, HMC_TOTAL TEXT)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_CODIGO_BARRAS(CODIGOKMTS TEXT, CODIGOB TEXT, LAT TEXT, LON TEXT)") + 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)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS COORDENADAS_GPS (tienda_id TEXT, ruta TEXT, almacen TEXT, latitud TEXT, longitud TEXT, fecha TEXT)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_CUESTIONARIO (HC_CLIENTE TEXT)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS NOVENTA (NV_CLIENTE TEXT, NV_FECHA TEXT, NV_USER TEXT, NV_MOTIVO TEXT, NV_COMM TEXT, NV_LAT TEXT, NV_LON TEXT)") + Subs.agregaColumna("PEDIDO", "PE_ENVIO_OK", "INT") + Subs.agregaColumna("NOVENTA", "NV_ENVIO_OK", "INT") + c=skmt.ExecQuery("select COUNT(*) AS CUANTOS from HIST_STAY_OUT ") + C.Position = 0 + If c.GetString("CUANTOS") = 0 Then + skmt.ExecNonQuery("INSERT INTO HIST_STAY_OUT(HSO_INI, HSO_FIN) VALUES (0,0)") + End If + C.Close +' server = "http://keymon.com.mx:1782" + 'server = "http://201.99.139.28:1783" +' reqManager.Initialize(Me, DBReqServer) + l_version.Text = Application.VersionName + 'este codigo es para lo del menu +' PopupMenu.Initialize("PopupMenu", b_menu) +' PopupMenu.AddMenuItem(0, 0, "View") +' PopupMenu.AddMenuItem(1, 1, "Edit") +' PopupMenu.AddMenuItem(2, 2, "Details") +' PopupMenu.AddMenuItem(3, 3, "Remove") + ' menu fin + montoActual = 0 + clientesTotal = 0 + clientesVenta = 0 + clientesVisitados = 0 + almacen = 0 + rutaPreventa = 0 + p_appUpdate.Visible = False + + LogColor("Revisa permisos Phone_State", Colors.Green) + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) + If Result Then + Log("Con permisos de ubicacion") + Else + Log("SIN permisos de ubicacion") + End If + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_ACCESS_COARSE_LOCATION) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) + If Result Then + Log("Con permisos de ubicacion") + Else + Log("SIN permisos de ubicacion") + End If + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_READ_PHONE_STATE) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) + If Result Then +' IMEN.Text = Phn.GetDeviceId +' IMEI = Phn.GetDeviceId +' LogColor($"////////////////// IMEI: ${IMEI} ////////////////// "$, Colors.Blue) +' IMEI="" 'Pruebas + End If +' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION) +' Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) +' If Result Then +' StartService(Tracker) +'' Log("Start Tracker") +' Else +' ToastMessageShow("No permission", 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("This app requires access to all files, please enable the option", "Manage All Files") + Wait For Msgbox_Result(Res As Int) +' Log("Getting permission") + MES1.GetPermission + Wait For MES_StorageAvailable + End If + End If +End Sub + +Sub B4XPage_Appear + If Starter.muestraProgreso = 1 Then + muestraProgreso("Descargando actualización") + Starter.muestraProgreso = 0 + End If + Dim ph As Phone 'Get Id Device + Dim DeviceID As String = ph.GetSettings("android_id").ToUpperCase + LogColor($"////////////////// DeviceID: ${DeviceID} ////////////////// "$, Colors.Blue) + DBReqServer = Starter.DBReqServer + reqManager.Initialize(Me, Starter.DBReqServer) + Log("|"&Starter.DBReqServer&"|") + tgl.Initialize() + If Not(Starter.gps.GPSEnabled) Then + ToastMessageShow("Es necesario tener el GPS encendido", True) + Sleep(500) + StartActivity(Starter.gps.LocationSettingsIntent) + End If + c=skmt.ExecQuery2("select count(*) as CUANTOS from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("FECHA")) + c.Position = 0 + If c.GetString("CUANTOS") = 0 Then + LogColor($"No hay fecha: ${c.GetString("CUANTOS")}"$, Colors.Red) + cmd.Initialize + cmd.Name = "select_fecha" + reqManager.ExecuteQuery(cmd , 0, "fecha") + Msgbox("AJUSTAR FECHA","AVISO") 'Ignore + B4XPage_Appear + Else +' LogColor($"Si hay fecha: ${c.GetString("CUANTOS")}"$, Colors.Green) + c=skmt.ExecQuery2("select CAT_VA_VALOR from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("FECHA")) + c.Position =0 + Dim sDate, sTime As String + DateTime.DateFormat = "yyyyMMdd" + sDate=DateTime.Date(DateTime.Now) +' If sDate > "20220701" Then +' Msgbox("INSTALAR NUEVO APK" ,"AVISO") 'Ignore +' B4XPage_Appear +' End If + If c.GetString("CAT_VA_VALOR") > sDate Then + Msgbox("AJUSTAR LA FECHA YA QUE ES MENOR AL SISTEMA" ,"AVISO") 'Ignore + B4XPage_Appear + End If + End If + bu.Initialize + batterystatus = bu.BatteryInformation + 'Obtenemos el usuario registrado +' CallSubDelayed(FirebaseMessaging, "SubscribeToTopics") + dameUsuario +' If Not(s.CheckNotificationAccess) Then +' Msgbox2Async($"Se necesita acceso a las notificaciones, haga clic en "Aceptar" y en la siguiente pantalla permita el acceso a la aplicación "${Application.LabelName}"."$, "Permisos necesarios", "Aceptar", "Cancelar", "", Null, True) +' Wait For Msgbox_Result (resultado As Int) +' If resultado = DialogResponse.POSITIVE Then +' Dim In As Intent +' In.Initialize("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS", "") +' StartActivity(In) +' End If +'' Private cd1 As ColorDrawable +'' cd1.Initialize(Colors.red, 10dip) +'' b_notifAccess.Background = cd1 +'' b_notifAccess.TextColor = Colors.White +'' b_notifAccess.Text = "Activar Permisos" +' Else +'' Private cd1 As ColorDrawable +'' cd1.Initialize(Colors.RGB(109, 221, 101), 10dip) +'' b_notifAccess.Background = cd1 +'' b_notifAccess.TextColor = Colors.White +'' b_notifAccess.Text = "Permisos Activos" +' 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 + Log("|" & Starter.DBReqServer) + Dim r As Reflector + Dim Api As Int + Dim PP As Phone + Api = r.GetStaticField("android.os.Build$VERSION", "SDK_INT") + If Api < 9 Then + 'Old device + If File.Exists(File.DirInternal, "__id") Then + IMEI = File.ReadString(File.DirInternal, "__id") + Log(1&"-"&IMEI) + Else + Dim id As Int + id = Rnd(0x10000000, 0x7FFFFFFF) + File.WriteString(File.DirInternal, "__id", id) + IMEI = id + Log(2&"-"&IMEI) + End If + Else + 'New device + IMEI = r.GetStaticField("android.os.Build", "SERIAL") +' Log(3&"-"&IMEI) + End If + If IMEI.ToLowerCase = "unknown" Then + IMEI = PP.GetSettings("android_id") + End If +' Log("IMEI = " & IMEI) + + If user.Text = "ALTERNO" Then + c=skmt.ExecQuery2("select CAT_CO_CONFIGURACION, CAT_CO_RESULTADO from CAT_CODIGOS where CAT_CO_PONDERACION =1 AND CAT_CO_ACCION = ?", Array As String("SERVER")) + c.Position =0 + DBReqServer = c.GetString("CAT_CO_CONFIGURACION") + alterno = c.GetString("CAT_CO_RESULTADO") + c.Close + If alterno = 1 Then + skmt.ExecNonQuery2("UPDATE CAT_CODIGOS SET CAT_CO_PONDERACION = 1 WHERE CAT_CO_ACCION = ? AND CAT_CO_RESULTADO = 2", Array As String ("SERVER")) + skmt.ExecNonQuery2("UPDATE CAT_CODIGOS SET CAT_CO_PONDERACION = 0 WHERE CAT_CO_ACCION = ? AND CAT_CO_RESULTADO = 1", Array As String ("SERVER")) + Else if alterno = 2 Then + skmt.ExecNonQuery2("UPDATE CAT_CODIGOS SET CAT_CO_PONDERACION = 1 WHERE CAT_CO_ACCION = ? AND CAT_CO_RESULTADO = 1", Array As String ("SERVER")) + skmt.ExecNonQuery2("UPDATE CAT_CODIGOS SET CAT_CO_PONDERACION = 0 WHERE CAT_CO_ACCION = ? AND CAT_CO_RESULTADO = 2", Array As String ("SERVER")) + End If + c=skmt.ExecQuery2("select CAT_CO_CONFIGURACION, CAT_CO_RESULTADO from CAT_CODIGOS where CAT_CO_PONDERACION =1 AND CAT_CO_ACCION = ?", Array As String("SERVER")) + c.Position =0 + DBReqServer = c.GetString("CAT_CO_CONFIGURACION") + user.Text = DBReqServer + c.Close +' reqManager.Initialize(Me, DBReqServer) + else if user.Text = "KMTS1" Then + skmt.ExecNonQuery("delete from usuarioa") + skmt.ExecNonQuery2("INSERT INTO USUARIOA VALUES (?,?)", Array As Object(user.Text, pass.Text)) + skmt.ExecNonQuery("delete from cat_almacen") + skmt.ExecNonQuery2("INSERT INTO CAT_ALMACEN(ID_ALMACEN) VALUES (?)", Array As Object (pass.Text)) + skmt.ExecNonQuery("delete from VERSION") + skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object ("2.1")) + B4XPages.ShowPage("Clientes") + else if user.Text = "BERNA1" Then + skmt.ExecNonQuery("delete from usuarioa") + skmt.ExecNonQuery2("INSERT INTO USUARIOA VALUES (?,?)", Array As Object(user.Text, "1")) + skmt.ExecNonQuery("delete from cat_almacen") + skmt.ExecNonQuery2("INSERT INTO CAT_ALMACEN(ID_ALMACEN) VALUES (?)", Array As Object ("1")) + skmt.ExecNonQuery("delete from VERSION") + skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object ("2.1")) + B4XPages.ShowPage("Clientes") + else if user.Text = "IMEI" Then + user.Text = IMEI + End If + + c=skmt.ExecQuery2("select count(*) as EXISTE1 from usuarioa where usuario = ?", Array As String(user.Text)) + c.Position=0 + existe = c.GetString("EXISTE1") + If existe = 0 Then + If IMEI = "" Then + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_usuario_INTMEX_10" 'Antes select_usuario_guna_GV2_1 + cmd.Parameters = Array As Object(user.Text.Trim, pass.Text.Trim) + reqManager.ExecuteQuery(cmd , 0, "usuario_10") 'Antes usuario + Else + If IMEI = "" Then + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_usuario_INTMEX_10" + cmd.Parameters = Array As Object(user.Text.Trim, pass.Text.Trim) + reqManager.ExecuteQuery(cmd , 0, "usuario_10") + Else + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_usuario_INTMEX_10" 'Antes select_usuario_guna_GV2 + cmd.Parameters = Array As Object(user.Text.Trim, pass.Text.trim) + Log("Mandamos: "&user.Text&"|"& pass.Text) + reqManager.ExecuteQuery(cmd , 0, "usuario_10") 'Antes usuario + End If + End If + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_version_INTMEX" + reqManager.ExecuteQuery(cmd , 0, "version") + Else + usuario = user.Text + B4XPages.ShowPage("Principal") + End If +End Sub + +Sub JobDone(Job As HttpJob) + Log("JOBDONE MAINPAGE") + If B4XPages.MainPage.reqManager.reqsList.IsInitialized Then 'Si tenemos lista de requests, la procesamos. + If B4XPages.MainPage.reqManager.reqsList.IndexOf(Job.tag) <> -1 Then + B4XPages.MainPage.reqManager.reqsList.RemoveAt(B4XPages.MainPage.reqManager.reqsList.IndexOf(Job.tag)) + LogColor($">>>>>> Quitamos ${Job.tag}"$, Colors.Blue) + End If + LogColor(">>>>>> " & B4XPages.MainPage.reqManager.reqsList.Size & " - " & B4XPages.MainPage.reqManager.reqsList, Colors.Blue) + End If + If Job.Success = False Then + LogColor("Error: " & Job.tag & " : " & Job.ErrorMessage, Colors.red) + 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 result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "version" Then 'query tag + For Each records() As Object In result.Rows + skmt.ExecNonQuery("delete from VERSION") + Dim CAT_VE_VERSION As String = records(result.Columns.Get("CAT_VE_VERSION")) + skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object (CAT_VE_VERSION)) + Next + End If + + If result.Tag = "select_fechat" Then 'query tag + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log("select_fechat: " & 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 = "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 = "fecha" Then 'query tag + For Each records() As Object In result.Rows + Dim FECHA_HOY As String = records(result.Columns.Get("FECHA")) + skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("FECHA")) + skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("FECHA",FECHA_HOY)) + 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")) + Log(records(result.Columns.Get("CAT_LO_IDTELEFONO")) ) + Next + paso1 = 1 + ToastMessageShow(name, False) + Log("////////////////////////// "&name) + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "usuario_10" 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 + Log("|"&name&"|") + paso1 = 1 + IMEI_BASE = "" + IMEI = "" + End If + End If + + If result.Tag = "ruta" Then 'query tag + Log("JOBDONE PRINCIPAL MAINPAGE") + For Each records() As Object In result.Rows + Dim VALIDO As String = records(result.Columns.Get("VALIDO")) + If VALIDO = "OK" Then + Log(VALIDO) + End If + Next + End If + + + Job.Release + End If + Log($"Paso1 = ${paso1} - Name: ${name} - IMEI: ${IMEI} - IMEI_BASE: ${IMEI_BASE}"$) + If paso1 = 1 Then + If IMEI = "" Then + If user.Text = "KMTS1" Then name = "OKActivo" + If name = "OKActivo" Then + skmt.ExecNonQuery("delete from usuarioa") + skmt.ExecNonQuery2("INSERT INTO USUARIOA VALUES (?,?)", Array As Object(user.Text.Trim, pass.Text.Trim)) + skmt.ExecNonQuery("delete from cat_almacen") + skmt.ExecNonQuery2("INSERT INTO CAT_ALMACEN(ID_ALMACEN) VALUES (?)", Array As Object (ID_ALMACEN)) + usuario = user.Text + B4XPages.ShowPage("Principal") + Else If name = "OKExpirado" Then + Msgbox("Usuario Expirado llamar al administrador","") 'Ignore + Else If name = "OKCancelado" Then + Msgbox("Usuario Cancelado llamar al administrador","") 'Ignore + Else + Msgbox("Usuario o password No validos","") 'Ignore + End If + paso1 = 0 + Else + If name = "OKActivo" & IMEI And IMEI = IMEI_BASE Then + If name = "OKActivo" & IMEI Then + skmt.ExecNonQuery("delete from usuarioa") + skmt.ExecNonQuery2("INSERT INTO USUARIOA VALUES (?,?)", Array As Object(user.Text.Trim, pass.Text.Trim)) + skmt.ExecNonQuery("delete from cat_almacen") + skmt.ExecNonQuery2("INSERT INTO CAT_ALMACEN(ID_ALMACEN) VALUES (?)", Array As Object (ID_ALMACEN)) + usuario = user.Text + B4XPages.ShowPage("Clientes") + 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 + Else IF name = "OKActivo" Then + Msgbox("Telefono no VALIDO!","") 'ignore + Else + Msgbox("Usuario o password No validos","") 'ignore + End If + End If + End If +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub + Log("closreq") + Sleep(0) + If p_appUpdate.IsInitialized And p_appUpdate.Visible Then + p_appUpdate.Visible = False + Return False + End If + If Not(p_appUpdate.Visible) Then + Log("ExitApplication") + ExitApplication + End If + Return True +End Sub + +Sub GPS_LocationChanged (Location1 As Location) + If user.text = "GPS" Then + user.Text=Location1.Latitude + pass.text=Location1.Longitude + End If +End Sub + +Sub PopupMenu_Dismiss + ToastMessageShow("PopupMenu dismissed", False) +End Sub + +Sub PopupMenu_MenuItemClick (ItemId As Int) As Boolean + ToastMessageShow("Item " & ItemId & " clicked.", False) + Return False +End Sub + +Sub b_menu_Click + PopupMenu.Show +End Sub + +Sub PDF_Click + +End Sub + +'Private Sub GetAdvertisingId As ResumableSub +' Dim jo As JavaObject = Me +' jo.RunMethod("GetAdvertisingId", Null) +' Wait For AdvertisingId_Ready (Success As Boolean, Id As String) +' Return Id +'End Sub + +Sub dameUsuario + c=skmt.ExecQuery2("select count(*) as EXISTE1 from usuarioa where usuario = ?", Array As String(user.Text)) + c.Position=0 + existe = c.GetString("EXISTE1") + c.Close + If existe > 0 Then + c=skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + Else + usuario = "SINUSUARIO" + End If +End Sub + +'#if Java +'import java.util.concurrent.Callable; +'import com.google.android.gms.ads.identifier.AdvertisingIdClient; +'import com.google.android.gms.ads.identifier.AdvertisingIdClient.Info; +' +'public static void GetAdvertisingId() { +' BA.runAsync(processBA, mostCurrent, "advertisingid_ready", new Object[] {false, ""} +' , new Callable() { +' @Override +' public Object[] call() throws Exception { +' String id = AdvertisingIdClient.getAdvertisingIdInfo(mostCurrent).getId(); +' return new Object[] {true, id}; +' } +' }); } +'#End If + +Sub copiaDB + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_WRITE_EXTERNAL_STORAGE) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) + Dim theDir As String = "" + If Result Then +' Private x As String +' If File.ExternalWritable Then +' x = File.DirRootExternal +' Else +' x = File.DirInternal +' End If + Dim theDir As String + Try + File.MakeDir(File.DirRootExternal,"kmts") + theDir = "/kmts" + Catch + theDir = "" + End Try + Try + File.Copy(File.DirInternal,"kmt.db",File.DirRootExternal&theDir, "intmex_kmt.db") + ToastMessageShow("Listo, copiado a " & File.DirRootExternal&theDir & "/intmex_kmt.db", False) + Catch + ToastMessageShow("No se pudo hacer la copia: "&LastException, True) + End Try + Else + ToastMessageShow("Sin permisos", False) + End If +End Sub + +Sub b_apk_Click + StartService(appUpdater) +End Sub + +'appUpdater - Mostramos el anuncio de que se esta descargando el nuevo apk +Sub muestraProgreso(mensaje As String) + ProgressDialogShow(mensaje) +End Sub + +'appUpdater - Ocultamos el anuncio de que se esta descargando el nuevo apk +Sub ocultaProgreso + ProgressDialogHide +End Sub + +Sub i_engrane_Click + lv_server.Clear + ime.HideKeyboard + lv_server.AddSingleLine("http://keymon.lat:1781") +' lv_server.AddSingleLine("http://keymon.lat:1781") + If user.Text = "KMTS1" Then lv_server.AddSingleLine("http://10.0.0.205:1781") +' lv_server.AddSingleLine("http://40.123.36.38:1782") + Log($"|${Starter.DBReqServer}|"$) + l_server.Text = Starter.DBReqServer + et_server.Text = Starter.DBReqServer + Subs.panelVisible(p_appUpdate,0,0) + If user.Text.trim = "KMTS1" Then b_importarBD.Visible = True Else b_importarBD.Visible = False +End Sub + +Sub b_regesar_Click + Subs.panelVisible(p_Main,0,0) +End Sub + +Sub i_engrane_LongClick + copiaDB +End Sub + +Sub Entrar_LongClick +' dim a as int = "a" +End Sub + +Private Sub lv_server_ItemClick (Position As Int, Value As Object) + Starter.DBReqServer = Value + l_server.Text = Value + et_server.Text = Value + Starter.reinicializaReqManager(Value) +' Starter.reqManager.Initialize(Me, Value) + ToastMessageShow("Servidor modificado", False) +End Sub + +Private Sub b_enviarbd_Click + ' copiaDB +' Sleep(1000) + Dim FileName As String = "kmt.db" + 'copy the shared file to the shared folder + Log("xxxxxx:"&Provider.SharedFolder) + Sleep(1000) + File.Copy(File.DirInternal, FileName, Provider.SharedFolder, FileName) + Dim email As Email + email.To.Add("soporte@keymonsoft.com") + email.Subject = "Envio Base de datos INTMEX" + 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_importarBD_Click + Private FH As FileHandler + FH.Initialize + Wait For (FH.Load) Complete (Result As LoadResult) 'Abre un fileManager para seleccionar la base de datos a importar. + File.Copy(Result.Dir, Result.FileName, File.DirInternal, "kmt.db") 'Copia la base de datos seleccionada al directorio interno. + B4XPages.MainPage.skmt.Initialize(Starter.ruta,"kmt.db", True) 'Reiniciliza la base de datos con la recien importada. + ToastMessageShow("¡BD importada!", False) +End Sub + + +Private Sub b_guardar_Click + Starter.reinicializaReqManager(et_server.Text.Trim) + p_appUpdate.Visible = False +End Sub \ No newline at end of file diff --git a/B4A/BatteryUtilities.bas b/B4A/BatteryUtilities.bas new file mode 100644 index 0000000..53902d5 --- /dev/null +++ b/B4A/BatteryUtilities.bas @@ -0,0 +1,126 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=9.5 +@EndOfDesignText@ +'Class module +Sub Class_Globals + Private nativeMe As JavaObject + +End Sub +'Initializes the object. +Public Sub Initialize + nativeMe = Me +End Sub +'Return information about the battery status. It returns the following 11 values in an integer Array: +'EXTRA_LEVEL = current battery level, from 0 To EXTRA_SCALE. +'EXTRA_SCALE = the maximum battery level possible. +'EXTRA_HEALTH = the current health constant. +'EXTRA_ICON_SMALL = the resource ID of a small status bar icon indicating the current battery state. +'EXTRA_PLUGGED = whether the device is plugged into a Power source; 0 means it is on battery, other constants are different types of Power sources. +'EXTRA_STATUS = the current status constant. +'EXTRA_TEMPERATURE = the current battery temperature. +'EXTRA_VOLTAGE = the current battery voltage level. +'A value indicating if the battery is being charged or fully charged (If neither it returns 0 Else it returns 1) +'A value indicating if it is charging via USB (0 = Not USB, 2 = USB) +'A value indicating if it is charging via AC (0 = Not AC, 1 = AC) +Public Sub getBatteryInformation () As Int() + + Dim batteryInfo(11) As Int + batteryInfo = nativeMe.RunMethod("getBatteryInformation",Null) + Return batteryInfo + +End Sub + +Public Sub getBatteryTechnolgy() As String + + Dim batterytech As String + batterytech = nativeMe.RunMethod("getBatteryTechnology",Null) + Return batterytech + +End Sub + + + +#If Java + +import android.os.BatteryManager; +import android.os.Bundle; +import android.app.Activity; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; + + public int[] getBatteryInformation() { + + int[] mybat = new int[11]; + + Intent batteryIntent = ba.context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + + int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); + mybat[0] = level; + int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); + mybat[1] = scale; + int health = batteryIntent.getIntExtra(BatteryManager.EXTRA_HEALTH,-1); + mybat[2] = health; + int icon_small = batteryIntent.getIntExtra(BatteryManager.EXTRA_ICON_SMALL,-1); + mybat[3] = icon_small; + int plugged = batteryIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED,-1); + mybat[4] = plugged; +// boolean present = batteryIntent.getExtras().getBoolean(BatteryManager.EXTRA_PRESENT); + int status = batteryIntent.getIntExtra(BatteryManager.EXTRA_STATUS,-1); + mybat[5] = status; +// String technology = batteryIntent.getExtras().getString(BatteryManager.EXTRA_TECHNOLOGY); +// BA.Log("Technology = " + technology); + int temperature = batteryIntent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE,-1); + mybat[6] = temperature; + int voltage = batteryIntent.getIntExtra(BatteryManager.EXTRA_VOLTAGE,-1); + mybat[7] = voltage; +// int ac = batteryIntent.getIntExtra("plugged",BatteryManager.BATTERY_PLUGGED_AC); +// mybat[8] = ac; +// int usb = batteryIntent.getIntExtra("plugged",BatteryManager.BATTERY_PLUGGED_USB); +// mybat[9] = usb; + + boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || + status == BatteryManager.BATTERY_STATUS_FULL; + mybat[8] = 0; + if (isCharging == true) { + mybat[8] = 1; + } + + // How are we charging? + mybat[9] = 0; + mybat[10] = 0; + int chargePlug = batteryIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); + boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; + if (usbCharge == true) { + mybat[9] = 2; + } + + boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; + if (acCharge == true) { + mybat[10] = 1; + } + + return mybat; + } + + + public String getBatteryTechnology() { + + Intent batteryIntent = ba.context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + + String technology = batteryIntent.getExtras().getString(BatteryManager.EXTRA_TECHNOLOGY); + + return technology; + } + + + + + + + +#End If \ No newline at end of file diff --git a/B4A/C_Cliente.bas b/B4A/C_Cliente.bas new file mode 100644 index 0000000..2fbf0ce --- /dev/null +++ b/B4A/C_Cliente.bas @@ -0,0 +1,1609 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=11.5 +@EndOfDesignText@ +Sub MODS 'ignore + 'V3.04.10 - Se agregó código para el registro de abonos, en B4XMainPage se genera la tabla y aquí se agregó el panel p_abonos para ralizar el abono, y el codigo en el sub "mandaPendientes" para cambiar la bandera de enviado en el abono. +End Sub + +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore + Private p_cliente As Panel + Dim reqManager As DBRequestManager + Dim cmd As DBCommand + Dim ime As IME + + Dim g As GPS + Dim ruta As String + Dim skmt As SQL + Dim clie_id As String + Dim sDate,sTime As String + Dim usuario As String + Dim total_cliente As String + Dim m_lat, m_lon 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 cuenta As String + Dim tipo_venta As String = "PREVENTA" + + + Dim c As Cursor + Dim s As Cursor + Dim DD As Cursor + Dim c2 As Cursor + 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 Tels As Button + Dim Label10 As Label + Dim Label11 As Label + + Dim Tar As Button + + 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 + ' Dim lat_gps, lon_gps As String + + Dim l_total As Label + Dim c2 As Cursor + Dim S2 As Cursor + Private s As Cursor + Dim res As String + Private HIST As Button + Private MONTO_COMPRA As String + Private META As String + Private META2 As String + Private VERIFICA As String + Private L_QR As Label + Private BT_QR As Button + 'Private qr As QRCode + Dim CODIGO As String + + Private b_mapa As Button + Dim CUANTOS As String + Private B_IMP As Button + Dim Toggla As Toggle + Dim tgl As Toggle + Private Panel1 As Panel + Private I_COMPRA As EditText + Private B_GUARDA_C As Button + Private b_venta As Button + Dim ALMACEN As String + Private LA_GPS As Label + Private B_E_NEXT As Button + Private E_RES_E As EditText + Private t_tenc As Label + Private Panel2 As Panel + Private CONTADOR_E As String + Private HR_RES1 As String + Private HR_RES2 As String + Private HR_RES3 As String + Private EXISTE As String + Private TELEFONO As String + + Private RB1 As RadioButton + Private RB2 As RadioButton + Private RB3 As RadioButton + Private RB4 As RadioButton + Private RB5 As RadioButton + + Private stay_hh As String + Private stay_mi As String + Private stay_ss As String + + Private LA_GEO As Label + Dim result As Int + Private cercavalor As String + Private LA_RUTA As String + + Private b_like As Button + Private B_GPS As Button +' Dim sc As JhsIceZxing1 + Dim CODIGO As String + Private cb_factura As CheckBox + Private p_cbFactura As Panel + Dim venimosDeTicketsDia As Boolean = False + Private p_abono As Panel + Private et_abono As EditText + Private b_abono As Button + Private b_cancelar As Button + Private b_abono1 As Button + Dim b As Cursor + Private b_cxc As Button + Private clv_abonos As CustomListView + Private l_folio As Label + Private l_saldo As Label + Dim d As Cursor + Dim f As Cursor + Private l_montoabonostotal As Label + Dim j As Cursor + Dim h As Cursor + Dim distance As Long + Dim cuest As C_Cuestionario + Private b_ventaabordo As Button + Private l_factura As Label + + Dim Printer1 As EscPosPrinter + Dim impresoraConectada As Boolean = False + Dim MAC_IMPRESORA As String + Dim errorImpresora As Int = 0 + Dim btAdmin As BluetoothAdmin +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 +' Activity.RemoveAllViews + Root.LoadLayout("cliente") + cuest.Initialize(Me, "cuest", Root, Starter.skmt) + ruta = File.DirInternal + If File.Exists(ruta, "kmt.db") = False Then + File.Copy(File.DirAssets, "kmt.db", ruta, "kmt.db") + End If + skmt.Initialize(ruta,"kmt.db", True) + c = 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_MTOCOMPRA from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)") + s = 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)") + b = skmt.ExecQuery("select COUNT(*) AS CLIENTE FROM ABONOSP WHERE CLIENTE IN (Select CUENTA from cuentaa)") + 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 + + s.Position=0 + If c.RowCount>0 Then + c.Position=0 + la_cuenta.Text = c.GetString("CAT_CL_CODIGO") + cuenta = 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") + l_atiende.Text = c.GetString("CAT_CL_ATIENDE1") + l_atiende2.Text = c.GetString("CAT_CL_ATIENTE2") + la_saldotot.Text = c.GetString("CAT_CL_TELEFONO") + la_saldooper.Text = c.GetString("CAT_CL_EMAIL") + l_total.Text = s.GetString("TOTAL_CLIE") + total_cliente = s.GetString("TOTAL_CLIE") + MONTO_COMPRA = c.GetString("CAT_CL_MTOCOMPRA") + End If + c.Close + s.Close + btAdmin.Initialize("BlueTeeth") + cmp20.Initialize("Printer") + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_CAMERA) + Wait For B4XPage_PermissionResult (Permission As String, resultC As Boolean) + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_WRITE_EXTERNAL_STORAGE) + Wait For B4XPage_PermissionResult (Permission As String, resultC As Boolean) + +' h = B4XPages.MainPage.skmt.ExecQuery("SELECT CUENTA from CUENTAA") +' h.Position = 0 +' Log(h.GetString("CUENTA")) +' j = B4XPages.MainPage.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 +' b_cxc.Enabled = True +' Else If j.RowCount > 0 Then +' b_cxc.Enabled = False +' End If +' h.Close +' j.Close + + btAdmin.Initialize("BlueTeeth") + +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, Starter.DBReqServer) + LA_GPS.TextColor = Colors.Red + LA_GPS.Text = "SIN UBICACION GPS" + cercavalor = 0 + If Not(Starter.gps.GPSEnabled) Then + ToastMessageShow("Es necesario tener el GPS encendido", True) + StartActivity(Starter.gps.LocationSettingsIntent) + End If +' Log("appear") + cb_factura.Checked = False + p_abono.Visible = False + Subs.centraPanel(p_abono, Root.Width) + skmt.Initialize(ruta,"kmt.db", True) + c=B4XPages.MainPage.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_MTOCOMPRA,CAT_CL_NUM_SERIEFISICO from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa) UNION ALL 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_MTOCOMPRA,CAT_CL_NUM_SERIEFISICO from kmt_info2 where CAT_CL_CODIGO In (Select cuenta from cuentaa)") + s=B4XPages.MainPage.skmt.ExecQuery("Select SUM(PE_COSTO_TOT) As TOTAL_CLIE, SUM(PE_CANT) As CANT_CLIE, PC_FACTURA FROM PEDIDO_CLIENTE INNER JOIN PEDIDO ON PEDIDO_CLIENTE.PC_CLIENTE = PEDIDO.PE_CLIENTE WHERE (PE_CLIENTE IN (Select cuenta from cuentaa))") + b = B4XPages.MainPage.skmt.ExecQuery("select COUNT(*) AS CLIENTE FROM ABONOSP WHERE CLIENTE IN (Select CUENTA from cuentaa)") + 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 + + s.Position=0 + If c.RowCount > 0 Then + 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") + l_entre1.Text = c.GetString("CAT_CL_CALLE1") + l_entre2.Text = c.GetString("CAT_CL_CALLE2") + l_atiende.Text = c.GetString("CAT_CL_ATIENDE1") + l_atiende2.Text = c.GetString("CAT_CL_ATIENTE2") + TELEFONO = c.GetString("CAT_CL_TELEFONO") + l_total.Text = s.GetString("TOTAL_CLIE") + total_cliente = s.GetString("TOTAL_CLIE") + Private factura As String = 0 + If s.GetString("PC_FACTURA") <> Null And IsNumber(s.GetString("PC_FACTURA")) Then factura = s.GetString("PC_FACTURA") + If factura = "1" Then cb_factura.Checked = True + m_lat = "0" + If c.GetString("CAT_CL_LAT") <> "" Then m_lat =c.GetString("CAT_CL_LAT") + If m_lat.Length < 5 Then m_lat = "0" + m_lon = "0" + If c.GetString("CAT_CL_LONG") <> "" Then m_lon =c.GetString("CAT_CL_LONG") + If m_lon.Length < 5 Then m_lon = "0" + LA_RUTA = c.GetString("CAT_CL_RUTA") + ' ESTO ES PARA FORZAR A PEDIR LA FOTO Y EL GPS + If c.GetString("CAT_CL_NUM_SERIEFISICO") = "0" Then + L_QR.TEXT = "SIN CODIGO" + L_QR.TextColor = Colors.Red + gest.VISIBLE = False + BT_QR.Visible = True + Else + L_QR.TEXT = c.GetString("CAT_CL_NUM_SERIEFISICO") + L_QR.TextColor = Colors.Blue + BT_QR.Visible = False + End If + End If + c.Close + s.Close + S2=B4XPages.MainPage.skmt.ExecQuery("select count(*) AS CUANTOS from HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa)") + S2.Position =0 + CUANTOS = S2.GetString("CUANTOS") + S2.Close + If CUANTOS > 0 Then + c2=B4XPages.MainPage.skmt.ExecQuery("select sum(HVD_COSTO_TOT) AS TOTAL from HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa)") + c2.Position =0 + MONTO_COMPRA = c2.GetString("TOTAL") + c2.Close + Else + MONTO_COMPRA = "0" + End If + + la_saldotot.Text = MONTO_COMPRA + If MONTO_COMPRA <> "0" Then + META2 = 300 - MONTO_COMPRA + Else + META2 = 300 + End If + If META2 < 1 Then + META2 = "CUBIERTO" + End If + la_saldooper.Text = META2 + c=B4XPages.MainPage.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + If c.RowCount>0 Then + C.Position=0 + ALMACEN = C.GetString("ID_ALMACEN") + End If + c.Close + If ALMACEN = "1" Then + Tels.Visible = False + gest.Visible = False +' B_GPS.Visible = False + End If + If ALMACEN = "4" Then +' b_like.Visible = True + DD=B4XPages.MainPage.skmt.ExecQuery2("SELECT COUNT(*) AS CUANTOS FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select cuenta from cuentaa) AND HVD_PRONOMBRE =?", Array As String("KNORR RINDE MAS 70 GR")) + DD.Position =0 + If DD.GetString("CUANTOS") = 0 Then + c=B4XPages.MainPage.skmt.ExecQuery2("SELECT COUNT(*) AS CUANTOS FROM PEDIDO WHERE PE_CLIENTE IN (Select cuenta from cuentaa) AND PE_PRONOMBRE =?", Array As String("KNORR RINDE MAS 70 GR")) + c.Position =0 +' If c.GetString("CUANTOS") = 0 Then +' b_like.Visible = True +' Else +' b_like.Visible = False +' End If + c.Close + Else +' b_like.Visible = False + End If + DD.Close + Else +' b_like.Visible = False + End If + If ALMACEN = "16" Or ALMACEN = "13" Then + Tels.Visible = True + gest.Visible = True + 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 + Tels.Visible = True + gest.Visible = True + +' h = B4XPages.MainPage.skmt.ExecQuery("SELECT CUENTA from CUENTAA") +' h.Position = 0 +' Log(h.GetString("CUENTA")) +' j = B4XPages.MainPage.skmt.ExecQuery2("SELECT a_abono AS CUANTOS FROM ABONOS WHERE a_cliente = ?", Array As String(h.GetString("CUENTA"))) +' j.position = 0 +' Log(j.RowCount) +' If j.RowCount = 0 Then +' b_cxc.Enabled = True +' Else If j.RowCount > 0 Then +' b_cxc.Enabled = False +' End If +' h.Close +' j.Close + + If la_cuenta.Text = "0" Then + p_cbFactura.Visible = False + l_factura.Visible = False + b_ventaabordo.Visible = False + Else + p_cbFactura.Visible = True + l_factura.Visible = True + b_ventaabordo.Visible = True + End If + + c = 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 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 + + Dim l1, l2 As Location + l1.Initialize2(B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps) +' Log($"Coordenadas de la tienda - lat:${m_lat}, lon:${m_lon}"$) + l2.Initialize2(m_lat, m_lon) + + BT_QR.Enabled = True + LA_GPS.TextColor = Colors.Blue + LA_GPS.Text = "CON UBICACION GPS" +' B_GPS.Enabled = True + 'now we need the distance between our location and the target location + distance = l1.DistanceTo(l2) 'the result is in meter + gest.Visible = True +' If distance < 100 Then + LA_GEO.TextColor = Colors.Blue + Tels.Visible = True + gest.Visible = True +' Else +' LA_GEO.TextColor = Colors.Red + ' End If + LA_GEO.Text= $"$1.2{distance/1000} kms"$ + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM HIST_GPS") + B4XPages.MainPage.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 + If la_cuenta.Text = "0" Then + B4XPages.MainPage.tipo_venta = "ABORDO" + Else + + B4XPages.MainPage.tipo_venta = "PREVENTA" + End If + + 'Buscamos en el historial de cuestionarios si el cliente ya tiene cuestionario contestado. + Private hc As Cursor = Starter.skmt.ExecQuery($"select count(HC_CLIENTE) as cuantos from HIST_CUESTIONARIO where HC_CLIENTE = '${Subs.traeCliente}'"$) + hc.Position = 0 + Log($"${cuest.encuestaIniciada} - ${hc.GetString("cuantos")} - ${cuest.clienteConCuestionario(Subs.traeCliente)}"$) + + If la_cuenta.Text <> "0" And Not(cuest.encuestaIniciada) And hc.GetString("cuantos") = 0 And Not(cuest.clienteConCuestionario(Subs.traeCliente)) Then + cuest.agregaPregunta("1", "¿Se puede acceder al negocio o está enrejado?", Array As String("No, está enrejado o no se tiene acceso", "Si se pude acceder")) + Return False + End If + Private x As Cursor = B4XPages.MainPage.skmt.ExecQuery($"select tienda_id from COORDENADAS_GPS where tienda_id = '${la_cuenta.text}'"$) +' Log("+++++++++++++ " & x.RowCount) + If la_cuenta.Text<> "0" And distance > 50 And x.RowCount = 0 Then + Private res As String = Msgbox2("¿Estas en la tienda, para guardar la nueva ubicación?", "AVISO", "Si","" ,"No", Null) 'ignore + If res = DialogResponse.POSITIVE Then + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + B4XPages.MainPage.skmt.ExecNonQuery($"insert into COORDENADAS_GPS (tienda_id, ruta, almacen, latitud, longitud, fecha) values ('${la_cuenta.Text}', '${Subs.traeRuta}', '${Subs.traeAlmacen}', '${B4XPages.MainPage.lat_gps}', '${B4XPages.MainPage.lon_gps}', '${sDate} ${sTime}')"$) + + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_coords_nuevas_INTMEX" + cmd.Parameters = Array As Object(la_cuenta.text, Subs.traeRuta, Subs.traeAlmacen, sDate & " " & sTime, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps, usuario) +' Log($"${la_cuenta.text}, ${Subs.traeRuta}, ${Subs.traeAlmacen}, ${sDate} ${sTime}, ${m_lat}, ${m_lon}"$) + reqManager.ExecuteCommand(cmd , "ins_coords_nuevas") + End If + End If + 'Si hay mapa de productos es que hay venta en proceso, entonces borramos la actual para meter la nueva. +' If B4XPages.MainPage.productos.prodsMap.IsInitialized And B4XPages.MainPage.productos.prodsMap.Size > 0 Then Subs.borraPedidoClienteActual + B4XPages.ShowPage("productos") +End Sub + +Sub Tels_Click + B4XPages.ShowPage("NoVenta") +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub +' BACK key pressed +' Return True To close, False To cancel +' Log($"venimosDeTicketsDia=${venimosDeTicketsDia}"$) + If la_cuenta.Text <> "0" Then + cuest.encuestaIniciada = False + cuest.ocultPanelPregunta + If IsNumber(l_total.text) And Not(Subs.pedidoGuardado) Then + LogColor("Hay Venta", Colors.Red) + Private resultado1 As Int = Msgbox2($"Va salir sin haber guardado la venta, si continua, la venta se BORRARA.${CRLF}${CRLF}¿Esta seguro que desea continuar?"$, "SE VA A BORRAR LA VENTA", "Borrar Venta", "Guardar Venta", "", LoadBitmap(File.DirAssets,"alert2.png")) + If resultado1 = DialogResponse.POSITIVE Then + Log("Borrra venta") + Subs.borraPedidoClienteActual + ToastMessageShow("Venta Borrada", False) +' venimosDeTicketsDia = False + B4XPages.ShowPage("Principal") + else if resultado1=DialogResponse.CANCEL Then + Log("Pedido guardado") + Guardar_Click + ToastMessageShow("Venta Guardada", False) + End If + End If +' venimosDeTicketsDia = False + B4XPages.ShowPage("Clientes") + Else + End If +' Return True + Return False +End Sub + +Sub Tar_Click + B4XPages.ShowPage("Nota") +End Sub + +'Sub Tar_LongClick +' p_abono.Visible = True +'End Sub + +Sub DATOS_Click + B4XPages.ShowPage("telefonos") +End Sub + +Sub Guardar_Click + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=B4XPages.MainPage.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE, COUNT(*) AS CUANTOS FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + c.Position=0 +' Log("xxxxxxxxxxxxxxx " & c.GetString("CUANTOS")) + If c.GetString("CUANTOS") > 0 Then + Private cbFactura As Int = 0 + If cb_factura.Checked Then cbFactura = 1 + B4XPages.MainPage.skmt.ExecNonQuery("delete from NOVENTA where NV_CLIENTE In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO, PC_LON, PC_LAT, PC_ENVIO_OK, PC_FACTURA) VALUES (?,?,?,?,?,?,?,?,?)", Array As Object(clie_id, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), B4XPages.MainPage.lon_gps, B4XPages.MainPage.lat_gps, 0, cbFactura)) + B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + End If + c.Close + DateTime.TimeFormat = "HHmmss" + sTime=DateTime.Time(DateTime.Now) + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE HIST_STAY_STORE set HSS_OUT = ? where HSS_OUT = 0 AND HSS_CODIGO In (select cuenta from cuentaa)", Array As Object(sTime)) + ' B4XPages.MainPage.skmt.ExecNonQuery("UPDATE HIST_STAY_STORE set HSS_TOT = HSS_OUT - HSS_IN where HSS_CODIGO In (select cuenta from cuentaa)") + Try + c=B4XPages.MainPage.skmt.ExecQuery(" Select (substr(HSS_OUT,1,2) - substr(HSS_IN,1,2)) - Case when (substr(HSS_OUT,3,2) - substr(HSS_IN,3,2)) < 0 Then 1 Else 0 end HORAS_TOTALES, " & _ + "Case when (substr(HSS_OUT,3,2) - substr(HSS_IN,3,2)) < 0 Then (substr(HSS_OUT,3,2) + 60 - substr(HSS_IN,3,2)) " & _ + " Else (substr(HSS_OUT,3,2) - substr(HSS_IN,3,2)) End - Case when (substr(HSS_OUT,5,2) - substr(HSS_IN,5,2)) < 0 Then 1 Else 0 end MINUTOS_TOTALES, " & _ + "Case when (substr(HSS_OUT,5,2) - substr(HSS_IN,5,2)) < 0 Then (substr(HSS_OUT,5,2) + 60 - substr(HSS_IN,5,2)) " & _ + " Else (substr(HSS_OUT,5,2) - substr(HSS_IN,5,2)) end SEGUNDOS_TOTALES " & _ + " from HIST_STAY_STORE where HSS_CODIGO In (Select cuenta from cuentaa) ") + c.Position = 0 + stay_hh = c.GetString("HORAS_TOTALES") * 60 * 60 + stay_mi = c.GetString("MINUTOS_TOTALES") * 60 + stay_ss = c.GetString("SEGUNDOS_TOTALES") + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE HIST_STAY_STORE set HSS_TOT = ? where HSS_CODIGO In (select cuenta from cuentaa)", Array As Object(stay_hh + stay_mi + stay_ss)) + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE HIST_STAY_OUT set HSO_FIN = ? ", Array As Object(sTime)) + c.Close + Catch + ToastMessageShow(".",True) + End Try + + skmt.ExecNonQuery2("update PEDIDO_INICIO_FINAL set PIF_HORA_FINAL = ? where PIF_CLIENTE = ? and PIF_HORA_FINAL = 0", Array As Object (DateTime.Now, la_cuenta.Text)) +' LogColor($"actualizamos "${la_cuenta.text}, hora_final=${DateTime.now}"$,Colors.Red) + Subs.actualizaTET(la_cuenta.text) + DateTime.TimeFormat = "HH:mm:ss" + + mandaPendientes 'LO COMENTAMOS PARA PRUEBAS, ACTIVAR AL FINAL!!! + mandapiezas + B4XPages.MainPage.productos.reiniciarlistaProds = True + B4XPages.MainPage.productos.prodsMap.Initialize + B4XPages.MainPage.promos.promosMap.Initialize + B4XPages.ShowPage("Principal") +End Sub + +Sub NUEVO_Click + B4XPages.ShowPage("NuevoCliente") +End Sub + +Sub HIST_Click + B4XPages.ShowPage("Historico") +End Sub + +Sub BT_QR_Click +' sc.isportrait = True +' sc.timeoutDuration = 45 +' sc.theViewFinderXfactor = 0.7 +' sc.theViewFinderYfactor = 0.5 +' sc.theResultColor = Colors.Green +' sc.mustVibrate = True +' sc.BeginScan("sc") +End Sub + +Sub sc_result(atype As String,Values As String, image As Bitmap) + 'Log("Type : " & atype) + 'Log("Value : " & Values) + CODIGO = Values + DD=B4XPages.MainPage.skmt.ExecQuery2("SELECT COUNT(*) AS CUANTOS FROM kmt_info WHERE CAT_CL_NUM_SERIEFISICO = ?", Array As String(CODIGO)) + DD.Position =0 + If DD.GetString("CUANTOS") > 0 Then + MsgboxAsync("Código ya asignado", "AVISO") + Else + If CODIGO.Length = 7 Then + Msgbox2Async("El código "& CODIGO & " es correcto?" , "Title", "Yes", "Cancel", "No", Null, False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE kmt_info set CAT_CL_NUM_SERIEFISICO = ?, CAT_CL_LONG = ?, CAT_CL_LAT =? where CAT_CL_CODIGO In (select cuenta from cuentaa)", Array As Object(CODIGO, B4XPages.MainPage.lon_gps, B4XPages.MainPage.lat_gps)) + L_QR.TEXT =CODIGO + L_QR.TextColor = Colors.Blue + B4XPages.MainPage.skmt.ExecNonQuery2("insert into HIST_CODIGO_BARRAS(CODIGOKMTS, CODIGOB, LAT, LON) VALUES (?,?,?,?)", Array As Object(la_cuenta.Text,CODIGO, B4XPages.MainPage.lon_gps, B4XPages.MainPage.lat_gps)) + End If + Else + MsgboxAsync("Código No Valido", "AVISO") + End If + End If + DD.Close +End Sub + +Sub sc_timedout(timedOut As Boolean) + Log("timedOut " & timedOut) +End Sub + +Sub sc_usercancelled(userCancelled As Boolean) + Log("userCancelled " & userCancelled) +End Sub + +Sub calc_ean_checksum(number As String) As String 'this has now become redundant as I am only interested in QR Codes + Dim i As Int + Dim cO As Char + Dim soma As Int + Dim n As Int + Dim digit As Float + soma = 0 + For i=0 To number.Length - 1 + digit = number.SubString2(i,i+1) + n= digit * ((i Mod 2) * 2 + 1) + soma=soma+n + Next + Return number & ( ( 10 - ( soma Mod 10 )) Mod 10 ) +End Sub + +Sub b_mapa_Click + B4XPages.ShowPage("mapas") +End Sub + +Sub B_IMP_Click + c=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 +' 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 + + 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 + + TAMANO = 0 + ESPACIO = 21 + BLANCO = " " + Dim bmp As Bitmap + bmp.InitializeResize(File.DirAssets, "intmex_logo_192x192.jpg", 192, 250, 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.Justify = 1 + 'printer.Initialize(cmp20.OutputStream) +' Printer1.WriteString("DISTRIBUIDORA ROCHA TULA PACHUCA" & CRLF) + Printer1.WriteString("RFC: DRT-110316-9J1" & CRLF) +' Printer1.WriteString(sucursal & CRLF) + Printer1.WriteString(sDate & CRLF) + Printer1.WriteString(sTime & CRLF) + Printer1.WriteString("Vendedor:" & 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("C.P.: " & la_cp.Text & CRLF) + Printer1.WriteString("Entre calle1: " & l_entre1.Text & CRLF) + Printer1.WriteString("Entre Calle2: " & l_entre2.Text & CRLF) + +' c = skmt.ExecQuery2("SELECT * FROM PEDIDO WHERE PE_FOLIO = ?",Array As String("PREVENTA")) +' If c.RowCount > 0 Then +' Printer1.WriteString("-----------PREVENTA-----------" & 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=skmt.ExecQuery2("select PE_PRONOMBRE, PE_CANT, length(pe_cant) as L_CANT, PE_COSTOU, length(PE_COSTOU) as L_COSTOU,PE_CANT * PE_COSTOU AS PE_COSTO_TOT, length(PE_CANT * PE_COSTOU) as L_COSTO_TOT,PE_PROID, PE_CEDIS FROM PEDIDO WHERE PE_FOLIO = ? AND LENGTH(PE_CEDIS) < 4 AND PE_CLIENTE IN (Select CUENTA from cuentaa) order by PE_PROID", Array As String("PREVENTA")) +' If S.RowCount>0 Then +' For i=0 To S.RowCount -1 +' S.Position=i +' If s.GetString("PE_CEDIS") = s.GetString("PE_PROID") Then +' Printer1.WriteString(s.GetString("PE_PRONOMBRE") & CRLF) +' +' Else +' +' Printer1.WriteString(s.GetString("PE_CANT") & " " & s.GetString("PE_PRONOMBRE") & CRLF) +' TAMANO = s.GetLong("L_CANT") + TAMANO +' TAMANO = s.GetLong("L_COSTOU") + TAMANO +' TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO +' +' ESPACIO = ESPACIO - TAMANO +' +' For E=0 To ESPACIO -1 +' BLANCO = " " & BLANCO +' Next +' Printer1.WriteString(BLANCO & s.GETSTRING("PE_CANT") & " X $" & s.GETSTRING("PE_COSTOU") & " $" & s.GETSTRING("PE_COSTO_TOT") & CRLF ) +' TAMANO = 0 +' ESPACIO = 21 +' BLANCO = " " +' End If +' Next +' End If +' s.Close +' Printer1.WriteString(" " & CRLF) +' s=skmt.ExecQuery2("select PE_PRONOMBRE, PE_CANT, length(pe_cant) as L_CANT, PE_COSTOU, length(PE_COSTOU) as L_COSTOU,PE_CANT * PE_COSTOU AS PE_COSTO_TOT, length(PE_CANT * PE_COSTOU) as L_COSTO_TOT,PE_PROID, PE_CEDIS FROM PEDIDO WHERE PE_FOLIO = ? AND LENGTH(PE_CEDIS) > 3 AND PE_PROID NOT IN (SELECT CAT_PA_ID FROM PROMOS_COMP ) AND PE_CLIENTE IN (Select CUENTA from cuentaa) order by PE_CEDIS, PE_COSTOU", Array As String("PREVENTA")) +' If S.RowCount>0 Then +' Printer1.WriteString("-------PROMOS PREVENTA--------" & CRLF) +' For i=0 To S.RowCount -1 +' S.Position=i +' If s.GetString("PE_CEDIS") = s.GetString("PE_PROID") Then +' Printer1.WriteString(s.GetString("PE_PRONOMBRE") & CRLF) +' +' Else +' +' Printer1.WriteString(s.GetString("PE_CANT") & " " & s.GetString("PE_PRONOMBRE") & CRLF) +' TAMANO = s.GetLong("L_CANT") + TAMANO +' TAMANO = s.GetLong("L_COSTOU") + TAMANO +' TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO +' +' ESPACIO = ESPACIO - TAMANO +' +' For E=0 To ESPACIO -1 +' BLANCO = " " & BLANCO +' Next +' Printer1.WriteString(BLANCO & s.GETSTRING("PE_CANT") & " X $" & s.GETSTRING("PE_COSTOU") & " $" & s.GETSTRING("PE_COSTO_TOT") & CRLF ) +' TAMANO = 0 +' ESPACIO = 21 +' BLANCO = " " +' End If +' Next +' Printer1.WriteString(" " & CRLF) +' End If +' s.Close +' +' s=skmt.ExecQuery2("select SUM(PE_COSTO_TOT) AS TOTAL FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) AND PE_FOLIO = ?", Array As String("PREVENTA")) +' s.Position =0 +' ' If s.GetString("TOTAL") - s.GetString("TOTAL2") <> 0 Then +' ' Printer1.WriteString("Descuento: $" & (s.GetString("TOTAL2") - s.GetString("TOTAL"))) +' ' End If +' Printer1.WriteString("Total preventa: $" & s.GetString("TOTAL") & CRLF) +' s.Close +' c= skmt.ExecQuery2("select sum(PE_CANT) as PC_NOART from PEDIDO where PE_CLIENTE in (Select CUENTA from cuentaa) AND PE_PROID NOT IN (SELECT CAT_PA_ID FROM PROMOS_COMP ) AND PE_FOLIO = ?", Array As String("PREVENTA")) +' C.Position=0 +' Printer1.WriteString("Total articulos preventa: " & c.GetString("PC_NOART") & CRLF) +' c.Close +' +' Printer1.WriteString(" " & CRLF) +' End If + + c = skmt.ExecQuery2("SELECT * FROM PEDIDO WHERE PE_FOLIO = ?",Array As String("VENTA")) + If c.RowCount > 0 Then + Printer1.WriteString("-----------VENTA-----------" & 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=skmt.ExecQuery2("select PE_PRONOMBRE, PE_CANT, length(pe_cant) as L_CANT, PE_COSTOU, length(PE_COSTOU) as L_COSTOU,PE_CANT * PE_COSTOU AS PE_COSTO_TOT, length(PE_CANT * PE_COSTOU) as L_COSTO_TOT,PE_PROID, PE_CEDIS FROM PEDIDO WHERE PE_FOLIO = ? AND LENGTH(PE_CEDIS) < 4 AND PE_CLIENTE IN (Select CUENTA from cuentaa) order by PE_PROID", Array As String("VENTA")) + If S.RowCount>0 Then + For i=0 To S.RowCount -1 + S.Position=i + If s.GetString("PE_CEDIS") = s.GetString("PE_PROID") Then + Printer1.WriteString(s.GetString("PE_PRONOMBRE") & CRLF) + + Else + + Printer1.WriteString(s.GetString("PE_CANT") & " " & s.GetString("PE_PRONOMBRE") & CRLF) + TAMANO = s.GetLong("L_CANT") + TAMANO + TAMANO = s.GetLong("L_COSTOU") + TAMANO + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + + ESPACIO = ESPACIO - TAMANO + + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.WriteString(BLANCO & s.GETSTRING("PE_CANT") & " X $" & s.GETSTRING("PE_COSTOU") & " $" & s.GETSTRING("PE_COSTO_TOT") & CRLF ) + TAMANO = 0 + ESPACIO = 21 + BLANCO = " " + End If + Next + End If + s.Close + Printer1.WriteString(" " & CRLF) + s=skmt.ExecQuery2("select PE_PRONOMBRE, PE_CANT, length(pe_cant) as L_CANT, PE_COSTOU, length(PE_COSTOU) as L_COSTOU,PE_CANT * PE_COSTOU AS PE_COSTO_TOT, length(PE_CANT * PE_COSTOU) as L_COSTO_TOT,PE_PROID, PE_CEDIS FROM PEDIDO WHERE PE_FOLIO = ? AND LENGTH(PE_CEDIS) > 3 AND PE_PROID NOT IN (SELECT CAT_PA_ID FROM PROMOS_COMP ) AND PE_CLIENTE IN (Select CUENTA from cuentaa) order by PE_CEDIS, PE_COSTOU", Array As String("VENTA")) + If S.RowCount>0 Then + Printer1.WriteString("---------PROMOS VENTA---------" & CRLF) + For i=0 To S.RowCount -1 + S.Position=i + If s.GetString("PE_CEDIS") = s.GetString("PE_PROID") Then + Printer1.WriteString(s.GetString("PE_PRONOMBRE") & CRLF) + + Else + + Printer1.WriteString(s.GetString("PE_CANT") & " " & s.GetString("PE_PRONOMBRE") & CRLF) + TAMANO = s.GetLong("L_CANT") + TAMANO + TAMANO = s.GetLong("L_COSTOU") + TAMANO + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + + ESPACIO = ESPACIO - TAMANO + + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.WriteString(BLANCO & s.GETSTRING("PE_CANT") & " X $" & s.GETSTRING("PE_COSTOU") & " $" & s.GETSTRING("PE_COSTO_TOT") & CRLF ) + TAMANO = 0 + ESPACIO = 21 + BLANCO = " " + End If + Next + Printer1.WriteString(" " & CRLF) + End If + s.Close + + s=skmt.ExecQuery2("select SUM(PE_COSTO_TOT) AS TOTAL FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) AND PE_FOLIO = ?", Array As String("VENTA")) + s.Position =0 + ' If s.GetString("TOTAL") - s.GetString("TOTAL2") <> 0 Then + ' Printer1.WriteString("Descuento: $" & (s.GetString("TOTAL2") - s.GetString("TOTAL"))) + ' End If + Printer1.WriteString("Total venta: $" & s.GetString("TOTAL") & CRLF) + s.Close + c= skmt.ExecQuery2("select sum(PE_CANT) as PC_NOART from PEDIDO where PE_CLIENTE in (Select CUENTA from cuentaa) AND PE_PROID NOT IN (SELECT CAT_PA_ID FROM PROMOS_COMP ) AND PE_FOLIO = ?", Array As String("VENTA")) + C.Position=0 + Printer1.WriteString("Total articulos venta: " & c.GetString("PC_NOART") & CRLF) + c.Close + End If + Printer1.WriteString(" " & CRLF) +' Printer1.WriteString("------------------------------" & CRLF) + +' s=skmt.ExecQuery("select SUM(PE_COSTO_TOT) AS TOTAL FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") +' s.Position =0 +' ' If s.GetString("TOTAL") - s.GetString("TOTAL2") <> 0 Then +' ' Printer1.WriteString("Descuento: $" & (s.GetString("TOTAL2") - s.GetString("TOTAL"))) +' ' End If +' Printer1.WriteString("Total: $" & s.GetString("TOTAL") & CRLF) +' s.Close +' c= skmt.ExecQuery("select sum(PE_CANT) as PC_NOART from PEDIDO where PE_CLIENTE in (Select CUENTA from cuentaa) AND PE_PROID NOT IN (SELECT CAT_PA_ID FROM PROMOS_COMP )") +' C.Position=0 +' Printer1.WriteString("Total Articulos: " & c.GetString("PC_NOART") & CRLF) +' c.Close + + Printer1.WriteString(" " & CRLF) + Printer1.WriteString("------------------------------" & CRLF) + Printer1.WriteString("ENTREGA EN :" & CRLF) + Printer1.WriteString(la_Calle.Text & 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 +' printer.Flush + ' printer.Close +End Sub + +Sub Printer1_Connected (Success As Boolean) +' If Logger Then Log("Printer1_Connected") + If Success Then + ToastMessageShow("Impresora conectada", False) + skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("MACIMP")) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("MACIMP",B4XPages.MainPage.mac_impresora)) + 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 + B4XPages.MainPage.MAC_IMPRESORA = "0" + errorImpresora = 0 + End If + End If +End Sub + +Sub Printer_Connected (Success As Boolean) + If Success Then + B_IMP.Enabled = True + 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 L 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.ConnectInsecure(btAdmin,PairedDevices.Get(PairedDevices.GetKeyAt(0)),1) + Catch + Msgbox("Connecting","Printer Error") 'Ignore + printer.Close + cmp20.Disconnect + End Try + Else + L.Initialize + For i = 0 To PairedDevices.Size - 1 + L.Add(PairedDevices.GetKeyAt(i)) + Next + resimp = InputList(L, "Choose device", -1) 'Ignore + If resimp <> DialogResponse.CANCEL Then + cmp20.Connect(PairedDevices.Get(L.Get(resimp))) + End If + End If +End Sub + +Sub B_GUARDA_C_Click + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=B4XPages.MainPage.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + c.Close + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA) VALUES(?,?,?,?,?,?,?,?,?,?) ", Array As Object ("4",.01 , .01, 2, "KNORR RINDE MAS 70 GR", "GUNA2",la_cuenta.TEXT, sDate & sTime, usuario,LA_RUTA)) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO HIST_FACE(HFCLIENTE, HFALIAS,HFRUTA,HFALMACEN) VALUES (?,?,?,?) ", Array As Object(la_cuenta.Text, I_COMPRA.Text,LA_RUTA,ALMACEN)) + Panel1.Visible = False +' b_like.Visible = True + Tar.Visible = True + Tels.Visible = True + gest.Visible = True +' b_like.Visible = False + Guardar.Visible = True +End Sub + +Sub b_venta_Click + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) +' s=B4XPages.MainPage.skmt.ExecQuery("select COUNT(*) AS CUANTOS from HIST_ENCUESTA where HE_CLIE In (Select cuenta from cuentaa)") +' s.Position= 0 +' If s.GetString("CUANTOS") = 0 Then +' c=B4XPages.MainPage.skmt.ExecQuery2("SELECT CAT_VA_VALOR FROM CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String("CUESTIONARIO")) +' c.Position =0 +' If c.GetString("CAT_VA_VALOR") = "2" Then +' res = Msgbox2("El cliente maneja CAZARES ?","CAZARES", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'Ignore +' If res = DialogResponse.POSITIVE Then +' B4XPages.MainPage.skmt.ExecNonQuery2("insert into HIST_ENCUESTA(HE_CLIE, HE_RES, HE_FECHA, HE_TIPO) VALUES (?,?,?,?)", Array As Object(la_cuenta.Text, "SI",sDate & sTime,"TIENE")) +' Panel1.Visible =True +' I_COMPRA.Text = "" +' BT_QR.Visible= False +' Else +' B4XPages.MainPage.skmt.ExecNonQuery2("insert into HIST_ENCUESTA(HE_CLIE, HE_RES, HE_FECHA, HE_TIPO) VALUES (?,?,?,?)", Array As Object(la_cuenta.Text, "NO",sDate & sTime,"TIENE")) +' B4XPages.MainPage.tipo_venta = "VENTA" +' B4XPages.ShowPage("Productos") +' End If +' Else +' B4XPages.MainPage.tipo_venta = "VENTA" +' B4XPages.ShowPage("Productos") +' End If +' c.Close +' Else +' B4XPages.MainPage.tipo_venta = "VENTA" +' B4XPages.ShowPage("Productos") +' End If +' s.Close +End Sub + +Sub B_E_NEXT_Click + If E_RES_E.Text <> "" Then + B4XPages.MainPage.skmt.ExecNonQuery2("insert into HIST_ENCUESTA(HE_CLIE, HE_RES, HE_FECHA, HE_TIPO) VALUES (?,?,?,?)", Array As Object(la_cuenta.Text, E_RES_E.Text,sDate & sTime,"DONDE")) + Panel2.Visible = False + B4XPages.ShowPage("Productos") + Else + Msgbox("SIN RESPUESTA","AVISO") 'Ignore + End If +End Sub + +Sub RB1_CheckedChange(Checked As Boolean) + If RB1.Checked = True Then + E_RES_E.Text = "CENTRAL DE ABASTOS" + End If +End Sub + +Sub RB2_CheckedChange(Checked As Boolean) + If RB2.Checked = True Then + E_RES_E.Text = "AUTOSERVICIO" + End If +End Sub + +Sub RB3_CheckedChange(Checked As Boolean) + If RB3.Checked = True Then + E_RES_E.Text = "CLUB DE PRECIO" + End If +End Sub + +Sub RB4_CheckedChange(Checked As Boolean) + If RB4.Checked = True Then + E_RES_E.Text = "DIRECTO PEDEGREE" + End If +End Sub + +'Sub b_like_Click +' Panel1.Visible = True +' b_like.Visible = False +' Tar.Visible = False +' Tels.Visible = False +' gest.Visible = False +' b_venta.Visible = False +' Guardar.Visible = False +'End Sub + +'Sub B_GPS_Click +' Dim result As Int +' result = Msgbox2("Esta seguro de cambiar las coordenadas de este cliente", "Aviso GPS", "SI", "", "NO", LoadBitmap(File.DirAssets, "alerta.jpg")) 'Ignore +' If result = DialogResponse.Positive Then +' B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE kmt_info SET CAT_CL_LAT = ?, CAT_CL_LONG = ? where CAT_CL_CODIGO In (Select cuenta from cuentaa)", Array As Object(B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps)) +' B4XPage_Appear +' End If +'End Sub + +Private Sub p_cliente_Click + 'Nada aqui, solo esta para que los clics no se pasen hacia atras. +End Sub + +Private Sub cb_factura_CheckedChange(Checked As Boolean) +' Log(Checked) + If Checked Then p_cbFactura.Color = Colors.Green Else p_cbFactura.Color = Colors.red +End Sub + +Sub mandaPendientes +' PEDIDO_CLIENTE (Pendientes) + Log(">>>>>>> MANDA PENDIENTES") + Dim PCNoArts As String + Dim PCMonto As String + If usuario <> "KMTS1" Then + c = skmt.ExecQuery("SELECT * FROM PEDIDO_CLIENTE where PC_ENVIO_OK = 0") + Log($"Pedido_Cliente PENDIENTE: ${c.RowCount}"$) + If c.RowCount > 0 Then + For i = 0 To c.RowCount - 1 + c.Position = i + Log($"${c.GetString("PC_CLIENTE")}|${c.GetString("PC_FECHA")}|${c.GetString("PC_ENVIO_OK")}|"$) + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_pedidos_INTMEX" + cmd.Parameters = Array As Object(c.GetString("PC_CLIENTE"), c.GetString("PC_FECHA"), c.GetString("PC_USER"), c.GetString("PC_NOART"), c.GetString("PC_MONTO"), c.GetString("PC_LON"), c.GetString("PC_LAT"), Subs.traeAlmacen, B4XPages.MainPage.principal.l_ruta.text, c.GetString("PC_COSTO_SIN"), c.GetString("PC_FACTURA")) + PCNoArts = c.GetString("PC_NOART") + PCMonto = c.GetString("PC_MONTO") +' sql.insert_pedidos_INTMEX=INSERT INTO INTMEX.PEDIDO_CLIENTE(PC_FECHA_SINC,PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT,PC_IDALMACEN, PC_RUTA, PC_COSTO_SIN, PC_FACTURA) VALUES (SYSDATE,(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?)) + reqManager.ExecuteCommand(cmd , $"ins_pedidosPendientes_head_${c.GetString("PC_CLIENTE")}"$) + Next + End If + + 'PEDIDO (Pendientes) + c = skmt.ExecQuery($"SELECT PE_ENVIO_OK, PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_FECHA, PE_USUARIO, PE_COSTO_SIN, PE_RUTA, PE_DESC, PE_FOLIO FROM PEDIDO where PE_ENVIO_OK <> 1"$) + Log($"Pedido PENDIENTE: ${c.RowCount}"$) + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_pedido2_INTMEX" + cmd.Parameters = Array As Object(C.GetString("PE_CEDIS"),ALMACEN,C.GetString("PE_COSTO_TOT"),C.GetString("PE_COSTOU"),C.GetString("PE_CANT"),C.GetString("PE_PRONOMBRE"),C.GetString("PE_PROID"),C.GetString("PE_CLIENTE"),C.GetString("PE_FECHA"),C.GetString("PE_USUARIO"),C.GetString("PE_RUTA"), C.GetString("PE_COSTO_SIN"),C.GetString("PE_DESC"),c.GetString("PE_FOLIO"), PCNoArts, PCMonto) + reqManager.ExecuteCommand(cmd , $"ins_pedidosPendientes_prods_${c.GetString("PE_CLIENTE")}_${c.GetString("PE_PROID")}"$) + Log($">>>> INS_PEDIDO= ${C.GetString("PE_CEDIS")},${ALMACEN},${C.GetString("PE_COSTO_TOT")},${C.GetString("PE_COSTOU")},${C.GetString("PE_CANT")}, ${C.GetString("PE_PRONOMBRE")}, ${C.GetString("PE_PROID")}, ${C.GetString("PE_CLIENTE")}, ${C.GetString("PE_FECHA")}, ${C.GetString("PE_USUARIO")}, ${C.GetString("PE_RUTA")}, ${C.GetString("PE_COSTO_SIN")}, ${C.GetString("PE_DESC")}, ${c.GetString("PE_FOLIO")}, ${PCNoArts}, ${PCMonto}"$) +' sql.insert_pedido_INTMEX=INSERT INTO INTMEX.PEDIDO (PE_CODPROMO,PE_FECHA_SINC,PE_IDALMACEN,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_COSTO_SIN, PE_DESCUENTO, PE_TIPO) VALUES ((?),SYSDATE,(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),nvl((?),0),(?)) +' sql.insert_pedido2_INTMEX=INSERT INTO INTMEX.PEDIDO (PE_CODPROMO,PE_FECHA_SINC,PE_IDALMACEN,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_COSTO_SIN, PE_DESCUENTO, PE_TIPO, PE_CANT_TOTAL, PE_VENTA_TOTAL) VALUES ((?),SYSDATE,(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?),nvl((?),0),(?),(?),(?)) + Next + End If + + 'ABONOS + Dim ab As Cursor = B4XPages.MainPage.skmt.ExecQuery($"SELECT * from ABONOS where a_enviado is null"$) + Log(ab.RowCount) + If ab.RowCount > 0 Then + For i=0 To ab.RowCount -1 + ab.Position = i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_abono_INTMEX" + cmd.Parameters = Array As Object( ab.GetString("a_usuario"), ab.GetString("a_ruta"), ab.GetString("a_cliente"), ab.GetString("a_abono"), ab.GetString("a_fecha"),ALMACEN ) + reqManager.ExecuteCommand(cmd , $"ins_abonosPendientes_${ab.GetString("a_cliente")}"$) + Log($"ins_abonosPendientes_${ab.GetString("a_cliente")}"$) + Next + End If + ab.Close + + 'CLIENTES NUEVOS + Dim bb As Cursor = B4XPages.MainPage.skmt.ExecQuery($"SELECT * from CLIENTE_NUEVO where CN_enviado is null"$) + Dim cb As Cursor = B4XPages.MainPage.skmt.ExecQuery("SELECT ID_ALMACEN from CAT_ALMACEN") + cb.Position = 0 + If bb.RowCount > 0 Then + For i=0 To bb.RowCount -1 + bb.Position = i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_cliente_INTMEX" + cmd.Parameters = Array As Object( bb.GetString("CN_ID_CLIENTE"), bb.GetString("CN_NOMBRE"),B4XPages.MainPage.principal.l_ruta.Text,cb.GetString("ID_ALMACEN")) + reqManager.ExecuteCommand(cmd , $"insert_cliente_${bb.GetString("CN_ID_CLIENTE")}"$) + Log($"insert_cliente_${bb.GetString("CN_ID_CLIENTE")}"$) + Next + Log("si lo hice") + End If + bb.Close + cb.Close + +' BANDERA FACTURA (Pendientes) +' c=B4XPages.MainPage.skmt.ExecQuery("SELECT PC_FACTURA, PC_CLIENTE FROM pedido_cliente where PC_CLIENTE IN (Select CUENTA from cuentaa)") +' Log($"BANDERA FACTURA 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 = "update_factura_INTMEX" +' cmd.Parameters = Array As Object(C.GetString("PC_FACTURA"), C.GetString("PC_CLIENTE"), ALMACEN) +' reqManager.ExecuteCommand(cmd , "upd_facturasPendientes") +' Next +' ' sql.update_factura_INTMEX=UPDATE INTMEX.HIST_VENTAS SET HV_FACTURA = (?) WHERE HV_CLIENTE = (?) And HV_ALMACEN = (?) +' End If +' c.Close + +' CUESTIONARIO (Pendientes) + c = B4XPages.MainPage.skmt.ExecQuery("SELECT * FROM CUESTIONARIO where ifnull(Q_ENVIO_OK, 0) = 0 order by Q_IDCLIENTE, Q_IDPREGUNTA; Q_IDRESPUESTA") + Private rutaActual As String = Subs.traeRuta + Log("CUEST PENDIENTES: " & c.RowCount) + If c.RowCount > 0 Then + For x = 0 To c.RowCount - 1 + c.Position = x + Log($"insert_cuestionario_${c.GetString("Q_IDCLIENTE")}_${c.GetString("Q_IDPREGUNTA")}_${c.GetString("Q_IDRESPUESTA")}"$) + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_CUESTIONARIO_INTMEX" + cmd.Parameters = Array As Object(c.GetString("Q_IDCLIENTE"), rutaActual, ALMACEN, c.GetString("Q_FECHA"), c.GetString("Q_IDPREGUNTA"), c.GetString("Q_PREGUNTA"), c.GetString("Q_IDRESPUESTA"), C.GetString("Q_RESPUESTA")) + reqManager.ExecuteCommand(cmd , $"insert_cuestionario_${c.GetString("Q_IDCLIENTE")}_${c.GetString("Q_IDPREGUNTA")}_${c.GetString("Q_IDRESPUESTA")}"$) + Next + End If + c.Close + End If +End Sub + +Sub mandapiezas + If l_total.Text <> Null Or l_total.Text <> "null" Then + Dim PCNoArts As String + Dim PCMonto As String + c = skmt.ExecQuery2("SELECT * FROM PEDIDO_CLIENTE WHERE PC_CLIENTE = ?", Array As String(la_cuenta.Text)) + If c.RowCount > 0 Then + c.Position = 0 + Log(la_cuenta.Text&", "& ALMACEN&", "& LA_RUTA) + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_piezas_INTMEX" + cmd.Parameters = Array As Object(la_cuenta.Text, ALMACEN, LA_RUTA) + reqManager.ExecuteQuery(cmd , 0, "piezas") + + End If + End If +End Sub + +Sub JobDone(Job As HttpJob) +' Log(Job.Success) + If Job.Success = False Then +' ToastMessageShow("Error: " & Job.ErrorMessage, True) + Else + LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211027 + If Job.JobName = "DBRequest" Then + Dim resultado As DBResult = reqManager.HandleJob(Job) + If resultado.Tag.As(String).IndexOf("ins_pedidosPendientes_head_") > -1 Then + Subs.logJobDoneResultados(resultado) + Private cliente As String= resultado.Tag + cliente = cliente.SubString(cliente.IndexOf("_")+24) +' Log($"Cliente1:${cliente}"$) + For Each records() As Object In resultado.Rows + If records(resultado.Columns.Get("AffectedRows")).As(Int) = 1 Then +' Log(">>>>>>>> GUARDADO") + Private pars() As String = Regex.Split("_", resultado.tag) + B4XPages.MainPage.skmt.ExecNonQuery($"update PEDIDO_CLIENTE set PC_ENVIO_OK = 1 where PC_CLIENTE = '${pars(3)}'"$) +' Log($"update PEDIDO_CLIENTE set PC_ENVIO_OK = 1 where PC_CLIENTE = '${pars(3)}'"$) + End If +' For Each k As String In resultado.Columns.Keys +' Log(resultado.Tag & ": " & k & ": " & records(resultado.Columns.Get(k))) +' Next + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim resultado As DBResult = reqManager.HandleJob(Job) + If resultado.Tag = "piezas" Then 'query tag +' B4XPages.MainPage.picking.cl_picking.Clear + Dim piezasexiste As Int + + For Each records() As Object In resultado.Rows + + piezasexiste = records(resultado.Columns.Get("COUNT(*)")) + Log(piezasexiste) + DateTime.DateFormat = "MM/dd/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + If piezasexiste = 0 Then + + Dim PCNoArts As String + Dim PCMonto As String + c = skmt.ExecQuery2("SELECT * FROM PEDIDO_CLIENTE WHERE PC_CLIENTE = ?", Array As String(la_cuenta.Text)) + + If c.RowCount > 0 Then + c.Position = 0 + PCNoArts = c.GetString("PC_NOART") + PCMonto = c.GetString("PC_MONTO") + End If + + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_HVC_INTMEX" + cmd.Parameters = Array As Object((sDate & " " & sTime), la_cuenta.Text, PCNoArts, PCMonto, ALMACEN, LA_RUTA) + reqManager.ExecuteCommand(cmd , "insert_hvc") +' reqManager.ExecuteCommand(cmd , $"ins_abonosPendientes_${ab.GetString("a_cliente")}"$) + + Else If piezasexiste = 1 Then + Dim PCNoArts As String + Dim PCMonto As String + c = skmt.ExecQuery2("SELECT * FROM PEDIDO_CLIENTE WHERE PC_CLIENTE = ?", Array As String(la_cuenta.Text)) + + If c.RowCount > 0 Then + c.Position = 0 + PCNoArts = c.GetString("PC_NOART") + PCMonto = c.GetString("PC_MONTO") + End If + cmd.Initialize + cmd.Name = "update_HVC_INTMEX" + cmd.Parameters = Array As Object((sDate & " " & sTime), la_cuenta.Text, PCNoArts, PCMonto, ALMACEN, LA_RUTA, la_cuenta.Text, ALMACEN, LA_RUTA) + reqManager.ExecuteCommand(cmd, "update_hvc") + + End If + Next + + + End If + End If + + If Job.JobName = "DBRequest" Then + Dim resultado As DBResult = reqManager.HandleJob(Job) + If resultado.Tag.As(String).IndexOf("ins_pedidosPendientes_prods_") > -1 Then + Subs.logJobDoneResultados(resultado) + Private cliente As String= resultado.Tag + cliente = cliente.SubString(cliente.IndexOf("_")+25) + Log($"Cliente2:${cliente}"$) + For Each records() As Object In resultado.Rows +' If records(resultado.Columns.Get("AffectedRows")).As(Int) = 1 Then Log(">>>>>>>> GUARDADO") + Private pars() As String = Regex.Split("_", resultado.tag) + B4XPages.MainPage.skmt.ExecNonQuery($"update PEDIDO set PE_ENVIO_OK = 1 where PE_CLIENTE = '${pars(3)}' and PE_PROID = '${pars(4)}' and PE_ENVIO_OK = 0"$) +' Log($"update PEDIDO set PE_ENVIO_OK = 1 where PE_CLIENTE = '${pars(3)}' and PE_PROID = '${pars(4)}' and PE_ENVIO_OK = 0"$) +' For Each k As String In resultado.Columns.Keys +' Log(resultado.Tag & ": " & k & ": " & records(resultado.Columns.Get(k))) +' Next + Next + End If + End If + + 'ABONOS PENDIENTES + If Job.JobName = "DBRequest" Then + Dim resultado As DBResult = reqManager.HandleJob(Job) + If resultado.Tag.As(String).IndexOf("ins_abonosPendientes_") > -1 Then + Private cliente As String= resultado.Tag + cliente = cliente.SubString(cliente.IndexOf("_")+18) + Log($"Cliente2:${cliente}"$) + For Each records() As Object In resultado.Rows + For Each k As String In resultado.Columns.Keys + Log(resultado.Tag & ": " & k & ": " & records(resultado.Columns.Get(k))) + Next + Next + B4XPages.MainPage.skmt.ExecNonQuery($"UPDATE ABONOS set a_enviado = 1 where a_cliente = '${cliente}'"$) + End If + End If + + 'CLIENTES NUEVOS + If Job.JobName = "DBRequest" Then + Dim resultado As DBResult = reqManager.HandleJob(Job) + If resultado.Tag.As(String).IndexOf("insert_cliente_") > -1 Then + Private cliente As String= resultado.Tag + cliente = cliente.SubString(cliente.IndexOf("_")+9) + Log($"Cliente2:${cliente}"$) + For Each records() As Object In resultado.Rows + For Each k As String In resultado.Columns.Keys + Log(resultado.Tag & ": " & k & ": " & records(resultado.Columns.Get(k))) + Next + Next + B4XPages.MainPage.skmt.ExecNonQuery($"UPDATE CLIENTE_NUEVO set CN_enviado = 1 where CN_ID_CLIENTE = '${cliente}'"$) + End If + End If + + 'CUESTIONARIO + If Job.JobName = "DBRequest" Then + Dim resultado As DBResult = reqManager.HandleJob(Job) + If resultado.Tag.As(String).IndexOf("insert_cuestionario_") > -1 Then + Private pars() As String = Regex.Split("_", resultado.Tag.As(String)) + Log($"${resultado.tag}|${pars(0)}"$) + Log($"${pars(1)}"$) + Log($"${pars(2)}"$) + Log($"${pars(3)}"$) + Log($"${pars(4)}"$) + Private cliente As String = pars(2) + Private idPreg As String = pars(3) + Private idResp As String = pars(4) + Log($"Cliente2:${cliente}, preg:${idPreg}, res:${idResp}"$) + 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 + B4XPages.MainPage.skmt.ExecNonQuery($"UPDATE CUESTIONARIO set Q_ENVIO_OK = 1 where Q_IDCLIENTE = '${cliente}' and Q_IDPREGUNTA='${idPreg}' and Q_IDRESPUESTA='${idResp}'"$) + End If + End If + + Job.Release + End If + +End Sub + +Private Sub p_abono_Click + +End Sub + +Private Sub b_abono_Click + p_abono.Visible = False + If et_abono.text > l_montoabonostotal.text Then + MsgboxAsync("El monto a abonar no puede ser mayor que el monto total","Atención" ) + Else + If et_abono.Text <> "" Then + Msgbox2Async($"¿Seguro que quieres realizar un abono de $${et_abono.text} para este cliente?"$, "Guardar Abono", "Guardar", "Cancelar", "", Null, True) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + skmt.ExecNonQuery($"INSERT INTO ABONOS(a_usuario, a_ruta, a_cliente, a_abono, a_fecha) VALUES ('${Subs.traeUsuarioDeBD}', '${Subs.traeRuta}', '${Subs.traeCliente}' ,'${et_abono.text}', '${Subs.fechaKMT(DateTime.now)}')"$) + ToastMessageShow("Abono guardado", False) + End If + End If + End If + et_abono.Text = "" + ime.HideKeyboard +End Sub + +Private Sub b_cancelar_Click + et_abono.Text = "" + p_abono.Visible = False + ime.HideKeyboard +End Sub + +Private Sub b_abono1_Click + p_abono.Visible = True +End Sub + +Private Sub b_cxc_Click + + h = B4XPages.MainPage.skmt.ExecQuery("SELECT CUENTA from CUENTAA") + h.Position = 0 + Log(h.GetString("CUENTA")) + j = B4XPages.MainPage.skmt.ExecQuery2("SELECT a_abono AS CUANTOS 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 + Dim total As String = 0 + f = B4XPages.MainPage.skmt.ExecQuery("SELECT CUENTA FROM CUENTAA") + f.Position = 0 + + d = B4XPages.MainPage.skmt.ExecQuery2("SELECT NOTA, SALDO_PENDIENTE FROM ABONOSP WHERE CLIENTE = ? ", Array As String (f.GetString("CUENTA"))) + clv_abonos.Clear + For i = 0 To d.RowCount - 1 + d.Position = i + clv_abonos.Add(CreateListItem(d.GetString("NOTA"),"$ " & d.GetString("SALDO_PENDIENTE")),i) + Log(d.GetString("NOTA")) + Log(d.GetString("SALDO_PENDIENTE")) + total = total + d.GetString("SALDO_PENDIENTE") + Log(total) + Next + l_montoabonostotal.Text = total + d.Close + f.Close + + Else If j.RowCount > 0 Then + MsgboxAsync("Este cliente ya tiene un pago capturado","Atención") + End If + h.Close + j.Close + + +End Sub + +Sub CreateListItem(mostrar As String, mostrar1 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 +' cxc.Text = mostrar3 +' Log(p.Width) + Return p +End Sub + +Sub cuest_preguntaContestada(m As Map) +' Recibimos el id de la pregunta, el id de la respuesta, el texto de la respuesta y el objeto del panelSombra para poder ocultarlo. + Log(m) +' If q.IsInitialized Then Log($"${q.encuestaIniciada}|${q.preguntaActual}"$) +' m.Get("panel").As(Panel).Visible = False 'Ocultamos el panel de la pregunta. + m.Get("panel").As(Panel).RemoveView 'Quitamos le panel de la pregunta + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + Starter.skmt.ExecNonQuery($"delete from CUESTIONARIO where Q_IDCLIENTE = '${Subs.traeCliente}' and Q_IDPREGUNTA = '${m.Get("idPregunta")}'"$) + Starter.skmt.ExecNonQuery($"insert into CUESTIONARIO (Q_RUTA, Q_ALMACEN, Q_IDCLIENTE, Q_IDPREGUNTA, Q_PREGUNTA, Q_IDRESPUESTA, Q_RESPUESTA, Q_FECHA) values ('${Subs.traeRuta}', '${Subs.traeAlmacen}', '${Subs.traeCliente}', '${m.Get("idPregunta")}', '${m.Get("pregunta")}', '${m.Get("idRespuesta")}', '${m.Get("respuesta")}', '${DateTime.Date(DateTime.now)} ${DateTime.time(DateTime.now)}')"$) + Select Case m.Get("idPregunta") + Case "1" + If m.Get("respuesta") = "No, está enrejado o no se tiene acceso" Then + Log("Tiendajon / Ventana / Kiosko") + ToastMessageShow("Tiendajon / Ventana / Kiosko", False) + cuest.agregaPregunta("6", "¿Cuenta con caja de salida para cobro con sistema de computo?", Array As String("Si, tiene sistema de computo para cobro", "No")) + Else if m.Get("respuesta") = "Si se pude acceder" Then + cuest.agregaPregunta("2", "¿Tiene al menos 2 pasillos con acceso directo a la mercancía?", Array As String("Si tiene al menos 2 pasillos con acceso directo a la mercancía", "No tiene pasillos o solo uno central")) + End If + Case "2" + If m.Get("respuesta") = "Si tiene al menos 2 pasillos con acceso directo a la mercancía" Then + Log("Mini-Super") + ToastMessageShow("Mini-Super", False) + cuest.agregaPregunta("6", "¿Cuenta con caja de salida para cobro con sistema de computo?", Array As String("Si, tiene sistema de computo para cobro", "No")) + else If m.Get("respuesta") = "No tiene pasillos o solo uno central" Then + cuest.agregaPregunta("3", "¿Cuenta con enfriador horizontal para venta de perecederos como queso, jamon, crema, etc.?", Array As String("Si", "No tiene enfriador horizontal.")) + End If + Case "3" + Log("|"&m.Get("respuesta")&"|") + If m.Get("respuesta") = "Si" Then + Log("Miscelanea") + ToastMessageShow("Miscelanea", False) + cuest.agregaPregunta("6", "¿Cuenta con caja de salida para cobro con sistema de computo?", Array As String("Si, tiene sistema de computo para cobro", "No")) + else If m.Get("respuesta") = "No tiene enfriador horizontal." Then + cuest.agregaPregunta("4", "¿El local esta enfocado a venta especializada?", Array As String("No", "Si")) + End If + Case "4" + If m.Get("respuesta") = "No" Then + Log("Abarrotera") + ToastMessageShow("Abarrotera", False) + cuest.agregaPregunta("6", "¿Cuenta con caja de salida para cobro con sistema de computo?", Array As String("Si, tiene sistema de computo para cobro", "No")) + else If m.Get("respuesta") = "Si" Then + cuest.agregaPregunta("5", "¿Cual venta especializada?", Array As String("Carnicería / Pollería", "Cremería", "Depósito / Vinateria", "Dulcería", "Farmacia", "Fonda / Restaurante / Cafetería", "Verdulería")) + End If + Case "5" + Log(m.Get("respuesta")) + ToastMessageShow(m.Get("respuesta"), False) +' If m.Get("respuesta") = "No" Then +' Log("Abarrotera") +' q.agregaPregunta("5", "¿Cuenta con caja de salida para cobro con sistema de computo?", Array As String("Si, tiene sistema de computo para cobro", "No")) +' else If m.Get("respuesta") = "Si" Then + cuest.agregaPregunta("6", "¿Cuenta con caja de salida para cobro con sistema de computo?", Array As String("Si, tiene sistema de computo para cobro", "No")) +' End If + Case "6" + Log(m.Get("respuesta")) + ToastMessageShow(m.Get("respuesta"), False) + Log(">>>>>>>>>> " & cuest.encuestaIniciada) + cuest.encuestaIniciada = False + Log(">>>>>>>>>> " & cuest.encuestaIniciada) +' refrescarCliente = True +' Log($"#### REFRESCAR CLIENTE -> ${refrescarCliente}"$) + B4XPage_Appear +' Case 6 + End Select +End Sub + + +Private Sub b_ventaabordo_Click +' c=B4XPages.MainPage.skmt.ExecQuery("Select * From CAT_GUNAPROD2") + c=B4XPages.MainPage.skmt.ExecQuery2("Select * From CAT_GUNAPROD2 where cat_gp_tipo <> ? " , Array As String ("PROMOS")) + If c.RowCount > 0 Then + + + + B4XPages.MainPage.tipo_venta = "VENTA" +' If B4XPages.MainPage.productos.clv_prods_ll.Size = 0 Then +' B4XPages.MainPage.productos.LlenaProdsLL(Null) +' Else +' +' B4XPages.MainPage.productos.clv_prods_ll.Clear +' End If + 'Buscamos en el historial de cuestionarios si el cliente ya tiene cuestionario contestado. + Private hc As Cursor = Starter.skmt.ExecQuery($"select count(HC_CLIENTE) as cuantos from HIST_CUESTIONARIO where HC_CLIENTE = '${Subs.traeCliente}'"$) + hc.Position = 0 + Log($"${cuest.encuestaIniciada} - ${hc.GetString("cuantos")} - ${cuest.clienteConCuestionario(Subs.traeCliente)}"$) + If Not(cuest.encuestaIniciada) And hc.GetString("cuantos") = 0 And Not(cuest.clienteConCuestionario(Subs.traeCliente)) Then + cuest.agregaPregunta("1", "¿Se puede acceder al negocio o está enrejado?", Array As String("No, está enrejado o no se tiene acceso", "Si se pude acceder")) + Return False + End If + Private x As Cursor = B4XPages.MainPage.skmt.ExecQuery($"select tienda_id from COORDENADAS_GPS where tienda_id = '${la_cuenta.text}'"$) +' Log("+++++++++++++ " & x.RowCount) + If distance > 50 And x.RowCount = 0 Then + Private res As String = Msgbox2("¿Estas en la tienda, para guardar la nueva ubicación?", "AVISO", "Si","" ,"No", Null) 'ignore + If res = DialogResponse.POSITIVE Then + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + B4XPages.MainPage.skmt.ExecNonQuery($"insert into COORDENADAS_GPS (tienda_id, ruta, almacen, latitud, longitud, fecha) values ('${la_cuenta.Text}', '${Subs.traeRuta}', '${Subs.traeAlmacen}', '${B4XPages.MainPage.lat_gps}', '${B4XPages.MainPage.lon_gps}', '${sDate} ${sTime}')"$) + + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_coords_nuevas_INTMEX" + cmd.Parameters = Array As Object(la_cuenta.text, Subs.traeRuta, Subs.traeAlmacen, sDate & " " & sTime, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps, usuario) +' Log($"${la_cuenta.text}, ${Subs.traeRuta}, ${Subs.traeAlmacen}, ${sDate} ${sTime}, ${m_lat}, ${m_lon}"$) + reqManager.ExecuteCommand(cmd , "ins_coords_nuevas") + End If + End If + 'Si hay mapa de productos es que hay venta en proceso, entonces borramos la actual para meter la nueva. +' If B4XPages.MainPage.productos.prodsMap.IsInitialized And B4XPages.MainPage.productos.prodsMap.Size > 0 Then Subs.borraPedidoClienteActual + B4XPages.ShowPage("productos") + + + Else If c.RowCount = 0 Then + + MsgboxAsync("No puedes hacer venta porque no tienes inventario abordo","Atención") + + End If + +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..548b3dc --- /dev/null +++ b/B4A/C_Clientes.bas @@ -0,0 +1,443 @@ +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 skmt As SQL + Dim c As Cursor + Dim c2 As Cursor + Dim d As Cursor + Dim s As Cursor + Dim ListView1 As ListView + Dim entro As String + Dim gest As Button + Dim lfila As Label + Dim busca As EditText + Dim colonia As String + Private b_qr As Button + Private qr As QRCode + ' Dim sc As Zxing_scanner + Dim CODIGO As String + Dim STIME As String + + Dim ruta As String + Dim q_buscar As String + Private p_clientes As Panel + Private CustomListView1 As CustomListView + Private numerocliente As Label + Private nombrecliente As Label + Private direccion As Label + Private cxc As Label + Private p_datosclie As Panel + Private b_buscar As Button + Private CHECK As Int + Private l_baseodia 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 + 'load the layout to Root + Root.LoadLayout("clientes") + 'Dim ruta As String + entro ="2" + ' valido donde escribo el archivo de la base de datos de kmt +' If File.ExternalWritable Then +' ruta = File.DirDefaultExternal +' Else + ruta = File.DirInternal +' End If + + ' se crea o no el archivo de la base de ddatos de kmt + 'NOTAS SI SE MODIFICA LA ESTRUCTURA SE QUITA EL IF Y SE VA DIRECTO A LA SENTENCIA FILE.COPY PARA QUE + 'TOME LA NUEVA ESTRUCTURA ES MUY IMPORTANTE TENER EL IF DE LO CONTRARIO SOLO LO ESCRIBE UNA VEZ Y LO BORRA + 'SI SE REGRESA A ESTE ACTIVIDAD. + If File.Exists(ruta, "kmt.db") = False Then + File.Copy(File.DirAssets, "kmt.db", ruta, "kmt.db") + End If + qr.initialize +End Sub + +Sub B4XPage_Appear + l_baseodia.Text = "Clientes del día de visita" + CHECK = 0 + busca.Text = "" + entro ="2" + colonia = 0 + c=B4XPages.MainPage.skmt.ExecQuery($"select CAT_CL_NOMBRE, CAT_CL_CALLE, CAT_CL_CODIGO from kmt_info where gestion = 0 AND CAT_CL_CODIGO <> ${"0"} ORDER BY CAT_CL_CODIGO"$) + ListView1.Clear + lfila.Text = "NOMBRE" + + CustomListView1.Clear + For i = 0 To c.RowCount - 1 + c.Position = i + CustomListView1.Add(CreateListItem(c.GetString("CAT_CL_NOMBRE"),c.GetString("CAT_CL_CALLE"),c.GetString("CAT_CL_CODIGO")),i) + d = B4XPages.MainPage.skmt.ExecQuery($"select CLIENTE FROM ABONOSP WHERE CLIENTE = '${c.GetString("CAT_CL_CODIGO")}'"$) + If d.RowCount = 0 Then + cxc.Visible = False + Else + cxc.Visible = True + End If + d.Close + Next + 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 = 13 + label1.TextColor = Colors.Black + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 13 + label2.TextColor = Colors.Black + ListView1.AddTwoLines(c.GetString("CAT_CL_CODIGO"), c.GetString("CAT_CL_NOMBRE")) + Next + End If + c.Close + entro = "4" +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 + +Sub ListView1_ItemClick (Position As Int, value As Object) + If colonia = 0 Then + colonia = value + End If + If entro = "2" Then + c2=B4XPages.MainPage.skmt.ExecQuery2("select CAT_CL_CALLE, CAT_CL_COLONIA, count(*) as cuantos from kmt_info where gestion = 0 and CAT_CL_COLONIA = ? GROUP BY CAT_CL_CALLE, CAT_CL_COLONIA order by CAT_CL_CALLE ", Array As String(value)) + ListView1.Clear + lfila.text = "Calle" + If c2.RowCount>0 Then + For i=0 To c2.RowCount -1 + c2.Position=i + ListView1.AddTwoLines(c2.GetString("CAT_CL_CALLE"),c2.GetString("cuantos") ) + Next + End If + entro = "3" + Else If entro = "3" Then + c2=B4XPages.MainPage.skmt.ExecQuery2("select CAT_CL_NOMBRE, CAT_CL_CALLE, CAT_CL_CODIGO from kmt_info where gestion = 0 and CAT_CL_CALLE = ? AND CAT_CL_COLONIA = ? order by CAT_CL_NOMBRE ", Array As String(value, colonia)) + ListView1.Clear + lfila.text = "Nombre" + If c2.RowCount>0 Then + For i=0 To c2.RowCount -1 + c2.Position=i + ListView1.AddTwoLines(c2.GetString("CAT_CL_CODIGO"), c2.GetString("CAT_CL_NOMBRE")) + Next + End If + entro = "4" + Else If entro = "4" Then + B4XPages.MainPage.skmt.ExecNonQuery("delete from CUENTAA") + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object(value)) + DateTime.TimeFormat = "HHmmss" + STIME=DateTime.Time(DateTime.Now) + + s=B4XPages.MainPage.skmt.ExecQuery2("SELECT COUNT(*) AS CUANTOS FROM HIST_STAY_STORE WHERE HSS_IN = ? AND HSS_CODIGO In (select cuenta from cuentaa)", Array As String("0")) + s.Position = 0 + If s.GetString("CUANTOS") = 1 Then + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE HIST_STAY_STORE set HSS_IN = ? where HSS_IN = 0 AND HSS_CODIGO In (select cuenta from cuentaa)", Array As Object(STIME)) + Else + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO HIST_STAY_STORE(HSS_CODIGO, HSS_IN , HSS_OUT , HSS_TOT) VALUES (?,0,0,0)", Array As Object (value)) + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE HIST_STAY_STORE set HSS_IN = ? where HSS_IN = 0 AND HSS_CODIGO In (select cuenta from cuentaa)", Array As Object(STIME)) + End If + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE HIST_STAY_OUT set HSO_INI = ? where HSO_INI = 0 ", Array As Object(STIME)) + DateTime.TimeFormat = "HH:mm:ss" + + Subs.guardaClienteHoraInicio(value) + + B4XPages.ShowPage("Cliente") + End If +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub + ' BACK key pressed + 'Return True to close, False to cancel +' If key=KeyCodes.KEYCODE_BACK Then +' StartActivity(seleccion) +' Return False +' End If + Return True +End Sub + +Sub BUSCA_TextChanged (Old As String, New As String) + If CHECK = 0 Then + q_buscar = "%" & busca.Text & "%" + c2=B4XPages.MainPage.skmt.ExecQuery2($"select CAT_CL_NOMBRE, CAT_CL_CALLE, CAT_CL_CODIGO from kmt_info where (CAT_CL_NOMBRE like ? OR CAT_CL_CODIGO LIKE ? OR CAT_CL_CALLE LIKE ?)and gestion = 0 AND CAT_CL_CODIGO <> ${"0"} order by CAT_CL_NOMBRE "$, Array As String(q_buscar,q_buscar,q_buscar)) + ListView1.Clear + lfila.text = "Nombre y Calle" + + CustomListView1.Clear + For i = 0 To c2.RowCount - 1 + c2.Position = i + CustomListView1.Add(CreateListItem(c2.GetString("CAT_CL_NOMBRE"),c2.GetString("CAT_CL_CALLE"),c2.GetString("CAT_CL_CODIGO")),i) + d = B4XPages.MainPage.skmt.ExecQuery($"select CLIENTE FROM ABONOSP WHERE CLIENTE = '${c2.GetString("CAT_CL_CODIGO")}'"$) + If d.RowCount = 0 Then + cxc.Visible = False + Else + cxc.Visible = True + End If + d.Close + Next + + + 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 = 9 + label1.TextColor = Colors.White + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 17 + label2.TextColor = Colors.White + ListView1.AddTwoLines(c2.GetString("CAT_CL_CODIGO"), c2.GetString("CAT_CL_NOMBRE") &" CALLE: "& c2.GetString("CAT_CL_CALLE")) + Next + End If + entro = "4" + c2.Close + Else If CHECK = 1 Then + q_buscar = "%" & busca.Text & "%" + c2=B4XPages.MainPage.skmt.ExecQuery2("select CAT_CL_NOMBRE, CAT_CL_CALLE, CAT_CL_CODIGO from kmt_info2 where (CAT_CL_NOMBRE like ? OR CAT_CL_CODIGO LIKE ? OR CAT_CL_CALLE LIKE ?)and gestion = 0 order by CAT_CL_NOMBRE ", Array As String(q_buscar,q_buscar,q_buscar)) + ListView1.Clear + lfila.text = "Nombre y Calle" + + CustomListView1.Clear + For i = 0 To c2.RowCount - 1 + c2.Position = i + CustomListView1.Add(CreateListItem(c2.GetString("CAT_CL_NOMBRE"),c2.GetString("CAT_CL_CALLE"),c2.GetString("CAT_CL_CODIGO")),i) + d = B4XPages.MainPage.skmt.ExecQuery($"select CLIENTE FROM ABONOSP WHERE CLIENTE = '${c2.GetString("CAT_CL_CODIGO")}'"$) + If d.RowCount = 0 Then + cxc.Visible = False + Else + cxc.Visible = True + End If + d.Close + Next + + + 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 = 9 + label1.TextColor = Colors.White + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 17 + label2.TextColor = Colors.White + ListView1.AddTwoLines(c2.GetString("CAT_CL_CODIGO"), c2.GetString("CAT_CL_NOMBRE") &" CALLE: "& c2.GetString("CAT_CL_CALLE")) + Next + End If + entro = "4" + c2.Close + End If +End Sub + +Sub b_qr_Click + Dim scan_width As Int + Dim scan_height As Int + scan_width = 400 + scan_height = 400 +End Sub + +Sub sc_result(atype As String,Values As String) + CODIGO = Values + c2=B4XPages.MainPage.skmt.ExecQuery2("select COUNT(*) AS ENCONTRADO from kmt_info where CAT_CL_NUM_SERIEFISICO = ? order by CAT_CL_NOMBRE ", Array As String(CODIGO)) + c2.Position =0 + If c2.GetString("ENCONTRADO") > 0 Then + s=B4XPages.MainPage.skmt.ExecQuery2("select CAT_CL_CODIGO from kmt_info where CAT_CL_NUM_SERIEFISICO = ? order by CAT_CL_NOMBRE ", Array As String(CODIGO)) + s.Position =0 + B4XPages.MainPage.skmt.ExecNonQuery("delete from CUENTAA") + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object(s.GetString("CAT_CL_CODIGO"))) + s.Close +' b_qr.Visible = False + B4XPages.ShowPage("clientes") + Else + Msgbox("CODIGO " & CODIGO & " NO ENCONTRADO","AVISO") 'ignore + End If +End Sub + +Sub sc_noScan + Log("nothing returned from the scan !!!!!") +End Sub + +Sub calc_ean_checksum(number As String) As String 'this has now become redundant as I am only interested in QR Codes + Dim i As Int + Dim cO As Char + Dim soma As Int + Dim n As Int + Dim digit As Float + soma = 0 + For i=0 To number.Length - 1 + digit = number.SubString2(i,i+1) + n= digit * ((i Mod 2) * 2 + 1) + soma=soma+n + Next + Return number & ( ( 10 - ( soma Mod 10 )) Mod 10 ) +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Private Sub p_clientes_Click + 'Nada aqui, solo esta para que los clics no se pasen hacia atras. +End Sub + +Private Sub p_datosclie_Click + If colonia = 0 Then + colonia = Sender.As(Panel).tag + End If + If entro = "2" Then + c2=B4XPages.MainPage.skmt.ExecQuery2("select CAT_CL_CALLE, CAT_CL_COLONIA, count(*) as cuantos from kmt_info where gestion = 0 and CAT_CL_COLONIA = ? GROUP BY CAT_CL_CALLE, CAT_CL_COLONIA order by CAT_CL_CALLE ", Array As String(Sender.As(Panel).tag)) + ListView1.Clear + lfila.text = "Calle" + If c2.RowCount>0 Then + For i=0 To c2.RowCount -1 + c2.Position=i + ListView1.AddTwoLines(c2.GetString("CAT_CL_CALLE"),c2.GetString("cuantos") ) + Next + End If + entro = "3" + Else If entro = "3" Then + c2=B4XPages.MainPage.skmt.ExecQuery2("select CAT_CL_NOMBRE, CAT_CL_CALLE, CAT_CL_CODIGO from kmt_info where gestion = 0 and CAT_CL_CALLE = ? AND CAT_CL_COLONIA = ? order by CAT_CL_NOMBRE ", Array As String(Sender.As(Panel).tag, colonia)) + ListView1.Clear + lfila.text = "Nombre" + If c2.RowCount>0 Then + For i=0 To c2.RowCount -1 + c2.Position=i + ListView1.AddTwoLines(c2.GetString("CAT_CL_CODIGO"), c2.GetString("CAT_CL_NOMBRE")) + Next + End If + entro = "4" + Else If entro = "4" Then + B4XPages.MainPage.skmt.ExecNonQuery("delete from CUENTAA") + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object(Sender.As(Panel).tag)) + DateTime.TimeFormat = "HHmmss" + STIME=DateTime.Time(DateTime.Now) + + s=B4XPages.MainPage.skmt.ExecQuery2("SELECT COUNT(*) AS CUANTOS FROM HIST_STAY_STORE WHERE HSS_IN = ? AND HSS_CODIGO In (select cuenta from cuentaa)", Array As String("0")) + s.Position = 0 + If s.GetString("CUANTOS") = 1 Then + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE HIST_STAY_STORE set HSS_IN = ? where HSS_IN = 0 AND HSS_CODIGO In (select cuenta from cuentaa)", Array As Object(STIME)) + Else + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO HIST_STAY_STORE(HSS_CODIGO, HSS_IN , HSS_OUT , HSS_TOT) VALUES (?,0,0,0)", Array As Object (Sender.As(Panel).tag)) + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE HIST_STAY_STORE set HSS_IN = ? where HSS_IN = 0 AND HSS_CODIGO In (select cuenta from cuentaa)", Array As Object(STIME)) + End If + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE HIST_STAY_OUT set HSO_INI = ? where HSO_INI = 0 ", Array As Object(STIME)) + DateTime.TimeFormat = "HH:mm:ss" + + Subs.guardaClienteHoraInicio(Sender.As(Panel).tag) + + B4XPages.ShowPage("Cliente") + End If + + +' Log(Sender.As(Panel).tag) +End Sub + +Private Sub b_buscar_Click + Log(CHECK) + If CHECK = 0 Then + l_baseodia.Text = "Clientes de base de datos" + CHECK = 1 + busca.Text = "" + entro ="2" + colonia = 0 + c=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_NOMBRE, CAT_CL_CALLE, CAT_CL_CODIGO from kmt_info2 where gestion = 0 ORDER BY CAT_CL_CODIGO") + ListView1.Clear + lfila.Text = "NOMBRE" + ListView1.Clear + CustomListView1.Clear + For i = 0 To c.RowCount - 1 + c.Position = i + CustomListView1.Add(CreateListItem(c.GetString("CAT_CL_NOMBRE"),c.GetString("CAT_CL_CALLE"),c.GetString("CAT_CL_CODIGO")),i) + d = B4XPages.MainPage.skmt.ExecQuery($"select CLIENTE FROM ABONOSP WHERE CLIENTE = '${c.GetString("CAT_CL_CODIGO")}'"$) + If d.RowCount = 0 Then + cxc.Visible = False + Else + cxc.Visible = True + End If + d.Close + Next + 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 = 13 + label1.TextColor = Colors.Black + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 13 + label2.TextColor = Colors.Black + ListView1.AddTwoLines(c.GetString("CAT_CL_CODIGO"), c.GetString("CAT_CL_NOMBRE")) + Next + End If + c.Close + entro = "4" + + Else If CHECK = 1 Then + l_baseodia.Text = "Clientes del día de visita" + CHECK = 0 + busca.Text = "" + entro ="2" + colonia = 0 + c=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_NOMBRE, CAT_CL_CALLE, CAT_CL_CODIGO from kmt_info where gestion = 0 ORDER BY CAT_CL_CODIGO") + ListView1.Clear + lfila.Text = "NOMBRE" + ListView1.Clear + CustomListView1.Clear + For i = 0 To c.RowCount - 1 + c.Position = i + CustomListView1.Add(CreateListItem(c.GetString("CAT_CL_NOMBRE"),c.GetString("CAT_CL_CALLE"),c.GetString("CAT_CL_CODIGO")),i) + d = B4XPages.MainPage.skmt.ExecQuery($"select CLIENTE FROM ABONOSP WHERE CLIENTE = '${c.GetString("CAT_CL_CODIGO")}'"$) + If d.RowCount = 0 Then + cxc.Visible = False + Else + cxc.Visible = True + End If + d.Close + Next + 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 = 13 + label1.TextColor = Colors.Black + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 13 + label2.TextColor = Colors.Black + ListView1.AddTwoLines(c.GetString("CAT_CL_CODIGO"), c.GetString("CAT_CL_NOMBRE")) + Next + End If + c.Close + entro = "4" + + End If +End Sub \ No newline at end of file diff --git a/B4A/C_Cuestionario.bas b/B4A/C_Cuestionario.bas new file mode 100644 index 0000000..10422ee --- /dev/null +++ b/B4A/C_Cuestionario.bas @@ -0,0 +1,179 @@ +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 bAceptarPregunta As Button + Dim encuestaIniciada As Boolean = False + Private Root2 As B4XView + Private EventName As String 'ignore + Private CallBack As Object 'ignore + Private vPreguntaActual As String + Private db As SQL +' Private clienteAnt As String = "" + Dim panelSombra As Panel 'Panel de sombra. +End Sub + +'You can add more parameters here. +Public Sub Initialize (vCallback As Object, vEventName As String, vRoot As B4XView, skmt As SQL) As Object + Root2 = vRoot + EventName = vEventName + CallBack = vCallback + db = skmt + vPreguntaActual = 0 + db.ExecNonQuery("CREATE TABLE IF NOT EXISTS CUESTIONARIO (Q_RUTA TEXT, Q_ALMACEN TEXT, Q_IDCLIENTE TEXT, Q_IDPREGUNTA TEXT, Q_PREGUNTA TEXT, Q_IDRESPUESTA TEXT, Q_RESPUESTA TEXT, Q_FECHA TEXT, Q_ENVIO_OK INTEGER DEFAULT 0)") + agregaColumna("CUESTIONARIO", "Q_ENVIO_OK", "TEXT") + agregaColumna("CUESTIONARIO", "Q_RUTA", "TEXT") + agregaColumna("CUESTIONARIO", "Q_ALMACEN", "TEXT") + 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 + +'Regresa verdadero o falso dependiendo de si ya se inició la encuesta. +'Sub encuestaIniciada As Boolean +' Return vEncuestaIniciada +'End Sub + +'Regresa el Id de la pregunta actual (read-only). +Sub preguntaActual As String 'ignore + Return vPreguntaActual +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +'Muestra una pregunta con sus posibles respuestas. +' La lista de respuestas puede ser directamente un array p. ej. Array As String("value1", "value2") +' Crear un Sub_Click con el nombre del evento para que reciba un mapa con la respuesta p. ej.: Sub questionario_Click +' Regresa un mapa con: +' idPregunta - El Id especificado de la pregunta. +' pregunta - El texto de la pregunta. +' idRespuesta - Un numero consecutivo empezando en 1 por cada pregunta. +' respuesta - El texto de la respuesta. +' panel - El panel del popup para poder ocultarlo al contestar la pregunta. ( p. ej.: m.Get("panel").As(Panel).Visible = false ) +'########################################### +' Sub questionario_Click +' if m.get("idPregunta") = "1" ..Then .. Else con nuevas preguntas +' End Sub +'########################################### +Sub agregaPregunta(id As String, pregunta As String, respuestas As List) + encuestaIniciada = True + vPreguntaActual = id + bAceptarPregunta.Initialize("bAceptarPregunta") + + Private su As StringUtils + panelSombra.Initialize("pSombra") + Private cd As ColorDrawable + cd.Initialize(Colors.ARGB(125, 98, 98, 98), 0) + panelSombra.Background = cd + Private panelX As Panel 'Panel de la pregunta. + panelX.Initialize("pQuest") + Private lbl As Label 'Etiqueta de la pregunta. + lbl.Initialize("") + lbl.Text = pregunta + lbl.TextSize = 16 + lbl.TextColor = Colors.Black + cd.Initialize2(Colors.white, 20, 1, Colors.Gray) 'Borde y esquinas redondeadas del panel de la pregunta. + panelX.Background = cd + panelSombra.AddView(panelX, 10dip, 0dip, 80%x, 200dip) + Root2.AddView(panelSombra, 0, 0, 100%x, 100%y) 'add the panel to the layout + panelX.AddView(lbl, 20dip, 20dip, (panelX.Width * 0.9), 40dip) 'Agregamos la etiqueta al panel. + lbl.Height = su.MeasureMultilineTextHeight(lbl, lbl.Text) + Private r(respuestas.Size) As RadioButton + For p = 0 To respuestas.Size - 1 + r(p).Initialize("r") + r(p).Text = respuestas.Get(p) + r(p).Tag = CreateMap("id":id, "pregunta":pregunta, "panel":panelSombra, "idRespuesta":p + 1) + panelX.AddView(r(p), 10dip, (70 * (p + 1)), (panelX.Width * 0.9), 10) 'Agegamos el radio al panel. + r(p).Height = su.MeasureMultilineTextHeight(r(p), r(p).Text) + 25 'Calculamos el alto del radio de acuerdo al largo del texto. + Private newTop As Int = lbl.top + lbl.Height + 10 'Si es el primer radio, lo ponemos en top = alto de la "pregunta" + 10. + If p <> 0 Then newTop = r(p - 1).Top + r(p - 1).Height + 5 'Calculamos el Top del radio de acuerdo al top y alto del radio anterior. + r(p).Top = newTop + Next + r(0).Checked = True + bAceptarPregunta.Text = "Continuar" + panelX.AddView(bAceptarPregunta, 10, newTop + r(respuestas.Size - 1).Height + 20, 150dip, 50dip) 'Ponemos el boton de continuar despues del ultimo radio. + bAceptarPregunta.Left = (panelX.Width / 2) - (bAceptarPregunta.Width / 2) + panelX.Height = bAceptarPregunta.Top + bAceptarPregunta.Height + 15dip 'Calculamos el alto del panel de acuerdo al Top del boton. + panelX.left = (Root2.Width / 2) - (panelX.Width / 2) + panelX.top = (Root2.Height / 3) - (panelX.Height / 2) + panelSombra.Width = Root2.Width + panelSombra.Height = Root2.Height + panelSombra.Elevation = 100 + panelSombra.BringToFront +' panelSombra.Elevation = 0 +End Sub + +private Sub preguntaContestada(Success As Map) 'ignore + If SubExists(CallBack, EventName & "_preguntaContestada") Then + CallSubDelayed2(CallBack, EventName & "_preguntaContestada", Success) + End If +End Sub + +private Sub pSombra_Click +End Sub + +private Sub r_CheckedChange(Checked As Boolean) + bAceptarPregunta.tag = CreateMap("idPregunta":Sender.As(RadioButton).tag.As(Map).Get("id").As(String), "pregunta":Sender.As(RadioButton).tag.As(Map).Get("pregunta"), "idRespuesta":Sender.As(RadioButton).tag.As(Map).Get("idRespuesta").As(String), "respuesta":Sender.As(RadioButton).text, "panel":Sender.As(RadioButton).tag.As(Map).Get("panel")) +End Sub + +Private Sub bAceptarPregunta_Click + encuestaIniciada = True + Private m As Map = Sender.As(Button).tag.As(Map) 'Recibimos el id de la pregunta, el id de la respuesta, el texto de la respuesta y el objeto del panelSombra para poder ocultarlo. + preguntaContestada(m) +'' m.Get("panel").As(Panel).Visible = False 'Ocultamos el panel de la pregunta. +' m.Get("panel").As(Panel).RemoveView +' If m.Get("idPregunta") = "1" And m.Get("respuesta") = "No, está enrejado o no se tiene acceso" Then +' Log("Tiendajon / Ventana / Kiosko") +' else If m.Get("idPregunta") = "1" And m.Get("respuesta") = "Si se pude acceder" Then +' agregaPregunta("2", "¿Tiene al menos 2 pasillos con acceso directo a la mercancía?", Array As String("Si tiene al menos 2 pasillos con acceso directo a la mercancía", "No tiene pasillos o solo uno central")) +' End If +' If m.Get("idPregunta") = "2" And m.Get("respuesta") = "Si tiene al menos 2 pasillos con acceso directo a la mercancía" Then +' Log("Mini-Super") +' else If m.Get("idPregunta") = "2" And m.Get("respuesta") = "No tiene pasillos o solo uno central" Then +' agregaPregunta("3", "¿Cuenta con enfriador horizontal para venta de perecederos como queso, jamon, crema, etc.?", Array As String("Si", "No tiene enfriador horizontal. ¿El local esta enfocado a venta especializada?")) +' End If +End Sub + +'Regresa verdadero si el cliente dado tiene cuestionario contestado. +Sub clienteConCuestionario(idCliente As String) As Boolean 'ignore + Private r As Boolean = False + Private c As Cursor = db.ExecQuery($"select count(*) as q from CUESTIONARIO where Q_IDCLIENTE = '${idCliente}'"$) + c.Position = 0 + If c.GetInt("q") > 0 Then r = True + Return r +End Sub + +'Oculta el anel de la pregunta. +Sub ocultPanelPregunta + If panelSombra.IsInitialized Then panelSombra.RemoveView +End Sub + +'Agrega una columna a la tabla especificada. +'Hay que indicar el "tipo" de la columna (TEXT, INTEGER, ETC) +'Ej. agregaColumna("TABLA", "COLUMNA", "TIPO") +Sub agregaColumna(tabla As String, columna As String, tipo As String) 'ignore + Try 'Intentamos usar "pragma_table_info" para revisar si existe la columna en la tabla + Private c As Cursor = db.ExecQuery($"SELECT COUNT(*) AS fCol FROM pragma_table_info('${tabla}') WHERE name='${columna}'"$) + c.Position = 0 + If c.GetString("fCol") = 0 Then 'Si no esta la columna la agregamos + db.ExecNonQuery($"ALTER TABLE ${tabla} ADD COLUMN ${columna} ${tipo}"$) + Log($"Columna "${columna} ${tipo}", agregada a "${tabla}"."$) + End If + Catch 'Si no funciona "pragma_table_info" lo hacemos con try/catch + Try + db.ExecNonQuery($"ALTER TABLE ${tabla} ADD COLUMN ${columna} ${tipo}"$) + Log($"Columna "${columna} ${tipo}", agregada a "${tabla}".."$) + Catch + Log(LastException) + End Try + End Try +End Sub \ No newline at end of file diff --git a/B4A/C_Historico.bas b/B4A/C_Historico.bas new file mode 100644 index 0000000..ccad2cd --- /dev/null +++ b/B4A/C_Historico.bas @@ -0,0 +1,123 @@ +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 Regresar As Button + + + Dim ListView1 As ListView + Dim L_CANT As Label + Dim L_TOTAL As Label + Dim borra As Button + Dim Existe As String + Dim result As String + ' Dim lat_gps, lon_gps As String + + Private Titulo As Label + Private b_desc As Button + Private ListView2 As ListView + Dim tgl As Toggle +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 + ruta = File.DirInternal + Root.LoadLayout("nota") + borra.Visible = False + Titulo.Text = "Acumulado" + b_desc.Visible = False + If File.Exists(ruta, "kmt.db") = False Then + File.Copy(File.DirAssets, "kmt.db", ruta, "kmt.db") + End If +' skmt.Initialize(ruta,"kmt.db", True) +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub B4XPage_Appear + If Not(Starter.gps.GPSEnabled) Then + ToastMessageShow("Es necesario tener el GPS encendido", True) + StartActivity(Starter.gps.LocationSettingsIntent) + End If + L_CANT.Text ="" + L_TOTAL.Text="" + c=B4XPages.MainPage.skmt.ExecQuery("select count(*) as EXISTE from HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa)") + C.Position=0 + Existe = C.GetString("EXISTE") + C.Close + c=B4XPages.MainPage.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") + 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 = 15 + label1.TextColor = Colors.Black + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 10 + label2.TextColor = Colors.Blue + ListView1.AddTwoLines(c.GetString("HVD_PRONOMBRE"),"Cantidad #"& c.GetString("HVD_CANT")& " SubTotal $"& c.GetString("HVD_COSTO_TOT")) + Next + End If + If Existe <> 0 Then + c=B4XPages.MainPage.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)") + C.Position=0 + L_CANT.Text = c.GetString("PC_NOART") + L_TOTAL.Text = c.GetString("PC_MONTO") + 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 Regresar_Click + B4XPages.ShowPage("Cliente") +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub +' BACK key pressed +' Return True To close, False To cancel + B4XPages.ShowPage("Principal") + Return False +End Sub + +Sub ListView2_ItemClick (Position As Int, Value As Object) + ListView2.Visible = False + ListView1.Visible = True +End Sub + +Sub ListView1_ItemClick (Position As Int, Value As Object) + ListView2.Visible = True + ListView1.Visible = False + Dim label1 As Label + For i=0 To 20 + label1 = ListView2.SingleLineLayout.Label + label1.TextSize = 15 + label1.TextColor = Colors.Black + ListView2.AddSingleLine(i) + Next +End Sub \ No newline at end of file diff --git a/B4A/C_MapaRutas.bas b/B4A/C_MapaRutas.bas new file mode 100644 index 0000000..d055d2d --- /dev/null +++ b/B4A/C_MapaRutas.bas @@ -0,0 +1,263 @@ +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 GPS As GPS + Dim rp As RuntimePermissions + Dim ruta As String + Dim skmt As SQL + Dim c As Cursor + Dim c2 As Cursor + Dim c22 As Cursor + Dim c3 As Cursor + + Private gmap As GoogleMap + Private MapFragment1 As MapFragment + Dim Latitud As Double = 0 + Dim Longitud As Double = 0 + Dim Lat2 As Double = 0 + Dim Lon2 As Double = 0 + Dim p1, p2 As Location + Dim Distance As Float + Dim boton1 As Button + Dim HUE_BLUE As Float + Dim HUE_RED As Float + Dim HUE_GREEN As Float + Private B_AZUL As Button + Private B_ROJO As Button + Private B_VERDE As Button + Private B_TODOS As Button + Dim Tienda As String + Dim LatitudRu As Double + Dim LongitudRU As Double + Dim LIST_AZUL As List + Dim LIST_ROJO As List + Dim LIST_VERDE As List + Dim MARK_AZUL As Marker + Dim MARK_ROJO As Marker + Dim MARK_VERDE As Marker + Dim MARK_CEDIS As Marker + Dim rojo As String + Dim azul As String + Dim verde As String + Dim todos As String + Dim NumSerie As Int + Dim OnInfoWindowClickListener1 As OnInfoWindowClickListener + Dim GoogleMapEXTRA As GoogleMapsExtras + Dim CODIGO As String + Private SEMANA As String + Private p_mapaRutas 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("mapaRutas") + ruta = File.DirInternal + If File.Exists(ruta, "kmt.db") = False Then + File.Copy(File.DirAssets, "kmt.db", ruta, "kmt.db") + End If + skmt.Initialize(ruta,"kmt.db", True) + GPS.Initialize("GPS") + If MapFragment1.IsGooglePlayServicesAvailable = False Then + ToastMessageShow("Please install Google Play Services.", True) + End If + MARK_AZUL.IsInitialized + MARK_ROJO.IsInitialized + MARK_VERDE.IsInitialized + LIST_AZUL.Initialize + LIST_ROJO.Initialize + LIST_VERDE.Initialize + verde = 0 + azul = 0 + rojo = 0 + todos = 1 + c=B4XPages.MainPage.skmt.ExecQuery2("select count(*) AS CUANTOS from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("SEMANA")) + c.Position =0 + SEMANA = c.GetString("CUANTOS") + c.Close + If SEMANA > 0 Then + c=B4XPages.MainPage.skmt.ExecQuery2("select CAT_VA_VALOR from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("SEMANA")) + c.Position =0 + SEMANA = c.GetString("CAT_VA_VALOR") + 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 MapFragment1_Ready + Log("ENTRANDO") + gmap = MapFragment1.GetMap + gmap.IsInitialized + rp.CheckAndRequest(rp.PERMISSION_ACCESS_FINE_LOCATION) + Wait For Activity_PermissionResult (Permission As String, Result As Boolean) + gmap.MyLocationEnabled = Result + Dim JavaMapsObject As JavaObject + JavaMapsObject = gmap.GetUiSettings + JavaMapsObject.RunMethod("setMapToolbarEnabled", Array As Object(True)) + '''''''----------------------------MARKER AZUL - POR VISITAR + If azul = 1 Or todos = 1 Then + c.IsInitialized + c=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_CODIGO,CAT_CL_NOMBRE,CAT_CL_LAT,CAT_CL_LONG from kmt_info where gestion = 0 and CAT_CL_LAT is not null and CAT_CL_LONG is not null and CAT_CL_LAT <> 0 and CAT_CL_LONG <> 0 and CAT_CL_LAT <> ' ' and CAT_CL_LONG <> ' ' ") + skmt.Initialize(ruta,"kmt.db", True) + If c.RowCount > 0 Then + For i = 0 To c.RowCount - 1 + c.Position = i +' Log(i&"|"&c.GetString("CAT_CL_LAT")&"|") + LatitudRu = 0 + If c.GetString("CAT_CL_LAT") <> "" Then LatitudRu = c.GetString("CAT_CL_LAT") + LongitudRU = 0 + If c.GetString("CAT_CL_LONG") <> "" Then LongitudRU = c.GetString("CAT_CL_LONG") + CODIGO=c.GetString("CAT_CL_CODIGO") + Tienda= c.GetString("CAT_CL_NOMBRE") + MARK_AZUL = gmap.AddMarker2(LatitudRu,LongitudRU,CODIGO, gmap.HUE_BLUE) + MARK_AZUL.Snippet = Tienda + Next + End If + c .Close + If MARK_AZUL.IsInitialized Then LIST_AZUL.Add(MARK_AZUL) + End If + '''''''----------------------------MARKER VERDE - VENTA + If verde =1 Or todos = 1 Then + c2.IsInitialized + c2=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_CODIGO, CAT_CL_NOMBRE,CAT_CL_LONG,CAT_CL_LAT from kmt_info where gestion = 2 and CAT_CL_LAT is not null and CAT_CL_LONG is not null and CAT_CL_LAT <> 0 and CAT_CL_LONG <> 0") + For i = 0 To c2.RowCount -1 + c2.Position = i + LongitudRU = c2.GetString("CAT_CL_LONG") + LatitudRu = c2.GetString("CAT_CL_LAT") + CODIGO=c2.GetString("CAT_CL_CODIGO") + Tienda= c2.GetString("CAT_CL_NOMBRE") + MARK_VERDE = gmap.AddMarker2(LatitudRu,LongitudRU,CODIGO,gmap.HUE_GREEN) + MARK_VERDE.Snippet = Tienda + Next + Else + If verde =1 Or todos = 1 Then + c2.IsInitialized + c2=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_CODIGO, CAT_CL_NOMBRE,CAT_CL_LONG,CAT_CL_LAT from kmt_info where gestion = 2 and CAT_CL_LAT is not null and CAT_CL_LONG is not null and CAT_CL_LAT <> 0 and CAT_CL_LONG <> 0") + For i = 0 To c2.RowCount -1 + c2.Position = i + LongitudRU = c2.GetString("CAT_CL_LONG") + LatitudRu = c2.GetString("CAT_CL_LAT") + CODIGO=c2.GetString("CAT_CL_CODIGO") + Tienda= c2.GetString("CAT_CL_NOMBRE") + MARK_VERDE = gmap.AddMarker2(LatitudRu,LongitudRU,CODIGO,gmap.HUE_GREEN) + MARK_VERDE.Snippet = Tienda + Next + c2 .Close + If MARK_VERDE.IsInitialized Then LIST_VERDE.Add(MARK_VERDE) + End If + End If +' '''''''----------------------------MARKER ROJO - NO VENTA + If rojo =1 Or todos = 1 Then + c3.IsInitialized + c3=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_CODIGO, CAT_CL_NOMBRE,CAT_CL_LONG,CAT_CL_LAT from kmt_info where gestion = 3 and CAT_CL_LAT is not null and CAT_CL_LONG is not null and CAT_CL_LAT <> 0 and CAT_CL_LONG <> 0") + For i = 0 To c3.RowCount -1 + c3.Position = i + LongitudRU = c3.GetDouble("CAT_CL_LONG") + LatitudRu = c3.GetDouble("CAT_CL_LAT") + Tienda= c3.GetString("CAT_CL_NOMBRE") + MARK_ROJO = gmap.AddMarker2(LatitudRu,LongitudRU,Tienda, gmap.HUE_RED) + Next + Else + If rojo =1 Or todos = 1 Then + c3.IsInitialized + c3=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_CODIGO, CAT_CL_NOMBRE,CAT_CL_LONG,CAT_CL_LAT from kmt_info where gestion = 3 and CAT_CL_LAT is not null and CAT_CL_LONG is not null and CAT_CL_LAT <> 0 and CAT_CL_LONG <> 0") + For i = 0 To c3.RowCount -1 + c3.Position = i + LongitudRU = c3.GetDouble("CAT_CL_LONG") + LatitudRu = c3.GetDouble("CAT_CL_LAT") + Tienda= c3.GetString("CAT_CL_NOMBRE") + MARK_ROJO = gmap.AddMarker2(LatitudRu,LongitudRU,Tienda, gmap.HUE_RED) + Next + If MARK_ROJO.IsInitialized Then LIST_ROJO.Add(MARK_ROJO) + c3.Close + End If + End If + ''------------------------------ + Dim aa As CameraPosition + aa.Initialize(LatitudRu,LongitudRU,15)''' RECOMENDABLE CAMBIAR A 10 PARA QUE SE VEAN MAS MARCADORES + gmap.AnimateCamera(aa) + + '''''---------------------- ESTO ES PARA LOS CLICK EN LAS VENTANAS D INFORMACION----------- + Dim OnInfoWindowClickListener1 As OnInfoWindowClickListener + OnInfoWindowClickListener1.Initialize("OnInfoWindowClickListener1") + GoogleMapEXTRA.SetOnInfoWindowClickListener(gmap, OnInfoWindowClickListener1) + +End Sub + +Sub OnInfoWindowClickListener1_click(Marker1 As Marker) + Log("mapclicked") + Log("borramos cuentaa") + B4XPages.MainPage.skmt.ExecNonQuery("delete from CUENTAA") + Log("insertamos cuentaa") + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?) ", Array As Object(Marker1.Title)) + Log("vamos a cliente") + B4XPages.ShowPage("Cliente") + B4XPages.ClosePage("MapaRutas") + B4XPages.GetManager.ClosePage(Me) +End Sub + +Sub GPS_LocationChanged (Parametro As Location) + MARK_CEDIS.IsInitialized +End Sub + +Sub B4XPage_Appear + If GPS.GPSEnabled = False Then + ToastMessageShow("Debe Activar el GPS del Equipo.", True) + StartActivity(GPS.LocationSettingsIntent) + Else + GPS.Start(0, 0) + End If +End Sub + +Sub B_TODOS_Click + todos =1 + verde = 0 + azul = 0 + rojo = 0 + MapFragment1_Ready +End Sub + +Sub B_VERDE_Click + verde = 1 + azul = 0 + rojo = 0 + todos = 0 + gmap.Clear + MapFragment1_Ready +End Sub + +Sub B_ROJO_Click + rojo = 1 + verde = 0 + azul = 0 + todos = 0 + gmap.Clear + MapFragment1_Ready +End Sub + +Sub B_AZUL_Click + azul = 1 + verde = 0 + rojo = 0 + todos = 0 + gmap.Clear + MapFragment1_Ready +End Sub + +Private Sub p_mapaRutas_Click + +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..36fa8d1 --- /dev/null +++ b/B4A/C_Mapas.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/C_NoVenta.bas b/B4A/C_NoVenta.bas new file mode 100644 index 0000000..0b96007 --- /dev/null +++ b/B4A/C_NoVenta.bas @@ -0,0 +1,178 @@ +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 ruta As String + Dim skmt As SQL + Dim c As Cursor + + 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 lat_gps, lon_gps As String + Dim tgl As Toggle + Dim r_4 As RadioButton + Dim reqManager As DBRequestManager + Private stay_hh As String + Private stay_mi As String + Private stay_ss 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("noventa") + ruta = File.DirInternal +' End If + If File.Exists(ruta, "kmt.db") = False Then + File.Copy(File.DirAssets, "kmt.db", ruta, "kmt.db") + End If + reqManager.Initialize(Me, Starter.DBReqServer) +' skmt.Initialize(ruta,"kmt.db", True) +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub B4XPage_Appear + e_comm.Text="" + tgl.Initialize + If Not(Starter.gps.GPSEnabled) Then + ToastMessageShow("Es necesario tener el GPS encendido", True) + StartActivity(Starter.gps.LocationSettingsIntent) + End If + r_1.Checked = False + r_2.Checked = False + r_3.Checked = False + r_4.Checked = False + e_comm.Text = "" +End Sub + +Sub GPS_LocationChanged (Location1 As Location) + 'lat_gps=Location1.ConvertToSeconds(Location1.Latitude) + 'lon_gps=Location1.ConvertToSeconds(Location1.Longitude) +End Sub + +Sub CANCELA_Click + B4XPages.ShowPage("Cliente") +End Sub +Sub GUARDA_Click + If r_1.Checked Then + motivo = "CERRADO" + Else If r_2.Checked Then + motivo = "NO COMPRA" + Else If r_3.Checked Then + motivo = "CON PRODUCTO" + Else + motivo = "NO ESTA EL ENCARGADO" + End If + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=B4XPages.MainPage.skmt.ExecQuery("select CUENTA from cuentaa") + c.Position = 0 + cuenta = c.GetString("CUENTA") + c=B4XPages.MainPage.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c=B4XPages.MainPage.skmt.ExecQuery("select PE_PROID,PE_CANT FROM PEDIDO where pe_cliente in (Select CUENTA from cuentaa) ") + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + B4XPages.MainPage.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_id = ?", Array As Object(c.GetString("PE_CANT"),c.GetString("PE_PROID"))) + Next + End If + + +' B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where pc_cliente in (Select CUENTA from cuentaa)") +' B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido where pe_cliente in (Select CUENTA from cuentaa)") + + B4XPages.MainPage.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, motivo,e_comm.text, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps)) + B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 3 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + DateTime.TimeFormat = "HHmmss" + sTime=DateTime.Time(DateTime.Now) + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE HIST_STAY_STORE set HSS_OUT = ? where HSS_CODIGO In (select cuenta from cuentaa)", Array As Object(sTime)) + ' B4XPages.MainPage.skmt.ExecNonQuery("UPDATE HIST_STAY_STORE set HSS_TOT = HSS_OUT - HSS_IN where HSS_CODIGO In (select cuenta from cuentaa)") + + c=B4XPages.MainPage.skmt.ExecQuery(" Select (substr(HSS_OUT,1,2) - substr(HSS_IN,1,2)) - Case when (substr(HSS_OUT,3,2) - substr(HSS_IN,3,2)) < 0 Then 1 Else 0 end HORAS_TOTALES, " & _ + "Case when (substr(HSS_OUT,3,2) - substr(HSS_IN,3,2)) < 0 Then (substr(HSS_OUT,3,2) + 60 - substr(HSS_IN,3,2)) " & _ + " Else (substr(HSS_OUT,3,2) - substr(HSS_IN,3,2)) End - Case when (substr(HSS_OUT,5,2) - substr(HSS_IN,5,2)) < 0 Then 1 Else 0 end MINUTOS_TOTALES, " & _ + "Case when (substr(HSS_OUT,5,2) - substr(HSS_IN,5,2)) < 0 Then (substr(HSS_OUT,5,2) + 60 - substr(HSS_IN,5,2)) " & _ + " Else (substr(HSS_OUT,5,2) - substr(HSS_IN,5,2)) end SEGUNDOS_TOTALES " & _ + " from HIST_STAY_STORE where HSS_CODIGO In (Select cuenta from cuentaa) ") + c.Position = 0 + stay_hh = c.GetString("HORAS_TOTALES") * 60 * 60 + stay_mi = c.GetString("MINUTOS_TOTALES") * 60 + stay_ss = c.GetString("SEGUNDOS_TOTALES") + + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE HIST_STAY_STORE set HSS_TOT = ? where HSS_CODIGO In (select cuenta from cuentaa)", Array As Object(stay_hh + stay_mi + stay_ss)) + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE HIST_STAY_OUT set HSO_FIN = ? ", Array As Object(sTime)) + DateTime.TimeFormat = "HH:mm:ss" + + B4XPages.MainPage.skmt.ExecNonQuery2("update PEDIDO_INICIO_FINAL set PIF_HORA_FINAL = ? where PIF_CLIENTE = ? and PIF_HORA_FINAL = 0", Array As Object (DateTime.Now, cuenta)) + LogColor($"actualizamos "${cuenta}, hora_final=${DateTime.now}"$,Colors.Red) + + mandaPendientesnoventa + B4XPages.ShowPage("Principal") +End Sub + +Sub mandaPendientesnoventa + 'PEDIDO_CLIENTE (Pendientes) +' c = B4XPages.MainPage.skmt.ExecQuery("SELECT PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT, PC_COSTO_SIN, PC_RUTA, PC_ALMACEN, PC_FACTURA FROM PEDIDO_CLIENTE where pc_envio_ok <> 1") + c = B4XPages.MainPage.skmt.ExecQuery("SELECT * FROM NOVENTA where ifnull(NV_ENVIO_OK, 0) <> 1") + Log($"NO VENTA 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_noventa_INTMEX" + 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"), Subs.traeAlmacen, Subs.traeRuta) + reqManager.ExecuteCommand(cmd , $"insert_noventa_${c.GetString("NV_CLIENTE")}"$) +' insert_noventa_INTMEX=INSERT INTO INTMEX.NOVENTA (NV_FECHA_SINC,NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON,NV_IDALMACEN,NV_RUTA) VALUES (SYSDATE,(?),(?),(?),(?),(?),(?),(?),(?),(?)) + Next + End If +End Sub + +Sub JobDone(Job As HttpJob) +Log(Job.Success) +If Job.Success = False Then + ToastMessageShow("Error: " & Job.ErrorMessage, True) +Else + LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211027 + If Job.JobName = "DBRequest" Then + Dim resultado As DBResult = reqManager.HandleJob(Job) + If resultado.Tag.As(String).IndexOf("insert_noventa_") > -1 Then + Private cliente As String= resultado.Tag + cliente = cliente.SubString(cliente.IndexOf("_") + 9) + Log($"Cliente1:${cliente}"$) + Starter.skmt.ExecNonQuery($"update NOVENTA set NV_ENVIO_OK = '1' where NV_CLIENTE = '${cliente}'"$) + For Each records() As Object In resultado.Rows + For Each k As String In resultado.Columns.Keys + Log(resultado.Tag & ": " & k & ": " & records(resultado.Columns.Get(k))) + Next + Next + End If + End If + Job.Release + End If +End Sub \ No newline at end of file diff --git a/B4A/C_Nota.bas b/B4A/C_Nota.bas new file mode 100644 index 0000000..33c080e --- /dev/null +++ b/B4A/C_Nota.bas @@ -0,0 +1,297 @@ +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 skmt As SQL + 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 Regresar As Button + + Dim ListView1 As ListView + Dim L_CANT As Label + Dim L_TOTAL As Label + Dim borra As Button + Dim Existe As String + Dim result As String + ' Dim lat_gps, lon_gps As String + Dim DESC As String + + Private Titulo As Label + Private b_desc As Button + Dim DESCUENTO As String + Dim folio As String + Dim tgl As Toggle + Private almacen As String + Private p_nota As Panel + Dim vamoaver As List + Dim c2 As Cursor + Dim j3 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 + ruta = File.DirInternal + Root.LoadLayout("nota") + borra.Visible = True + Titulo.Text = "Pedido Actual" +' If Existe <> 0 Then +' c=B4XPages.MainPage.skmt.ExecQuery("select pc_noart, pc_monto from pedido_cliente where pc_cliente in (Select CUENTA from cuentaa)") +' C.Position=0 +' L_CANT.Text = c.GetString("PC_NOART") +' L_TOTAL.Text = c.GetString("PC_MONTO") +' 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 + If Not(Starter.gps.GPSEnabled) Then + ToastMessageShow("Es necesario tener el GPS encendido", True) + StartActivity(Starter.gps.LocationSettingsIntent) + End If + c=B4XPages.MainPage.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + C.Position =0 + almacen = C.GetString("ID_ALMACEN") + C.Close + L_CANT.Text ="" + L_TOTAL.Text="" + c=B4XPages.MainPage.skmt.ExecQuery("select count(*) as EXISTE from pedido_cliente WHERE pc_cliente IN (Select CUENTA from cuentaa)") + C.Position=0 + Existe = C.GetString("EXISTE") + C.Close + c=B4XPages.MainPage.skmt.ExecQuery("select PE_PRONOMBRE,PE_COSTO_TOT, PE_CANT, PE_FOLIO, PE_CEDIS FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) order by PE_CEDIS, PE_PRONOMBRE") + ListView1.Clear + vamoaver.Initialize + Private cs As CSBuilder + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + cs.Initialize + c.Position=i + Dim label1 As Label + label1 = ListView1.TwoLinesLayout.Label + label1.TextSize = 15 + label1.TextColor = Colors.Black + label1.color = Colors.White + Private textColor As Int = Colors.black + If c.GetString("PE_FOLIO") = "VENTA" Then + textColor = Colors.RGB(48,3,195) + Else If c.GetString("PE_FOLIO") = "PREVENTA" Or c.GetString("PE_FOLIO") = "ABORDO" Then + textColor = Colors.RGB(166,0,0) + End If + If Not(IsNumber(c.GetString("PE_CEDIS"))) And c.GetString("PE_FOLIO") = "VENTA" Then + textColor = Colors.RGB(154,131,231) 'Si es promo, cambiamos el color del texto. + Else If Not(IsNumber(c.GetString("PE_CEDIS"))) And c.GetString("PE_FOLIO") = "PREVENTA" Then + textColor = Colors.RGB(255,111,111) 'Si es promo, cambiamos el color del texto. + End If + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 10 + label2.TextColor = Colors.Blue + ListView1.AddTwoLines(cs.Color(textColor).append(c.GetString("PE_PRONOMBRE")).pop,"Cantidad #"& c.GetString("PE_CANT")& " SubTotal $"& c.GetString("PE_COSTO_TOT")& " Folio "& c.GetString("PE_FOLIO")) + folio = c.GetString("PE_FOLIO") + vamoaver.Add(c.GetString("PE_FOLIO")) + Next + End If + Log($"EXISTE: ${Existe}"$) +' If Existe <> 0 Then +' c=B4XPages.MainPage.skmt.ExecQuery("select pc_noart, pc_monto from pedido_cliente where pc_cliente in (Select CUENTA from cuentaa)") + c = B4XPages.MainPage.skmt.ExecQuery("select sum(PE_CANT) as PC_NOART, sum (PE_COSTO_TOT) as PC_MONTO from PEDIDO where PE_CLIENTE in (Select CUENTA from cuentaa) AND PE_PROID NOT IN (SELECT CAT_PA_ID FROM PROMOS_COMP ) ") + If c.RowCount > 0 Then + C.Position = 0 + Log($"registros: ${c.RowCount}, arts: ${c.GetString("PC_NOART")}, monto:${c.GetString("PC_MONTO")}"$) + L_CANT.Text = c.GetString("PC_NOART") + L_TOTAL.Text = c.GetString("PC_MONTO") + If L_CANT.Text = Null Or L_CANT.Text = "null" Or L_CANT.Text = "" Then L_CANT.Text = "0" + If L_TOTAL.Text = Null Or L_TOTAL.Text = "null" Or L_TOTAL.Text = "" Then L_TOTAL.Text = "0" + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("select SUM(IFNULL(PE_DESC,0)) AS DESCUENTO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + c.Position=0 + DESC = c.GetString("DESCUENTO") + b_desc.Visible = False + End If + +' End If + If Subs.pedidoGuardado Then borra.Enabled = False Else borra.Enabled = True +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) +End Sub + +Sub Regresar_Click + B4XPages.ShowPage("Cliente") +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub +' BACK key pressed +' Return True To close, False To cancel + B4XPages.ShowPage("Cliente") + Return False +End Sub + +Sub borra_Click +' If folio <> "" Then + result = Msgbox2("Seguro que desea borrar el pedido?","Cancelar pedido", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore + If result = DialogResponse.POSITIVE Then +' c=B4XPages.MainPage.skmt.ExecQuery("select PE_PROID,PE_CANT FROM PEDIDO where pe_cliente in (Select CUENTA from cuentaa) ") +' If c.RowCount>0 Then +' For i=0 To c.RowCount -1 +' c.Position=i +' B4XPages.MainPage.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_id = ?", Array As Object(c.GetString("PE_CANT"),c.GetString("PE_PROID"))) +' B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO INVENT_X_ENVIAR (ALMACEN , PROID , CANTIDAD ) VALUES(?,?,?) ", Array As Object (almacen,c.GetString("PE_PROID"),c.GetString("PE_CANT")* -1)) +' Next +' End If +' B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where pc_cliente in (Select CUENTA from cuentaa)") +' B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido where pe_cliente in (Select CUENTA from cuentaa)") +' B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + Subs.borraPedidoClienteActual + B4XPage_Appear + B4XPages.MainPage.productos.clv_prods_ll.Clear + End If +' Else +' Msgbox("CLIENTE YA SE TRANSMITIO, FAVOR DE LLAMAR A SOPORTE PARA ASISTENCIA","AVISO") 'ignore +' End If +End Sub + +Sub ListView1_ItemLongClick (Position As Int, Value As Object) + Log(Value) + If Not(Subs.pedidoGuardado) Then + result = Msgbox2("Seguro que desea borrar este articulo?","Borrar Articulo", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore + If result = DialogResponse.POSITIVE Then + c=B4XPages.MainPage.skmt.ExecQuery2("select PE_PROID,PE_CANT, PE_FOLIO FROM PEDIDO where pe_pronombre = ? and pe_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) + c.Position=0 + Log(vamoaver.Get(Position)) + If vamoaver.Get(Position) = "VENTA" Then + Log("CAT_GUNAPROD2") + Log(Position) + Log(Value) + Starter.tabla = "CAT_GUNAPROD2" + Else + Log("CAT_GUNAPROD") + Log(Position) + Log(Value) + Starter.tabla = "CAT_GUNAPROD" + End If +' B4XPages.MainPage.skmt.ExecNonQuery2($"update ${Starter.tabla} set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_id = ?"$, Array As Object(c.GetString("PE_CANT"),c.GetString("PE_PROID"))) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO INVENT_X_ENVIAR (ALMACEN , PROID , CANTIDAD ) VALUES(?,?,?) ", Array As Object (Subs.traeAlmacen,c.GetString("PE_PROID"),c.GetString("PE_CANT")* -1)) + c2=B4XPages.MainPage.skmt.ExecQuery2($"select count(*) AS CUANTOS from ${Starter.tabla} where CAT_GP_ID in (select pe_cedis from pedido where pe_pronombre = ? and pe_cliente in (Select CUENTA from cuentaa)) and CAT_GP_CLASIF = 'PROMOS' AND CAT_GP_TIPO = 'PROMOS' AND CAT_GP_SUBTIPO = 'PROMOS'"$, Array As String(Value)) + c2.Position=0 + Log(c2.GetString("CUANTOS")) + If c2.GetString("CUANTOS") > 0 Then + j3 = B4XPages.MainPage.skmt.ExecQuery2("SELECT PE_CEDIS, PE_CANT,PE_PROID, PE_PRONOMBRE FROM PEDIDO WHERE PE_CEDIS IN (SELECT PE_CEDIS FROM PEDIDO WHERE PE_PRONOMBRE = ?)",Array As String(Value)) + Log(j3.RowCount) + If j3.RowCount > 0 Then + Log("estoy aqui") + For i = 0 To j3.RowCount -1 + Log("aqui tronare?") + j3.Position = i + B4XPages.MainPage.skmt.ExecNonQuery($"update ${Starter.tabla} set cat_gp_almacen = cat_gp_almacen + ${j3.GetString("PE_CANT")} where cat_gp_id = '${j3.Getstring("PE_PROID")}'"$) + B4XPages.MainPage.skmt.ExecNonQuery2("delete from pedido where pe_cedis in (select pe_cedis from pedido where pe_pronombre = ?) and pe_cliente in (Select CUENTA from cuentaa) AND PE_FOLIO = ?", Array As Object(j3.GetString("PE_PRONOMBRE"), c.GetString("PE_FOLIO"))) + Next + End If + j3.Close + Else + B4XPages.MainPage.skmt.ExecNonQuery($"update ${Starter.tabla} set cat_gp_almacen = cat_gp_almacen + ${c.GetString("PE_CANT")} where cat_gp_id = '${c.Getstring("PE_PROID")}'"$) + B4XPages.MainPage.skmt.ExecNonQuery2("delete from pedido where pe_pronombre = ? and pe_cliente in (Select CUENTA from cuentaa) AND PE_FOLIO = ?", Array As Object(Value, c.GetString("PE_FOLIO"))) + End If + c.Close + c2.Close + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=B4XPages.MainPage.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c=B4XPages.MainPage.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + c=B4XPages.MainPage.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE, count(*) as CUANTOS FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + c.Position=0 + If c.GetString("CUANTOS") > 0 Then + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT) VALUES (?,?,?,?,?,?,?)", Array As Object(clie_id, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), B4XPages.MainPage.lon_gps, B4XPages.MainPage.lat_gps)) + B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + Else + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + End If + B4XPage_Appear + End If + Else + ToastMessageShow("Pedido guardado, NO se puede editar.",False) + End If +End Sub + +Sub b_desc_Click + If DESCUENTO = "MENOS" Then + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=B4XPages.MainPage.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + c.Close + result = Msgbox2("Seguro que desea dar descuento del 5%?","Dar descuento", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore + If result = DialogResponse.POSITIVE Then + B4XPages.MainPage.skmt.ExecNonQuery("UPDATE pedido SET PE_COSTO_TOT = PE_COSTO_TOT * .95, PE_DESC = 5 WHERE PE_CLIENTE In (select cuenta from cuentaa)") + c=B4XPages.MainPage.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE, count(*) as CUANTOS FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + c.Position=0 + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT) VALUES (?,?,?,?,?,?,?)", Array As Object(clie_id, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), B4XPages.MainPage.lon_gps, B4XPages.MainPage.lat_gps)) + c.Close + B4XPage_Appear + End If + ELSE IF DESCUENTO = "MAS" Then + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=B4XPages.MainPage.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + c.Close + result = Msgbox2("Seguro que desea CANCELAR el descuento?","Cancelar descuento", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore + If result = DialogResponse.POSITIVE Then + B4XPages.MainPage.skmt.ExecNonQuery("UPDATE pedido SET PE_COSTO_TOT = PE_COSTO_TOT / .95, PE_DESC = 0 WHERE PE_CLIENTE In (select cuenta from cuentaa)") + c=B4XPages.MainPage.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE, count(*) as CUANTOS FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + c.Position=0 + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT) VALUES (?,?,?,?,?,?,?)", Array As Object(clie_id, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), B4XPages.MainPage.lon_gps, B4XPages.MainPage.lat_gps)) + c.Close + B4XPage_Appear + End If + End If +End Sub + +Private Sub p_nota_Click + +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..b4d1a5a --- /dev/null +++ b/B4A/C_NuevoCliente.bas @@ -0,0 +1,115 @@ +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 ruta As String + Dim c As Cursor + + Dim CANCELA As Button + Dim GUARDA As Button + Dim cuenta As String + Dim usuario As String + Dim sDate,sTime As String + Dim no_cliente As String + Dim no_ruta As String + + Dim r_4 As RadioButton + Dim E_NOMBRE As EditText + Dim tgl As Toggle + Private l_sinUbicacion As Label + Private p_nuevoCliente As Panel + Private Label1 As Label + Private p_botones 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("nuevocliente") + ruta = File.DirInternal + If File.Exists(ruta, "kmt.db") = False Then + File.Copy(File.DirAssets, "kmt.db", ruta, "kmt.db") + End If +' skmt.Initialize(ruta,"kmt.db", True) +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub B4XPage_Appear + E_NOMBRE.Text = "" + If Not(Starter.gps.GPSEnabled) Then + ToastMessageShow("Es necesario tener el GPS encendido", True) + StartActivity(Starter.gps.LocationSettingsIntent) + End If + GUARDA.Visible = False + Subs.panelVisible(p_nuevoCliente, 0, 0) + p_nuevoCliente.Height = Root.Height + p_nuevoCliente.Width = Root.Width + Subs.centraEtiqueta(Label1, Root.Width) + Subs.centraEtiqueta(l_sinUbicacion, Root.Width) + Subs.centraPanel(p_botones, Root.Width) + E_NOMBRE.Left = Round(Root.Width/2)-(E_NOMBRE.Width/2) + If B4XPages.MainPage.lat_gps <> "0.0" Then + GUARDA.Visible = True 'Si hay ubicaccion, mostramos el boton de guardar. + l_sinUbicacion.Visible = False + End If +End Sub + +Sub GPS_LocationChanged (Location1 As Location) + If B4XPages.MainPage.lat_gps <> "0.0" Then + GUARDA.Visible = True 'Si hay ubicaccion, mostramos el boton de guardar. + l_sinUbicacion.Visible = False + End If +End Sub + +Sub CANCELA_Click + B4XPages.ShowPage("Principal") +End Sub + +Sub GUARDA_Click + If E_NOMBRE.Text = "" Then + ToastMessageShow("Se tiene que nombrar la tienda para continuar" , True) + Else + DateTime.DateFormat = "MM/dd/yyyy" + DateTime.Timeformat = "HHmmss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Log($" //////////// Date: ${sDate} - Time: ${sTime} ////////////////"$) + 'Aqui creamos manualmete la hora con el separador de los 2 puntos porque en algunas versiones de android no respeta el formato "Timeformat = 'HH:mm:ss'" + Private hora As String = sTime.SubString2(0,2) + Private mins As String = sTime.SubString2(2,4) + Private segs As String = sTime.SubString(4) + sTime = hora&":"&mins&":"&segs + Log("////////////// sTime: "&sTime&" ////////////////") + c=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_RUTA FROM kmt_info") + c.Position=0 + no_ruta= c.GetString("CAT_CL_RUTA") + no_cliente= "N" & sTime & no_ruta + Log("++ ++ no_cliente = "&no_cliente) + c.Close + B4XPages.MainPage.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_MTOCOMPRA,CAT_CL_NUM_SERIEFISICO, gestion) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,0,0) ",Array As Object (no_cliente,no_ruta, E_NOMBRE.Text,"null","null","null","null","null","null","null","null","null","null","null","null","null",B4XPages.MainPage.lon_gps,B4XPages.MainPage.lat_gps)) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO HIST_STAY_STORE(HSS_CODIGO, HSS_IN , HSS_OUT , HSS_TOT) VALUES (?,0,0,0)", Array As Object (no_cliente)) + B4XPages.MainPage.skmt.ExecNonQuery("delete from CUENTAA") + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object(no_cliente)) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO CLIENTE_NUEVO(CN_ID_CLIENTE, CN_NOMBRE) VALUES (?,?)", Array As Object(no_cliente, E_NOMBRE.Text)) + B4XPages.ShowPage("Cliente") + End If +End Sub + + +Private Sub p_nuevoCliente_Click + +End Sub \ No newline at end of file diff --git a/B4A/C_Pedidos.bas b/B4A/C_Pedidos.bas new file mode 100644 index 0000000..93208bf --- /dev/null +++ b/B4A/C_Pedidos.bas @@ -0,0 +1,584 @@ +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 ruta As String + Dim skmt As SQL + Private t3 As Timer + Dim p As Phone + Dim sb As StringBuilder + + Dim c As Cursor + Dim e As Cursor + Dim f As Cursor + Dim h As Cursor + Dim CC As Cursor + Dim DD As Cursor + Dim l_tipo As Label + Dim l_sub As Label + Dim l_marca As Label + Dim l_desc As Label + Dim l_precio As Label + Dim l_bodega As Label + Dim cantidad As EditText + Dim guardar As Button + Dim Terminar As Button + Dim img_prod As ImageView + Dim IMG_PASO() As Byte + Dim L_PROID As Label + Dim clie_id As String + Dim sDate,sTime As String + Dim usuario As String + ' Dim lat_gps, lon_gps As String + Dim t_venta As Label + Dim PROMO_C As String + Dim i_fotol As ImageView + Private DESC_PROMO As Button + Private nopromo As Button + Dim TOT_ART_PROMO As String + Dim cambio As String + Dim COSTO_TOT As String + Dim ALMACEN As String + Dim preciosin As String + Dim cl_ruta As String + Dim d As Cursor + Dim TOT_ART_PROMOR As String + Dim PROMO_CR As String + Dim TOTAL_PROMO As String + Dim HCCP_CANT As String + Dim tgl As Toggle + Dim precio_Cero As String + Private BONSABOR As String + Private BONSABOR2 As String + Dim cmd As DBCommand + Private p_pedido 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("pedido") + i_fotol.Visible = False +' B4XPages.MainPage.reqManager.Initialize(Me, "http://177.244.63.54:1782") + ruta = File.DirInternal + If File.Exists(ruta, "kmt.db") = False Then + File.Copy(File.DirAssets, "kmt.db", ruta, "kmt.db") + End If +' skmt.Initialize(ruta,"kmt.db", True) +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub B4XPage_Appear + tgl.Initialize + BONSABOR = 0 + BONSABOR2 = 0 + If Not(Starter.gps.GPSEnabled) Then + ToastMessageShow("Es necesario tener el GPS encendido", True) + StartActivity(Starter.gps.LocationSettingsIntent) + End If + cantidad.Text = "" + c=B4XPages.MainPage.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + C.Position =0 + ALMACEN = C.GetString("ID_ALMACEN") + C.Close + i_fotol.Visible = False + sb.Initialize + p.Shell("ping -c1 -W1 177.244.63.54",Null, sb,Null) + skmt.Initialize(ruta,"kmt.db", True) + c=B4XPages.MainPage.skmt.ExecQuery("select 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 from CAT_GUNAPROD where CAT_GP_NOMBRE In (Select PDESC from PROID)") + c.Position=0 + L_PROID.Text = c.GetString("CAT_GP_ID") + l_tipo.Text = c.GetString("CAT_GP_TIPO") + l_sub.Text = c.GetString("CAT_GP_SUBTIPO") + l_marca.Text = c.GetString("CAT_GP_CLASIF") + l_desc.Text = c.GetString("CAT_GP_NOMBRE") + l_precio.Text = c.GetDouble("CAT_GP_PRECIO") + l_bodega.Text = c.GetString("CAT_GP_ALMACEN") + IMG_PASO = c.GetBlob("CAT_GP_IMG") + PROMO_C = c.GetString("CAT_GP_STS") + cambio = c.GetString("CAT_GP_DEV") + preciosin = c.GetString("CAT_GP_IMP2") + PROMO_CR = c.GetString("CAT_GP_IMP1") + cambio = "0" + + e=B4XPages.MainPage.skmt.ExecQuery2("select count(*) as CUANTOS FROM pedido WHERE PE_CEDIS = ? AND PE_CLIENTE IN (Select cuenta from cuentaa) ", Array As String(c.GetString("CAT_GP_ID"))) + e.Position =0 + If e.GetString("CUANTOS") = 0 Then + If l_marca.text = "PROMOS" And l_tipo.Text ="PROMOS" Then + DESC_PROMO.Visible = True + CC=B4XPages.MainPage.skmt.ExecQuery2("select count(*) as CUANTOS FROM PROMOS_COMP WHERE CAT_PA_ID = ?", Array As String(c.GetString("CAT_GP_ID"))) + CC.Position =0 + If CC.GetString("CUANTOS") = 0 Then + l_bodega.Text = "0" ' se modifica a cero para evitar error en la promo especial de unilever mayo + Else + CC.Close + CC=B4XPages.MainPage.skmt.ExecQuery2("select CAT_PA_MAXPROM, CAT_PA_MAXPROMREC, CAT_PA_MAXPROMCLIE FROM PROMOS_COMP WHERE CAT_PA_ID = ?", Array As String(c.GetString("CAT_GP_ID"))) + CC.Position =0 + ' SE MODIFICA LA APLICACION PARA QUE VEA EL HISTORIAL DE VENTA DEL CLIENTE. + DD=B4XPages.MainPage.skmt.ExecQuery2("SELECT COUNT(*) AS CUANTOS FROM HIST_CLIENTE_CANT_PROMOS WHERE HCCP_CLIENTE IN (Select cuenta from cuentaa) AND HCCP_PROMO =?", Array As String(c.GetString("CAT_GP_ID"))) + DD.Position =0 + If DD.GetString("CUANTOS") = 0 Then + HCCP_CANT = 0 + Else + DD.Close + DD=B4XPages.MainPage.skmt.ExecQuery2("SELECT HCCP_CANT FROM HIST_CLIENTE_CANT_PROMOS WHERE HCCP_CLIENTE IN (Select cuenta from cuentaa) AND HCCP_PROMO =?", Array As String(c.GetString("CAT_GP_ID"))) + DD.Position =0 + HCCP_CANT = DD.GetString("HCCP_CANT") + DD.Close + End If + BONSABOR = HCCP_CANT + DD=B4XPages.MainPage.skmt.ExecQuery2("SELECT COUNT(*) AS CUANTOS FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select cuenta from cuentaa) AND HVD_PRONOMBRE =?", Array As String(c.GetString("CAT_GP_NOMBRE"))) + DD.Position =0 + If DD.GetString("CUANTOS") = 0 Then + HCCP_CANT = 0 + Else + DD.Close + DD=B4XPages.MainPage.skmt.ExecQuery2("SELECT SUM(HVD_CANT) AS HCCP_CANT FROM HIST_VENTAS WHERE HVD_CLIENTE IN (Select cuenta from cuentaa) AND HVD_PRONOMBRE =?", Array As String(c.GetString("CAT_GP_NOMBRE"))) + DD.Position =0 + HCCP_CANT = DD.GetString("HCCP_CANT") + DD.Close + End If + DD=B4XPages.MainPage.skmt.ExecQuery2("Select COUNT(*) AS CUANTOS FROM PEDIDO WHERE PE_CLIENTE IN (Select cuenta from cuentaa) AND PE_PROID IN (select CAT_GP_ID from CAT_GUNAPROD where CAT_GP_CLASIF = ?) ",Array As String(c.GetString("CAT_GP_NOMBRE"))) + DD.Position =0 + BONSABOR2 = DD.GetString("CUANTOS") + DD.Close + TOTAL_PROMO = CC.GetString("CAT_PA_MAXPROMCLIE") - HCCP_CANT + If HCCP_CANT = 0 Then + l_bodega.Text = CC.GetString("CAT_PA_MAXPROM") + Else IF TOTAL_PROMO > CC.GetString("CAT_PA_MAXPROMREC") Then + l_bodega.Text = CC.GetString("CAT_PA_MAXPROMREC") + Else + l_bodega.Text = TOTAL_PROMO + End If + End If + Else + DESC_PROMO.Visible = False + End If + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("select CASE WHEN pe_costo_tot is null then 0 else sum( pe_costo_tot ) end as TOTAL_CLIE FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + c.Position=0 + t_venta.Text = c.GetString("TOTAL_CLIE") + c.Close + Terminar.Visible = True + guardar.Visible = True + cantidad.Visible = True + If cambio = "1" Then + nopromo.Visible = True + Else + nopromo.Visible = False + End If + Dim out As OutputStream + out = File.OpenOutput(ruta, "1.jpg", False) + out.WriteBytes(IMG_PASO, 0, IMG_PASO.Length) + out.Close + img_prod.Bitmap = LoadBitmap(ruta,"1.jpg") + TOT_ART_PROMO = "0" + TOT_ART_PROMOR = "0" + If l_marca.text = "PROMOS" And l_tipo.Text ="PROMOS" And l_bodega.Text = "0" Then + Msgbox("ALERTA","EL CLIENTE NO PUEDE TENER ESTA PROMOCION") 'ignore + B4XPages.ShowPage("Productos") + ELSE IF l_marca.text = "PROMOS" And l_tipo.Text ="PROMOS" And L_PROID.Text = "PROUNI1" And BONSABOR <> "1" And BONSABOR2 = 0 Then + Msgbox("ALERTA","EL CLIENTE NO PUEDE TENER ESTA PROMOCION") 'ignore + B4XPages.ShowPage("Productos") + End If + Else + Msgbox("ALERTA","EL CLIENTE YA COMPRO ESTE PRODUCTO REVISAR NOTA") 'ignore + B4XPages.ShowPage("Productos") + End If +End Sub + +Sub guardar_Click + If cantidad.Text = "" Then + B4XPages.ShowPage("Productos") + ELSE If cantidad.Text > l_bodega.Text Then + Msgbox("Exede la existencia", "ADVERTENCIA") 'ignore + Else If l_marca.text = "PROMOS" And l_tipo.Text ="PROMOS" And PROMO_C > 0 And cantidad.Text > 0 Then + B4XPages.MainPage.skmt.ExecNonQuery("delete from PROIDID") + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PROIDID VALUES (?)", Array As Object(L_PROID.text)) + c=B4XPages.MainPage.skmt.ExecQuery("Select count(*) as CUANTOSD from pedido where PE_CLIENTE IN (Select CUENTA from cuentaa) and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND CAT_DP_TIPO = 1)") + c.Position =0 + If c.GetString("CUANTOSD") = 0 Then + Msgbox("No tiene venta el cliente para la promo", "ADVERTENCIA") 'ignore + Else + c=B4XPages.MainPage.skmt.ExecQuery("Select sum(pe_cant) As TOT_ART_PROMO, sum(PE_COSTO_TOT) as COSTO_TOT from pedido where PE_CLIENTE IN (Select CUENTA from cuentaa) and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND CAT_DP_PRECIO > 1)") + C.Position =0 + TOT_ART_PROMO = C.GetString("TOT_ART_PROMO") + COSTO_TOT = C.GetString("COSTO_TOT") + C.Close + c=B4XPages.MainPage.skmt.ExecQuery("Select count(*) as CUANTOSD from pedido where PE_CLIENTE IN (Select CUENTA from cuentaa) and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND (CAT_DP_PRECIO = 0.01 or CAT_DP_PRECIO = 1 OR CAT_DP_PRECIO = 0) AND CAT_DP_TIPO = 1)") + c.Position =0 + If c.GetString("CUANTOSD") = 0 Then + TOT_ART_PROMOR = "0" 'Msgbox("No tiene venta el cliente para la promo", "ADVERTENCIA") + Else + c=B4XPages.MainPage.skmt.ExecQuery("Select sum(pe_cant) As TOT_ART_PROMO, sum(PE_COSTO_TOT) as COSTO_TOT from pedido where PE_CLIENTE IN (Select CUENTA from cuentaa) and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND (CAT_DP_PRECIO = 0.01 or CAT_DP_PRECIO = 1 OR CAT_DP_PRECIO = 0) AND CAT_DP_TIPO = 1)") + C.Position =0 + TOT_ART_PROMOR = C.GetString("TOT_ART_PROMO") + End If + C.Close + PROMO_C = PROMO_C * cantidad.Text + PROMO_CR = PROMO_CR * cantidad.Text + If TOT_ART_PROMO = PROMO_C And TOT_ART_PROMOR = PROMO_CR Then + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE PEDIDO SET PE_CEDIS = (?) WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID))", Array As Object(L_PROID.text)) + D=B4XPages.MainPage.skmt.ExecQuery("select CAT_DP_ID, CAT_DP_PRECIO, CAT_DP_PRECIO_SIMPTOS, CAT_DP_IDPROD FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) AND CAT_DP_PRECIO > 1") + If D.RowCount>0 Then + For i=0 To D.RowCount -1 + D.Position=i + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE PEDIDO SET PE_COSTOU = (?), PE_COSTO_TOT = PE_CANT * (?) , PE_COSTO_SIN = (?) WHERE PE_PROID = (?) And PE_CEDIS In (Select PROIDID from PROIDID) AND PE_CLIENTE IN (Select CUENTA from cuentaa) ",Array As Object( D.GetString("CAT_DP_PRECIO"), D.GetString("CAT_DP_PRECIO"), D.GetString("CAT_DP_PRECIO_SIMPTOS"),D.GetString("CAT_DP_IDPROD"))) + Next + End If + D.Close + D=B4XPages.MainPage.skmt.ExecQuery("select CAT_DP_ID, CAT_DP_PRECIO, CAT_DP_PRECIO_SIMPTOS, CAT_DP_IDPROD FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) AND (CAT_DP_PRECIO = 0.01 or CAT_DP_PRECIO = 1 OR CAT_DP_PRECIO = 0) AND CAT_DP_TIPO = 1") + If D.RowCount>0 Then + For i=0 To D.RowCount -1 + D.Position=i + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE PEDIDO SET PE_COSTOU = (?), PE_COSTO_TOT = PE_CANT * (?) , PE_COSTO_SIN = (?) WHERE PE_PROID = (?) And PE_CEDIS In (Select PROIDID from PROIDID) AND PE_CLIENTE IN (Select CUENTA from cuentaa) ",Array As Object( D.GetString("CAT_DP_PRECIO"), D.GetString("CAT_DP_PRECIO"), D.GetString("CAT_DP_PRECIO_SIMPTOS"),D.GetString("CAT_DP_IDPROD"))) + Next + End If + D.Close + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=B4XPages.MainPage.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)") + c.Position=0 + cl_ruta = c.GetString("CAT_CL_RUTA") + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + e=B4XPages.MainPage.skmt.ExecQuery("select count(*) as CUANTOS FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) and CAT_DP_TIPO = 0 ") + ' SE LO QUITE DE CONDICION AND (CAT_DP_PRECIO = 0.01 or CAT_DP_PRECIO = 1 OR CAT_DP_PRECIO = 0) + e.Position =0 + If e.GetString("CUANTOS") > 0 Then + F=B4XPages.MainPage.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) and CAT_DP_TIPO = 0 ") ' AND (CAT_DP_PRECIO = 0.01 or CAT_DP_PRECIO = 1 OR CAT_DP_PRECIO = 0) + 'meter el otro + 'si jala copiar para guna y el resto + If f.RowCount>0 Then + For i=0 To f.RowCount -1 + f.Position=i + precio_Cero = f.GetString("CAT_DP_PRECIO") + h=B4XPages.MainPage.skmt.ExecQuery2("select CAT_GP_NOMBRE from CAT_GUNAPROD where CAT_GP_ID = ? ", Array As String(f.GetString("CAT_DP_IDPROD"))) + h.Position=0 + '0 + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA) VALUES(?,?,?,?,?,?,?,?,?,?) ", Array As Object (L_PROID.text,precio_Cero * f.GetString("CAT_DP_PZAS") * cantidad.text, precio_Cero, f.GetString("CAT_DP_PZAS") * cantidad.text, h.GetString("CAT_GP_NOMBRE"), f.GetString("CAT_DP_IDPROD"),clie_id, sDate & sTime, usuario,cl_ruta)) + h.Close + Next + End If + f.Close + End If + e.Close + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_FOLIO) VALUES(?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (L_PROID.text,0 , 0, cantidad.text, l_desc.text, L_PROID.Text,clie_id, sDate & sTime, usuario,cl_ruta, b4xpages.MainPage.tipo_venta)) + B4XPages.MainPage.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cantidad.Text, L_PROID.Text)) + Else + Msgbox("Tiene " & TOT_ART_PROMO & " " & TOT_ART_PROMOR & " y necesita " & PROMO_C & " " & PROMO_CR & " Para la Promo. " , "ADVERTENCIA") 'ignore + End If + End If + cantidad.Text = "" + B4XPages.ShowPage("Productos") + else If l_marca.text = "PROMOS" And l_tipo.Text ="PROMOS" And PROMO_C = 0 Then + B4XPages.MainPage.skmt.ExecNonQuery("delete from PROIDID") + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PROIDID VALUES (?)", Array As Object(L_PROID.text)) + c=B4XPages.MainPage.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c.Close + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)") + c.Position=0 + cl_ruta = c.GetString("CAT_CL_RUTA") + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + 'B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO) VALUES(?,?,?,?,?,?,?,?,?) ", Array As Object ("COACALCO",cantidad.Text * l_precio.Text, l_precio.text, cantidad.text, l_desc.text, L_PROID.Text,clie_id, sDate & sTime, usuario)) + 'para insertar la promo de ades el de regalo en 0 + e=B4XPages.MainPage.skmt.ExecQuery("select count(*) as CUANTOS FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) ") + e.Position =0 + If e.GetString("CUANTOS") > 0 Then + F=B4XPages.MainPage.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)") + For i =0 To f.RowCount -1 + F.Position =i + h=B4XPages.MainPage.skmt.ExecQuery2("select CAT_GP_NOMBRE from CAT_GUNAPROD where CAT_GP_ID = ? ", Array As String(f.GetString("CAT_DP_IDPROD"))) + h.Position=0 + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_FOLIO) VALUES(?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (L_PROID.text,f.GetString("CAT_DP_PRECIO") * cantidad.text * f.GetString("CAT_DP_PZAS"), f.GetString("CAT_DP_PRECIO"), f.GetString("CAT_DP_PZAS") * cantidad.text, h.GetString("CAT_GP_NOMBRE"), f.GetString("CAT_DP_IDPROD"),clie_id, sDate & sTime, usuario,cl_ruta, B4XPages.MainPage.tipo_venta)) + h.Close + Next + f.Close + End If + e.Close + '0 + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_FOLIO) VALUES(?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (L_PROID.text,0, 0, cantidad.text, l_desc.text, L_PROID.Text,clie_id, sDate & sTime, usuario,cl_ruta, b4xpages.MainPage.tipo_venta)) + B4XPages.MainPage.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cantidad.Text, L_PROID.Text)) + cantidad.Text = "" + c=B4XPages.MainPage.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE, SUM(PE_COSTO_SIN) AS TOTAL_CLIE_SIN FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + c.Position=0 + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT,PC_ALMACEN,PC_RUTA,PC_COSTO_SIN) VALUES (?,?,?,?,?,?,?,?,?,?)", Array As Object(clie_id, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), B4XPages.MainPage.lon_gps, B4XPages.MainPage.lat_gps,ALMACEN,cl_ruta,c.GetString("TOTAL_CLIE_SIN"))) + B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + B4XPages.ShowPage("Productos") + Else + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=B4XPages.MainPage.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)") + c.Position=0 + cl_ruta = c.GetString("CAT_CL_RUTA") + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_COSTO_SIN, PE_FOLIO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (ALMACEN,cantidad.Text * l_precio.Text, l_precio.text, cantidad.text, l_desc.text, L_PROID.Text,clie_id, sDate & sTime, usuario,cl_ruta,preciosin, b4xpages.MainPage.tipo_venta)) + B4XPages.MainPage.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cantidad.Text, L_PROID.Text)) + c=B4XPages.MainPage.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE, SUM(PE_COSTO_SIN) AS TOTAL_CLIE_SIN FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + c.Position=0 + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT,PC_ALMACEN,PC_RUTA,PC_COSTO_SIN) VALUES (?,?,?,?,?,?,?,?,?,?)", Array As Object(clie_id, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), B4XPages.MainPage.lon_gps, B4XPages.MainPage.lat_gps,ALMACEN,cl_ruta,c.GetString("TOTAL_CLIE_SIN"))) + B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO INVENT_X_ENVIAR (ALMACEN , PROID , CANTIDAD ) VALUES(?,?,?) ", Array As Object (ALMACEN,L_PROID.Text,cantidad.text)) + B4XPages.ShowPage("Productos") + 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 Terminar_Click + If cantidad.Text = "" Then + B4XPages.ShowPage("Cliente") + ELSE If cantidad.Text > l_bodega.Text Then + Msgbox("Exede la existencia", "ADVERTENCIA") 'ignore + Else If l_marca.text = "PROMOS" And l_tipo.Text ="PROMOS" And PROMO_C > 0 And cantidad.Text > 0 Then + B4XPages.MainPage.skmt.ExecNonQuery("delete from PROIDID") + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PROIDID VALUES (?)", Array As Object(L_PROID.text)) + c=B4XPages.MainPage.skmt.ExecQuery("Select count(*) as CUANTOSD from pedido where PE_CLIENTE IN (Select CUENTA from cuentaa) and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND CAT_DP_TIPO = 1)") + c.Position =0 + If c.GetString("CUANTOSD") = 0 Then + Msgbox("No tiene venta el cliente para la promo", "ADVERTENCIA") 'ignore + Else + c=B4XPages.MainPage.skmt.ExecQuery("Select sum(pe_cant) As TOT_ART_PROMO, sum(PE_COSTO_TOT) as COSTO_TOT from pedido where PE_CLIENTE IN (Select CUENTA from cuentaa) and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND CAT_DP_PRECIO > 1)") + C.Position =0 + TOT_ART_PROMO = C.GetString("TOT_ART_PROMO") + COSTO_TOT = C.GetString("COSTO_TOT") + C.Close + c=B4XPages.MainPage.skmt.ExecQuery("Select count(*) as CUANTOSD from pedido where PE_CLIENTE IN (Select CUENTA from cuentaa) and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND (CAT_DP_PRECIO = 0.01 or CAT_DP_PRECIO = 1 OR CAT_DP_PRECIO = 0) AND CAT_DP_TIPO = 1)") + c.Position =0 + If c.GetString("CUANTOSD") = 0 Then + TOT_ART_PROMOR = "0" 'Msgbox("No tiene venta el cliente para la promo", "ADVERTENCIA") + Else + c=B4XPages.MainPage.skmt.ExecQuery("Select sum(pe_cant) As TOT_ART_PROMO, sum(PE_COSTO_TOT) as COSTO_TOT from pedido where PE_CLIENTE IN (Select CUENTA from cuentaa) and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID) AND (CAT_DP_PRECIO = 0.01 or CAT_DP_PRECIO = 1 OR CAT_DP_PRECIO = 0) AND CAT_DP_TIPO = 1)") + C.Position =0 + TOT_ART_PROMOR = C.GetString("TOT_ART_PROMO") + End If + C.Close + PROMO_C = PROMO_C * cantidad.Text + PROMO_CR = PROMO_CR * cantidad.Text + If TOT_ART_PROMO = PROMO_C And TOT_ART_PROMOR = PROMO_CR Then + ' anterior a 29/06/2015 + 'B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE PEDIDO SET PE_COSTOU = (?), PE_COSTO_TOT = PE_CANT * (?) WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID))", Array As Object(l_precio.text/(TOT_ART_PROMO/cantidad.Text),l_precio.text/(TOT_ART_PROMO/cantidad.Text))) + 'en pe_cedis meto el codigo de promocion para hacer esta validacion. + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE PEDIDO SET PE_CEDIS = (?) WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) and pe_proid In (Select cat_dp_idprod from CAT_DETALLES_PAQ WHERE CAT_DP_ID In (Select PROIDID from PROIDID))", Array As Object(L_PROID.text)) + D=B4XPages.MainPage.skmt.ExecQuery("select CAT_DP_ID, CAT_DP_PRECIO, CAT_DP_PRECIO_SIMPTOS, CAT_DP_IDPROD FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) AND CAT_DP_PRECIO > 1") + If D.RowCount>0 Then + For i=0 To D.RowCount -1 + D.Position=i + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE PEDIDO SET PE_COSTOU = (?), PE_COSTO_TOT = PE_CANT * (?) , PE_COSTO_SIN = (?) WHERE PE_PROID = (?) And PE_CEDIS In (Select PROIDID from PROIDID) AND PE_CLIENTE IN (Select CUENTA from cuentaa) ",Array As Object( D.GetString("CAT_DP_PRECIO"), D.GetString("CAT_DP_PRECIO"), D.GetString("CAT_DP_PRECIO_SIMPTOS"),D.GetString("CAT_DP_IDPROD"))) + Next + End If + D.Close + D=B4XPages.MainPage.skmt.ExecQuery("select CAT_DP_ID, CAT_DP_PRECIO, CAT_DP_PRECIO_SIMPTOS, CAT_DP_IDPROD FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) AND (CAT_DP_PRECIO = 0.01 or CAT_DP_PRECIO = 1 OR CAT_DP_PRECIO = 0) AND CAT_DP_TIPO = 1") + If D.RowCount>0 Then + For i=0 To D.RowCount -1 + D.Position=i + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE PEDIDO SET PE_COSTOU = (?), PE_COSTO_TOT = PE_CANT * (?) , PE_COSTO_SIN = (?) WHERE PE_PROID = (?) And PE_CEDIS In (Select PROIDID from PROIDID) AND PE_CLIENTE IN (Select CUENTA from cuentaa) ",Array As Object( D.GetString("CAT_DP_PRECIO"), D.GetString("CAT_DP_PRECIO"), D.GetString("CAT_DP_PRECIO_SIMPTOS"),D.GetString("CAT_DP_IDPROD"))) + Next + End If + D.Close + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=B4XPages.MainPage.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)") + c.Position=0 + cl_ruta = c.GetString("CAT_CL_RUTA") + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + 'para insertar la promo de ades el de regalo en 0 + e=B4XPages.MainPage.skmt.ExecQuery("select count(*) as CUANTOS FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) and CAT_DP_TIPO = 0 ") + ' SE LO QUITE DE CONDICION AND (CAT_DP_PRECIO = 0.01 or CAT_DP_PRECIO = 1 OR CAT_DP_PRECIO = 0) + e.Position =0 + If e.GetString("CUANTOS") > 0 Then + F=B4XPages.MainPage.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) and CAT_DP_TIPO = 0 ") ' AND (CAT_DP_PRECIO = 0.01 or CAT_DP_PRECIO = 1 OR CAT_DP_PRECIO = 0) + 'meter el otro + 'si jala copiar para guna y el resto + If f.RowCount>0 Then + For i=0 To f.RowCount -1 + f.Position=i + precio_Cero = f.GetString("CAT_DP_PRECIO") + h=B4XPages.MainPage.skmt.ExecQuery2("select CAT_GP_NOMBRE from CAT_GUNAPROD where CAT_GP_ID = ? ", Array As String(f.GetString("CAT_DP_IDPROD"))) + h.Position=0 + Log(111) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_FOLIO) VALUES(?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (L_PROID.text,precio_Cero * f.GetString("CAT_DP_PZAS") * cantidad.text, precio_Cero, f.GetString("CAT_DP_PZAS") * cantidad.text, h.GetString("CAT_GP_NOMBRE"), f.GetString("CAT_DP_IDPROD"),clie_id, sDate & sTime, usuario,cl_ruta, B4XPages.MainPage.tipo_venta)) + h.Close + Next + End If + f.Close + End If + e.Close + Log(222) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_FOLIO) VALUES(?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (L_PROID.text,0 , 0, cantidad.text, l_desc.text, L_PROID.Text,clie_id, sDate & sTime, usuario,cl_ruta, b4xpages.MainPage.tipo_venta)) + B4XPages.MainPage.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cantidad.Text, L_PROID.Text)) + Else + Msgbox("Tiene " & TOT_ART_PROMO & " " & TOT_ART_PROMOR & " y necesita " & PROMO_C & " " & PROMO_CR & " Para la Promo. " , "ADVERTENCIA") 'ignore + End If + End If + cantidad.Text = "" + B4XPages.ShowPage("Cliente") + else If l_marca.text = "PROMOS" And l_tipo.Text ="PROMOS" And PROMO_C = 0 Then + B4XPages.MainPage.skmt.ExecNonQuery("delete from PROIDID") + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PROIDID VALUES (?)", Array As Object(L_PROID.text)) + c=B4XPages.MainPage.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c.Close + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)") + c.Position=0 + cl_ruta = c.GetString("CAT_CL_RUTA") + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + 'para insertar la promo de ades el de regalo en 0 + e=B4XPages.MainPage.skmt.ExecQuery("select count(*) as CUANTOS FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) ") + e.Position =0 + If e.GetString("CUANTOS") > 0 Then + F=B4XPages.MainPage.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)") + For i =0 To f.RowCount -1 + F.Position =i + h=B4XPages.MainPage.skmt.ExecQuery2("select CAT_GP_NOMBRE from CAT_GUNAPROD where CAT_GP_ID = ? ", Array As String(f.GetString("CAT_DP_IDPROD"))) + h.Position=0 + Log(333) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_FOLIO) VALUES(?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (L_PROID.text,f.GetString("CAT_DP_PRECIO") * cantidad.text * f.GetString("CAT_DP_PZAS"), f.GetString("CAT_DP_PRECIO"), f.GetString("CAT_DP_PZAS") * cantidad.text, h.GetString("CAT_GP_NOMBRE"), f.GetString("CAT_DP_IDPROD"),clie_id, sDate & sTime, usuario,cl_ruta, B4XPages.MainPage.tipo_venta)) + h.Close + Next + f.Close + End If + e.Close + Log(444) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_FOLIO) VALUES(?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (L_PROID.text,0, 0, cantidad.text, l_desc.text, L_PROID.Text,clie_id, sDate & sTime, usuario,cl_ruta, b4xpages.MainPage.tipo_venta)) + B4XPages.MainPage.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cantidad.Text, L_PROID.Text)) + cantidad.Text = "" + c=B4XPages.MainPage.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE, SUM(PE_COSTO_SIN) AS TOTAL_CLIE_SIN FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + c.Position=0 + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT,PC_ALMACEN,PC_RUTA,PC_COSTO_SIN) VALUES (?,?,?,?,?,?,?,?,?,?)", Array As Object(clie_id, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), B4XPages.MainPage.lon_gps, B4XPages.MainPage.lat_gps,ALMACEN,cl_ruta,c.GetString("TOTAL_CLIE_SIN"))) + B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + B4XPages.ShowPage("Cliente") + Else + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=B4XPages.MainPage.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)") + c.Position=0 + cl_ruta = c.GetString("CAT_CL_RUTA") + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + Log(555) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_RUTA,PE_COSTO_SIN,PE_FOLIO) VALUES(?,?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (ALMACEN,cantidad.Text * l_precio.Text, l_precio.text, cantidad.text, l_desc.text, L_PROID.Text,clie_id, sDate & sTime, usuario,cl_ruta,preciosin, b4xpages.MainPage.tipo_venta)) + B4XPages.MainPage.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cantidad.Text, L_PROID.Text)) + c=B4XPages.MainPage.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE, SUM(PE_COSTO_SIN) AS TOTAL_CLIE_SIN FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + c.Position=0 + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT,PC_ALMACEN,PC_RUTA,PC_COSTO_SIN) VALUES (?,?,?,?,?,?,?,?,?,?)", Array As Object(clie_id, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), B4XPages.MainPage.lon_gps, B4XPages.MainPage.lat_gps,ALMACEN,cl_ruta,c.GetString("TOTAL_CLIE_SIN"))) + B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO INVENT_X_ENVIAR (ALMACEN , PROID , CANTIDAD ) VALUES(?,?,?) ", Array As Object (ALMACEN,L_PROID.Text,cantidad.text)) + B4XPages.ShowPage("Cliente") + End If +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub +' BACK key pressed +' Return True To close, False To cancel + Msgbox("Presione Boton Terminar.","ADVERTENCIA") 'ignore + Return False +End Sub + +Sub img_prod_Click + i_fotol.Visible = True + i_fotol.Bitmap = LoadBitmap(ruta,"1.jpg") + +End Sub +Sub i_fotol_Click + i_fotol.Visible = False + +End Sub + +Sub DESC_PROMO_Click + B4XPages.MainPage.skmt.ExecNonQuery("delete from PROIDID") + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PROIDID VALUES (?)", Array As Object(L_PROID.text)) + B4XPages.ShowPage("detalle_promo") +End Sub + +Sub nopromo_Click + If cantidad.Text = "" Then + Msgbox("Cantidad no puede ser 0","Cantidad") 'ignore + Else If cantidad.Text > l_bodega.Text Then + Msgbox("Exede la existencia", "ADVERTENCIA") 'ignore + Else + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=B4XPages.MainPage.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c=B4XPages.MainPage.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO,PE_FOLIO) VALUES(?,?,?,?,?,?,?,?,?,?) ", Array As Object ("COACALCO",0,0, cantidad.text, l_desc.text, L_PROID.Text,clie_id, sDate & sTime, usuario, b4xpages.MainPage.tipo_venta)) + B4XPages.MainPage.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cantidad.Text, L_PROID.Text)) + cantidad.Text = "" + B4XPages.ShowPage("Productos") + End If +End Sub + +Private Sub p_pedido_Click + +End Sub \ No newline at end of file diff --git a/B4A/C_Principal.bas b/B4A/C_Principal.bas new file mode 100644 index 0000000..79a2acf --- /dev/null +++ b/B4A/C_Principal.bas @@ -0,0 +1,2617 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=11.5 +@EndOfDesignText@ +Sub Class_Globals + Public rp As RuntimePermissions + Private Root As B4XView 'ignore + Private xui As XUI 'ignore +' Dim reqManager As DBRequestManager + Dim rd As C_RespaldoDiario + Dim reqManager As DBRequestManager + Dim conectado As String + Dim ime As IME + Dim t1 As Timer + Dim sb As StringBuilder + Dim PHONE As Phone + Dim g As GPS + Dim trabajar As Button +' Dim lat_gps, lon_gps As String + Dim c As Cursor + Dim d As Cursor + Dim b As Cursor + Dim e As Cursor + Dim f As Cursor + Dim D2 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_MONTOD As Label + Dim l_cuantosc As Label + Dim l_drop 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 SERVER As String + Private inv As Button + Private P1 As Panel + Private CLAVE As EditText + Private B_OK_PAS As Button + Dim PASO As String + Private USUARIO1 As EditText + Dim connecta1 As Double + Dim armafolio As String + Private NUEVO As Button + Private S_CC As Label + Private S_CP As Label + Private S_CH As Label + Private PB2 As ProgressBar + Private PB1 As ProgressBar + Private L_P_1 As Label + Private L_P_2 As Label + Private L_P_3 As Label + Private CARGA As String + Private PORCENTAJE As String + Private P_RESUMEN As Panel + Private B_OK_RES As Button + Private Resumen As Button + Private L_CUANTOST As Label + Private img3 As ImageView + Private ImageView3 As ImageView + Private ImageView5 As ImageView + Private L_TICKPROM As Label + Private L_MARCAS As ListView + Private ImageView9 As ImageView + Private E_RUTA2 As EditText + Private resdia As ImageView + Private hacer_ped As ImageView + Private nvo_cliente As ImageView + Private tickets_dia As ImageView + Private l_monto_ks As Label + Private l_monto_kp As Label + Private l_monto_k As Label + Private l_monto_c1 As Label + Private l_monto_c2 As Label + Private l_monto_c3 As Label + Private l_encuesta As Label + Private bpv1 As BatteryProgressView + Dim batterystatus(11) As Int + Private bu As BatteryUtilities + Private Panel4 As Panel + Private L_NES As Label + Private L_REAL As Label + Private L_ALCANCE As Label + Private L_VPLAN As Label + Private L_VREAL As Label + Private L_EFEC_VIS As Label + Private L_VISITCC As Label + Private L_EFEC_PV As Label + Private L_EFEC_PURA As Label + Private L_CTE_PROMO As Label + Private L_REDEN_PROMO As Label + Private L_LIN_TICK As Label + Private SCROLL_RESDIA As ScrollView + Private L_ACUMULADO As Label + Private L_UNILEVER As Label + Private L_RECHAZOP As Label + Private L_RECHAZOM As Label + Private L_VTA_3MES As Label + Private L_VTA_2MES As Label + Private L_VTA_1MES As Label + Private L_MES_PY As Label + Private L_FREC_DE_CREAL As Label + Private L_FREC_DE_COBJ As Label + Private L_COB_VISIT As Label + Private L_VISIT_REAL As Label + Private L_VISIT_PLAN As Label + Private L_ECO As Label + Private L_COB_CCC As Label + Private L_CTES As Label + Private L_VPO_VTA As Label + Private L_VPO_OBJ As Label + Private L_DS_VTA As Label + Private L_DS_OBJ As Label + Private L_DRA_VTA As Label + Private L_DRA_OBJ As Label + Private L_ALCANCEM As Label + Private L_TENDENCIA As Label + Private L_VTA_ACUM As Label + Private L_OBJ_MES As Label + Private L_DS_OBJD As Label + Private L_DS_VTAD As Label + Private LPT As String + Private STEYIN As String + Private STEYOUT As String + Private L_PRIO As Label + Private L_SECUND As Label + Private L_COMP As Label + Private stay_hh As String + Private stay_mi As String + Private stay_ss As String + Dim sDate,sTime As String + Dim HORAINGRESO As String + Private L_QUALA As Label + Private L_FERRERO As Label + Private L_SANMARCOS As Label + Private L_CAMPARI As Label + Private L_IBERIA As Label + Private L_BEPENSA As Label + Private L_SCJ As Label + Private L_MEDJ As Label + Private L_DURACELL As Label + Private L_GUNA As Label + Private L_KIMB As Label + Private L_TRESM As Label + Private L_REDB As Label + Private Btn_Ubicar As Button + Private B_COMM As Button + Private L_TOTAL_MM As Label + Private L_TOTAL_VIVE As Label + Private L_TOTAL_GUNA As Label + Private L_TOTAL_BA As Label + Private L_TOTAL_COMIS As Label + Private L_TOTAL_MM_1 As Label + Private L_TOTAL_VIVE_1 As Label + Private L_TOTAL_GUNA_1 As Label + Private L_TOTAL_BA_1 As Label + Private L_TOTAL_COMIS_1 As Label + Private B_OK_COMISS As Button + Private Panel_C As Panel + Private TitleHeight As Int = 50dip + Private Title2Height As Int = 100dip + Private DividerHeight As Int = 5dip + Private CLV1 As CustomListView + Private pnlTitle As B4XView + Private xui As XUI + Type TitleData (Title As String) + Private B_MARCAS As Button + Private Panel5 As Panel + Private lblTitle As Label + Private B_OK_PANEL5 As Button + Private p_principal As Panel + Private p_mandaInfo As Panel + Dim s As Cursor + Private Label22 As Label + Private l_rutasuplencia As Label + Dim userpiezas As String + Private b_abordo As Button + Private L_ABORDO As Label + Private L_VENTA As Label + Private L_PREVENTA 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 + 'load the layout to Root + Root.LoadLayout("principal") + rd.Initialize + rd.vacuum + EJECUTANDO=1 + Dim ruta As String + img2.Visible =False + ruta = File.DirInternal + If File.Exists(ruta, "kmt.db") = False Then + File.Copy(File.DirAssets, "kmt.db", ruta, "kmt.db") + End If + DateTime.DateFormat = "MM/dd/yyyy" + fecha=DateTime.Date(DateTime.Now) + B4XPages.MainPage.skmt.Initialize(ruta,"kmt.db", True) + b=B4XPages.MainPage.skmt.ExecQuery("Select count(*) as CUANTOS from pedido_cliente") + b.Position=0 + Cuantos = b.GetString("CUANTOS") + b.Close + d=B4XPages.MainPage.skmt.ExecQuery("select count(*) as TOTAL_VISITAR from kmt_info where gestion = 0") + d.Position=0 + e=B4XPages.MainPage.skmt.ExecQuery("select count(*) as POR_VISITAR from kmt_info") + e.Position=0 + f=B4XPages.MainPage.skmt.ExecQuery("select count(*) as CAT_CL_RUTA from kmt_info") + f.Position=0 + l_ruta.Text = f.GetString("CAT_CL_RUTA") + f.Close + If l_ruta.Text = 0 Then + l_ruta.Text =0 + Else + f=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info") + f.Position=0 + l_ruta.Text = f.GetString("CAT_CL_RUTA") + f.Close + End If + If Cuantos = 0 Then + L_MONTOD.Text =0 + l_cuantosc.Text = 0 + l_cuantosn.Text = 0 + drop = 0 + l_drop.Text = 0 + efectiva = 0 + l_efectiva.text =0 + l_ctast.Text = d.GetString("TOTAL_VISITAR") + l_porvisitar.Text = e.GetString("POR_VISITAR") + Else + c=B4XPages.MainPage.skmt.ExecQuery("select sum(pc_monto) as MONTO_DIA, count(pc_cliente) AS CLIENTES_DIA from pedido_cliente WHERE PC_CLIENTE <> 0") + b=B4XPages.MainPage.skmt.ExecQuery("select count(*) as CUANTOS from noventa") + 'where pc_fecha = ?", Array As String(fecha) + c.Position=0 + b.Position=0 + L_MONTOD.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_drop.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 + d.Close + e.Close +' CallSubDelayed(FirebaseMessaging, "SubscribeToTopics") + s = B4XPages.MainPage.skmt.ExecQuery("select RS_RUTA FROM RUTA_SUPLENCIA") + s.Position = 0 + If s.RowCount = 0 Then + Label22.Visible = False + l_rutasuplencia.Visible = False + Else If s.RowCount > 0 Then + Label22.Visible = True + l_rutasuplencia.Visible = True + l_rutasuplencia.Text = s.GetString("RS_RUTA") + End If + Starter.Skmt.ExecNonQuery($"create table if not exists kmt_info2 (${getTableColumnList(Starter.skmt, "kmt_info")})"$) +End Sub + +Sub chkIfTableExists(db As SQL, table As String) As Boolean 'ignore + Private t As Boolean = False 'ignore + If db.IsInitialized Then + Private c As Cursor = Starter.skmt.ExecQuery($"SELECT name FROM sqlite_master WHERE type='table' AND name='${table}'"$) + If c.RowCount > 0 Then t = True + c.Close + End If + Return t +End Sub + +'Regresa solo los nombres de las columnas de una tabla dada. +Sub getTableColumnListName(db As SQL, table As String) As String 'ignore + Private l As String = "" + If chkIfTableExists(db, table) Then + Private c As Cursor = Starter.skmt.ExecQuery($"pragma table_info(${table})"$) + If c.RowCount > 0 Then + For i = 0 To c.RowCount - 1 + c.Position = i + If l.Length = 0 Then + l = $"${c.GetString("name")}"$ + Else + l = $"${l}, ${c.GetString("name")}"$ + End If + Next + End If + Else + Return "No existe la tabla." + End If + c.Close + Return l +End Sub + +Sub getTableColumnList(db As SQL, table As String) As String 'ignore + Private l As String = "" + If chkIfTableExists(db, table) Then + Private c As Cursor = Starter.skmt.ExecQuery($"pragma table_info(${table})"$) + If c.RowCount > 0 Then + For i = 0 To c.RowCount - 1 + c.Position = i + If l.Length = 0 Then + l = $"${c.GetString("name")} ${c.GetString("type")}"$ + Else + l = $"${l}, ${c.GetString("name")} ${c.GetString("type")}"$ + End If + Next + End If + Else + Return "No existe la tabla." + End If + c.Close + Return l +End Sub + +Sub B4XPage_Appear + rd.respaldaPedido + rd.respaldaInventarios + rd.respaldaPaquetes + HORAINGRESO ="000000" + Btn_Ubicar.Left = (Root.Width/2) - (Btn_Ubicar.Width/2) + reqManager.Initialize(Me, Starter.DBReqServer) + Log(Starter.DBReqServer) + PASO =0 + If Not(Starter.gps.GPSEnabled) Then + If Starter.marcaCel <> "Sony" Then ToastMessageShow("Es necesario tener el GPS encendido", True) + StartActivity(Starter.gps.LocationSettingsIntent) + End If + c=B4XPages.MainPage.skmt.ExecQuery2("select count(*) as CUANTOS from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("FECHA")) + c.Position =0 + If c.GetString("CUANTOS") = 0 Then + cmd.Initialize + cmd.Name = "select_fecha" + Log( Starter.DBReqServer) + reqManager.ExecuteQuery(cmd , 0, "fecha") + Msgbox("AJUSTAR FECHA","AVISO") 'ignore + B4XPage_Appear + Else + c=B4XPages.MainPage.skmt.ExecQuery2("select CAT_VA_VALOR from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("FECHA")) + c.Position=0 + Dim sDate,sTime As String + DateTime.DateFormat = "yyyyMMdd" + sDate=DateTime.Date(DateTime.Now) + If c.GetString("CAT_VA_VALOR") > sDate Then + Msgbox("AJUSTAR LA FECHA YA QUE ES MENOR AL SISTEMA" ,"AVISO") 'ignore + c.Close + B4XPage_Appear + End If + c.Close + 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 + DateTime.DateFormat = "MM/dd/yyyy" + fecha=DateTime.Date(DateTime.Now) + b=B4XPages.MainPage.skmt.ExecQuery("Select count(*) as CUANTOS from pedido_cliente") + b.Position=0 + Cuantos = b.GetString("CUANTOS") + b.Close +' If Starter.marcaCel <> "Sony" Then ToastMessageShow(Cuantos , True) + d=B4XPages.MainPage.skmt.ExecQuery("select count(*) as TOTAL_VISITAR from kmt_info where gestion = 0") + d.Position=0 + e=B4XPages.MainPage.skmt.ExecQuery("select count(*) as POR_VISITAR from kmt_info WHERE CAT_CL_CODIGO <>0") + e.Position=0 + f=B4XPages.MainPage.skmt.ExecQuery("select count(*) as CAT_CL_RUTA from kmt_info WHERE CAT_CL_CODIGO <>0") + f.Position=0 + l_ruta.Text = f.GetString("CAT_CL_RUTA") + f.Close + If l_ruta.Text = 0 Then + l_ruta.Text =0 + Else + f=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info") + f.Position=0 + l_ruta.Text = f.GetString("CAT_CL_RUTA") + f.Close + End If + If Cuantos = 0 Then + L_MONTOD.Text =0 + l_cuantosc.Text = 0 + l_cuantosn.Text = 0 + L_CUANTOST.Text = 0 + drop = 0 + l_drop.Text = 0 + efectiva = 0 + l_efectiva.text =0 + l_ctast.Text = d.GetString("TOTAL_VISITAR") + l_porvisitar.Text = e.GetString("POR_VISITAR") + d.Close + e.Close + b=B4XPages.MainPage.skmt.ExecQuery("select count(*) as CUANTOS from noventa") + b.Position=0 + l_cuantosn.Text = b.GetString("CUANTOS") + b.close + Else + c=B4XPages.MainPage.skmt.ExecQuery("select SUM(PE_COSTO_TOT) as MONTO_DIA, COUNT(DISTINCT(PE_CLIENTE)) AS CLIENTES_DIA from PEDIDO WHERE PE_CLIENTE <> 0 ") + b=B4XPages.MainPage.skmt.ExecQuery("select count(*) as CUANTOS from noventa") + c.Position=0 + b.Position=0 + L_MONTOD.Text = c.GetString("MONTO_DIA") + l_cuantosc.Text = c.GetString("CLIENTES_DIA") + + D2=B4XPages.MainPage.skmt.ExecQuery("select COUNT(*) AS CUANTOS from PEDIDO ") + D2.Position = 0 + LPT = D2.GetString("CUANTOS") / l_cuantosc.Text + D2.Close + + l_cuantosn.Text = b.GetString("CUANTOS") + efectiva = c.GetString("CLIENTES_DIA") / e.GetString("POR_VISITAR") + l_efectiva.text = Round2(efectiva*100,2) + l_ctast.Text = d.GetString("TOTAL_VISITAR") + d.Close + l_porvisitar.Text = e.GetString("POR_VISITAR") + L_CUANTOST.Text = l_cuantosc.Text + l_cuantosn.Text + drop = L_CUANTOST.Text / l_porvisitar.Text + l_drop.Text = Round(drop * 100) + If L_CUANTOST.Text < 40 Then + ImageView3.Bitmap = LoadBitmap(File.DirAssets, "tache_rojo.png") + Else If L_CUANTOST.Text > = 40 And L_CUANTOST.Text < 50 Then + ImageView3.bitmap = LoadBitmap(File.DirAssets, "alerta_amarilla.png") + Else + ImageView3.Bitmap = LoadBitmap(File.DirAssets, "palomita_verde.png") + End If + L_TICKPROM.Text = Round2((c.GetString("MONTO_DIA") / c.GetString("CLIENTES_DIA")),2) + If c.GetString("MONTO_DIA") < 4000 Then + ImageView5.Bitmap = LoadBitmap(File.DirAssets, "tache_rojo.png") + Else if c.GetString("MONTO_DIA") > = 4000 And c.GetString("MONTO_DIA") < 6250 Then + ImageView5.bitmap = LoadBitmap(File.DirAssets, "alerta_amarilla.png") + Else + ImageView5.Bitmap = LoadBitmap(File.DirAssets, "palomita_verde.png") + End If + b.Close + c.Close + End If + c.Close + b.Close + e.Close + c=B4XPages.MainPage.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + C.Position =0 + ALMACEN = C.GetString("ID_ALMACEN") + c.Close + bu.Initialize + batterystatus = bu.BatteryInformation + + + c=B4XPages.MainPage.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c.Close + B4XPages.MainPage.batt = batterystatus(0) + B4XPages.MainPage.montoActual = L_MONTOD.Text + B4XPages.MainPage.clientestotal = L_CUANTOST.Text + B4XPages.MainPage.clientesventa = l_cuantosc.Text + B4XPages.MainPage.clientesvisitados = l_porvisitar.TEXT + B4XPages.MainPage.ALMACEN = ALMACEN + B4XPages.MainPage.rutapreventa = l_ruta.text + + '////// Para el usuario global - Chv + c=B4XPages.MainPage.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + B4XPages.MainPage.usuario = usuario + c.Close + '/////// + CallSub(Starter, "ENVIA_ULTIMA_GPS") + + + s = B4XPages.MainPage.skmt.ExecQuery("select RS_RUTA FROM RUTA_SUPLENCIA") + s.Position = 0 + If s.RowCount = 0 Then + + Label22.Visible = False + l_rutasuplencia.Visible = False + l_rutasuplencia.Text = "" + + Else If s.RowCount > 0 Then + + Label22.Visible = True + l_rutasuplencia.Visible = True + l_rutasuplencia.Text = s.GetString("RS_RUTA") + + End If + +' If l_ruta.Text = "0" Then +' b_abordo.Visible = False +' Else +' b_abordo.Visible = True +' End If + +End Sub + +Sub Subir_Click + CARGA = "SUBIR" + p_mandaInfo.Width = Root.Width + p_mandaInfo.Height = Root.Height + P1.Visible = True + P1.Left = (p_mandaInfo.Width/2) - (P1.Width/2) + P1.top = (p_mandaInfo.Height/2) - (P1.Height/2) + p_mandaInfo.Visible = True + P1.BringToFront + p_mandaInfo.BringToFront + 'trabajar.Visible = False + NUEVO.Visible =False + BUSCA.Visible=False + connecta.Visible=False + Subir.Visible=False + cargar.Visible=False + L_P_1.Visible = False + S_CC.Visible = False + L_P_3.Visible = False + S_CH.Visible = False + PB1.Visible = False + Resumen.Visible= False + L_P_2.Text = "Envio de Pedidos" + L_P_3.Text = "Envio de Pedidos" + S_CH.Text = "EN PROCESO" + S_CP.Text = "EN PROCESO" + PB1.Progress = 0 + PB2.Progress = 0 + 'c=skmt.ExecQuery("SELECT sum(IFNULL(PE_DESC,0)) as DESCUENTO FROM PEDIDO") + 'c.Position =0 + 'If c.GetString("DESCUENTO") > 0 And PASO = 0 Then + 'P1.Visible = True + 'ELSE IF c.GetString("DESCUENTO") = 0 Then + PASO = 1 + 'End If + If PASO = 1 Then + B4XPages.MainPage.skmt.ExecNonQuery2("delete from PEDIDO WHERE PE_PRONOMBRE = ? ", Array As Object("N/A") ) + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE not In (select PE_CLIENTE from pedido)") + c=B4XPages.MainPage.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("select HGDATE, HGLAT, HGLON from HIST_GPS") + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "UPDATE_INTMEX_ACTUAL2_GPS" + cmd.Parameters = Array As Object(L_MONTOD.Text, L_CUANTOST.Text, l_cuantosc.Text,l_porvisitar.TEXT,c.GetString("hglat"),c.GetString("hglon"),batterystatus(0),LPT, STEYIN, STEYOUT,ALMACEN,l_ruta.Text ) + reqManager.ExecuteCommand(cmd , "update_gps") + Next + End If + c.Close + + ' ENVIO DE LOS CODIGOS QR + 'c=skmt.ExecQuery2("SELECT CAT_CL_NUM_SERIEFISICO,CAT_CL_CODIGO ,CAT_CL_LONG,CAT_CL_LAT, CAT_CL_FOTO FROM kmt_info where CAT_CL_NUM_SERIEFISICO = ?", Array As String("OK")) + c=B4XPages.MainPage.skmt.ExecQuery("SELECT CODIGOKMTS, CODIGOB, LAT, LON FROM HIST_CODIGO_BARRAS" ) + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_QR_2_INTMEX" + cmd.Parameters = Array As Object(C.GetString("CODIGOKMTS"),C.GetString("CODIGOB"),C.GetString("LON"),C.GetString("LAT"),ALMACEN,l_ruta.text ) + reqManager.ExecuteCommand(cmd , "ins_QR") + Next + End If + c.Close + + c=B4XPages.MainPage.skmt.ExecQuery("SELECT CAT_CL_NUM_SERIEFISICO, CAT_CL_CODIGO, CAT_CL_LONG, CAT_CL_LAT, CAT_CL_FOTO FROM kmt_info where CAT_CL_NUM_SERIEFISICO IS NOT NULL") + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + 's=skmt.ExecQuery2("SELECT HIST_VI_IMAGEN FROM HIST_VISITAS WHERE HIST_VI_CREDITO =?", Array As String (c.GetString("HIST_VI_CREDITO"))) + 's.Position =0 + foto1 = c.GetBlob("CAT_CL_FOTO") + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_QR_INTMEX" + cmd.Parameters = Array As Object(C.GetString("CAT_CL_NUM_SERIEFISICO"),C.GetString("CAT_CL_CODIGO"),C.GetString("CAT_CL_LONG"),C.GetString("CAT_CL_LAT"),ALMACEN,l_ruta.text, foto1 ) + reqManager.ExecuteCommand(cmd , "ins_QR") + Next + End If + c.Close + +' c=B4XPages.MainPage.skmt.ExecQuery("SELECT HE_CLIE, HE_RES, HE_FECHA, HE_TIPO FROM HIST_ENCUESTA") +' If c.RowCount>0 Then +' For i=0 To c.RowCount -1 +' c.Position=i +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "insert_encuesta_INTMEX" +' cmd.Parameters = Array As Object(C.GetString("HE_CLIE"),C.GetString("HE_RES"),C.GetString("HE_FECHA"), c.GetString("HE_TIPO")) +' reqManager.ExecuteCommand(cmd , "inst_noventa") +' Next +' End If +' c.Close + + ' PEDIDO_CLIENTE + Dim PCNoArts As String + Dim PCMonto As String + c = B4XPages.MainPage.skmt.ExecQuery("SELECT PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT, PC_COSTO_SIN, PC_RUTA, PC_ALMACEN, PC_FACTURA FROM PEDIDO_CLIENTE ") + d = B4XPages.MainPage.skmt.ExecQuery("SELECT COUNT(*) as CUANTOS_PEDIDOSC FROM PEDIDO_CLIENTE ") + If c.RowCount > 0 Then + For i = 0 To c.RowCount - 1 + c.Position = i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_pedidos_INTMEX" + PCNoArts = c.GetString("PC_NOART") + PCMonto = c.GetString("PC_MONTO") + cmd.Parameters = Array As Object(c.GetString("PC_CLIENTE"), c.GetString("PC_FECHA"), c.GetString("PC_USER"), c.GetString("PC_NOART"), c.GetString("PC_MONTO"), c.GetString("PC_LON"), c.GetString("PC_LAT"), ALMACEN, l_ruta.text, c.GetString("PC_COSTO_SIN"), c.GetString("PC_FACTURA")) + reqManager.ExecuteCommand(cmd , "ins_pedidos") + Log(">>>>>> INSERT PEDIDO_CLIENTE") + Next + End If + c.Close + d.Position = 0 + cuantos_pedidosc = d.GetString("CUANTOS_PEDIDOSC") + d.Close + + ' PEDIDO + c = B4XPages.MainPage.skmt.ExecQuery("SELECT PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO, PE_COSTO_SIN, PE_RUTA, PE_DESC, PE_FOLIO FROM PEDIDO") + d = B4XPages.MainPage.skmt.ExecQuery("SELECT COUNT(*) as CUANTOS_PEDIDO FROM PEDIDO") + If c.RowCount > 0 Then + For i = 0 To c.RowCount - 1 + c.Position = i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_pedido2_INTMEX" 'CON TOTALES INCLUIDOS + cmd.Parameters = Array As Object(C.GetString("PE_CEDIS"),ALMACEN,C.GetString("PE_COSTO_TOT"),C.GetString("PE_COSTOU"),C.GetString("PE_CANT"),C.GetString("PE_PRONOMBRE"),C.GetString("PE_PROID"),C.GetString("PE_CLIENTE"),C.GetString("PE_FECHA"),C.GetString("PE_USUARIO"),C.GetString("PE_RUTA"), C.GetString("PE_COSTO_SIN"),C.GetString("PE_DESC"),c.GetString("PE_FOLIO"), PCNoArts, PCMonto) + reqManager.ExecuteCommand(cmd , $"ins_pedidosPendientes_prods_${c.GetString("PE_CLIENTE")}_${c.GetString("PE_PROID")}"$) +' Log($">>>> INS_PEDIDO= ${C.GetString("PE_CEDIS")},${ALMACEN},${C.GetString("PE_COSTO_TOT")},${C.GetString("PE_COSTOU")},${C.GetString("PE_CANT")}, ${C.GetString("PE_PRONOMBRE")}, ${C.GetString("PE_PROID")}, ${C.GetString("PE_CLIENTE")}, ${C.GetString("PE_FECHA")}, ${C.GetString("PE_USUARIO")}, ${C.GetString("PE_RUTA")}, ${C.GetString("PE_COSTO_SIN")}, ${C.GetString("PE_DESC")}, ${c.GetString("PE_FOLIO")}, ${PCNoArts}, ${PCMonto}"$) +' cmd.Name = "insert_pedido_INTMEX" ' SIN TOTALES INCLUIDOS +' cmd.Parameters = Array As Object(C.GetString("PE_CEDIS"),ALMACEN,C.GetString("PE_COSTO_TOT"),C.GetString("PE_COSTOU"),C.GetString("PE_CANT"),C.GetString("PE_PRONOMBRE"),C.GetString("PE_PROID"),C.GetString("PE_CLIENTE"),C.GetString("PE_FECHA"),C.GetString("PE_USUARIO"),C.GetString("PE_RUTA"), C.GetString("PE_COSTO_SIN"),C.GetString("PE_DESC"),c.GetString("PE_FOLIO")) +' reqManager.ExecuteCommand(cmd , "ins_pedido") + Next + End If + c.Close + d.Position=0 + cuantos_pedido = D.GetString("CUANTOS_PEDIDO") + d.Close + + ' NOVENTA + c=B4XPages.MainPage.skmt.ExecQuery("SELECT NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON FROM NOVENTA") + D=B4XPages.MainPage.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 cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_noventa_INTMEX" + 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) + reqManager.ExecuteCommand(cmd , "inst_noventa") + Next + End If + c.Close + d.Position=0 + cuantos_noventa = D.GetString("CUANTOS_NOVENTA") + d.Close + + ' GEO CERCA + c=B4XPages.MainPage.skmt.ExecQuery("Select HGCLIENTE, HGDATE, HGLAT, HGLON from HIST_GEOCERCA") + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_geocerca_INTMEX" + cmd.Parameters = Array As Object(C.GetString("HGCLIENTE"),C.GetString("HGDATE"),C.GetString("HGLAT"),C.GetString("HGLON")) + reqManager.ExecuteCommand(cmd , "inst_noventa") + Next + End If + c.Close + + ' LO DEL LIKE + c=B4XPages.MainPage.skmt.ExecQuery("Select HFCLIENTE, HFALIAS,HFRUTA,HFALMACEN from HIST_FACE") + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_face_like_INTMEX" + cmd.Parameters = Array As Object(C.GetString("HFCLIENTE"),C.GetString("HFALIAS"),C.GetString("HFRUTA"),C.GetString("HFALMACEN")) + reqManager.ExecuteCommand(cmd , "inst_noventa") + Next + End If + c.Close + + ' DROP + t1.Initialize("T1", 30000) ' 1000 = 1 second + t1.Enabled = True + Dim sDate,sTime As String + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Dim cmd As DBCommand + cmd.Initialize + cmd.Name ="insert_drop_INTMEX_2" + cmd.Parameters = Array As Object(usuario,l_ruta.Text,sDate & sTime, l_porvisitar.Text,l_drop.Text,l_efectiva.Text,l_cuantosc.Text,l_cuantosn.Text, L_MONTOD.Text,"ENVIO",ALMACEN) + reqManager.ExecuteCommand(cmd , "inst_noventa") + img2.Visible =True + PORCENTAJE = Round(100/ (cuantos_noventa + cuantos_pedido + cuantos_pedidosc + 1)) + If Starter.marcaCel <> "Sony" Then ToastMessageShow("Se Actualizaran los datos, Este proceso podria tardar hasta un minuto, gracias "& l_ruta.text , True) + + 'CUESTIONARIOS + c = B4XPages.MainPage.skmt.ExecQuery($"select * from cuestionario"$) + Private rutaActual As String = Subs.traeRuta + If c.RowCount > 0 Then + For x = 0 To c.RowCount - 1 + c.Position = x + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_CUESTIONARIO_INTMEX" + cmd.Parameters = Array As Object(c.GetString("Q_IDCLIENTE"), rutaActual, ALMACEN, c.GetString("Q_FECHA"), c.GetString("Q_IDPREGUNTA"), c.GetString("Q_PREGUNTA"), c.GetString("Q_IDRESPUESTA"), C.GetString("Q_RESPUESTA")) + reqManager.ExecuteCommand(cmd , "ins_cuestionario") + Next + End If + c.Close + + + c = B4XPages.MainPage.skmt.ExecQuery("SELECT * FROM PEDIDO_CLIENTE") + If c.RowCount > 0 Then + For i = 0 To c.RowCount - 1 + c.Position = i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_piezas_INTMEX" + cmd.Parameters = Array As Object(c.GetString("PC_CLIENTE"), ALMACEN,l_ruta.Text) + userpiezas = c.GetString("PC_CLIENTE") + reqManager.ExecuteQuery(cmd , 0, "piezas") + Next + + End If + + End If +End Sub + +Sub cargar_Click + Dim pedidodiaanterior As Boolean = False + Dim cp As Cursor = B4XPages.MainPage.skmt.ExecQuery("select * from PEDIDO") + If cp.RowCount > 0 Then + cp.Position = 0 + Private fecha As String = cp.GetString("PE_FECHA") + Dim fecha2() As String = Regex.Split("/",fecha) + Dim dia As String = fecha2(1) + Log(dia) + Dim dia2 As String = DateTime.GetDayOfMonth(DateTime.Now) + Log(dia & " , " & dia2) + If dia < dia2 Then + pedidodiaanterior = True + End If + End If + If Not (pedidodiaanterior) Then + CARGA = "CARGAR" + p_mandaInfo.Width = Root.Width + p_mandaInfo.Height = Root.Height + P1.Left = (p_mandaInfo.Width/2) - (P1.Width/2) + P1.top = (p_mandaInfo.Height/2) - (P1.Height/2) + img2.Visible =True + L_P_1.Visible = True + S_CC.Visible = True + Btn_Ubicar.Visible=False + P1.Visible = True + p_mandaInfo.Visible = True + p_principal.Visible = False + Subs.panelVisible(P1, 0, 0) + Subs.centraPanel(P1, Root.Width) + Subs.centraPanelV(P1, Root.Height) +' trabajar.Visible = False + NUEVO.Visible =False + BUSCA.Visible=False + connecta.Visible=False + L_P_3.Visible = True + S_CH.Visible = True + PB1.Visible = True + Resumen.Visible= False + + L_P_1.Text = "Catalogo de Clientes" + L_P_2.Text = "Catalogos de Productos" + L_P_3.Text = "Catalogos Historicos" + S_CC.Text = "EN PROCESO" + S_CH.Text = "EN PROCESO" + S_CP.Text = "EN PROCESO" + PB1.Progress = 0 + PB2.Progress = 0 + EJECUTANDO = 1 + + 'c=skmt.ExecQuery("CREATE TABLE kmt_info (pr_cd_credito NUMERIC,pr_cd_nombre TEXT,pr_cd_calle TEXT,pr_cd_numero TEXT,pr_cd_num_int TEXT,pr_cd_entrecalle1 TEXT,pr_cd_entrecalle2 TEXT,pr_cd_colonia TEXT,pr_cd_poblacion TEXT,pr_cd_edo TEXT,pr_cd_cp TEXT,pr_cd_zona TEXT,pr_cf_credito NUMERIC,pr_cf_saldotot NUMERIC,pr_cf_saldooper NUMERIC,pr_cf_saldof1 NUMERIC, pr_cf_penalizacion NUMERIC)") + TOPE = 0 + ' NUEVOS CLIENTE + B4XPages.MainPage.skmt.ExecNonQuery("delete from CLIENTE_NUEVO") + B4XPages.MainPage.skmt.ExecNonQuery("delete from kmt_info") + B4XPages.MainPage.skmt.ExecNonQuery("delete from kmt_info2") + B4XPages.MainPage.skmt.ExecNonQuery("delete from cod_result") + B4XPages.MainPage.skmt.ExecNonQuery("delete from hist_gest") + B4XPages.MainPage.skmt.ExecNonQuery("delete from cat_gunaprod") + B4XPages.MainPage.skmt.ExecNonQuery("delete from cat_gunaprod2") + B4XPages.MainPage.skmt.ExecNonQuery("delete from CAT_DETALLES_PAQ") + B4XPages.MainPage.skmt.ExecNonQuery("delete from telefonos") + B4XPages.MainPage.skmt.ExecNonQuery("delete from HIST_VENTAS") + B4XPages.MainPage.skmt.ExecNonQuery("delete from HIST_PROMOS") + B4XPages.MainPage.skmt.ExecNonQuery("delete from HIST_CLIENTE_CANT_PROMOS") + B4XPages.MainPage.skmt.ExecNonQuery("delete from PROMOS_COMP") + B4XPages.MainPage.skmt.ExecNonQuery("delete from CAT_VERIFICACION") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM MARCAS_RUTAS") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM HIST_STAY_STORE") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM HIST_GEOCERCA") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM HIST_MARCAS_CUOTAS") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM HIST_AVANCE") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM ABONOSP") + + c = B4XPages.MainPage.skmt.ExecQuery2("select count(CAT_VA_DESCRIPCION) as HoraIngreso from cat_variables where CAT_VA_DESCRIPCION = ? ", Array As String("HoraIngreso")) + c.Position = 0 + DateTime.TimeFormat = "HHmmss" + 'Valida si ya se cuenta con hora actualiza el valor si no lo inserta----------- + If c.GetString("HoraIngreso") > 0 Then + B4XPages.MainPage.skmt.ExecNonQuery2("Update cat_variables set CAT_VA_VALOR = ? WHERE CAT_VA_DESCRIPCION = ?" , Array As String(DateTime.Time(DateTime.Now),"HoraIngreso")) + Else + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_VALOR,CAT_VA_DESCRIPCION) VALUES (?,?)" , Array As String(DateTime.Time(DateTime.Now),"HoraIngreso")) + End If + c.Close + DateTime.TimeFormat = "HH:mm:ss" + c=B4XPages.MainPage.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c.Close +' + Dim sDate,sTime As String + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + + Dim P As PhoneId +' imei = P.GetDeviceId + imei = "xxxx" + cmd.Initialize + cmd.Name ="insert_drop_INTMEX_2" + cmd.Parameters = Array As Object(usuario,e_ruta.text,sDate,imei,sTime,"","","","","CARGA",ALMACEN) + reqManager.ExecuteCommand(cmd , "inst_noventa") + + cmd.Initialize + cmd.Name = "select_cat_gunaprod_INTMEX" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "gunaprod") + + cmd.Initialize + cmd.Name = "select_cat_gunaprod2_INTMEX" + cmd.Parameters = Array As Object(ALMACEN,e_ruta.Text) + reqManager.ExecuteQuery(cmd , 0, "gunaprod2") + +' cmd.Initialize +' cmd.Name = "select_resum_apk_INTMEX" ''' va el nombre de archivo de config +' cmd.Parameters = Array As Object(ALMACEN) +' reqManager.ExecuteQuery(cmd , 0, "resum_apk") ''' donde regresa la info ver job_done + + cmd.Initialize + cmd.Name = "select_cat_paquetes_INTMEX3" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "gunaprodp") +' Log("ALMACEN = " & ALMACEN) + + cmd.Initialize + cmd.Name = "select_cat_paquetess_INTMEX" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "gunaprodp") + + cmd.Initialize + cmd.Name = "select_cat_detallepa_INTMEX" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "detallepaq") + + cmd.Initialize + cmd.Name = "select_cat_clientes_INTMEX" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "kmt_datos") + + cmd.Initialize + cmd.Name = "select_cat_clientes_todos_INTMEX" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "kmt_datos_todos") + + cmd.Initialize + cmd.Name = "select_hist_datos_INTMEX_2" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN,e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "hist_datos") + + cmd.Initialize + cmd.Name = "select_hist_promos_INTMEX" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "hist_promos") + + cmd.Initialize + cmd.Name = "select_clientes_cuestionario_INTMEX" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "clientes_cuestionario") + + cmd.Initialize + cmd.Name = "select_hist_cliente_promos_INTMEX" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "hist_cliente_promos") + + +' cmd.Initialize +' cmd.Name = "select_HIST_MARCAS_CUOTAS_INTMEX" +' cmd.Parameters = Array As Object( ALMACEN, e_ruta.text) +' reqManager.ExecuteQuery(cmd , 0, "HIST_MARCAS_CUOTAS") + + If E_RUTA2.text <> "" Then + + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO RUTA_SUPLENCIA(RS_RUTA) VALUES(?)",Array As String(E_RUTA2.Text)) + + E_RUTA2.Visible = False + ImageView9.Visible = False + + cmd.Initialize + cmd.Name = "select_cat_clientes_INTMEX" + cmd.Parameters = Array As Object(E_RUTA2.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "kmt_datos") + + cmd.Initialize + cmd.Name = "select_cat_clientes_todos_INTMEX" + cmd.Parameters = Array As Object(E_RUTA2.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "kmt_datos_todos") + + cmd.Initialize + cmd.Name = "select_hist_datos_INTMEX" + cmd.Parameters = Array As Object(E_RUTA2.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "hist_datos") + + cmd.Initialize + cmd.Name = "select_hist_promos_INTMEX" + cmd.Parameters = Array As Object(E_RUTA2.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "hist_promos") + + cmd.Initialize + cmd.Name = "select_hist_cliente_promos_INTMEX" + cmd.Parameters = Array As Object(E_RUTA2.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "hist_cliente_promos") + End If + + cmd.Initialize + cmd.Name = "select_promo_comp_INTMEX" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "hist_comp_promos") + +' cmd.Initialize +' cmd.Name = "select_verificacion_INTMEX" +' cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) +' reqManager.ExecuteQuery(cmd , 0, "cat_verificacion") + + cmd.Initialize + cmd.Name = "select_fecha" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "fecha") + + cmd.Initialize + cmd.Name = "select_folio_INTMEX" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "folio") + + cmd.Initialize + cmd.Name = "select_abonosp_INTMEX" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "select_abonosp") + + cmd.Initialize + cmd.Name = "select_marcas_rutas_INTMEX" + cmd.Parameters = Array As Object( ALMACEN, e_ruta.text) + reqManager.ExecuteQuery(cmd , 0, "marcas_rutas") + +' cmd.Initialize +' cmd.Name = "select_CUEST_INTMEX" +' cmd.Parameters = Array As Object(ALMACEN) +' reqManager.ExecuteQuery(cmd , 0, "CUESTIONARIO") + +' cmd.Initialize +' cmd.Name = "select_HIST_CUOTAS_INTMEX" +' cmd.Parameters = Array As Object( ALMACEN,e_ruta.text ) +' reqManager.ExecuteQuery(cmd , 0, "CUOTAS") + + cmd.Initialize + cmd.Name = "select_comis_cedex_INTMEX" + cmd.Parameters = Array As Object( ALMACEN, e_ruta.text ) + reqManager.ExecuteQuery(cmd , 0, "COMISIONES") + + cmd.Initialize + cmd.Name = "select_hist_avance_INTMEX" 'select * from HIST_AVANCE_MESACTUAL where HIST_AM_RUTA = ? and HIST_AM_IDALMACEN order by HIST_AM_MARCA + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) + LogColor($"HIST_AVANCE Ruta=|${e_ruta.text}|, almacen=|${ALMACEN}|"$, Colors.Red) + reqManager.ExecuteQuery(cmd , 0, "hist_avance") + + cargar.Visible = False + Subir.Visible = False + inv.Visible = False + If Starter.marcaCel <> "Sony" Then ToastMessageShow("Se Actualizaran los datos, Este proceso podria tardar hasta un minuto, gracias" , True) + 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 + +Sub JobDone(Job As HttpJob) + Log("JOBDONE PRINCIPAL") + If reqManager.reqsList.IsInitialized Then 'Si tenemos lista de requests, la procesamos. + If reqManager.reqsList.IndexOf(Job.tag) <> -1 Then + reqManager.reqsList.RemoveAt(reqManager.reqsList.IndexOf(Job.tag)) + LogColor($">>>>>> Quitamos ${Job.tag}"$, Colors.Blue) + End If + LogColor(">>>>>> " & reqManager.reqsList.Size & " - " & reqManager.reqsList, Colors.Blue) + End If + If Job.Success = False Then + Log("ERROR") +' LogColor("Error: " & reqManager.HandleJob(Job).tag & " : " & Job.ErrorMessage, Colors.red) + Log("ex") + Log(2) +' Job.Release + Else 'If Job Success then ... + Log(3) + LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.RGB(0,160,0)) 'Mod por CHV - 211027 + 'Verificamos que el usuario guardado en BD sea VALIDO. + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "update_gps" Then + For Each records() As Object In RESULT.Rows + Log("==========================REGISTROS="&RESULT.Rows) + For Each k As String In RESULT.Columns.Keys + Log(RESULT.Tag & ": " & k & ": " & records(RESULT.Columns.Get(k))) + Next + Next + End If + If RESULT.Tag = "ins_pedidos" Then + For Each records() As Object In RESULT.Rows + Log("==========================REGISTROS="&RESULT.Rows) + For Each k As String In RESULT.Columns.Keys + Log(RESULT.Tag & ": " & k & ": " & records(RESULT.Columns.Get(k))) + Next + Next + End If +' If RESULT.Tag = "usuarioA" Then 'query tag +' Private n As String = "Sin Usuario" +' For Each records() As Object In RESULT.Rows +' n = records(RESULT.Columns.Get("USUARIO")) +' Next +' LogColor("**************************"&n, Colors.Green) +' If n = "OKActivo" Then +' Log("Usuario guardado en BD es 'Valido'") +' Else If n = "OKExpirado" Then +' Msgbox("Usuario Expirado llamar al administrador","") 'ignore +' B4XPages.ShowPage("B4XMainPage") +' Else If n = "OKCancelado" Then +' Msgbox("Usuario Cancelado llamar al administrador","") 'ignore +' B4XPages.ShowPage("B4XMainPage") +' Else +' Msgbox("Usuario o password No validos","") 'ignore +' B4XPages.ShowPage("B4XMainPage") +' End If +' Log("***************** "&n) +' End If + + + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = B4XPages.MainPage.reqManager.HandleJob(Job) + If RESULT.Tag = "usuarioA" Then 'query tag + Private n As String = "Sin Usuario" + For Each records() As Object In RESULT.Rows + n = records(RESULT.Columns.Get("USUARIO")) + Next + Log(n) + 'Logcolor("**************************"&n, Colors.Green) + If n = "OKActivo" Then + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_ruta_INTMEX_7" + cmd.Parameters = Array As Object(ALMACEN,e_ruta.text,imei) + Log($"${ALMACEN},${e_ruta.text},${imei}"$) + reqManager.ExecuteQuery(cmd , 0, "ruta") + Else + Msgbox("Usuario o password No validos","") 'ignore + B4XPages.MainPage.skmt.ExecNonQuery("delete from USUARIOA") + ExitApplication + End If + 'Log("***************** "&n) + End If + End If + + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "kmt_datos" Then 'query tag + S_CC.TEXT = "CARGANDO" + 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_MTOCOMPRA As String = records(RESULT.Columns.Get("CAT_CL_MTOCOMPRA")) + Dim CAT_CL_NUM_SERIEFISICO As String = records(RESULT.Columns.Get("CAT_CL_NUM_SERIEFISICO")) + B4XPages.MainPage.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_MTOCOMPRA,CAT_CL_NUM_SERIEFISICO, gestion) 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_MTOCOMPRA,CAT_CL_NUM_SERIEFISICO)) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO HIST_STAY_STORE(HSS_CODIGO, HSS_IN , HSS_OUT , HSS_TOT) VALUES (?,0,0,0)", Array As Object (CAT_CL_CODIGO)) + 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_MTOCOMPRA,CAT_CL_NUM_SERIEFISICO, gestion) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,0,0) ",Array As Object ("0",e_ruta.TEXT, "VENTA ABORDO","null","null","null","null","null","null","null","null","null","null","null","null","NULL","null","NULL")) + Listo1 = 1 + S_CC.Text = "LISTO" + If Starter.marcaCel <> "Sony" Then ToastMessageShow("Catalogo Clientes Actualizados." , True) + If Listo1 =1 And Listo2 =1 And Listo3 = 1 And Listo4 = 1 Then + B4XPage_Appear + img2.Visible=False + EJECUTANDO=0 + End If + End If + End If + + If Job.JobName = "DBRequest" Then + Dim resultado As DBResult = reqManager.HandleJob(Job) + If resultado.Tag = "piezas" Then 'query tag +' B4XPages.MainPage.picking.cl_picking.Clear + Dim piezasexiste As Int + + For Each records() As Object In resultado.Rows + + piezasexiste = records(resultado.Columns.Get("COUNT(*)")) + Log(piezasexiste) + DateTime.DateFormat = "MM/dd/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + + If piezasexiste = 0 Then + + Dim PCNoArts As String + Dim PCMonto As String + c = B4XPages.MainPage.skmt.ExecQuery2("SELECT * FROM PEDIDO_CLIENTE WHERE PC_CLIENTE = ?", Array As String(userpiezas)) + + If c.RowCount > 0 Then + c.Position = 0 + PCNoArts = c.GetString("PC_NOART") + PCMonto = c.GetString("PC_MONTO") + End If + + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_HVC_INTMEX" + cmd.Parameters = Array As Object((sDate & " " & sTime), userpiezas, PCNoArts, PCMonto, ALMACEN, l_ruta.Text) + reqManager.ExecuteCommand(cmd , "insert_hvc") +' reqManager.ExecuteCommand(cmd , $"ins_abonosPendientes_${ab.GetString("a_cliente")}"$) + + End If + Next + + + End If + End If + + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "kmt_datos_todos" Then 'query tag + S_CC.TEXT = "CARGANDO" + 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_MTOCOMPRA As String = records(RESULT.Columns.Get("CAT_CL_MTOCOMPRA")) + Dim CAT_CL_NUM_SERIEFISICO As String = records(RESULT.Columns.Get("CAT_CL_NUM_SERIEFISICO")) + Dim CAT_CL_DIAS_VISITA As String = records(RESULT.Columns.Get("CAT_CL_DIAS_VISITA")) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO kmt_info2(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_MTOCOMPRA,CAT_CL_NUM_SERIEFISICO, gestion, CAT_CL_DIAS_VISITA) 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_MTOCOMPRA,CAT_CL_NUM_SERIEFISICO,CAT_CL_DIAS_VISITA)) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO HIST_STAY_STORE(HSS_CODIGO, HSS_IN , HSS_OUT , HSS_TOT) VALUES (?,0,0,0)", Array As Object (CAT_CL_CODIGO)) + Next + Listo1 = 1 + S_CC.Text = "LISTO" + If Starter.marcaCel <> "Sony" Then ToastMessageShow("Catalogo Clientes Actualizados." , True) + If Listo1 =1 And Listo2 =1 And Listo3 = 1 And Listo4 = 1 Then + 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 = "resum_apk" Then 'query tag + For Each records() As Object In RESULT.Rows + Dim HIST_RA_OBJMES As String = records(RESULT.Columns.Get("HIST_RA_OBJMES")) + Dim HIST_RA_VENTA As String = records(RESULT.Columns.Get("HIST_RA_VENTA")) + Dim HIST_RA_TENDENCIA As String = records(RESULT.Columns.Get("HIST_RA_TENDENCIA")) + Dim HIST_RA_ALCANCE As String = records(RESULT.Columns.Get("HIST_RA_ALCANCE")) + Dim HISR_RA_DRAOBJ As String = records(RESULT.Columns.Get("HISR_RA_DRAOBJ")) + Dim HIST_RA_DRAVTA As String = records(RESULT.Columns.Get("HIST_RA_DRAVTA")) + Dim HIST_RA_DSOBJ As String = records(RESULT.Columns.Get("HIST_RA_DSOBJ")) + Dim HIST_RA_DSVTA As String = records(RESULT.Columns.Get("HIST_RA_DSVTA")) + Dim HIST_RA_VPOOBJ As String = records(RESULT.Columns.Get("HIST_RA_VPOOBJ")) + Dim HIST_RA_VPOVTA As String = records(RESULT.Columns.Get("HIST_RA_VPOVTA")) + Dim HIST_RA_CTES As String = records(RESULT.Columns.Get("HIST_RA_CTES")) + Dim HIST_RA_COBCCC As String = records(RESULT.Columns.Get("HIST_RA_COBCCC")) + Dim HIST_RA_ECO As String = records(RESULT.Columns.Get("HIST_RA_ECO")) + Dim HIST_RA_VISITPLAN As String = records(RESULT.Columns.Get("HIST_RA_VISITPLAN")) + Dim HIST_RA_VISIREAL As String = records(RESULT.Columns.Get("HIST_RA_VISIREAL")) + Dim HIST_RA_COBVISIT As String = records(RESULT.Columns.Get("HIST_RA_COBVISIT")) + Dim HIST_RA_FRECCOMPOBJ As String = records(RESULT.Columns.Get("HIST_RA_FRECCOMPOBJ")) + Dim HIST_RA_FRECCOMREAL As String = records(RESULT.Columns.Get("HIST_RA_FRECCOMREAL")) + Dim HIST_RA_VENTAMES1 As String = records(RESULT.Columns.Get("HIST_RA_VENTAMES1")) + Dim HIST_RA_VENTAMES2 As String = records(RESULT.Columns.Get("HIST_RA_VENTAMES2")) + Dim HIST_RA_VENTAMES3 As String = records(RESULT.Columns.Get("HIST_RA_VENTAMES3")) + Dim HIST_RA_VENTAMES4 As String = records(RESULT.Columns.Get("HIST_RA_VENTAMES4")) + Dim HIST_RA_RECHAZO As String = records(RESULT.Columns.Get("HIST_RA_RECHAZO")) + Dim HIST_RA_RECHAZOPORCEN As String = records(RESULT.Columns.Get("HIST_RA_RECHAZOPORCEN")) + Dim HIST_RA_SEMANA1 As String = records(RESULT.Columns.Get("HIST_RA_SEMANA1")) + Dim HIST_RA_SEMANA1_DIAS As String = records(RESULT.Columns.Get("HIST_RA_SEMANA1_DIAS")) + Dim HIST_RA_SEMANA1_DRA As String = records(RESULT.Columns.Get("HIST_RA_SEMANA1_DRA")) + Dim HIST_RA_SEMANA2 As String = records(RESULT.Columns.Get("HIST_RA_SEMANA2")) + Dim HIST_RA_SEMANA2_DIAS As String = records(RESULT.Columns.Get("HIST_RA_SEMANA2_DIAS")) + Dim HIST_RA_SEMANA2_DRA As String = records(RESULT.Columns.Get("HIST_RA_SEMANA2_DRA")) + Dim HIST_RA_SEMANA3 As String = records(RESULT.Columns.Get("HIST_RA_SEMANA3")) + Dim HIST_RA_SEMANA3_DIAS As String = records(RESULT.Columns.Get("HIST_RA_SEMANA3_DIAS")) + Dim HIST_RA_SEMANA3_DRA As String = records(RESULT.Columns.Get("HIST_RA_SEMANA3_DRA")) + Dim HIST_RA_SEMANA4 As String = records(RESULT.Columns.Get("HIST_RA_SEMANA4")) + Dim HIST_RA_SEMANA4_DIAS As String = records(RESULT.Columns.Get("HIST_RA_SEMANA4_DIAS")) + Dim HIST_RA_SEMANA4_DRA As String = records(RESULT.Columns.Get("HIST_RA_SEMANA4_DRA")) + Dim HIST_RA_SEMANA5 As String = records(RESULT.Columns.Get("HIST_RA_SEMANA5")) + Dim HIST_RA_SEMANA5_DIAS As String = records(RESULT.Columns.Get("HIST_RA_SEMANA5_DIAS")) + Dim HIST_RA_SEMANA5_DRA As String = records(RESULT.Columns.Get("HIST_RA_SEMANA5_DRA")) + Dim HIST_RA_SEMANA1_LPT As String = records(RESULT.Columns.Get("HIST_RA_SEMANA1_LPT")) + Dim HIST_RA_SEMANA2_LPT As String = records(RESULT.Columns.Get("HIST_RA_SEMANA2_LPT")) + Dim HIST_RA_SEMANA3_LPT As String = records(RESULT.Columns.Get("HIST_RA_SEMANA3_LPT")) + Dim HIST_RA_SEMANA4_LPT As String = records(RESULT.Columns.Get("HIST_RA_SEMANA4_LPT")) + Dim HIST_RA_SEMANA5_LPT As String = records(RESULT.Columns.Get("HIST_RA_SEMANA5_LPT")) + Dim HIST_RA_RUTA As String = records(RESULT.Columns.Get("HIST_RA_RUTA")) + Dim HIST_RA_IDALMACEN As String = records(RESULT.Columns.Get("HIST_RA_IDALMACEN")) + + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO HIST_RESUM_APK(HIST_RA_OBJMES,HIST_RA_VENTA,HIST_RA_TENDENCIA,HIST_RA_ALCANCE,HISR_RA_DRAOBJ,HIST_RA_DRAVTA,HIST_RA_DSOBJ,HIST_RA_DSVTA,HIST_RA_VPOOBJ,HIST_RA_VPOVTA,HIST_RA_CTES,HIST_RA_COBCCC,HIST_RA_ECO,HIST_RA_VISITPLAN,HIST_RA_VISIREAL,HIST_RA_COBVISIT,HIST_RA_FRECCOMPOBJ,HIST_RA_FRECCOMREAL,HIST_RA_VENTAMES1,HIST_RA_VENTAMES2,HIST_RA_VENTAMES3,HIST_RA_VENTAMES4,HIST_RA_RECHAZO,HIST_RA_RECHAZOPORCEN,HIST_RA_SEMANA1,HIST_RA_SEMANA1_DIAS,HIST_RA_SEMANA1_DRA,HIST_RA_SEMANA2,HIST_RA_SEMANA2_DIAS,HIST_RA_SEMANA2_DRA,HIST_RA_SEMANA3,HIST_RA_SEMANA3_DIAS,HIST_RA_SEMANA3_DRA,HIST_RA_SEMANA4,HIST_RA_SEMANA4_DIAS,HIST_RA_SEMANA4_DRA,HIST_RA_SEMANA5,HIST_RA_SEMANA5_DIAS,HIST_RA_SEMANA5_DRA,HIST_RA_SEMANA1_LPT,HIST_RA_SEMANA2_LPT,HIST_RA_SEMANA3_LPT,HIST_RA_SEMANA4_LPT,HIST_RA_SEMANA5_LPT,HIST_RA_RUTA,HIST_RA_IDALMACEN) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object (HIST_RA_OBJMES,HIST_RA_VENTA,HIST_RA_TENDENCIA,HIST_RA_ALCANCE,HISR_RA_DRAOBJ,HIST_RA_DRAVTA,HIST_RA_DSOBJ,HIST_RA_DSVTA,HIST_RA_VPOOBJ,HIST_RA_VPOVTA,HIST_RA_CTES,HIST_RA_COBCCC,HIST_RA_ECO,HIST_RA_VISITPLAN,HIST_RA_VISIREAL,HIST_RA_COBVISIT,HIST_RA_FRECCOMPOBJ,HIST_RA_FRECCOMREAL,HIST_RA_VENTAMES1,HIST_RA_VENTAMES2,HIST_RA_VENTAMES3,HIST_RA_VENTAMES4,HIST_RA_RECHAZO,HIST_RA_RECHAZOPORCEN,HIST_RA_SEMANA1,HIST_RA_SEMANA1_DIAS,HIST_RA_SEMANA1_DRA,HIST_RA_SEMANA2,HIST_RA_SEMANA2_DIAS,HIST_RA_SEMANA2_DRA,HIST_RA_SEMANA3,HIST_RA_SEMANA3_DIAS,HIST_RA_SEMANA3_DRA,HIST_RA_SEMANA4,HIST_RA_SEMANA4_DIAS,HIST_RA_SEMANA4_DRA,HIST_RA_SEMANA5,HIST_RA_SEMANA5_DIAS,HIST_RA_SEMANA5_DRA,HIST_RA_SEMANA1_LPT,HIST_RA_SEMANA2_LPT,HIST_RA_SEMANA3_LPT,HIST_RA_SEMANA4_LPT,HIST_RA_SEMANA5_LPT,HIST_RA_RUTA,HIST_RA_IDALMACEN)) + ' Msgbox("pasa","alo") + Next + Listo1 = 1 + S_CC.Text = "LISTO" + If Starter.marcaCel <> "Sony" Then ToastMessageShow("Catalogo Resumen Actualizado." , True) + End If + End If + + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "hist_promos" Then 'query tag + For Each records() As Object In RESULT.Rows + Dim HP_CLIENTE As String = records(RESULT.Columns.Get("HP_CLIENTE")) + Dim HP_CODIGO_PROMOCION As String = records(RESULT.Columns.Get("HP_CODIGO_PROMOCION")) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO HIST_PROMOS(HP_CLIENTE, HP_CODIGO_PROMOCION) VALUES (?,?)", Array As Object (HP_CLIENTE, HP_CODIGO_PROMOCION)) + Next + If Starter.marcaCel <> "Sony" Then ToastMessageShow("Historico Promociones Actualizado." , True) + If PB1.Progress = 0 Then + PB1.Progress = 30 + S_CH.Text = "CARGANDO" + ELSE If PB1.Progress = 30 Then + PB1.Progress = 60 + ELSE IF PB1.Progress = 60 Then + PB1.Progress = 100 + S_CH.Text = "LISTO" + End If + End If + End If + + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "hist_cliente_promos" Then 'query tag + For Each records() As Object In RESULT.Rows + Dim HCCP_CLIENTE As String = records(RESULT.Columns.Get("HCCP_CLIENTE")) + Dim HCCP_PROMO As String = records(RESULT.Columns.Get("HCCP_PROMO")) + Dim HCCP_CANT As String = records(RESULT.Columns.Get("HCCP_CANT")) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO HIST_CLIENTE_CANT_PROMOS(HCCP_CLIENTE, HCCP_PROMO, HCCP_CANT) VALUES (?,?,?)", Array As Object (HCCP_CLIENTE, HCCP_PROMO,HCCP_CANT)) + Next + If Starter.marcaCel <> "Sony" Then ToastMessageShow(" Historico Clientes Promociones Actualizado." , True) + End If + End If + + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "HIST_MARCAS_CUOTAS" Then 'query tag + For Each records() As Object In RESULT.Rows + Dim HMC_MARCA As String = records(RESULT.Columns.Get("HMC_MARCA")) + Dim HMC_TOTAL As String = records(RESULT.Columns.Get("HMC_TOTAL")) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO HIST_MARCAS_CUOTAS(HMC_MARCA, HMC_TOTAL) VALUES (?,?)", Array As Object (HMC_MARCA, HMC_TOTAL)) + Next + If Starter.marcaCel <> "Sony" Then ToastMessageShow(" Historico Marcas" , True) + End If + End If + + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "hist_comp_promos" Then 'query tag + For Each records() As Object In RESULT.Rows + Dim CAT_PA_ID As String = records(RESULT.Columns.Get("CAT_PA_ID")) + Dim CAT_PA_MAXPROM As String = records(RESULT.Columns.Get("CAT_PA_MAXPROM")) + Dim CAT_PA_MAXPROMREC As String = records(RESULT.Columns.Get("CAT_PA_MAXPROMREC")) + Dim CAT_PA_MAXPROMCLIE As String = records(RESULT.Columns.Get("CAT_PA_MAXPROMCLIE")) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PROMOS_COMP(CAT_PA_ID, CAT_PA_MAXPROM, CAT_PA_MAXPROMREC, CAT_PA_MAXPROMCLIE) VALUES (?,?,?,?)", Array As Object (CAT_PA_ID, CAT_PA_MAXPROM,CAT_PA_MAXPROMREC,CAT_PA_MAXPROMCLIE)) + Next + If PB1.Progress = 0 Then + PB1.Progress = 30 + S_CH.Text = "CARGANDO" + ELSE If PB1.Progress = 30 Then + PB1.Progress = 60 + ELSE IF PB1.Progress = 60 Then + PB1.Progress = 100 + S_CH.Text = "LISTO" + End If + End If + End If + + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "cat_verificacion" Then 'query tag + For Each records() As Object In RESULT.Rows + Dim CAT_VE_IDPROD As String = records(RESULT.Columns.Get("CAT_VE_IDPROD")) + Dim CAT_VE_NOMBRE As String = records(RESULT.Columns.Get("CAT_VE_NOMBRE")) + Dim CAT_VE_ORDEN As String = records(RESULT.Columns.Get("CAT_VE_ORDEN")) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO CAT_VERIFICACION(CAT_VE_IDPROD, CAT_VE_NOMBRE,CAT_VE_ORDEN) VALUES (?,?,?)", Array As Object (CAT_VE_IDPROD, CAT_VE_NOMBRE,CAT_VE_ORDEN)) + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "marcas_rutas" Then 'query tag + For Each records() As Object In RESULT.Rows + Dim HVD_MARCA As String = records(RESULT.Columns.Get("HVD_MARCA")) + Dim CLIENTES As String = records(RESULT.Columns.Get("CLIENTES")) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO MARCAS_RUTAS(HVD_MARCA, CLIENTES) VALUES (?,?)", Array As Object (HVD_MARCA, CLIENTES)) + Next + End If + End If + + 'CUOTAS + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "CUOTAS" Then 'query tag + For Each records() As Object In RESULT.Rows + Dim HC_RUTA As String = records(RESULT.Columns.Get("HC_RUTA")) + Dim HC_CUOTA1 As String = records(RESULT.Columns.Get("HC_CUOTA1")) + Dim HC_CUOTA2 As String = records(RESULT.Columns.Get("HC_CUOTA2")) + Dim HC_CUOTA3 As String = records(RESULT.Columns.Get("HC_CUOTA3")) + Dim HC_CUOTA4 As String = records(RESULT.Columns.Get("HC_CUOTA4")) + Dim HC_CUOTA5 As String = records(RESULT.Columns.Get("HC_CUOTA5")) + Dim HC_CUOTA6 As String = records(RESULT.Columns.Get("HC_CUOTA6")) + Dim HC_META1 As String = records(RESULT.Columns.Get("HC_META1")) + Dim HC_META2 As String = records(RESULT.Columns.Get("HC_META2")) + Dim HC_META3 As String = records(RESULT.Columns.Get("HC_META3")) + Dim HC_META4 As String = records(RESULT.Columns.Get("HC_META4")) + Dim HC_META5 As String = records(RESULT.Columns.Get("HC_META5")) + Dim HC_META6 As String = records(RESULT.Columns.Get("HC_META6")) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO HIST_CUOTAS(HC_RUTA, HC_CUOTA1,HC_CUOTA2,HC_CUOTA3,HC_CUOTA4,HC_CUOTA5,HC_CUOTA6,HC_META1,HC_META2,HC_META3,HC_META4,HC_META5,HC_META6) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object (HC_RUTA, HC_CUOTA1,HC_CUOTA2,HC_CUOTA3,HC_CUOTA4,HC_CUOTA5,HC_CUOTA6,HC_META1,HC_META2,HC_META3,HC_META4,HC_META5,HC_META6)) + Next + + End If + End If + 'COMISIONES + + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "COMISIONES" Then 'query tag + For Each records() As Object In RESULT.Rows + Dim HCM_TOTAL_V As String = records(RESULT.Columns.Get("HCM_TOTAL_V")) + Dim HCM_TOTAL_VIVE As String = records(RESULT.Columns.Get("HCM_TOTAL_VIVE")) + Dim HCM_TOTAL_GUNA As String = records(RESULT.Columns.Get("HCM_TOTAL_GUNA")) + Dim HCM_TOTAL_BEB As String = records(RESULT.Columns.Get("HCM_TOTAL_BEB")) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO HIST_COMISIONES_MOVIL (HCM_TOTAL_V , HCM_TOTAL_VIVE , HCM_TOTAL_GUNA , HCM_TOTAL_BEB) VALUES (?,?,?,?)", Array As Object (HCM_TOTAL_V , HCM_TOTAL_VIVE , HCM_TOTAL_GUNA , HCM_TOTAL_BEB)) + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "gunaprod" Then 'query tag + If PB2.Progress < 30 Then S_CP.Text = "CARGANDO" 'Mod por CHV - 20211028 Agregue el "If PB2.Progress < 30 then" + 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")) +' 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)) + B4XPages.MainPage.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_TIPOPROD,CAT_GP_INICIATIVA) 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)) + Next + Listo2=1 + If PB2.Progress = 0 Then + PB2.Progress = 30 + S_CP.Text = "CARGANDO" + ELSE If PB2.Progress = 30 Then + PB2.Progress = 60 + ELSE IF PB2.Progress = 60 Then + PB2.Progress = 100 + S_CP.Text = "LISTO" + End If + If Starter.marcaCel <> "Sony" Then ToastMessageShow("Productos Actualizados." , True) + If Listo1 =1 And Listo2 =1 And Listo3 = 1 And Listo4 = 1 Then + B4XPage_Appear + img2.Visible=False + EJECUTANDO=0 + End If + End If + End If + + + ''AQUI ESTAMOS TRABAJANDO + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "gunaprod2" Then 'query tag + If PB2.Progress < 30 Then S_CP.Text = "CARGANDO" 'Mod por CHV - 20211028 Agregue el "If PB2.Progress < 30 then" + For Each records() As Object In RESULT.Rows + Dim CAT_GP_ID As String = records(RESULT.Columns.Get("CAT_DP_ID")) + Dim CAT_GP_NOMBRE As String = records(RESULT.Columns.Get("CAT_DP_NOMBRE")) + Dim CAT_GP_IMP1 As String = records(RESULT.Columns.Get("CAT_DP_IMP1")) + Dim CAT_GP_IMP2 As String = records(RESULT.Columns.Get("CAT_DP_IMP2")) + Dim CAT_GP_PRECIO As String = records(RESULT.Columns.Get("CAT_DP_PRECIO")) + Dim CAT_GP_CLASIF As String = records(RESULT.Columns.Get("CAT_DP_CLASIF")) + Dim CAT_GP_STS As String = records(RESULT.Columns.Get("CAT_DP_STS")) + Dim CAT_GP_TIPO As String = records(RESULT.Columns.Get("CAT_DP_TIPO")) + Dim CAT_GP_SUBTIPO As String = records(RESULT.Columns.Get("CAT_DP_SUBTIPO")) + Dim CAT_GP_IMG() As Byte = records(RESULT.Columns.Get("CAT_DP_IMG")) + Dim CAT_GP_ALMACEN As Int = records(RESULT.Columns.Get("CAT_DP_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_DP_TIPOPROD")) + Dim CAT_GP_INICIATIVA As Int = records(RESULT.Columns.Get("CAT_DP_INICIATIVA")) +' 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)) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD2(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) 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)) + Next + Listo2=1 + If PB2.Progress = 0 Then + PB2.Progress = 30 + S_CP.Text = "CARGANDO" + ELSE If PB2.Progress = 30 Then + PB2.Progress = 60 + ELSE IF PB2.Progress = 60 Then + PB2.Progress = 100 + S_CP.Text = "LISTO" + End If + If Starter.marcaCel <> "Sony" Then ToastMessageShow("Productos Actualizados." , True) + If Listo1 =1 And Listo2 =1 And Listo3 = 1 And Listo4 = 1 Then + 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 + 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_TIPOPROD As Int = records(RESULT.Columns.Get("CAT_GP_TIPOPROD")) + CAT_GP_TIPOPROD = "5" + If CAT_GP_ID = "PAQUNI003" Then + CAT_GP_ALMACEN = 60 + End If +' Log("XXXXXXX gunaprodp XXXXXXXXX " & CAT_GP_ID & "|" & CAT_GP_IMP1 & "|" & CAT_GP_IMP2) + B4XPages.MainPage.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_TIPOPROD) 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)) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD2(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) 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)) + Next + If PB2.Progress = 0 Then + PB2.Progress = 30 + S_CP.Text = "CARGANDO" + ELSE If PB2.Progress = 30 Then + PB2.Progress = 60 + ELSE IF PB2.Progress = 60 Then + PB2.Progress = 100 + S_CP.Text = "LISTO" + End If + If Starter.marcaCel <> "Sony" Then ToastMessageShow("Promociones Actualizados." , True) + Listo4=1 + If Listo1 =1 And Listo2 =1 And Listo3 = 1 And Listo4 = 1 Then + B4XPage_Appear + img2.Visible=False + EJECUTANDO=0 + Else If Listo4 = 1 And Listo3 = 1 And inve = 1 Then + 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 = "gunaprodps" Then 'query tag + 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_TIPOPROD As Int = records(RESULT.Columns.Get("CAT_GP_TIPOPROD")) + Log("XXXXXXXX gunaprodps XXXXXXXX " & records(RESULT.Columns.Get("CAT_GP_ID")) & "|" & records(RESULT.Columns.Get("CAT_GP_IMP1"))) + B4XPages.MainPage.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_TIPOPROD) 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)) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD2(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) 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)) + Next + If PB2.Progress = 0 Then + PB2.Progress = 30 + S_CP.Text = "CARGANDO" + Log("C4") + ELSE If PB2.Progress = 30 Then + PB2.Progress = 60 + ELSE IF PB2.Progress = 60 Then + PB2.Progress = 100 + S_CP.Text = "LISTO" + Log("3") + End If + If Starter.marcaCel <> "Sony" Then ToastMessageShow("Promociones especiales Actualizados." , True) + + Listo4=1 + If Listo1 =1 And Listo2 =1 And Listo3 = 1 And Listo4 = 1 Then + B4XPage_Appear + img2.Visible=False + EJECUTANDO=0 + Else If Listo4 = 1 And Listo3 = 1 And inve = 1 Then + 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 + 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")) + B4XPages.MainPage.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 + If PB2.Progress = 0 Then + PB2.Progress = 30 + S_CP.Text = "CARGANDO" + ELSE If PB2.Progress = 30 Then + PB2.Progress = 60 + ELSE IF PB2.Progress = 60 Then + PB2.Progress = 100 + S_CP.Text = "LISTO" + End If + Listo3 =1 + If Listo1 =1 And Listo2 =1 And Listo3 = 1 And Listo4 = 1 Then + B4XPage_Appear + img2.Visible=False + EJECUTANDO=0 + Else If Listo4 = 1 And Listo3 = 1 And inve = 1 Then + 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 = "hist_datos" Then 'query tag + 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")) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO HIST_VENTAS(HVD_CLIENTE,HVD_PRONOMBRE,HVD_CANT,HVD_COSTO_TOT) VALUES (?,?,?,?)", Array As Object (HVD_CLIENTE,HVD_PRONOMBRE,HVD_CANT,HVD_COSTO_TOT)) + Next + Listo3 =1 + If PB1.Progress = 0 Then + PB1.Progress = 30 + S_CH.Text = "CARGANDO" + ELSE If PB1.Progress = 30 Then + PB1.Progress = 60 + ELSE IF PB1.Progress = 60 Then + PB1.Progress = 100 + S_CH.Text = "LISTO" + End If + If Starter.marcaCel <> "Sony" Then ToastMessageShow("Venta historico Actualizado." , True) + If Listo1 =1 And Listo2 =1 And Listo3 = 1 And Listo4 = 1 Then + 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 = "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")) + B4XPages.MainPage.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 = "CUESTIONARIO" Then 'query tag + For Each records() As Object In RESULT.Rows + Dim Cat_Va_Valor As String = records(RESULT.Columns.Get("CAT_VALOR")) + B4XPages.MainPage.skmt.ExecNonQuery2("DELETE FROM CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As Object ("CUESTIONARIO")) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("CUESTIONARIO", Cat_Va_Valor)) + 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" + S_CP.Text = "INFO OK" + Else + If Starter.marcaCel <> "Sony" Then ToastMessageShow("No se cargo bien la info P. Sync Nuevamente" & CUANTOSP & " " & cuantos_pedido, True) + S_CP.Text = "ENVIAR DATOS (K-2)" + 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 + If Starter.marcaCel <> "Sony" Then 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 + If Starter.marcaCel <> "Sony" Then 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 = "ins_pedido" Then 'query tag + For Each records() As Object In RESULT.Rows + PB2.Progress = PB2.Progress + 5 + S_CP.Text = "SUBIENDO" + Next + PB2.Progress = 100 + S_CP.Text = "REVISANDO ..." + Log("5") + 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 + B4XPages.MainPage.skmt.ExecNonQuery("delete from VERSION") + Dim CAT_VE_VERSION As String = records(RESULT.Columns.Get("CAT_VE_VERSION")) + B4XPages.MainPage.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 + Log("JOBDONE PRINCIPAL RUTA") + Log(RESULT.Rows.Size) + For Each records() As Object In RESULT.Rows + Dim VALIDO As String = records(RESULT.Columns.Get("VALIDO")) + Log("|"&VALIDO) + If VALIDO = "OK" Then + cargar.Visible = True + Subir.Visible = True + inv.Visible = True + connecta.Visible = False + If conn = "1" Then + ToastMessageShow("Existe Conexión con el Servidor." , True) + End If + Else + cargar.Visible = False + Subir.Visible = False + inv.Visible = False + connecta.Visible = False + ToastMessageShow("Ruta invalida." , True) + End If + 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 name2 As String = records(RESULT.Columns.Get("VALIDO")) + Next + If name2 = "OK" Then + PASO = 1 + End If + P1.Visible = False + p_mandaInfo.Visible = False + End If + End If + + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "fecha" Then 'query tag + For Each records() As Object In RESULT.Rows + Dim FECHA_HOY As String = records(RESULT.Columns.Get("FECHA")) + B4XPages.MainPage.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("FECHA")) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("FECHA",FECHA_HOY)) + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "folio" Then 'query tag + For Each records() As Object In RESULT.Rows + Dim FOLIO As String = records(RESULT.Columns.Get("FOLIO")) + B4XPages.MainPage.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("FOLIO")) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("FOLIO",FOLIO)) + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "hist_avance" Then 'query tag + For Each records() As Object In RESULT.Rows + Dim marca As String = records(RESULT.Columns.Get("HIST_AM_MARCA")) + Dim avance As String = records(RESULT.Columns.Get("HIST_AM_AVANCE")) + Dim objetivo As String = records(RESULT.Columns.Get("HIST_AM_OBJETIVO")) + Dim porcentaje1 As String = records(RESULT.Columns.Get("HIST_AM_PORCENTAJE")) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO HIST_AVANCE(HA_MARCA, HA_AVANCE, HA_OBJETIVO, HA_PORCENTAJE) VALUES (?,?,?,?)", Array As Object (marca, avance, objetivo, porcentaje1)) + 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 + 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")) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO ABONOSP(NOTA,CLIENTE,SALDO_PENDIENTE) VALUES (?,?,?)", Array As Object (NOTA, CLIENTE,SALDO_PENDIENTE)) + Next + End If + End If + End If + + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "ins_cuestionario" Then 'query tag + Subs.logJobDoneResultados(RESULT) + End If + + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "test" Then 'query tag + Log(">>>>>>>>>>>>> TEST") + Subs.logJobDoneResultados(RESULT) + End If + + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "clientes_cuestionario" Then + Log("Entramos a clientes_cuestionario - Regs:" & RESULT.Rows.Size) + Starter.skmt.ExecNonQuery("delete from HIST_CUESTIONARIO") + For Each records() As Object In RESULT.Rows + Dim idCliente As String = records(RESULT.Columns.Get("HC_CLIENTE")) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CUESTIONARIO(HC_CLIENTE) VALUES (?)", Array As Object (idCliente)) + Next + End If + End If + End If + Job.Release +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub + 'Return True to close, False to cancel + If SCROLL_RESDIA.Visible Then + SCROLL_RESDIA.Visible = False + B_OK_RES_Click + Return False + Else if Panel5.Visible Then + B_OK_PANEL5_Click + Return False + Else + B4XPages.ShowPage("login") + End If + Return False +End Sub + +Sub connecta_Click + Log( Starter.DBReqServer) + reqManager.Initialize(Me, Starter.DBReqServer) + ime.HideKeyboard + connecta1 = connecta1 + 1 +' imei = p.GetDeviceId + imei = "xxxx" + conn = "1" +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "select_version_INTMEX" +' reqManager.ExecuteQuery(cmd , 0, "version") + + ' Cuando nos conectamos verificamos que el usuario guardado en BD sea VALIDO. +' c=B4XPages.MainPage.skmt.ExecQuery("select USUARIO, PASS from usuarioa") +' c.Position=0 +' If c.RowCount > 0 And c.GetString("USUARIO") <> "KMTS1" Then +' Private usrT As String = c.GetString("USUARIO") +' Private passT As String = c.GetString("PASS") +' cmd.Initialize +' cmd.Name = "select_usuario_guna_INTMEX_1" +' Log(usrT & "|" & passT) +' cmd.Parameters = Array As Object(usrT, passT) +' reqManager.ExecuteQuery(cmd , 0, "usuarioA") +' End If +' c.Close + + c=Starter.skmt.ExecQuery("select USUARIO, PASS from usuarioa") + c.Position=0 + If c.RowCount > 0 And c.GetString("USUARIO") <> "KMTS1" Then + Private usrT As String = c.GetString("USUARIO") + Private passT As String = c.GetString("PASS") + Log(usrT) + Log(passT) + cmd.Initialize + cmd.Name = "select_usuario_INTMEX_10" + cmd.Parameters = Array As Object(usrT, passT) + reqManager.ExecuteQuery(cmd , 0, "usuarioA") + End If + c.Close + +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "select_ruta_INTMEX_7" +' cmd.Parameters = Array As Object(ALMACEN, e_ruta.text) +'' Log($"${ALMACEN},${e_ruta.text},${imei}"$) +' reqManager.ExecuteQuery(cmd , 0, "ruta") + + If e_ruta.Text = "KMTS1" Then + cargar.Visible = True + Subir.Visible = True + e_ruta.Text = "" + End If + + If e_ruta.Text = "BERNA1" Then + cargar.Visible = True + Subir.Visible = True + e_ruta.Text = "" + End If + + ToastMessageShow("Validando Conexión." , True) + +' If connecta1 / 2 = 1 Then +' 'Starter.DBReqServer = "http://177.244.63.54:1782" +' 'Starter.DBReqServer = "http://keymon.com.mx:1782" +' 'Starter.DBReqServer = "http://201.99.139.28:1782" + '' Starter.DBReqServer = "http://187.189.244.154:1782" + '' Starter.DBReqServer = "http://10.0.0.205:1782" +' Else +' 'SERVER = "http://keymon.com.mx:1782" +' 'SERVER = "http://201.99.139.28:1782" +' 'SERVER = "http://177.244.63.54:1782" + '' Starter.DBReqServer = "http://187.189.244.154:1782" + '' SERVER = "http://10.0.0.205:1782" +' reqManager.Initialize(Me, Starter.DBReqServer) +' End If +End Sub + +Sub BUSCA_Click + B4XPages.ShowPage("TicketsDia") +End Sub + +Sub b_mapa_Click + Log("mapClic") + B4XPages.GetPage("Mapas") +End Sub + +Sub e_ruta_EnterPressed + 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 + e_ruta.Text = "" + B4XPages.MainPage.skmt.ExecNonQuery("delete from CLIENTE_NUEVO") + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente") + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido") + B4XPages.MainPage.skmt.ExecNonQuery("delete from noventa") + B4XPages.MainPage.skmt.ExecNonQuery("delete from clie_act") + B4XPages.MainPage.skmt.ExecNonQuery("delete from kmt_info") + B4XPages.MainPage.skmt.ExecNonQuery("delete from kmt_info2") + B4XPages.MainPage.skmt.ExecNonQuery("delete from cat_gunaprod") + B4XPages.MainPage.skmt.ExecNonQuery("delete from cat_gunaprod2") + B4XPages.MainPage.skmt.ExecNonQuery("delete from CAT_DETALLES_PAQ") + B4XPages.MainPage.skmt.ExecNonQuery("delete from HIST_VENTAS") + B4XPages.MainPage.skmt.ExecNonQuery("delete from HIST_VERIFICACION") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM HIST_ENCUESTA") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM HIST_STAY_OUT") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM HIST_GPS") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM HIST_FACE") + B4XPages.MainPage.skmt.ExecNonQuery("INSERT INTO HIST_STAY_OUT(HSO_INI, HSO_FIN) VALUES (0,0)") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM HIST_CODIGO_BARRAS") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM ABONOSP") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM ABONOS") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM RUTA_SUPLENCIA") + B4XPage_Appear + l_rutasuplencia.Visible = False + Label22.Visible = False + l_rutasuplencia.Text = "" + End If + End If + If e_ruta.Text = "IWL" Then + ' trabajar.Visible = False + NUEVO.Visible =False + BUSCA.Visible=False + connecta.Visible=False + img3.Visible =True + Resumen.Visible= False + End If + If e_ruta.Text = "SUPLENCIA" Then + E_RUTA2.Visible = True + ImageView9.Visible = True + e_ruta.Text= "" + End If +End Sub + +Sub inv_Click + img2.Visible =True + EJECUTANDO = 1 + inve = 1 + B4XPages.MainPage.skmt.ExecNonQuery("delete from cat_gunaprod") + B4XPages.MainPage.skmt.ExecNonQuery("delete from cat_gunaprod2") + B4XPages.MainPage.skmt.ExecNonQuery("delete from CAT_DETALLES_PAQ") + c=B4XPages.MainPage.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c.Close + cmd.Initialize + cmd.Name = "select_cat_gunaprod_INTMEX" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "gunaprod") + cmd.Initialize + cmd.Name = "select_cat_paquetes_INTMEX" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "gunaprodp") + + cmd.Initialize + cmd.Name = "select_cat_detallepa_INTMEX" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "detallepaq") + + cargar.Visible = False + Subir.Visible = False + connecta.Visible = True + inv.Visible = False + 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_INTMEX" + cmd.Parameters = Array As Object(ALMACEN,l_ruta.text) + reqManager.ExecuteQuery(cmd , 0, "valida_pedido") + + cmd.Initialize + cmd.Name = "select_cuantos_noventa_INTMEX" + cmd.Parameters = Array As Object(ALMACEN,l_ruta.text) + reqManager.ExecuteQuery(cmd , 0, "valida_noventa") + + cmd.Initialize + cmd.Name = "select_cuantos_pedidoc_INTMEX" + cmd.Parameters = Array As Object(ALMACEN,l_ruta.text) + reqManager.ExecuteQuery(cmd , 0, "valida_pedidoc") + + If PB2.Progress = 0 Then + S_CP.Text = "ENVIAR DATOS (K-1)" + End If + img2.Visible=False + t1.Enabled = False +End Sub + +Sub B_OK_PAS_Click + If CARGA = "SUBIR" And S_CP.Text = "INFO OK" Then + P1.Visible = False + p_mandaInfo.Visible = False + Btn_Ubicar.Visible=True + 'trabajar.Visible = True + NUEVO.Visible =True + BUSCA.Visible=True + connecta.Visible=True + Resumen.Visible= True + img2.Visible=False + Subs.panelVisible(p_principal, 0, 0) + Else If CARGA = "SUBIR" And S_CP.Text = "ERROR" Then + Msgbox("Tiene que subir de nuevo la información","Atención") 'ignore + P1.Visible = False + p_mandaInfo.Visible = False + ' trabajar.Visible = True + NUEVO.Visible =True + BUSCA.Visible=True + connecta.Visible=True + Resumen.Visible= True + img2.Visible=False + Subs.panelVisible(p_principal, 0, 0) + Else if CARGA = "SUBIR" And S_CP.Text <> "INFO OK" Then + RES = Msgbox2("Seguro que desea abortar el proceso","Cierre", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore + If RES = DialogResponse.POSITIVE Then + P1.Visible = False +' trabajar.Visible = True + NUEVO.Visible =True + BUSCA.Visible=True + connecta.Visible=True + Resumen.Visible= True + img2.Visible=False + Subs.panelVisible(p_principal, 0, 0) + ExitApplication + End If + End If + If CARGA = "CARGAR" And S_CP.Text = "LISTO" And S_CC.Text = "LISTO" And S_CH.Text = "LISTO" Then + P1.Visible = False + p_mandaInfo.Visible = False + p_mandaInfo.Visible = False + Btn_Ubicar.Visible=True + 'trabajar.Visible = True + NUEVO.Visible =True + BUSCA.Visible=True + connecta.Visible=True + Resumen.Visible= True + img2.Visible=False + Subs.panelVisible(p_principal, 0, 0) + Else if CARGA = "CARGAR" And (S_CP.Text <> "LISTO" Or S_CC.Text <> "LISTO" Or S_CH.Text <> "LISTO") Then + RES = Msgbox2("Seguro que desea abortar el proceso","Cierre", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore + If RES = DialogResponse.POSITIVE Then + P1.Visible = False + p_mandaInfo.Visible = False +' trabajar.Visible = True + NUEVO.Visible =True + BUSCA.Visible=True + connecta.Visible=True + Resumen.Visible= True + img2.Visible=False + Subs.panelVisible(p_principal, 0, 0) + B4XPages.MainPage.skmt.ExecNonQuery("delete from kmt_info") + B4XPages.MainPage.skmt.ExecNonQuery("delete from cod_result") + B4XPages.MainPage.skmt.ExecNonQuery("delete from hist_gest") + B4XPages.MainPage.skmt.ExecNonQuery("delete from cat_gunaprod") + B4XPages.MainPage.skmt.ExecNonQuery("delete from cat_gunaprod2") + B4XPages.MainPage.skmt.ExecNonQuery("delete from CAT_DETALLES_PAQ") + B4XPages.MainPage.skmt.ExecNonQuery("delete from telefonos") + B4XPages.MainPage.skmt.ExecNonQuery("delete from HIST_VENTAS") + B4XPages.MainPage.skmt.ExecNonQuery("delete from HIST_PROMOS") + B4XPages.MainPage.skmt.ExecNonQuery("delete from HIST_CLIENTE_CANT_PROMOS") + B4XPages.MainPage.skmt.ExecNonQuery("delete from PROMOS_COMP") + B4XPages.MainPage.skmt.ExecNonQuery("delete from CAT_VERIFICACION") + ExitApplication + End If + End If +End Sub + +Sub NUEVO_Click + B4XPages.ShowPage("NuevoCliente") +End Sub + +Sub B_OK_RES_Click + ' trabajar.Visible = True + NUEVO.Visible =True + BUSCA.Visible=True + connecta.Visible=True + Resumen.Visible= True + P_RESUMEN.Visible=False + Panel4.Visible = False + SCROLL_RESDIA.Visible = False + Btn_Ubicar.Visible=True + p_principal.Visible = True +End Sub + +Sub Resumen_Click + P_RESUMEN.Visible = True + +' NUEVO.Visible =False +' BUSCA.Visible=False +' connecta.Visible=False +' Subir.Visible=False +' cargar.Visible=False +' Resumen.Visible= False +End Sub + +Sub P_RESUMEN_click + +End Sub + +Sub CARGA_Click + B4XPages.ShowPage("Productos") +End Sub + +Sub resdia_Click + p_principal.Visible = False + Btn_Ubicar.Visible=False + SCROLL_RESDIA.Visible = True + SCROLL_RESDIA.Panel.LoadLayout("RESDIA") + SCROLL_RESDIA.Panel.Height = Panel4.Height + Panel4.Visible = True + + NUEVO.Visible =False + BUSCA.Visible=False + connecta.Visible=False + Subir.Visible=False + cargar.Visible=False + Resumen.Visible= False + + d=B4XPages.MainPage.skmt.ExecQuery2("select COUNT(*) AS CUANTOS FROM HIST_ENCUESTA WHERE HE_TIPO = ?", Array As String("TELEFONO")) + d.Position = 0 + l_encuesta.Text = d.GetString("CUANTOS") + d.Close + + L_MARCAS.CLEAR + d=B4XPages.MainPage.skmt.ExecQuery2("select distinct HE_CLIE AS CLIENTE FROM HIST_ENCUESTA WHERE HE_TIPO = ?", Array As String("TELEFONO")) + If D.RowCount>0 Then + For i=0 To D.RowCount -1 + D.Position=i + c=B4XPages.MainPage.skmt.ExecQuery2("Select HE_RES from HIST_ENCUESTA where HE_CLIE = ? AND HE_TIPO = ?", Array As String(d.GetString("CLIENTE"), "TELEFONO")) + c.Position = 0 + Dim label1 As Label + label1 = L_MARCAS.TwoLinesLayout.Label + label1.TextSize = 13 + label1.TextColor = Colors.Black + Dim label2 As Label + label2 = L_MARCAS.TwoLinesLayout.SecondLabel + label2.TextSize = 13 + label2.TextColor = Colors.Black + L_MARCAS.AddTwoLines(d.GetString("CLIENTE"),"TELEFONO :" & c.GetString("HE_RES") ) + c.Close + Next + End If + d.Close + + c=B4XPages.MainPage.skmt.ExecQuery2("Select sum(PE_COSTO_TOT) As MONTO_DIA from pedido where PE_CLIENTE <> 0 and pe_proid in (Select CAT_GP_ID from cat_gunaprod where CAT_GP_TIPO = ? )", Array As String("RTEC")) + c.Position = 0 + l_monto_k.Text = c.GetString("MONTO_DIA") + If l_monto_k.Text = "null" Then + l_monto_k.Text = "0" + End If + c.Close + + c=B4XPages.MainPage.skmt.ExecQuery2("Select sum(PE_COSTO_TOT) As MONTO_DIA from pedido where PE_CLIENTE <> 0 and pe_proid in (Select CAT_GP_ID from cat_gunaprod where CAT_GP_TIPO = ? )", Array As String("PING")) + c.Position = 0 + l_monto_kp.Text = c.GetString("MONTO_DIA") + If l_monto_kp.Text = "null" Then + l_monto_kp.Text = "0" + End If + c.Close + +' c=skmt.ExecQuery2("Select sum(PE_COSTO_TOT) As MONTO_DIA from pedido where PE_CLIENTE <> 0 and pe_proid in (Select CAT_GP_ID from cat_gunaprod where CAT_GP_TIPO = ? )", Array As String("SALTY SNACKS")) +' c.Position = 0 +' l_monto_ks.Text = c.GetString("MONTO_DIA") +' If l_monto_ks.Text = "null" Then +' l_monto_ks.Text = "0" +' End If + ' +' c.Close + c=B4XPages.MainPage.skmt.ExecQuery("Select sum(PE_COSTO_TOT) As MONTO_DIA from pedido where PE_CLIENTE <> 0 ") + c.Position = 0 + l_monto_ks.Text = Subs.traeTotalCliente + + If l_monto_ks.Text = "null" Then + l_monto_ks.Text = "0" + End If + c.Close + c=B4XPages.MainPage.skmt.ExecQuery2("Select sum(PE_COSTO_TOT) As PREVENTA from pedido where PE_FOLIO = ? AND PE_CLIENTE <> 0", Array As String ("PREVENTA")) + If c.RowCount > 0 Then + c.Position = 0 + L_PREVENTA.Text = Subs.traeTotalClientepreventa + If L_PREVENTA.TEXT = "null" Then + L_PREVENTA.Text = "0" + End If + End If + c.Close + c=B4XPages.MainPage.skmt.ExecQuery2("Select sum(PE_COSTO_TOT) As VENTA from pedido where PE_FOLIO = ? AND PE_CLIENTE <> 0", Array As String ("VENTA")) + If c.RowCount > 0 Then + c.Position = 0 + L_VENTA.Text = Subs.traeTotalClienteventa + If L_VENTA.TEXT = "null" Then + L_VENTA.Text = "0" + End If + End If + c.Close + c=B4XPages.MainPage.skmt.ExecQuery2("Select sum(PE_COSTO_TOT) As ABORDO from pedido where PE_FOLIO = ? AND PE_CLIENTE = ?", Array As String ("ABORDO", "0")) + If c.RowCount > 0 Then + c.Position = 0 + L_ABORDO.Text = Subs.traeTotalClienteabordo + If L_ABORDO.TEXT = "null" Then + L_ABORDO.Text = "0" + End If + End If + c.Close + Dim cuantos_obj As String + c=B4XPages.MainPage.skmt.ExecQuery("Select count(*) AS TOTAL from HIST_MARCAS_CUOTAS ") + c.Position = 0 + cuantos_obj = c.GetString("TOTAL") + c.Close + + If cuantos_obj > 0 Then + c=B4XPages.MainPage.skmt.ExecQuery("Select SUM( HMC_TOTAL) AS TOTAL from HIST_MARCAS_CUOTAS ") + c.Position = 0 + L_NES.Text = c.GetString("TOTAL") + c.Close + End If + L_REAL.Text = l_monto_ks.Text + L_ALCANCE.Text = Round2((L_NES.Text / L_REAL.Text + 1),2) + L_VPLAN.Text = l_porvisitar.Text + L_VREAL.Text = L_CUANTOST.text + L_EFEC_VIS.Text = Round2(L_VREAL.text / L_VPLAN.Text,2) + L_VISITCC.Text = l_cuantosc.text + L_EFEC_PV.Text = Round2(L_VISITCC.Text / L_VREAL.Text,2) + L_EFEC_PURA.Text = Round2(L_VISITCC.Text / L_VPLAN.Text,2) + L_LIN_TICK.Text = LPT + If l_monto_ks.Text <> "0" Then + + c=B4XPages.MainPage.skmt.ExecQuery2("Select COUNT(DISTINCT(PE_CLIENTE)) AS CUANTOS FROM PEDIDO WHERE PE_CEDIS = ? ", Array As String(ALMACEN)) + c.Position = 0 + L_CTE_PROMO.Text = c.GetString("CUANTOS") + c.Close + d=B4XPages.MainPage.skmt.ExecQuery2("Select sum(PE_COSTO_TOT) AS MONTO_DIA FROM PEDIDO WHERE PE_PROID IN (select CAT_GP_ID from cat_gunaprod where CAT_GP_TIPOPROD = ?) ", Array As String("PRIORITARIO")) + d.Position = 0 + '/////////////////////////////////////////////////////////////////////////////// + '//////////////////////////// ULTIMA LINEA ANTES DEL ERROR ////////////////// + '////////// java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference + ' + '/// Al parecer d.GetString("MONTO_DIA") regresa null y la funcion numberFormat truena + '///////////////////////////////////////////////////////////////////////////////// + Log("|"&d.GetString("MONTO_DIA")&"|") + 'L_PRIO.Text = NumberFormat(d.GetString("MONTO_DIA"),0,2) + L_PRIO.Text = d.GetString("MONTO_DIA") + d.Close + + d=B4XPages.MainPage.skmt.ExecQuery2("Select sum(PE_COSTO_TOT) AS MONTO_DIA FROM PEDIDO WHERE PE_PROID IN (select CAT_GP_ID from cat_gunaprod where CAT_GP_TIPOPROD = ?) ", Array As String("ESTRATEGICO")) + d.Position = 0 + L_SECUND.Text =d.GetString("MONTO_DIA") + d.Close + + d=B4XPages.MainPage.skmt.ExecQuery2("Select sum(PE_COSTO_TOT) AS MONTO_DIA FROM PEDIDO WHERE PE_PROID IN (select CAT_GP_ID from cat_gunaprod where CAT_GP_TIPOPROD = ?) ", Array As String("COMPLEMENTARIO")) + d.Position = 0 + L_COMP.Text =d.GetString("MONTO_DIA") + d.Close + Else + L_PRIO.Text = "0" + L_SECUND.Text = "0" + L_COMP.Text = "0" + End If + + c=B4XPages.MainPage.skmt.ExecQuery("Select COUNT(*) AS CUANTOS FROM PEDIDO WHERE PE_CEDIS = PE_PROID ") + c.Position = 0 + If c.GetString("CUANTOS") > 0 Then + d=B4XPages.MainPage.skmt.ExecQuery("Select sum(pe_cant) AS CUANTOS FROM PEDIDO WHERE PE_CEDIS = PE_PROID ") + d.Position = 0 + L_CTE_PROMO.Text = d.GetString("CUANTOS") + d.Close + L_REDEN_PROMO.TEXT = Round2(L_VISITCC.Text / L_CTE_PROMO.Text,2) + Else + L_CTE_PROMO.Text = 0 + L_REDEN_PROMO.Text = 0 + End If + c.Close + d=B4XPages.MainPage.skmt.ExecQuery("Select COUNT(*) AS CUANTOS FROM PEDIDO ") + d.Position = 0 + L_LIN_TICK.Text = Round2(d.GetString("CUANTOS") / L_VISITCC.Text,2) + d.Close + + d=B4XPages.MainPage.skmt.ExecQuery("Select count(*) as CUANTOS from HIST_CUOTAS ") + d.Position = 0 + If d.GetString("CUANTOS") > 0 Then + ' c=skmt.ExecQuery("Select HC_CUOTA1,HC_CUOTA2,HC_CUOTA3 from HIST_CUOTAS ") + ' c.Position = 0 + ' l_monto_c1.Text = Round( c.GetString("HC_CUOTA1") / 6) + ' l_monto_c2.Text = Round(c.GetString("HC_CUOTA2") / 6) + ' l_monto_c3.Text = Round(c.GetString("HC_CUOTA3") / 6) + ' c.Close + Else + l_monto_c1.Text = 4000 + l_monto_c2.Text = 2000 + l_monto_c3.Text = 1000 + End If + d.Close +End Sub + +Sub hacer_ped_Click + B4XPages.ShowPage("Clientes") +End Sub + +Sub nvo_cliente_Click + B4XPages.ShowPage("NuevoCliente") +End Sub + +Sub tickets_dia_Click + B4XPages.ShowPage("TicketsDia") +End Sub + +Sub GPS_LocationChanged (Location1 As Location) + +End Sub + +Sub Btn_Ubicar_Click + rp.CheckAndRequest(rp.PERMISSION_ACCESS_FINE_LOCATION) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) + If Result Then + StartActivity(MAPA_RUTAS) + End If +End Sub + +'''''''''''''''''''''''''''''''''''' VALIDAR CARACTERES +Sub e_ruta_TextChanged (Old As String, New As String) + Dim validChars As String ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 " +' Log("Antes: " & Old & " | " & New) + If Old <> "KMTS1" Then +' Log("Desp: " & Old & " | " & New) + Try + If validChars.Contains(New.SubString(New.Length-1)) = False Then + e_ruta.Text = New.SubString2(0, New.Length-1) + e_ruta.SelectionStart = e_ruta.Text.Length + End If + Catch + Log(LastException) + End Try + End If +End Sub + +Sub B_COMM_Click + Btn_Ubicar.Visible=False + SCROLL_RESDIA.Visible = True + SCROLL_RESDIA.Panel.LoadLayout("COMIS") + SCROLL_RESDIA.Panel.Height = Panel_C.Height + Panel4.Visible = False + Panel_C.Visible = True + +' trabajar.Visible = False + NUEVO.Visible =False + BUSCA.Visible=False + connecta.Visible=False + Subir.Visible=False + cargar.Visible=False + Resumen.Visible= False +' + If l_ruta.Text <> 0 Then + c=B4XPages.MainPage.skmt.ExecQuery("Select HCM_TOTAL_V , HCM_TOTAL_VIVE , HCM_TOTAL_GUNA , HCM_TOTAL_BEB from HIST_COMISIONES_MOVIL ") + c.Position = 0 + L_TOTAL_BA.Text = c.GetString("HCM_TOTAL_BEB") + L_TOTAL_GUNA.Text = c.GetString("HCM_TOTAL_GUNA") + L_TOTAL_MM.Text = c.GetString("HCM_TOTAL_V") + L_TOTAL_VIVE.Text = c.GetString("HCM_TOTAL_VIVE") + c.Close + L_TOTAL_COMIS.Text = 0 + Else + L_TOTAL_BA.Text = 0 + L_TOTAL_GUNA.Text = 0 + L_TOTAL_MM.Text = 0 + L_TOTAL_VIVE.Text = 0 + L_TOTAL_COMIS.Text = 0 + End If +End Sub + +Sub B_OK_COMISS_Click + NUEVO.Visible =True + BUSCA.Visible=True + connecta.Visible=True + Resumen.Visible= True + P_RESUMEN.Visible=False + Panel_C.Visible = False + SCROLL_RESDIA.Visible = False + Btn_Ubicar.Visible=True +End Sub + + +Sub B_MARCAS_Click +' SCROLL_RESDIA.Visible = False +' Panel5.Visible = True +' pnlTitle.Visible = False +' pnlTitle.SetLayoutAnimated(0, 0, 0, CLV1.AsView.Width, TitleHeight + DividerHeight) +' pnlTitle.LoadLayout("CellTitle") +' c=B4XPages.MainPage.skmt.ExecQuery("Select CAT_GP_CLASIF, sum(pe_costo_tot) As total from CATALOGO, pedido where pe_proid = cat_gp_id And pe_cliente <> 0 group by cat_gp_clasif") +' +' CLV1.Clear +' If c.RowCount>0 Then +' For i=0 To c.RowCount -1 +' c.Position=i +' AddTitle(c.GetString("CAT_GP_CLASIF")) +' f=B4XPages.MainPage.skmt.ExecQuery2("select * from HIST_AVANCE where HA_MARCA = ?", Array As String(c.GetString("CAT_GP_CLASIF"))) +' f.Position=0 +' If f.RowCount > 0 Then +' CLV1.AddTextItem("VENTA = $" & f.GetString("HA_AVANCE"),"1") +' CLV1.AddTextItem("META = $" & f.GetString("HA_OBJETIVO"),"1") +' CLV1.AddTextItem("PORCENTAJE = %" & (f.GetString("HA_PORCENTAJE")) ,"1") +' End If +' f.Close +' Next +' End If +' c.Close + + SCROLL_RESDIA.Visible = False + Panel5.Visible = True + pnlTitle.Visible = False + pnlTitle.SetLayoutAnimated(0, 0, 0, CLV1.AsView.Width, TitleHeight + DividerHeight) + pnlTitle.LoadLayout("CellTitle") + c=B4XPages.MainPage.skmt.ExecQuery("Select CAT_GP_CLASIF, SUM(TOTAL) AS TOTAL FROM TOTAL_MARCAS GROUP BY CAT_GP_CLASIF") + CLV1.Clear + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + AddTitle(c.GetString("CAT_GP_CLASIF")) + If c.GetString("CAT_GP_CLASIF") = "PROMOS" Then + d=B4XPages.MainPage.skmt.ExecQuery("SELECT SUM(PE_CANT) AS CUANTOS FROM PEDIDO WHERE PE_CEDIS = PE_PROID") + d.Position=0 + CLV1.AddTextItem("CANTIDAD DE PROMOS = " & d.GetString("CUANTOS"),"1") + d.Close + Else + f=B4XPages.MainPage.skmt.ExecQuery2("select COUNT(*) AS CUANTOS from HIST_MARCAS_CUOTAS where HMC_MARCA = ?", Array As String(c.GetString("CAT_GP_CLASIF"))) + f.Position=0 + If f.GetString("CUANTOS") > 0 Then + e=B4XPages.MainPage.skmt.ExecQuery2("select HMC_MARCA, HMC_TOTAL from HIST_MARCAS_CUOTAS where HMC_MARCA = ?", Array As String(c.GetString("CAT_GP_CLASIF"))) + e.Position=0 + d=B4XPages.MainPage.skmt.ExecQuery2("SELECT count(distinct(PE_CLIENTE)) AS CUANTOS FROM PEDIDO WHERE PE_PROID in (select CAT_GP_ID from cat_gunaprod WHERE CAT_GP_CLASIF =?)", Array As String (c.GetString("CAT_GP_CLASIF"))) + d.Position=0 + CLV1.AddTextItem("TOTAL PREVENTA = $" & c.GetString("TOTAL"),"1") + CLV1.AddTextItem("M E T A = $" & e.GetString("HMC_TOTAL"),"1") + CLV1.AddTextItem("FALTA = $" & (e.GetString("HMC_TOTAL") - c.GetString("TOTAL")) ,"1") + CLV1.AddTextItem("CLIENTES = " & d.GetString("CUANTOS"),"1") + d.Close + e.Close + Else + d=B4XPages.MainPage.skmt.ExecQuery2("SELECT count(distinct(pe_cliente)) AS CUANTOS FROM PEDIDO WHERE PE_PROID in (select CAT_GP_ID from cat_gunaprod WHERE CAT_GP_CLASIF =?)", Array As String (c.GetString("CAT_GP_CLASIF"))) + d.Position=0 + CLV1.AddTextItem("TOTAL PREVENTA = $" & c.GetString("TOTAL"),"1") + CLV1.AddTextItem("M E T A = $" & "1000","1") + CLV1.AddTextItem("FALTA = $" & (1000 - c.GetString("TOTAL")) ,"1") + CLV1.AddTextItem("CLIENTES = " & d.GetString("CUANTOS"),"1") + d.Close + End If + f.Close + End If + Next + End If + c.Close + c=B4XPages.MainPage.skmt.ExecQuery("Select HMC_MARCA, HMC_TOTAL from HIST_MARCAS_CUOTAS where HMC_MARCA not in (SELECT CAT_GP_CLASIF FROM TOTAL_MARCAS )") + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + AddTitle(c.GetString("HMC_MARCA")) + CLV1.AddTextItem("TOTAL PREVENTA = $ 0.00","1") + CLV1.AddTextItem("M E T A = $" & C.GetString("HMC_TOTAL"),"1") + CLV1.AddTextItem("CLIENTES = 0","1") + Next + End If + c.Close + + +End Sub + +Sub AddTitle (Title As String) + Dim p_MARCAS As B4XView = xui.CreatePanel("") + p_MARCAS.SetLayoutAnimated(0, 0, 0, CLV1.AsView.Width, TitleHeight) + p_MARCAS.LoadLayout("CellTitle") + lblTitle.Text = Title + Dim td As TitleData + td.Title = Title + CLV1.Add(p_MARCAS, td) +End Sub + +Sub B_OK_PANEL5_Click + Panel5.Visible = False + NUEVO.Visible =True + BUSCA.Visible=True + connecta.Visible=True + Resumen.Visible= True + P_RESUMEN.Visible=False + Panel4.Visible = False + SCROLL_RESDIA.Visible = False + Btn_Ubicar.Visible=True + p_principal.Visible = True + +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Private Sub p_mandaInfo_Click + +End Sub + + +Private Sub b_abordo_Click + Starter.skmt.ExecNonQuery("delete from CUENTAA") + Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object("0")) + B4XPages.MainPage.tipo_venta = "ABORDO" + B4XPages.ShowPage("Productos") +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..eae901a --- /dev/null +++ b/B4A/C_Productos.bas @@ -0,0 +1,1164 @@ +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 ruta As String + Dim q_buscar As String + Dim forzarBusqueda As Boolean = False + Dim skmt As SQL + Dim c As Cursor + Dim c2 As Cursor + Dim C3 As Cursor + Dim s As Cursor + Dim lv_catalogos As ListView + Dim lv_promos As ListView + Dim entro As String + Dim gest As Button + Dim lfila As Label + Dim marca As String + Dim tipo As String + Dim subtipo As String + Private BUSCA As EditText + Dim ya_entro As String + Dim TIENE_PROMOS As String + Dim RES As String + Dim S1 As Cursor + Dim bmp As Bitmap + Dim ciclo As String + Private b_qr As Button + Private p_productos As Panel + Dim clv_productos As CustomListView + Private ImageView1 As ImageView + Private Panel3 As Panel + Private p_prods As Panel + Private i_prod As ImageView + Private l_prodX As Label + Private b_prodMas As Button + Private l_pCant As Label + Private et_pCant As EditText + Private b_prodMenos As Button + Dim b_terminar1 As Button + Dim b_continuar As Button + Private l_total As Label + Private l_totProds As Label + Dim totalProds As Int = 0 + Dim totalCompra As Float = 0 + Dim etCantHasFocus As Boolean = False + Dim prodsMap As Map + Private l_Cargando As Label + Private l_info As Label + Private b_buscar As Button + Private p_botonesVenta As Panel + Private lv_tipo As ListView + Private lv_subtipo As ListView + Private p_vistaPreviaTrans As Panel + Private lv_prodsPedido As ListView + Private b_rechazar As Button + Private b_aceptar As Button + Private p_vistaPrevia As Panel + Dim folio As String + Dim result As String + Private l_cant As Label + Private l_total2 As Label + Dim prodsPedidoActual As String + Dim montoPedidoActual As String + + Dim clv_prods_ll As CustomListView + Private PCLV As PreoptimizedCLV + Dim listaProds As List +' Type AirportData (Name As String, AirportID As Int, IATA As String, ICAO As String, City As String, Latitude As Float, Longitude As Float, Altitude As String) + Dim pedidoMap As Map + Private p_botMasMen As Panel + Dim reiniciarlistaProds As Boolean= False +' Dim listaRenglones As List + Dim listaTiempos As List + Dim clienteId As String + Dim rutaUsuario As String + Dim hayPedido As Boolean + Dim listaHints As List + Dim r As Cursor + Dim vamoaver As List + Dim j3 As Cursor + Dim invTotal 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 + 'load the layout to Root +' Activity.RemoveAllViews + Root.LoadLayout("productos") + ruta = File.DirInternal + If File.Exists(ruta, "kmt.db") = False Then + File.Copy(File.DirAssets, "kmt.db", ruta, "kmt.db") + End If + PCLV.Initialize(Me, "PCLV", clv_prods_ll) + ciclo = 1 + l_info.Width = Root.Width * 0.8 + l_info.Left = (Root.Width/2) - (l_info.Width/2) + c = B4XPages.MainPage.skmt.ExecQuery("select distinct CAT_GP_TIPO from cat_gunaprod where CAT_GP_TIPO <> 'PROMOS' order by CAT_GP_TIPO") + If c.RowCount > 0 Then + Dim label1 As Label + label1 = lv_tipo.SingleLineLayout.Label + label1.TextSize = 17 + label1.TextColor = Colors.Black + lv_tipo.Clear + For i=0 To c.RowCount-1 + c.Position=i + Log("ENTRE AQUI EN PROMOS create") + lv_tipo.AddSingleLine(c.GetString("CAT_GP_TIPO")) + Next + End If + c.Close +' llenaCatalogo(False) +' listaRenglones.Initialize + listaTiempos.Initialize + listaProds.Initialize + pedidoMap.Initialize + listaHints.Initialize +' Log("Llamamos LlenaProdsLL") +' LlenaProdsLL(Null) + clv_prods_ll.Clear + prodsMap.Initialize +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub B4XPage_Appear + If B4XPages.MainPage.tipo_venta = "PREVENTA" Or B4XPages.MainPage.tipo_venta = "ABORDO" Then + Starter.tabla = "CAT_GUNAPROD" + Else If B4XPages.MainPage.tipo_venta = "VENTA" Then + Starter.tabla = "CAT_GUNAPROD2" + End If + clienteId = Subs.traeCliente + rutaUsuario = Subs.traeRuta + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE CAT_GUNAPROD SET CAT_GP_TIPOPROD = (?) WHERE CAT_GP_TIPOPROD = (?) ",Array As Object("PRIORITARIO","1")) + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE CAT_GUNAPROD SET CAT_GP_TIPOPROD = (?) WHERE CAT_GP_TIPOPROD = (?) ",Array As Object("ESTRATEGICO","2")) + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE CAT_GUNAPROD SET CAT_GP_TIPOPROD = (?) WHERE CAT_GP_TIPOPROD = (?) ",Array As Object("COMPLEMENTARIO","3")) + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE CAT_GUNAPROD SET CAT_GP_TIPOPROD = (?) WHERE CAT_GP_TIPOPROD = (?) ",Array As Object("CATALOGO REGULAR","0")) + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE CAT_GUNAPROD SET CAT_GP_TIPOPROD = (?) WHERE CAT_GP_CLASIF = (?) ",Array As Object("PROMOS","PROMOS")) + clv_prods_ll.GetBase.SetLayoutAnimated(0, 5dip, 130dip, Root.Width + 10, Root.Height * 0.74) 'Cambiamos el tamaño y posición de la lista de productos + clv_prods_ll.Base_Resize(clv_prods_ll.GetBase.Width, clv_prods_ll.GetBase.Height) 'Cambiamos el tamaño del panel interno de la lista para que ajuste al nuevo tamaño. + If B4XPages.MainPage.bTerminarClicked Then + lv_catalogos.Visible = True + lv_promos.Visible = False + lv_tipo.Visible = False + lv_subtipo.Visible = False + clv_prods_ll.AsView.Visible = False + B4XPages.MainPage.bTerminarClicked = False + End If + If ya_entro <> "1" Then + If BUSCA.Text <> "" Then BUSCA.Text ="" + entro ="3" + lv_catalogos.Clear + Sleep(100) + lfila.Text = "CATALOGOS" + p_productos.Height = Root.Height + clv_prods_ll.AsView.Visible = False + lv_catalogos.Visible = True + p_botonesVenta.Visible = False + p_botonesVenta.Top = clv_prods_ll.AsView.top + clv_prods_ll.AsView.Height - 10 + lv_promos.Visible = False + End If + Dim label1 As Label + label1 = lv_catalogos.SingleLineLayout.Label + label1.TextSize = 17 + label1.TextColor = Colors.Black + lv_catalogos.Clear + lv_catalogos.AddSingleLine("CATALOGO") +' c = B4XPages.MainPage.skmt.ExecQuery($"select count(*) as hayPromos from ${Starter.tabla} where CAT_GP_TIPOPROD = 'PROMOS'"$) + c = B4XPages.MainPage.skmt.ExecQuery($"select count(*) as hayPromos from ${Starter.tabla} where CAT_GP_TIPO = 'PROMOS'"$) + c.Position = 0 + + + c = B4XPages.MainPage.skmt.ExecQuery($"SELECT CUENTA FROM CUENTAA"$) + c.Position = 0 + If c.GetString("CUENTA") <> "0" Then + c2=B4XPages.MainPage.skmt.ExecQuery2($"select CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_PRECIO, CAT_GP_ALMACEN, CAT_GP_IMG from ${Starter.tabla} where CAT_GP_PRECIO > 0 AND CAT_GP_ALMACEN > 0 AND CAT_GP_TIPO = ? AND CAT_GP_SUBTIPO = ? AND CAT_GP_ID NOT IN (SELECT PE_PROID FROM PEDIDO WHERE PE_CLIENTE IN (Select cuenta from cuentaa) )"$, Array As String("PROMOS", "PROMOS")) +' Log($"res:${c2.RowCount}, ${Value}, ${marca}, ${tipo}"$) + Private hayPromos As Boolean = False + If c2.RowCount > 0 Then + For i=0 To c2.RowCount -1 + c2.Position=i + Private tm As Map = Subs.procesaPromocion(c2.GetString("CAT_GP_ID"), clienteId) + If tm.Get("status") = "ok" Then 'Solo muestrala si hay producto. + hayPromos = True + End If + Next + If hayPromos Then lv_catalogos.AddSingleLine("PROMOS") + Else + Log("NO HAY PROMOS") + End If + c2.Close + End If + + Sleep(100) + l_total.Visible = False + l_totProds.Visible = False + l_total.Left = 5dip + l_totProds.Width = Root.Width * 0.19 + l_total.Left = l_totProds.Width + 20 + l_total.Width = Root.Width * 0.25 +' Log(Subs.traeTotalesClienteActual) + Dim m As Map = Subs.traeTotalesClienteActual + prodsPedidoActual = m.Get("productos") + montoPedidoActual = m.Get("monto") + hayPedido = Subs.hayPedido +' LogColor("Pedido ant? - "&hayPedido, Colors.Magenta) + B4XPages.MainPage.productos.clv_prods_ll.Clear + If reiniciarlistaProds Then +' Log("Llamamos LlenaProdsLL") +' LlenaProdsLL(Null) + clv_prods_ll.Clear + else If hayPedido Then +' LogColor("HAY PEDIDO ANTERIOR", Colors.red) +' Log("Llamamos LlenaProdsLL") +' LlenaProdsLL(Null) + clv_prods_ll.Clear + End If + If clv_prods_ll.Size = 0 Then LlenaProdsLL(Null) + clv_prods_ll.JumpToItem(0) 'Vamos al primer artículo de la lista. + PCLV.lblHint.SetTextSizeAnimated(0,13) + PCLV.B4XSeekBar1.Color1=Colors.DarkGray + PCLV.B4XSeekBar1.Color2=Colors.DarkGray + PCLV.B4XSeekBar1.ThumbColor=Colors.red + PCLV.B4XSeekBar1.mBase.Left=Root.Width *0.91 +' PCLV.B4XSeekBar1.mBase.Top=-50 + PCLV.B4XSeekBar1.mBase.Height=clv_prods_ll.AsView.Height + PCLV.pnlOverlay.Height = clv_prods_ll.AsView.Height + PCLV.B4XSeekBar1.Update + + + +End Sub + +Sub PCLV_AddProds + +End Sub + +Sub lv_catalogos_ItemClick (Position As Int, Value As Object) + If Value = "CATALOGO" Then +' lfila.text = "TIPO" + lfila.text = "PRODUCTOS" + lv_catalogos.Visible = False +' lv_tipo.Visible = True + If clv_prods_ll.Size = 0 Then LlenaProdsLL(Null) + clv_prods_ll.AsView.Visible = True + If hayPedido Then p_botonesVenta.Visible = True 'Si ya hay pedido, entonces mostramos los botones. + Else + clv_prods_ll.AsView.Visible = False + lv_promos.Visible = True + lfila.text = "PROMOCIONES" + lv_catalogos.Visible = False + lv_promos.Clear + Dim label1 As Label + label1 = lv_promos.TwoLinesLayout.Label + label1.TextSize = 12 + label1.TextColor = Colors.Black + Dim label2 As Label + label2 = lv_promos.TwoLinesLayout.SecondLabel + label2.TextSize = 12 + label2.TextColor = Colors.Black + Dim label13 As Label + label13 = lv_promos.TwoLinesAndBitmap.Label + label13.TextSize = 12 + label13.TextColor = Colors.Black + Dim label14 As Label + label14 = lv_promos.TwoLinesAndBitmap.SecondLabel + label14.TextSize = 12 + label14.TextColor = Colors.Black + lfila.text = "PROMOS" + + + +' c2=B4XPages.MainPage.skmt.ExecQuery2($"select CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_PRECIO, CAT_GP_ALMACEN, CAT_GP_IMG from ${Starter.tabla} where CAT_GP_PRECIO > 0 AND CAT_GP_ALMACEN > 0 and CAT_GP_TIPOPROD = ? AND CAT_GP_TIPO = ? AND CAT_GP_SUBTIPO = ? AND CAT_GP_ID NOT IN (SELECT PE_PROID FROM PEDIDO WHERE PE_CLIENTE IN (Select cuenta from cuentaa) )"$, Array As String(Value, Value, Value)) + c2=B4XPages.MainPage.skmt.ExecQuery2($"select CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_PRECIO, CAT_GP_ALMACEN, CAT_GP_IMG from ${Starter.tabla} where CAT_GP_PRECIO > 0 AND CAT_GP_ALMACEN > 0 AND CAT_GP_TIPO = ? AND CAT_GP_SUBTIPO = ? AND CAT_GP_ID NOT IN (SELECT PE_PROID FROM PEDIDO WHERE PE_CLIENTE IN (Select cuenta from cuentaa) )"$, Array As String(Value, Value)) +' Log($"res:${c2.RowCount}, ${Value}, ${marca}, ${tipo}"$) + If c2.RowCount > 0 Then + For i=0 To c2.RowCount -1 + c2.Position=i + Private tm As Map = Subs.procesaPromocion(c2.GetString("CAT_GP_ID"), clienteId) + If tm.Get("status") = "ok" Then 'Solo muestrala si hay producto. + lv_promos.AddTwoLines(c2.GetString("CAT_GP_NOMBRE"),"# " & c2.GetString("CAT_GP_ALMACEN") & " $ " & c2.GetString("CAT_GP_PRECIO") & " F:" & tm.Get("mp").As(Map).Get("prodsFijosCant") & " V:" & tm.Get("mp").As(Map).Get("prodsVariablesCant")) + End If + Next + Else + ToastMessageShow("No hay promociones disponibles.", False) + End If + c2.Close + entro = "4" + End If +End Sub + +Sub lv_catalogos2_ItemClick (Position As Int, Value As Object) + clv_prods_ll.AsView.Visible = False + BUSCA.Text = "" + Dim cliente As C_Cliente = B4XPages.GetPage("Cliente") + Log($"value=${Value}"$) + If Value = "PROMOS" And cliente.cuenta <> "N" Then + entro = "3" + marca = "PROMOS" + tipo = "PROMOS" + Else if Value = "PROMOS" And cliente.cuenta = "N" Then + entro = "5" + B4XPages.ShowPage("Cliente") + End If + If Value = "PROMOS" Then + LogColor("Promos", Colors.red) + c2=B4XPages.MainPage.skmt.ExecQuery2($"select CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_PRECIO, CAT_GP_ALMACEN, CAT_GP_IMG from ${Starter.tabla} where CAT_GP_PRECIO > 0 AND CAT_GP_ALMACEN > 0 and CAT_GP_TIPOPROD = ? AND CAT_GP_TIPO = ? AND CAT_GP_SUBTIPO = ? AND CAT_GP_ID NOT IN (SELECT PE_PROID FROM PEDIDO WHERE PE_CLIENTE IN (Select cuenta from cuentaa) )"$, Array As String(Value, marca, tipo)) + Else + LogColor("Catalogo", Colors.red) + c2=B4XPages.MainPage.skmt.ExecQuery($"select CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_PRECIO, CAT_GP_ALMACEN, CAT_GP_IMG, CAT_GP_TIPOPROD, CAT_GP_INICIATIVA from ${Starter.tabla} where CAT_GP_PRECIO > 0 AND CAT_GP_ALMACEN > 0 and CAT_GP_TIPOPROD <> 'PROMOS' "$) + End If + If Value = "CATALOGO" Then + lv_catalogos.Visible = False + lv_promos.Visible = False + lfila.text = "CATALOGO" + Log("PGS") + ProgressDialogShow("Cargando catalogo ...") + Sleep(100) + Private inicioContador As String = DateTime.Now + llenaCatalogo(False) + clv_prods_ll.AsView.Visible = True + Log("PGH") + LogColor("TIEMPO DE PROCESO DEL CATALOGO: " & ((DateTime.Now-inicioContador)/1000), Colors.Red) + ProgressDialogHide + c2.Close + Else + clv_prods_ll.AsView.Visible = False + lv_promos.Visible = True + lv_catalogos.Visible = False + lv_promos.Clear + Dim label1 As Label + label1 = lv_promos.TwoLinesLayout.Label + label1.TextSize = 15 + label1.TextColor = Colors.Black + Dim label2 As Label + label2 = lv_promos.TwoLinesLayout.SecondLabel + label2.TextSize = 15 + label2.TextColor = Colors.Black + Dim label13 As Label + label13 = lv_promos.TwoLinesAndBitmap.Label + label13.TextSize = 15 + label13.TextColor = Colors.Black + Dim label14 As Label + label14 = lv_promos.TwoLinesAndBitmap.SecondLabel + label14.TextSize = 15 + label14.TextColor = Colors.Black + lfila.text = "PROMOS" + If c2.RowCount > 0 Then + For i=0 To c2.RowCount -1 + c2.Position=i + Private tm As Map = Subs.procesaPromocion(c2.GetString("CAT_GP_ID"), clienteId) + If tm.Get("status") = "ok" Then 'Solo muestrala si hay producto. + lv_promos.AddTwoLines(c2.GetString("CAT_GP_NOMBRE"),"# " & c2.GetString("CAT_GP_ALMACEN") & " $ " & c2.GetString("CAT_GP_PRECIO") & " F:" & tm.Get("mp").As(Map).Get("prodsFijosCant") & " V:" & tm.Get("mp").As(Map).Get("prodsVariablesCant")) + End If + Next + End If + c2.Close + End If + entro = "4" +End Sub + +Sub lv_promos_ItemClick (Position As Int, Value As Object) + clv_prods_ll.AsView.Visible = False + Dim cliente As C_Cliente = B4XPages.GetPage("Cliente") +' Log($"Entro=${entro}, value=${Value}, cuenta=${cliente.cuenta}"$) + If Value = "PROMOS" And cliente.cuenta <> "N" Then + entro = "3" + marca = "PROMOS" + tipo = "PROMOS" + Else if Value = "PROMOS" And cliente.cuenta = "N" Then + entro = "5" + B4XPages.ShowPage("Cliente") + End If + If entro = "3" Then + 'xxxxxxxxxxxxxxxxxxxxx + Else If entro = "4" Then +' Log("Entro = 4") + B4XPages.MainPage.skmt.ExecNonQuery("delete from PROID") + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PROID VALUES (?)", Array As Object(Value)) + Dim promos As C_Promos = B4XPages.GetPage("Promos") + promos.laPromo = Subs.traeProdIdDeBD.Get("id") + promos.elCliente = Subs.traeUsuarioDeBD + B4XPages.ShowPage("Promos") + End If +End Sub + +'Generamos la lista de productos. +Sub llenaCatalogo(subtipo1 As String) +' Log("LlenaCatalogo") +' Private c2 As Cursor +' c2=B4XPages.MainPage.skmt.ExecQuery2("select CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_PRECIO, CAT_GP_ALMACEN, CAT_GP_IMG, CAT_GP_TIPOPROD, CAT_GP_INICIATIVA from cat_gunaprod where CAT_GP_PRECIO > 0 AND CAT_GP_ALMACEN > 0 and CAT_GP_TIPOPROD <> 'PROMOS' and CAT_GP_SUBTIPO = ? ", Array As String(subtipo1)) +' Private bgColor, textColor As Int +' If c2.RowCount > 0 And clv_productos.Size <> c2.RowCount Then +' clv_productos.Clear : Log("limpiamos productos") +' For i=0 To c2.RowCount -1 +' c2.Position=i +' If c2.GetString("CAT_GP_TIPOPROD") = "PRIORITARIO" Then +' bgColor = Colors.RGB(255, 212, 163) 'naranja +' Else If c2.GetString("CAT_GP_TIPOPROD") = "COMPLEMENTARIO" Then +' bgColor = Colors.RGB(177, 200, 249)'azul +' else If c2.GetString("CAT_GP_TIPOPROD") = "CATALOGO REGULAR" Then +' bgColor = Colors.White +' else If c2.GetString("CAT_GP_TIPOPROD") = "ESTRATEGICO" Then +' bgColor = Colors.RGB(241, 255, 163) 'amarillo +' End If +' textColor = Colors.Black +' clv_productos.Add(CreateListItem(c2.GetString("CAT_GP_NOMBRE"), c2.GetString("CAT_GP_PRECIO"), c2.GetString("CAT_GP_ALMACEN"), clv_productos.AsView.Width, 60dip, bmp, c2.GetString("CAT_GP_ID"), bgColor, textColor), c2.GetString("CAT_GP_NOMBRE")) +' Next +' End If +' c2.Close +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub +' BACK key pressed +' Return True To close, False To cancel + If l_info.Visible Then + l_info.Visible = False + Return False + else if p_vistaPreviaTrans.Visible Then + p_vistaPreviaTrans.Visible = False + Return False + else if lv_promos.visible Then + lv_promos.Visible = False + lv_catalogos.Visible = True + p_botonesVenta.Visible = False + l_total.Visible = False + l_totProds.Visible = False + Return False + else if clv_prods_ll.AsView.Visible Then + lfila.text = "CATALOGO" + clv_prods_ll.AsView.Visible = False + lv_subtipo.Visible = False + p_botonesVenta.Visible = False + l_total.Visible = False + l_totProds.Visible = False + lv_catalogos.Visible = True + Return False +' else if lv_subtipo.Visible Then +' lfila.text = "TIPO" +' lv_subtipo.Visible = False +' lv_tipo.Visible = False +' Return False +' else if lv_tipo.Visible Then +' lfila.text = "CATALOGO" +' lv_tipo.Visible = False +' lv_catalogos.Visible = True +' Return False + else If entro = "4" Then + entro = "3" + B4XPage_Appear + Return True + Else If entro = "3" Then + B4XPages.ShowPage("Cliente") + Return False + Else + B4XPages.ShowPage("Cliente") + Return False + End If +End Sub + + + +Sub b_QR_Click + If ciclo = 1 Then + ciclo = 2 + ya_entro = "0" + B4XPage_Appear + else if ciclo = 2 Then + ciclo = 3 + ya_entro = "0" + B4XPage_Appear + else if ciclo = 3 Then + ciclo = 4 + ya_entro = "0" + B4XPage_Appear + else if ciclo = 4 Then + ciclo = 5 + ya_entro = "0" + B4XPage_Appear + else if ciclo = 5 Then + ciclo = 1 + ya_entro = "0" + B4XPage_Appear + End If +End Sub + +'**************************************************************************** +'***************** PARA EL MAS/MENOS ************************************* +'**************************************************************************** +Sub CreateListItem(Text As String, precioU As String, inv As Int, Width As Int, Height As Int, img As Bitmap, prodId As String, bc As Int, tc As Int) As Panel +' Dim p As B4XView = xui.CreatePanel("") +' p.SetLayoutAnimated(0, 0, 0, Width, Height) +' p.LoadLayout("prodItem") +' p_prods.Color = bc +' l_prodX.TextColor = tc +' l_prodX.TextSize = 15 +' p_prods.Height = Height +' l_prodX.Height = Height +' l_prodX.Text = Text&CRLF&"# " & inv & " $ " & precioU +' l_prodX.Tag = $"ID: ${prodId}${CRLF}${Text}${CRLF}Precio: $$1.2{precioU}${CRLF}Inv: ${inv} pzs"$ +' l_pCant.Tag = precioU&"|"&inv&"|"&prodId +' et_pCant.Tag = precioU&"|"&inv&"|"&prodId +' et_pCant.BringToFront +' Return p +End Sub + +Sub b_prodMenos_Click + etCantHasFocus = False + Root.RequestFocus +' LogColor("b_prodMenos_Click", Colors.Magenta) + Dim index As Int = clv_prods_ll.GetItemFromView(Sender) + Dim pnl0 As B4XView = clv_prods_ll.GetPanel(index) + Dim pnl As B4XView = pnl0.GetView(0) + Dim laCant As B4XView = pnl.GetView(2).GetView(2) + Dim lProdX As B4XView = pnl.GetView(1) +' Log($"precio|stock:${laCant.tag}"$) + If laCant.Text = "" Then laCant.Text = 0 +' Log("lacant.text="&laCant.text) + laCant.Text = $"${NumberFormat2(laCant.Text-1,0,0,0,False)}"$ + If laCant.Text < 0 Then laCant.Text = 0 + Private tmpMap As Map = clv_prods_ll.GetValue(index).As(Map) + Private precio As String=clv_prods_ll.GetValue(index).As(Map).Get("precio") + Private id As String=clv_prods_ll.GetValue(index).As(Map).Get("id") + Private tmpMap As Map = CreateMap("precio":precio, "cant":laCant.Text, "almacen":Subs.traeAlmacen) + Private nombreX As String = Subs.traeProdNombre(id) + Log(tmpMap) +' prodsMap.Put(id, tmpMap) + If laCant.Text = 0 Then prodsMap.Remove(id) + LogColor("prodsMap="&prodsMap, Colors.blue) +' (Subs.traeAlmacen, p1.Get("precio"), p1.Get("cant"), pn, p, clienteId, Subs.traeFecha, Subs.traeUsuarioDeBD, rutaUsuario, 0, B4XPages.MainPage.tipo_venta) + Log($"${Subs.traeAlmacen}, ${precio}, ${laCant.text}, ${Subs.traeProdNombre(id)}, ${id}, ${clienteId}"$) + Subs.actualizaProducto(Subs.traeAlmacen, precio, laCant.text, Subs.traeProdNombre(id), id, clienteId, Subs.traeFecha, Subs.traeUsuarioDeBD, rutaUsuario, 0, B4XPages.MainPage.tipo_venta) + cuentaProds + LogColor("prodsMap="&prodsMap, Colors.blue) + Log($"Total Prods: ${totalProds}, Total Compra: $$1.2{totalCompra}"$) + If 1 = 1 Then + Private cs As CSBuilder + cs.Initialize + Private o As Cursor = Starter.skmt.ExecQuery($"select CAT_GP_ALMACEN from ${Starter.tabla} where CAT_GP_ID = '${id}'"$) + Private invActualizado As String = "0" + If o.RowCount > 0 Then + o.Position = 0 + invActualizado = o.GetString("CAT_GP_ALMACEN") + End If + If 2 = 2 Then lProdX.Text = cs.Color(Colors.red).append(nombreX).pop.Append(CRLF).Append("Existencias: " & invActualizado).Color(0xFF017F01).Append($" $${NumberFormat2(precio, 1, 2, 2, False)}"$).Popall +' Log(lProdX.Text) + End If + If Subs.totalPedido < 1 Then laCant.Text = "0" + invTotal = laCant.Text + Subs.traeinventario(id) +' LogColor("InvTotal PRODMAS: " & invTotal, Colors.Red) +End Sub + +Sub b_prodMas_Click + etCantHasFocus = False + Root.RequestFocus +' LogColor("b_prodMas_Click", Colors.Magenta) + + Dim index As Int = clv_prods_ll.GetItemFromView(Sender) + Dim pnl0 As B4XView = clv_prods_ll.GetPanel(index) + Dim pnl As B4XView = pnl0.GetView(0) + Dim laCant As B4XView = pnl.GetView(2).GetView(2) + Dim lProdX As B4XView = pnl.GetView(1) + +' Private tmpMap As Map = clv_prods_ll.GetValue(index).As(Map) + Private precio As String=clv_prods_ll.GetValue(index).As(Map).Get("precio") + Private inv As String=clv_prods_ll.GetValue(index).As(Map).Get("almacen") + Private existencias As String = clv_prods_ll.GetValue(index).As(Map).Get("almacen") + Log($"Existencias: ${existencias}"$) + If laCant.Text = "" Then laCant.Text = 0 + Private id As String=clv_prods_ll.GetValue(index).As(Map).Get("id") +' If laCant.Text + 1 <= inv Then +'' Log(NumberFormat2(laCant.Text+1,0,0,0,False)) +' laCant.Text = $"${NumberFormat2(laCant.Text+1,0,0,0,False)}"$ +'' Private precio As String=clv_prods_ll.GetValue(index).As(Map).Get("precio") +' Private id As String=clv_prods_ll.GetValue(index).As(Map).Get("id") +'' Private tmpMap As Map = CreateMap("precio":precio, "cant":laCant.Text, "almacen":Subs.traeAlmacen) +'' Log(tmpMap) +'' prodsMap.Put(id, tmpMap) +'' LogColor(prodsMap, Colors.blue) +' End If +' Log("Cantidad + exis " & (laCant.Text + existencias)) +' Log( (laCant.Text + 1 <= (laCant.Text + existencias))) +' Log("inventario "&Subs.traeinventario(id)) +' Log((Subs.totalPedido - precio > 1)) +' Log((Subs.totalPedido)) +' Log(precio) + + + If Subs.traeinventario(id) > 0 And (laCant.Text <= (laCant.Text + Subs.traeinventario(id))) Then 'And (Subs.totalPedido - precio > 1) +' Log(clv_prods_ll.GetValue(index).As(Map)) + clv_prods_ll.GetValue(index).As(Map).Put("almacen", (inv - 1)) + inv = inv - 1 +' laCant.Text = $"$1.0{laCant.Text+1}"$ + laCant.Text = NumberFormat2((laCant.Text + 1), 1, 0, 0, False) +' Log(clv_prods_ll.GetValue(index).As(Map)) + End If + Private nombreX As String = Subs.traeProdNombre(id) +' Subs.actualizaProducto(Subs.traeAlmacen, laCant.text, id, clienteId) + + + + Subs.actualizaProducto(Subs.traeAlmacen, precio, laCant.text, Subs.traeProdNombre(id), id, clienteId, Subs.traeFecha, Subs.traeUsuarioDeBD, rutaUsuario, 0, B4XPages.MainPage.tipo_venta) + cuentaProds +' Log($"Total Prods: ${totalProds}, Total Compra: $$1.2{totalCompra}"$) + If 1 = 1 Then + Private cs As CSBuilder + cs.Initialize + Private o As Cursor = Starter.skmt.ExecQuery($"select CAT_GP_ALMACEN from ${Starter.tabla} where CAT_GP_ID = '${id}'"$) + Private invActualizado As String = "0" + If o.RowCount > 0 Then + o.Position = 0 + invActualizado = o.GetString("CAT_GP_ALMACEN") + End If + If 2 = 2 Then lProdX.Text = cs.Color(Colors.red).append(nombreX).pop.Append(CRLF).Append("Existencias: " & invActualizado).Color(0xFF017F01).Append($" $${NumberFormat2(precio, 1, 2, 2, False)}"$).Popall +' Log(lProdX.Text) + End If + invTotal = laCant.Text + Subs.traeinventario(id) +' LogColor("InvTotal PRODMAS: " & invTotal, Colors.Red) +End Sub + +Private Sub et_pCant_FocusChanged (HasFocus As Boolean) + LogColor($"focus changed=${HasFocus}"$, Colors.Magenta) + If et_pCant.Text = "" Then et_pCant.Text = "0" + Dim index As Int = clv_prods_ll.GetItemFromView(Sender) + Dim pnl0 As B4XView = clv_prods_ll.GetPanel(index) + Dim pnl As B4XView = pnl0.GetView(0) + Dim laCant As B4XView = pnl.GetView(2).GetView(2) + Private id As String=clv_prods_ll.GetValue(index).As(Map).Get("id") + If laCant.Text = "" Then laCant.Text = "0" + etCantHasFocus = HasFocus + + invTotal = laCant.Text + Subs.traeinventario(id) +' LogColor("InvTotal PRODMAS: " & invTotal, Colors.Red) + + cuentaProds +End Sub + +Private Sub et_pCant_TextChanged (Old As String, New As String) + Log(etCantHasFocus) +' Log("InvTotal: " & invTotal) + If etCantHasFocus = True Then + LogColor($"txt changed: ${Old}|${New}, hasfocus=${etCantHasFocus}"$,Colors.Magenta) + Dim index As Int = clv_prods_ll.GetItemFromView(Sender) + Dim pnl0 As B4XView = clv_prods_ll.GetPanel(index) + Dim pnl As B4XView = pnl0.GetView(0) + Dim laCant As B4XView = pnl.GetView(2).GetView(2) + Dim lProdX As B4XView = pnl.GetView(1) + Private id As String=clv_prods_ll.GetValue(index).As(Map).Get("id") + Private precio As String=clv_prods_ll.GetValue(index).As(Map).Get("precio") + Private inv As String=clv_prods_ll.GetValue(index).As(Map).Get("almacen") + Private inv As String=Subs.traeinventario(id) + Private nombreX As String = Subs.traeProdNombre(id) + + + + If(New = "" Or New = Null Or New = "-") Then New = 0 +' If New < 0 Then New = 0 + If(New > invTotal) Then + Sender.As(EditText).text = invTotal + End If + ' Log($"inventario=${inv}"$) + + If New = "" Then New = 0 + If laCant.Text = "" Then laCant.Text = 0 + If Not(Old = "0" And New = "") And laCant.Text <> Null And laCant.Text <> "" And etCantHasFocus Then + Log("actualizamos producto") + Subs.actualizaProducto(Subs.traeAlmacen, precio, laCant.text, Subs.traeProdNombre(id), id, clienteId, Subs.traeFecha, Subs.traeUsuarioDeBD, rutaUsuario, 0, B4XPages.MainPage.tipo_venta) + cuentaProds + End If + +' If New <> "" And New.SubString2(0,0) = "0" Then +' New.SubString(1) +' End If +' If New <> "" And New.SubString(1) <> "" Then +' Log(New.SubString(1)) +' New = New.SubString(1) +' laCant.Text = New.SubString(1) +' Log(laCant.Text) +' End If + + If 1 = 1 Then + Private cs As CSBuilder + cs.Initialize + Private o As Cursor = Starter.skmt.ExecQuery($"select CAT_GP_ALMACEN from ${Starter.tabla} where CAT_GP_ID = '${id}'"$) + Private invActualizado As String = "0" +' If o.RowCount > 0 Then + o.Position = 0 + invActualizado = Subs.traeinventario(id) + Log(Subs.traeinventario(id)) +' End If + + If New = "" Then New = 0 + lProdX.Text = cs.Color(Colors.red).append(nombreX).pop.Append(CRLF).Append("Existencias: " & (Subs.traeinventario(id))).Color(0xFF017F01).Append($" $${NumberFormat2(precio, 1, 2, 2, False)}"$).Popall + End If + End If +End Sub + +Sub cuentaProds +' LogColor($"Productos de la orden: ${c_prods.GetString("cantProds")}, Total: ${c_prodsX.GetString("costoTotal")}"$, Colors.red) + Log("===========================") + Private c As Cursor = B4XPages.MainPage.skmt.ExecQuery($"select sum(PE_COSTO_TOT) as total, sum(PE_CANT) as cant from PEDIDO where PE_CLIENTE = '${clienteId}'"$) +' LogColor("TIEMPO cuentaProds =" & ((DateTime.Now-inicioContador)/1000), Colors.Red) +' LogColor(prodsMap, Colors.Magenta) + p_botonesVenta.Visible = True + p_botonesVenta.BringToFront + c.Position=0 + Log($"Total Prods: ${c.GetString("cant")}, Total Compra: $$1.2{c.GetString("total")}"$) + c.Close +' Log($"HAY PEDIDO: ${hayPedido}"$) +End Sub + +Sub b_terminar1_Click +' Log("b_terminar1_Click") +' ya_entro = "0" : Log("ya_entro=1") + B4XPages.MainPage.skmt.ExecNonQuery2("delete from PEDIDO WHERE PE_PRONOMBRE = ? ", Array As Object("N/A") ) + + lv_promos.Visible = False + clv_prods_ll.AsView.Visible = False + lv_catalogos.Visible = True + lv_prodsPedido.Clear + lv_prodsPedido.TwoLinesLayout.Label.Height = 35dip + lv_prodsPedido.TwoLinesLayout.SecondLabel.Height = 25dip + Private c_prods As Cursor=B4XPages.MainPage.skmt.ExecQuery("select PE_PRONOMBRE,PE_COSTO_TOT, PE_CANT, PE_FOLIO, PE_CEDIS FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) order by PE_CEDIS, PE_PRONOMBRE") + If c_prods.RowCount > 0 Then + Private cs As CSBuilder + + vamoaver.Initialize + For i=0 To c_prods.RowCount -1 + cs.Initialize + c_prods.Position=i + Dim label1 As Label + label1 = lv_prodsPedido.TwoLinesLayout.Label + label1.TextSize = 15 + label1.TextColor = Colors.Black + label1.color = Colors.White + Private textColor As Int = Colors.black + + If c_prods.GetString("PE_FOLIO") = "VENTA" Then + textColor = Colors.RGB(48,3,195) + Else If c_prods.GetString("PE_FOLIO") = "PREVENTA" Or c_prods.GetString("PE_FOLIO") = "ABORDO" Then + textColor = Colors.RGB(166,0,0) + End If + If Not(IsNumber(c_prods.GetString("PE_CEDIS"))) And c_prods.GetString("PE_FOLIO") = "VENTA" Then + textColor = Colors.RGB(154,131,231) 'Si es promo, cambiamos el color del texto. + Else If Not(IsNumber(c_prods.GetString("PE_CEDIS"))) And c_prods.GetString("PE_FOLIO") = "PREVENTA" Then + textColor = Colors.RGB(255,111,111) 'Si es promo, cambiamos el color del texto. + End If + Dim label2 As Label + label2 = lv_prodsPedido.TwoLinesLayout.SecondLabel + label2.TextSize = 10 + label2.TextColor = Colors.Blue + + lv_prodsPedido.AddTwoLines(cs.Color(textColor).append(c_prods.GetString("PE_PRONOMBRE")).pop,"Cantidad #"& c_prods.GetString("PE_CANT")& " SubTotal $"& c_prods.GetString("PE_COSTO_TOT")& " Folio "& c_prods.GetString("PE_FOLIO")) + vamoaver.Add(c_prods.GetString("PE_FOLIO")) + folio = c_prods.GetString("PE_FOLIO") + Next +' c=B4XPages.MainPage.skmt.ExecQuery("select pc_noart, pc_monto from pedido_cliente where pc_cliente in (Select CUENTA from cuentaa)") +' c = B4XPages.MainPage.skmt.ExecQuery("SELECT SUM (PE_CANT) AS CANTIDAD FROM PEDIDO WHERE PE_PROID not like 'PRO%' and PE_CLIENTE IN (Select CUENTA from cuentaa)") + c = B4XPages.MainPage.skmt.ExecQuery("select sum(PE_CANT) as PC_NOART, sum (PE_COSTO_TOT) as PC_MONTO from PEDIDO where PE_CLIENTE in (Select CUENTA from cuentaa) AND PE_PROID NOT IN (SELECT CAT_PA_ID FROM PROMOS_COMP )") +' r = B4XPages.MainPage.skmt.ExecQuery("SELECT SUM (PE_COSTO_TOT) AS MONTO FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + c.Position=0 +' r.Position = 0 + l_cant.Text = c.GetString("PC_NOART") + l_total2.Text = c.GetString("PC_MONTO") + c.Close +' r.Close + End If + c_prods.Close + p_vistaPreviaTrans.Width = Root.Width + p_vistaPreviaTrans.Height = Root.Height + Subs.centraPanel(p_vistaPrevia, Root.Width) + If Subs.pedidoGuardado Then b_rechazar.Enabled = False Else b_rechazar.Enabled = True + p_vistaPrevia.Visible=True + p_vistaPreviaTrans.Visible=True +End Sub + +Private Sub b_continuar_Click + Log("b_continuar_Click") + cuentaProds + Private p1 As Map + Log($"prodsMap=${prodsMap}"$) + For Each p As String In prodsMap.Keys + p1 = prodsMap.Get(p) + Log(p & "|" & p1) + Private pn As String = Subs.traeProdNombre(p) + Subs.guardaProductoSinGestion(Subs.traeAlmacen, p1.Get("precio"), p1.Get("cant"), pn, p, clienteId, Subs.traeFecha, Subs.traeUsuarioDeBD, rutaUsuario, 0, B4XPages.MainPage.tipo_venta) + Next + Log("promos-inv, prods-inv, cat-vis") + lv_promos.Visible = False + clv_prods_ll.AsView.Visible = False + lv_subtipo.Visible = False + lv_tipo.Visible = False + lv_catalogos.Visible = True + Log("Continuar") + Dim m As Map = Subs.traeTotalesClienteActual + prodsPedidoActual = m.Get("productos") + montoPedidoActual = m.Get("monto") +End Sub + +Private Sub l_prodX_LongClick + Log("longclic = "&Sender.as(Label).tag) + l_info.Text = Sender.as(Label).tag + l_info.Visible = True +End Sub + +Private Sub l_info_Click + l_info.Visible = False +End Sub + +Private Sub lv_promos_ItemLongClick (Position As Int, Value As Object) + Log("Promo longclic = "&Value) + Private id As String = "" + Dim c As Cursor = B4XPages.MainPage.skmt.ExecQuery($"select CAT_GP_ID from ${Starter.tabla} where CAT_GP_TIPO = 'PROMOS' and CAT_GP_NOMBRE = '${Value}'"$) + If c.RowCount > 0 Then + c.Position = 0 + id = c.GetString("CAT_GP_ID") + End If + l_info.Text = $"ID: ${id}${CRLF}${Value}"$ + l_info.Visible = True +End Sub + +Private Sub b_buscar_Click + forzarBusqueda = True + Busca_TextChanged("",BUSCA.Text) +End Sub + +Private Sub lv_tipo_ItemClick (Position As Int, Value As Object) +' lfila.text = "SUB TIPO" +' lv_tipo.Visible = False +' lv_subtipo.Height = Root.Height * 0.7 +' lv_subtipo.Visible = True +' Private c As Cursor = B4XPages.MainPage.skmt.ExecQuery2("select distinct CAT_GP_SUBTIPO from cat_gunaprod where CAT_GP_TIPO = ? order by CAT_GP_SUBTIPO", Array As String(Value)) +' If c.RowCount > 0 Then +' Dim label1 As Label +' label1 = lv_subtipo.SingleLineLayout.Label +' label1.TextSize = 17 +' label1.TextColor = Colors.Black +' lv_subtipo.Clear +' For i=0 To c.RowCount-1 +' c.Position=i +' lv_subtipo.AddSingleLine(c.GetString("CAT_GP_SUBTIPO")) +' Next +' End If +' c.Close +End Sub + +Private Sub lv_subtipo_ItemClick (Position As Int, Value As Object) +' lfila.text = "SUB TIPO" +' LogColor("Catalogo", Colors.red) +' lv_catalogos.Visible = False +' lv_subtipo.Visible = False +' lv_promos.Visible = False +' lfila.text = "CATALOGO" +' ProgressDialogShow("Cargando catalogo ...") +' Sleep(100) +' Private inicioContador As String = DateTime.Now +' llenaCatalogo(Value) +' clv_prods_ll.AsView.Visible = True +' LogColor("TIEMPO DE PROCESO DEL CATALOGO: " & ((DateTime.Now-inicioContador)/1000), Colors.Red) +' ProgressDialogHide +End Sub + +Private Sub p_vistaPreviaTrans_Click + +End Sub + +Private Sub b_rechazar_Click +' If folio <> "" Then + result = Msgbox2($"Seguro que desea borrar el pedido completo?${CRLF}Haciendo clic largo sobre un producto se pueden borrar articulos independientes."$,"Rechazar Pedido", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore + If result = DialogResponse.POSITIVE Then + Subs.borraPedidoClienteActual + prodsMap.Initialize + B4XPages.MainPage.promos.promosMap.Initialize +' Log("Llamamos LlenaProdsLL") +' LlenaProdsLL(Null) + clv_prods_ll.Clear + Log("Positivo") + B4XPages.ShowPage("Cliente") + Else + Log("NO Positivo") + p_vistaPreviaTrans.Visible = False + End If +' Else +' Msgbox("CLIENTE YA SE TRANSMITIO, FAVOR DE LLAMAR A SOPORTE PARA ASISTENCIA","AVISO") 'ignore +' End If + p_vistaPreviaTrans.Visible=False + B4XPages.ShowPage("Cliente") +End Sub + +Private Sub b_aceptar_Click + p_vistaPreviaTrans.Visible=False + B4XPages.ShowPage("Cliente") +End Sub + +Private Sub lv_prodsPedido_ItemLongClick (Position As Int, Value As Object) + Private sDate,sTime, clie_id, usuario As String + If Not(Subs.pedidoGuardado) Then + result = Msgbox2("Seguro que desea borrar este articulo?","Borrar Articulo", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore + If result = DialogResponse.POSITIVE Then + c=B4XPages.MainPage.skmt.ExecQuery2("select PE_PROID,PE_CANT, PE_FOLIO FROM PEDIDO where pe_pronombre = ? and pe_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) + c.Position=0 + Log(vamoaver.Get(Position)) + If vamoaver.Get(Position) = "VENTA" Then + Log("CAT_GUNAPROD2") + Log(Position) + Log(Value) + Starter.tabla = "CAT_GUNAPROD2" + Else + Log("CAT_GUNAPROD") + Log(Position) + Log(Value) + Starter.tabla = "CAT_GUNAPROD" + End If +' B4XPages.MainPage.skmt.ExecNonQuery2($"update ${Starter.tabla} set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_id = ?"$, Array As Object(c.GetString("PE_CANT"),c.GetString("PE_PROID"))) +' Log(c.GetString("PE_CANT")) + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO INVENT_X_ENVIAR (ALMACEN , PROID , CANTIDAD ) VALUES(?,?,?) ", Array As Object (Subs.traeAlmacen,c.GetString("PE_PROID"),c.GetString("PE_CANT")* -1)) + c2=B4XPages.MainPage.skmt.ExecQuery2($"select count(*) AS CUANTOS from ${Starter.tabla} where CAT_GP_ID in (select pe_cedis from pedido where pe_pronombre = ? and pe_cliente in (Select CUENTA from cuentaa)) and CAT_GP_CLASIF = 'PROMOS' AND CAT_GP_TIPO = 'PROMOS' AND CAT_GP_SUBTIPO = 'PROMOS'"$, Array As String(Value)) + c2.Position=0 + If c2.GetString("CUANTOS") > 0 Then + j3 = B4XPages.MainPage.skmt.ExecQuery2("SELECT PE_CEDIS, PE_CANT,PE_PROID, PE_PRONOMBRE FROM PEDIDO WHERE PE_CEDIS IN (SELECT PE_CEDIS FROM PEDIDO WHERE PE_PRONOMBRE = ?)",Array As String(Value)) + Log(j3.RowCount) + If j3.RowCount > 0 Then + Log("estoy aqui") + For i = 0 To j3.RowCount -1 + Log("aqui tronare?") + j3.Position = i + B4XPages.MainPage.skmt.ExecNonQuery($"update ${Starter.tabla} set cat_gp_almacen = cat_gp_almacen + ${j3.GetString("PE_CANT")} where cat_gp_id = '${j3.Getstring("PE_PROID")}'"$) + B4XPages.MainPage.skmt.ExecNonQuery2("delete from pedido where pe_cedis in (select pe_cedis from pedido where pe_pronombre = ?) and pe_cliente in (Select CUENTA from cuentaa) AND PE_FOLIO = ?", Array As Object(j3.GetString("PE_PRONOMBRE"), c.GetString("PE_FOLIO"))) + Next + End If + j3.Close + Else + B4XPages.MainPage.skmt.ExecNonQuery($"update ${Starter.tabla} set cat_gp_almacen = cat_gp_almacen + ${c.GetString("PE_CANT")} where cat_gp_id = '${c.Getstring("PE_PROID")}'"$) + B4XPages.MainPage.skmt.ExecNonQuery2("delete from pedido where pe_pronombre = ? and pe_cliente in (Select CUENTA from cuentaa) AND PE_FOLIO = ?", Array As Object(Value, c.GetString("PE_FOLIO"))) + End If + c.Close + c2.Close + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=B4XPages.MainPage.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c=B4XPages.MainPage.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + c=B4XPages.MainPage.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE, count(*) as CUANTOS FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + c.Position=0 + If c.GetString("CUANTOS") > 0 Then + Log("aqui5") + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT) VALUES (?,?,?,?,?,?,?)", Array As Object(clie_id, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), B4XPages.MainPage.lon_gps, B4XPages.MainPage.lat_gps)) + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + Private h As Cursor = B4XPages.MainPage.skmt.ExecQuery("select sum(PE_CANT) as PC_NOART, sum (PE_COSTO_TOT) as PC_MONTO from PEDIDO where PE_CLIENTE in (Select CUENTA from cuentaa) AND PE_PROID NOT IN (SELECT CAT_PA_ID FROM PROMOS_COMP )") + h.Position=0 + l_cant.Text = h.GetString("PC_NOART") + l_total2.Text = h.GetString("PC_MONTO") + h.Close + Else + Log("aqui6") + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + Private h As Cursor = B4XPages.MainPage.skmt.ExecQuery("select sum(PE_CANT) as PC_NOART, sum (PE_COSTO_TOT) as PC_MONTO from PEDIDO where PE_CLIENTE in (Select CUENTA from cuentaa) AND PE_PROID NOT IN (SELECT CAT_PA_ID FROM PROMOS_COMP )") + h.Position=0 + l_cant.Text = 0 + l_total2.Text = 0 + h.Close + End If + b_terminar1_Click + End If + Else + ToastMessageShow("Esta venta ya esta guardada, no se puede editar ni borrar.", False) + End If +End Sub + +Private Sub clv_prods_ll_ItemClick (Index As Int, Value As Object) + +End Sub + +Sub l_prodx_click + Dim index As Int = clv_prods_ll.GetItemFromView(Sender) + Private p0 As B4XView = clv_prods_ll.GetPanel(index) + Private p As B4XView = p0.GetView(0) + Private cant1 As B4XView = p.GetView(2).GetView(2) + Dim index As Int = clv_prods_ll.GetItemFromView(Sender) +' Log(clv_prods_ll.GetValue(index)) + Log(cant1.Text) +End Sub + +Private Sub clv_prods_ll_VisibleRangeChanged (FirstIndex As Int, LastIndex As Int) +' Private inicioContador As String = DateTime.Now +' Log($"clv_prods_ll_VisibleRangeChanged : ${FirstIndex}, ${LastIndex} "$) + Dim ExtraSize As Int = 15 'List size + For i = Max(0, FirstIndex - ExtraSize) To Min(LastIndex + ExtraSize, clv_prods_ll.Size - 1) + Dim Pnl As B4XView = clv_prods_ll.GetPanel(i) + If i > FirstIndex - ExtraSize And i < LastIndex + ExtraSize Then +' Log(listaRenglones) + If Pnl.NumberOfViews = 0 Then 'Add each item/layout to the list/main layout + Pnl.LoadLayout("proditem") + p_prods.Width = Root.Width * 0.92 + p_botMasMen.Left = p_prods.Width - (p_botMasMen.Width + 5) + p_prods.Height = 62dip + b_prodMenos.Height = 60dip + b_prodMas.Height = 60dip + et_pCant.Height = 51dip + l_pCant.Height = 44dip + l_pCant.Top = l_pCant.Top + 8 + Pnl.Height = p_prods.Height + Private cs As CSBuilder + cs.Initialize + l_prodX.SetTextSizeAnimated(0, 13) + If clv_prods_ll.GetValue(i).As(Map).Get("cant") <> Null And clv_prods_ll.GetValue(i).As(Map).Get("cant") > 0 Then + p_prods.Color=0xFFE2EEFF + et_pCant.TextColor=Colors.Red + If Subs.pedidoGuardado Then + Log("YA SE GUARDO") + et_pCant.Enabled = False +' b_prodMas.Enabled = False + b_prodMenos.Enabled = False + End If + End If + + Private precio As String=NumberFormat2(clv_prods_ll.GetValue(i).As(Map).Get("precio").As(Double),1,2,2,False) + If clv_prods_ll.GetValue(i).As(Map).Get("cant") <> Null Then et_pCant.Text = clv_prods_ll.GetValue(i).As(Map).Get("cant") + l_prodX.Text = cs.Color(Colors.red).append(clv_prods_ll.GetValue(i).As(Map).Get("prod")).pop.append(CRLF).Append("Existencias: " & clv_prods_ll.GetValue(i).As(Map).Get("almacen")).Color(0xFF017F01).Append($" $${precio}"$).Popall + End If +' Log($"${i}, ${FirstIndex}, ${LastIndex}, ${Pnl.NumberOfViews}. ${clv_prods_ll.Size}"$) + Else 'Not visible + ' If Pnl.NumberOfViews > 0 Then + ' Pnl.RemoveAllViews 'Remove none visable item/layouts from the list/main layout + ' End If + End If + PCLV.B4XSeekBar1.Value = clv_prods_ll.Size - FirstIndex +' Log($"Bar value: ${PCLV.B4XSeekBar1.Value}"$) + Next +End Sub + +Sub Busca_TextChanged (Old As String, New As String) +' Private inicioContador As String = DateTime.Now + If Not(clv_prods_ll.AsView.Visible) Then clv_prods_ll.AsView.Visible = True + If (New.Length = 1 Or New.Length = 2) And Not(forzarBusqueda) Then Return + forzarBusqueda = False + clv_prods_ll.Clear + listaProds.Initialize + listaHints.Initialize + Sleep(0) + Dim p As ResultSet = B4XPages.MainPage.skmt.ExecQuery($"select CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_ALMACEN, CAT_GP_PRECIO, CAT_GP_TIPOPROD from ${Starter.tabla} where CAT_GP_NOMBRE like '%${New}%' and CAT_GP_PRECIO > 0 AND CAT_GP_ALMACEN > 0 and CAT_GP_CLASIF <> 'PROMOS' order by CAT_GP_NOMBRE"$) + Log("Llamamos LlenaProdsLL") + LlenaProdsLL(p) +' Do While p.NextRow +' Dim tempMap As Map = CreateMap("prod":p.GetString("CAT_GP_NOMBRE"), "precio":p.GetString("CAT_GP_PRECIO"), "almacen":p.GetString("CAT_GP_ALMACEN"), "id":p.GetString("CAT_GP_ID")) +' listaProds.Add(tempMap) +' listaHints.Add(p.GetString("CAT_GP_NOMBRE")) +' Dim Pnl As B4XView = xui.CreatePanel("") +' Pnl.SetLayoutAnimated(0, 0, 0, clv_prods_ll.AsView.Width, 50dip) 'Panel height + 4 for drop shadow +' clv_prods_ll.Add(Pnl, tempMap) +' Loop +' LogColor(clv_prods_ll.Size, Colors.red) +'' Log(listaProds) +' p.Close +' PCLV.B4XSeekBar1.MaxValue = clv_prods_ll.Size +' PCLV.B4XSeekBar1.MinValue = 0 +' PCLV.B4XSeekBar1.Interval = clv_prods_ll.Size/10 +' PCLV.B4XSeekBar1.Value = clv_prods_ll.Size +' PCLV.B4XSeekBar1.Update +' Log($"Min:0, max:${clv_prods_ll.Size}, Interval:${clv_prods_ll.Size/10}"$) +' LogColor("TIEMPO DE PROCESO DEL TEXTCHANGED: " & ((DateTime.Now-inicioContador)/1000), Colors.Red) +End Sub + +Sub LlenaProdsLL(p As ResultSet) + Log("Iniciamos LlenaProdsLL") + listaProds.Initialize + If hayPedido Then 'Si hay pedido obtenemos las cantidades de los productos para agregarlos al CLV. + Dim cantsMap As Map + cantsMap.Initialize + Dim pe As ResultSet = B4XPages.MainPage.skmt.ExecQuery($"select PE_PROID, PE_CANT from PEDIDO where PE_CLIENTE = '${clienteId}' and PE_CEDIS = '${Subs.traeAlmacen}' and PE_FOLIO = '${B4XPages.MainPage.tipo_venta}'"$) +' LogColor("Ponemos productos de pedido anterior: "&pe.RowCount, Colors.red) + Do While pe.NextRow + Private cant As Int = 0 + cantsMap.put(pe.GetString("PE_PROID"), pe.GetString("PE_CANT")) + Loop + pe.Close + End If +' Log(p.IsInitialized) + If p.IsInitialized Then +' Log("YA HAY RESULSET") + Else +' Log("NO HAY RESULSET") +LogColor(Starter.tabla,Colors.blue) +' Dim p As ResultSet = B4XPages.MainPage.skmt.ExecQuery($"select CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_ALMACEN, CAT_GP_PRECIO, CAT_GP_TIPOPROD from ${Starter.tabla} where CAT_GP_PRECIO > 0 And CAT_GP_ALMACEN > 0 And CAT_GP_CLASIF <> 'PROMOS' order by CAT_GP_NOMBRE"$) + Dim p As ResultSet = B4XPages.MainPage.skmt.ExecQuery($"select CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_ALMACEN, CAT_GP_PRECIO, CAT_GP_TIPOPROD from ${Starter.tabla} where CAT_GP_PRECIO > 0 And CAT_GP_ALMACEN > 0 And CAT_GP_CLASIF <> 'PROMOS' union all select CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_ALMACEN, CAT_GP_PRECIO, CAT_GP_TIPOPROD from ${Starter.tabla} where CAT_GP_PRECIO > 0 And CAT_GP_ALMACEN = 0 And CAT_GP_CLASIF <> 'PROMOS' and cat_gp_id in (select pe_proid from pedido where pe_cliente in (select cuenta from cuentaa)) order by 2"$) + End If + + Do While p.NextRow + Private cant As Int = 0 + If hayPedido And cantsMap.ContainsKey(p.GetString("CAT_GP_ID")) Then cant = cantsMap.Get(p.GetString("CAT_GP_ID")) + Dim tempMap As Map = CreateMap("prod":p.GetString("CAT_GP_NOMBRE"), "precio":p.GetString("CAT_GP_PRECIO"), "almacen":p.GetString("CAT_GP_ALMACEN"), "id":p.GetString("CAT_GP_ID"), "cant":cant) + listaProds.Add(tempMap) + Loop + p.Close +' Log(listaProds) + PCLV.Commit + clv_prods_ll.Clear + Private listaProdsConCant, listaProdsConCantIndex As List + listaProdsConCant.Initialize + listaProdsConCantIndex.Initialize + listaHints.Initialize + For q=0 To listaProds.Size-1' Sacamos los productos con cantidad previa. + If listaProds.Get(q).As(Map).Get("cant").As(Int) <> 0 Then +' Log(listaProds.Get(q).As(Map).Get("cant")) + listaProdsConCant.Add(listaProds.Get(q)) + listaProdsConCantIndex.Add(q) + End If + Next +' Log(listaProdsConCantIndex) + Private cont As Int = 0 + For pr0=0 To listaProdsConCant.Size - 1 'Agregamos los productos con cantidad previa. + Private Pnl As B4XView = xui.CreatePanel("") + Pnl.SetLayoutAnimated(0, 0, 0, clv_prods_ll.AsView.Width, 63dip) + clv_prods_ll.Add(Pnl, listaProdsConCant.Get(pr0)) + listaHints.Add(listaProdsConCant.get(pr0).As(Map).Get("prod")) + cont = cont + 1 + Next +' LogColor(clv_prods_ll.Size, Colors.red) +' Log(listaProds.Size) + For pr=0 To listaProds.Size-1 + If listaProdsConCantIndex.IndexOf(pr) = -1 Then + Private Pnl As B4XView = xui.CreatePanel("") + Pnl.SetLayoutAnimated(0, 0, 0, clv_prods_ll.AsView.Width, 63dip) + clv_prods_ll.Add(Pnl, listaProds.Get(pr)) + listaHints.Add(listaProds.get(pr).As(Map).Get("prod")) + cont = cont + 1 + End If + Next +' LogColor(clv_prods_ll.Size, Colors.red) +' PCLV.Commit +' Log("CONT=" & cont) +' Log("CLV_PRODSLL="&clv_prods_ll.Size) + PCLV.B4XSeekBar1.MaxValue = clv_prods_ll.Size + PCLV.B4XSeekBar1.MinValue = 0 + PCLV.B4XSeekBar1.Interval = clv_prods_ll.Size/20 + PCLV.B4XSeekBar1.Value = clv_prods_ll.Size + PCLV.B4XSeekBar1.Update +' Log($"Min:0, max:${clv_prods_ll.Size}, Interval:${clv_prods_ll.Size/20}"$) + reiniciarlistaProds = False +End Sub + +'Return the hint that will be displayed when the user fast scrolls the list. It can be a string or CSBuilder. +Sub PCLV_HintRequested(Index As Int) As Object + Dim word As String = listaHints.get(Index) + Return word +End Sub \ No newline at end of file diff --git a/B4A/C_Promos.bas b/B4A/C_Promos.bas new file mode 100644 index 0000000..f323188 --- /dev/null +++ b/B4A/C_Promos.bas @@ -0,0 +1,607 @@ +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 + Private l_promoDesc As Label + Private lv_prodsFijos As ListView + Private clv_prodsVariabes, clv_prodsVariabes2 As CustomListView + Private l_prodsFijos As Label + Private l_prodsVariables, l_prodsVariables2 As Label + Private i_prod As ImageView + Private l_prodX As Label + Private p_prods As Panel + Private b_prodMenos, b_prodMenos2 As Button + Private et_pCant As EditText + Private b_prodMas, b_prodMas2 As Button + Private l_pCant As Label + Dim totalProds As Int = 0 + Dim prodsVar1 As Int = 0 + Dim prodsVar2 As Int = 0 + Dim prodsVarReq As Int = 0 + Dim prodsVarReq_ As Int = 0 + Dim prodsVarReq2 As Int = 0 + Dim prodsVarReq2_ As Int = 0 + Dim totalCompra As Float = 0 + Dim prodsFijosTot As Float = 0 + Dim tpf As Int = 0 + Dim tpf2 As Int = 0 + Dim maxCantPromos As Int = 1 + Private l_totProds As Label + Private l_total As Label + Private b_terminar1 As Button + Private p_promociones As Panel + Dim prodsIds, prodsCants, prodsPrecios, prodsIds2, prodsCants2, prodsPrecios2 As List + Dim estaPromo, esteCliente As String + Private b_promoMas As Button + Private b_promoMenos As Button + Private et_promoCant As EditText + Private l_promosCant As Label + Private b_continuar As Button + Private p_prodsVariables, p_prodsVariables2 As Panel + Dim laPromo = "", elCliente = "" As String + Dim prodsPedidoActual As String + Dim montoPedidoActual As String + Dim promosMap As Map + Dim su As StringUtils +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("promociones") + + p_promociones.Height= Root.Height + p_promociones.Width= Root.Width + + promosMap.Initialize + p_promociones.Top=0 + p_promociones.Left=0 + b_terminar1.Left = Root.Width - (b_terminar1.Width + 10) + b_continuar.Left = Root.Width - b_terminar1.Width - (b_continuar.Width + 20) +End Sub + +Sub B4XPage_Appear +' LogColor(B4XPages.MainPage.productos.prodsMap, Colors.blue) + prodsIds.Initialize + prodsCants.Initialize + prodsPrecios.Initialize + prodsIds2.Initialize + prodsCants2.Initialize + prodsPrecios2.Initialize + Dim m As Map = Subs.traeTotalesClienteActual + prodsPedidoActual = m.Get("productos") + montoPedidoActual = m.Get("monto") +' Log($"laPromo=${laPromo}, el cliente=${elCliente}"$) + If laPromo <> "" Then muestraPromo(laPromo, elCliente) +End Sub +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub muestraPromo(promo As String, cliente As String) + Private thisLog As Boolean = False +' If thisLog Then Log(promo) + estaPromo = promo + esteCliente = cliente + Private mp As Map = Subs.traePromo(promo, cliente) + Private prodsPromo As Map = mp.Get("productos") 'Los productos de la promoción. + Private invDispPromo As Map = Subs.traemosInventarioDisponibleParaPromo(promo) +' If thisLog Then Log($"invDispPromo=${invDispPromo}"$) + If thisLog Then Log("Max promos por inv de prods FIJOS: " & Subs.revisaMaxPromosProdsFijosPorInventario(mp)) + If thisLog Then Log("Max promos por inv de prods VARIABLES: " & Subs.revisaMaxPromosProdsVariablesPorInventario(mp)) + maxCantPromos = Subs.revisaMaxPromosProdsVariablesPorInventario(mp) + et_promoCant.Text = 1 + l_promosCant.text = "Max promos: " & maxCantPromos + Private cs As CSBuilder + cs.Initialize + If thisLog Then Log(mp) + If thisLog Then Log(prodsPromo) + Private listaPV As List = mp.Get("prodsVariables") + Private listaPreciosPV As List = mp.Get("prodsVariablesPrecios") + Private listaPV2 As List = mp.Get("prodsVariables2") + Private listaPreciosPV2 As List = mp.Get("prodsVariablesPrecios2") +' Log("============ " & CRLF & listaPV) + 'Ponemos la promo y descripción. +' Dim desc As String = $"Promoción: ${promo}${CRLF}${mp.Get("descripcion")}"$ +' Dim desc As String = cs.append("Promocion: ").Color(Colors.RGB(100,149,237)).Append(promo).pop.append(CRLF).Append(mp.Get("descripcion")).Popall + l_promoDesc.Text = cs.Color(Colors.RGB(100,149,237)).append("Promocion: ").pop.append(CRLF).Append(promo).append(CRLF).Append(mp.Get("descripcion")).Popall + prodsFijosTot = 0 + 'Ponemos el texto en las etiquetas de la cantidad de productos. +' Dim pf As List = mp.Get("prodsFijos") + Dim pv As List = mp.Get("prodsVariables") + Dim pv2 As List = mp.Get("prodsVariables2") + If thisLog Then Log(mp) + tpf = 0 + For Each pfp As Int In mp.Get("prodsFijosPiezas").As(List) + tpf = tpf + pfp + Next + tpf2 = tpf +' tpf = tpf * maxCantPromos + l_prodsFijos.Text = $"Productos fijos (${tpf})"$ + prodsVarReq = mp.Get("prodsVariablesRequeridos") + prodsVarReq_ = prodsVarReq + prodsVarReq2 = mp.Get("prodsVariables2Requeridos") + prodsVarReq2_ = prodsVarReq2 +' Log("========= " & prodsVarReq2) + l_prodsVariables.Text = $"Productos variables requeridos: ${prodsVarReq}"$ + l_prodsVariables2.Text = $"Productos variables2 requeridos: ${prodsVarReq2}"$ + If prodsVarReq = 0 Then + p_prodsVariables.Visible = False + Else + p_prodsVariables.Visible = True + End If + 'Llenamos el listview con los productos fijos. + Dim label1 As Label + label1 = lv_prodsFijos.SingleLineLayout.Label + label1.TextSize = 13 + label1.TextColor = Colors.black + lv_prodsFijos.SingleLineLayout.ItemHeight = 30dip + lv_prodsFijos.Clear +' If pf.Size < 1 Then pf.Add("Sin productos fijos.") + lv_prodsFijos.Clear + agregaFijosALista(mp, True) + If thisLog Then Log("Total prods fijos = " & prodsFijosTot) +' If thisLog Then Log("======="&prodsMap) + l_totProds.text = $"Productos: ${tpf}"$ + l_total.Text = $"Total: $$1.2{prodsFijosTot}"$ +' Dim ins As InputStream +' Dim bmp As Bitmap +' Dim jpeg() As Byte + + 'Llenamos el listview con los productos variables. + If thisLog Then Log($"PV1: ${pv.Size}, ${pv}"$) + If thisLog Then Log($"PV2: ${pv2.Size}, ${pv2}"$) + If thisLog Then Log("invDisp=" & invDispPromo) + clv_prodsVariabes.Clear + clv_prodsVariabes2.Clear + For Each p As String In pv + If invDispPromo.ContainsKey(p) Then 'Si no esta en la lista de productos con inventario no lo mostramos. + Private indicePV = listaPV.IndexOf(p) +' Log(p & "|" & indicePV & "|" & listaPreciosPV.Get(indicePV)) + Private estePrecio = listaPreciosPV.Get(indicePV) +' c2.Position=i +' jpeg = c2.GetBlob("CAT_GP_IMG") +' ins.InitializeFromBytesArray(jpeg, 0, jpeg.Length) +' bmp.Initialize2(ins) + Private thisProd As Map = prodsPromo.Get(p) + If thisLog Then Log(thisProd) + clv_prodsVariabes.Add(CreateListItem(Subs.traeProdNombre(p)&CRLF&"Hay " & invDispPromo.Get(p) & " $" & estePrecio, estePrecio, invDispPromo.Get(p), clv_prodsVariabes.AsView.Width, 50dip, Null, p), p) + End If + Next + For Each p As String In pv2 + If invDispPromo.ContainsKey(p) Then 'Si no esta en la lista de productos con inventario no lo mostramos. +' Log(p) +' Log($"${invDispPromo}$"$) +' Log($"${listaPV2}"$) +' Log("listaPrecios:"&listaPreciosPV2) + Private indicePV2 = listaPV2.IndexOf(p) +' Log($"${indicePV2}"$) +' Log(p & "|" & indicePV & "|" & listaPreciosPV2.Get(indicePV2)) + Private estePrecio = listaPreciosPV2.Get(indicePV2) +' c2.Position=i +' jpeg = c2.GetBlob("CAT_GP_IMG") +' ins.InitializeFromBytesArray(jpeg, 0, jpeg.Length) +' bmp.Initialize2(ins) + Private thisProd As Map = prodsPromo.Get(p) + If thisLog Then Log(thisProd) + clv_prodsVariabes2.Add(CreateListItem2(Subs.traeProdNombre(p)&CRLF&"Hay " & invDispPromo.Get(p) & " $" & estePrecio, estePrecio, invDispPromo.Get(p), clv_prodsVariabes2.AsView.Width, 50dip, Null, p), p) + End If + Next + If pv2.Size = 0 Then +' Log("PV2 = 0") + l_prodsVariables2.Visible = False + p_prodsVariables2.Visible = False + + p_prodsVariables.Height = 410dip + clv_prodsVariabes.GetBase.Height = p_prodsVariables.Height - 20 +' p_prodsVariables.Height = 380dip +' clv_prodsVariabes.GetBase.Height = 380dip 'Cambiamos el tamaño y posición de la lista de productos +'' clv_prodsVariabes.GetBase.Width = + clv_prodsVariabes.Base_Resize(clv_prodsVariabes.GetBase.Width, p_prodsVariables.Height - 20) 'Cambiamos el tamaño del panel interno de la lista para que ajuste al nuevo tamaño. + Else + l_prodsVariables2.Visible = True + p_prodsVariables2.Visible = True + p_prodsVariables.Height = 210dip + clv_prodsVariabes.GetBase.Height = p_prodsVariables.Height - 20 + End If + b_terminar1.Visible = False + b_continuar.Visible = False + cuentaProds +End Sub + +'Agregamos los productos fijos a una lista para despues meterlos en el pedido. +Sub agregaFijosALista(mp As Map, addListItem As Boolean) + Private thisLog As Boolean = False + Private cont As Int = 0 + prodsFijosTot = 0 + Dim pf As List = mp.Get("prodsFijos") + If pf.Size < 1 Then pf.Add("Sin productos fijos.") +' Private m As Map +' prodsMap.Put(estaPromo, CreateMap("cant":1, "precio":0)) +' prodsIds.Add(estaPromo) + prodsIds.clear + prodsCants.clear + prodsPrecios.clear + prodsIds.Add(estaPromo) + prodsCants.Add(et_promoCant.text.As(Int)) + prodsPrecios.Add(0) + For Each p As String In pf +' Log($"cont=${cont}, mp=${mp}"$) + If mp.Get("prodsFijosPiezas").As(List).Size > 0 Then + Private tpi As String = mp.Get("prodsFijosPiezas").As(List).Get(cont) + Else + Private tpi As String = 0 + End If + If mp.Get("prodsFijosPrecios").As(List).Size > 0 Then + Private tpr As String = mp.Get("prodsFijosPrecios").As(List).Get(cont) + Else + Private tpr As String = 0 + End If + prodsFijosTot = prodsFijosTot + (tpi * tpr) + If thisLog Then Log("|"&tpi&"|"&p) + Private ntpi As Int = tpi * et_promoCant.text + If addListItem And tpi > 0 Then lv_prodsFijos.AddSingleLine(ntpi & " " & Subs.traeProdNombre(p) & " - $" & tpr) + cont = cont+1 +' m=CreateMap("cant":tpi, "precio":tpr) +' prodsMap.Put(p, m) + prodsIds.Add(p) + prodsCants.Add(tpi.As(Int)*et_promoCant.text.As(Int)) + prodsPrecios.Add(tpr) '*et_promoCant.text.As(Int) + Next +End Sub + +Sub CreateListItem(Text As String, precioU As String, inv As Int, Width As Int, Height As Int, img As Bitmap, prodId As String) As Panel 'ignore + Dim p As B4XView = xui.CreatePanel("") + p.SetLayoutAnimated(0, 0, 0, Width, Height) + p.LoadLayout("prodItem") + l_prodX.TextSize = 15 + l_prodX.Text = Text + l_prodX.TextSize = 15 +' p_prods.Height = Height + 70 +' l_prodX.Height = Height + p_prods.height = su.MeasureMultilineTextHeight(l_prodX, l_prodX.Text) + 20 'Calculamos la altura del panel de acuerdo al texto contenido. + If p_prods.Height < Height Then p_prods.Height = Height + l_prodX.Height = p_prods.Height + l_pCant.Tag = precioU&"|"&inv&"|"&prodId + et_pCant.Tag = precioU&"|"&inv&"|"&prodId + et_pCant.BringToFront +' i_prod.Bitmap = img + p.Height = p_prods.Height + Return p +End Sub + +Sub CreateListItem2(Text As String, precioU As String, inv As Int, Width As Int, Height As Int, img As Bitmap, prodId As String) As Panel 'ignore + Dim p As B4XView = xui.CreatePanel("") + p.SetLayoutAnimated(0, 0, 0, Width, Height) + p.LoadLayout("prodItem2") + l_prodX.TextSize = 15 + l_prodX.Text = Text + l_prodX.TextSize = 15 +' p_prods.Height = Height +' l_prodX.Height = Height + p_prods.height = su.MeasureMultilineTextHeight(l_prodX, l_prodX.Text) + 20 'Calculamos la altura del panel de acuerdo al texto contenido. + If p_prods.Height < Height Then p_prods.Height = Height + l_prodX.Height = p_prods.Height +' l_pCant.Text = 0 + l_pCant.Tag = precioU&"|"&inv&"|"&prodId + et_pCant.Tag = precioU&"|"&inv&"|"&prodId + et_pCant.BringToFront +' i_prod.Bitmap = img + p.Height = p_prods.Height + Return p +End Sub + +Sub b_prodMenos_Click + Dim index As Int = clv_prodsVariabes.GetItemFromView(Sender) + Dim pnl0 As B4XView = clv_prodsVariabes.GetPanel(index) + Dim pnl As B4XView = pnl0.GetView(0) +' Dim laCant As B4XView = pnl.GetView(5) + Dim laCant As B4XView = pnl.GetView(2).GetView(4) +' Log($"precio|stock:${laCant.tag}"$) + laCant.Text = $"$1.0{laCant.Text-1}"$ + If laCant.Text < 0 Then laCant.Text = 0 + +' Log(Regex.Split("\|", laCant.tag)(0)) + Private precio As String = Regex.Split("\|", laCant.tag)(0) +' Private inv As String = Regex.Split("\|", laCant.tag)(1) + Private prodId As String = Regex.Split("\|", laCant.tag)(2) + Private tmpMap As Map = CreateMap("precio":precio, "cant":laCant.Text, "almacen":estaPromo) +' Log(tmpMap) + promosMap.Put(prodId, tmpMap) + If laCant.Text = 0 Then promosMap.Remove(prodId) +' LogColor(promosMap, Colors.Magenta) + cuentaProds +' l_total.Text = $"Total Compra: $$1.2{totalCompra}"$ +' l_totProds.text = $"Total Productos: ${totalProds}"$ +End Sub + +Sub b_prodMas_Click + If prodsVar1 < prodsVarReq Then + Dim index As Int = clv_prodsVariabes.GetItemFromView(Sender) + Dim pnl0 As B4XView = clv_prodsVariabes.GetPanel(index) + Dim pnl As B4XView = pnl0.GetView(0) +' Dim laCant As B4XView = pnl.GetView(5) + Dim laCant As B4XView = pnl.GetView(2).GetView(4) +' Log($"precio|stock:${laCant.tag}"$) +' Log($"Indice: ${index}, cant:${laCant.Text+1}, precioU: ${laCant.tag}"$) + Dim esteTag As List = Regex.Split("\|", laCant.Tag) +' Log(esteTag) + If laCant.Text + 1 <= esteTag.get(1) Then + laCant.Text = $"$1.0{laCant.Text+1}"$ + cuentaProds + End If + +' Log(Regex.Split("\|", laCant.tag)(0)) + Private precio As String = Regex.Split("\|", laCant.tag)(0) +' Private inv As String = Regex.Split("\|", laCant.tag)(1) + Private prodId As String = Regex.Split("\|", laCant.tag)(2) + Private tmpMap As Map = CreateMap("precio":precio, "cant":laCant.Text, "almacen":estaPromo) +' Log(tmpMap) + promosMap.Put(prodId, tmpMap) +' LogColor(promosMap, Colors.Magenta) + End If +' Log($"Total Prods: ${totalProds}, Total Compra: $$1.2{totalCompra}"$) +' l_total.Text = $"Total Compra: $$1.2{totalCompra}"$ +' l_totProds.text = $"Total Productos: ${totalProds}"$ +End Sub + + +Sub b_prodMenos2_Click + Dim index As Int = clv_prodsVariabes2.GetItemFromView(Sender) + Dim pnl0 As B4XView = clv_prodsVariabes2.GetPanel(index) + Dim pnl As B4XView = pnl0.GetView(0) +' Dim laCant As B4XView = pnl.GetView(5) + Dim laCant As B4XView = pnl.GetView(2).GetView(4) +' Log($"precio|stock:${laCant.tag}"$) + laCant.Text = $"$1.0{laCant.Text-1}"$ + If laCant.Text < 0 Then laCant.Text = 0 + +' Log(Regex.Split("\|", laCant.tag)(0)) + Private precio As String = Regex.Split("\|", laCant.tag)(0) +' Private inv As String = Regex.Split("\|", laCant.tag)(1) + Private prodId As String = Regex.Split("\|", laCant.tag)(2) + Private tmpMap As Map = CreateMap("precio":precio, "cant":laCant.Text, "almacen":estaPromo) +' Log(tmpMap) + promosMap.Put(prodId, tmpMap) + If laCant.Text = 0 Then promosMap.Remove(prodId) +' LogColor(promosMap, Colors.Magenta) + cuentaProds +' l_total.Text = $"Total Compra: $$1.2{totalCompra}"$ +' l_totProds.text = $"Total Productos: ${totalProds}"$ +End Sub + +Sub b_prodMas2_Click +' Log(prodsVarReq & "|" & prodsVarReq2 & "|" & tpf & "|" & prodsVar2) + If prodsVar2 < prodsVarReq2 Then + Dim index As Int = clv_prodsVariabes2.GetItemFromView(Sender) + Dim pnl0 As B4XView = clv_prodsVariabes2.GetPanel(index) + Dim pnl As B4XView = pnl0.GetView(0) +' Dim laCant As B4XView = pnl.GetView(5) + Dim laCant As B4XView = pnl.GetView(2).GetView(4) +' Log($"precio|stock:${laCant.tag}"$) +' Log($"Indice: ${index}, cant:${laCant.Text+1}, precioU: ${laCant.tag}"$) + Dim esteTag As List = Regex.Split("\|", laCant.Tag) +' Log(esteTag) + If laCant.Text + 1 <= esteTag.get(1) Then + laCant.Text = $"$1.0{laCant.Text+1}"$ + cuentaProds + End If + +' Log(Regex.Split("\|", laCant.tag)(0)) + Private precio As String = Regex.Split("\|", laCant.tag)(0) +' Private inv As String = Regex.Split("\|", laCant.tag)(1) + Private prodId As String = Regex.Split("\|", laCant.tag)(2) + Private tmpMap As Map = CreateMap("precio":precio, "cant":laCant.Text, "almacen":estaPromo) +' Log(tmpMap) + promosMap.Put(prodId, tmpMap) +' LogColor(promosMap, Colors.Magenta) + End If +' Log($"Total Prods: ${totalProds}, Total Compra: $$1.2{totalCompra}"$) +' l_total.Text = $"Total Compra: $$1.2{totalCompra}"$ +' l_totProds.text = $"Total Productos: ${totalProds}"$ +End Sub + + +Private Sub et_pCant_TextChanged (Old As String, New As String) +' LogColor("txt changed",Colors.Magenta) + cuentaProds +End Sub + +Sub cuentaProds +' Log("=====================================================") +' Log("Inicia cuentaProds") + Private thisLog As Boolean = False +' LogColor($"ProdsFijos=${tpf}, totalProds=${totalProds}, totalCompra=${totalCompra}"$, Colors.Red) + prodsIds2.Clear + prodsCants2.Clear + prodsPrecios2.Clear + lv_prodsFijos.Clear + prodsVar1 = 0 + prodsVar2 = 0 + agregaFijosALista(Subs.traePromo(estaPromo, esteCliente), True) +' Log(prodsIds) + Private tcpf As Float = 0 'Total de compra de productos fijos. + For pf = 0 To prodsIds.Size - 1 + If thisLog Then Log($"${tcpf} + ${prodsCants.Get(pf)} * ${prodsPrecios.Get(pf)} = ${(prodsPrecios.Get(pf) * prodsCants.Get(pf))}"$) + tcpf = tcpf + (prodsPrecios.Get(pf) * prodsCants.Get(pf)) + Next +' Log("Total compra prodsFijos = " & tcpf) + totalCompra = tcpf + totalProds = tpf 'Cantidad total de productos fijos. + 'Variables1 + For i = 0 To clv_prodsVariabes.GetSize - 1 + Private p0 As B4XView = clv_prodsVariabes.GetPanel(i) + Private p As B4XView = p0.GetView(0) + Private cant1 As B4XView = p.GetView(2).GetView(4) + If cant1.Text = "" Then cant1.Text = 0 + totalProds = totalProds + cant1.Text + prodsVar1 = prodsVar1 + cant1.Text + Private esteTag As List = Regex.Split("\|", cant1.Tag) + If cant1.Text > esteTag.Get(1) Then cant1.Text = esteTag.Get(1) + If cant1.Text > 0 Then +' Log(esteTag.Get(2) & "|" & cant1.Text) + totalCompra = totalCompra + (esteTag.get(0) * cant1.text) + If thisLog Then Log($"Cant: ${cant1.Text}, Suma: ${totalCompra}"$) + prodsIds2.Add(esteTag.Get(2)) + prodsCants2.Add(cant1.Text) + prodsPrecios2.Add(esteTag.get(0)) + End If + l_total.Text = $"Total: $$1.2{totalCompra}"$ + l_totProds.text = $"Productos: ${totalProds}"$ + Next + 'Variables2 + For i = 0 To clv_prodsVariabes2.GetSize - 1 + Private p0 As B4XView = clv_prodsVariabes2.GetPanel(i) + Private p As B4XView = p0.GetView(0) + Private cant2 As B4XView = p.GetView(2).GetView(4) + totalProds = totalProds + cant2.Text + prodsVar2 = prodsVar2 + cant2.Text + Private esteTag As List = Regex.Split("\|", cant2.Tag) + If cant2.Text > esteTag.Get(1) Then cant2.Text = esteTag.Get(1) + If cant2.Text > 0 Then +' Log(esteTag.Get(2) & "|" & cant2.Text) + totalCompra = totalCompra + (esteTag.get(0) * cant2.text) + If thisLog Then Log($"Cant: ${cant2.Text}, Suma: ${totalCompra}"$) + prodsIds2.Add(esteTag.Get(2)) + prodsCants2.Add(cant2.Text) + prodsPrecios2.Add(esteTag.get(0)) + End If + l_total.Text = $"Total: $$1.2{totalCompra}"$ + l_totProds.text = $"Productos: ${totalProds}"$ + Next + + If thisLog Then Log($"Total Prods: ${totalProds}, Total: $$1.2{totalCompra}"$) + l_total.Text = $"Total: $$1.2{totalCompra}"$ + l_totProds.text = $"Productos: ${totalProds}"$ + If totalProds < prodsVarReq + prodsVarReq2 + tpf Or totalProds > prodsVarReq + prodsVarReq2 + tpf Then +' Log("INCOMPLETA") + b_terminar1.Visible = False + b_continuar.Visible = False + Else +' Log("COMPLETA") + b_terminar1.Visible = True + b_continuar.Visible = True + End If + If thisLog Then LogColor($"${prodsIds}${CRLF}${prodsCants}${CRLF}${prodsPrecios}"$, Colors.blue) + If thisLog Then LogColor($"${prodsIds2}${CRLF}${prodsCants2}${CRLF}${prodsPrecios2}"$, Colors.Magenta) +' LogColor($"Total Prods: ${totalProds}, Total: $$1.2{totalCompra}"$, Colors.Blue) +End Sub + +Private Sub et_pCant_FocusChanged (HasFocus As Boolean) + LogColor("focus changed", Colors.Magenta) + cuentaProds +End Sub + +Private Sub b_promoMenos_Click + If et_promoCant.Text > 1 Then + et_promoCant.Text = et_promoCant.Text.As(Int) - 1 + End If + l_prodsFijos.Text = $"Productos fijos (${tpf2 * et_promoCant.Text.As(Int)})"$ + l_prodsVariables.Text = $"Productos variables requeridos: ${prodsVarReq_ * et_promoCant.Text.As(Int)}"$ + l_prodsVariables2.Text = $"Productos variables2 requeridos: ${prodsVarReq2_ * et_promoCant.Text.As(Int)}"$ + tpf = tpf2 * et_promoCant.Text.As(Int) + prodsVarReq = prodsVarReq_ * et_promoCant.Text.As(Int) + prodsVarReq2 = prodsVarReq2_ * et_promoCant.Text.As(Int) + Log($"Max promos=${et_promoCant.Text.As(Int)}, Prods fijos=${tpf}, "$) + cuentaProds +End Sub + +Private Sub b_promoMas_Click + If et_promoCant.Text < maxCantPromos Then + et_promoCant.Text = et_promoCant.Text.As(Int) + 1 + l_prodsFijos.Text = $"Productos fijos (${tpf2 * et_promoCant.Text.As(Int)})"$ + l_prodsVariables.Text = $"Productos variables requeridos: ${prodsVarReq_ * et_promoCant.Text.As(Int)}"$ + l_prodsVariables2.Text = $"Productos variables2 requeridos: ${prodsVarReq2_ * et_promoCant.Text.As(Int)}"$ + tpf = tpf2 * et_promoCant.Text.As(Int) + prodsVarReq = prodsVarReq_ * et_promoCant.Text.As(Int) + prodsVarReq2 = prodsVarReq2_ * et_promoCant.Text.As(Int) + Log($"Max promos=${et_promoCant.Text.As(Int)}, Prods fijos=${tpf}, "$) + End If + If et_promoCant.text > maxCantPromos Then et_promoCant.Text = maxCantPromos + cuentaProds +End Sub + +Private Sub b_terminar1_Click + cuentaProds + Log("====================================================================") + For t = 0 To prodsIds.Size - 1 'Guardamos los productos fijos de la promocion en pedido. + Private pn As String = Subs.traeProdNombre(prodsIds.Get(t)) + If prodsCants.Get(t) > 0 Then Subs.guardaProductoSinGestion(estaPromo, prodsPrecios.Get(t), prodsCants.Get(t), pn, prodsIds.Get(t), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, B4XPages.MainPage.tipo_venta) + Next + For t = 0 To prodsIds2.Size - 1 'Guardamos los productos variables de la promocion en pedido. + Private pn As String = Subs.traeProdNombre(prodsIds2.Get(t)) + Subs.guardaProductoSinGestion(estaPromo, prodsPrecios2.Get(t), prodsCants2.Get(t), pn, prodsIds2.Get(t), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, B4XPages.MainPage.tipo_venta) + Next +' Log(B4XPages.MainPage.productos.prodsMap) +' For o=0 To prodsIds.Size - 1 'Ponemos los productos fijos en el mapa de la compra. +' Private tmpMap As Map = CreateMap("precio":prodsPrecios.Get(o), "cant":prodsCants.Get(o), "almacen":estaPromo) +'' Log(tmpMap) +' If prodsCants.Get(o) > 0 Then B4XPages.MainPage.productos.prodsMap.Put(estaPromo&"|"&prodsIds.Get(o), tmpMap) +' Next +' For o=0 To prodsIds2.Size - 1 'Ponemos los productos variables en el mapa de la compra. +' Private tmpMap As Map = CreateMap("precio":prodsPrecios2.Get(o), "cant":prodsCants2.Get(o), "almacen":estaPromo) +'' Log(tmpMap) +' B4XPages.MainPage.productos.prodsMap.Put(estaPromo&"|"&prodsIds2.Get(o), tmpMap) +' Next +' LogColor(B4XPages.MainPage.productos.prodsMap, Colors.red) + lv_prodsFijos.Clear + B4XPages.MainPage.bTerminarClicked = True + B4XPages.ShowPage("productos") + B4XPages.MainPage.productos.b_terminar1_Click +End Sub + +Private Sub b_continuar_Click + cuentaProds + Log("====================================================================") + For t = 0 To prodsIds.Size - 1 'Guardamos los productos fijos de la promocion en pedido. + Private pn As String = Subs.traeProdNombre(prodsIds.Get(t)) + Subs.guardaProductoSinGestion(estaPromo, prodsPrecios.Get(t), prodsCants.Get(t), pn, prodsIds.Get(t), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, B4XPages.MainPage.tipo_venta) + Next + For t = 0 To prodsIds2.Size - 1 'Guardamos los productos variables de la promocion en pedido. + Private pn As String = Subs.traeProdNombre(prodsIds2.Get(t)) + Subs.guardaProductoSinGestion(estaPromo, prodsPrecios2.Get(t), prodsCants2.Get(t), pn, prodsIds2.Get(t), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, B4XPages.MainPage.tipo_venta) + Next +' Log(B4XPages.MainPage.productos.prodsMap) +' For o=0 To prodsIds.Size - 1 'Ponemos los productos fijos en el mapa de la compra. +' Private tmpMap As Map = CreateMap("precio":prodsPrecios.Get(o), "cant":prodsCants.Get(o), "almacen":estaPromo) +'' Log(tmpMap) +' If prodsCants.Get(o) > 0 Then B4XPages.MainPage.productos.prodsMap.Put(estaPromo&"|"&prodsIds.Get(o), tmpMap) +' Next +' For o=0 To prodsIds2.Size - 1 'Ponemos los productos variables en el mapa de la compra. +' Private tmpMap As Map = CreateMap("precio":prodsPrecios2.Get(o), "cant":prodsCants2.Get(o), "almacen":estaPromo) +'' Log(tmpMap) +' B4XPages.MainPage.productos.prodsMap.Put(estaPromo&"|"&prodsIds2.Get(o), tmpMap) +' Next +' LogColor(B4XPages.MainPage.productos.prodsMap, Colors.red) + lv_prodsFijos.Clear +' Activity_KeyPress(KeyCodes.KEYCODE_BACK) +' CallSubDelayed2(productos, "Activity_KeyPress", KeyCodes.KEYCODE_BACK) + Private prodspage As C_Productos + If prodspage.IsInitialized Then + prodspage.lv_catalogos.Visible = True + prodspage.lv_promos.Visible = False + prodspage.clv_productos.AsView.Visible = False + End If + B4XPages.MainPage.bTerminarClicked = True + B4XPages.ShowPage("productos") +End Sub + +'Sub Activity_KeyPress (key As Int) As Boolean 'ignore +' ' BACK key pressed +' Log("Keypress") +' If key=KeyCodes.KEYCODE_BACK Then +' Log("BACK") +' Return False +' End If +' Return False +' ' Returning False signals the system to handle the key +'End Sub \ No newline at end of file diff --git a/B4A/C_RespaldoDiario.bas b/B4A/C_RespaldoDiario.bas new file mode 100644 index 0000000..704af4e --- /dev/null +++ b/B4A/C_RespaldoDiario.bas @@ -0,0 +1,148 @@ +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 skmt, rkmt As SQL +' Dim rp As RuntimePermissions + Dim safePath As String + Dim fechaHoy As String + Dim skmtAttached As Boolean = False +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object +' Log("************************** " & safePath) + Dim rp As RuntimePermissions + Dim Dirp As String = File.DirRootExternal + Dim Dir As String +' Dim Dir2 As String + Try + File.MakeDir(Dirp,"/kmts") + Dir = "/kmts" +' Log("creado en kmts " & Dirp & Dir) + Catch + Dir = "" +' Log("creado en raiz") + End Try +' safePath = rp.GetSafeDirDefaultExternal("./") + safePath = Dirp & Dir + 'Si no existe el directorio "kmts" en el raiz de la tarjeta de memoria, nos cambiamos al directorio seguro (sdcard/Android/data/kelloggs...) + If Not(File.IsDirectory(Dirp, Dir)) Then safePath = rp.GetSafeDirDefaultExternal("kmts") + Private name() As String = Regex.split(" ", Application.LabelName) + rkmt.Initialize(safePath,$"${name(0)}.rkmt.km"$, True) + skmt.Initialize(File.DirInternal,"kmt.db", False) + rkmt.ExecNonQuery($"create table if not exists pedidos (pe_folio NUMERIC, pe_desc NUMERIC, pe_costo_sin TEXT, pe_ruta TEXT, pe_cedis TEXT, pe_costo_tot NUMERIC, pe_costou NUMERIC, pe_cant NUMERIC, pe_pronombre TEXT, pe_proid TEXT, pe_cliente TEXT, pe_fecha TEXT, pe_usuario TEXT)"$) + Try 'Intentamos usar "pragma_table_info" para revisar si existe la columna en la tabla + Private c As Cursor = rkmt.ExecQuery($"SELECT COUNT(*) AS fCol FROM pragma_table_info('pedidos') WHERE name='pe_envio_ok'"$) + c.Position = 0 + If c.GetString("fCol") = 0 Then 'Si no esta la columna la agregamos + rkmt.ExecNonQuery($"ALTER TABLE pedidos ADD COLUMN pe_envio_ok INT"$) + Log($"Columna "pe_envio_ok INT", agregada a "pedidos}"."$) + End If + Catch 'Si no funciona "pragma_table_info" lo hacemos con try/catch + Try + rkmt.ExecNonQuery($"ALTER TABLE pedidos ADD COLUMN pe_envio_ok INT"$) + Log($"Columna "pe_envio_ok INT", agregada a "pedidos".."$) + Catch + Log(LastException) + End Try + End Try + rkmt.ExecNonQuery($"create table if not exists inventarios (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_tipoprod2 TEXT, fecha TEXT)"$) + rkmt.ExecNonQuery($"create table if not exists paquetes (cat_dp_precio_simptos TEXT, cat_dp_precio TEXT, cat_dp_almacen TEXT, cat_dp_id TEXT, cat_dp_idprod TEXT, cat_dp_tipo TEXT, cat_dp_pzas TEXT, cat_dp_usuario TEXT, cat_dp_fecha TEXT, cat_dp_regalo TEXT, cat_dp_clasif TEXT, fecha TEXT)"$) + DateTime.DateFormat = "MM/dd/yyyy" + fechaHoy = DateTime.Date(DateTime.Now) + revisaSkmtAttached + 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 + +'Revisa si esta montada "kmt.db" como "skmt" y si no, se monta. +Sub revisaSkmtAttached + skmtAttached = False + Dim rs As ResultSet = rkmt.ExecQuery("SELECT * FROM pragma_database_list") + Do While rs.NextRow 'Revisamos si esta montada "kmt.db" como "skmt" y si no, la montamos. + If rs.GetString("name") = "skmt1" Then skmtAttached = True + Loop + If Not(skmtAttached) Then + rkmt.ExecNonQuery($"attach database '${File.Combine(File.DirInternal, "kmt.db")}' as skmt1;"$) + skmtAttached = True + End If +End Sub + +'Copia la tabla PEDIDO a rkmt.db en la tarjeta del celular. +Sub respaldaPedido + Private inicio As String = DateTime.Now + Log("copiando pedidos ...") + rkmt.BeginTransaction + rkmt.ExecNonQuery($"delete from pedidos where substr(pe_fecha, 1, 10) = '${fechaHoy}'"$) + rkmt.ExecNonQuery($"insert into pedidos (pe_folio, pe_desc, pe_costo_sin, pe_ruta, pe_cedis, pe_costo_tot, pe_costou, pe_cant, pe_pronombre, pe_proid, pe_cliente, pe_fecha, pe_usuario, pe_envio_ok) select * from skmt1.pedido where substr(pe_fecha, 1, 10) = '${fechaHoy}'"$) + rkmt.TransactionSuccessful 'Si no se pone TransactionSuccessful no se escribe NADA!! + rkmt.EndTransaction +' Log(((DateTime.Now - inicio)/1000) & " segs") +End Sub + + +'Copia la tabla CAT_GUNAPRODS a rkmt.db en la tarjeta del celular. +Sub respaldaInventarios +' Log($"Borrando de fecha ${fechaHoy}"$) + Private inicio As String = DateTime.Now +' Log("copiando inventarios ...") +' rkmt.ExecNonQuery($"delete from inventarios where substr(fecha, 1, 10) = '${fechaHoy}'"$) + rkmt.BeginTransaction + rkmt.ExecNonQuery($"delete from inventarios where fecha = '${fechaHoy}'"$) + rkmt.ExecNonQuery($"insert into inventarios (cat_gp_iniciativa, cat_gp_tipoprod, cat_gp_dev, cat_gp_almacen, 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, fecha) select cat_gp_iniciativa, cat_gp_tipoprod, cat_gp_dev, cat_gp_almacen, 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, '${fechaHoy}' as fecha from skmt1.cat_gunaprod"$) + rkmt.TransactionSuccessful 'Si no se pone TransactionSuccessful no se escribe NADA!! + rkmt.EndTransaction +' Log(((DateTime.Now - inicio)/1000) & " segs") +End Sub + +'Copia la tabla CAT_DETALLE_PAQ a rkmt.db en la tarjeta del celular. +Sub respaldaPaquetes + Private inicio As String = DateTime.Now +' Log("copiando paquetes ...") + rkmt.BeginTransaction +' rkmt.ExecNonQuery($"delete from paquetes where substr(fecha, 1, 10) = '${fechaHoy}'"$) + rkmt.ExecNonQuery($"delete from paquetes where fecha = '${fechaHoy}'"$) + rkmt.ExecNonQuery($"insert into paquetes (cat_dp_precio_simptos, cat_dp_precio, 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, fecha) select cat_dp_precio_simptos, cat_dp_precio, 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, '${fechaHoy}' as fecha from skmt1.cat_detalles_paq"$) + rkmt.TransactionSuccessful 'Si no se pone TransactionSuccessful no se escribe NADA!! + rkmt.EndTransaction +' Log(((DateTime.Now - inicio)/1000) & " segs") +End Sub + +Sub vacuum + Log("Vacuum") + rkmt.ExecNonQuery("vacuum;") +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +'Agrega una columna a la tabla especificada. +'Hay que indicar el "tipo" de la columna (TEXT, INTEGER, ETC) +'Ej. agregaColumna("TABLA", "COLUMNA", "TIPO") +Sub agregaColumna(tabla As String, columna As String, tipo As String) 'ignore + Try 'Intentamos usar "pragma_table_info" para revisar si existe la columna en la tabla + Private c As Cursor = B4XPages.MainPage.skmt.ExecQuery($"SELECT COUNT(*) AS fCol FROM pragma_table_info('${tabla}') WHERE name='${columna}'"$) + c.Position = 0 + If c.GetString("fCol") = 0 Then 'Si no esta la columna la agregamos + B4XPages.MainPage.skmt.ExecNonQuery($"ALTER TABLE ${tabla} ADD COLUMN ${columna} ${tipo}"$) + Log($"Columna "${columna} ${tipo}", agregada a "${tabla}"."$) + End If + Catch 'Si no funciona "pragma_table_info" lo hacemos con try/catch + Try + B4XPages.MainPage.skmt.ExecNonQuery($"ALTER TABLE ${tabla} ADD COLUMN ${columna} ${tipo}"$) + Log($"Columna "${columna} ${tipo}", agregada a "${tabla}".."$) + Catch + Log(LastException) + End Try + End Try +End Sub \ No newline at end of file diff --git a/B4A/C_Subs.bas b/B4A/C_Subs.bas new file mode 100644 index 0000000..2a7a1f3 --- /dev/null +++ b/B4A/C_Subs.bas @@ -0,0 +1,608 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=12.2 +@EndOfDesignText@ +Sub Class_Globals + 'These global variables will be declared once when the application starts. + 'These variables can be accessed from all modules. +' Public GZip As GZipStrings 'Usa la libreria CompressStrings +' Private su As StringUtils 'Usa la libreria StringUtils + Dim reqManager As DBRequestManager + Private EventName As String 'ignore + Private CallBack As Object 'ignore + Dim phn As Phone + Dim devModel As String + Dim db, kmt, errorLog As SQL 'Requiere la libreria "SQL" 'ignore + Dim ssid As String 'ignore + Dim reqsList As List + Dim reqError As Boolean = False + Private subsLogs As Boolean = False +End Sub + +'You can add more parameters here. +Public Sub Initialize (vCallback As Object, vEventName As String) As Object + reqsList.Initialize + EventName = vEventName + CallBack = vCallback + db = dbInit + reqManager = reqManagerInit + Return Me +End Sub + +'Inicializa la BD con "kmt.db" en File.DirInternal, si el archivo no existe, lo copia desde File.DirAssets. +'Dispara el evento "dbOk" cuando termina. +Sub dbInit As SQL + If File.Exists(File.DirInternal, "kmt.db") = False Then File.Copy(File.DirAssets, "kmt.db", File.DirInternal, "kmt.db") + db.Initialize(File.DirInternal,"kmt.db", True) + dbOk(True) +' Log(db.IsInitialized) + Return db +End Sub + +Sub dbOk(Success As Boolean) + If SubExists(CallBack, EventName & "_dbOk") Then + CallSub2(CallBack, EventName & "_dbOk", Success) + End If +End Sub + +'Inicializamos el DBReqServer. +Sub reqManagerInit As DBRequestManager + Private rm As DBRequestManager + rm.Initialize(Me, traeDBReqServerDeBD(db)) + Log($"Inicializamos reqManager con ${traeDBReqServerDeBD(db)}"$) + Return rm +End Sub + +'Reinicializamos el DBReqServer de C_Subs. +Sub reqManagerReInit + Log("reqManager ReInit") + reqManager = reqManagerInit +End Sub + +Sub envioTest + reqsList.Initialize ' Ponemos la lista de DBRequests en cero. + Private cmd As DBCommand + cmd.Initialize + cmd.Name = "select_fecha" + For i = 0 To 50 +' Sleep(200) + reqManager.ExecuteQuery(cmd, 0, $"select_fecha_${i}"$) + reqsList.Add($"select_fecha_${i}"$) + Next +End Sub + +'Dispara el evento "_envioOk" del caller. +Sub envioOk(Success As Boolean) +' Log($"_ENVIOOK_"$) + If SubExists(CallBack, EventName & "_envioOk") Then + CallSub2(CallBack, EventName & "_envioOk", Success) + End If +End Sub + +Sub JobDone(Job As HttpJob) + LogColor("C_SUBS JOBDONE - " & Job.Success, Colors.Red) + If Job.Success = False Then + Log($"Error en el request ${Job.Tag}"$) + LogColor("** " & Job.Tag & " Error: " & Job.ErrorMessage, Colors.Red) + If reqsList.IndexOf(Job.Tag) > -1 Then reqsList.RemoveAt(reqsList.IndexOf(Job.Tag)) + reqError = True + Else + If Job.JobName = "DBRequest" Then + Dim resultado As DBResult = reqManager.HandleJob(Job) + If reqsList.IndexOf(resultado.Tag) > -1 Then reqsList.RemoveAt(reqsList.IndexOf(resultado.Tag)) + If resultado.Tag = "select_fecha" Then + 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 + End If + Log(reqsList.Size) + If reqsList.Size = 0 Then 'Ya no hay DBReqs pendientes. + Log(reqError) + If Not(reqError) Then + envioOk(True) + Else + envioOk(False) + End If + reqError = False + Log("-= FIN =-") + End If + Job.Release +End Sub + +'Pone el valor de phn.Model en la variable global "devModel" +Sub getPhnId As String 'ignore + 'Requiere la libreria "Phone" + devModel = phn.Model + If devModel.Length <= 3 Then 'Si phn.Model esta en blanco ... + Dim t As String = phn.GetSettings("android_id") 'Intentamos con "android_id" + devModel = t + End If + If devModel.Length >= 3 Then 'Si tenemos valor para phn.Model + File.WriteString(File.DirInternal, "phnId.txt", devModel) 'Sobreescribimos archivo phnId.txt with deviceId +' Log("Tenemos phnId: "&devModel&" "&File.DirInternal&"/phn.txt sobreescrito") + Else If devModel.Length < 3 Then ' Si no tenemos valor, lo leemos de phnId.txt + Dim s As String = File.ReadString(File.DirInternal, "phnId.txt") + devModel = s +' Log("Leemos id de "&File.DirInternal&"/phnId.txt") +' Log(devModel) + End If + Return devModel +End Sub + +'Convierte una fecha al formato yyMMddHHmmss +Sub fechaKMT(fecha As String) As String 'ignore +' Log(fecha) + Dim OrigFormat As String = DateTime.DateFormat 'save orig date format + DateTime.DateFormat="yyMMddHHmmss" + Dim nuevaFecha As String=DateTime.Date(fecha) + DateTime.DateFormat=OrigFormat 'return to orig date format +' Log(nuevaFecha) + Return nuevaFecha +End Sub + +'Escribimos las coordenadas y fecha a un archivo de texto +Sub guardaInfoEnArchivo(coords As String) 'ignore + ' Cambiamos el formato de la hora + Dim OrigFormat As String=DateTime.DateFormat 'save orig date format + DateTime.DateFormat="MMM-dd HH:mm:ss" + Dim lastUpdate As String=DateTime.Date(DateTime.Now) + DateTime.DateFormat=OrigFormat 'return to orig date format + + Dim ubic As String = coords&","&lastUpdate + Dim out As OutputStream = File.OpenOutput(File.DirRootExternal, "gps.txt", True) + Dim s As String = ubic & CRLF + Dim t() As Byte = s.GetBytes("UTF-8") + out.WriteBytes(t, 0, t.Length) + out.Close +End Sub + +'Escribimos las coordenadas (latitud, longitud, fecha) y fecha a una BD +Sub guardaInfoEnBD(coords As String) 'ignore + Log("Guardamos ubicacion en BD - "&coords) + Try + Dim latlon() As String = Regex.Split("\|", coords) + If latlon.Length < 2 Then latlon = Regex.Split(",", coords) 'Si son menos de 2, entonces estan separadas por comas y no por "|" + If subsLogs Then Log("LatLon="&latlon) + kmt.ExecNonQuery2("INSERT INTO RUTA_GPS(FECHA, LAT, LON) VALUES (?,?,?)", Array As Object (latlon(2),latlon(0),latlon(1))) + Catch + LogColor(LastException, Colors.red) + End Try +End Sub + +'Limpiamos la tabla RUTA_GPS de la BD +Sub deleteGPS_DB 'ignore + kmt.ExecNonQuery("delete from RUTA_GPS") + kmt.ExecNonQuery("vacuum;") + ToastMessageShow("Borramos BD Coords GPS", False) +End Sub + +'Limpiamos la tabla errorLog de la BD +Sub deleteErrorLog_DB 'ignore + errorLog.ExecNonQuery("delete from errores") + errorLog.ExecNonQuery("vacuum;") + ToastMessageShow("BD Errores Borrada", False) +End Sub + +'Mandamos "coords" en un mensaje a "Sprvsr" +'Sub mandamosLoc(coords As String) 'ignore +'' Log("Iniciamos mandamosLoc "&coords) +'' Log("locRequest="&Tracker.locRequest) +' guardaInfoEnBD(coords)'Escribimos coordenadas y fecha a una bd +' Dim t As String +' If Tracker.locRequest="Activa" Then +' If PushService.au = 1 Then +' t = "au" ' es una actualizacion +' Else +' t = "u" ' es una peticion +' End If +' Dim params As Map = CreateMap("topic":"Sprvsr", "coords":coords, "t":t, "b":PushService.battery, "mt":Main.montoActual) +' CallSub2(PushService, "mandaMensaje",params) +' Tracker.locRequest="Enviada" +' CallSubDelayed(Tracker,"CreateLocationRequest") +' End If +'End Sub + +'Regresa la fecha y hora de hoy a las 00:00 en el formato "yyMMddHHMMSS" +Sub fechaInicioHoy As String 'ignore + Dim OrigFormat As String = DateTime.DateFormat 'save orig date format + DateTime.DateFormat="yyMMdd" + Private h As String = DateTime.Date(DateTime.Now)&"000000" + DateTime.DateFormat=OrigFormat 'return to orig date format + Log("Hoy="&h) + Return h +End Sub + +'Guardamos "texto" a la bitacora +Sub log2DB(texto As String) 'ignore + LogColor(fechaKMT(DateTime.Now)&" - log2BD: '"&texto&"'", Colors.LightGray) + kmt.ExecNonQuery2("INSERT INTO bitacora(fecha, texto) VALUES (?,?)", Array As Object (fechaKMT(DateTime.now), texto)) +End Sub + +'Regresa verdadero si ya pasaron XX minutos de la fecha dada +Sub masDeXXMins(hora As Int, mins As Int) As Boolean 'ignore + If (hora + mins * DateTime.TicksPerMinute) < DateTime.Now Then + Return True + Else + Return False + End If +End Sub + +'Regresa verdadero si ya pasaron XX minutos de la fechaKMT dada +Sub masDeXXMinsKMT(hora As String, mins As Int) As Boolean 'ignore + Try + ' LogColor($"Hora=${fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute)}, Mins=${mins}, Actual=${fechaKMT(DateTime.Now)}"$,Colors.red) + If fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute < DateTime.Now Then + ' Log("+++ +++ "&fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute) & " < " & fechaKMT(DateTime.Now)) + Return True + Else + ' Log("+++ +++ "&fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute) & " > " & fechaKMT(DateTime.Now)) + Return False + End If + Catch + Log(LastException) + End Try +End Sub + +'Limpiamos la tabla "bitacora" de la BD +Sub borraLogDB 'ignore + LogColor("Borramos BD de log", Colors.Magenta) + kmt.ExecNonQuery("delete from bitacora") + kmt.ExecNonQuery("vacuum;") +End Sub + +'Monitoreamos los servicios para ver si estan activos (No pausados), y si no, los reniciamos +'Sub Monitor 'ignore +' Private monitorStatus As Boolean = True +' LogColor("Corriendo Subs.Monitor", Colors.RGB(161,150,0)) +' If IsPaused(Tracker) Then +' log2DB("Reiniciando 'Tracker Pausado' desde Subs.Monitor") +' StartService(Tracker) +' monitorStatus = False +' Else +' CallSubDelayed(Tracker, "revisaFLP") +' End If +' If IsPaused(PushService) Then +' log2DB("Reiniciando 'PushService Pausado' desde Subs.Monitor") +' StartService(PushService) +' monitorStatus = False +' Else +' revisaPushService +' End If +' If monitorStatus Then LogColor(" +++ +++ Servicios Activos", Colors.Green) +'End Sub + +'Convierte una fecha en formato YYMMDDHHMMSS a Ticks +Sub fechaKMT2Ticks(fKMT As String) As Long 'ignore + Try + If fKMT.Length = 12 Then + Private parteFecha As String = fKMT.SubString2(0,6) + Private parteHora As String = fKMT.SubString(6) + Private OrigFormat As String = DateTime.DateFormat 'save original date format + DateTime.DateFormat="yymmdd" + DateTime.TimeFormat="HHmmss" + Private ticks As Long = DateTime.DateTimeParse(parteFecha,parteHora) + DateTime.DateFormat=OrigFormat 'return to original date format + Return ticks + Else + Log("Formato de fecha incorrecto, debe de ser 'YYMMDDHHMMSS', no '"&fKMT&"' largo="&fKMT.Length) + Return 0 + End If + Catch + Log(LastException) + LogColor($"Fecha dada: ${fKMT}, Parte Fecha: ${parteFecha}, Parte Hora: ${parteHora}"$, Colors.Red) + Return 0 + End Try +End Sub + +Sub InstallAPK(dir As String, apk As String) 'ignore + If File.Exists(dir, apk) Then + Dim i As Intent + i.Initialize(i.ACTION_VIEW, "file://" & File.Combine(dir, apk)) + i.SetType("application/vnd.android.package-archive") + StartActivity(i) + End If +End Sub + +'Copia la base de datos del almacenamiento interno al externo en el directorio kmts. +Sub copiaDB(result As Boolean) 'ignore + ToastMessageShow("copiaDB", False) + If result Then + Dim p As String + If File.ExternalWritable Then + p = File.DirRootExternal +' Log("Externo") + Else + p = File.DirInternal +' Log("Interno") + End If + Dim theDir As String + Try + File.MakeDir(File.DirRootExternal,"kmts") + theDir = "/kmts" + Catch + theDir = "" + End Try + Try + File.Copy(File.DirInternal,"kmt.db",File.DirRootExternal&theDir,"cedex_kmt.db") + File.Copy(File.DirInternal,"errorLog.db",File.DirRootExternal&theDir,"cedex_errorLog.db") + ToastMessageShow("BD copiada!", False) + Catch + ToastMessageShow("No se pudo hacer la copia: "&LastException, True) + End Try + Log("rootExternal="&p) + Log("File.DirInternal="&File.DirInternal) + Log("File.DirRootExternal="&File.DirRootExternal) + Else + ToastMessageShow("Sin permisos", False) + End If +End Sub + +'Hace visible y trae al frente el panel con los parametros "Top" y "Left" dados. +Sub panelVisible(panel As Panel, top As Int, left As Int) 'ignore + panel.BringToFront + panel.Visible = True + panel.Top = top + panel.Left = left +End Sub + +'Centra una etiqueta dentro de un elemento superior. +Sub centraEtiqueta(elemento As Label, anchoElementoSuperior As Int) 'ignore + elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2) +End Sub + +'Centra un panel horizontalmente dentro de un elemento superior. +Sub centraPanel(elemento As Panel, anchoElementoSuperior As Int) 'ignore + elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2) +End Sub + +'Centra un panel verticalmente dentro de un elemento superior. +Sub centraPanelV(elemento As Panel, altoElementoSuperior As Int) 'ignore + elemento.Top = Round(altoElementoSuperior/2)-(elemento.Height/2) +End Sub + +'Centra una barra de progreso dentro de un elemento superior. +Sub centraProgressBar(elemento As ProgressBar, anchoElementoSuperior As Int) 'ignore + elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2) +End Sub + +'Regresa el usuario de la tabla USUARIOA si es que existe, si no existe, regresa "SinUsuario". +Sub buscaDBUsuario As String 'ignore + Private c As Cursor + Private usuario As String = "SinUsuario" + c=kmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + If c.RowCount > 0 Then usuario = c.GetString("USUARIO") + Return usuario +End Sub + +'Regresa la fecha en el formato "MM/dd/yyyy" +Sub traeFecha As String 'ignore + DateTime.DateFormat = "MM/dd/yyyy" + Private sDate As String = DateTime.Date(DateTime.Now) + Private sTime As String = DateTime.Time(DateTime.Now) + Return sDate & sTime +End Sub + +'Guarda el nombre y version de la app en CAT_VARIABLES. +Sub guardaAppInfo(skmt As SQL) 'ignore + skmt.ExecNonQuery("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'EMPRESA' or CAT_VA_DESCRIPCION = 'APP_NAME' or CAT_VA_DESCRIPCION = 'APP_VERSION'") + skmt.ExecNonQuery($"insert into CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) values ('APP_NAME', '${Application.LabelName}')"$) + skmt.ExecNonQuery($"insert into CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) values ('APP_VERSION', '${Application.VersionName}')"$) +End Sub + +'Muestra en el Log los campos y valores que regresan en el JobDone. +Sub logJobDoneResultados(resultado As DBResult) 'ignore + For Each records() As Object In resultado.Rows + LogColor($"====== ${resultado.Tag} - REGISTROS = ${resultado.Rows.Size}"$, Colors.RGB(215,37,0)) + For Each k As String In resultado.Columns.Keys + LogColor(k & " = " & records(resultado.Columns.Get(k)), Colors.RGB(215,37,0)) + Next + Next +End Sub + +'Regresa la base de datos especificada ya inicializada. +Sub inicializaBD(ruta As String, BDName As String) As SQL 'ignore + Dim skmt As SQL + If File.Exists(ruta, BDName) = False Then + File.Copy(File.DirAssets, BDName, ruta, BDName) + LogColor($"Copiamos ${BDName} de ${File.DirAssets} a ${ruta}"$,Colors.Green) + End If + skmt.Initialize(ruta, BDName, True) + Return skmt +End Sub + +'Agrega una columna a la tabla especificada. +'Hay que indicar el "tipo" de la columna (TEXT, INTEGER, ETC) +'Ej. agregaColumna("TABLA", "COLUMNA", "TIPO") +Sub agregaColumna(tabla As String, columna As String, tipo As String) 'ignore + Try 'Intentamos usar "pragma_table_info" para revisar si existe la columna en la tabla + Private c As Cursor = db.ExecQuery($"SELECT COUNT(*) AS fCol FROM pragma_table_info('${tabla}') WHERE name='${columna}'"$) + c.Position = 0 + If c.GetString("fCol") = 0 Then 'Si no esta la columna la agregamos + db.ExecNonQuery($"ALTER TABLE ${tabla} ADD COLUMN ${columna} ${tipo}"$) + Log($"Columna "${columna} ${tipo}", agregada a "${tabla}"."$) + End If + Catch 'Si no funciona "pragma_table_info" lo hacemos con try/catch + Try + db.ExecNonQuery($"ALTER TABLE ${tabla} ADD COLUMN ${columna} ${tipo}"$) + Log($"Columna "${columna} ${tipo}", agregada a "${tabla}".."$) + Catch + Log(LastException) + End Try + End Try +End Sub + +'Regresa el DBReqServer desde CAT_VARIABLES o "N/A" si no existe. +Sub traeDBReqServerDeBD(dbx As SQL) As String 'ignore + Dim srvr As String = "N/A" + Dim rs As ResultSet = dbx.ExecQuery("select CAT_VA_VALOR from cat_variables where CAT_VA_DESCRIPCION = 'SERVER'") + If rs.RowCount > 0 Then + rs.NextRow + srvr = rs.GetString("CAT_VA_VALOR") + End If + Return srvr +End Sub + +'Regresa el valor de intervalo desde CAT_VARIABLES o "30" si no existe. +Sub traeIntervaloDeBD As String 'ignore + Dim intrvl As String = "30" + Dim rs As ResultSet = db.ExecQuery("select valor from cat_variables where nombre = 'intervalo'") + If rs.RowCount > 0 Then + rs.NextRow + intrvl = rs.GetString("valor") + End If + Return intrvl +End Sub + +'Regresa el valor timeout desde CAT_VARIABLES o "9000" si no existe. +Sub traeTimeoutDeBD As String 'ignore + Dim tmout As String = "9000" + Dim rs As ResultSet = db.ExecQuery("select valor from cat_variables where nombre = 'timeout'") + If rs.RowCount > 0 Then + rs.NextRow + tmout = rs.GetString("valor") + End If + Return tmout +End Sub + +'Crea una notificación con el "body" dado y regresa el objeto. +Sub CreateNotification (Body As String) As Notification 'ignore + Dim notification As Notification + notification.Initialize2(notification.IMPORTANCE_LOW) + notification.Icon = "icon" + notification.SetInfo("Tester", Body, Main) + Return notification +End Sub + +'Genera una notificacion con importancia alta +Sub notiHigh(title As String, body As String, id As String, activity As Object) 'ignore + activity = Main + Private notif As Notification + notif.Initialize2(notif.IMPORTANCE_HIGH) + notif.Icon = "icon" + notif.Vibrate = False + notif.Sound = False + notif.AutoCancel = True +' If logger Then Log("notiHigh: "&title) + notif.SetInfo(title, body, activity) +' Log("notiHigh SetInfo") + notif.Notify(id) +End Sub + +'Regresa el objeto de una notificacion con importancia baja +Sub notiLowReturn(title As String, Body As String, id As Int) As Notification 'ignore + Private notification As Notification + notification.Initialize2(notification.IMPORTANCE_LOW) +' Log("notiLowReturn: "&title) + notification.Icon = "icon" + notification.Sound = False + notification.Vibrate = False + notification.SetInfo(title, Body, Main) + notification.Notify(id) +' Log("notiLowReturn SetInfo") + Return notification +End Sub + +'Regresa el almacen actual de la base de datos. +Sub traeAlmacen As String 'ignore + Private c As Cursor + Private a As String + c = db.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + c.Position = 0 + a = C.GetString("ID_ALMACEN") + c.Close + Return a +End Sub + +'Regresa la ruta actual de la base de datos. +Sub traeRuta As String 'ignore + Private c As Cursor + Private r As String + c = db.ExecQuery("select CAT_CL_RUTA from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)") + r = "0" + If c.RowCount > 0 Then + c.Position=0 + r = c.GetString("CAT_CL_RUTA") + End If + c.Close + Return r +End Sub + +'Mandamos los pedidos pendientes (pc_envio_ok <> 1). +Sub mandaPendientes 'ignore + Private logger As Boolean = False + 'PEDIDO_CLIENTE (Pendientes) + Private c As Cursor = db.ExecQuery("SELECT PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT, PC_COSTO_SIN, PC_RUTA, PC_ALMACEN, PC_FACTURA FROM PEDIDO_CLIENTE where pc_envio_ok <> 1") + If logger Then Log($"Pedido_Cliente PENDIENTE: ${c.RowCount}"$) + Private almacen As String = traeAlmacen + Private ruta As String = traeRuta + If c.RowCount>0 Then + For i = 0 To c.RowCount - 1 + c.Position = i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "DELETE_PEDIDO_MARDS_PC" + cmd.Parameters = Array As Object(almacen, ruta, c.GetString("PC_CLIENTE") ) + reqManager.ExecuteCommand(cmd , "DEL_PC") + + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_pedidos_MARDS" + If logger Then Log($"${c.GetString("PC_CLIENTE")}, ${almacen}"$) + cmd.Parameters = Array As Object(C.GetString("PC_CLIENTE"), C.GetString("PC_FECHA"), C.GetString("PC_USER"), C.GetString("PC_NOART"), C.GetString("PC_MONTO"), C.GetString("PC_LON"), C.GetString("PC_LAT"), almacen, ruta, C.GetString("PC_COSTO_SIN"), C.GetString("PC_FACTURA")) + reqManager.ExecuteCommand(cmd , $"ins_pedidosPendientes_head_${c.GetString("PC_CLIENTE")}"$) + Next + End If + + 'PEDIDO (Pendientes) + c=Starter.skmt.ExecQuery("SELECT PC_ENVIO_OK, PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_FECHA, PE_USUARIO, PE_COSTO_SIN, PE_RUTA, PE_DESC, PE_FOLIO FROM pedido_cliente left join PEDIDO where pc_cliente = pe_cliente and pc_envio_ok <> 1") + If logger Then Log($"Pedido PENDIENTE: ${c.RowCount}"$) + If c.RowCount>0 Then + For i = 0 To c.RowCount - 1 + c.Position = i + Dim cmd As DBCommand + + cmd.Initialize + cmd.Name = "DELETE_PEDIDO_MARDS_PE" + cmd.Parameters = Array As Object(almacen, ruta,c.GetString("PE_CLIENTE") ) + reqManager.ExecuteCommand(cmd , "DEL_PE") + + cmd.Initialize + cmd.Name = "insert_pedido_MARDS" + cmd.Parameters = Array As Object(c.GetString("PE_CEDIS"), almacen, c.GetString("PE_COSTO_TOT"), c.GetString("PE_COSTOU"), c.GetString("PE_CANT"), c.GetString("PE_PRONOMBRE"), c.GetString("PE_PROID"), c.GetString("PE_CLIENTE"), c.GetString("PE_FECHA"), c.GetString("PE_USUARIO"), c.GetString("PE_RUTA"), C.GetString("PE_COSTO_SIN"), c.GetString("PE_DESC"), c.GetString("PE_FOLIO")) + reqManager.ExecuteCommand(cmd , $"ins_pedidosPendientes_prods_${c.GetString("PE_CLIENTE")}"$) + Next + End If + + 'ABONOS + Dim ab As Cursor = db.ExecQuery($"SELECT * from ABONOS where a_enviado is null"$) + If logger Then Log(ab.RowCount) + If ab.RowCount > 0 Then + For i = 0 To ab.RowCount - 1 + ab.Position = i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_abono_MARDS" + cmd.Parameters = Array As Object( ab.GetString("a_usuario"), ab.GetString("a_ruta"), ab.GetString("a_cliente"), ab.GetString("a_abono"), ab.GetString("a_fecha") ) + reqManager.ExecuteCommand(cmd , $"ins_abonosPendientes_${ab.GetString("a_cliente")}"$) + If logger Then Log($"ins_abonosPendientes_${ab.GetString("a_cliente")}"$) + Next + End If + ab.Close +End Sub + +'Revisa si la aplicación tiene permiso para acceder a las notificaciones. +Sub CheckNotificationAccess As Boolean 'ignore + Dim ph As Phone + Dim nstr, pstr As String + Dim r As Reflector + pstr = r.GetStaticField("anywheresoftware.b4a.BA", "packageName") + nstr = ph.GetSettings("enabled_notification_listeners") + Return nstr.Contains(pstr) +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..a4eff6b --- /dev/null +++ b/B4A/C_TicketsDia.bas @@ -0,0 +1,164 @@ +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 + Private p_ticketsdia As Panel + + Dim c As Cursor + Dim S As Cursor + Dim ruta As String + Dim ListView1 As ListView + Dim b_noventa As Button + Dim nombre_boton As String + Dim STIME 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 + ruta = File.DirInternal + Root.LoadLayout("ticketsdia") + If File.Exists(ruta, "kmt.db") = False Then + File.Copy(File.DirAssets, "kmt.db", ruta, "kmt.db") + End If + c = B4XPages.MainPage.skmt.ExecQuery("select PC_CLIENTE,PC_MONTO,PC_NOART FROM PEDIDO_CLIENTE ORDER BY PC_FECHA 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 = 13 + label2.TextColor = Colors.Blue + ListView1.AddTwoLines(c.GetString("PC_CLIENTE"),"Cantidad #"& c.GetString("PC_NOART")& " SubTotal $"& c.GetString("PC_MONTO")) + Next + 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 + nombre_boton = "NOVENTA" + c=B4XPages.MainPage.skmt.ExecQuery("select PC_CLIENTE,PC_MONTO,PC_NOART,(select CAT_CL_NOMBRE from kmt_info where cat_cl_codigo = pc_cliente ) as NOMBRE FROM PEDIDO_CLIENTE ORDER BY PC_FECHA asc") + Dim noArticulos As Int = 0 + + ListView1.Clear + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Dim x As Cursor = B4XPages.MainPage.skmt.ExecQuery($"select sum(PE_CANT) as PC_NOART from PEDIDO where PE_CLIENTE = '${c.GetString("PC_CLIENTE")}' AND PE_PROID NOT IN (SELECT CAT_PA_ID FROM PROMOS_COMP)"$) + If x.RowCount > 0 Then + x.Position = 0 +' Log(x.GetString("PC_NOART")) + noArticulos = x.GetString("PC_NOART") + End If + 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 = 13 + label2.TextColor = Colors.Blue + ListView1.AddTwoLines(c.GetString("PC_CLIENTE"),c.GetString("NOMBRE") &" Cantidad #"& noArticulos & " SubTotal $"& c.GetString("PC_MONTO")) + Next + End If + c.Close +End Sub + +Sub Regresar_Click + B4XPages.ShowPage("cliente") +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 + B4XPages.ShowPage("principal") + 'Return True + End If + ' Returning False signals the system to handle the key + Return False +End Sub +Sub ListView1_ItemLongClick (Position As Int, Value As Object) + B4XPages.MainPage.skmt.ExecNonQuery("delete from CUENTAA") + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object(Value)) + DateTime.TimeFormat = "HHmmss" + STIME=DateTime.Time(DateTime.Now) + s=B4XPages.MainPage.skmt.ExecQuery("SELECT COUNT(*) AS CUANTOS FROM HIST_STAY_STORE WHERE HSS_IN = 0 AND HSS_CODIGO In (select cuenta from cuentaa)") + s.Position = 0 + If s.GetString("CUANTOS") = 1 Then + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE HIST_STAY_STORE set HSS_IN = ? where HSS_IN = 0 AND HSS_CODIGO In (select cuenta from cuentaa)", Array As Object(STIME)) + Else + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO HIST_STAY_STORE(HSS_CODIGO, HSS_IN , HSS_OUT , HSS_TOT) VALUES (?,0,0,0)", Array As Object (Value)) + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE HIST_STAY_STORE set HSS_IN = ? where HSS_IN = 0 AND HSS_CODIGO In (select cuenta from cuentaa)", Array As Object(STIME)) + End If + DateTime.TimeFormat = "HH:mm:ss" + Subs.guardaClienteHoraInicio(Value) + B4XPages.MainPage.cliente.venimosDeTicketsDia = True + B4XPages.ShowPage("cliente") +End Sub + +Sub b_noventa_Click + If nombre_boton = "NOVENTA" Then + nombre_boton = "VENTA" + b_noventa.Text ="VENTA" + c=B4XPages.MainPage.skmt.ExecQuery("select NV_CLIENTE,NV_MOTIVO,NV_COMM, (select CAT_CL_NOMBRE from kmt_info where cat_cl_codigo = NV_CLIENTE ) as NOMBRE 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 = 15 + 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"),c.GetString("NOMBRE") &" Motivo #"& c.GetString("NV_MOTIVO")& " Comentario $"& c.GetString("NV_COMM")) + Next + End If + Else + nombre_boton = "NOVENTA" + b_noventa.Text ="NO VENTA" + c=B4XPages.MainPage.skmt.ExecQuery("select PC_CLIENTE,PC_MONTO,PC_NOART,(select CAT_CL_NOMBRE from kmt_info where cat_cl_codigo = pc_cliente ) as NOMBRE FROM PEDIDO_CLIENTE ORDER BY PC_FECHA 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 = 15 + label1.TextColor = Colors.Black + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 10 + label2.TextColor = Colors.Blue + ListView1.AddTwoLines(c.GetString("PC_CLIENTE"),c.GetString("NOMBRE") &" Cantidad #"& c.GetString("PC_NOART")& " SubTotal $"& c.GetString("PC_MONTO")) + Next + End If + c.Close + End If +End Sub + +Private Sub p_ticketsdia_Click + +End Sub \ No newline at end of file diff --git a/B4A/C_UpdateAvailable.bas b/B4A/C_UpdateAvailable.bas new file mode 100644 index 0000000..8bd6e51 --- /dev/null +++ b/B4A/C_UpdateAvailable.bas @@ -0,0 +1,73 @@ +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") + 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/DBRequestManager.bas b/B4A/DBRequestManager.bas new file mode 100644 index 0000000..eb19e28 --- /dev/null +++ b/B4A/DBRequestManager.bas @@ -0,0 +1,274 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=6.8 +@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 - 211109 + Dim reqsList As List +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 + reqsList.Initialize +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) + If reqsList.IsInitialized Then reqsList.Add(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) + If reqsList.IsInitialized Then reqsList.Add(Tag) + ExecuteBatch(Array As DBCommand(Command), Tag) +End Sub + +Private Sub StartJob(j As HttpJob, MemoryStream As OutputStream, Tag As Object) As OutputStream + j.Initialize("DBRequest", mTarget) + j.Tag = Tag + MemoryStream.InitializeToBytesArray(0) + Dim compress As CompressedStreams + Dim out As OutputStream = compress.WrapOutputStream(MemoryStream, "gzip") + WriteObject(VERSION, out) + Return out +End Sub + +Private Sub WriteList(Parameters As List, out As OutputStream) + Dim data() As Byte + If Parameters = Null Or Parameters.IsInitialized = False Then + Dim Parameters As List + Parameters.Initialize + End If + data = bc.IntsToBytes(Array As Int(Parameters.Size)) + out.WriteBytes(data, 0, data.Length) + For Each o As Object In Parameters + WriteObject(o, out) + Next +End Sub + +Private Sub WriteObject(o As Object, out As OutputStream) + Dim data() As Byte + tempArray(0) = o + If tempArray(0) = Null Then + out.WriteBytes(Array As Byte(T_NULL), 0, 1) + Else If tempArray(0) Is Short Then + out.WriteBytes(Array As Byte(T_SHORT), 0, 1) + data = bc.ShortsToBytes(Array As Short(o)) + Else If tempArray(0) Is Int Then + out.WriteBytes(Array As Byte(T_INT), 0, 1) + data = bc.IntsToBytes(Array As Int(o)) + Else If tempArray(0) Is Float Then + out.WriteBytes(Array As Byte(T_FLOAT), 0, 1) + data = bc.FloatsToBytes(Array As Float(o)) + Else If tempArray(0) Is Double Then + out.WriteBytes(Array As Byte(T_DOUBLE), 0, 1) + data = bc.DoublesToBytes(Array As Double(o)) + Else If tempArray(0) Is Long Then + out.WriteBytes(Array As Byte(T_LONG), 0, 1) + data = bc.LongsToBytes(Array As Long(o)) + Else If tempArray(0) Is Boolean Then + out.WriteBytes(Array As Byte(T_BOOLEAN), 0, 1) + Dim b As Boolean = 0 + Dim data(1) As Byte + If b Then data(0) = 1 Else data(0) = 0 + Else If GetType(tempArray(0)) = "[B" Then + data = o + out.WriteBytes(Array As Byte(T_BLOB), 0, 1) + WriteInt(data.Length, out) + Else 'If o Is String Then (treat all other values as string) + out.WriteBytes(Array As Byte(T_STRING), 0, 1) + data = bc.StringToBytes(o, "UTF8") + WriteInt(data.Length, out) + End If + If data.Length > 0 Then out.WriteBytes(data, 0, data.Length) +End Sub + +Private Sub ReadObject(In As InputStream) As Object + Dim data(1) As Byte + In.ReadBytes(data, 0, 1) + Select data(0) + Case T_NULL + Return Null + Case T_SHORT + Dim data(2) As Byte + Return bc.ShortsFromBytes(ReadBytesFully(In, data, data.Length))(0) + Case T_INT + Dim data(4) As Byte + Return bc.IntsFromBytes(ReadBytesFully(In, data, data.Length))(0) + Case T_LONG + Dim data(8) As Byte + Return bc.LongsFromBytes(ReadBytesFully(In, data, data.Length))(0) + Case T_FLOAT + Dim data(4) As Byte + Return bc.FloatsFromBytes(ReadBytesFully(In, data, data.Length))(0) + Case T_DOUBLE + Dim data(8) As Byte + Return bc.DoublesFromBytes(ReadBytesFully(In, data, data.Length))(0) + Case T_BOOLEAN + Dim b As Byte = ReadByte(In) + Return b = 1 + Case T_BLOB + Dim len As Int = ReadInt(In) + Dim data(len) As Byte + Return ReadBytesFully(In, data, data.Length) + Case Else + Dim len As Int = ReadInt(In) + Dim data(len) As Byte + ReadBytesFully(In, data, data.Length) + Return BytesToString(data, 0, data.Length, "UTF8") + End Select +End Sub + +Private Sub ReadBytesFully(In As InputStream, Data() As Byte, Len As Int) As Byte() + Dim count = 0, read As Int + Do While count < Len And read > -1 + read = In.ReadBytes(Data, count, Len - count) + count = count + read + Loop + Return Data +End Sub + +Private Sub WriteInt(i As Int, out As OutputStream) + Dim data() As Byte + data = bc.IntsToBytes(Array As Int(i)) + out.WriteBytes(data, 0, data.Length) +End Sub + +Private Sub ReadInt(In As InputStream) As Int + Dim data(4) As Byte + Return bc.IntsFromBytes(ReadBytesFully(In, data, data.Length))(0) +End Sub + +Private Sub ReadByte(In As InputStream) As Byte + Dim data(1) As Byte + In.ReadBytes(data, 0, 1) + Return data(0) +End Sub + +'Handles the Job result and returns a DBResult. +Public Sub HandleJob(Job As HttpJob) As DBResult + Dim start As Long = DateTime.Now 'ignore + Dim In As InputStream = Job.GetInputStream + Dim cs As CompressedStreams + In = cs.WrapInputStream(In, "gzip") + Dim serverVersion As Float = ReadObject(In) 'ignore + Dim method As String = ReadObject(In) + Dim table As DBResult + table.Initialize + table.Columns.Initialize + table.rows.Initialize + table.Tag = Job.Tag + If jobTagAnterior <> Job.Tag Then LogColor("HandleJob: '"&Job.Tag&"'", Colors.RGB(171,70,0)) 'Mod por CHV - 211109 + jobTagAnterior = Job.Tag 'Mod por CHV - 211109 + If method = "query" Then + Dim numberOfColumns As Int = ReadInt(In) + For i = 0 To numberOfColumns - 1 + table.Columns.Put(ReadObject(In), i) + Next + Do While ReadByte(In) = 1 + Dim rowObjects(numberOfColumns) As Object + table.rows.Add(rowObjects) + For col = 0 To numberOfColumns - 1 + Dim o As Object = ReadObject(In) + rowObjects(col) = o + Next + Loop + Else If method = "batch" Then + table.Columns.Put("AffectedRows", 0) + Dim rows As Int = ReadInt(In) + For i = 0 To rows - 1 + table.rows.Add(Array As Object(ReadInt(In))) + Next + End If + In.Close +' Log("HandleJob: " & (DateTime.Now - start))'Comentado por CHV - 211112 + Return table +End Sub +'Reads a file and returns the file as a bytes array. +Public Sub FileToBytes(Dir As String, FileName As String) As Byte() + Dim out As OutputStream + out.InitializeToBytesArray(0) + Dim In As InputStream = File.OpenInput(Dir, FileName) + File.Copy2(In, out) + out.Close + Return out.ToBytesArray +End Sub +'Converts an image to a bytes array (for BLOB fields). +Public Sub ImageToBytes(Image As Bitmap) As Byte() + Dim out As OutputStream + out.InitializeToBytesArray(0) + Image.WriteToStream(out, 100, "JPEG") + out.Close + Return out.ToBytesArray +End Sub +'Converts a bytes array to an image (for BLOB fields). +Public Sub BytesToImage(bytes() As Byte) As Bitmap + Dim In As InputStream + In.InitializeFromBytesArray(bytes, 0, bytes.Length) + Dim bmp As Bitmap + bmp.Initialize2(In) + Return bmp +End Sub +'Prints the table to the logs. +Public Sub PrintTable(Table As DBResult) + Log("Tag: " & Table.Tag & ", Columns: " & Table.Columns.Size & ", Rows: " & Table.Rows.Size) + Dim sb As StringBuilder + sb.Initialize + For Each col In Table.Columns.Keys + sb.Append(col).Append(TAB) + Next + Log(sb.ToString) + For Each row() As Object In Table.Rows + Dim sb As StringBuilder + sb.Initialize + For Each record As Object In row + sb.Append(record).Append(TAB) + Next + ToastMessageShow(sb.ToString, True) + Next +End Sub + + \ No newline at end of file diff --git a/B4A/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/FileHandler.bas b/B4A/FileHandler.bas new file mode 100644 index 0000000..4bf86e7 --- /dev/null +++ b/B4A/FileHandler.bas @@ -0,0 +1,163 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=11 +@EndOfDesignText@ +'Requiere la librería "ContentResolver" +' +'Copiar este codigo al boton_Click que se quiere que importe la base de datos. +' +' Private Sub b_importarBD_Click +' Private FH As FileHandler +' FH.Initialize +' Wait For (FH.Load) Complete (Result As LoadResult) 'Abre un fileManager para seleccionar la base de datos a importar. +' File.Copy(Result.Dir, Result.FileName, File.DirInternal, "kmt.db") 'Copia la base de datos seleccionada al directorio interno. +' Starter.skmt.Initialize(Starter.ruta,"kmt.db", True) 'Reiniciliza la base de datos con la recien importada. +' ToastMessageShow("¡BD importada!", False) +' End Sub + +Sub Class_Globals + #if B4A + Private ion As Object + Private OldIntent As Intent + #end if + Type LoadResult (Success As Boolean, Dir As String, FileName As String, RealName As String, Size As Long, Modified As Long, MimeType As String) + +End Sub + +Public Sub Initialize + +End Sub + +#if B4A +Public Sub SaveAs (Source As InputStream, MimeType As String, Title As String) As ResumableSub + Dim intent As Intent + intent.Initialize("android.intent.action.CREATE_DOCUMENT", "") + intent.AddCategory("android.intent.category.OPENABLE") + intent.PutExtra("android.intent.extra.TITLE", Title) + intent.SetType(MimeType) + StartActivityForResult(intent) + Wait For ion_Event (MethodName As String, Args() As Object) + If -1 = Args(0) Then 'resultCode = RESULT_OK + Dim result As Intent = Args(1) + Dim jo As JavaObject = result + Dim ctxt As JavaObject + Dim out As OutputStream = ctxt.InitializeContext.RunMethodJO("getContentResolver", Null).RunMethod("openOutputStream", Array(jo.RunMethod("getData", Null))) + File.Copy2(Source, out) + out.Close + Return True + End If + Return False +End Sub + +Public Sub Load As ResumableSub + Dim cc As ContentChooser + cc.Initialize("cc") + cc.Show("application/octet-stream", "Choose text file") + Wait For CC_Result (Success As Boolean, Dir As String, FileName As String) + Log($"***************************${CRLF}${Dir}${CRLF} ${FileName}"$) + Dim res As LoadResult = CreateLoadResult(Success, Dir, FileName) + Log($"***************************${CRLF}${res.FileName}${CRLF} ${res}"$) + If res.Success Then ExtractInformationFromURI(res.FileName, res) + Return res +End Sub + +Private Sub StartActivityForResult(i As Intent) + Dim jo As JavaObject = GetBA + ion = jo.CreateEvent("anywheresoftware.b4a.IOnActivityResult", "ion", Null) + jo.RunMethod("startActivityForResult", Array(ion, i)) +End Sub + +Private Sub GetBA As Object + Return Me.As(JavaObject).RunMethod("getBA", Null) +End Sub + +Private Sub ExtractInformationFromURI (Uri As String, res As LoadResult) + Try + + Dim resolver As ContentResolver + resolver.Initialize("") + Dim u As Uri + u.Parse(Uri) + Dim rs As ResultSet = resolver.Query(u, Null, "", Null, "") + If rs.NextRow Then + Dim columns As B4XSet = B4XCollections.CreateSet + For i = 0 To rs.ColumnCount - 1 + columns.Add(rs.GetColumnName(i)) + Next + If columns.Contains("_display_name") Then res.RealName = rs.GetString("_display_name") + If columns.Contains("_size") Then res.Size = rs.GetLong("_size") + If columns.Contains("last_modified") Then res.Modified = rs.GetLong("last_modified") + If columns.Contains("mime_type") Then res.MimeType = rs.GetString("mime_type") + End If + rs.Close + + Catch + Log("error extracting information from file provider") + Log(LastException) + End Try +End Sub + +Public Sub CheckForReceivedFiles As LoadResult + Dim Activity As Activity = B4XPages.GetNativeParent(B4XPages.MainPage) + If IsRelevantIntent(Activity.GetStartingIntent) Then + Dim in As Intent = Activity.GetStartingIntent + Dim uri As String + If in.HasExtra("android.intent.extra.STREAM") Then + uri = in.As(JavaObject).RunMethod("getParcelableExtra", Array("android.intent.extra.STREAM")) + Else + uri = in.GetData + End If + Dim res As LoadResult = CreateLoadResult(True, "ContentDir", uri) + ExtractInformationFromURI(res.FileName, res) + Return res + End If + Return CreateLoadResult(False, "", "") +End Sub + +Private Sub IsRelevantIntent(in As Intent) As Boolean + If in.IsInitialized And in <> OldIntent And in.Action = in.ACTION_VIEW Then + OldIntent = in + Return True + End If + Return False +End Sub + +#else if B4i +Public Sub SaveAs(ParentPage As Object, AnchorView As Object, Text As String) As ResumableSub + Dim avc As ActivityViewController + avc.Initialize("avc", Array(Text)) + avc.Show(B4XPages.GetNativeParent(ParentPage), AnchorView) + Wait For avc_Complete (Success As Boolean, ActivityType As String) + Return Success +End Sub + +Public Sub Load (ParentPage As Object, AnchorView As Object) As ResumableSub + Dim DocumentPicker As DocumentPickerViewController + DocumentPicker.InitializeImport("picker", Array("public.text")) + DocumentPicker.Show(B4XPages.GetNativeParent(ParentPage), AnchorView) + Wait For Picker_Complete (Success As Boolean, URLs As List) + If Success And URLs.Size > 0 Then + Return UrlToLoadResult(URLs.Get(0)) + End If + Return CreateLoadResult(False, "", "") +End Sub + +Public Sub UrlToLoadResult(url As String) As LoadResult + Dim res As LoadResult = CreateLoadResult(IIf(File.Exists(url, ""), True, False), url, "") + res.RealName = res.Dir.SubString(res.Dir.LastIndexOf("/") + 1) + res.Size = File.Size(res.Dir, "") + Return res +End Sub +#end if + +Private Sub CreateLoadResult (Success As Boolean, Dir As String, FileName As String) As LoadResult + Dim t1 As LoadResult + t1.Initialize + t1.Success = Success + t1.Dir = Dir + t1.FileName = FileName + Return t1 +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 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

pV;E;n;yZJ7-TWMP_hFF&pI0jD9Xe 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/anterior.jpg b/B4A/Files/anterior.jpg new file mode 100644 index 0000000000000000000000000000000000000000..48e56e42dd1fbae050bea72ec09ddffadcc03001 GIT binary patch literal 19358 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/carrito.png b/B4A/Files/carrito.png new file mode 100644 index 0000000000000000000000000000000000000000..03889f677a4efd00995fc8da3043861424aa6a35 GIT binary patch literal 22596 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/cliente.bal b/B4A/Files/cliente.bal new file mode 100644 index 0000000000000000000000000000000000000000..5f2cd4330aec03809743a78f82496500841a89fc GIT binary patch literal 35459 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/datoscliente.bal b/B4A/Files/datoscliente.bal new file mode 100644 index 0000000000000000000000000000000000000000..d122f9ff88bb7e827f55d86bc6a7d120c2a17462 GIT binary patch literal 3267 zcmc&!OLH4V5ME))AmR`n34~`H9>GZz;Rny~h!xAJ3Mg`L9Lxza+8tX1t6kOZNRCq+ zQpJS|P?f3_DXv^8t{gaU;*z+0gA*tC2XNzNzOUt7OG4&Ru7s_c*`Ds6Z@RzknVjP| z=QECTH~zaY?!qX!*0haXy%%yZSu94X+0@YxbnZoWH%%2))BdJD2ZgNj5IhrU*EL~4 zw;*iPu=I@%tQJM9p`&n9!84ohd&-6}HG+Fq1wFX39)=@7#46t%m>EnKgNG+F{Sx`k zE}4ljHYUpN0>*()sU^m_`IYsXZ;!oISgWibJ^apCwYXLo`!y;YySb-YT|b?BGn$yZ zJpJ+aLsx%yKKb^iA4b>qUD-8%ZR*F#YhV5R&EC&GA30JfjMyusOO4&%Is3o7e&{{m z&R{SeH(pq6>c=3JYbrKwv8-dW9O$TcMq8CI%uFo&2GM>WY$`AfWx;B>70I8$dy!gE zHD4bZ0AAj-6=y;}jFQzu@GK_VdQIffr7wxnZ4|7k8oIkB$lg-R_s_YJ*1-r?CUE_h zrx%R%#q$HzR?L>!1lY~|n<@ep1gVTw%RI<(2k}IZ5LvIbi4F4Mp=}iz71(h?`FhE+ ztTt?N^NR6oozQh{mg|-q>nd>TVI&wGk&eedG+xY}8GjhlAo``d{?d071H2OkJEScd zTb~IdR54BrZ01@Rc{-AGww8+wmu$JRVP1Kr6${C}Zc8m0whmZHukT9G(o~*jg5~W} zkc%fNbYIC1zHgebxg_PN&Q)gzUcjX=u%#6phn-?`$vrGiz2u`)8z>*EP?={eMz~RDVAqXmCjcd z2-Z%|WW^We&a!?J5_$JqLhU3y@E-AqlXI0aPoEimcXWovDIS=#{XSl3a&S7_fVj94+UOn zUSSdLr$EyK7=pJKLN2op^U#BsG9D&gQxWzj0;?~YM<`%8k0t^aS-vkrk8|QO{{$up z{Q!imj7AeRGdhSd%ygc_5XerB8yg!>B^vyl?9-UI!FdKFmyz80v>EmmoHGmV_(FO$_l$htX`t&WlXP7IF2c0sf%y6-T=PY8^ZT>2og8j zE6pTDf>N%LlYJFZrx9;C-z->h0M-)y_Tddv9hR6 literal 0 HcmV?d00001 diff --git a/B4A/Files/durakelo.png b/B4A/Files/durakelo.png new file mode 100644 index 0000000000000000000000000000000000000000..e1c956c4a8f40776c8f62ee4196a2cc5ac587ead GIT binary patch literal 7098 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 l>S-IKG#z>!MytgFfb0M)hYTJ~qcU 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/folioabono.bal b/B4A/Files/folioabono.bal new file mode 100644 index 0000000000000000000000000000000000000000..0cac5951602fad6c9eb2ab1394266712ad6aa7b2 GIT binary patch literal 2431 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 N002ovPDHLkV1l*Gg!=#h literal 0 HcmV?d00001 diff --git a/B4A/Files/hacer pedido.jpg b/B4A/Files/hacer pedido.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eee236f9ea60413695065d48946360a0f5f7796d GIT binary patch literal 609560 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