From 8b5dc8a2a92bf5e6a791d9f977c077eb5883e180 Mon Sep 17 00:00:00 2001 From: Jose Alberto Guerra Ugalde Date: Fri, 26 Dec 2025 13:50:34 -0600 Subject: [PATCH] VERSION 5.12.04 - Commit inicial --- B4A/ADM.b4a | 1197 +++++++++ B4A/ADM.b4a.meta | 102 + B4A/B4XMainPage.bas | 1309 ++++++++++ B4A/BatteryUtilities.bas | 126 + B4A/C_BItacora.bas | 237 ++ B4A/C_Cliente.bas | 3210 +++++++++++++++++++++++++ B4A/C_Clientes.bas | 516 ++++ 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 | 343 +++ B4A/C_Pedidos.bas | 584 +++++ B4A/C_Principal.bas | 2785 +++++++++++++++++++++ B4A/C_Productos.bas | 1640 +++++++++++++ B4A/C_Promos.bas | 607 +++++ B4A/C_RespaldoDiario.bas | 171 ++ B4A/C_Subs.bas | 608 +++++ B4A/C_TicketsDia.bas | 165 ++ B4A/C_UpdateAvailable.bas | 73 + B4A/CameraExClass.bas | 401 +++ B4A/DBRequestManager.bas | 274 +++ B4A/EscPosPrinter.bas | 1158 +++++++++ B4A/FileHandler.bas | 163 ++ B4A/Files/abordo.png | Bin 0 -> 2146 bytes 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/bus-ar.png | Bin 0 -> 31189 bytes B4A/Files/carrito.png | Bin 0 -> 22596 bytes B4A/Files/celltitle.bal | Bin 0 -> 1638 bytes B4A/Files/cliente.bal | Bin 0 -> 46573 bytes B4A/Files/clientes.bal | Bin 0 -> 7977 bytes B4A/Files/datoscliente.bal | Bin 0 -> 3719 bytes B4A/Files/desvanecido.png | Bin 0 -> 3752 bytes B4A/Files/durakelo.png | Bin 0 -> 7098 bytes B4A/Files/engrane.jpg | Bin 0 -> 2292 bytes B4A/Files/engrane.png | Bin 0 -> 2637 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/gps20.png | Bin 0 -> 8326 bytes B4A/Files/guna-fondo.jpg | Bin 0 -> 6760 bytes B4A/Files/hacer pedido.jpg | Bin 0 -> 609560 bytes B4A/Files/hacerpedido30.jpg | Bin 0 -> 4232 bytes B4A/Files/hacerpedido30.png | Bin 0 -> 24704 bytes B4A/Files/iniciofinventa.bal | Bin 0 -> 2450 bytes B4A/Files/intmex_logo_192x192.jpg | Bin 0 -> 32286 bytes B4A/Files/intmex_logo_192x192.png | Bin 0 -> 1815 bytes B4A/Files/intmex_logo_192x192_old.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 -> 22756 bytes B4A/Files/logo_192x192.jpg | Bin 0 -> 4238 bytes B4A/Files/logo_mariana.jpeg | Bin 0 -> 9983 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/mariana.jpg | Bin 0 -> 32286 bytes B4A/Files/mariana1.jpg | Bin 0 -> 2536 bytes B4A/Files/mariana_ico.png | Bin 0 -> 15424 bytes B4A/Files/marker-azul-0.png | Bin 0 -> 2587 bytes B4A/Files/marker-azul-1.png | Bin 0 -> 2195 bytes B4A/Files/marker-azul-10.png | Bin 0 -> 2786 bytes B4A/Files/marker-azul-100.png | Bin 0 -> 3297 bytes B4A/Files/marker-azul-101.png | Bin 0 -> 2804 bytes B4A/Files/marker-azul-102.png | Bin 0 -> 3306 bytes B4A/Files/marker-azul-103.png | Bin 0 -> 3408 bytes B4A/Files/marker-azul-104.png | Bin 0 -> 3126 bytes B4A/Files/marker-azul-105.png | Bin 0 -> 3359 bytes B4A/Files/marker-azul-106.png | Bin 0 -> 3431 bytes B4A/Files/marker-azul-107.png | Bin 0 -> 3182 bytes B4A/Files/marker-azul-108.png | Bin 0 -> 3395 bytes B4A/Files/marker-azul-109.png | Bin 0 -> 3451 bytes B4A/Files/marker-azul-11.png | Bin 0 -> 2419 bytes B4A/Files/marker-azul-110.png | Bin 0 -> 2994 bytes B4A/Files/marker-azul-111.png | Bin 0 -> 2434 bytes B4A/Files/marker-azul-112.png | Bin 0 -> 2804 bytes B4A/Files/marker-azul-113.png | Bin 0 -> 2926 bytes B4A/Files/marker-azul-114.png | Bin 0 -> 2639 bytes B4A/Files/marker-azul-115.png | Bin 0 -> 3068 bytes B4A/Files/marker-azul-116.png | Bin 0 -> 2946 bytes B4A/Files/marker-azul-117.png | Bin 0 -> 2827 bytes B4A/Files/marker-azul-118.png | Bin 0 -> 3152 bytes B4A/Files/marker-azul-119.png | Bin 0 -> 3156 bytes B4A/Files/marker-azul-12.png | Bin 0 -> 2795 bytes B4A/Files/marker-azul-120.png | Bin 0 -> 3299 bytes B4A/Files/marker-azul-121.png | Bin 0 -> 3008 bytes B4A/Files/marker-azul-122.png | Bin 0 -> 3328 bytes B4A/Files/marker-azul-123.png | Bin 0 -> 3414 bytes B4A/Files/marker-azul-124.png | Bin 0 -> 3099 bytes B4A/Files/marker-azul-125.png | Bin 0 -> 3401 bytes B4A/Files/marker-azul-126.png | Bin 0 -> 3476 bytes B4A/Files/marker-azul-127.png | Bin 0 -> 3201 bytes B4A/Files/marker-azul-128.png | Bin 0 -> 3431 bytes B4A/Files/marker-azul-129.png | Bin 0 -> 3418 bytes B4A/Files/marker-azul-13.png | Bin 0 -> 2919 bytes B4A/Files/marker-azul-130.png | Bin 0 -> 3370 bytes B4A/Files/marker-azul-131.png | Bin 0 -> 2903 bytes B4A/Files/marker-azul-132.png | Bin 0 -> 3377 bytes B4A/Files/marker-azul-133.png | Bin 0 -> 3451 bytes B4A/Files/marker-azul-134.png | Bin 0 -> 3228 bytes B4A/Files/marker-azul-135.png | Bin 0 -> 3432 bytes B4A/Files/marker-azul-136.png | Bin 0 -> 3432 bytes B4A/Files/marker-azul-137.png | Bin 0 -> 3282 bytes B4A/Files/marker-azul-138.png | Bin 0 -> 3502 bytes B4A/Files/marker-azul-139.png | Bin 0 -> 3524 bytes B4A/Files/marker-azul-14.png | Bin 0 -> 2611 bytes B4A/Files/marker-azul-140.png | Bin 0 -> 3172 bytes B4A/Files/marker-azul-141.png | Bin 0 -> 2626 bytes B4A/Files/marker-azul-142.png | Bin 0 -> 3142 bytes B4A/Files/marker-azul-143.png | Bin 0 -> 3268 bytes B4A/Files/marker-azul-144.png | Bin 0 -> 2645 bytes B4A/Files/marker-azul-145.png | Bin 0 -> 3177 bytes B4A/Files/marker-azul-146.png | Bin 0 -> 3292 bytes B4A/Files/marker-azul-147.png | Bin 0 -> 2942 bytes B4A/Files/marker-azul-148.png | Bin 0 -> 3285 bytes B4A/Files/marker-azul-149.png | Bin 0 -> 3272 bytes B4A/Files/marker-azul-15.png | Bin 0 -> 2859 bytes B4A/Files/marker-azul-150.png | Bin 0 -> 3339 bytes B4A/Files/marker-azul-16.png | Bin 0 -> 2956 bytes B4A/Files/marker-azul-17.png | Bin 0 -> 2618 bytes B4A/Files/marker-azul-18.png | Bin 0 -> 2943 bytes B4A/Files/marker-azul-19.png | Bin 0 -> 2965 bytes B4A/Files/marker-azul-2.png | Bin 0 -> 2550 bytes B4A/Files/marker-azul-20.png | Bin 0 -> 3079 bytes B4A/Files/marker-azul-21.png | Bin 0 -> 2770 bytes B4A/Files/marker-azul-22.png | Bin 0 -> 3062 bytes B4A/Files/marker-azul-23.png | Bin 0 -> 3192 bytes B4A/Files/marker-azul-24.png | Bin 0 -> 2920 bytes B4A/Files/marker-azul-25.png | Bin 0 -> 3193 bytes B4A/Files/marker-azul-26.png | Bin 0 -> 3245 bytes B4A/Files/marker-azul-27.png | Bin 0 -> 2965 bytes B4A/Files/marker-azul-28.png | Bin 0 -> 3213 bytes B4A/Files/marker-azul-29.png | Bin 0 -> 3220 bytes B4A/Files/marker-azul-3.png | Bin 0 -> 2697 bytes B4A/Files/marker-azul-30.png | Bin 0 -> 3222 bytes B4A/Files/marker-azul-31.png | Bin 0 -> 2925 bytes B4A/Files/marker-azul-32.png | Bin 0 -> 3145 bytes B4A/Files/marker-azul-33.png | Bin 0 -> 3288 bytes B4A/Files/marker-azul-34.png | Bin 0 -> 3061 bytes B4A/Files/marker-azul-35.png | Bin 0 -> 3267 bytes B4A/Files/marker-azul-36.png | Bin 0 -> 3334 bytes B4A/Files/marker-azul-37.png | Bin 0 -> 3094 bytes B4A/Files/marker-azul-38.png | Bin 0 -> 3308 bytes B4A/Files/marker-azul-39.png | Bin 0 -> 3390 bytes B4A/Files/marker-azul-4.png | Bin 0 -> 2366 bytes B4A/Files/marker-azul-40.png | Bin 0 -> 2955 bytes B4A/Files/marker-azul-41.png | Bin 0 -> 2580 bytes B4A/Files/marker-azul-42.png | Bin 0 -> 2901 bytes B4A/Files/marker-azul-43.png | Bin 0 -> 3054 bytes B4A/Files/marker-azul-44.png | Bin 0 -> 2708 bytes B4A/Files/marker-azul-45.png | Bin 0 -> 2986 bytes B4A/Files/marker-azul-46.png | Bin 0 -> 3100 bytes B4A/Files/marker-azul-47.png | Bin 0 -> 2768 bytes B4A/Files/marker-azul-48.png | Bin 0 -> 3113 bytes B4A/Files/marker-azul-49.png | Bin 0 -> 3114 bytes B4A/Files/marker-azul-5.png | Bin 0 -> 2628 bytes B4A/Files/marker-azul-50.png | Bin 0 -> 3186 bytes B4A/Files/marker-azul-51.png | Bin 0 -> 2835 bytes B4A/Files/marker-azul-52.png | Bin 0 -> 3138 bytes B4A/Files/marker-azul-53.png | Bin 0 -> 3274 bytes B4A/Files/marker-azul-54.png | Bin 0 -> 2988 bytes B4A/Files/marker-azul-55.png | Bin 0 -> 3169 bytes B4A/Files/marker-azul-56.png | Bin 0 -> 3265 bytes B4A/Files/marker-azul-57.png | Bin 0 -> 3007 bytes B4A/Files/marker-azul-58.png | Bin 0 -> 3266 bytes B4A/Files/marker-azul-59.png | Bin 0 -> 3297 bytes B4A/Files/marker-azul-6.png | Bin 0 -> 2729 bytes B4A/Files/marker-azul-60.png | Bin 0 -> 3198 bytes B4A/Files/marker-azul-61.png | Bin 0 -> 2928 bytes B4A/Files/marker-azul-62.png | Bin 0 -> 3216 bytes B4A/Files/marker-azul-63.png | Bin 0 -> 3321 bytes B4A/Files/marker-azul-64.png | Bin 0 -> 3096 bytes B4A/Files/marker-azul-65.png | Bin 0 -> 3303 bytes B4A/Files/marker-azul-66.png | Bin 0 -> 3396 bytes B4A/Files/marker-azul-67.png | Bin 0 -> 3127 bytes B4A/Files/marker-azul-68.png | Bin 0 -> 3365 bytes B4A/Files/marker-azul-69.png | Bin 0 -> 3366 bytes B4A/Files/marker-azul-7.png | Bin 0 -> 2358 bytes B4A/Files/marker-azul-70.png | Bin 0 -> 2943 bytes B4A/Files/marker-azul-71.png | Bin 0 -> 2565 bytes B4A/Files/marker-azul-72.png | Bin 0 -> 2913 bytes B4A/Files/marker-azul-73.png | Bin 0 -> 3047 bytes B4A/Files/marker-azul-74.png | Bin 0 -> 2733 bytes B4A/Files/marker-azul-75.png | Bin 0 -> 2997 bytes B4A/Files/marker-azul-76.png | Bin 0 -> 3087 bytes B4A/Files/marker-azul-77.png | Bin 0 -> 2759 bytes B4A/Files/marker-azul-78.png | Bin 0 -> 3079 bytes B4A/Files/marker-azul-79.png | Bin 0 -> 3089 bytes B4A/Files/marker-azul-8.png | Bin 0 -> 2685 bytes B4A/Files/marker-azul-80.png | Bin 0 -> 3191 bytes B4A/Files/marker-azul-81.png | Bin 0 -> 2899 bytes B4A/Files/marker-azul-82.png | Bin 0 -> 3192 bytes B4A/Files/marker-azul-83.png | Bin 0 -> 3323 bytes B4A/Files/marker-azul-84.png | Bin 0 -> 3096 bytes B4A/Files/marker-azul-85.png | Bin 0 -> 3313 bytes B4A/Files/marker-azul-86.png | Bin 0 -> 3357 bytes B4A/Files/marker-azul-87.png | Bin 0 -> 3105 bytes B4A/Files/marker-azul-88.png | Bin 0 -> 3308 bytes B4A/Files/marker-azul-89.png | Bin 0 -> 3349 bytes B4A/Files/marker-azul-9.png | Bin 0 -> 2753 bytes B4A/Files/marker-azul-90.png | Bin 0 -> 3231 bytes B4A/Files/marker-azul-91.png | Bin 0 -> 2949 bytes B4A/Files/marker-azul-92.png | Bin 0 -> 3242 bytes B4A/Files/marker-azul-93.png | Bin 0 -> 3394 bytes B4A/Files/marker-azul-94.png | Bin 0 -> 3097 bytes B4A/Files/marker-azul-95.png | Bin 0 -> 3363 bytes B4A/Files/marker-azul-96.png | Bin 0 -> 3349 bytes B4A/Files/marker-azul-97.png | Bin 0 -> 3123 bytes B4A/Files/marker-azul-98.png | Bin 0 -> 3321 bytes B4A/Files/marker-azul-99.png | Bin 0 -> 3354 bytes B4A/Files/marker-rojo-0.png | Bin 0 -> 2488 bytes B4A/Files/marker-rojo-1.png | Bin 0 -> 2118 bytes B4A/Files/marker-rojo-10.png | Bin 0 -> 2734 bytes B4A/Files/marker-rojo-100.png | Bin 0 -> 3248 bytes B4A/Files/marker-rojo-101.png | Bin 0 -> 2955 bytes B4A/Files/marker-rojo-102.png | Bin 0 -> 3252 bytes B4A/Files/marker-rojo-103.png | Bin 0 -> 3369 bytes B4A/Files/marker-rojo-104.png | Bin 0 -> 3108 bytes B4A/Files/marker-rojo-105.png | Bin 0 -> 3333 bytes B4A/Files/marker-rojo-106.png | Bin 0 -> 3393 bytes B4A/Files/marker-rojo-107.png | Bin 0 -> 3109 bytes B4A/Files/marker-rojo-108.png | Bin 0 -> 3365 bytes B4A/Files/marker-rojo-109.png | Bin 0 -> 3421 bytes B4A/Files/marker-rojo-11.png | Bin 0 -> 2170 bytes B4A/Files/marker-rojo-110.png | Bin 0 -> 2779 bytes B4A/Files/marker-rojo-111.png | Bin 0 -> 2172 bytes B4A/Files/marker-rojo-112.png | Bin 0 -> 2764 bytes B4A/Files/marker-rojo-113.png | Bin 0 -> 2881 bytes B4A/Files/marker-rojo-114.png | Bin 0 -> 2587 bytes B4A/Files/marker-rojo-115.png | Bin 0 -> 2817 bytes B4A/Files/marker-rojo-116.png | Bin 0 -> 2914 bytes B4A/Files/marker-rojo-117.png | Bin 0 -> 2569 bytes B4A/Files/marker-rojo-118.png | Bin 0 -> 2918 bytes B4A/Files/marker-rojo-119.png | Bin 0 -> 2936 bytes B4A/Files/marker-rojo-12.png | Bin 0 -> 2743 bytes B4A/Files/marker-rojo-120.png | Bin 0 -> 3280 bytes B4A/Files/marker-rojo-121.png | Bin 0 -> 2939 bytes B4A/Files/marker-rojo-122.png | Bin 0 -> 3275 bytes B4A/Files/marker-rojo-123.png | Bin 0 -> 3377 bytes B4A/Files/marker-rojo-124.png | Bin 0 -> 3088 bytes B4A/Files/marker-rojo-125.png | Bin 0 -> 3324 bytes B4A/Files/marker-rojo-126.png | Bin 0 -> 3388 bytes B4A/Files/marker-rojo-127.png | Bin 0 -> 3102 bytes B4A/Files/marker-rojo-128.png | Bin 0 -> 3391 bytes B4A/Files/marker-rojo-129.png | Bin 0 -> 3426 bytes B4A/Files/marker-rojo-13.png | Bin 0 -> 2884 bytes B4A/Files/marker-rojo-130.png | Bin 0 -> 3407 bytes B4A/Files/marker-rojo-131.png | Bin 0 -> 3082 bytes B4A/Files/marker-rojo-132.png | Bin 0 -> 3403 bytes B4A/Files/marker-rojo-133.png | Bin 0 -> 3508 bytes B4A/Files/marker-rojo-134.png | Bin 0 -> 3235 bytes B4A/Files/marker-rojo-135.png | Bin 0 -> 3444 bytes B4A/Files/marker-rojo-136.png | Bin 0 -> 3516 bytes B4A/Files/marker-rojo-137.png | Bin 0 -> 3235 bytes B4A/Files/marker-rojo-138.png | Bin 0 -> 3499 bytes B4A/Files/marker-rojo-139.png | Bin 0 -> 3549 bytes B4A/Files/marker-rojo-14.png | Bin 0 -> 2533 bytes B4A/Files/marker-rojo-140.png | Bin 0 -> 3085 bytes B4A/Files/marker-rojo-141.png | Bin 0 -> 2739 bytes B4A/Files/marker-rojo-142.png | Bin 0 -> 3093 bytes B4A/Files/marker-rojo-143.png | Bin 0 -> 3177 bytes B4A/Files/marker-rojo-144.png | Bin 0 -> 2887 bytes B4A/Files/marker-rojo-145.png | Bin 0 -> 3136 bytes B4A/Files/marker-rojo-146.png | Bin 0 -> 3223 bytes B4A/Files/marker-rojo-147.png | Bin 0 -> 2910 bytes B4A/Files/marker-rojo-148.png | Bin 0 -> 3213 bytes B4A/Files/marker-rojo-149.png | Bin 0 -> 3234 bytes B4A/Files/marker-rojo-15.png | Bin 0 -> 2832 bytes B4A/Files/marker-rojo-150.png | Bin 0 -> 3370 bytes B4A/Files/marker-rojo-16.png | Bin 0 -> 2898 bytes B4A/Files/marker-rojo-17.png | Bin 0 -> 2587 bytes B4A/Files/marker-rojo-18.png | Bin 0 -> 2877 bytes B4A/Files/marker-rojo-19.png | Bin 0 -> 2914 bytes B4A/Files/marker-rojo-2.png | Bin 0 -> 2520 bytes B4A/Files/marker-rojo-20.png | Bin 0 -> 3057 bytes B4A/Files/marker-rojo-21.png | Bin 0 -> 2738 bytes B4A/Files/marker-rojo-22.png | Bin 0 -> 2559 bytes B4A/Files/marker-rojo-23.png | Bin 0 -> 3157 bytes B4A/Files/marker-rojo-24.png | Bin 0 -> 2879 bytes B4A/Files/marker-rojo-25.png | Bin 0 -> 3126 bytes B4A/Files/marker-rojo-26.png | Bin 0 -> 3199 bytes B4A/Files/marker-rojo-27.png | Bin 0 -> 2954 bytes B4A/Files/marker-rojo-28.png | Bin 0 -> 3163 bytes B4A/Files/marker-rojo-29.png | Bin 0 -> 3219 bytes B4A/Files/marker-rojo-3.png | Bin 0 -> 2638 bytes B4A/Files/marker-rojo-30.png | Bin 0 -> 3151 bytes B4A/Files/marker-rojo-31.png | Bin 0 -> 2887 bytes B4A/Files/marker-rojo-32.png | Bin 0 -> 3161 bytes B4A/Files/marker-rojo-33.png | Bin 0 -> 2689 bytes B4A/Files/marker-rojo-34.png | Bin 0 -> 3014 bytes B4A/Files/marker-rojo-35.png | Bin 0 -> 3206 bytes B4A/Files/marker-rojo-36.png | Bin 0 -> 3364 bytes B4A/Files/marker-rojo-37.png | Bin 0 -> 3062 bytes B4A/Files/marker-rojo-38.png | Bin 0 -> 3335 bytes B4A/Files/marker-rojo-39.png | Bin 0 -> 3366 bytes B4A/Files/marker-rojo-4.png | Bin 0 -> 2307 bytes B4A/Files/marker-rojo-40.png | Bin 0 -> 2894 bytes B4A/Files/marker-rojo-41.png | Bin 0 -> 2529 bytes B4A/Files/marker-rojo-42.png | Bin 0 -> 2889 bytes B4A/Files/marker-rojo-43.png | Bin 0 -> 3026 bytes B4A/Files/marker-rojo-44.png | Bin 0 -> 2381 bytes B4A/Files/marker-rojo-45.png | Bin 0 -> 2965 bytes B4A/Files/marker-rojo-46.png | Bin 0 -> 3048 bytes B4A/Files/marker-rojo-47.png | Bin 0 -> 2743 bytes B4A/Files/marker-rojo-48.png | Bin 0 -> 3046 bytes B4A/Files/marker-rojo-49.png | Bin 0 -> 3056 bytes B4A/Files/marker-rojo-5.png | Bin 0 -> 2597 bytes B4A/Files/marker-rojo-50.png | Bin 0 -> 3145 bytes B4A/Files/marker-rojo-51.png | Bin 0 -> 2834 bytes B4A/Files/marker-rojo-52.png | Bin 0 -> 3133 bytes B4A/Files/marker-rojo-53.png | Bin 0 -> 3221 bytes B4A/Files/marker-rojo-54.png | Bin 0 -> 2959 bytes B4A/Files/marker-rojo-55.png | Bin 0 -> 2648 bytes B4A/Files/marker-rojo-56.png | Bin 0 -> 3295 bytes B4A/Files/marker-rojo-57.png | Bin 0 -> 2987 bytes B4A/Files/marker-rojo-58.png | Bin 0 -> 3281 bytes B4A/Files/marker-rojo-59.png | Bin 0 -> 3295 bytes B4A/Files/marker-rojo-6.png | Bin 0 -> 2663 bytes B4A/Files/marker-rojo-60.png | Bin 0 -> 3185 bytes B4A/Files/marker-rojo-61.png | Bin 0 -> 2897 bytes B4A/Files/marker-rojo-62.png | Bin 0 -> 3205 bytes B4A/Files/marker-rojo-63.png | Bin 0 -> 3347 bytes B4A/Files/marker-rojo-64.png | Bin 0 -> 3045 bytes B4A/Files/marker-rojo-65.png | Bin 0 -> 3296 bytes B4A/Files/marker-rojo-66.png | Bin 0 -> 2731 bytes B4A/Files/marker-rojo-67.png | Bin 0 -> 3084 bytes B4A/Files/marker-rojo-68.png | Bin 0 -> 3306 bytes B4A/Files/marker-rojo-69.png | Bin 0 -> 3360 bytes B4A/Files/marker-rojo-7.png | Bin 0 -> 2340 bytes B4A/Files/marker-rojo-70.png | Bin 0 -> 2937 bytes B4A/Files/marker-rojo-71.png | Bin 0 -> 2584 bytes B4A/Files/marker-rojo-72.png | Bin 0 -> 2947 bytes B4A/Files/marker-rojo-73.png | Bin 0 -> 3058 bytes B4A/Files/marker-rojo-74.png | Bin 0 -> 2733 bytes B4A/Files/marker-rojo-75.png | Bin 0 -> 2977 bytes B4A/Files/marker-rojo-76.png | Bin 0 -> 3074 bytes B4A/Files/marker-rojo-77.png | Bin 0 -> 2389 bytes B4A/Files/marker-rojo-78.png | Bin 0 -> 3074 bytes B4A/Files/marker-rojo-79.png | Bin 0 -> 3096 bytes B4A/Files/marker-rojo-8.png | Bin 0 -> 2657 bytes B4A/Files/marker-rojo-80.png | Bin 0 -> 3166 bytes B4A/Files/marker-rojo-81.png | Bin 0 -> 2881 bytes B4A/Files/marker-rojo-82.png | Bin 0 -> 3167 bytes B4A/Files/marker-rojo-83.png | Bin 0 -> 3333 bytes B4A/Files/marker-rojo-84.png | Bin 0 -> 3031 bytes B4A/Files/marker-rojo-85.png | Bin 0 -> 3276 bytes B4A/Files/marker-rojo-86.png | Bin 0 -> 3310 bytes B4A/Files/marker-rojo-87.png | Bin 0 -> 3078 bytes B4A/Files/marker-rojo-88.png | Bin 0 -> 2684 bytes B4A/Files/marker-rojo-89.png | Bin 0 -> 3320 bytes B4A/Files/marker-rojo-9.png | Bin 0 -> 2698 bytes B4A/Files/marker-rojo-90.png | Bin 0 -> 3201 bytes B4A/Files/marker-rojo-91.png | Bin 0 -> 2911 bytes B4A/Files/marker-rojo-92.png | Bin 0 -> 3219 bytes B4A/Files/marker-rojo-93.png | Bin 0 -> 3370 bytes B4A/Files/marker-rojo-94.png | Bin 0 -> 3049 bytes B4A/Files/marker-rojo-95.png | Bin 0 -> 3300 bytes B4A/Files/marker-rojo-96.png | Bin 0 -> 3360 bytes B4A/Files/marker-rojo-97.png | Bin 0 -> 3116 bytes B4A/Files/marker-rojo-98.png | Bin 0 -> 3322 bytes B4A/Files/marker-rojo-99.png | Bin 0 -> 2743 bytes B4A/Files/marker-verde-0.png | Bin 0 -> 2934 bytes B4A/Files/marker-verde-1.png | Bin 0 -> 2535 bytes B4A/Files/marker-verde-10.png | Bin 0 -> 3179 bytes B4A/Files/marker-verde-100.png | Bin 0 -> 3778 bytes B4A/Files/marker-verde-101.png | Bin 0 -> 3229 bytes B4A/Files/marker-verde-102.png | Bin 0 -> 3770 bytes B4A/Files/marker-verde-103.png | Bin 0 -> 3872 bytes B4A/Files/marker-verde-104.png | Bin 0 -> 3608 bytes B4A/Files/marker-verde-105.png | Bin 0 -> 3806 bytes B4A/Files/marker-verde-106.png | Bin 0 -> 3886 bytes B4A/Files/marker-verde-107.png | Bin 0 -> 3614 bytes B4A/Files/marker-verde-108.png | Bin 0 -> 3900 bytes B4A/Files/marker-verde-109.png | Bin 0 -> 3876 bytes B4A/Files/marker-verde-11.png | Bin 0 -> 2572 bytes B4A/Files/marker-verde-110.png | Bin 0 -> 3427 bytes B4A/Files/marker-verde-111.png | Bin 0 -> 2827 bytes B4A/Files/marker-verde-112.png | Bin 0 -> 3166 bytes B4A/Files/marker-verde-113.png | Bin 0 -> 3301 bytes B4A/Files/marker-verde-114.png | Bin 0 -> 3026 bytes B4A/Files/marker-verde-115.png | Bin 0 -> 3438 bytes B4A/Files/marker-verde-116.png | Bin 0 -> 3341 bytes B4A/Files/marker-verde-117.png | Bin 0 -> 3196 bytes B4A/Files/marker-verde-118.png | Bin 0 -> 3544 bytes B4A/Files/marker-verde-119.png | Bin 0 -> 3558 bytes B4A/Files/marker-verde-12.png | Bin 0 -> 3155 bytes B4A/Files/marker-verde-120.png | Bin 0 -> 3745 bytes B4A/Files/marker-verde-121.png | Bin 0 -> 3366 bytes B4A/Files/marker-verde-122.png | Bin 0 -> 3725 bytes B4A/Files/marker-verde-123.png | Bin 0 -> 3808 bytes B4A/Files/marker-verde-124.png | Bin 0 -> 3524 bytes B4A/Files/marker-verde-125.png | Bin 0 -> 3770 bytes B4A/Files/marker-verde-126.png | Bin 0 -> 3850 bytes B4A/Files/marker-verde-127.png | Bin 0 -> 3540 bytes B4A/Files/marker-verde-128.png | Bin 0 -> 3849 bytes B4A/Files/marker-verde-129.png | Bin 0 -> 3817 bytes B4A/Files/marker-verde-13.png | Bin 0 -> 3272 bytes B4A/Files/marker-verde-130.png | Bin 0 -> 3860 bytes B4A/Files/marker-verde-131.png | Bin 0 -> 3299 bytes B4A/Files/marker-verde-132.png | Bin 0 -> 3797 bytes B4A/Files/marker-verde-133.png | Bin 0 -> 3921 bytes B4A/Files/marker-verde-134.png | Bin 0 -> 3633 bytes B4A/Files/marker-verde-135.png | Bin 0 -> 3892 bytes B4A/Files/marker-verde-136.png | Bin 0 -> 3962 bytes B4A/Files/marker-verde-137.png | Bin 0 -> 3634 bytes B4A/Files/marker-verde-138.png | Bin 0 -> 4005 bytes B4A/Files/marker-verde-139.png | Bin 0 -> 3964 bytes B4A/Files/marker-verde-14.png | Bin 0 -> 2953 bytes B4A/Files/marker-verde-140.png | Bin 0 -> 3589 bytes B4A/Files/marker-verde-141.png | Bin 0 -> 3005 bytes B4A/Files/marker-verde-142.png | Bin 0 -> 3545 bytes B4A/Files/marker-verde-143.png | Bin 0 -> 3668 bytes B4A/Files/marker-verde-144.png | Bin 0 -> 3045 bytes B4A/Files/marker-verde-145.png | Bin 0 -> 3566 bytes B4A/Files/marker-verde-146.png | Bin 0 -> 3714 bytes B4A/Files/marker-verde-147.png | Bin 0 -> 3354 bytes B4A/Files/marker-verde-148.png | Bin 0 -> 3732 bytes B4A/Files/marker-verde-149.png | Bin 0 -> 3689 bytes B4A/Files/marker-verde-15.png | Bin 0 -> 3223 bytes B4A/Files/marker-verde-150.png | Bin 0 -> 3768 bytes B4A/Files/marker-verde-16.png | Bin 0 -> 3310 bytes B4A/Files/marker-verde-17.png | Bin 0 -> 2991 bytes B4A/Files/marker-verde-18.png | Bin 0 -> 3310 bytes B4A/Files/marker-verde-19.png | Bin 0 -> 3319 bytes B4A/Files/marker-verde-2.png | Bin 0 -> 2922 bytes B4A/Files/marker-verde-20.png | Bin 0 -> 3527 bytes B4A/Files/marker-verde-21.png | Bin 0 -> 3166 bytes B4A/Files/marker-verde-22.png | Bin 0 -> 2997 bytes B4A/Files/marker-verde-23.png | Bin 0 -> 3636 bytes B4A/Files/marker-verde-24.png | Bin 0 -> 3336 bytes B4A/Files/marker-verde-25.png | Bin 0 -> 3551 bytes B4A/Files/marker-verde-26.png | Bin 0 -> 3643 bytes B4A/Files/marker-verde-27.png | Bin 0 -> 3313 bytes B4A/Files/marker-verde-28.png | Bin 0 -> 3670 bytes B4A/Files/marker-verde-29.png | Bin 0 -> 3679 bytes B4A/Files/marker-verde-3.png | Bin 0 -> 3058 bytes B4A/Files/marker-verde-30.png | Bin 0 -> 3656 bytes B4A/Files/marker-verde-31.png | Bin 0 -> 3283 bytes B4A/Files/marker-verde-32.png | Bin 0 -> 3638 bytes B4A/Files/marker-verde-33.png | Bin 0 -> 3126 bytes B4A/Files/marker-verde-34.png | Bin 0 -> 3434 bytes B4A/Files/marker-verde-35.png | Bin 0 -> 3660 bytes B4A/Files/marker-verde-36.png | Bin 0 -> 3811 bytes B4A/Files/marker-verde-37.png | Bin 0 -> 3456 bytes B4A/Files/marker-verde-38.png | Bin 0 -> 3811 bytes B4A/Files/marker-verde-39.png | Bin 0 -> 3846 bytes B4A/Files/marker-verde-4.png | Bin 0 -> 2738 bytes B4A/Files/marker-verde-40.png | Bin 0 -> 3360 bytes B4A/Files/marker-verde-41.png | Bin 0 -> 2956 bytes B4A/Files/marker-verde-42.png | Bin 0 -> 3344 bytes B4A/Files/marker-verde-43.png | Bin 0 -> 3449 bytes B4A/Files/marker-verde-44.png | Bin 0 -> 2833 bytes B4A/Files/marker-verde-45.png | Bin 0 -> 3395 bytes B4A/Files/marker-verde-46.png | Bin 0 -> 3490 bytes B4A/Files/marker-verde-47.png | Bin 0 -> 3179 bytes B4A/Files/marker-verde-48.png | Bin 0 -> 3489 bytes B4A/Files/marker-verde-49.png | Bin 0 -> 3487 bytes B4A/Files/marker-verde-5.png | Bin 0 -> 2992 bytes B4A/Files/marker-verde-50.png | Bin 0 -> 3585 bytes B4A/Files/marker-verde-51.png | Bin 0 -> 3215 bytes B4A/Files/marker-verde-52.png | Bin 0 -> 3559 bytes B4A/Files/marker-verde-53.png | Bin 0 -> 3731 bytes B4A/Files/marker-verde-54.png | Bin 0 -> 3367 bytes B4A/Files/marker-verde-55.png | Bin 0 -> 3654 bytes B4A/Files/marker-verde-56.png | Bin 0 -> 3742 bytes B4A/Files/marker-verde-57.png | Bin 0 -> 3393 bytes B4A/Files/marker-verde-58.png | Bin 0 -> 3794 bytes B4A/Files/marker-verde-59.png | Bin 0 -> 3760 bytes B4A/Files/marker-verde-6.png | Bin 0 -> 3080 bytes B4A/Files/marker-verde-60.png | Bin 0 -> 3694 bytes B4A/Files/marker-verde-61.png | Bin 0 -> 3310 bytes B4A/Files/marker-verde-62.png | Bin 0 -> 3673 bytes B4A/Files/marker-verde-63.png | Bin 0 -> 3798 bytes B4A/Files/marker-verde-64.png | Bin 0 -> 3503 bytes B4A/Files/marker-verde-65.png | Bin 0 -> 3774 bytes B4A/Files/marker-verde-66.png | Bin 0 -> 3867 bytes B4A/Files/marker-verde-67.png | Bin 0 -> 3508 bytes B4A/Files/marker-verde-68.png | Bin 0 -> 3851 bytes B4A/Files/marker-verde-69.png | Bin 0 -> 3849 bytes B4A/Files/marker-verde-7.png | Bin 0 -> 2751 bytes B4A/Files/marker-verde-70.png | Bin 0 -> 3373 bytes B4A/Files/marker-verde-71.png | Bin 0 -> 2972 bytes B4A/Files/marker-verde-72.png | Bin 0 -> 3349 bytes B4A/Files/marker-verde-73.png | Bin 0 -> 3467 bytes B4A/Files/marker-verde-74.png | Bin 0 -> 3150 bytes B4A/Files/marker-verde-75.png | Bin 0 -> 3418 bytes B4A/Files/marker-verde-76.png | Bin 0 -> 3497 bytes B4A/Files/marker-verde-77.png | Bin 0 -> 3169 bytes B4A/Files/marker-verde-78.png | Bin 0 -> 3497 bytes B4A/Files/marker-verde-79.png | Bin 0 -> 3511 bytes B4A/Files/marker-verde-8.png | Bin 0 -> 3100 bytes B4A/Files/marker-verde-80.png | Bin 0 -> 3697 bytes B4A/Files/marker-verde-81.png | Bin 0 -> 3327 bytes B4A/Files/marker-verde-82.png | Bin 0 -> 3728 bytes B4A/Files/marker-verde-83.png | Bin 0 -> 3814 bytes B4A/Files/marker-verde-84.png | Bin 0 -> 3496 bytes B4A/Files/marker-verde-85.png | Bin 0 -> 3791 bytes B4A/Files/marker-verde-86.png | Bin 0 -> 3855 bytes B4A/Files/marker-verde-87.png | Bin 0 -> 3517 bytes B4A/Files/marker-verde-88.png | Bin 0 -> 3875 bytes B4A/Files/marker-verde-89.png | Bin 0 -> 3870 bytes B4A/Files/marker-verde-9.png | Bin 0 -> 3090 bytes B4A/Files/marker-verde-90.png | Bin 0 -> 3700 bytes B4A/Files/marker-verde-91.png | Bin 0 -> 3322 bytes B4A/Files/marker-verde-92.png | Bin 0 -> 3687 bytes B4A/Files/marker-verde-93.png | Bin 0 -> 3834 bytes B4A/Files/marker-verde-94.png | Bin 0 -> 3489 bytes B4A/Files/marker-verde-95.png | Bin 0 -> 3764 bytes B4A/Files/marker-verde-96.png | Bin 0 -> 3841 bytes B4A/Files/marker-verde-97.png | Bin 0 -> 3493 bytes B4A/Files/marker-verde-98.png | Bin 0 -> 3878 bytes B4A/Files/marker-verde-99.png | Bin 0 -> 3852 bytes B4A/Files/nota.bal | Bin 0 -> 7334 bytes B4A/Files/noventa.bal | Bin 0 -> 6884 bytes B4A/Files/nuevo-cliente20.png | Bin 0 -> 32124 bytes B4A/Files/nuevocliente.bal | Bin 0 -> 9924 bytes B4A/Files/nuevocliente.jpg | Bin 0 -> 26898 bytes B4A/Files/nvo cliente.jpg | Bin 0 -> 592665 bytes B4A/Files/palomita_verde.png | Bin 0 -> 159519 bytes B4A/Files/panel_pick_ciego.bal | Bin 0 -> 2599 bytes B4A/Files/pedido.bal | Bin 0 -> 11748 bytes B4A/Files/planfia_logo.png | Bin 0 -> 225383 bytes B4A/Files/principal.bal | Bin 0 -> 49898 bytes B4A/Files/proditem.bal | Bin 0 -> 8254 bytes B4A/Files/proditem1.bal | Bin 0 -> 5586 bytes B4A/Files/proditem2.bal | Bin 0 -> 7390 bytes B4A/Files/proditempromo.bal | Bin 0 -> 5586 bytes B4A/Files/productos.bal | Bin 0 -> 16315 bytes B4A/Files/promociones.bal | Bin 0 -> 11036 bytes B4A/Files/resdia.bal | Bin 0 -> 44790 bytes B4A/Files/resdia.jpg | Bin 0 -> 609996 bytes B4A/Files/resdia20.png | Bin 0 -> 69280 bytes B4A/Files/resumendia.jpg | Bin 0 -> 5067 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/ticketdia20.jpg | Bin 0 -> 3012 bytes B4A/Files/ticketdia20.png | Bin 0 -> 31411 bytes B4A/Files/ticketsdia.bal | Bin 0 -> 2909 bytes B4A/Files/tiendita.jpg | Bin 0 -> 9042 bytes B4A/Files/verde.png | Bin 0 -> 7665 bytes B4A/FirebaseMessaging.bas | 226 ++ B4A/MAPA_RUTAS.bas | 349 +++ B4A/MARQUEZ.b4a.meta | 93 + B4A/ManageExternalStorage.bas | 79 + B4A/NotificationService.bas | 218 ++ B4A/Pendientes.bas | 16 + B4A/Starter.bas | 196 ++ B4A/Subs.bas | 1618 +++++++++++++ B4A/Tracker.bas | 324 +++ B4A/_git_tag.ps1 | 110 + B4A/appUpdater.bas | 286 +++ B4A/cPDF.bas | 1003 ++++++++ B4A/google-services.json | 126 + B4A/test.bas | 66 + B4A/updateAvailable.bas | 24 + 564 files changed, 21467 insertions(+) create mode 100644 B4A/ADM.b4a create mode 100644 B4A/ADM.b4a.meta create mode 100644 B4A/B4XMainPage.bas create mode 100644 B4A/BatteryUtilities.bas create mode 100644 B4A/C_BItacora.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/CameraExClass.bas create mode 100644 B4A/DBRequestManager.bas create mode 100644 B4A/EscPosPrinter.bas create mode 100644 B4A/FileHandler.bas create mode 100644 B4A/Files/abordo.png 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/bus-ar.png 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/desvanecido.png create mode 100644 B4A/Files/durakelo.png create mode 100644 B4A/Files/engrane.jpg create mode 100644 B4A/Files/engrane.png 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/gps20.png create mode 100644 B4A/Files/guna-fondo.jpg create mode 100644 B4A/Files/hacer pedido.jpg create mode 100644 B4A/Files/hacerpedido30.jpg create mode 100644 B4A/Files/hacerpedido30.png create mode 100644 B4A/Files/iniciofinventa.bal create mode 100644 B4A/Files/intmex_logo_192x192.jpg create mode 100644 B4A/Files/intmex_logo_192x192.png create mode 100644 B4A/Files/intmex_logo_192x192_old.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/logo_mariana.jpeg 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/mariana.jpg create mode 100644 B4A/Files/mariana1.jpg create mode 100644 B4A/Files/mariana_ico.png create mode 100644 B4A/Files/marker-azul-0.png create mode 100644 B4A/Files/marker-azul-1.png create mode 100644 B4A/Files/marker-azul-10.png create mode 100644 B4A/Files/marker-azul-100.png create mode 100644 B4A/Files/marker-azul-101.png create mode 100644 B4A/Files/marker-azul-102.png create mode 100644 B4A/Files/marker-azul-103.png create mode 100644 B4A/Files/marker-azul-104.png create mode 100644 B4A/Files/marker-azul-105.png create mode 100644 B4A/Files/marker-azul-106.png create mode 100644 B4A/Files/marker-azul-107.png create mode 100644 B4A/Files/marker-azul-108.png create mode 100644 B4A/Files/marker-azul-109.png create mode 100644 B4A/Files/marker-azul-11.png create mode 100644 B4A/Files/marker-azul-110.png create mode 100644 B4A/Files/marker-azul-111.png create mode 100644 B4A/Files/marker-azul-112.png create mode 100644 B4A/Files/marker-azul-113.png create mode 100644 B4A/Files/marker-azul-114.png create mode 100644 B4A/Files/marker-azul-115.png create mode 100644 B4A/Files/marker-azul-116.png create mode 100644 B4A/Files/marker-azul-117.png create mode 100644 B4A/Files/marker-azul-118.png create mode 100644 B4A/Files/marker-azul-119.png create mode 100644 B4A/Files/marker-azul-12.png create mode 100644 B4A/Files/marker-azul-120.png create mode 100644 B4A/Files/marker-azul-121.png create mode 100644 B4A/Files/marker-azul-122.png create mode 100644 B4A/Files/marker-azul-123.png create mode 100644 B4A/Files/marker-azul-124.png create mode 100644 B4A/Files/marker-azul-125.png create mode 100644 B4A/Files/marker-azul-126.png create mode 100644 B4A/Files/marker-azul-127.png create mode 100644 B4A/Files/marker-azul-128.png create mode 100644 B4A/Files/marker-azul-129.png create mode 100644 B4A/Files/marker-azul-13.png create mode 100644 B4A/Files/marker-azul-130.png create mode 100644 B4A/Files/marker-azul-131.png create mode 100644 B4A/Files/marker-azul-132.png create mode 100644 B4A/Files/marker-azul-133.png create mode 100644 B4A/Files/marker-azul-134.png create mode 100644 B4A/Files/marker-azul-135.png create mode 100644 B4A/Files/marker-azul-136.png create mode 100644 B4A/Files/marker-azul-137.png create mode 100644 B4A/Files/marker-azul-138.png create mode 100644 B4A/Files/marker-azul-139.png create mode 100644 B4A/Files/marker-azul-14.png create mode 100644 B4A/Files/marker-azul-140.png create mode 100644 B4A/Files/marker-azul-141.png create mode 100644 B4A/Files/marker-azul-142.png create mode 100644 B4A/Files/marker-azul-143.png create mode 100644 B4A/Files/marker-azul-144.png create mode 100644 B4A/Files/marker-azul-145.png create mode 100644 B4A/Files/marker-azul-146.png create mode 100644 B4A/Files/marker-azul-147.png create mode 100644 B4A/Files/marker-azul-148.png create mode 100644 B4A/Files/marker-azul-149.png create mode 100644 B4A/Files/marker-azul-15.png create mode 100644 B4A/Files/marker-azul-150.png create mode 100644 B4A/Files/marker-azul-16.png create mode 100644 B4A/Files/marker-azul-17.png create mode 100644 B4A/Files/marker-azul-18.png create mode 100644 B4A/Files/marker-azul-19.png create mode 100644 B4A/Files/marker-azul-2.png create mode 100644 B4A/Files/marker-azul-20.png create mode 100644 B4A/Files/marker-azul-21.png create mode 100644 B4A/Files/marker-azul-22.png create mode 100644 B4A/Files/marker-azul-23.png create mode 100644 B4A/Files/marker-azul-24.png create mode 100644 B4A/Files/marker-azul-25.png create mode 100644 B4A/Files/marker-azul-26.png create mode 100644 B4A/Files/marker-azul-27.png create mode 100644 B4A/Files/marker-azul-28.png create mode 100644 B4A/Files/marker-azul-29.png create mode 100644 B4A/Files/marker-azul-3.png create mode 100644 B4A/Files/marker-azul-30.png create mode 100644 B4A/Files/marker-azul-31.png create mode 100644 B4A/Files/marker-azul-32.png create mode 100644 B4A/Files/marker-azul-33.png create mode 100644 B4A/Files/marker-azul-34.png create mode 100644 B4A/Files/marker-azul-35.png create mode 100644 B4A/Files/marker-azul-36.png create mode 100644 B4A/Files/marker-azul-37.png create mode 100644 B4A/Files/marker-azul-38.png create mode 100644 B4A/Files/marker-azul-39.png create mode 100644 B4A/Files/marker-azul-4.png create mode 100644 B4A/Files/marker-azul-40.png create mode 100644 B4A/Files/marker-azul-41.png create mode 100644 B4A/Files/marker-azul-42.png create mode 100644 B4A/Files/marker-azul-43.png create mode 100644 B4A/Files/marker-azul-44.png create mode 100644 B4A/Files/marker-azul-45.png create mode 100644 B4A/Files/marker-azul-46.png create mode 100644 B4A/Files/marker-azul-47.png create mode 100644 B4A/Files/marker-azul-48.png create mode 100644 B4A/Files/marker-azul-49.png create mode 100644 B4A/Files/marker-azul-5.png create mode 100644 B4A/Files/marker-azul-50.png create mode 100644 B4A/Files/marker-azul-51.png create mode 100644 B4A/Files/marker-azul-52.png create mode 100644 B4A/Files/marker-azul-53.png create mode 100644 B4A/Files/marker-azul-54.png create mode 100644 B4A/Files/marker-azul-55.png create mode 100644 B4A/Files/marker-azul-56.png create mode 100644 B4A/Files/marker-azul-57.png create mode 100644 B4A/Files/marker-azul-58.png create mode 100644 B4A/Files/marker-azul-59.png create mode 100644 B4A/Files/marker-azul-6.png create mode 100644 B4A/Files/marker-azul-60.png create mode 100644 B4A/Files/marker-azul-61.png create mode 100644 B4A/Files/marker-azul-62.png create mode 100644 B4A/Files/marker-azul-63.png create mode 100644 B4A/Files/marker-azul-64.png create mode 100644 B4A/Files/marker-azul-65.png create mode 100644 B4A/Files/marker-azul-66.png create mode 100644 B4A/Files/marker-azul-67.png create mode 100644 B4A/Files/marker-azul-68.png create mode 100644 B4A/Files/marker-azul-69.png create mode 100644 B4A/Files/marker-azul-7.png create mode 100644 B4A/Files/marker-azul-70.png create mode 100644 B4A/Files/marker-azul-71.png create mode 100644 B4A/Files/marker-azul-72.png create mode 100644 B4A/Files/marker-azul-73.png create mode 100644 B4A/Files/marker-azul-74.png create mode 100644 B4A/Files/marker-azul-75.png create mode 100644 B4A/Files/marker-azul-76.png create mode 100644 B4A/Files/marker-azul-77.png create mode 100644 B4A/Files/marker-azul-78.png create mode 100644 B4A/Files/marker-azul-79.png create mode 100644 B4A/Files/marker-azul-8.png create mode 100644 B4A/Files/marker-azul-80.png create mode 100644 B4A/Files/marker-azul-81.png create mode 100644 B4A/Files/marker-azul-82.png create mode 100644 B4A/Files/marker-azul-83.png create mode 100644 B4A/Files/marker-azul-84.png create mode 100644 B4A/Files/marker-azul-85.png create mode 100644 B4A/Files/marker-azul-86.png create mode 100644 B4A/Files/marker-azul-87.png create mode 100644 B4A/Files/marker-azul-88.png create mode 100644 B4A/Files/marker-azul-89.png create mode 100644 B4A/Files/marker-azul-9.png create mode 100644 B4A/Files/marker-azul-90.png create mode 100644 B4A/Files/marker-azul-91.png create mode 100644 B4A/Files/marker-azul-92.png create mode 100644 B4A/Files/marker-azul-93.png create mode 100644 B4A/Files/marker-azul-94.png create mode 100644 B4A/Files/marker-azul-95.png create mode 100644 B4A/Files/marker-azul-96.png create mode 100644 B4A/Files/marker-azul-97.png create mode 100644 B4A/Files/marker-azul-98.png create mode 100644 B4A/Files/marker-azul-99.png create mode 100644 B4A/Files/marker-rojo-0.png create mode 100644 B4A/Files/marker-rojo-1.png create mode 100644 B4A/Files/marker-rojo-10.png create mode 100644 B4A/Files/marker-rojo-100.png create mode 100644 B4A/Files/marker-rojo-101.png create mode 100644 B4A/Files/marker-rojo-102.png create mode 100644 B4A/Files/marker-rojo-103.png create mode 100644 B4A/Files/marker-rojo-104.png create mode 100644 B4A/Files/marker-rojo-105.png create mode 100644 B4A/Files/marker-rojo-106.png create mode 100644 B4A/Files/marker-rojo-107.png create mode 100644 B4A/Files/marker-rojo-108.png create mode 100644 B4A/Files/marker-rojo-109.png create mode 100644 B4A/Files/marker-rojo-11.png create mode 100644 B4A/Files/marker-rojo-110.png create mode 100644 B4A/Files/marker-rojo-111.png create mode 100644 B4A/Files/marker-rojo-112.png create mode 100644 B4A/Files/marker-rojo-113.png create mode 100644 B4A/Files/marker-rojo-114.png create mode 100644 B4A/Files/marker-rojo-115.png create mode 100644 B4A/Files/marker-rojo-116.png create mode 100644 B4A/Files/marker-rojo-117.png create mode 100644 B4A/Files/marker-rojo-118.png create mode 100644 B4A/Files/marker-rojo-119.png create mode 100644 B4A/Files/marker-rojo-12.png create mode 100644 B4A/Files/marker-rojo-120.png create mode 100644 B4A/Files/marker-rojo-121.png create mode 100644 B4A/Files/marker-rojo-122.png create mode 100644 B4A/Files/marker-rojo-123.png create mode 100644 B4A/Files/marker-rojo-124.png create mode 100644 B4A/Files/marker-rojo-125.png create mode 100644 B4A/Files/marker-rojo-126.png create mode 100644 B4A/Files/marker-rojo-127.png create mode 100644 B4A/Files/marker-rojo-128.png create mode 100644 B4A/Files/marker-rojo-129.png create mode 100644 B4A/Files/marker-rojo-13.png create mode 100644 B4A/Files/marker-rojo-130.png create mode 100644 B4A/Files/marker-rojo-131.png create mode 100644 B4A/Files/marker-rojo-132.png create mode 100644 B4A/Files/marker-rojo-133.png create mode 100644 B4A/Files/marker-rojo-134.png create mode 100644 B4A/Files/marker-rojo-135.png create mode 100644 B4A/Files/marker-rojo-136.png create mode 100644 B4A/Files/marker-rojo-137.png create mode 100644 B4A/Files/marker-rojo-138.png create mode 100644 B4A/Files/marker-rojo-139.png create mode 100644 B4A/Files/marker-rojo-14.png create mode 100644 B4A/Files/marker-rojo-140.png create mode 100644 B4A/Files/marker-rojo-141.png create mode 100644 B4A/Files/marker-rojo-142.png create mode 100644 B4A/Files/marker-rojo-143.png create mode 100644 B4A/Files/marker-rojo-144.png create mode 100644 B4A/Files/marker-rojo-145.png create mode 100644 B4A/Files/marker-rojo-146.png create mode 100644 B4A/Files/marker-rojo-147.png create mode 100644 B4A/Files/marker-rojo-148.png create mode 100644 B4A/Files/marker-rojo-149.png create mode 100644 B4A/Files/marker-rojo-15.png create mode 100644 B4A/Files/marker-rojo-150.png create mode 100644 B4A/Files/marker-rojo-16.png create mode 100644 B4A/Files/marker-rojo-17.png create mode 100644 B4A/Files/marker-rojo-18.png create mode 100644 B4A/Files/marker-rojo-19.png create mode 100644 B4A/Files/marker-rojo-2.png create mode 100644 B4A/Files/marker-rojo-20.png create mode 100644 B4A/Files/marker-rojo-21.png create mode 100644 B4A/Files/marker-rojo-22.png create mode 100644 B4A/Files/marker-rojo-23.png create mode 100644 B4A/Files/marker-rojo-24.png create mode 100644 B4A/Files/marker-rojo-25.png create mode 100644 B4A/Files/marker-rojo-26.png create mode 100644 B4A/Files/marker-rojo-27.png create mode 100644 B4A/Files/marker-rojo-28.png create mode 100644 B4A/Files/marker-rojo-29.png create mode 100644 B4A/Files/marker-rojo-3.png create mode 100644 B4A/Files/marker-rojo-30.png create mode 100644 B4A/Files/marker-rojo-31.png create mode 100644 B4A/Files/marker-rojo-32.png create mode 100644 B4A/Files/marker-rojo-33.png create mode 100644 B4A/Files/marker-rojo-34.png create mode 100644 B4A/Files/marker-rojo-35.png create mode 100644 B4A/Files/marker-rojo-36.png create mode 100644 B4A/Files/marker-rojo-37.png create mode 100644 B4A/Files/marker-rojo-38.png create mode 100644 B4A/Files/marker-rojo-39.png create mode 100644 B4A/Files/marker-rojo-4.png create mode 100644 B4A/Files/marker-rojo-40.png create mode 100644 B4A/Files/marker-rojo-41.png create mode 100644 B4A/Files/marker-rojo-42.png create mode 100644 B4A/Files/marker-rojo-43.png create mode 100644 B4A/Files/marker-rojo-44.png create mode 100644 B4A/Files/marker-rojo-45.png create mode 100644 B4A/Files/marker-rojo-46.png create mode 100644 B4A/Files/marker-rojo-47.png create mode 100644 B4A/Files/marker-rojo-48.png create mode 100644 B4A/Files/marker-rojo-49.png create mode 100644 B4A/Files/marker-rojo-5.png create mode 100644 B4A/Files/marker-rojo-50.png create mode 100644 B4A/Files/marker-rojo-51.png create mode 100644 B4A/Files/marker-rojo-52.png create mode 100644 B4A/Files/marker-rojo-53.png create mode 100644 B4A/Files/marker-rojo-54.png create mode 100644 B4A/Files/marker-rojo-55.png create mode 100644 B4A/Files/marker-rojo-56.png create mode 100644 B4A/Files/marker-rojo-57.png create mode 100644 B4A/Files/marker-rojo-58.png create mode 100644 B4A/Files/marker-rojo-59.png create mode 100644 B4A/Files/marker-rojo-6.png create mode 100644 B4A/Files/marker-rojo-60.png create mode 100644 B4A/Files/marker-rojo-61.png create mode 100644 B4A/Files/marker-rojo-62.png create mode 100644 B4A/Files/marker-rojo-63.png create mode 100644 B4A/Files/marker-rojo-64.png create mode 100644 B4A/Files/marker-rojo-65.png create mode 100644 B4A/Files/marker-rojo-66.png create mode 100644 B4A/Files/marker-rojo-67.png create mode 100644 B4A/Files/marker-rojo-68.png create mode 100644 B4A/Files/marker-rojo-69.png create mode 100644 B4A/Files/marker-rojo-7.png create mode 100644 B4A/Files/marker-rojo-70.png create mode 100644 B4A/Files/marker-rojo-71.png create mode 100644 B4A/Files/marker-rojo-72.png create mode 100644 B4A/Files/marker-rojo-73.png create mode 100644 B4A/Files/marker-rojo-74.png create mode 100644 B4A/Files/marker-rojo-75.png create mode 100644 B4A/Files/marker-rojo-76.png create mode 100644 B4A/Files/marker-rojo-77.png create mode 100644 B4A/Files/marker-rojo-78.png create mode 100644 B4A/Files/marker-rojo-79.png create mode 100644 B4A/Files/marker-rojo-8.png create mode 100644 B4A/Files/marker-rojo-80.png create mode 100644 B4A/Files/marker-rojo-81.png create mode 100644 B4A/Files/marker-rojo-82.png create mode 100644 B4A/Files/marker-rojo-83.png create mode 100644 B4A/Files/marker-rojo-84.png create mode 100644 B4A/Files/marker-rojo-85.png create mode 100644 B4A/Files/marker-rojo-86.png create mode 100644 B4A/Files/marker-rojo-87.png create mode 100644 B4A/Files/marker-rojo-88.png create mode 100644 B4A/Files/marker-rojo-89.png create mode 100644 B4A/Files/marker-rojo-9.png create mode 100644 B4A/Files/marker-rojo-90.png create mode 100644 B4A/Files/marker-rojo-91.png create mode 100644 B4A/Files/marker-rojo-92.png create mode 100644 B4A/Files/marker-rojo-93.png create mode 100644 B4A/Files/marker-rojo-94.png create mode 100644 B4A/Files/marker-rojo-95.png create mode 100644 B4A/Files/marker-rojo-96.png create mode 100644 B4A/Files/marker-rojo-97.png create mode 100644 B4A/Files/marker-rojo-98.png create mode 100644 B4A/Files/marker-rojo-99.png create mode 100644 B4A/Files/marker-verde-0.png create mode 100644 B4A/Files/marker-verde-1.png create mode 100644 B4A/Files/marker-verde-10.png create mode 100644 B4A/Files/marker-verde-100.png create mode 100644 B4A/Files/marker-verde-101.png create mode 100644 B4A/Files/marker-verde-102.png create mode 100644 B4A/Files/marker-verde-103.png create mode 100644 B4A/Files/marker-verde-104.png create mode 100644 B4A/Files/marker-verde-105.png create mode 100644 B4A/Files/marker-verde-106.png create mode 100644 B4A/Files/marker-verde-107.png create mode 100644 B4A/Files/marker-verde-108.png create mode 100644 B4A/Files/marker-verde-109.png create mode 100644 B4A/Files/marker-verde-11.png create mode 100644 B4A/Files/marker-verde-110.png create mode 100644 B4A/Files/marker-verde-111.png create mode 100644 B4A/Files/marker-verde-112.png create mode 100644 B4A/Files/marker-verde-113.png create mode 100644 B4A/Files/marker-verde-114.png create mode 100644 B4A/Files/marker-verde-115.png create mode 100644 B4A/Files/marker-verde-116.png create mode 100644 B4A/Files/marker-verde-117.png create mode 100644 B4A/Files/marker-verde-118.png create mode 100644 B4A/Files/marker-verde-119.png create mode 100644 B4A/Files/marker-verde-12.png create mode 100644 B4A/Files/marker-verde-120.png create mode 100644 B4A/Files/marker-verde-121.png create mode 100644 B4A/Files/marker-verde-122.png create mode 100644 B4A/Files/marker-verde-123.png create mode 100644 B4A/Files/marker-verde-124.png create mode 100644 B4A/Files/marker-verde-125.png create mode 100644 B4A/Files/marker-verde-126.png create mode 100644 B4A/Files/marker-verde-127.png create mode 100644 B4A/Files/marker-verde-128.png create mode 100644 B4A/Files/marker-verde-129.png create mode 100644 B4A/Files/marker-verde-13.png create mode 100644 B4A/Files/marker-verde-130.png create mode 100644 B4A/Files/marker-verde-131.png create mode 100644 B4A/Files/marker-verde-132.png create mode 100644 B4A/Files/marker-verde-133.png create mode 100644 B4A/Files/marker-verde-134.png create mode 100644 B4A/Files/marker-verde-135.png create mode 100644 B4A/Files/marker-verde-136.png create mode 100644 B4A/Files/marker-verde-137.png create mode 100644 B4A/Files/marker-verde-138.png create mode 100644 B4A/Files/marker-verde-139.png create mode 100644 B4A/Files/marker-verde-14.png create mode 100644 B4A/Files/marker-verde-140.png create mode 100644 B4A/Files/marker-verde-141.png create mode 100644 B4A/Files/marker-verde-142.png create mode 100644 B4A/Files/marker-verde-143.png create mode 100644 B4A/Files/marker-verde-144.png create mode 100644 B4A/Files/marker-verde-145.png create mode 100644 B4A/Files/marker-verde-146.png create mode 100644 B4A/Files/marker-verde-147.png create mode 100644 B4A/Files/marker-verde-148.png create mode 100644 B4A/Files/marker-verde-149.png create mode 100644 B4A/Files/marker-verde-15.png create mode 100644 B4A/Files/marker-verde-150.png create mode 100644 B4A/Files/marker-verde-16.png create mode 100644 B4A/Files/marker-verde-17.png create mode 100644 B4A/Files/marker-verde-18.png create mode 100644 B4A/Files/marker-verde-19.png create mode 100644 B4A/Files/marker-verde-2.png create mode 100644 B4A/Files/marker-verde-20.png create mode 100644 B4A/Files/marker-verde-21.png create mode 100644 B4A/Files/marker-verde-22.png create mode 100644 B4A/Files/marker-verde-23.png create mode 100644 B4A/Files/marker-verde-24.png create mode 100644 B4A/Files/marker-verde-25.png create mode 100644 B4A/Files/marker-verde-26.png create mode 100644 B4A/Files/marker-verde-27.png create mode 100644 B4A/Files/marker-verde-28.png create mode 100644 B4A/Files/marker-verde-29.png create mode 100644 B4A/Files/marker-verde-3.png create mode 100644 B4A/Files/marker-verde-30.png create mode 100644 B4A/Files/marker-verde-31.png create mode 100644 B4A/Files/marker-verde-32.png create mode 100644 B4A/Files/marker-verde-33.png create mode 100644 B4A/Files/marker-verde-34.png create mode 100644 B4A/Files/marker-verde-35.png create mode 100644 B4A/Files/marker-verde-36.png create mode 100644 B4A/Files/marker-verde-37.png create mode 100644 B4A/Files/marker-verde-38.png create mode 100644 B4A/Files/marker-verde-39.png create mode 100644 B4A/Files/marker-verde-4.png create mode 100644 B4A/Files/marker-verde-40.png create mode 100644 B4A/Files/marker-verde-41.png create mode 100644 B4A/Files/marker-verde-42.png create mode 100644 B4A/Files/marker-verde-43.png create mode 100644 B4A/Files/marker-verde-44.png create mode 100644 B4A/Files/marker-verde-45.png create mode 100644 B4A/Files/marker-verde-46.png create mode 100644 B4A/Files/marker-verde-47.png create mode 100644 B4A/Files/marker-verde-48.png create mode 100644 B4A/Files/marker-verde-49.png create mode 100644 B4A/Files/marker-verde-5.png create mode 100644 B4A/Files/marker-verde-50.png create mode 100644 B4A/Files/marker-verde-51.png create mode 100644 B4A/Files/marker-verde-52.png create mode 100644 B4A/Files/marker-verde-53.png create mode 100644 B4A/Files/marker-verde-54.png create mode 100644 B4A/Files/marker-verde-55.png create mode 100644 B4A/Files/marker-verde-56.png create mode 100644 B4A/Files/marker-verde-57.png create mode 100644 B4A/Files/marker-verde-58.png create mode 100644 B4A/Files/marker-verde-59.png create mode 100644 B4A/Files/marker-verde-6.png create mode 100644 B4A/Files/marker-verde-60.png create mode 100644 B4A/Files/marker-verde-61.png create mode 100644 B4A/Files/marker-verde-62.png create mode 100644 B4A/Files/marker-verde-63.png create mode 100644 B4A/Files/marker-verde-64.png create mode 100644 B4A/Files/marker-verde-65.png create mode 100644 B4A/Files/marker-verde-66.png create mode 100644 B4A/Files/marker-verde-67.png create mode 100644 B4A/Files/marker-verde-68.png create mode 100644 B4A/Files/marker-verde-69.png create mode 100644 B4A/Files/marker-verde-7.png create mode 100644 B4A/Files/marker-verde-70.png create mode 100644 B4A/Files/marker-verde-71.png create mode 100644 B4A/Files/marker-verde-72.png create mode 100644 B4A/Files/marker-verde-73.png create mode 100644 B4A/Files/marker-verde-74.png create mode 100644 B4A/Files/marker-verde-75.png create mode 100644 B4A/Files/marker-verde-76.png create mode 100644 B4A/Files/marker-verde-77.png create mode 100644 B4A/Files/marker-verde-78.png create mode 100644 B4A/Files/marker-verde-79.png create mode 100644 B4A/Files/marker-verde-8.png create mode 100644 B4A/Files/marker-verde-80.png create mode 100644 B4A/Files/marker-verde-81.png create mode 100644 B4A/Files/marker-verde-82.png create mode 100644 B4A/Files/marker-verde-83.png create mode 100644 B4A/Files/marker-verde-84.png create mode 100644 B4A/Files/marker-verde-85.png create mode 100644 B4A/Files/marker-verde-86.png create mode 100644 B4A/Files/marker-verde-87.png create mode 100644 B4A/Files/marker-verde-88.png create mode 100644 B4A/Files/marker-verde-89.png create mode 100644 B4A/Files/marker-verde-9.png create mode 100644 B4A/Files/marker-verde-90.png create mode 100644 B4A/Files/marker-verde-91.png create mode 100644 B4A/Files/marker-verde-92.png create mode 100644 B4A/Files/marker-verde-93.png create mode 100644 B4A/Files/marker-verde-94.png create mode 100644 B4A/Files/marker-verde-95.png create mode 100644 B4A/Files/marker-verde-96.png create mode 100644 B4A/Files/marker-verde-97.png create mode 100644 B4A/Files/marker-verde-98.png create mode 100644 B4A/Files/marker-verde-99.png create mode 100644 B4A/Files/nota.bal create mode 100644 B4A/Files/noventa.bal create mode 100644 B4A/Files/nuevo-cliente20.png create mode 100644 B4A/Files/nuevocliente.bal create mode 100644 B4A/Files/nuevocliente.jpg create mode 100644 B4A/Files/nvo cliente.jpg create mode 100644 B4A/Files/palomita_verde.png create mode 100644 B4A/Files/panel_pick_ciego.bal create mode 100644 B4A/Files/pedido.bal create mode 100644 B4A/Files/planfia_logo.png create mode 100644 B4A/Files/principal.bal create mode 100644 B4A/Files/proditem.bal create mode 100644 B4A/Files/proditem1.bal create mode 100644 B4A/Files/proditem2.bal create mode 100644 B4A/Files/proditempromo.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/resdia20.png create mode 100644 B4A/Files/resumendia.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/ticketdia20.jpg create mode 100644 B4A/Files/ticketdia20.png 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/MAPA_RUTAS.bas create mode 100644 B4A/MARQUEZ.b4a.meta 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/_git_tag.ps1 create mode 100644 B4A/appUpdater.bas create mode 100644 B4A/cPDF.bas create mode 100644 B4A/google-services.json create mode 100644 B4A/test.bas create mode 100644 B4A/updateAvailable.bas diff --git a/B4A/ADM.b4a b/B4A/ADM.b4a new file mode 100644 index 0000000..c86b111 --- /dev/null +++ b/B4A/ADM.b4a @@ -0,0 +1,1197 @@ +Build1=Default,adm.keymon.com.mx +File1=abordo.png +File10=datoscliente.bal +File100=marker-azul-19.png +File101=marker-azul-2.png +File102=marker-azul-20.png +File103=marker-azul-21.png +File104=marker-azul-22.png +File105=marker-azul-23.png +File106=marker-azul-24.png +File107=marker-azul-25.png +File108=marker-azul-26.png +File109=marker-azul-27.png +File11=desvanecido.png +File110=marker-azul-28.png +File111=marker-azul-29.png +File112=marker-azul-3.png +File113=marker-azul-30.png +File114=marker-azul-31.png +File115=marker-azul-32.png +File116=marker-azul-33.png +File117=marker-azul-34.png +File118=marker-azul-35.png +File119=marker-azul-36.png +File12=durakelo.png +File120=marker-azul-37.png +File121=marker-azul-38.png +File122=marker-azul-39.png +File123=marker-azul-4.png +File124=marker-azul-40.png +File125=marker-azul-41.png +File126=marker-azul-42.png +File127=marker-azul-43.png +File128=marker-azul-44.png +File129=marker-azul-45.png +File13=engrane.jpg +File130=marker-azul-46.png +File131=marker-azul-47.png +File132=marker-azul-48.png +File133=marker-azul-49.png +File134=marker-azul-5.png +File135=marker-azul-50.png +File136=marker-azul-51.png +File137=marker-azul-52.png +File138=marker-azul-53.png +File139=marker-azul-54.png +File14=engrane.png +File140=marker-azul-55.png +File141=marker-azul-56.png +File142=marker-azul-57.png +File143=marker-azul-58.png +File144=marker-azul-59.png +File145=marker-azul-6.png +File146=marker-azul-60.png +File147=marker-azul-61.png +File148=marker-azul-62.png +File149=marker-azul-63.png +File15=engrane_gris.png +File150=marker-azul-64.png +File151=marker-azul-65.png +File152=marker-azul-66.png +File153=marker-azul-67.png +File154=marker-azul-68.png +File155=marker-azul-69.png +File156=marker-azul-7.png +File157=marker-azul-70.png +File158=marker-azul-71.png +File159=marker-azul-72.png +File16=folioabono.bal +File160=marker-azul-73.png +File161=marker-azul-74.png +File162=marker-azul-75.png +File163=marker-azul-76.png +File164=marker-azul-77.png +File165=marker-azul-78.png +File166=marker-azul-79.png +File167=marker-azul-8.png +File168=marker-azul-80.png +File169=marker-azul-81.png +File17=fondo_kmt.jpg +File170=marker-azul-82.png +File171=marker-azul-83.png +File172=marker-azul-84.png +File173=marker-azul-85.png +File174=marker-azul-86.png +File175=marker-azul-87.png +File176=marker-azul-88.png +File177=marker-azul-89.png +File178=marker-azul-9.png +File179=marker-azul-90.png +File18=gps20.png +File180=marker-azul-91.png +File181=marker-azul-92.png +File182=marker-azul-93.png +File183=marker-azul-94.png +File184=marker-azul-95.png +File185=marker-azul-96.png +File186=marker-azul-97.png +File187=marker-azul-98.png +File188=marker-azul-99.png +File189=marker-rojo-0.png +File19=guna-fondo.jpg +File190=marker-rojo-1.png +File191=marker-rojo-10.png +File192=marker-rojo-100.png +File193=marker-rojo-101.png +File194=marker-rojo-102.png +File195=marker-rojo-103.png +File196=marker-rojo-104.png +File197=marker-rojo-105.png +File198=marker-rojo-106.png +File199=marker-rojo-107.png +File2=alert2.png +File20=Hacer pedido.jpg +File200=marker-rojo-108.png +File201=marker-rojo-109.png +File202=marker-rojo-11.png +File203=marker-rojo-110.png +File204=marker-rojo-111.png +File205=marker-rojo-112.png +File206=marker-rojo-113.png +File207=marker-rojo-114.png +File208=marker-rojo-115.png +File209=marker-rojo-116.png +File21=hacerpedido30.jpg +File210=marker-rojo-117.png +File211=marker-rojo-118.png +File212=marker-rojo-119.png +File213=marker-rojo-12.png +File214=marker-rojo-120.png +File215=marker-rojo-121.png +File216=marker-rojo-122.png +File217=marker-rojo-123.png +File218=marker-rojo-124.png +File219=marker-rojo-125.png +File22=hacerpedido30.png +File220=marker-rojo-126.png +File221=marker-rojo-127.png +File222=marker-rojo-128.png +File223=marker-rojo-129.png +File224=marker-rojo-13.png +File225=marker-rojo-130.png +File226=marker-rojo-131.png +File227=marker-rojo-132.png +File228=marker-rojo-133.png +File229=marker-rojo-134.png +File23=iniciofinventa.bal +File230=marker-rojo-135.png +File231=marker-rojo-136.png +File232=marker-rojo-137.png +File233=marker-rojo-138.png +File234=marker-rojo-139.png +File235=marker-rojo-14.png +File236=marker-rojo-140.png +File237=marker-rojo-141.png +File238=marker-rojo-142.png +File239=marker-rojo-143.png +File24=intmex_logo_192x192.jpg +File240=marker-rojo-144.png +File241=marker-rojo-145.png +File242=marker-rojo-146.png +File243=marker-rojo-147.png +File244=marker-rojo-148.png +File245=marker-rojo-149.png +File246=marker-rojo-15.png +File247=marker-rojo-150.png +File248=marker-rojo-16.png +File249=marker-rojo-17.png +File25=intmex_logo_192x192.png +File250=marker-rojo-18.png +File251=marker-rojo-19.png +File252=marker-rojo-2.png +File253=marker-rojo-20.png +File254=marker-rojo-21.png +File255=marker-rojo-22.png +File256=marker-rojo-23.png +File257=marker-rojo-24.png +File258=marker-rojo-25.png +File259=marker-rojo-26.png +File26=intmex_logo_192x192_old.jpg +File260=marker-rojo-27.png +File261=marker-rojo-28.png +File262=marker-rojo-29.png +File263=marker-rojo-3.png +File264=marker-rojo-30.png +File265=marker-rojo-31.png +File266=marker-rojo-32.png +File267=marker-rojo-33.png +File268=marker-rojo-34.png +File269=marker-rojo-35.png +File27=itembuttonblue.png +File270=marker-rojo-36.png +File271=marker-rojo-37.png +File272=marker-rojo-38.png +File273=marker-rojo-39.png +File274=marker-rojo-4.png +File275=marker-rojo-40.png +File276=marker-rojo-41.png +File277=marker-rojo-42.png +File278=marker-rojo-43.png +File279=marker-rojo-44.png +File28=kmt.db +File280=marker-rojo-45.png +File281=marker-rojo-46.png +File282=marker-rojo-47.png +File283=marker-rojo-48.png +File284=marker-rojo-49.png +File285=marker-rojo-5.png +File286=marker-rojo-50.png +File287=marker-rojo-51.png +File288=marker-rojo-52.png +File289=marker-rojo-53.png +File29=login.bal +File290=marker-rojo-54.png +File291=marker-rojo-55.png +File292=marker-rojo-56.png +File293=marker-rojo-57.png +File294=marker-rojo-58.png +File295=marker-rojo-59.png +File296=marker-rojo-6.png +File297=marker-rojo-60.png +File298=marker-rojo-61.png +File299=marker-rojo-62.png +File3=alerta_amarilla.png +File30=Logo_192x192.jpg +File300=marker-rojo-63.png +File301=marker-rojo-64.png +File302=marker-rojo-65.png +File303=marker-rojo-66.png +File304=marker-rojo-67.png +File305=marker-rojo-68.png +File306=marker-rojo-69.png +File307=marker-rojo-7.png +File308=marker-rojo-70.png +File309=marker-rojo-71.png +File31=logo_mariana.jpeg +File310=marker-rojo-72.png +File311=marker-rojo-73.png +File312=marker-rojo-74.png +File313=marker-rojo-75.png +File314=marker-rojo-76.png +File315=marker-rojo-77.png +File316=marker-rojo-78.png +File317=marker-rojo-79.png +File318=marker-rojo-8.png +File319=marker-rojo-80.png +File32=MainPage.bal +File320=marker-rojo-81.png +File321=marker-rojo-82.png +File322=marker-rojo-83.png +File323=marker-rojo-84.png +File324=marker-rojo-85.png +File325=marker-rojo-86.png +File326=marker-rojo-87.png +File327=marker-rojo-88.png +File328=marker-rojo-89.png +File329=marker-rojo-9.png +File33=Malo.jpg +File330=marker-rojo-90.png +File331=marker-rojo-91.png +File332=marker-rojo-92.png +File333=marker-rojo-93.png +File334=marker-rojo-94.png +File335=marker-rojo-95.png +File336=marker-rojo-96.png +File337=marker-rojo-97.png +File338=marker-rojo-98.png +File339=marker-rojo-99.png +File34=mapa_rutas.bal +File340=marker-verde-0.png +File341=marker-verde-1.png +File342=marker-verde-10.png +File343=marker-verde-100.png +File344=marker-verde-101.png +File345=marker-verde-102.png +File346=marker-verde-103.png +File347=marker-verde-104.png +File348=marker-verde-105.png +File349=marker-verde-106.png +File35=mariana.jpg +File350=marker-verde-107.png +File351=marker-verde-108.png +File352=marker-verde-109.png +File353=marker-verde-11.png +File354=marker-verde-110.png +File355=marker-verde-111.png +File356=marker-verde-112.png +File357=marker-verde-113.png +File358=marker-verde-114.png +File359=marker-verde-115.png +File36=mariana_ico.png +File360=marker-verde-116.png +File361=marker-verde-117.png +File362=marker-verde-118.png +File363=marker-verde-119.png +File364=marker-verde-12.png +File365=marker-verde-120.png +File366=marker-verde-121.png +File367=marker-verde-122.png +File368=marker-verde-123.png +File369=marker-verde-124.png +File37=mariana1.jpg +File370=marker-verde-125.png +File371=marker-verde-126.png +File372=marker-verde-127.png +File373=marker-verde-128.png +File374=marker-verde-129.png +File375=marker-verde-13.png +File376=marker-verde-130.png +File377=marker-verde-131.png +File378=marker-verde-132.png +File379=marker-verde-133.png +File38=marker-azul-0.png +File380=marker-verde-134.png +File381=marker-verde-135.png +File382=marker-verde-136.png +File383=marker-verde-137.png +File384=marker-verde-138.png +File385=marker-verde-139.png +File386=marker-verde-14.png +File387=marker-verde-140.png +File388=marker-verde-141.png +File389=marker-verde-142.png +File39=marker-azul-1.png +File390=marker-verde-143.png +File391=marker-verde-144.png +File392=marker-verde-145.png +File393=marker-verde-146.png +File394=marker-verde-147.png +File395=marker-verde-148.png +File396=marker-verde-149.png +File397=marker-verde-15.png +File398=marker-verde-150.png +File399=marker-verde-16.png +File4=anterior.jpg +File40=marker-azul-10.png +File400=marker-verde-17.png +File401=marker-verde-18.png +File402=marker-verde-19.png +File403=marker-verde-2.png +File404=marker-verde-20.png +File405=marker-verde-21.png +File406=marker-verde-22.png +File407=marker-verde-23.png +File408=marker-verde-24.png +File409=marker-verde-25.png +File41=marker-azul-100.png +File410=marker-verde-26.png +File411=marker-verde-27.png +File412=marker-verde-28.png +File413=marker-verde-29.png +File414=marker-verde-3.png +File415=marker-verde-30.png +File416=marker-verde-31.png +File417=marker-verde-32.png +File418=marker-verde-33.png +File419=marker-verde-34.png +File42=marker-azul-101.png +File420=marker-verde-35.png +File421=marker-verde-36.png +File422=marker-verde-37.png +File423=marker-verde-38.png +File424=marker-verde-39.png +File425=marker-verde-4.png +File426=marker-verde-40.png +File427=marker-verde-41.png +File428=marker-verde-42.png +File429=marker-verde-43.png +File43=marker-azul-102.png +File430=marker-verde-44.png +File431=marker-verde-45.png +File432=marker-verde-46.png +File433=marker-verde-47.png +File434=marker-verde-48.png +File435=marker-verde-49.png +File436=marker-verde-5.png +File437=marker-verde-50.png +File438=marker-verde-51.png +File439=marker-verde-52.png +File44=marker-azul-103.png +File440=marker-verde-53.png +File441=marker-verde-54.png +File442=marker-verde-55.png +File443=marker-verde-56.png +File444=marker-verde-57.png +File445=marker-verde-58.png +File446=marker-verde-59.png +File447=marker-verde-6.png +File448=marker-verde-60.png +File449=marker-verde-61.png +File45=marker-azul-104.png +File450=marker-verde-62.png +File451=marker-verde-63.png +File452=marker-verde-64.png +File453=marker-verde-65.png +File454=marker-verde-66.png +File455=marker-verde-67.png +File456=marker-verde-68.png +File457=marker-verde-69.png +File458=marker-verde-7.png +File459=marker-verde-70.png +File46=marker-azul-105.png +File460=marker-verde-71.png +File461=marker-verde-72.png +File462=marker-verde-73.png +File463=marker-verde-74.png +File464=marker-verde-75.png +File465=marker-verde-76.png +File466=marker-verde-77.png +File467=marker-verde-78.png +File468=marker-verde-79.png +File469=marker-verde-8.png +File47=marker-azul-106.png +File470=marker-verde-80.png +File471=marker-verde-81.png +File472=marker-verde-82.png +File473=marker-verde-83.png +File474=marker-verde-84.png +File475=marker-verde-85.png +File476=marker-verde-86.png +File477=marker-verde-87.png +File478=marker-verde-88.png +File479=marker-verde-89.png +File48=marker-azul-107.png +File480=marker-verde-9.png +File481=marker-verde-90.png +File482=marker-verde-91.png +File483=marker-verde-92.png +File484=marker-verde-93.png +File485=marker-verde-94.png +File486=marker-verde-95.png +File487=marker-verde-96.png +File488=marker-verde-97.png +File489=marker-verde-98.png +File49=marker-azul-108.png +File490=marker-verde-99.png +File491=nota.bal +File492=noventa.bal +File493=nuevocliente.bal +File494=nuevocliente.jpg +File495=nuevo-cliente20.png +File496=Nvo Cliente.jpg +File497=palomita_verde.png +File498=PANEL_PICK_CIEGO.bal +File499=pedido.bal +File5=bus-ar.png +File50=marker-azul-109.png +File500=planfia_logo.png +File501=principal.bal +File502=proditem.bal +File503=proditem1.bal +File504=proditem2.bal +File505=proditempromo.bal +File506=productos.bal +File507=promociones.bal +File508=resdia.bal +File509=ResDia.jpg +File51=marker-azul-11.png +File510=resdia20.png +File511=resumendia.jpg +File512=salma.jpg +File513=salma.png +File514=scrollpromos.bal +File515=senial.jpg +File516=sync.png +File517=tache_rojo.png +File518=Ticket dia.jpg +File519=ticketdia20.jpg +File52=marker-azul-110.png +File520=ticketdia20.png +File521=ticketsdia.bal +File522=Tiendita.jpg +File523=verde.png +File53=marker-azul-111.png +File54=marker-azul-112.png +File55=marker-azul-113.png +File56=marker-azul-114.png +File57=marker-azul-115.png +File58=marker-azul-116.png +File59=marker-azul-117.png +File6=carrito.png +File60=marker-azul-118.png +File61=marker-azul-119.png +File62=marker-azul-12.png +File63=marker-azul-120.png +File64=marker-azul-121.png +File65=marker-azul-122.png +File66=marker-azul-123.png +File67=marker-azul-124.png +File68=marker-azul-125.png +File69=marker-azul-126.png +File7=celltitle.bal +File70=marker-azul-127.png +File71=marker-azul-128.png +File72=marker-azul-129.png +File73=marker-azul-13.png +File74=marker-azul-130.png +File75=marker-azul-131.png +File76=marker-azul-132.png +File77=marker-azul-133.png +File78=marker-azul-134.png +File79=marker-azul-135.png +File8=cliente.bal +File80=marker-azul-136.png +File81=marker-azul-137.png +File82=marker-azul-138.png +File83=marker-azul-139.png +File84=marker-azul-14.png +File85=marker-azul-140.png +File86=marker-azul-141.png +File87=marker-azul-142.png +File88=marker-azul-143.png +File89=marker-azul-144.png +File9=clientes.bal +File90=marker-azul-145.png +File91=marker-azul-146.png +File92=marker-azul-147.png +File93=marker-azul-148.png +File94=marker-azul-149.png +File95=marker-azul-15.png +File96=marker-azul-150.png +File97=marker-azul-16.png +File98=marker-azul-17.png +File99=marker-azul-18.png +FileGroup1=Default Group +FileGroup10=Default Group +FileGroup100=Default Group +FileGroup101=Default Group +FileGroup102=Default Group +FileGroup103=Default Group +FileGroup104=Default Group +FileGroup105=Default Group +FileGroup106=Default Group +FileGroup107=Default Group +FileGroup108=Default Group +FileGroup109=Default Group +FileGroup11=Default Group +FileGroup110=Default Group +FileGroup111=Default Group +FileGroup112=Default Group +FileGroup113=Default Group +FileGroup114=Default Group +FileGroup115=Default Group +FileGroup116=Default Group +FileGroup117=Default Group +FileGroup118=Default Group +FileGroup119=Default Group +FileGroup12=Default Group +FileGroup120=Default Group +FileGroup121=Default Group +FileGroup122=Default Group +FileGroup123=Default Group +FileGroup124=Default Group +FileGroup125=Default Group +FileGroup126=Default Group +FileGroup127=Default Group +FileGroup128=Default Group +FileGroup129=Default Group +FileGroup13=Default Group +FileGroup130=Default Group +FileGroup131=Default Group +FileGroup132=Default Group +FileGroup133=Default Group +FileGroup134=Default Group +FileGroup135=Default Group +FileGroup136=Default Group +FileGroup137=Default Group +FileGroup138=Default Group +FileGroup139=Default Group +FileGroup14=Default Group +FileGroup140=Default Group +FileGroup141=Default Group +FileGroup142=Default Group +FileGroup143=Default Group +FileGroup144=Default Group +FileGroup145=Default Group +FileGroup146=Default Group +FileGroup147=Default Group +FileGroup148=Default Group +FileGroup149=Default Group +FileGroup15=Default Group +FileGroup150=Default Group +FileGroup151=Default Group +FileGroup152=Default Group +FileGroup153=Default Group +FileGroup154=Default Group +FileGroup155=Default Group +FileGroup156=Default Group +FileGroup157=Default Group +FileGroup158=Default Group +FileGroup159=Default Group +FileGroup16=Default Group +FileGroup160=Default Group +FileGroup161=Default Group +FileGroup162=Default Group +FileGroup163=Default Group +FileGroup164=Default Group +FileGroup165=Default Group +FileGroup166=Default Group +FileGroup167=Default Group +FileGroup168=Default Group +FileGroup169=Default Group +FileGroup17=Default Group +FileGroup170=Default Group +FileGroup171=Default Group +FileGroup172=Default Group +FileGroup173=Default Group +FileGroup174=Default Group +FileGroup175=Default Group +FileGroup176=Default Group +FileGroup177=Default Group +FileGroup178=Default Group +FileGroup179=Default Group +FileGroup18=Default Group +FileGroup180=Default Group +FileGroup181=Default Group +FileGroup182=Default Group +FileGroup183=Default Group +FileGroup184=Default Group +FileGroup185=Default Group +FileGroup186=Default Group +FileGroup187=Default Group +FileGroup188=Default Group +FileGroup189=Default Group +FileGroup19=Default Group +FileGroup190=Default Group +FileGroup191=Default Group +FileGroup192=Default Group +FileGroup193=Default Group +FileGroup194=Default Group +FileGroup195=Default Group +FileGroup196=Default Group +FileGroup197=Default Group +FileGroup198=Default Group +FileGroup199=Default Group +FileGroup2=Default Group +FileGroup20=Default Group +FileGroup200=Default Group +FileGroup201=Default Group +FileGroup202=Default Group +FileGroup203=Default Group +FileGroup204=Default Group +FileGroup205=Default Group +FileGroup206=Default Group +FileGroup207=Default Group +FileGroup208=Default Group +FileGroup209=Default Group +FileGroup21=Default Group +FileGroup210=Default Group +FileGroup211=Default Group +FileGroup212=Default Group +FileGroup213=Default Group +FileGroup214=Default Group +FileGroup215=Default Group +FileGroup216=Default Group +FileGroup217=Default Group +FileGroup218=Default Group +FileGroup219=Default Group +FileGroup22=Default Group +FileGroup220=Default Group +FileGroup221=Default Group +FileGroup222=Default Group +FileGroup223=Default Group +FileGroup224=Default Group +FileGroup225=Default Group +FileGroup226=Default Group +FileGroup227=Default Group +FileGroup228=Default Group +FileGroup229=Default Group +FileGroup23=Default Group +FileGroup230=Default Group +FileGroup231=Default Group +FileGroup232=Default Group +FileGroup233=Default Group +FileGroup234=Default Group +FileGroup235=Default Group +FileGroup236=Default Group +FileGroup237=Default Group +FileGroup238=Default Group +FileGroup239=Default Group +FileGroup24=Default Group +FileGroup240=Default Group +FileGroup241=Default Group +FileGroup242=Default Group +FileGroup243=Default Group +FileGroup244=Default Group +FileGroup245=Default Group +FileGroup246=Default Group +FileGroup247=Default Group +FileGroup248=Default Group +FileGroup249=Default Group +FileGroup25=Default Group +FileGroup250=Default Group +FileGroup251=Default Group +FileGroup252=Default Group +FileGroup253=Default Group +FileGroup254=Default Group +FileGroup255=Default Group +FileGroup256=Default Group +FileGroup257=Default Group +FileGroup258=Default Group +FileGroup259=Default Group +FileGroup26=Default Group +FileGroup260=Default Group +FileGroup261=Default Group +FileGroup262=Default Group +FileGroup263=Default Group +FileGroup264=Default Group +FileGroup265=Default Group +FileGroup266=Default Group +FileGroup267=Default Group +FileGroup268=Default Group +FileGroup269=Default Group +FileGroup27=Default Group +FileGroup270=Default Group +FileGroup271=Default Group +FileGroup272=Default Group +FileGroup273=Default Group +FileGroup274=Default Group +FileGroup275=Default Group +FileGroup276=Default Group +FileGroup277=Default Group +FileGroup278=Default Group +FileGroup279=Default Group +FileGroup28=Default Group +FileGroup280=Default Group +FileGroup281=Default Group +FileGroup282=Default Group +FileGroup283=Default Group +FileGroup284=Default Group +FileGroup285=Default Group +FileGroup286=Default Group +FileGroup287=Default Group +FileGroup288=Default Group +FileGroup289=Default Group +FileGroup29=Default Group +FileGroup290=Default Group +FileGroup291=Default Group +FileGroup292=Default Group +FileGroup293=Default Group +FileGroup294=Default Group +FileGroup295=Default Group +FileGroup296=Default Group +FileGroup297=Default Group +FileGroup298=Default Group +FileGroup299=Default Group +FileGroup3=Default Group +FileGroup30=Default Group +FileGroup300=Default Group +FileGroup301=Default Group +FileGroup302=Default Group +FileGroup303=Default Group +FileGroup304=Default Group +FileGroup305=Default Group +FileGroup306=Default Group +FileGroup307=Default Group +FileGroup308=Default Group +FileGroup309=Default Group +FileGroup31=Default Group +FileGroup310=Default Group +FileGroup311=Default Group +FileGroup312=Default Group +FileGroup313=Default Group +FileGroup314=Default Group +FileGroup315=Default Group +FileGroup316=Default Group +FileGroup317=Default Group +FileGroup318=Default Group +FileGroup319=Default Group +FileGroup32=Default Group +FileGroup320=Default Group +FileGroup321=Default Group +FileGroup322=Default Group +FileGroup323=Default Group +FileGroup324=Default Group +FileGroup325=Default Group +FileGroup326=Default Group +FileGroup327=Default Group +FileGroup328=Default Group +FileGroup329=Default Group +FileGroup33=Default Group +FileGroup330=Default Group +FileGroup331=Default Group +FileGroup332=Default Group +FileGroup333=Default Group +FileGroup334=Default Group +FileGroup335=Default Group +FileGroup336=Default Group +FileGroup337=Default Group +FileGroup338=Default Group +FileGroup339=Default Group +FileGroup34=Default Group +FileGroup340=Default Group +FileGroup341=Default Group +FileGroup342=Default Group +FileGroup343=Default Group +FileGroup344=Default Group +FileGroup345=Default Group +FileGroup346=Default Group +FileGroup347=Default Group +FileGroup348=Default Group +FileGroup349=Default Group +FileGroup35=Default Group +FileGroup350=Default Group +FileGroup351=Default Group +FileGroup352=Default Group +FileGroup353=Default Group +FileGroup354=Default Group +FileGroup355=Default Group +FileGroup356=Default Group +FileGroup357=Default Group +FileGroup358=Default Group +FileGroup359=Default Group +FileGroup36=Default Group +FileGroup360=Default Group +FileGroup361=Default Group +FileGroup362=Default Group +FileGroup363=Default Group +FileGroup364=Default Group +FileGroup365=Default Group +FileGroup366=Default Group +FileGroup367=Default Group +FileGroup368=Default Group +FileGroup369=Default Group +FileGroup37=Default Group +FileGroup370=Default Group +FileGroup371=Default Group +FileGroup372=Default Group +FileGroup373=Default Group +FileGroup374=Default Group +FileGroup375=Default Group +FileGroup376=Default Group +FileGroup377=Default Group +FileGroup378=Default Group +FileGroup379=Default Group +FileGroup38=Default Group +FileGroup380=Default Group +FileGroup381=Default Group +FileGroup382=Default Group +FileGroup383=Default Group +FileGroup384=Default Group +FileGroup385=Default Group +FileGroup386=Default Group +FileGroup387=Default Group +FileGroup388=Default Group +FileGroup389=Default Group +FileGroup39=Default Group +FileGroup390=Default Group +FileGroup391=Default Group +FileGroup392=Default Group +FileGroup393=Default Group +FileGroup394=Default Group +FileGroup395=Default Group +FileGroup396=Default Group +FileGroup397=Default Group +FileGroup398=Default Group +FileGroup399=Default Group +FileGroup4=Default Group +FileGroup40=Default Group +FileGroup400=Default Group +FileGroup401=Default Group +FileGroup402=Default Group +FileGroup403=Default Group +FileGroup404=Default Group +FileGroup405=Default Group +FileGroup406=Default Group +FileGroup407=Default Group +FileGroup408=Default Group +FileGroup409=Default Group +FileGroup41=Default Group +FileGroup410=Default Group +FileGroup411=Default Group +FileGroup412=Default Group +FileGroup413=Default Group +FileGroup414=Default Group +FileGroup415=Default Group +FileGroup416=Default Group +FileGroup417=Default Group +FileGroup418=Default Group +FileGroup419=Default Group +FileGroup42=Default Group +FileGroup420=Default Group +FileGroup421=Default Group +FileGroup422=Default Group +FileGroup423=Default Group +FileGroup424=Default Group +FileGroup425=Default Group +FileGroup426=Default Group +FileGroup427=Default Group +FileGroup428=Default Group +FileGroup429=Default Group +FileGroup43=Default Group +FileGroup430=Default Group +FileGroup431=Default Group +FileGroup432=Default Group +FileGroup433=Default Group +FileGroup434=Default Group +FileGroup435=Default Group +FileGroup436=Default Group +FileGroup437=Default Group +FileGroup438=Default Group +FileGroup439=Default Group +FileGroup44=Default Group +FileGroup440=Default Group +FileGroup441=Default Group +FileGroup442=Default Group +FileGroup443=Default Group +FileGroup444=Default Group +FileGroup445=Default Group +FileGroup446=Default Group +FileGroup447=Default Group +FileGroup448=Default Group +FileGroup449=Default Group +FileGroup45=Default Group +FileGroup450=Default Group +FileGroup451=Default Group +FileGroup452=Default Group +FileGroup453=Default Group +FileGroup454=Default Group +FileGroup455=Default Group +FileGroup456=Default Group +FileGroup457=Default Group +FileGroup458=Default Group +FileGroup459=Default Group +FileGroup46=Default Group +FileGroup460=Default Group +FileGroup461=Default Group +FileGroup462=Default Group +FileGroup463=Default Group +FileGroup464=Default Group +FileGroup465=Default Group +FileGroup466=Default Group +FileGroup467=Default Group +FileGroup468=Default Group +FileGroup469=Default Group +FileGroup47=Default Group +FileGroup470=Default Group +FileGroup471=Default Group +FileGroup472=Default Group +FileGroup473=Default Group +FileGroup474=Default Group +FileGroup475=Default Group +FileGroup476=Default Group +FileGroup477=Default Group +FileGroup478=Default Group +FileGroup479=Default Group +FileGroup48=Default Group +FileGroup480=Default Group +FileGroup481=Default Group +FileGroup482=Default Group +FileGroup483=Default Group +FileGroup484=Default Group +FileGroup485=Default Group +FileGroup486=Default Group +FileGroup487=Default Group +FileGroup488=Default Group +FileGroup489=Default Group +FileGroup49=Default Group +FileGroup490=Default Group +FileGroup491=Default Group +FileGroup492=Default Group +FileGroup493=Default Group +FileGroup494=Default Group +FileGroup495=Default Group +FileGroup496=Default Group +FileGroup497=Default Group +FileGroup498=Default Group +FileGroup499=Default Group +FileGroup5=Default Group +FileGroup50=Default Group +FileGroup500=Default Group +FileGroup501=Default Group +FileGroup502=Default Group +FileGroup503=Default Group +FileGroup504=Default Group +FileGroup505=Default Group +FileGroup506=Default Group +FileGroup507=Default Group +FileGroup508=Default Group +FileGroup509=Default Group +FileGroup51=Default Group +FileGroup510=Default Group +FileGroup511=Default Group +FileGroup512=Default Group +FileGroup513=Default Group +FileGroup514=Default Group +FileGroup515=Default Group +FileGroup516=Default Group +FileGroup517=Default Group +FileGroup518=Default Group +FileGroup519=Default Group +FileGroup52=Default Group +FileGroup520=Default Group +FileGroup521=Default Group +FileGroup522=Default Group +FileGroup523=Default Group +FileGroup53=Default Group +FileGroup54=Default Group +FileGroup55=Default Group +FileGroup56=Default Group +FileGroup57=Default Group +FileGroup58=Default Group +FileGroup59=Default Group +FileGroup6=Default Group +FileGroup60=Default Group +FileGroup61=Default Group +FileGroup62=Default Group +FileGroup63=Default Group +FileGroup64=Default Group +FileGroup65=Default Group +FileGroup66=Default Group +FileGroup67=Default Group +FileGroup68=Default Group +FileGroup69=Default Group +FileGroup7=Default Group +FileGroup70=Default Group +FileGroup71=Default Group +FileGroup72=Default Group +FileGroup73=Default Group +FileGroup74=Default Group +FileGroup75=Default Group +FileGroup76=Default Group +FileGroup77=Default Group +FileGroup78=Default Group +FileGroup79=Default Group +FileGroup8=Default Group +FileGroup80=Default Group +FileGroup81=Default Group +FileGroup82=Default Group +FileGroup83=Default Group +FileGroup84=Default Group +FileGroup85=Default Group +FileGroup86=Default Group +FileGroup87=Default Group +FileGroup88=Default Group +FileGroup89=Default Group +FileGroup9=Default Group +FileGroup90=Default Group +FileGroup91=Default Group +FileGroup92=Default Group +FileGroup93=Default Group +FileGroup94=Default Group +FileGroup95=Default Group +FileGroup96=Default Group +FileGroup97=Default Group +FileGroup98=Default Group +FileGroup99=Default Group +Group=Default Group +Library1=appupdating +Library10=core +Library11=fileprovider +Library12=firebaseadmob +Library13=firebaseanalytics +Library14=firebasenotifications +Library15=fusedlocationprovider +Library16=googlemaps +Library17=googlemapsextras +Library18=gps +Library19=ime +Library2=b4xpages +Library20=javaobject +Library21=json +Library22=okhttputils2 +Library23=phone +Library24=preoptimizedclv +Library25=randomaccessfile +Library26=replyauto +Library27=rspopupmenu +Library28=runtimepermissions +Library29=serial +Library3=baqrcode +Library30=sql +Library31=stringutils +Library32=togglelibrary +Library33=xcustomlistview +Library34=xui +Library4=batteryprogressview +Library5=bitmapcreator +Library6=byteconverter +Library7=camera +Library8=compressstrings +Library9=contentresolver +ManifestCode='This code will be applied to the manifest file during compilation.~\n~'You do not need to modify it in most cases.~\n~'See this link for for more information: https://www.b4x.com/forum/showthread.php?p=78136~\n~AddManifestText(~\n~~\n~)~\n~SetApplicationAttribute(android:icon, "@drawable/icon")~\n~SetApplicationAttribute(android:label, "$LABEL$")~\n~CreateResourceFromFile(Macro, Themes.LightTheme)~\n~AddApplicationText(~\n~)~\n~CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~ 'End of default text.~\n~''''' CAMBIA LA CLAVE API~\n~AddApplicationText(~\n~~\n~ ~\n~)~\n~AddApplicationText(~\n~~\n~)~\n~AddManifestText(~\n~~\n~)~\n~''CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~ 'End of default text.~\n~ ~\n~SetApplicationAttribute(android:usesCleartextTraffic, "true")~\n~AddManifestText(~\n~~\n~)~\n~AddManifestText(~\n~~\n~)~\n~AddPermission(android.permission.ACCESS_BACKGROUND_LOCATION)~\n~AddManifestText(~\n~~\n~)~\n~AddManifestText(~\n~~\n~) 'in order to access the device non-resettable identifiers such as IMEI and serial number.~\n~~\n~'///////////////////////// FLP Y PUSH /////////////~\n~' CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~' CreateResourceFromFile(Macro, FirebaseAnalytics.Firebase)~\n~' CreateResourceFromFile(Macro, FirebaseAnalytics.FirebaseAnalytics)~\n~' CreateResourceFromFile(Macro, FirebaseNotifications.FirebaseNotifications)~\n~ SetServiceAttribute(Tracker, android:foregroundServiceType, "location")~\n~'//////////////////////////////////////////////////////~\n~~\n~'/////////////////////// App Updating ////////////////~\n~AddManifestText(~\n~ )~\n~AddApplicationText(~\n~ ~\n~ ~\n~ ~\n~ )~\n~CreateResource(xml, provider_paths,~\n~ ~\n~ ~\n~ ~\n~ ~\n~ ~\n~ )~\n~AddManifestText()~\n~AddManifestText()~\n~AddManifestText()~\n~AddManifestText()~\n~~\n~AddPermission(android.permission.REQUEST_INSTALL_PACKAGES)~\n~AddPermission(android.permission.INTERNET)~\n~AddPermission(android.permission.INSTALL_PACKAGES)~\n~AddPermission(android.permission.READ_EXTERNAL_STORAGE)~\n~AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)~\n~AddPermission(android.permission.READ_PHONE_STATE)~\n~AddPermission(android.permission.WAKE_LOCK)~\n~CreateResourceFromFile(Macro, JhsIceZxing1.CaturePortrait)~\n~ ~\n~SetApplicationAttribute(android:largeHeap, "true")~\n~~\n~AddManifestText(~\n~ )~\n~AddApplicationText(~\n~ ~\n~ ~\n~ ~\n~)~\n~CreateResource(xml, provider_paths,~\n~~\n~ ~\n~ ~\n~ ~\n~~\n~)~\n~AddPermission(android.permission.REQUEST_INSTALL_PACKAGES)~\n~AddPermission(android.permission.INTERNET)~\n~AddPermission(android.permission.INSTALL_PACKAGES)~\n~AddPermission(android.permission.READ_EXTERNAL_STORAGE)~\n~AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)~\n~AddPermission("android.permission.MANAGE_EXTERNAL_STORAGE")~\n~AddPermission(android.permission.READ_PHONE_STATE)~\n~AddPermission(android.permission.WAKE_LOCK)~\n~SetApplicationAttribute(android:allowBackup, "false")~\n~AddManifestText()~\n~AddApplicationText(~\n~~\n~ ~\n~ )~\n~AddPermission(android.permission.BLUETOOTH_ADVERTISE)~\n~AddPermission(android.permission.BLUETOOTH_CONNECT)~\n~AddPermission(android.permission.BLUETOOTH_SCAN)~\n~AddManifestText() +Module1=appUpdater +Module10=C_Nota +Module11=C_NoVenta +Module12=C_NuevoCliente +Module13=C_Pedidos +Module14=C_Principal +Module15=C_Productos +Module16=C_Promos +Module17=C_RespaldoDiario +Module18=C_Subs +Module19=C_TicketsDia +Module2=B4XMainPage +Module20=C_UpdateAvailable +Module21=CameraExClass +Module22=cPDF +Module23=DBRequestManager +Module24=EscPosPrinter +Module25=FileHandler +Module26=ManageExternalStorage +Module27=MAPA_RUTAS +Module28=NotificationService +Module29=Pendientes +Module3=BatteryUtilities +Module30=Starter +Module31=Subs +Module32=Tracker +Module4=C_BItacora +Module5=C_Cliente +Module6=C_Clientes +Module7=C_Cuestionario +Module8=C_Historico +Module9=C_Mapas +NumberOfFiles=523 +NumberOfLibraries=34 +NumberOfModules=32 +Version=12.8 +@EndOfDesignText@ +#Region Project Attributes + #ApplicationLabel: ADM + #VersionCode: 1 + #VersionName: 5.12.04 + 'SupportedOrientations possible values: unspecified, landscape or portrait. + #SupportedOrientations: portrait + #CanInstallToExternalStorage: False + #BridgeLogger: True + #AdditionalJar: com.android.support:support-v4 + #AdditionalJar: com.google.android.gms:play-services-location + #MultiDex: True +#End Region + +#Region Activity Attributes + #FullScreen: False + #IncludeTitle: False +#End Region + +Sub Process_Globals + Public ActionBarHomeClicked As Boolean +End Sub + +Sub Globals + +End Sub + +Sub Activity_Create(FirstTime As Boolean) + Dim pm As B4XPagesManager + pm.Initialize(Activity) +End Sub + +'Template version: B4A-1.01 +#Region Delegates + +Sub Activity_ActionBarHomeClick + ActionBarHomeClicked = True + B4XPages.Delegate.Activity_ActionBarHomeClick + ActionBarHomeClicked = False +End Sub + +Sub Activity_KeyPress (KeyCode As Int) As Boolean + Return B4XPages.Delegate.Activity_KeyPress(KeyCode) +End Sub + +Sub Activity_Resume + B4XPages.Delegate.Activity_Resume +End Sub + +Sub Activity_Pause (UserClosed As Boolean) + B4XPages.Delegate.Activity_Pause +End Sub + +Sub Activity_PermissionResult (Permission As String, Result As Boolean) + B4XPages.Delegate.Activity_PermissionResult(Permission, Result) +End Sub + +Sub Create_Menu (Menu As Object) + B4XPages.Delegate.Create_Menu(Menu) +End Sub + +#if Java +public boolean _onCreateOptionsMenu(android.view.Menu menu) { + processBA.raiseEvent(null, "create_menu", menu); + return true; + +} +#End If +#End Region + +'Program code should go into B4XMainPage and other pages. + + +'cliente nuevo +'FIN DIA +'SUPLENCIA +'CARGA DIA +'ENVIO INFO diff --git a/B4A/ADM.b4a.meta b/B4A/ADM.b4a.meta new file mode 100644 index 0000000..da2b75a --- /dev/null +++ b/B4A/ADM.b4a.meta @@ -0,0 +1,102 @@ +ModuleBookmarks0= +ModuleBookmarks1= +ModuleBookmarks10= +ModuleBookmarks11= +ModuleBookmarks12= +ModuleBookmarks13= +ModuleBookmarks14= +ModuleBookmarks15= +ModuleBookmarks16= +ModuleBookmarks17= +ModuleBookmarks18= +ModuleBookmarks19= +ModuleBookmarks2= +ModuleBookmarks20= +ModuleBookmarks21= +ModuleBookmarks22= +ModuleBookmarks23= +ModuleBookmarks24= +ModuleBookmarks25= +ModuleBookmarks26= +ModuleBookmarks27= +ModuleBookmarks28= +ModuleBookmarks29= +ModuleBookmarks3= +ModuleBookmarks30= +ModuleBookmarks31= +ModuleBookmarks32= +ModuleBookmarks4= +ModuleBookmarks5= +ModuleBookmarks6= +ModuleBookmarks7= +ModuleBookmarks8= +ModuleBookmarks9= +ModuleBreakpoints0= +ModuleBreakpoints1= +ModuleBreakpoints10= +ModuleBreakpoints11= +ModuleBreakpoints12= +ModuleBreakpoints13= +ModuleBreakpoints14= +ModuleBreakpoints15= +ModuleBreakpoints16= +ModuleBreakpoints17= +ModuleBreakpoints18= +ModuleBreakpoints19= +ModuleBreakpoints2= +ModuleBreakpoints20= +ModuleBreakpoints21= +ModuleBreakpoints22= +ModuleBreakpoints23= +ModuleBreakpoints24= +ModuleBreakpoints25= +ModuleBreakpoints26= +ModuleBreakpoints27= +ModuleBreakpoints28= +ModuleBreakpoints29= +ModuleBreakpoints3= +ModuleBreakpoints30= +ModuleBreakpoints31= +ModuleBreakpoints32= +ModuleBreakpoints4= +ModuleBreakpoints5= +ModuleBreakpoints6= +ModuleBreakpoints7= +ModuleBreakpoints8= +ModuleBreakpoints9= +ModuleClosedNodes0= +ModuleClosedNodes1= +ModuleClosedNodes10= +ModuleClosedNodes11= +ModuleClosedNodes12= +ModuleClosedNodes13= +ModuleClosedNodes14=16 +ModuleClosedNodes15= +ModuleClosedNodes16= +ModuleClosedNodes17= +ModuleClosedNodes18= +ModuleClosedNodes19= +ModuleClosedNodes2= +ModuleClosedNodes20= +ModuleClosedNodes21= +ModuleClosedNodes22= +ModuleClosedNodes23= +ModuleClosedNodes24= +ModuleClosedNodes25= +ModuleClosedNodes26= +ModuleClosedNodes27= +ModuleClosedNodes28= +ModuleClosedNodes29= +ModuleClosedNodes3= +ModuleClosedNodes30= +ModuleClosedNodes31= +ModuleClosedNodes32=15,16,17,18,19 +ModuleClosedNodes4= +ModuleClosedNodes5= +ModuleClosedNodes6= +ModuleClosedNodes7= +ModuleClosedNodes8= +ModuleClosedNodes9= +NavigationStack=Diseñador Visual,principal.bal,-100,6,Diseñador Visual,login.bal,-100,2,C_Principal,B4XPage_Appear,457,0,C_Cliente,MODS,0,0,Diseñador Visual,cliente.bal,-100,6,C_Cliente,B4XPage_Created,190,5,C_Cliente,Class_Globals,179,0,Main,Process_Globals,18,0,Main,Globals,25,0,B4XMainPage,B4XPage_Created,305,0,MAPA_RUTAS,MapFragment1_Ready,189,0 +SelectedBuild=0 +VisibleModules=2,14,30,5,6,15,32,4,31,18,27 diff --git a/B4A/B4XMainPage.bas b/B4A/B4XMainPage.bas new file mode 100644 index 0000000..66572f4 --- /dev/null +++ b/B4A/B4XMainPage.bas @@ -0,0 +1,1309 @@ +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 + '########################################################################################################### + '###################### PUSH TORTOISE GIT CON TAG ################################################## + 'Ctrl + clic para Git: ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=-ExecutionPolicy&Args=Bypass&Args=-File&Args=..\_git_tag.ps1&Args=%22%PROJECT%%22&Args=%22%PROJECT_NAME%%22 + '########################################################################################################### +#End Region + +'Ctrl + click ide://run?file=%WINDIR%\System32\cmd.exe&Args=/c&Args=github&Args=..\..\ + +Sub Class_Globals + Dim c2 As Cursor + Dim sDate,sTime As String + 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 + Private Panel11 As Panel + Private CLV_PICK_CIEGO As CustomListView + Private P_PICK_CIEGO As Panel + Dim ET_PICK_CIEGO As EditText + Private L_PICK_CIEGO As Label + Private P_CIEGO As Panel + Dim Panel4 As Panel + Dim q_buscar As String + Private et_buspc As EditText + Dim d As Cursor + Dim a As Cursor + Dim f As Cursor + Dim idenviar As String + Private et_codigo As EditText + Private b_cancelarcodigo As Button + Private b_aceptar As Button + Private p_validacion As Panel + Private b_recarga As Button + Dim recarga As String = "0" + Private p_add_monto As Panel + Private B_Can_Monto As Button + Private B_Aceptar_Monto As Button + Private ET_Add_Monto As EditText + Dim intentUsado As Boolean = False +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, "ADM") + login.Initialize + B4XPages.AddPage("Login", login) + principal.Initialize + B4XPages.AddPage("Principal", principal) + clientes.Initialize + B4XPages.AddPage("Clientes", clientes) + cliente.Initialize + B4XPages.AddPageAndCreate("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) + Starter.skmt.ExecNonQuery("DROP TABLE IF EXISTS HIST_SUPERVISOR") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CLIENTES_NUEVOS(CN_ID TEXT, CN_FECHA TEXT, CN_USER TEXT, CN_LAT TEXT, CN_LON TEXT, CN_NOMBRE TEXT, CN_DIRECCION TEXT, CN_FOTO TEXT, CN_ALMACEN TEXT, CN_RUTA TEXT,CN_GIRO TEXT)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS RUTAA (RUTAA TEXT)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS FOTOINICIAL (RUTAA TEXT, ALMACEN TEXT, LATITUD TEXT, LONGITUD TEXT, FECHAHORA TEXT, FOTO BLOB, FOTO2 BLOB, USUARIO TEXT)") + 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_GIRO(GIRO TEXT)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS PICKCIEGO_HECHO(HECHO 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 PAGARES (PA_ALMACEN TEXT, PA_RUTA TEXT, PA_FECHA TEXT, PA_CAPTURA TEXT, PA_MONTO TEXT, PA_USUARIO TEXT, PA_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)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS PICK_CIEGO (PC_ID_PROD TEXT, PC_NOM_PROD TEXT, PC_CANT TEXT, PC_ALMACEN TEXT, PC_RUTA TEXT, PC_FECHA TEXT)") + skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS ENV_MONTO_LIQ (EML_MONTO TEXT, EML_ALMACEN TEXT, EML_RUTA TEXT, EML_USUARIO TEXT, EML_FECHA_PED TEXT)") + skmt.ExecNonQuery("CREATE TABLE If Not EXISTS HIST_UBICACIONES (HU_ID EXT, HU_IDALMACEN TEXT, HU_RUTA TEXT, HU_USUARIO TEXT, HU_LATITUD TEXT, HU_LONGITUD TEXT, HU_FECHA TEXT, HU_ENVIADO TEXT DEFAULT 0)") + Subs.agregaColumna("PEDIDO", "PE_ENVIO_OK", "INT") + Subs.agregaColumna("PEDIDO", "PE_CANTC", "TEXT") + Subs.agregaColumna("PEDIDO", "PE_BCAJAS", "TEXT") + Subs.agregaColumna("PEDIDO", "PE_TIPOPAGO", "TEXT") + Subs.agregaColumna("PEDIDO", "PE_TICKET", "TEXT") + Subs.agregaColumna("PEDIDO", "PE_COMENTARIO", "TEXT") + Subs.agregaColumna("NOVENTA", "NV_ENVIO_OK", "INT") + Subs.agregaColumna("kmt_info", "CAT_CL_BCREDITO", "TEXT") + Subs.agregaColumna("kmt_info", "CAT_CL_LIMITECREDITO", "TEXT") + Subs.agregaColumna("CAT_GUNAPROD", "CAT_DP_CONVERSION1", "TEXT") + Subs.agregaColumna("CAT_GUNAPROD2", "CAT_DP_CONVERSION1", "TEXT") + Subs.agregaColumna("CAT_GUNAPROD2", "CAT_DP_PRECIO4", "TEXT") + Subs.agregaColumna("CAT_GUNAPROD", "CAT_DP_PRECIO4", "TEXT") + Subs.agregaColumna("CLIENTES_NUEVOS", "CN_SOLICITA", "TEXT") + 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 + P_CIEGO.Height = Root.Height + P_CIEGO.Width = Root.Width + p_validacion.Height = Root.Height + p_validacion.Width = Root.Width + p_add_monto.Height = Root.Height + p_add_monto.Width = Root.Width + 'Revisamos si se disparo el intent de cargar la base de datos desde WhatApp. + If Subs.traeUsarIntentBDWA Then + Subs.importaBDDesdeWhatsApp + End If +End Sub + +Sub B4XPage_Appear + Log(recarga) + 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 + + Dim c12 As Cursor = Starter.skmt.ExecQuery("SELECT * FROM PEDIDO") + If c12.RowCount > 0 Then + + 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_ADM3" '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_ADM3" + 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_ADM3" '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_ADM3" + 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 = "SelectMontoLiq" Then + For Each records() As Object In result.Rows + Dim CUENTA As String = records(result.Columns.Get("CUENTA")) + + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + f=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info") + f.Position = 0 + a=B4XPages.MainPage.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + a.Position = 0 + + Private c2 As Cursor + c2=skmt.ExecQuery("select USUARIO from usuarioa") + c2.Position=0 + If c2.RowCount > 0 Then c2.GetString("USUARIO") + + Log(CUENTA & "----------------------!!") + If CUENTA = "0" Then + + c = Starter.skmt.ExecQuery2("SELECT * FROM ENV_MONTO_LIQ WHERE EML_USUARIO = ? AND EML_ALMACEN = ? AND EML_RUTA = ?", Array As String (c2.GetString("USUARIO"), a.GetString("ID_ALMACEN"), f.GetString("CAT_CL_RUTA"))) + If c.RowCount > 0 Then +' For i=0 To c.RowCount -1 + c.Position=0 + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_Monto_Liq_ADM3" + cmd.Parameters = Array As Object(c.GetString("EML_MONTO"), c.GetString("EML_ALMACEN"), c.GetString("EML_RUTA"), c.GetString("EML_USUARIO"), "VENTA", c.GetString("EML_FECHA_PED")) + reqManager.ExecuteCommand(cmd , "ins_Mon_Liq") + MsgboxAsync("Monto Enviado", "Atención") +' Next + End If + c.Close + Else if CUENTA > "0" Then + + c = Starter.skmt.ExecQuery2("SELECT * FROM ENV_MONTO_LIQ WHERE EML_USUARIO = ? AND EML_ALMACEN = ? AND EML_RUTA = ?", Array As String (c2.GetString("USUARIO"), a.GetString("ID_ALMACEN"), f.GetString("CAT_CL_RUTA"))) + If c.RowCount > 0 Then +' For i=0 To c.RowCount -1 + c.Position = 0 + cmd.Initialize + cmd.Name = "update_MontoCuenta_ADM3" + cmd.Parameters = Array As Object(c.GetString("EML_MONTO"), c.GetString("EML_ALMACEN"), c.GetString("EML_RUTA"), c.GetString("EML_USUARIO")) + + Log(c.GetString("EML_MONTO")& " " & c.GetString("EML_ALMACEN")& " " & c.GetString("EML_RUTA")& " " & c.GetString("EML_USUARIO")) + reqManager.ExecuteCommand(cmd, "update_MC") + MsgboxAsync("Se sobre escribio el Monto", "Atención") +' Next + End If + c2.Close + c.Close + End If + f.Close + a.Close + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag.As(String).IndexOf("PICK_C_") > -1 Then 'query tag +' Subs.logJobDoneResultados(result) + Private id As String= result.Tag + id = id.SubString(id.IndexOf("_")+3) + For Each records() As Object In result.Rows + Dim CUENTA As String = records(result.Columns.Get("CUENTA")) + Log(CUENTA) + Log(id) + If CUENTA = 0 Then + c = Starter.skmt.ExecQuery2("SELECT * FROM PICK_CIEGO WHERE PC_ID_PROD = ?", Array As String (id)) + If c.RowCount > 0 Then +' For i=0 To c.RowCount -1 + c.Position=0 + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_PICKCIEGO_ADM3" + cmd.Parameters = Array As Object(c.GetString("PC_ID_PROD"), c.GetString("PC_NOM_PROD"), c.GetString("PC_CANT"), c.GetString("PC_ALMACEN"), c.GetString("PC_RUTA"), c.GetString("PC_FECHA"),"VENTA") + reqManager.ExecuteCommand(cmd , "ins_PC") +' Next + End If + c.Close + Else if CUENTA > 0 Then + c = Starter.skmt.ExecQuery2("SELECT * FROM PICK_CIEGO WHERE PC_ID_PROD= ?", Array As String (id)) + If c.RowCount > 0 Then +' For i=0 To c.RowCount -1 + c.Position = 0 + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "update_PICKCIEGO_ADM3" + Log("FECHA" & c.GetString("PC_FECHA")) + cmd.Parameters = Array As Object(c.GetString("PC_CANT"), c.GetString("PC_ID_PROD"), c.GetString("PC_ALMACEN"), c.GetString("PC_RUTA"), c.GetString("PC_FECHA"),"VENTA") + reqManager.ExecuteCommand(cmd, "update_PC") +' Next + End If + c.Close + End If + + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "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 Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "contrasena" Then 'query tag + For Each records() As Object In result.Rows + Dim CAT_PA_PASS As String = records(result.Columns.Get("CAT_PA_PASS")) + If CAT_PA_PASS = et_codigo.Text Then + Log(CAT_PA_PASS) + p_validacion.Visible = False + et_codigo.Text = "" + If recarga = "0" Then + Subs.panelVisible(P_CIEGO,0,0) + Else If recarga = "1" Then + Starter.skmt.ExecNonQuery("delete from CUENTAA") + Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object("1")) + B4XPages.MainPage.tipo_venta = "RECARGA" + B4XPages.ShowPage("Productos") + + End If + Else + MsgboxAsync("Contraseña incorrecta","Atención") + End If + Next + 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_add_monto.IsInitialized And p_add_monto.Visible Then + p_add_monto.Visible = False + Return False + Else If p_validacion.IsInitialized And p_validacion.Visible Then + p_validacion.Visible = False + Return False + Else If P_CIEGO.IsInitialized And P_CIEGO.Visible Then + MsgboxAsync("Debes de terminar el proceso para regresar a la pantalla principal","Atención") + Return False + Else 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.DirInternal +' Else +' x = File.DirInternal +' End If + Dim theDir As String + Try + File.MakeDir(File.DirInternal,"kmts") + theDir = "/kmts" + Catch + theDir = "" + End Try + Try + File.Copy(File.DirInternal,"kmt.db",File.DirInternal&theDir, "ADM_kmt.db") + ToastMessageShow("Listo, copiado a " & File.DirInternal&theDir & "/ADM_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.net: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 + +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 + +Private Sub b_arqueocieego_Click + c = skmt.ExecQuery("SELECT * FROM CAT_GUNAPROD") + If c.RowCount > 0 Then + Subs.panelVisible(p_validacion,0,0) + recarga = "0" + Else + MsgboxAsync("No hay ruta cargada, favor de cargar día","Atención") + End If +End Sub + +Private Sub et_buspc_TextChanged (Old As String, New As String) + If New = "" Then + CLV_PICK_CIEGO.Clear + Else + CLV_PICK_CIEGO.Clear + + q_buscar = "%" & et_buspc.Text & "%" + Log(q_buscar) + c=B4XPages.MainPage.skmt.ExecQuery2($"select CAT_GP_NOMBRE, CAT_GP_ID , ifnull(PC_CANT,0) AS PC_CANT FROM CAT_GUNAPROD INNER JOIN PICK_CIEGO ON PC_ID_PROD = CAT_GP_ID AND PC_NOM_PROD = CAT_GP_NOMBRE WHERE (CAT_GP_NOMBRE LIKE ? OR CAT_GP_ID LIKE ? ) and CAT_GP_CLASIF <> 'PROMOS'"$, Array As String(q_buscar,q_buscar)) + If c.RowCount > 0 Then + + + For i = 0 To c.RowCount - 1 + c.Position = i + CLV_PICK_CIEGO.Add(CreateListItem(c.GetString("CAT_GP_ID"), c.GetString("CAT_GP_NOMBRE"), c.GetString("PC_CANT")),i) +' Log(c.GetString("CAT_GP_ID") & ", " & c.GetString("CAT_GP_NOMBRE") & " ," & c.GetString("PC_CANT")) + Next + c.Close + + d=B4XPages.MainPage.skmt.ExecQuery2($"select CAT_GP_NOMBRE, CAT_GP_ID FROM CAT_GUNAPROD WHERE (CAT_GP_NOMBRE LIKE ? OR CAT_GP_ID LIKE ? ) and CAT_GP_CLASIF <> 'PROMOS'AND CAT_GP_ID NOT IN (SELECT PC_ID_PROD FROM PICK_CIEGO)"$, Array As String(q_buscar,q_buscar)) + + For i = 0 To d.RowCount - 1 + d.Position = i + CLV_PICK_CIEGO.Add(CreateListItem2(d.GetString("CAT_GP_ID"), d.GetString("CAT_GP_NOMBRE")),i) +' Log(d.GetString("CAT_GP_ID") & ", " & d.GetString("CAT_GP_NOMBRE")) + Next + d.Close + + Else If c.RowCount = 0 Then + d=B4XPages.MainPage.skmt.ExecQuery2($"select CAT_GP_NOMBRE, CAT_GP_ID FROM CAT_GUNAPROD WHERE (CAT_GP_NOMBRE LIKE ? OR CAT_GP_ID LIKE ? ) and CAT_GP_CLASIF <> 'PROMOS'"$, Array As String(q_buscar,q_buscar)) + + For i = 0 To d.RowCount - 1 + d.Position = i + CLV_PICK_CIEGO.Add(CreateListItem2(d.GetString("CAT_GP_ID"), d.GetString("CAT_GP_NOMBRE")),i) +' Log(d.GetString("CAT_GP_ID") & ", " & d.GetString("CAT_GP_NOMBRE")) + Next + d.Close + End If + End If +End Sub + +Sub CreateListItem(Id_prod As String, Prod As String,cant As String) As Panel + Dim pa As B4XView = xui.CreatePanel("") + pa.SetLayoutAnimated(0, 0, 0, 1, 10) + pa.LoadLayout("PANEL_PICK_CIEGO") + pa.Height = 55dip + pa.Width = 298dip + 'pa.Width = clv_orden.GetBase.Width + L_PICK_CIEGO.Text = Id_prod & CRLF & Prod + L_PICK_CIEGO.TextSize = 12 + L_PICK_CIEGO.Gravity = Bit.Or(Gravity.CENTER_VERTICAL, Gravity.CENTER_HORIZONTAL) + ET_PICK_CIEGO.Text = cant + 'cxc.Id_prod = mostrar3 + 'Log(pa.Width) + Return pa +End Sub + +Sub CreateListItem2(Id_prod As String, Prod As String) As Panel + Dim pa As B4XView = xui.CreatePanel("") + pa.SetLayoutAnimated(0, 0, 0, 1, 10) + pa.LoadLayout("PANEL_PICK_CIEGO") + pa.Height = 55dip + pa.Width = 298dip + 'pa.Width = clv_orden.GetBase.Width + L_PICK_CIEGO.Text = Id_prod & CRLF & Prod + L_PICK_CIEGO.TextSize = 12 + L_PICK_CIEGO.Gravity = Bit.Or(Gravity.CENTER_VERTICAL, Gravity.CENTER_HORIZONTAL) + 'cxc.Id_prod = mostrar3 + 'Log(pa.Width) + Return pa +End Sub + +Sub ET_PICK_CIEGO_TextChanged (Old As String, New As String) + Dim et As EditText = Sender + If New.Length > 4 Then + et.Text = Old + End If +End Sub + +Private Sub B_PC_ENV_Click + + Dim sDate, sTime As String + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate = DateTime.Date(DateTime.Now) + sTime = DateTime.Time(DateTime.Now) + + + For i = 0 To CLV_PICK_CIEGO.Size - 1 + ' Retrieve the panel and child views for the current item + Dim itemPanel As B4XView = CLV_PICK_CIEGO.GetPanel(i) + Dim innerPanel As B4XView = itemPanel.GetView(0) + Dim editText As B4XView = innerPanel.GetView(1) + Dim inputText As String = editText.As(EditText).Text + + ' Check if the input text matches the regex pattern for zeros or if it's empty + If Regex.IsMatch("^[0]+$", inputText) Or inputText = "" Then + inputText = "0" + End If + + ' Retrieve and process the ID label + Dim idLabel As B4XView = innerPanel.GetView(0) + Dim idText As String = idLabel.As(Label).Text + Dim idParts() As String = Regex.Split(CRLF, idText) +' Log(idParts(1)) + f=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info") + f.Position=0 + + a=B4XPages.MainPage.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + If a.RowCount>0 Then + a.Position=0 + End If +' Log(a.GetString("ID_ALMACEN")) +' Log(f.GetString("CAT_CL_RUTA")) + + If inputText <> 0 Then + c = Starter.skmt.ExecQuery2("SELECT * FROM PICK_CIEGO where PC_ID_PROD = ?", Array As String (idParts(0))) + If c.RowCount = 0 Then + ' Insert data into the database + skmt.ExecNonQuery2("INSERT INTO PICK_CIEGO(PC_ID_PROD, PC_NOM_PROD, PC_CANT, PC_ALMACEN, PC_RUTA, PC_FECHA) VALUES(?,?,?,?,?,?)", Array As String(idParts(0), idParts(1), inputText, a.GetString("ID_ALMACEN"), f.GetString("CAT_CL_RUTA"), sDate&" "&sTime)) + Else + B4XPages.MainPage.skmt.ExecNonQuery2("Update PICK_CIEGO set PC_CANT = ? WHERE PC_ID_PROD = ?" , Array As String(inputText ,idParts(0))) + End If + End If + f.Close + a.Close +' Log("Processed item " & i) + Next + et_buspc.Text = "" + CLV_PICK_CIEGO.Clear + +End Sub + +Private Sub b_terpc_Click + Msgbox2Async("Una vez enviada la información no podras hacer modificaciones","Atención","SI","", "",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + Msgbox2Async("Estas seguro de enviar la información?","Atención","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + + Dim sDate, sTime As String + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate = DateTime.Date(DateTime.Now) + sTime = DateTime.Time(DateTime.Now) + + For i = 0 To CLV_PICK_CIEGO.Size - 1 + ' Retrieve the panel and child views for the current item + Dim itemPanel As B4XView = CLV_PICK_CIEGO.GetPanel(i) + Dim innerPanel As B4XView = itemPanel.GetView(0) + Dim editText As B4XView = innerPanel.GetView(1) + Dim inputText As String = editText.As(EditText).Text + + ' Check if the input text matches the regex pattern for zeros or if it's empty + If Regex.IsMatch("^[0]+$", inputText) Or inputText = "" Then + inputText = "0" + End If + + ' Retrieve and process the ID label + Dim idLabel As B4XView = innerPanel.GetView(0) + Dim idText As String = idLabel.As(Label).Text + Dim idParts() As String = Regex.Split(CRLF, idText) +' Log(idParts(1)) + f=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info") + f.Position=0 + + a=B4XPages.MainPage.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + If a.RowCount>0 Then + a.Position=0 + End If + Log(a.GetString("ID_ALMACEN")) + Log(f.GetString("CAT_CL_RUTA")) + If inputText <> 0 Then + c = Starter.skmt.ExecQuery2("SELECT * FROM PICK_CIEGO where PC_ID_PROD = ?", Array As String (idParts(0))) + If c.RowCount = 0 Then + ' Insert data into the database + skmt.ExecNonQuery2("INSERT INTO PICK_CIEGO(PC_ID_PROD, PC_NOM_PROD, PC_CANT, PC_ALMACEN, PC_RUTA, PC_FECHA) VALUES(?,?,?,?,?,?)", Array As String(idParts(0), idParts(1), inputText, a.GetString("ID_ALMACEN"), f.GetString("CAT_CL_RUTA"), sDate&" "&sTime)) + Else + B4XPages.MainPage.skmt.ExecNonQuery2("Update PICK_CIEGO set PC_CANT = ? WHERE PC_ID_PROD = ?" , Array As String(inputText ,idParts(0))) + End If + End If + f.Close + a.Close + Log("Processed item " & i) + Next + Log("Finished processing all items") + P_CIEGO.Visible = False + et_buspc.Text = "" + CLV_PICK_CIEGO.Clear + c = Starter.skmt.ExecQuery("SELECT PC_ID_PROD, PC_ALMACEN, PC_RUTA, PC_FECHA FROM PICK_CIEGO") + If c.RowCount > 0 Then + For i = 0 To c.RowCount - 1 + c.Position = i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_HIST_PICKCIEGO_ADM3" ' + cmd.Parameters = Array As Object(c.GetString("PC_ID_PROD"), c.GetString("PC_ALMACEN"), c.GetString("PC_RUTA"), c.GetString("PC_FECHA"), "VENTA") + reqManager.ExecuteQuery(cmd , 0, $"PICK_C_${c.GetString("PC_ID_PROD")}"$) + Next + End If + c.close + Else + + End If + End If +End Sub + +Private Sub b_aceptar_Click + f=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info") + f.Position=0 + + a=B4XPages.MainPage.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + If a.RowCount>0 Then + a.Position=0 + End If + Log(a.GetString("ID_ALMACEN")) + Log(f.GetString("CAT_CL_RUTA")) + + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_CAT_PASS_ARQUEO_ADM3" + cmd.Parameters = Array As Object(f.GetString("CAT_CL_RUTA"),a.GetString("ID_ALMACEN"),"PREVENTA") + reqManager.ExecuteQuery(cmd , 0, "contrasena") + f.Close + a.Close +End Sub + +Private Sub B_Aceptar_Monto_Click +' Try + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + + f=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info") + f.Position=0 + + a=B4XPages.MainPage.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + If a.RowCount>0 Then + a.Position=0 + End If + + Private cI As Cursor + Private u As String = "SinUsuario" + cI=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + cI.Position=0 + If cI.RowCount > 0 Then u = cI.GetString("USUARIO") + Private g As Cursor = B4XPages.MainPage.skmt.ExecQuery("select * from ENV_MONTO_LIQ") + If g.RowCount = 0 Then + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO ENV_MONTO_LIQ VALUES (?,?,?,?,?)", Array As Object(ET_Add_Monto.Text, a.GetString("ID_ALMACEN"), f.GetString("CAT_CL_RUTA"), u, sDate & " " & sTime)) + f.Close + a.Close + + c = Starter.skmt.ExecQuery("SELECT * FROM ENV_MONTO_LIQ") + If c.RowCount > 0 Then + c.Position = 0 + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_MontoCuenta_ADM3" +' LogColor("------------" & c.GetString("EML_USUARIO" & c.GetString("EML_ALMACEN") & c.GetString("EML_RUTA")),Colors.Red) + cmd.Parameters = Array As Object(c.GetString("EML_USUARIO"), c.GetString("EML_ALMACEN"), c.GetString("EML_RUTA")) + reqManager.ExecuteQuery(cmd , 0, "SelectMontoLiq") +' cmd.Name = "insert_Monto_Liq_ADM3" +' cmd.Parameters = Array As Object(c.GetString("EML_MONTO"), c.GetString("EML_ALMACEN"), c.GetString("EML_RUTA"), c.GetString("EML_USUARIO"), "VENTA", c.GetString("EML_FECHA_PED")) + End If + c.Close + Else + Starter.skmt.ExecNonQuery2("UPDATE ENV_MONTO_LIQ SET EML_MONTO = ? WHERE EML_ALMACEN = ? AND EML_RUTA = ? AND EML_USUARIO = ?", Array As String (ET_Add_Monto.Text ,a.GetString("ID_ALMACEN"), f.GetString("CAT_CL_RUTA"), cI.GetString("USUARIO"))) + f.Close + a.Close + + c = Starter.skmt.ExecQuery("SELECT * FROM ENV_MONTO_LIQ") + If c.RowCount > 0 Then + c.Position = 0 + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_MontoCuenta_ADM3" +' LogColor("------------" & c.GetString("EML_USUARIO" & c.GetString("EML_ALMACEN") & c.GetString("EML_RUTA")),Colors.Red) + cmd.Parameters = Array As Object(c.GetString("EML_USUARIO"), c.GetString("EML_ALMACEN"), c.GetString("EML_RUTA")) + reqManager.ExecuteQuery(cmd , 0, "SelectMontoLiq") +' cmd.Name = "insert_Monto_Liq_ADM3" +' cmd.Parameters = Array As Object(c.GetString("EML_MONTO"), c.GetString("EML_ALMACEN"), c.GetString("EML_RUTA"), c.GetString("EML_USUARIO"), "VENTA", c.GetString("EML_FECHA_PED")) + End If + c.Close + End If + +' MsgboxAsync("Monto Enviado, Si Vuelve a Mandar se sobre escribirá dicho Monto", "Atención") + p_add_monto.Visible = False +' Catch +' Log(LastException.Message) +' MsgboxAsync("Error al enviar el monto", "Error") +' End Try +End Sub + +Private Sub b_cancelarcodigo_Click + p_validacion.Visible = False +End Sub + +Private Sub B_Can_Monto_Click + p_add_monto.Visible = False +End Sub + +Private Sub b_envioBD_Click + 'copiaDB + 'Sleep(1000) + Dim FileName As String = "kmt.db" + 'copy the shared file to the shared folder + Log("xxxxxx:"&Provider.SharedFolder) + Sleep(1000) + File.Copy(File.DirInternal, FileName, Provider.SharedFolder, FileName) + Dim email As Email + email.To.Add("soporte@keymonsoft.com") + email.Subject = "Envio Base de datos ADM" + 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_recarga_Click + c = skmt.ExecQuery("SELECT * FROM CAT_GUNAPROD") + If c.RowCount > 0 Then + Subs.panelVisible(p_validacion,0,0) + recarga = "1" + Else + MsgboxAsync("No hay ruta cargada, favor de cargar día","Atención") + End If + c.Close +End Sub + +Private Sub b_CargarMonto_Click + c = skmt.ExecQuery("SELECT * FROM kmt_info") + c.Position = 0 + If c.RowCount < 0 Or c.RowCount = 0 Then + MsgboxAsync("No hay ruta cargada, favor de cargar día","Atención") + Else + Subs.panelVisible(p_add_monto,0,0) + End If + c.Close +End Sub + +Private Sub P_CIEGO_Click + +End Sub + +Private Sub p_validacion_Click + +End Sub + +Private Sub p_add_monto_Click + +End Sub 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_BItacora.bas b/B4A/C_BItacora.bas new file mode 100644 index 0000000..345b678 --- /dev/null +++ b/B4A/C_BItacora.bas @@ -0,0 +1,237 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=12.8 +@EndOfDesignText@ +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore + Dim db As SQL + Private Root2 As B4XView + Dim p_transparenteInicioFin2 As Panel + Dim b_Inicio_Fin_venta2 As Button + Dim contadorIniciarVenta, precision As Int + Dim IniVenNO, dentroDeGeocerca, enVenta As Boolean + Dim motivoNoVenta, motivoNoVisita As String + Dim banderaGeoCerca As String + Private reqManager As DBRequestManager +End Sub + +'You can add more parameters here. +Public Sub Initialize (vCallback As Object, vEventName As String, vRoot As B4XView, db1 As SQL, DBReq As DBRequestManager) As Object + db = db1 + Root2 = vRoot + reqManager = DBReq + db.ExecNonQuery("CREATE TABLE IF NOT EXISTS BITACORAGPS(fechab TEXT, usuariob TEXT, almacenb TEXT, rutab TEXT, eventob TEXT, clienteb TEXT, iniciob TEXT, finb TEXT, latitudb TEXT, longitudb TEXT, precision TEXT, motivonoventa TEXT, motivonovisita TEXT, BAN_GEOB TEXT)") + agregaColumna("BITACORAGPS", "BAN_GEOB", "TEXT") + contadorIniciarVenta = 0 + cargamosPanel + 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. + +'En geocerca si mete la contraseña poner 0 en precision gps y si esta dentro de los 50 mts poner 1 y 2 para eventos que no lo ocupen +'Mandar fecha de sync(sysdate) +Sub mandaBitacora(fechab As String, usuariob As String, almacenb As String, rutab As String, eventob As String, clienteb As String, iniciob As String, finb As String, latitudb As String, longitudb As String, precisionb As String, motivoNoVentab As String, motivoNoVisitab As String, BAN_GEOB As String) + Log(motivoNoVisitab) +' Log("bitacora") + Private cmd As DBCommand + cmd.Initialize + cmd.Name = "mandaBitacora_ADM3" +' Log("BITACORA3") + Private nombreCliente As String = traeNombreCliente(clienteb) + If eventob = "Llega a almacen" Then + nombreCliente = "BOLETA" + clienteb = "" + finb = iniciob + End If + If eventob = "Salida almacen" Then nombreCliente = "CHECKLIST" + If eventob = "Fin Día" Then nombreCliente = "FIN DIA" + If eventob = "Carga día" Then nombreCliente = "CARGA DIA" + If eventob = "Carga día suplencia" Then nombreCliente = traeRutasSup + If eventob <> "Termina Venta" And eventob <> "No Venta" Then + db.ExecNonQuery($"INSERT INTO BITACORAGPS (fechab, usuariob , almacenb , rutab , eventob , clienteb , iniciob , finb , latitudb, longitudb , precision , motivonoventa , motivonovisita, BAN_GEOB) VALUES ('${fechab}' ,'${usuariob}' , '${almacenb}' , '${rutab}' , '${eventob}' , '${clienteb}' , '${iniciob}' , '${finb}' , '${latitudb}' , '${longitudb}' , '${precisionb}' , '${motivoNoVentab}' , '${motivoNoVisitab}', '${BAN_GEOB}')"$) + Else + Private e As Cursor = db.ExecQuery($"select fechab from BITACORAGPS where usuariob = '${usuariob}' and almacenb = '${almacenb}' and rutab = '${rutab}' and clienteb = '${clienteb}' and eventob = 'Inicia Venta' order by fechab desc"$) + If e.RowCount > 0 Then + e.Position = 0 + Log("ACTUALIZA BITACORA") + If eventob = "Termina Venta" Then + db.ExecNonQuery($"update BITACORAGPS set finb = '${finb}' where rutab = '${rutab}' and almacenb = '${almacenb}' and usuariob = '${usuariob}' and clienteb = '${clienteb}' and fechab = '${e.GetString("fechab")}' "$) + cmd.Parameters = Array As Object(finb, rutab, almacenb, usuariob, clienteb, "Inicia Venta", e.GetString("fechab")) + else if eventob = "No Venta" Then + db.ExecNonQuery($"update BITACORAGPS set finb = '${finb}', motivonoventa = '${motivoNoVentab}', motivonovisita = '${motivoNoVisitab}' where rutab = '${rutab}' and almacenb = '${almacenb}' and usuariob = '${usuariob}' and clienteb = '${clienteb}' and fechab = '${e.GetString("fechab")}' "$) + cmd.Parameters = Array As Object(finb, motivoNoVentab, motivoNoVisitab, rutab, almacenb, usuariob, clienteb, "Inicia Venta", e.GetString("fechab")) + End If + End If + End If + If eventob <> "Inicia Venta" Then + Private c As Cursor = db.ExecQuery($"select * from BITACORAGPS where usuariob = '${usuariob}' and almacenb = '${almacenb}' and rutab = '${rutab}' and clienteb = '${clienteb}' order by fechab desc"$) + If c.RowCount > 0 Then + c.Position = 0 + cmd.Parameters = Array As Object(c.GetString("almacenb"), c.GetString("usuariob"), c.GetString("rutab"), c.GetString("eventob"), c.GetString("clienteb"), nombreCliente, c.GetString("iniciob"), c.GetString("finb"), c.GetString("latitudb"), c.GetString("longitudb"), c.GetString("precision"), c.GetString("motivonoventa"), c.GetString("motivonovisita"), c.GetString("fechab"), c.GetString("BAN_GEOB")) + reqManager.ExecuteCommand(cmd , "mandaBitacora") + End If + End If +' Log("Mandamos bitacora") +End Sub + +'Regresa el nombre del cliente del id dado. +Sub traeNombreCliente(id As String) As String + Private c As ResultSet = B4XPages.MainPage.skmt.ExecQuery($"select CAT_CL_NOMBRE from kmt_info where CAT_CL_CODIGO = '${id}'"$) + Private n As String = "N/A" + Do While c.NextRow + n = c.GetString("CAT_CL_NOMBRE") + Loop + Return n +End Sub + +'Regresa la ruta actual de la base de datos. +Sub traeRutasSup As String + Dim c As Cursor + Dim rutaSup As String = "" +' rutas = "" + c = B4XPages.MainPage.skmt.ExecQuery("SELECT RS_RUTA FROM RUTA_SUPLENCIA") + If c.RowCount > 0 Then + For i = 0 To c.RowCount - 1 + c.Position = i + rutaSup = c.GetString("RS_RUTA") + Next + End If + c.Close + Log(">>> " & rutaSup) + Return rutaSup +End Sub + +'Muestra u oculta el boton de inicio y fin de venta +Sub inicioFin + LogColor($">>>>>>>>>>>> XX EN VENTA : ${enVenta} <<<<<<<<<<<<"$, Colors.Blue) + Log(b_Inicio_Fin_venta2.Text) + If enVenta = False Then + p_transparenteInicioFin2.BringToFront + p_transparenteInicioFin2.Visible = True +' b_Inicio_Fin_venta2.Text = "INICIAR VENTA" + Log("Hacemos visible el boton de Inicio Venta") + Else + If b_Inicio_Fin_venta2.Text <> "TERMINAR VENTA" Then + p_transparenteInicioFin2.Visible = False +' b_Inicio_Fin_venta2.Visible = False + End If + End If +End Sub + +Private Sub b_Inicio_Fin_venta2_Click +' b_Inicio_Fin_venta.Visible = False +' Subs.bitacora(Subs.fechanormal(DateTime.Now), usuario, Subs.traeAlmacen, Subs.traeRuta, "Pre-venta", "0", Subs.fechanormal(DateTime.Now), Subs.fechanormal(DateTime.Now), B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps, precision, "", "") + contadorIniciarVenta = 0 + IniVenNO = False + If dentroDeGeocerca Then precision = 1 +' LogColor("-------> "&contadorIniciarVenta & " <-------", Colors.Red) + LogColor($">>>>>>>>>>>> EN VENTA : ${enVenta} <<<<<<<<<<<<"$, Colors.Blue) + motivoNoVenta = "" + motivoNoVisita = "" + p_transparenteInicioFin2.Visible = False + If b_Inicio_Fin_venta2.Text = "TERMINAR VENTA" Then + mandaBitacora(Subs.fechanormal(DateTime.Now), Subs.traeUsuarioDeBD, Subs.traeAlmacen, Subs.traeRutaBitacora, "Termina Venta", Subs.traeCliente, "", Subs.fechanormal(DateTime.Now), B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps, precision, motivoNoVenta, motivoNoVisita, banderaGeoCerca) + enVenta = False + LogColor($">>>>>> EN VENTA: ${enVenta}"$, Colors.red) + iniciamosVenta + B4XPages.ShowPageAndRemovePreviousPages("Principal") +' guardadoventa + Else if b_Inicio_Fin_venta2.Text = "INICIAR VENTA" Then + contadorIniciarVenta = 0 + IniVenNO = False + contadorIniciarVenta = contadorIniciarVenta + 1 + If contadorIniciarVenta = 1 And IniVenNO = False And motivoNoVenta <> "NO VENTA" Then + IniVenNO = True + mandaBitacora(Subs.fechanormal(DateTime.Now), Subs.traeUsuarioDeBD, Subs.traeAlmacen, Subs.traeRutaBitacora, "Inicia Venta", Subs.traeCliente, Subs.fechanormal(DateTime.Now), "", B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps, precision, "", "", banderaGeoCerca) + enVenta = True + LogColor($">>>>>> EN VENTA: ${enVenta}"$, Colors.red) +' LogColor($">>>>>> INICIA VENTA: ${Starter.enVenta} - ${Subs.traeCliente}"$, Colors.red) + Else If contadorIniciarVenta = 1 And IniVenNO = False And motivoNoVenta = "NO VENTA" Then + IniVenNO = True + mandaBitacora(Subs.fechanormal(DateTime.Now), Subs.traeUsuarioDeBD, Subs.traeAlmacen, Subs.traeRutaBitacora, "Inicia Venta", Subs.traeCliente, Subs.fechanormal(DateTime.Now), "", B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps, precision, motivoNoVenta, "", banderaGeoCerca) + enVenta = True + LogColor($">>>>>> EN VENTA: ${enVenta}"$, Colors.red) + Else If contadorIniciarVenta > 1 Then + p_transparenteInicioFin2.Visible = False + End If + End If + p_transparenteInicioFin2.Visible = False + LogColor($">>>>>>>>>>>> EN VENTA : ${enVenta} <<<<<<<<<<<<"$, Colors.Blue) +End Sub + +'Cargamos el layout del panel. +private Sub cargamosPanel + Log(p_transparenteInicioFin2.IsInitialized) +' Log(p_transparenteInicioFin2.) + If Not(p_transparenteInicioFin2.IsInitialized) Then + LogColor(">>>>>>> CARGAMOS PANEL BITACORA", Colors.red) + Root2.LoadLayout("inicioFinVenta") + p_transparenteInicioFin2.Width = Root2.Width + p_transparenteInicioFin2.Height = Root2.Height + b_Inicio_Fin_venta2.top = 700 + b_Inicio_Fin_venta2.Left = 5 + b_Inicio_Fin_venta2.Width = Root2.Width - 20 + b_Inicio_Fin_venta2.Text = "INICIAR VENTA" + p_transparenteInicioFin2.BringToFront + End If +End Sub + +Sub p_transparenteInicioFin2_click + +End Sub + +' Ponemos el texto del boton en "INICIAR VENTA" y enVenta en Falso . +Sub iniciamosVenta + enVenta = False + b_Inicio_Fin_venta2.Text = "INICIAR VENTA" +End Sub + +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 +' Log(1) + 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 + Log(2) + End Try +End Sub + +'Borra los datos de la tabla BITACORAGPS +Sub borraDatosBitacora + db.ExecNonQuery("DELETE FROM BITACORAGPS") +End Sub + +Sub JobDone(Job As HttpJob) + Log("JOBDONE BITACORA") + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + Log($"Tag: ${RESULT.tag}, success=${Job.Success}"$) + End If + 'Log(Job.Tag) + If Job.Success = False Then +' Log("JOBDONE ERROR") + LogColor("Error: " & Job.ErrorMessage, Colors.red) + Else 'If Job Success then ... +' Log("JOBDONE SUCCESS") + End If +End Sub diff --git a/B4A/C_Cliente.bas b/B4A/C_Cliente.bas new file mode 100644 index 0000000..62264cd --- /dev/null +++ b/B4A/C_Cliente.bas @@ -0,0 +1,3210 @@ +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 Provider As FileProvider + 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 = 0, m_lon = 0 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 MAC_IMPRESORA As String + Dim Printer1 As EscPosPrinter + 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 impresoraConectada As Boolean = False + Dim Tels As Button + Dim Label10 As Label + Dim Label11 As Label + Dim btAdmin As BluetoothAdmin + Dim Tar As Button + Dim errorImpresora As Int = 0 + 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 + Dim Credi As Cursor + 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 + Dim pre_act As Float + + 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 + Dim t1 As Timer + 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 + Private l_limite As Label + Private et_montoacredito As EditText + Private b_cancred As Button + Private b_acred As Button + Private p_credito As Panel + Dim banderaimp As Int = 0 + Private p_camara As Panel + Private p_cam As Panel + + '' Foto + Private b_foto_inci As Button + Private camEx As CameraExClass + Private frontCamera As Boolean = False + Dim fototomada As String = "0" + Private p_tipopago As Panel + Private rb_efectivo As RadioButton + Private rb_tranfe As RadioButton + Private rb_tarjetadebito As RadioButton + Private rb_tarjetacredito As RadioButton + Private et_com_tp As EditText + Private b_cancel_tp As Button + Private b_acept_tp As Button + Private chb_impreso As CheckBox + Dim nombrepdf As String + Dim bitacora As C_BItacora + Private l_version As Label +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root +' Activity.RemoveAllViews + Root.LoadLayout("cliente") + l_version.Text = Application.VersionName + 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 + xui.SetDataFolder("B4Xpdf") + File.Copy(File.DirAssets,"intmex_logo_192x192.jpg",xui.DefaultFolder,"intmex_logo_192x192.jpg") + File.Copy(File.DirAssets,"mariana1.jpg",xui.DefaultFolder,"mariana1.jpg") + Provider.Initialize + 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 + bitacora.Initialize("bitacora", "bitacora", Root, Starter.skmt, reqManager) + 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 +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub B4XPage_Appear + Tels.Visible = False + gest.Visible = False + b_ventaabordo.Visible = False + p_camara.Height = Root.Height + p_camara.Width = Root.Width + p_tipopago.Height = Root.Height + p_tipopago.Width = Root.Width + banderaimp = 0 + 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 + bitacora.inicioFin +' Log("appear") + cb_factura.Checked = False + p_abono.Visible = False + Subs.centraPanel(p_abono, Root.Width) + Subs.centraPanel(p_credito, 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 + + If la_cuenta.Text = "0" Or la_cuenta.Text = "1" Then + p_cbFactura.Visible = False + l_factura.Visible = False + b_ventaabordo.Visible = False + Else + p_cbFactura.Visible = False + l_factura.Visible = False + b_ventaabordo.Visible = False + End If + chb_impreso.Checked = False + 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 + +' +' Tels.Visible = False +' gest.Visible = False +' b_ventaabordo.Visible = False + + + + + 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 + + + + pre_act = Subs.traeTotalClientepreventaparacredito + + 'SELECT CAT_CL_BCREDITO, CAT_CL_CODIGO, Ifnull(SALDO_PENDIENTE,0) FROM KMT_INFO INNER JOIN ABONOSP ON CAT_CL_CODIGO = CLIENTE WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA) + + Private credi2 As Cursor = B4XPages.MainPage.skmt.ExecQuery("SELECT CAT_CL_BCREDITO, CAT_CL_CODIGO, Ifnull(SALDO_PENDIENTE,0) As SALDO_PENDIENTE FROM KMT_INFO INNER JOIN ABONOSP ON CAT_CL_CODIGO = CLIENTE WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA) UNION SELECT CAT_CL_BCREDITO, CAT_CL_CODIGO, Ifnull(SALDO_PENDIENTE,0) As SALDO_PENDIENTE FROM KMT_INFO2 INNER JOIN ABONOSP ON CAT_CL_CODIGO = CLIENTE WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If credi2.RowCount > 0 Then + credi2.Position = 0 + If credi2.GetString ("CAT_CL_BCREDITO") = "1" Then + Log(2) + Private credi3 As Cursor = B4XPages.MainPage.skmt.ExecQuery("SELECT a_abono, CAT_CL_CODIGO FROM KMT_INFO INNER JOIN ABONOS ON CAT_CL_CODIGO = a_cliente WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA) UNION SELECT a_abono, CAT_CL_CODIGO FROM KMT_INFO2 INNER JOIN ABONOS ON CAT_CL_CODIGO = a_cliente WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If credi3.RowCount > 0 Then + credi3.Position = 0 + If credi2.GetString ("SALDO_PENDIENTE") <> credi3.GetString ("a_abono") Then + MsgboxAsync("La venta sera en efectivo porque el pago del pagare en menor al total de la deuda.","Atención") + Else If credi2.GetString ("SALDO_PENDIENTE") = credi3.GetString ("a_abono") Then + End If + Else + MsgboxAsync("La venta sera en efectivo por que hay un pagare pendiente de pago","Atención") + End If + credi3.Close + Else + Log(1) + Private credi3 As Cursor = B4XPages.MainPage.skmt.ExecQuery("SELECT a_abono, CAT_CL_CODIGO FROM KMT_INFO INNER JOIN ABONOS ON CAT_CL_CODIGO = a_cliente WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA) UNION SELECT a_abono, CAT_CL_CODIGO FROM KMT_INFO2 INNER JOIN ABONOS ON CAT_CL_CODIGO = a_cliente WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If credi3.RowCount > 0 Then + credi3.Position = 0 + If credi2.GetString ("SALDO_PENDIENTE") <> credi3.GetString ("a_abono") Then + MsgboxAsync("La venta sera en efectivo porque el pago del pagare en menor al total de la deuda.","Atención") + Else If credi2.GetString ("SALDO_PENDIENTE") = credi3.GetString ("a_abono") Then + End If + Else + MsgboxAsync("La venta sera en efectivo por que hay un pagare pendiente de pago","Atención") + End If + credi3.Close + End If + End If + credi2.Close + If la_cuenta.Text = "0" Then + gest.Text = "Abordo" + B4XPages.MainPage.recarga = "0" + Else If la_cuenta.Text = "1" Then + gest.Text = "Recarga" + B4XPages.MainPage.recarga = "1" + Else + gest.Text = "Pre-venta" + B4XPages.MainPage.recarga = "0" + End If + LogColor(B4XPages.MainPage.recarga,Colors.Blue) + + If camEx.IsInitialized Then + camEx.Release + End If + InitializeCamera +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 + +' ToastMessageShow(B4XPages.MainPage.lat_gps,False) + + 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) + + If BT_QR.IsInitialized Then BT_QR.Enabled = True + If LA_GPS.IsInitialized Then LA_GPS.TextColor = Colors.Blue + If LA_GPS.IsInitialized Then 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 < 100000000000000000000000000000000 Then + If LA_GEO.IsInitialized Then LA_GEO.TextColor = Colors.Blue + Tels.Visible = True + gest.Visible = True + b_ventaabordo.Visible = True + bitacora.banderaGeoCerca = "1" + Else + Tels.Visible = False + gest.Visible = False + b_ventaabordo.Visible = False + If LA_GEO.IsInitialized Then LA_GEO.TextColor = Colors.Red + bitacora.banderaGeoCerca = "0" + End If + If LA_GPS.IsInitialized Then 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 + + c = Starter.skmt.ExecQuery("SELECT * FROM FOTOINICIAL") + If c.RowCount = 0 Then + p_camara.Visible = True + InitializeCamera + Subs.panelVisible(p_camara, 0, 0) + b_foto_inci.Text = "Foto tienda" + Else + + If la_cuenta.Text = "0" Then + B4XPages.MainPage.tipo_venta = "ABORDO" + Else If la_cuenta.Text = "1" Then + B4XPages.MainPage.tipo_venta = "RECARGA" + 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 If +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 Starter.pre_viejo = pre_act Then + If (la_cuenta.Text <> "0" And la_cuenta.Text <> "1") Then + If banderaimp = 1 Then + Else + 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") + End If +' Else If la_cuenta.Text = "1" Then +' If B4XPages.MainPage.recarga = "1" Then +' B4XPages.ShowPage("login") +' End If + Else + End If + Else + If B4XPages.MainPage.recarga = "1" Then + B4XPages.ShowPage("login") + End If + + 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 + c = B4XPages.MainPage.skmt.ExecQuery2("SELECT COUNT(*) AS CUANTOS FROM PEDIDO WHERE PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA) and PE_FOLIO = ?", Array As String("PREVENTA")) + c.Position = 0 + If c.GetString("CUANTOS") > 0 Then + If la_cuenta.Text <> 0 Then + Credi = B4XPages.MainPage.skmt.ExecQuery("Select IFNULL(CAT_CL_BCREDITO,0) AS CAT_CL_BCREDITO FROM kmt_info Where CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA) and CAT_CL_CODIGO NOT IN (SELECT CLIENTE FROM ABONOSP) UNION Select IFNULL(CAT_CL_BCREDITO,0) AS CAT_CL_BCREDITO FROM kmt_info2 Where CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA) and CAT_CL_CODIGO NOT IN (SELECT CLIENTE FROM ABONOSP)") + 'INNER JOIN KMT_INFO2 ON CAT_CL_CODIGO = CL_CUENTA + If Credi.RowCount > 0 Then + Credi.Position = 0 + If Credi.GetString("CAT_CL_BCREDITO") = "1" Then + If pre_act <> Starter.pre_viejo Then + Msgbox2Async("La venta es a credito?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + p_credito.Visible = True + Dim limitcred As Cursor + limitcred = B4XPages.MainPage.skmt.ExecQuery("SELECT CAT_CL_LIMITECREDITO FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA) UNION SELECT CAT_CL_LIMITECREDITO FROM kmt_info2 WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + limitcred.Position = 0 + l_limite.Text = "Limite de credito: $" & limitcred.GetString("CAT_CL_LIMITECREDITO") + If Subs.traeTotalClientepreventaparacredito >= limitcred.GetString("CAT_CL_LIMITECREDITO") Then + et_montoacredito.Text = limitcred.GetString("CAT_CL_LIMITECREDITO") + Else + et_montoacredito.Text = Subs.traeTotalClientepreventaparacredito + End If + limitcred.Close + Else + GuardaVenta + End If + Else If pre_act = Starter.pre_viejo Then + GuardaVenta + End If + Else If Credi.GetString("CAT_CL_BCREDITO") = "0" Then + GuardaVenta + End If + Else + Private credi2 As Cursor = B4XPages.MainPage.skmt.ExecQuery("SELECT CAT_CL_BCREDITO, a_abono, SALDO_PENDIENTE FROM KMT_INFO INNER JOIN ABONOSP ON CAT_CL_CODIGO = CLIENTE INNER JOIN ABONOS ON CAT_CL_CODIGO = a_cliente WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA) UNION SELECT CAT_CL_BCREDITO, a_abono, SALDO_PENDIENTE FROM KMT_INFO2 INNER JOIN ABONOSP ON CAT_CL_CODIGO = CLIENTE INNER JOIN ABONOS ON CAT_CL_CODIGO = a_cliente WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + If credi2.RowCount > 0 Then + credi2.Position = 0 + If credi2.GetString ("CAT_CL_BCREDITO") = "1" And credi2.GetString ("a_abono")=credi2.GetString ("SALDO_PENDIENTE") Then + If pre_act <> Starter.pre_viejo Then + Msgbox2Async("La venta es a credito?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + p_credito.Visible = True + Dim limitcred As Cursor + limitcred = B4XPages.MainPage.skmt.ExecQuery("SELECT CAT_CL_LIMITECREDITO FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA) UNION SELECT CAT_CL_LIMITECREDITO FROM kmt_info2 WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + limitcred.Position = 0 + l_limite.Text = "Limite de credito: $" & limitcred.GetString("CAT_CL_LIMITECREDITO") + If Subs.traeTotalClientepreventaparacredito >= limitcred.GetString("CAT_CL_LIMITECREDITO") Then + et_montoacredito.Text = limitcred.GetString("CAT_CL_LIMITECREDITO") + Else + et_montoacredito.Text = Subs.traeTotalClientepreventaparacredito + End If + limitcred.Close + Else + GuardaVenta + End If + + Else If pre_act = Starter.pre_viejo Then + GuardaVenta + End If + Else + GuardaVenta + End If + End If + End If +' Credi.Close + Else If la_cuenta.Text = 0 Then + GuardaVenta + End If + Else If c.GetString("CUANTOS") = 0 Then + Log("-- Z") + GuardaVenta + End If +' c.Close +End Sub + +Private Sub b_acred_Click + c2=B4XPages.MainPage.skmt.ExecQuery("select USUARIO from usuarioa") + c2.Position=0 + usuario = c2.GetString("USUARIO") + c2.Close + Dim limitcred As Cursor + DateTime.DateFormat = "MM/dd/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate = DateTime.Date(DateTime.Now) + sTime = DateTime.Time(DateTime.Now) + limitcred = B4XPages.MainPage.skmt.ExecQuery("SELECT CAT_CL_LIMITECREDITO FROM kmt_info WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA) UNION SELECT CAT_CL_LIMITECREDITO FROM kmt_info2 WHERE CAT_CL_CODIGO IN (SELECT CUENTA FROM CUENTAA)") + limitcred.Position = 0 + l_limite.Text = "Limite de credito: $" & limitcred.GetString("CAT_CL_LIMITECREDITO") + If Subs.traeTotalClientepreventaparacredito >= limitcred.GetString("CAT_CL_LIMITECREDITO") Then + + If et_montoacredito.Text > limitcred.GetString("CAT_CL_LIMITECREDITO") Then + MsgboxAsync("El monto del pagare no puede ser mayor al limite del credito","Atención") + et_montoacredito.Text = limitcred.GetString("CAT_CL_LIMITECREDITO") + Else + c = B4XPages.MainPage.skmt.ExecQuery("SELECT COUNT(*) As REGISTRADO FROM PAGARES WHERE PA_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + c.Position = 0 + If c.GetString("REGISTRADO") = 0 Then +' MsgboxAsync("SI ENTRAMOS 3","Atención") + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PAGARES (PA_ALMACEN, PA_RUTA, PA_FECHA, PA_CAPTURA, PA_MONTO, PA_USUARIO, PA_CLIENTE) VALUES(?,?,?,?,?,?,?) ", Array As Object (ALMACEN, LA_RUTA, (sDate &" "& sTime),(sDate &" "& sTime), et_montoacredito.Text, usuario, la_cuenta.Text)) + GuardaVenta + p_credito.Visible = False + Else +' MsgboxAsync("SI ENTRAMOS4","Atención") + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE PAGARES set PA_FECHA = ?, PA_CAPTURA = ?, PA_MONTO = ? where PA_CLIENTE In (select cuenta from cuentaa)", Array As Object ((sDate &" "& sTime),(sDate &" "& sTime), et_montoacredito.Text)) + GuardaVenta + p_credito.Visible = False + End If + End If + Else If Subs.traeTotalClientepreventaparacredito < limitcred.GetString("CAT_CL_LIMITECREDITO") Then + If et_montoacredito.Text > Subs.traeTotalClientepreventaparacredito Then + MsgboxAsync("El monto del pagare no puede ser mayor a la preventa registrada","Atención") + et_montoacredito.Text = Subs.traeTotalClientepreventaparacredito + Else + c = B4XPages.MainPage.skmt.ExecQuery("SELECT COUNT(*) As REGISTRADO FROM PAGARES WHERE PA_CLIENTE IN (SELECT CUENTA FROM CUENTAA)") + c.Position = 0 + If c.GetString("REGISTRADO") = 0 Then +' MsgboxAsync("SI ENTRAMOS","Atención") + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PAGARES (PA_ALMACEN, PA_RUTA, PA_FECHA, PA_CAPTURA, PA_MONTO, PA_USUARIO, PA_CLIENTE) VALUES(?,?,?,?,?,?,?) ", Array As Object (ALMACEN, LA_RUTA, (sDate &" "& sTime),(sDate &" "& sTime), et_montoacredito.Text, usuario, la_cuenta.Text)) + GuardaVenta + p_credito.Visible = False + Else +' MsgboxAsync("SI ENTRAMOS 2","Atención") + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE PAGARES set PA_FECHA = ?, PA_CAPTURA = ?, PA_MONTO = ? where PA_CLIENTE In (select cuenta from cuentaa)", Array As Object ((sDate &" "& sTime),(sDate &" "& sTime), et_montoacredito.Text)) + GuardaVenta + p_credito.Visible = False + End If + End If + End If + limitcred.Close +End Sub + +Private Sub b_cancred_Click + p_credito.Visible = False +End Sub + +Sub GuardaVenta + If pre_act <> Starter.pre_viejo Then + p_tipopago.Visible = True + rb_efectivo.Checked = True + rb_tranfe.Checked = False + rb_tarjetadebito.Checked = False + rb_tarjetacredito.Checked = False + et_com_tp.Text = "" +' B_IMP_Click +' Guardar.Enabled = False +' gest.Enabled = False +' b_cxc.Enabled = False +' Tar.Enabled = False +' Tels.Enabled = False +' b_ventaabordo.Enabled = False +' HIST.Enabled = False +' banderaimp = 1 + Else If pre_act = Starter.pre_viejo Then + GUADAVENTA2 + End If +End Sub + +Sub GUADAVENTA2 + Log(B4XPages.MainPage.recarga) + If B4XPages.MainPage.recarga = "0" 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 + 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)") + B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info2 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 + Guardar.Enabled = True + gest.Enabled = True + b_cxc.Enabled = True + Tar.Enabled = True + Tels.Enabled = True + b_ventaabordo.Enabled = True + HIST.Enabled = True + banderaimp = 0 +' B4XPages.ShowPage("Principal") + bitacora.b_Inicio_Fin_venta2.Text = "TERMINAR VENTA" + bitacora.enVenta = False + bitacora.inicioFin + Else If B4XPages.MainPage.recarga = "1" 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 + 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 + mandaPendientesrecarga + mandapiezasrecarga + B4XPages.MainPage.productos.reiniciarlistaProds = True + B4XPages.MainPage.productos.prodsMap.Initialize + B4XPages.MainPage.promos.promosMap.Initialize + B4XPages.ShowPage("login") + B4XPages.MainPage.recarga = "0" + End If +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.ExecQuery2("SELECT * FROM PEDIDO WHERE PE_FOLIO = ? AND PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA)",Array As String("VENTA")) + If c.RowCount > 0 Then + imprime_venta + t1.Initialize("T1", 5000) ' 1000 = 1 second + t1.Enabled = True + Else If c.RowCount = 0 Then + s = skmt.ExecQuery2("SELECT * FROM PEDIDO WHERE PE_FOLIO = ? AND PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA)",Array As String("PREVENTA")) + If s.RowCount > 0 Then + imprime_preventa + End If + End If + +End Sub + +Sub t1_tick + s = skmt.ExecQuery2("SELECT * FROM PEDIDO WHERE PE_FOLIO = ? AND PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA)",Array As String("PREVENTA")) + If s.RowCount > 0 Then + imprime_preventa + End If + t1.Enabled = False +End Sub + +Sub imprime_preventa + 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 = 22 + BLANCO = " " +' Dim bmp As Bitmap +' bmp.InitializeResize(File.DirAssets, "mariana.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("ADM Distribuciones" & 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) + Printer1.WriteString(" " & CRLF) + c = skmt.ExecQuery2("SELECT * FROM PEDIDO WHERE PE_FOLIO = ?",Array As String("PREVENTA")) + If c.RowCount > 0 Then + Printer1.WriteString("-----------PREVENTA-----------" & CRLF) + +' Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString("Cant. Precio Importe" & CRLF) + + Printer1.WriteString("------------------------------" & CRLF) + ' aqui es donde esta el pedo de julieta de los descuentos quitar el precio2 pero meter un if para saber si es ruta especial o es normal o que show. + s=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_PRONOMBRE") & CRLF) + LogColor(s.GetLong("L_CANT"),Colors.Magenta) + LogColor(s.GetLong("L_COSTOU"),Colors.Magenta) + LogColor(s.GetLong("L_COSTO_TOT"),Colors.Magenta) + TAMANO = s.GetLong("L_CANT") + TAMANO + + If s.GetLong("L_COSTOU") = 1 Then + TAMANO = s.GetLong("L_COSTOU") + TAMANO + 4 + Else If s.GetLong("L_COSTOU") = 2 Then + TAMANO = s.GetLong("L_COSTOU") + TAMANO + 3 + Else If s.GetLong("L_COSTOU") = 3 Then + TAMANO = s.GetLong("L_COSTOU") + TAMANO + 2 + Else If s.GetLong("L_COSTOU") = 4 Then + TAMANO = s.GetLong("L_COSTOU") + TAMANO + 1 + Else + TAMANO = s.GetLong("L_COSTOU") + TAMANO + End If + +' If s.GetLong("L_COSTOU") = 1 Then +' TAMANO = s.GetLong("L_COSTOU") + TAMANO + 3 +' Else If s.GetLong("L_COSTOU") = 2 Then +' TAMANO = s.GetLong("L_COSTOU") + TAMANO + 2 +' Else If s.GetLong("L_COSTOU") = 3 Then +' TAMANO = s.GetLong("L_COSTOU") + TAMANO + 1 +' Else +' TAMANO = s.GetLong("L_COSTOU") + TAMANO +' End If +' +' If s.GetLong("L_COSTO_TOT") = 1 Then +' TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 5 +' Else If s.GetLong("L_COSTO_TOT") = 2 Then +' TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 4 +' Else If s.GetLong("L_COSTO_TOT") = 3 Then +' TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 3 +' Else If s.GetLong("L_COSTO_TOT") = 4 Then +' TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 2 +' Else If s.GetLong("L_COSTO_TOT") = 5 Then +' TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 1 +' Else +' TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO +' End If + + If s.GetLong("L_COSTO_TOT") = 1 Then + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 4 + Else If s.GetLong("L_COSTO_TOT") = 2 Then + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 3 + Else If s.GetLong("L_COSTO_TOT") = 3 Then + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 2 + Else If s.GetLong("L_COSTO_TOT") = 4 Then + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 1 + Else + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + End If + + ESPACIO = ESPACIO - TAMANO + + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( s.GETSTRING("PE_CANT")& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString(s.GETSTRING("PE_COSTOU")& BLANCO) + Printer1.Justify = 2 + Printer1.WriteString(s.GETSTRING("PE_COSTO_TOT") & CRLF ) + TAMANO = 0 + ESPACIO = 22 + BLANCO = " " + Printer1.Justify = 0 + End If + Next + End If + Printer1.Justify = 0 + 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) + Printer1.WriteString("Cant. Precio Importe" & CRLF) + Printer1.WriteString("------------------------------" & 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 + TAMANO = 0 + Printer1.WriteString(s.GetString("PE_PRONOMBRE") & CRLF) + TAMANO = s.GetLong("L_CANT") + TAMANO + If s.GetLong("L_COSTOU") = 1 Then + TAMANO = s.GetLong("L_COSTOU") + TAMANO + 3 + Else If s.GetLong("L_COSTOU") = 2 Then + TAMANO = s.GetLong("L_COSTOU") + TAMANO + 3 + Else If s.GetLong("L_COSTOU") = 3 Then + TAMANO = s.GetLong("L_COSTOU") + TAMANO + 2 + Else If s.GetLong("L_COSTOU") = 4 Then + TAMANO = s.GetLong("L_COSTOU") + TAMANO + 1 + Else + TAMANO = s.GetLong("L_COSTOU") + TAMANO + End If + + If s.GetLong("L_COSTO_TOT") = 1 Then + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 3 + Else If s.GetLong("L_COSTO_TOT") = 2 Then + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 3 + Else If s.GetLong("L_COSTO_TOT") = 3 Then + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 2 + Else If s.GetLong("L_COSTO_TOT") = 4 Then + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 1 + Else + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + End If + + 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 ) + Printer1.Justify = 0 + Printer1.WriteString( s.GETSTRING("PE_CANT")& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString(s.GETSTRING("PE_COSTOU")& BLANCO) + Printer1.Justify = 2 + Printer1.WriteString(s.GETSTRING("PE_COSTO_TOT") & CRLF ) + TAMANO = 0 + ESPACIO = 22 + BLANCO = " " + Printer1.Justify = 0 + End If + Next + Printer1.WriteString(" " & CRLF) + End If + s.Close + Printer1.Justify = 0 + 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 + + +' 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 + + + Msgbox2Async("Deseas imprimir de nuevo el ticket?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + B_IMP_Click + Else + GUADAVENTA2 + End If + +' printer.Flush + ' printer.Close +End Sub + +Private Sub Label20_LongClick + xui.SetDataFolder("B4Xpdf") + File.Copy(File.DirAssets,"intmex_logo_192x192.jpg",xui.DefaultFolder,"intmex_logo_192x192.jpg") + File.Copy(File.DirAssets,"mariana1.jpg",xui.DefaultFolder,"mariana1.jpg") + File.Copy(File.DirAssets,"guna-fondo.jpg",xui.DefaultFolder,"guna-fondo.jpg") + ESPACIO = 0 + DateTime.DateFormat = "MM/dd/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Dim PDF As cPDF + 'initialize with mm unit + PDF.Initialize("mm") + + 'set properties + PDF.sProperty(PDF.PropertyAuthor,"Keymonsoft"). _ + sProperty(PDF.PropertyTitle,"Ticket"). _ + sProperty(PDF.PropertyKeywords,"B4X,PDF,Cross platform") + + Dim s56 As Cursor=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")) + Dim s57 As Cursor = 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_CLIENTE IN (Select CUENTA from cuentaa) order by PE_CEDIS, PE_COSTOU", Array As String("PREVENTA")) + + 'add a page + Dim pagina As Double = ((18 + (s56.RowCount*2) + (s57.RowCount*2) +2) * (6)) + 22 + Dim multiplicador As Int = 0 + + PDF.pageAdd(-300,pagina) + + PDF.sFont(PDF.fontHelvetica,0,10,PDF.colorBlack) + + PDF.outImage(xui.DefaultFolder,"mariana1.jpg",1,pagina-55,70,0) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"ADM Distribuciones") + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,sDate& " " & sTime) + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Vendedor:" & Subs.traeUsuarioDeBD) + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Tienda: " & La_nombre.Text) + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"ID.Cliente: " & la_cuenta.Text) + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Calle: " & la_Calle.Text) + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Colonia: " & la_col.Text) + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6," ") + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6," ") + + c = skmt.ExecQuery2("SELECT * FROM PEDIDO WHERE PE_FOLIO = ?",Array As String("PREVENTA")) + If c.RowCount > 0 Then + + 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 + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"------------------------------------PREVENTA-----------------------------------------") + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Cant. Precio Importe") + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-----------------------------------------------------------------------------------------") + For i=0 To S.RowCount -1 + S.Position=i + If s.GetString("PE_CEDIS") = s.GetString("PE_PROID") Then + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,s.GetString("PE_PRONOMBRE") ) + + Else + PDF.sFont(PDF.fontHelvetica,0,7,PDF.colorBlack) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,s.GetString("PE_PRONOMBRE")) + LogColor(s.GetLong("L_CANT"),Colors.Magenta) + LogColor(s.GetLong("L_COSTOU"),Colors.Magenta) + LogColor(s.GetLong("L_COSTO_TOT"),Colors.Magenta) + + TAMANO = s.GetLong("L_CANT") + s.GetLong("L_COSTOU") + s.GetLong("L_COSTO_TOT") + ESPACIO = 92 + BLANCO = " " + ESPACIO = ESPACIO - TAMANO + ESPACIO = ESPACIO / 2 + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + PDF.sFont(PDF.fontHelvetica,0,10,PDF.colorBlack) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6, s.GETSTRING("PE_CANT") & BLANCO & s.GETSTRING("PE_COSTOU") & BLANCO & s.GETSTRING("PE_COSTO_TOT")) + End If + Next + End If + + s.Close + PDF.outtext(1,108-9*6," " ) + 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_CLIENTE IN (Select CUENTA from cuentaa) order by PE_CEDIS, PE_COSTOU", Array As String("PREVENTA")) + If S.RowCount>0 Then + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"--------------------------PROMOS PREVENTA-------------------------------------") + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Cant. Precio Importe") + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-----------------------------------------------------------------------------------------") + For i=0 To S.RowCount -1 + S.Position=i + If s.GetString("PE_CEDIS") = s.GetString("PE_PROID") Then + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,s.GetString("PE_PRONOMBRE") ) + + Else + + PDF.sFont(PDF.fontHelvetica,0,7,PDF.colorBlack) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,s.GetString("PE_PRONOMBRE")) + LogColor(s.GetLong("L_CANT"),Colors.Magenta) + LogColor(s.GetLong("L_COSTOU"),Colors.Magenta) + LogColor(s.GetLong("L_COSTO_TOT"),Colors.Magenta) + + TAMANO = s.GetLong("L_CANT") + s.GetLong("L_COSTOU") + s.GetLong("L_COSTO_TOT") + ESPACIO = 92 + BLANCO = " " + ESPACIO = ESPACIO - TAMANO + ESPACIO = ESPACIO / 2 + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + PDF.sFont(PDF.fontHelvetica,0,10,PDF.colorBlack) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6, s.GETSTRING("PE_CANT") & BLANCO & s.GETSTRING("PE_COSTOU") & BLANCO & s.GETSTRING("PE_COSTO_TOT")) + + End If + Next + End If + s.Close + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6," " ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-----------------------------------------------------------------------------------------") + + 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 + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Total preventa: $" & s.GetString("TOTAL") ) + 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 + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Total articulos preventa: " & c.GetString("PC_NOART") ) + c.Close + End If + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-----------------------------------------------------------------------------------------" ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"--------------------------ESTE TICKET NO ES UN ---------------------------" ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-------------------COMPROBANTE FISCAL, SOLO ES--------------------" ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"---------------------------------INFORMATIVO-----------------------------------" ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-----------------------------------------------------------------------------------------" ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6," " ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6," " ) + + DateTime.DateFormat = "ddmmyyyy" + DateTime.TimeFormat = "HHmmss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + 'save to file with compression if data compressed are smaller + savePDF(PDF,sDate&sTime&".pdf",PDF.CompressAlways) + + 'open with default viewer + openPDF(sDate&sTime&".pdf") +End Sub + +Private Sub PDFGENERAR + + + ESPACIO = 0 + DateTime.DateFormat = "MM/dd/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Dim PDF As cPDF + 'initialize with mm unit + PDF.Initialize("mm") + + 'set properties + PDF.sProperty(PDF.PropertyAuthor,"Keymonsoft"). _ + sProperty(PDF.PropertyTitle,"Ticket"). _ + sProperty(PDF.PropertyKeywords,"B4X,PDF,Cross platform") + + 'add a page + + Dim s56 As Cursor=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")) + Dim s57 As Cursor = 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_CLIENTE IN (Select CUENTA from cuentaa) order by PE_CEDIS, PE_COSTOU", Array As String("PREVENTA")) + + Dim pagina As Double = ((18 + (s56.RowCount*2) + (s57.RowCount*2)) * (6)) + 18 +' Dim pagina As Double = ((18 + s56.RowCount + s57.RowCount +2) * (6)) + 18 + Dim multiplicador As Int = 0 + PDF.pageAdd(-300,pagina) +' pdf.pageAdd(-350,-1900) + + PDF.sFont(PDF.fontHelvetica,0,10,PDF.colorBlack) + + PDF.outImage(xui.DefaultFolder,"mariana1.jpg",1,pagina-55,70,0) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"ADM Distribuciones") + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,sDate& " " & sTime) + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Vendedor:" & Subs.traeUsuarioDeBD) + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Tienda: " & La_nombre.Text) + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"ID.Cliente: " & la_cuenta.Text) + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Calle: " & la_Calle.Text) + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Colonia: " & la_col.Text) + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6," ") + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6," ") + + c = skmt.ExecQuery2("SELECT * FROM PEDIDO WHERE PE_FOLIO = ?",Array As String("PREVENTA")) + If c.RowCount > 0 Then + + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"------------------------------------PREVENTA-----------------------------------------") + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Cant. Precio Importe") + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-----------------------------------------------------------------------------------------") + + + 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 + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,s.GetString("PE_PRONOMBRE") ) + + Else + PDF.sFont(PDF.fontHelvetica,0,7,PDF.colorBlack) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,s.GetString("PE_PRONOMBRE")) + LogColor(s.GetLong("L_CANT"),Colors.Magenta) + LogColor(s.GetLong("L_COSTOU"),Colors.Magenta) + LogColor(s.GetLong("L_COSTO_TOT"),Colors.Magenta) + + TAMANO = s.GetLong("L_CANT") + s.GetLong("L_COSTOU") + s.GetLong("L_COSTO_TOT") + ESPACIO = 92 + BLANCO = " " + ESPACIO = ESPACIO - TAMANO + ESPACIO = ESPACIO / 2 + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + PDF.sFont(PDF.fontHelvetica,0,10,PDF.colorBlack) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6, s.GETSTRING("PE_CANT") & BLANCO & s.GETSTRING("PE_COSTOU") & BLANCO & s.GETSTRING("PE_COSTO_TOT")) + +' pdf.outtext(1,108-9*6,s.GETSTRING("PE_COSTOU")) +' +' pdf.outtext(1,108-9*6,s.GETSTRING("PE_COSTO_TOT") ) + + + End If + Next + End If + + s.Close + PDF.outtext(1,108-9*6," " ) + 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_CLIENTE IN (Select CUENTA from cuentaa) order by PE_CEDIS, PE_COSTOU", Array As String("PREVENTA")) + If S.RowCount>0 Then + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"--------------------------PROMOS PREVENTA-------------------------------------") + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Cant. Precio Importe") + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-----------------------------------------------------------------------------------------") + For i=0 To S.RowCount -1 + S.Position=i + If s.GetString("PE_CEDIS") = s.GetString("PE_PROID") Then + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,s.GetString("PE_PRONOMBRE") ) + + Else + + PDF.sFont(PDF.fontHelvetica,0,7,PDF.colorBlack) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,s.GetString("PE_PRONOMBRE")) + LogColor(s.GetLong("L_CANT"),Colors.Magenta) + LogColor(s.GetLong("L_COSTOU"),Colors.Magenta) + LogColor(s.GetLong("L_COSTO_TOT"),Colors.Magenta) + + TAMANO = s.GetLong("L_CANT") + s.GetLong("L_COSTOU") + s.GetLong("L_COSTO_TOT") + ESPACIO = 92 + BLANCO = " " + ESPACIO = ESPACIO - TAMANO + ESPACIO = ESPACIO / 2 + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + PDF.sFont(PDF.fontHelvetica,0,10,PDF.colorBlack) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6, s.GETSTRING("PE_CANT") & BLANCO & s.GETSTRING("PE_COSTOU") & BLANCO & s.GETSTRING("PE_COSTO_TOT")) + + End If + Next + End If + s.Close + +' multiplicador = multiplicador +1 +' pdf.outtext(1,pagina-multiplicador*6," " ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6," " ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-----------------------------------------------------------------------------------------") + + 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 + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Total preventa: $" & s.GetString("TOTAL") ) + 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 + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"Total articulos preventa: " & c.GetString("PC_NOART") ) + c.Close + End If + +' multiplicador = multiplicador +1 +' pdf.outtext(1,pagina-multiplicador*6," " ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-----------------------------------------------------------------------------------------" ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"--------------------------ESTE TICKET NO ES UN ---------------------------" ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-------------------COMPROBANTE FISCAL, SOLO ES--------------------" ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"---------------------------------INFORMATIVO-----------------------------------" ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6,"-----------------------------------------------------------------------------------------" ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6," " ) + multiplicador = multiplicador +1 + PDF.outtext(1,pagina-multiplicador*6," " ) + + +' 'all combinations of font normal, bold,italic,underline and strikethrough +' For i=0 To 15 +' 'select a font +' pdf.sFont(pdf.fontHelvetica,s,30,pdf.colorBlack) +' 'draw a text at position 20 (from left) and 277 (from bottom) +' pdf.outtext(20,277-i*15,"Hello world!") +' Next + DateTime.DateFormat = "ddmmyyyy" + DateTime.TimeFormat = "HHmmss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + 'save to file with compression if data compressed are smaller + savePDF(PDF,sDate&sTime&".pdf",PDF.CompressAlways) + + 'open with default viewer + If chb_impreso.Checked = False Then + openPDF(sDate&sTime&".pdf") + End If + nombrepdf =sDate&sTime&".pdf" + GUADAVENTA2 +End Sub + +private Sub savePDF(apdf As cPDF,afile As String,acompress As Int) +' Dim folder As String +' #if B4J +' folder=xui.DefaultFolder +' #End If +' #if B4A +' folder=Starter.fFileProvider.SharedFolder +' #End If +' #if B4I +' '...... +' #End If +' apdf.saveToFile(folder,afile,acompress) + + Dim folder As String + #if B4J + folder = xui.DefaultFolder + #End If + #if B4A + folder = Starter.fFileProvider.SharedFolder + #End If + #if B4I + folder = File.DirDocuments + #End If + + ' Guardar el PDF + apdf.saveToFile(folder, afile, acompress) + + ' Mostrar mensaje de éxito + Log($"PDF guardado en: ${File.Combine(folder, afile)}"$) +End Sub + +private Sub openPDF(afile As String) + #if B4J + fx.ShowExternalDocument(File.GetUri(xui.DefaultFolder,afile)) + #end if + #if B4A + Dim in As Intent + in.Initialize(in.ACTION_VIEW, "") + Starter.ffileProvider.SetFileUriAsIntentData(in, afile) + in.SetComponent("android/com.android.internal.app.ResolverActivity") + in.SetType("application/pdf") + StartActivity(in) + #end if + #if B4I + '...... + #End If +End Sub + + +Sub imprime_venta + 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 = 22 + BLANCO = " " +' Dim bmp As Bitmap +' bmp.InitializeResize(File.DirAssets, "mariana.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("ADM Distribuciones" & 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) + Printer1.WriteString(" " & CRLF) + c = skmt.ExecQuery2("SELECT * FROM PEDIDO WHERE PE_FOLIO = ?",Array As String("VENTA")) + If c.RowCount > 0 Then + Printer1.WriteString("-----------VENTA-----------" & CRLF) + +' Printer1.WriteString("--------------------------------" & CRLF) + Printer1.WriteString("Cant. Precio Importe" & CRLF) + + Printer1.WriteString("------------------------------" & CRLF) + ' aqui es donde esta el pedo de julieta de los descuentos quitar el precio2 pero meter un if para saber si es ruta especial o es normal o que show. + s=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_PRONOMBRE") & CRLF) + TAMANO = s.GetLong("L_CANT") + TAMANO + If s.GetLong("L_COSTOU") = 1 Then + TAMANO = s.GetLong("L_COSTOU") + TAMANO + 4 + Else If s.GetLong("L_COSTOU") = 2 Then + TAMANO = s.GetLong("L_COSTOU") + TAMANO + 3 + Else If s.GetLong("L_COSTOU") = 3 Then + TAMANO = s.GetLong("L_COSTOU") + TAMANO + 2 + Else If s.GetLong("L_COSTOU") = 4 Then + TAMANO = s.GetLong("L_COSTOU") + TAMANO + 1 + Else + TAMANO = s.GetLong("L_COSTOU") + TAMANO + End If + + If s.GetLong("L_COSTO_TOT") = 1 Then + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 4 + Else If s.GetLong("L_COSTO_TOT") = 2 Then + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 3 + Else If s.GetLong("L_COSTO_TOT") = 3 Then + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 2 + Else If s.GetLong("L_COSTO_TOT") = 4 Then + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 1 + Else + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + End If + + ESPACIO = ESPACIO - TAMANO + + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + Printer1.Justify = 0 + Printer1.WriteString( s.GETSTRING("PE_CANT")& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString(s.GETSTRING("PE_COSTOU")& BLANCO) + Printer1.Justify = 2 + Printer1.WriteString(s.GETSTRING("PE_COSTO_TOT") & CRLF ) + TAMANO = 0 + ESPACIO = 22 + BLANCO = " " + End If + Next + End If + Printer1.Justify = 0 + 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) + Printer1.WriteString("Cant. Precio Importe" & CRLF) + Printer1.WriteString("------------------------------" & 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_PRONOMBRE") & CRLF) + TAMANO = s.GetLong("L_CANT") + TAMANO + If s.GetLong("L_COSTOU") = 1 Then + TAMANO = s.GetLong("L_COSTOU") + TAMANO + 3 + Else If s.GetLong("L_COSTOU") = 2 Then + TAMANO = s.GetLong("L_COSTOU") + TAMANO + 3 + Else If s.GetLong("L_COSTOU") = 3 Then + TAMANO = s.GetLong("L_COSTOU") + TAMANO + 2 + Else If s.GetLong("L_COSTOU") = 4 Then + TAMANO = s.GetLong("L_COSTOU") + TAMANO + 1 + Else + TAMANO = s.GetLong("L_COSTOU") + TAMANO + End If + + If s.GetLong("L_COSTO_TOT") = 1 Then + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 3 + Else If s.GetLong("L_COSTO_TOT") = 2 Then + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 3 + Else If s.GetLong("L_COSTO_TOT") = 3 Then + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 2 + Else If s.GetLong("L_COSTO_TOT") = 4 Then + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + 1 + Else + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + End If + + 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 ) + Printer1.Justify = 0 + Printer1.WriteString( s.GETSTRING("PE_CANT")& BLANCO) + Printer1.Justify = 1 + Printer1.WriteString(s.GETSTRING("PE_COSTOU")& BLANCO) + Printer1.Justify = 2 + Printer1.WriteString(s.GETSTRING("PE_COSTO_TOT") & CRLF ) + TAMANO = 0 + ESPACIO = 22 + BLANCO = " " + End If + Next + Printer1.WriteString(" " & CRLF) + End If + s.Close + Printer1.Justify = 0 + 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 + +' Printer1.WriteString(" " & CRLF) + 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 + + s = skmt.ExecQuery2("SELECT * FROM PEDIDO WHERE PE_FOLIO = ? AND PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA)",Array As String("PREVENTA")) + If s.RowCount = 0 Then + Msgbox2Async("Deseas imprimir de nuevo el ticket?", "ATENCION","SI","", "NO",LoadBitmap(File.DirAssets,"alert2.png"), False) + Wait For Msgbox_Result (resultado As Int) + If resultado = DialogResponse.POSITIVE Then + B_IMP_Click + Else + GUADAVENTA2 + End If + End If + +' 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")) + skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("MACIMP",Starter.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 + Starter.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_ADM3" + 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, PE_CANTC, PE_BCAJAS, PE_TIPOPAGO, PE_COMENTARIO 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_ADM3" + cmd.Parameters = Array As Object(c.GetString("PE_CEDIS"),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"),Subs.traeRuta2(c.GetString("PE_CLIENTE")), c.GetString("PE_COSTO_SIN"),c.GetString("PE_DESC"),c.GetString("PE_FOLIO"),c.GetString("PE_CANTC"),c.GetString("PE_BCAJAS"),c.GetString("PE_TIPOPAGO"),c.GetString("PE_COMENTARIO")) + 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_ADM3" + 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_ADM3" + 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 mandaPendientesrecarga +' PEDIDO_CLIENTE (Pendientes) + Log(">>>>>>> MANDA PENDIENTES") + Dim PCNoArts As String + Dim PCMonto As String + If usuario <> "KMTS1" Then + f=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info") + f.Position=0 + d = skmt.ExecQuery("SELECT * FROM PEDIDO_CLIENTE where PC_ENVIO_OK = 0 AND PC_CLIENTE = 1") + c = skmt.ExecQuery("SELECT * FROM PEDIDO_CLIENTE where PC_ENVIO_OK = 0 AND PC_CLIENTE = 1") + 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_ADM3" + cmd.Parameters = Array As Object("0", 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, f.GetString("CAT_CL_RUTA"), 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 + f.Close + '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, PE_CANTC, PE_BCAJAS FROM PEDIDO where PE_ENVIO_OK <> 1 AND PE_FOLIO = 'RECARGA'"$) + 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_pedido3_ADM3" + 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"),"0",C.GetString("PE_FECHA"),C.GetString("PE_USUARIO"),C.GetString("PE_RUTA"), C.GetString("PE_COSTO_SIN"),C.GetString("PE_DESC"),"ABORDO",C.GetString("PE_CANTC"),c.GetString("PE_BCAJAS"),"RECARGA") + 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 + End If +End Sub + +Sub mandapiezasrecarga + 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("1")) + 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_ADM3" + cmd.Parameters = Array As Object(la_cuenta.Text, ALMACEN, LA_RUTA) + reqManager.ExecuteQuery(cmd , 0, "piezasrecarga") + End If + 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_ADM3" + 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_ADM3" + 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_ADM3" + 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 = "piezasrecarga" 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("1")) + 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_ADM3" + cmd.Parameters = Array As Object((sDate & " " & sTime), "0", 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("1")) + 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_ADM3" + cmd.Parameters = Array As Object((sDate & " " & sTime), "0", 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 + +Private Sub b_foto_inci_Click + camEx.TakePicture +End Sub + +Private Sub InitializeCamera + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_CAMERA) + Wait For B4XPage_PermissionResult (Permission As String, resulta As Boolean) + If resulta Then + camEx.Initialize(p_cam, frontCamera, Me, "Camera1") + frontCamera = camEx.Front + Else + ToastMessageShow("No permission!!!", True) + End If +End Sub + +Sub Camera1_Ready (Success As Boolean) + If Success Then + camEx.SetJpegQuality(90) + camEx.SetContinuousAutoFocus + camEx.CommitParameters + camEx.StartPreview + Log(camEx.GetPreviewSize) + Else + ToastMessageShow("Cannot open camera.", True) + End If +End Sub + + +Sub Camera1_PictureTaken (Data() As Byte) + + If b_foto_inci.Text = "Foto tienda" Then + + DateTime.DateFormat="ddMMyyyyHHmmss" + fototomada = DateTime.Now & "_cliente.jpg" + Dim filename As String = fototomada + Dim dir As String = File.DirInternal + camEx.SavePictureToFile(Data, dir, filename) + camEx.StartPreview 'restart preview + ToastMessageShow("Picture saved." & CRLF & "File size: " & File.Size(dir, filename), True) + + Dim Dirp As String = File.DirInternal + Dim dir As String + Dim Dir2 As String + Try + File.MakeDir(Dirp,"/adm") + dir = "/amd" + Log("creado en promotoria " & Dirp & dir) + Catch + dir = "" + Log("creado en raiz") + End Try + + Try + File.MakeDir(Dirp & dir,"/reduccion") + Dir2 = "/reduccion" + Log("creado en promotoria " & Dirp & dir & Dir2) + Catch + dir = "" + Log("creado en raiz") + End Try + + DateTime.DateFormat = "MM/dd/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate = DateTime.Date(DateTime.Now) + sTime = DateTime.Time(DateTime.Now) + + camEx.SavePictureToFile(Data, Dirp&dir, filename) + camEx.StartPreview 'restart preview + ToastMessageShow("Picture saved." & CRLF & "File size: " & File.Size(dir, filename) & dir &"," & filename, True) + Log("Picture saved." & CRLF & "File size: " & File.Size(dir, filename) & dir &"," & filename) + + Dim img As B4XBitmap = xui.LoadBitmapResize(File.DirInternal & dir, filename, 450, 600, True) + Dim out As OutputStream = File.OpenOutput(File.DirInternal & dir & Dir2, filename, False) + img.WriteToStream(out, 100, "PNG") + out.Close + + Starter.skmt.ExecNonQuery2("INSERT INTO FOTOINICIAL (RUTAA, ALMACEN, LATITUD, LONGITUD, FECHAHORA, FOTO, USUARIO) VALUES (?,?,?,?,?,?,?)",Array As Object(LA_RUTA, ALMACEN, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps, sDate & " " & sTime, File.ReadBytes(File.DirInternal & dir & Dir2, fototomada), Subs.traeUsuarioDeBD)) + b_foto_inci.Text = "Foto usuario" + ChangeCamera_Click + Else If b_foto_inci.Text = "Foto usuario" Then + DateTime.DateFormat="ddMMyyyyHHmmss" + fototomada = DateTime.Now & "_cliente.jpg" + Dim filename As String = fototomada + Dim dir As String = File.DirInternal + camEx.SavePictureToFile(Data, dir, filename) + camEx.StartPreview 'restart preview + ToastMessageShow("Picture saved." & CRLF & "File size: " & File.Size(dir, filename), True) + + Dim Dirp As String = File.DirInternal + Dim dir As String + Dim Dir2 As String + Try + File.MakeDir(Dirp,"/adm") + dir = "/amd" + Log("creado en promotoria " & Dirp & dir) + Catch + dir = "" + Log("creado en raiz") + End Try + + Try + File.MakeDir(Dirp & dir,"/reduccion") + Dir2 = "/reduccion" + Log("creado en promotoria " & Dirp & dir & Dir2) + Catch + dir = "" + Log("creado en raiz") + End Try + + DateTime.DateFormat = "MM/dd/yyyy" + DateTime.TimeFormat = "HH:mm:ss" + sDate = DateTime.Date(DateTime.Now) + sTime = DateTime.Time(DateTime.Now) + + camEx.SavePictureToFile(Data, Dirp&dir, filename) + camEx.StartPreview 'restart preview + ToastMessageShow("Picture saved." & CRLF & "File size: " & File.Size(dir, filename) & dir &"," & filename, True) + Log("Picture saved." & CRLF & "File size: " & File.Size(dir, filename) & dir &"," & filename) + + Dim img As B4XBitmap = xui.LoadBitmapResize(File.DirInternal & dir, filename, 450, 600, True) + Dim out As OutputStream = File.OpenOutput(File.DirInternal & dir & Dir2, filename, False) + img.WriteToStream(out, 100, "PNG") + out.Close + + + B4XPages.MainPage.skmt.ExecNonQuery2("UPDATE FOTOINICIAL set FOTO2 = ? where USUARIO = ? and RUTAA = ? and ALMACEN = ? ", Array As Object (File.ReadBytes(File.DirInternal & dir & Dir2, fototomada), Subs.traeUsuarioDeBD,LA_RUTA, ALMACEN )) + b_foto_inci.Text = "Foto tienda" + ChangeCamera_Click + p_camara.Visible = False + StopCamera + If la_cuenta.Text = "0" Then + B4XPages.MainPage.tipo_venta = "ABORDO" + Else If la_cuenta.Text = "1" Then + B4XPages.MainPage.tipo_venta = "RECARGA" + Else + B4XPages.MainPage.tipo_venta = "PREVENTA" + End If + B4XPages.ShowPage("productos") + End If + +End Sub + + +Sub ChangeCamera_Click + camEx.Release + frontCamera = Not(frontCamera) + InitializeCamera +End Sub + +Private Sub StopCamera +' Capturing = False + If camEx.IsInitialized Then + camEx.Release + End If +End Sub + + +Private Sub p_camara_Click + +End Sub + +Private Sub p_tipopago_Click + +End Sub + +Private Sub b_cancel_tp_Click + p_tipopago.Visible = False + rb_efectivo.Checked = False + rb_tranfe.Checked = False + rb_tarjetadebito.Checked = False + rb_tarjetacredito.Checked = False + et_com_tp.Text = "" +End Sub + +'Private Sub b_acept_tp_Click +'' If rb_efectivo.Checked Or rb_tranfe.Checked Or rb_tarjetacredito.Checked Or rb_tarjetadebito.Checked Then +'' +'' Dim metopago As String +'' If rb_efectivo.Checked Then +'' metopago = "EFECTIVO" +'' Else If rb_tranfe.Checked Then +'' metopago = "TRANSFERENCIA" +'' Else If rb_tarjetadebito.Checked Then +'' metopago = "TARJETA DE DEBITO" +'' Else If rb_tarjetacredito.Checked Then +'' metopago = "TARJETA DE CREDITO" +'' End If +'' +'' +'' +'' Guardar.Enabled = True +'' gest.Enabled = True +'' b_cxc.Enabled = True +'' Tar.Enabled = True +'' Tels.Enabled = True +'' b_ventaabordo.Enabled = True +'' HIST.Enabled = True +'' banderaimp = 1 +'' If chb_impreso.Checked Then +'' Log("aqui estoy") +'' B4XPages.MainPage.skmt.ExecNonQuery2("update PEDIDO set PE_TIPOPAGO = ?, PE_COMENTARIO = ?, PE_TICKET = ? where PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA) ", Array As String(metopago,et_com_tp.Text,"CORREO")) +'' PDFGENERAR +'' +'' Else +'' B4XPages.MainPage.skmt.ExecNonQuery2("update PEDIDO set PE_TIPOPAGO = ?, PE_COMENTARIO = ?, PE_TICKET = ? where PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA) ", Array As String(metopago,et_com_tp.Text,"IMPRESO")) +'' Log("aqui estoy1") +'' PDFGENERAR +'' End If +'' rb_efectivo.Checked = False +'' rb_tranfe.Checked = False +'' rb_tarjetadebito.Checked = False +'' rb_tarjetacredito.Checked = False +'' et_com_tp.Text = "" +'' p_tipopago.Visible = False +'' Else +'' MsgboxAsync("Selecciona un metodo de pago.","Atención") +'' End If +' +' +' If rb_efectivo.Checked Or rb_tranfe.Checked Or rb_tarjetacredito.Checked Or rb_tarjetadebito.Checked Then +' +' Dim metopago As String +' If rb_efectivo.Checked Then +' metopago = "EFECTIVO" +' Else If rb_tranfe.Checked Then +' metopago = "TRANSFERENCIA" +' Else If rb_tarjetadebito.Checked Then +' metopago = "TARJETA DE DEBITO" +' Else If rb_tarjetacredito.Checked Then +' metopago = "TARJETA DE CREDITO" +' End If +' +' Guardar.Enabled = True +' gest.Enabled = True +' b_cxc.Enabled = True +' Tar.Enabled = True +' Tels.Enabled = True +' b_ventaabordo.Enabled = True +' HIST.Enabled = True +' banderaimp = 1 +' +' If chb_impreso.Checked Then +' ' Guardar en BD que se enviará por correo +' B4XPages.MainPage.skmt.ExecNonQuery2("update PEDIDO set PE_TIPOPAGO = ?, PE_COMENTARIO = ?, PE_TICKET = ? where PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA) ", _ +' Array As String(metopago, et_com_tp.Text, "CORREO")) +' +' ' Generar el PDF primero +' PDFGENERAR +' +' ' Esperar un momento para que se genere el PDF +' Sleep(500) +' +' ' Obtener el nombre del archivo PDF recién generado +' DateTime.DateFormat = "ddmmyyyy" +' DateTime.TimeFormat = "HHmmss" +' Dim pdfFileName As String = DateTime.Date(DateTime.Now) & DateTime.Time(DateTime.Now) & ".pdf" +' +' ' Verificar si el archivo existe +' If File.Exists(xui.DefaultFolder, pdfFileName) Then +' ' Crear intent para enviar por correo +' Dim emailIntent As Intent +' emailIntent.Initialize(emailIntent.ACTION_SEND, "") +' emailIntent.SetType("application/pdf") +' +' ' Adjuntar el archivo PDF +' Dim uri As Object +' #If B4A +' Dim provider As String = Application.PackageName & ".provider" +' Dim FileProvidera As FileProvider +' FileProvidera.Initialize("FileProvider") +' uri = FileProvidera.GetFileUri(xui.DefaultFolder, pdfFileName) +' emailIntent.Flags = 1 ' FLAG_GRANT_READ_URI_PERMISSION +'' #Else If B4I +'' uri = File.GetUri(xui.DefaultFolder, pdfFileName) +'' #End If +' +' emailIntent.PutExtra("android.intent.extra.STREAM", uri) +' emailIntent.PutExtra("android.intent.extra.SUBJECT", "Ticket de venta - " & La_nombre.Text) +' emailIntent.PutExtra("android.intent.extra.TEXT", "Adjunto encontrará el ticket de venta") +' +' ' Especificar solo aplicaciones de correo +' emailIntent.SetComponent("com.google.android.gm/com.google.android.gm.ComposeActivityGmail") +' +' ' Verificar si hay aplicaciones que puedan manejar este intent +' Dim pm As PackageManager +' StartActivity(emailIntent) +' Else +' ToastMessageShow("No se encontró el archivo PDF para enviar", True) +' End If +' Else +' ' Caso normal (impresión) +' B4XPages.MainPage.skmt.ExecNonQuery2("update PEDIDO set PE_TIPOPAGO = ?, PE_COMENTARIO = ?, PE_TICKET = ? where PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA) ", _ +' Array As String(metopago, et_com_tp.Text, "IMPRESO")) +' PDFGENERAR +' End If +' +' ' Limpiar controles +' rb_efectivo.Checked = False +' rb_tranfe.Checked = False +' rb_tarjetadebito.Checked = False +' rb_tarjetacredito.Checked = False +' et_com_tp.Text = "" +' p_tipopago.Visible = False +' Else +' MsgboxAsync("Selecciona un metodo de pago.", "Atención") +' End If +'End Sub + +Private Sub b_acept_tp_Click + Log("---- b_acept_tp_Click") + If rb_efectivo.Checked Or rb_tranfe.Checked Or rb_tarjetacredito.Checked Or rb_tarjetadebito.Checked Then + Dim metopago As String + If rb_efectivo.Checked Then + metopago = "EFECTIVO" + Else If rb_tranfe.Checked Then + metopago = "TRANSFERENCIA" + Else If rb_tarjetadebito.Checked Then + metopago = "TARJETA DE DEBITO" + Else If rb_tarjetacredito.Checked Then + metopago = "TARJETA DE CREDITO" + End If + Guardar.Enabled = True + gest.Enabled = True + b_cxc.Enabled = True + Tar.Enabled = True + Tels.Enabled = True + b_ventaabordo.Enabled = True + HIST.Enabled = True + banderaimp = 1 + + If chb_impreso.Checked Then + Log("X") + ' Guardar en BD que se enviará por correo + B4XPages.MainPage.skmt.ExecNonQuery2("update PEDIDO set PE_TIPOPAGO = ?, PE_COMENTARIO = ?, PE_TICKET = ? where PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA) ", _ + Array As String(metopago, et_com_tp.Text, "CORREO")) + ' Generar el PDF primero + PDFGENERAR + ' Esperar un momento para que se genere el PDF + Sleep(500) + ' Obtener el nombre del archivo PDF recién generado + Dim pdfFileName As String =nombrepdf +' /data/user/0/adm.keymon.com.mx/files/shared/22142025121454.pdf + ' Verificar si el archivo existe + Log(xui.DefaultFolder) + Log(nombrepdf) + If File.Exists(Starter.fFileProvider.SharedFolder, pdfFileName) Then + Dim email As Email +' email.To.Add("soporte@keymonsoft.com") + email.Subject = "Adjunto encontrará el ticket de venta" + email.Attachments.Add(Provider.GetFileUri(pdfFileName)) + 'email.Attachments.Add(Provider.GetFileUri(FileName)) 'second attachment + Dim in As Intent = email.GetIntent + in.Flags = 1 'FLAG_GRANT_READ_URI_PERMISSION + StartActivity(in) + Else + ToastMessageShow("No se encontró el archivo PDF para enviar", True) + End If + Else + Log("Y") + ' Caso normal (impresión) + B4XPages.MainPage.skmt.ExecNonQuery2("update PEDIDO set PE_TIPOPAGO = ?, PE_COMENTARIO = ?, PE_TICKET = ? where PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA) ", _ + Array As String(metopago, et_com_tp.Text, "IMPRESO")) + PDFGENERAR + End If + ' Limpiar controles + rb_efectivo.Checked = False + rb_tranfe.Checked = False + rb_tarjetadebito.Checked = False + rb_tarjetacredito.Checked = False + et_com_tp.Text = "" + p_tipopago.Visible = False + Else + MsgboxAsync("Selecciona un metodo de pago.", "Atención") + End If + bitacora.b_Inicio_Fin_venta2.Text = "TERMINAR VENTA" + bitacora.enVenta = False + bitacora.inicioFin +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..22e803d --- /dev/null +++ b/B4A/C_Clientes.bas @@ -0,0 +1,516 @@ +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 + + Private CREDITO 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"} AND CAT_CL_CODIGO <> ${"1"} ORDER BY CAST(CAT_CL_NUM_SERIEFISICO AS INTEGER) ASC"$) + 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 = B4XPages.MainPage.skmt.ExecQuery($"select IFNULL(CAT_CL_BCREDITO,0) AS CAT_CL_BCREDITO FROM kmt_info WHERE CAT_CL_CODIGO = '${c.GetString("CAT_CL_CODIGO")}'"$) +' LogColor(d.RowCount,Colors.Blue) + If d.RowCount > 0 Then + d.Position = 0 + If d.GetString("CAT_CL_BCREDITO") = "1" Then + CREDITO.Visible = True + Else + CREDITO.Visible = False + End If + d.Close + Else + CREDITO.Visible = False + End If + 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) + Starter.pre_viejo = Subs.traeTotalClientepreventaparacredito + 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"} AND CAT_CL_CODIGO <> ${"1"} 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 = B4XPages.MainPage.skmt.ExecQuery($"select IFNULL(CAT_CL_BCREDITO,0) AS CAT_CL_BCREDITO FROM kmt_info WHERE CAT_CL_CODIGO = '${c2.GetString("CAT_CL_CODIGO")}'"$) +' LogColor(d.RowCount,Colors.Blue) + If d.RowCount > 0 Then + d.Position = 0 +' LogColor(d.GetString("CAT_CL_BCREDITO"),Colors.Blue) + If d.GetString("CAT_CL_BCREDITO") = "1" Then + CREDITO.Visible = True + Else + CREDITO.Visible = False + End If + d.Close + Else + CREDITO.Visible = False + End If + 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 = B4XPages.MainPage.skmt.ExecQuery($"select IFNULL(CAT_CL_BCREDITO,0) AS CAT_CL_BCREDITO FROM kmt_info WHERE CAT_CL_CODIGO = '${c2.GetString("CAT_CL_CODIGO")}'"$) +' LogColor(d.RowCount,Colors.Blue) + If d.RowCount > 0 Then + d.Position = 0 + LogColor(d.GetString("CAT_CL_BCREDITO"),Colors.Blue) + If d.GetString("CAT_CL_BCREDITO") = "1" Then + CREDITO.Visible = True + Else + CREDITO.Visible = False + End If + d.Close + Else + CREDITO.Visible = False + End If + 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 AND CAT_CL_CODIGO <> ${"0"} AND CAT_CL_CODIGO <> ${"1"} 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 = B4XPages.MainPage.skmt.ExecQuery($"select IFNULL(CAT_CL_BCREDITO,0) AS CAT_CL_BCREDITO FROM kmt_info WHERE CAT_CL_CODIGO = '${c.GetString("CAT_CL_CODIGO")}'"$) +' LogColor(d.RowCount,Colors.Blue) + If d.RowCount > 0 Then + d.Position = 0 + LogColor(d.GetString("CAT_CL_BCREDITO"),Colors.Blue) + If d.GetString("CAT_CL_BCREDITO") = "1" Then + CREDITO.Visible = True + Else + CREDITO.Visible = False + End If + d.Close + Else + CREDITO.Visible = False + End If + 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 AND CAT_CL_CODIGO <> ${"0"} AND CAT_CL_CODIGO <> ${"1"} 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 = B4XPages.MainPage.skmt.ExecQuery($"select IFNULL(CAT_CL_BCREDITO,0) AS CAT_CL_BCREDITO FROM kmt_info WHERE CAT_CL_CODIGO = '${c.GetString("CAT_CL_CODIGO")}'"$) +' LogColor(d.RowCount,Colors.Blue) + If d.RowCount > 0 Then + d.Position = 0 + LogColor(d.GetString("CAT_CL_BCREDITO"),Colors.Blue) + If d.GetString("CAT_CL_BCREDITO") = "1" Then + CREDITO.Visible = True + Else + CREDITO.Visible = False + End If + d.Close + Else + CREDITO.Visible = False + End If + 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 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..7671c2a --- /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_ADM3" + 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..05be972 --- /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" Or c.GetString("PE_FOLIO") = "RECARGA" 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..d5ac939 --- /dev/null +++ b/B4A/C_NuevoCliente.bas @@ -0,0 +1,343 @@ +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 sDate2,sTime2 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 + Private p_cam As Panel + Private p_camara As Panel + Private b_foto_inci As Button +' Private camEx2 As CameraExClass2 + Dim frontCamera As Boolean = False + Dim fototomada As String = "0" + Dim ALMACEN As String + Private et_direccion As EditText + Private Label2 As Label + Dim lat As Double = 0 + Dim lon As Double = 0 + Private b_ubicacion As Label + Private Label3 As Label + Private cb_giro As B4XComboBox + Dim giros As String + Private L_Atiende As Label + Private ET_Atiende As EditText +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) +' B4XPages.SetTitle(Me, $"${Subs.capitalizar(B4XPages.GetPageId(Me))} - ${Application.VersionName}"$) + 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) +' p_camara.Height = Root.Height +' p_camara.Width = Root.Width +' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_CAMERA) +' Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) +' If Result Then + '' camEx2.Initialize(p_cam, frontCamera, Me, "Camera1") + '' frontCamera = camEx2.Front +' Log("inicializamos Camara") +' Else +' ToastMessageShow("Sin permisos de camara!!!", True) +' End If + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_WRITE_EXTERNAL_STORAGE) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) + If Result Then + Log("Con permisos para escritura") + Else + ToastMessageShow("Sin permisos de escritura!!!", True) + End If + + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_READ_EXTERNAL_STORAGE) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) + If Result Then + Log("Con permisos para escritura") + Else + ToastMessageShow("Sin permisos de lectura!!!", True) + 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 + et_direccion.Text = "" + E_NOMBRE.Text = "" + ET_Atiende.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(Label2, Root.Width) + Subs.centraEtiqueta(Label3, Root.Width) + Subs.centraEtiqueta(l_sinUbicacion, Root.Width) + Subs.centraEtiqueta(b_ubicacion, Root.Width) + Subs.centraPanel(p_botones, Root.Width) + E_NOMBRE.Left = Round(Root.Width/2)-(E_NOMBRE.Width/2) + et_direccion.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 = True + End If + + If Not(Starter.GPS.GPSEnabled) Then + ToastMessageShow("Debe Activar el GPS del Equipo.", True) + StartActivity(Starter.GPS.LocationSettingsIntent) + Else + Starter.GPS.Start(0, 0) +' If Starter.ubicacionActual.Latitude <> 0 Then GPS_LocationChanged(Starter.ubicacionActual) + End If + CallSubDelayed(Tracker, "StartFLPSmall") + + c = Starter.skmt.ExecQuery("SELECT GIRO FROM CAT_GIRO order by 1") + Dim Items As List + Items.Initialize + Items.Add("SELECCIONA UNA OPCIÓN") + If c.RowCount > 0 Then + For i = 0 To c.RowCount-1 + c.Position = i + Items.Add(c.GetString("GIRO")) + Next + cb_giro.SetItems(Items) + End If + giros = "SELECCIONA UNA OPCIÓN" + c.Close +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 = True + lat = Location1.Latitude + lon = Location1.Longitude + l_sinUbicacion.Text = ("Latitud: " & lat & ", Longotud: "& lon) + End If + + b_ubicacion.TextSize = 13 + b_ubicacion.Text = $"Precisión GPS $1.0{Location1.Accuracy} m"$ + If Location1.Accuracy > 200 Then + b_ubicacion.TextColor = Colors.Red + b_ubicacion.TextSize = 16 + b_ubicacion.Text = $"Mala señal $1.0{Location1.Accuracy} m"$ + End If +End Sub + +Sub CANCELA_Click + B4XPages.ShowPage("Principal") + CallSubDelayed(Tracker, "StartFLP") +End Sub + +Sub GUARDA_Click + ' Verifica si el nombre de la tienda está vacío + If E_NOMBRE.Text = "" Then + MsgboxAsync("Por favor captura el nombre de la Tienda","Atención") + ' Verifica si la dirección tiene más de 3 caracteres + Else If et_direccion.Text.Length > 3 Then + ' Verifica si la latitud es diferente de 0 + If lat <> 0 Then + ' Verifica si el giro del cliente está seleccionado + If giros <> "SELECCIONA UNA OPCIÓN" Or cb_giro.SelectedItem <> "SELECCIONA UNA OPCIÓN" Then + ' Verifica si el encargado que atiende el negocio está capturado + If ET_Atiende.Text <> "" Then + DateTime.DateFormat = "MM/dd/yyyy" + DateTime.Timeformat = "HHmmss" + sDate = DateTime.Date(DateTime.Now) + sTime = DateTime.Time(DateTime.Now) + Log($" //////////// Date: ${sDate} - Time: ${sTime} ////////////////"$) + ' Aquí creamos manualmente 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 = Starter.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 + 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, CAT_CL_GIRO) 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, cb_giro.SelectedItem)) + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_STAY_STORE(HSS_CODIGO, HSS_IN , HSS_OUT , HSS_TOT) VALUES (?,0,0,0)", Array As Object (no_cliente)) + Starter.skmt.ExecNonQuery("delete from CUENTAA") + Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object(no_cliente)) + c = Starter.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 + c = Starter.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c.Close + ' Starter.skmt.ExecNonQuery2("INSERT INTO HIST_FOTO_CLIENTE(CODIGO, ALMACEN, RUTA) VALUES(?,?,?)", Array As Object(no_cliente, ALMACEN, no_ruta)) + ' Starter.skmt.ExecNonQuery2("INSERT INTO NOVENTA (NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_LAT,NV_LON,NV_NOMBRE,NV_DIRECCION) VALUES(?,?,?,?,?,?,?,?) ", Array As Object (no_cliente,sDate & sTime, usuario, "NUEVO CLIENTE", lat, lon, E_NOMBRE.Text,et_direccion.Text)) + + DateTime.DateFormat = "dd/MM/yyyy" + DateTime.Timeformat = "HH:mm:ss" + sDate2 = DateTime.Date(DateTime.Now) + sTime2 = DateTime.Time(DateTime.Now) + + Starter.skmt.ExecNonQuery2("INSERT INTO CLIENTES_NUEVOS(CN_ID, CN_FECHA, CN_USER, CN_LAT, CN_LON, CN_NOMBRE, CN_DIRECCION, CN_FOTO, CN_RUTA, CN_GIRO, CN_SOLICITA) VALUES (?,?,?,?,?,?,?,?,?,?,?)", Array As String(no_cliente, sDate2 &" "&sTime2, usuario, lat, lon, E_NOMBRE.Text, et_direccion.Text, ALMACEN, no_ruta, cb_giro.SelectedItem, ET_Atiende.Text)) + ' fototomada = "0" + B4XPages.ShowPage("Cliente") + CallSubDelayed(Tracker, "StartFLP") + Else + ' Mensaje de advertencia si ET_Atiende.Text está vacío + MsgboxAsync("Por favor, debe capturar al encargado que atiende el negocio.","Atención") + End If + Else + MsgboxAsync("Por favor captura el giro del cliente","Atención") + End If + Else + MsgboxAsync("Por favor revisa que tengas señal GPS","Atención") + End If + Else + MsgboxAsync("Por favor captura la dirección del cliente","Atención") + End If +End Sub + + + + +Private Sub p_nuevoCliente_Click + +End Sub + +'Private Sub b_foto_inci_Click +' camEx2.TakePicture +' p_camara.Visible = False +'' StopCamera2 +'End Sub +' +'Private Sub InitializeCamera2 +' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_CAMERA) +' Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) +' If Result Then +' camEx2.Initialize(p_cam, frontCamera, Me, "Camera1") +' frontCamera = camEx2.Front +' Log("inicializamos Camara") +' Else +' ToastMessageShow("Sin permisos de camara!!!", True) +' End If +' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_WRITE_EXTERNAL_STORAGE) +' Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) +' If Result Then +' Log("con permisos para escritura") +' Else +' ToastMessageShow("Sin permisos de escritura!!!", True) +' End If +' +' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_READ_EXTERNAL_STORAGE) +' Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) +' If Result Then +' Log("con permisos para escritura") +' Else +' ToastMessageShow("Sin permisos de lectura!!!", True) +' End If +'End Sub +' +'Sub Camera1_Ready (Success As Boolean) +' Log("Camara ready") +' If Success Then +' camEx2.SetJpegQuality(90) +' camEx2.SetContinuousAutoFocus +' camEx2.CommitParameters +' camEx2.StartPreview +' Log(camEx2.GetPreviewSize) +' Else +' ToastMessageShow("Cannot open camera.", True) +' Log("Cannot open camera") +' End If +'End Sub +' +'Sub Camera1_PictureTaken (Data()As Byte) +' Log("tome foto") +' Dim filename As String = fototomada +' Dim Dirp As String = File.DirInternal +' Dim Dir As String +' Dim Dir2 As String +' Try +' File.MakeDir(Dirp,"/promotoriakmts") +' Dir = "/promotoriakmts" +' Log("creado en promotoria " & Dirp & Dir) +' Catch +' Dir = "" +' Log("creado en raiz") +' End Try +' +' Try +' File.MakeDir(Dirp & Dir,"/reduccion") +' Dir2 = "/reduccion" +' Log("creado en promotoria " & Dirp & Dir & Dir2) +' Catch +' Dir = "" +' Log("creado en raiz") +' End Try +' +' camEx2.SavePictureToFile(Data, Dirp&Dir, filename) +' camEx2.StartPreview 'restart preview +' ToastMessageShow("Picture saved." & CRLF & "File size: " & File.Size(Dir, filename) & Dir &"," & filename, True) +' Log("Picture saved." & CRLF & "File size: " & File.Size(Dir, filename) & Dir &"," & filename) +' p_camara.Visible = False +' StopCamera2 +' +'End Sub +' +'Private Sub StopCamera2 +'' Capturing = False +' If camEx2.IsInitialized Then +' camEx2.Release +' End If +'End Sub +' +' +'Private Sub B_FOTO_Click +' DateTime.DateFormat="ddMMyyyyHHmmss" +' InitializeCamera2 +' Subs.panelVisible(p_camara, 0, 0) +' fototomada = DateTime.Now & "_cliente.jpg" +'End Sub + +Private Sub cb_giro_SelectedIndexChanged (Index As Int) + giros = cb_giro.SelectedItem +End Sub + diff --git a/B4A/C_Pedidos.bas b/B4A/C_Pedidos.bas new file mode 100644 index 0000000..2d6cfc3 --- /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..3df2fd5 --- /dev/null +++ b/B4A/C_Principal.bas @@ -0,0 +1,2785 @@ +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(), foto2() 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 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 + Private p_abordo As Panel + Private Panel11 As Panel + Private CLV_PICK_CIEGO As CustomListView + Private P_PICK_CIEGO As Panel + Dim ET_PICK_CIEGO As EditText + Private L_PICK_CIEGO As Label + Private P_CIEGO As Panel + Dim Panel4 As Panel + Dim q_buscar As String + Private et_buspc As EditText + Dim bitacora As C_BItacora +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 CAT_CL_RUTA from kmt_info") + f.Position=0 + Log("-- A") + 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 AND PC_CLIENTE <> 1") + 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")})"$) + bitacora.Initialize("bitacora", "bitacora", Root, Starter.skmt, reqManager) + p_mandaInfo.Top = 0 : p_mandaInfo.Left = 0 +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 WHERE PC_CLIENTE <> 0 AND PC_CLIENTE <> 1") + 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 OR CAT_CL_CODIGO <> 1 ") + e.Position = 0 + f=B4XPages.MainPage.skmt.ExecQuery("select count(*) as CAT_CL_RUTA from kmt_info WHERE CAT_CL_CODIGO <> 0 OR CAT_CL_CODIGO <> 1 ") + f.Position = 0 + l_ruta.Text = f.GetString("CAT_CL_RUTA") + Log("-- A:" & l_ruta.Text) + 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") + Log("-- A:" & l_ruta.Text) + 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 + s.Close + + s = B4XPages.MainPage.skmt.ExecQuery("select RUTAA FROM RUTAA") + s.Position = 0 + If s.RowCount = 0 Then + l_ruta.Text = 0 + Else If s.RowCount > 0 Then + l_ruta.Text = s.GetString("RUTAA") + Log("-- A:" & l_ruta.Text) + End If + + If l_ruta.Text = "0" Then + p_abordo.Visible = False + Else + p_abordo.Visible = False + End If + +' d = B4XPages.MainPage.skmt.ExecQuery("SELECT CAT_GP_ID, CAT_GP_NOMBRE FROM CAT_GUNAPROD2") +' CLV_PICK_CIEGO.Clear +' For i = 0 To d.RowCount - 1 +' d.Position = i +' CLV_PICK_CIEGO.Add(CreateListItem(d.GetString("CAT_GP_ID"), d.GetString("CAT_GP_NOMBRE")),i) +' Log(d.GetString("CAT_GP_ID")) +' Log(d.GetString("CAT_GP_NOMBRE")) +' Next +' d.Close + +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_ADM3_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_ADM3" +' 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_ADM3" +' 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 ) +' reqManager.ExecuteCommand(cmd , "ins_QR") +' Next +' End If +' c.Close + + 'Envio de Pagares + c=B4XPages.MainPage.skmt.ExecQuery("SELECT * FROM PAGARES") + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_pagares_ADM3" + cmd.Parameters = Array As Object(C.GetString("PA_ALMACEN"),Subs.traeRuta2(c.GetString("PA_CLIENTE")),C.GetString("PA_FECHA"),C.GetString("PA_CAPTURA"),C.GetString("PA_MONTO"),C.GetString("PA_USUARIO"),C.GetString("PA_CLIENTE") ) + reqManager.ExecuteCommand(cmd , "ins_pagares") + Next + End If + c.Close + + ' CLIENTES NUEVOS + Dim fotocn() As Byte + Dim Dirp As String = File.DirInternal + Dim Dir As String + Dim Dir2 As String + Dir = "/promotoriakmts" + + c=Starter.skmt.ExecQuery("SELECT CN_ID, CN_FECHA , CN_USER, CN_LAT, CN_LON, CN_NOMBRE, CN_DIRECCION, CN_FOTO, CN_ALMACEN, CN_RUTA, CN_GIRO, CN_SOLICITA FROM CLIENTES_NUEVOS") + If c.RowCount>0 Then + For i = 0 To c.RowCount - 1 + c.Position = i + Dim dia As Int = DateTime.GetDayOfWeek(DateTime.Now) + If dia = 2 Then + Dim dialetra As String = "LUNES" + Else If dia = 3 Then + Dim dialetra As String = "MARTES" + Else If dia = 4 Then + Dim dialetra As String = "MIERCOLES" + Else If dia = 5 Then + Dim dialetra As String = "JUEVES" + Else If dia = 6 Then + Dim dialetra As String = "VIERNES" + Else If dia = 7 Then + Dim dialetra As String = "SABADO" + End If + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_clientesnuevos_ADM3" + cmd.Parameters = Array As Object(c.GetString("CN_ID"), c.GetString("CN_FECHA"), c.GetString("CN_USER"), c.GetString("CN_LAT"), c.GetString("CN_LON"), c.GetString("CN_NOMBRE"), c.GetString("CN_DIRECCION"),ALMACEN, c.GetString("CN_RUTA"), "En espera",c.GetString("CN_GIRO"),dialetra, c.GetString("CN_SOLICITA")) + reqManager.ExecuteCommand(cmd , "inst_clientesn") + 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 WHERE PC_CLIENTE <> '1' ") + d = B4XPages.MainPage.skmt.ExecQuery("SELECT COUNT(*) as CUANTOS_PEDIDOSC FROM PEDIDO_CLIENTE WHERE PC_CLIENTE <> 1 ") + 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_ADM3" + 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, Subs.traeRuta2(c.GetString("PC_CLIENTE")), 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_TIPOPAGO, PE_COMENTARIO, 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, PE_CANTC, PE_BCAJAS FROM PEDIDO WHERE PE_FOLIO <> 'RECARGA'") + 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_ADM3" 'CON TOTALES INCLUIDOS + Log(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")&", "&Subs.traeRuta2(c.GetString("PE_CLIENTE"))&", "& c.GetString("PE_COSTO_SIN")&", "&c.GetString("PE_DESC")&", "&c.GetString("PE_FOLIO")&", "& ALMACEN) + cmd.Parameters = Array As Object(c.GetString("PE_CEDIS"),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"),Subs.traeRuta2(c.GetString("PE_CLIENTE")), c.GetString("PE_COSTO_SIN"),c.GetString("PE_DESC"),c.GetString("PE_FOLIO"),c.GetString("PE_CANTC"),c.GetString("PE_BCAJAS"),c.GetString("PE_TIPOPAGO"),c.GetString("PE_COMENTARIO")) + 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_ADM3" + 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, Subs.traeRuta2(c.GetString("NV_CLIENTE"))) + reqManager.ExecuteCommand(cmd , "inst_noventa") + Next + End If + c.Close + d.Position=0 + cuantos_noventa = D.GetString("CUANTOS_NOVENTA") + d.Close + + ' NOVENTA + c=B4XPages.MainPage.skmt.ExecQuery("SELECT * FROM FOTOINICIAL") + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Dim cmd As DBCommand + foto1 = c.GetBlob("FOTO") + foto2 = c.GetBlob("FOTO2") + cmd.Initialize + cmd.Name = "insert_foto_ADM3" + cmd.Parameters = Array As Object(C.GetString("RUTAA"),C.GetString("USUARIO"),C.GetString("LONGITUD"),C.GetString("ALMACEN"),C.GetString("FECHAHORA"),C.GetString("LATITUD"),foto1,foto2) + reqManager.ExecuteCommand(cmd , "inst_FOTO") + Next + End If + c.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_ADM3" + 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_ADM3" + 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_ADM3" + 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 WHERE PC_CLIENTE <> 01") + 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_ADM3" + 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 RUTA_SUPLENCIA") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM RUTAA") + 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") + Starter.skmt.ExecNonQuery("delete from CAT_GIRO") + 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") + +' If E_RUTA2.Visible = True Then +' Log("-- A") +' bitacora.mandaBitacora(Subs.fechanormal(DateTime.Now),usuario,Subs.traeAlmacen, Subs.traeRuta,"Carga día suplencia", "",Subs.fechanormal(DateTime.Now),Subs.fechanormal(DateTime.Now),B4XPages.MainPage.lat_gps,B4XPages.MainPage.lon_gps,"2","","", "") +' Else +' Log("-- B") +' bitacora.mandaBitacora(Subs.fechanormal(DateTime.Now),usuario,Subs.traeAlmacen, Subs.traeRuta,"Carga día", "",Subs.fechanormal(DateTime.Now),Subs.fechanormal(DateTime.Now),B4XPages.MainPage.lat_gps,B4XPages.MainPage.lon_gps,"2","","", "") +' End If + + If E_RUTA2.Text <> "" Then + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO RUTA_SUPLENCIA(RS_RUTA) VALUES(?)",Array As String(E_RUTA2.Text)) + E_RUTA2.Text = "" + End If + + 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_ADM3" + 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_ADM3" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "gunaprod") + +' cmd.Initialize +' cmd.Name = "select_cat_gunaprod2_ADM3" +' cmd.Parameters = Array As Object(ALMACEN,e_ruta.Text) +' reqManager.ExecuteQuery(cmd , 0, "gunaprod2") + + cmd.Initialize + cmd.Name = "select_cat_GIRO_ADM3" + reqManager.ExecuteQuery(cmd , 0, "giro") + +' 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_ADM3" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "gunaprodp") +' Log("ALMACEN = " & ALMACEN) + + cmd.Initialize + cmd.Name = "select_cat_paquetess_ADM3" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "gunaprodp") + + cmd.Initialize + cmd.Name = "select_cat_detallepa_ADM3" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "detallepaq") + + cmd.Initialize + cmd.Name = "select_cat_clientes_ADM3" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "kmt_datos") + + cmd.Initialize + cmd.Name = "select_cat_clientes_todos_ADM3" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "kmt_datos_todos") + + cmd.Initialize + cmd.Name = "select_hist_datos_ADM3" + 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_ADM3" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "hist_promos") + +' cmd.Initialize +' cmd.Name = "select_clientes_cuestionario_ADM3" +' cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) +' reqManager.ExecuteQuery(cmd , 0, "clientes_cuestionario") + + cmd.Initialize + cmd.Name = "select_hist_cliente_promos_ADM3" + 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 + Log("-- XX") +' B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO RUTA_SUPLENCIA(RS_RUTA) VALUES(?)",Array As String(E_RUTA2.Text)) + +' E_RUTA2.Visible = False +' Panel11.Visible = False + + cmd.Initialize + cmd.Name = "select_cat_clientes_ADM3" + cmd.Parameters = Array As Object(E_RUTA2.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "kmt_datos") + + cmd.Initialize + cmd.Name = "select_cat_clientes_todos_ADM3" + cmd.Parameters = Array As Object(E_RUTA2.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "kmt_datos_todos") + + cmd.Initialize + cmd.Name = "select_hist_datos_ADM3" + cmd.Parameters = Array As Object(E_RUTA2.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "hist_datos") + + cmd.Initialize + cmd.Name = "select_hist_promos_ADM3" + cmd.Parameters = Array As Object(E_RUTA2.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "hist_promos") + + cmd.Initialize + cmd.Name = "select_hist_cliente_promos_ADM3" + 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_ADM3" + 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_ADM3" + cmd.Parameters = Array As Object(ALMACEN, e_ruta.text) + reqManager.ExecuteQuery(cmd , 0, "folio") + + cmd.Initialize + cmd.Name = "select_abonosp_ADM3" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "select_abonosp") + + cmd.Initialize + cmd.Name = "select_marcas_rutas_ADM3" + 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_ADM3" +' cmd.Parameters = Array As Object( ALMACEN, e_ruta.text ) +' reqManager.ExecuteQuery(cmd , 0, "COMISIONES") + +' cmd.Initialize +' cmd.Name = "select_hist_avance_ADM3" '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: " & Job.tag & " : " & Job.ErrorMessage, Colors.red) +' 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 + End If + + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "giro" Then 'query tag + For Each records() As Object In RESULT.Rows + Dim giro As String = records(RESULT.Columns.Get("CAT_GR_DESC")) + + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GIRO(GIRO) VALUES (?)", Array As Object (giro)) + 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 = "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")) + Dim CAT_CL_BCREDITO As String = records(RESULT.Columns.Get("CAT_CL_BCREDITO")) + Dim CAT_CL_LIMITECREDITO As String = records(RESULT.Columns.Get("CAT_CL_LIMITECREDITO")) + 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, CAT_CL_BCREDITO, CAT_CL_LIMITECREDITO, 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, CAT_CL_BCREDITO, CAT_CL_LIMITECREDITO)) + 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")) + 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 ("1",e_ruta.TEXT, "VENTA RECARGA","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 = ? AND PC_CLIENTE <> 1", 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_ADM3" + 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_BCREDITO As String = records(RESULT.Columns.Get("CAT_CL_BCREDITO")) + Dim CAT_CL_LIMITECREDITO As String = records(RESULT.Columns.Get("CAT_CL_LIMITECREDITO")) + Dim CAT_CL_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, CAT_CL_BCREDITO, CAT_CL_LIMITECREDITO) 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, CAT_CL_BCREDITO, CAT_CL_LIMITECREDITO)) + 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")) + Dim CAT_DP_PRECIO4 As Int = records(RESULT.Columns.Get("CAT_DP_PRECIO4")) + Dim CAT_DP_CONVERSION1 As Int = records(RESULT.Columns.Get("CAT_DP_CONVERSION1")) +' 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,CAT_DP_PRECIO4,CAT_DP_CONVERSION1) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object (CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG, CAT_GP_ALMACEN,CAT_GP_TIPOPROD, CAT_GP_INICIATIVA,CAT_DP_PRECIO4,CAT_DP_CONVERSION1)) + 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_GP_ID")) + Dim CAT_GP_NOMBRE As String = records(RESULT.Columns.Get("CAT_GP_NOMBRE")) + Dim CAT_GP_IMP1 As String = records(RESULT.Columns.Get("CAT_GP_IMP1")) + Dim CAT_GP_IMP2 As String = records(RESULT.Columns.Get("CAT_GP_IMP2")) + Dim CAT_GP_PRECIO As String = records(RESULT.Columns.Get("CAT_GP_PRECIO")) + Dim CAT_GP_CLASIF As String = records(RESULT.Columns.Get("CAT_GP_CLASIF")) + Dim CAT_GP_STS As String = records(RESULT.Columns.Get("CAT_GP_STS")) + Dim CAT_GP_TIPO As String = records(RESULT.Columns.Get("CAT_GP_TIPO")) + Dim CAT_GP_SUBTIPO As String = records(RESULT.Columns.Get("CAT_GP_SUBTIPO")) + Dim CAT_GP_IMG() As Byte = records(RESULT.Columns.Get("CAT_GP_IMG")) + Dim CAT_GP_ALMACEN As Int = records(RESULT.Columns.Get("CAT_GP_ALMACEN")) + ' Dim CAT_GP_DEV As String = records(RESULT.Columns.Get("CAT_GP_DEV")) + Dim CAT_GP_TIPOPROD As Int = records(RESULT.Columns.Get("CAT_GP_TIPOPROD")) + Dim CAT_GP_INICIATIVA As Int = records(RESULT.Columns.Get("CAT_GP_INICIATIVA")) + Dim CAT_DP_PRECIO4 As Int = records(RESULT.Columns.Get("CAT_DP_PRECIO4")) + Dim CAT_DP_CONVERSION1 As Int = records(RESULT.Columns.Get("CAT_DP_CONVERSION1")) + +' 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,CAT_DP_PRECIO4,CAT_DP_CONVERSION1) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object (CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG, CAT_GP_ALMACEN,CAT_GP_TIPOPROD, CAT_GP_INICIATIVA,CAT_DP_PRECIO4,CAT_DP_CONVERSION1)) + 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 + + If Listo1 = 1 And Listo2 = 1 And Listo3 = 1 And Listo4 = 1 Then + 'Para suplencia + If Panel11.Visible = True And E_RUTA2.Visible = True Then + Log("-- AA") + bitacora.mandaBitacora(Subs.fechanormal(DateTime.Now),usuario,Subs.traeAlmacen, Subs.traeRuta,"Carga día suplencia","",Subs.fechanormal(DateTime.Now),Subs.fechanormal(DateTime.Now),B4XPages.MainPage.lat_gps,B4XPages.MainPage.lon_gps,"2","","", "") + Else if e_ruta.Text <> "" Then + Log("-- BB") + bitacora.mandaBitacora(Subs.fechanormal(DateTime.Now),usuario,Subs.traeAlmacen, Subs.traeRuta,"Carga día", "",Subs.fechanormal(DateTime.Now),Subs.fechanormal(DateTime.Now),B4XPages.MainPage.lat_gps,B4XPages.MainPage.lon_gps,"2","","", "") + End If + Panel11.Visible = False +' E_RUTA2.Text = "" + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO RUTAA(RUTAA) VALUES(?)",Array As String(e_ruta.Text)) + e_ruta.Text = "" + 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 + If IsNumber(e_ruta.Text) Then + Dim cmd As DBCommand + cmd.Initialize + + cmd.Name = "select_ruta_ADM6" + cmd.Parameters = Array As Object(ALMACEN, e_ruta.text, Application.VersionName) +' 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) + End If + +' 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 + bitacora.mandaBitacora(Subs.fechanormal(DateTime.Now), usuario, Subs.traeAlmacen, Subs.traeRuta, "Fin Día", "", Subs.fechanormal(DateTime.Now), Subs.fechanormal(DateTime.Now), B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps, "2", "", "", "") + e_ruta.Text = "" + Starter.skmt.ExecNonQuery("delete from CAT_GIRO") + B4XPages.MainPage.skmt.ExecNonQuery("delete from CLIENTE_NUEVO") + B4XPages.MainPage.skmt.ExecNonQuery("delete from FOTOINICIAL") + B4XPages.MainPage.skmt.ExecNonQuery("delete from PICKCIEGO_HECHO") + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente") + B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido") + B4XPages.MainPage.skmt.ExecNonQuery("delete from PAGARES") + 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 PICK_CIEGO") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM RUTA_SUPLENCIA") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM RUTAA") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM CLIENTES_NUEVOS") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM ENV_MONTO_LIQ") + B4XPages.MainPage.skmt.ExecNonQuery("DELETE FROM HIST_UBICACIONES") + 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 + Panel11.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_ADM3" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "gunaprod") + cmd.Initialize + cmd.Name = "select_cat_paquetes_ADM3" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "gunaprodp") + + cmd.Initialize + cmd.Name = "select_cat_detallepa_ADM3" + 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_ADM3" + cmd.Parameters = Array As Object(ALMACEN,l_ruta.text) + reqManager.ExecuteQuery(cmd , 0, "valida_pedido") + + cmd.Initialize + cmd.Name = "select_cuantos_noventa_ADM3" + cmd.Parameters = Array As Object(ALMACEN,l_ruta.text) + reqManager.ExecuteQuery(cmd , 0, "valida_noventa") + + cmd.Initialize + cmd.Name = "select_cuantos_pedidoc_ADM3" + 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) + + If E_RUTA2.Text <> "" Then + B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO RUTA_SUPLENCIA(RS_RUTA) VALUES(?)",Array As String(E_RUTA2.Text)) + E_RUTA2.Text = "" + End If +' B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO RUTAA(RUTAA) VALUES(?)",Array As String(e_ruta.Text)) + checaPedido + B4XPage_Appear + 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 iv_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 + +Sub checaPedido + Private c As Cursor = Starter.skmt.ExecQuery("SELECT PC_CLIENTE FROM PEDIDO_CLIENTE") + If c.RowCount > 0 Then + Starter.skmt.ExecNonQuery("Update kmt_info set gestion = 2 WHERE CAT_CL_CODIGO IN (SELECT PC_CLIENTE FROM PEDIDO_CLIENTE)") + End If + Private c As Cursor = Starter.skmt.ExecQuery("SELECT NV_CLIENTE FROM NOVENTA") + If c.RowCount > 0 Then + Starter.skmt.ExecNonQuery("Update kmt_info set gestion = 3 WHERE CAT_CL_CODIGO IN (SELECT NV_CLIENTE FROM NOVENTA)") + End If +End Sub + +Private Sub img2_Click + img2.Visible = False +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..aba4e85 --- /dev/null +++ b/B4A/C_Productos.bas @@ -0,0 +1,1640 @@ +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 + Private et_pCantc As EditText + Private b_prodMenosc As Button + Private b_prodMasc As Button + Dim totalcajasmaspiezas As Int + Dim cajas As Int + Dim piezas As Int + + Private p_botMasMenc 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 +' 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" Or B4XPages.MainPage.tipo_venta = "RECARGA" 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" And c.GetString("CUENTA") <> "1" 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) + Try + clv_prods_ll.JumpToItem(0) 'Vamos al primer artículo de la lista. + Catch + ToastMessageShow("No hay productos", False) + Log(LastException) + End Try + 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 + totalcajasmaspiezas = 0 + 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 laCant2 As B4XView = pnl.GetView(3).GetView(2) + Dim panelbotonesc As B4XView = pnl.GetView(3) + Dim lProdX As B4XView = pnl.GetView(1) + Dim panelcajas As B4XView = pnl.GetView(3) + Dim panelpiezas As B4XView = pnl.GetView(2) +' 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 tmpMap1 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) + LogColor(tmpMap1,Colors.Magenta) +' prodsMap.Put(id, tmpMap) + If laCant.Text = 0 Then prodsMap.Remove(id) + + If laCant.Text = 0 Then + panelcajas.Visible = True + Else If laCant.Text > 0 Then + panelcajas.Visible = False + End If +' If laCant2.IsInitialized Then +' totalcajasmaspiezas = laCant.Text + laCant2.Text +' Else +' totalcajasmaspiezas = laCant.Text +' End If + 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,0,0) + 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 clv_prods_ll.GetValue(index).As(Map).Get("precio_caja").As(Float) = 0 Or clv_prods_ll.GetValue(index).As(Map).Get("conversion").As(Int) = 1 Then + Private maxcajas As Int = 0 + Log("cajas a 0") + Else + Private maxcajas As Int = invActualizado/clv_prods_ll.GetValue(index).As(Map).Get("conversion") + Log("cajas no a 0") + End If +' Private maxcajas As Int = invActualizado/clv_prods_ll.GetValue(index).As(Map).Get("conversion") + 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)}${CRLF}Max. Cajas: ${maxcajas}"$).Popall +' Log(lProdX.Text) + End If + If Subs.totalPedido < 1 Then laCant.Text = "0" + invTotal = totalcajasmaspiezas + Subs.traeinventario(id) + 'aqui si lo comentamos aparece la parte de cajas + If tmpMap1.Get("conversion") = "1" Or tmpMap1.Get("precio_caja") = "0" Then + Log("invisible") + panelbotonesc.Visible = False + End If + + If clv_prods_ll.GetValue(index).As(Map).Get("almacen") < clv_prods_ll.GetValue(index).As(Map).Get("conversion") Then + Log(clv_prods_ll.GetValue(index).As(Map).Get("cant")) + If clv_prods_ll.GetValue(index).As(Map).Get("cant").As(Int) = 0 Then + Log("Aqui debemos ponerlo invisible") + panelcajas.Visible = False + Else + + End If +' p_botMasMenc.Visible = False + End If + 'fin aparecer parte de cajas +' LogColor("InvTotal PRODMAS: " & invTotal, Colors.Red) +End Sub + +Sub b_prodMas_Click + totalcajasmaspiezas = 0 + 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 panelcajas As B4XView = pnl.GetView(3) + Dim panelpiezas As B4XView = pnl.GetView(2) + Dim laCant2 As B4XView = pnl.GetView(3).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) + LogColor(laCant.Text,Colors.Red) + + 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) + + If laCant.Text > 0 Then + panelcajas.Visible = False + Else If laCant.Text = 0 Then + panelcajas.Visible = True + End If + + LogColor(laCant.Text,Colors.Red) +' If laCant2.IsInitialized Then +' totalcajasmaspiezas = laCant.Text + laCant2.Text +' Else +' totalcajasmaspiezas = laCant.Text +' End If + Subs.actualizaProducto(Subs.traeAlmacen, precio, laCant.Text, Subs.traeProdNombre(id), id, clienteId, Subs.traeFecha, Subs.traeUsuarioDeBD, rutaUsuario, 0, B4XPages.MainPage.tipo_venta,0,0) + 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 clv_prods_ll.GetValue(index).As(Map).Get("precio_caja").As(Float) = 0 Or clv_prods_ll.GetValue(index).As(Map).Get("conversion").As(Int) = 1 Then + Private maxcajas As Int = 0 + Log("cajas a 0") + Else + Private maxcajas As Int = invActualizado/clv_prods_ll.GetValue(index).As(Map).Get("conversion") + Log("cajas no a 0") + 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)}${CRLF}Max. Cajas: ${maxcajas}"$).Popall +' Log(lProdX.Text) + End If + invTotal = totalcajasmaspiezas + 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) + Dim laCant2 As B4XView = pnl.GetView(3).GetView(2) + Private id As String=clv_prods_ll.GetValue(index).As(Map).Get("id") + If laCant.Text = "" Then laCant.Text = "0" + etCantHasFocus = HasFocus + LogColor(laCant.Text,Colors.Red) + If laCant2.IsInitialized Then + totalcajasmaspiezas = laCant.Text + laCant2.Text + Else + totalcajasmaspiezas = laCant.Text + End If + invTotal = totalcajasmaspiezas + 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 laCant2 As B4XView = pnl.GetView(3).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) + Dim panelcajas As B4XView = pnl.GetView(3) + Dim panelpiezas As B4XView = pnl.GetView(2) + + + 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 + LogColor(laCant.Text,Colors.Red) + + If New > 0 Then + panelcajas.Visible = False + Else If New = 0 Then + panelcajas.Visible = True + End If + +' If laCant2.IsInitialized Then +' totalcajasmaspiezas = laCant.Text + laCant2.Text +' Else +' totalcajasmaspiezas = laCant.Text +' End If + 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,0,0) + 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 + If clv_prods_ll.GetValue(index).As(Map).Get("precio_caja").As(Float) = 0 Or clv_prods_ll.GetValue(index).As(Map).Get("conversion").As(Int) = 1 Then + Private maxcajas As Int = 0 + Log("cajas a 0") + Else + Private maxcajas As Int = invActualizado/clv_prods_ll.GetValue(index).As(Map).Get("conversion") + Log("cajas no a 0") + End If + 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)}${CRLF}Max. Cajas: ${maxcajas}"$).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" Or c_prods.GetString("PE_FOLIO") = "RECARGA" 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") +' Pnl.Color = Colors.Cyan + p_prods.Width = Root.Width * 0.92 + p_botMasMen.Left = p_prods.Width - (p_botMasMen.Width + 5) + p_botMasMenc.Left = p_prods.Width - (p_botMasMen.Width + 5) + p_prods.Height = 134dip +' b_prodMenos.Height = 50dip +' b_prodMas.Height = 50dip +' et_pCant.Height = 51dip +' l_pCant.Height = 44dip +' l_pCant.Top = l_pCant.Top + 8 +' Pnl.Height = p_prods.Height +' Pnl.Height = 300dip + Pnl.SetLayoutAnimated(0,0,0,Pnl.Width,145dip) + 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 + et_pCantc.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) +' Log(clv_prods_ll.GetValue(i).As(Map)) + + c = Starter.skmt.ExecQuery2("SELECT PE_BCAJAS FROM PEDIDO WHERE PE_PROID = ? AND PE_CLIENTE IN (SELECT CUENTA FROM CUENTAA)",Array As String(clv_prods_ll.GetValue(i).As(Map).Get("id"))) +' Log(clv_prods_ll.GetValue(i).As(Map).Get("id")) + If c.RowCount = 0 Then + p_botMasMen.Visible = True + p_botMasMenc.Visible = True + Else If c.RowCount > 0 Then + c.Position = 0 + If c.GetString("PE_BCAJAS") = "0" Then + If clv_prods_ll.GetValue(i).As(Map).Get("cant") <> Null Then et_pCant.Text = clv_prods_ll.GetValue(i).As(Map).Get("cant") + p_botMasMen.Visible = True + p_botMasMenc.Visible = False + Else If c.GetString("PE_BCAJAS") = "1" Then + If clv_prods_ll.GetValue(i).As(Map).Get("cant") <> Null Then et_pCantc.Text = clv_prods_ll.GetValue(i).As(Map).Get("cant") + p_botMasMen.Visible = False + p_botMasMenc.Visible = True + End If + End If + +' If clv_prods_ll.GetValue(i).As(Map).Get("b_caja").As(String) = "0" Then +' If clv_prods_ll.GetValue(i).As(Map).Get("cant") <> Null Then et_pCant.Text = clv_prods_ll.GetValue(i).As(Map).Get("cant") +' p_botMasMen.Visible = True +' p_botMasMenc.Visible = False +' Else If clv_prods_ll.GetValue(i).As(Map).Get("b_caja").As(String) = "1" Then +' If clv_prods_ll.GetValue(i).As(Map).Get("cant") <> Null Then et_pCantc.Text = clv_prods_ll.GetValue(i).As(Map).Get("cant") +' p_botMasMen.Visible = False +' p_botMasMenc.Visible = True +' Log("visible verdadero") +' Else IF clv_prods_ll.GetValue(i).As(Map).Get("b_caja").As(String) = "null" Then +' p_botMasMen.Visible = True +' p_botMasMenc.Visible = True +' Log("visible verdadero") +' End If + If clv_prods_ll.GetValue(i).As(Map).Get("precio_caja").As(Float) = 0 Or clv_prods_ll.GetValue(i).As(Map).Get("conversion").As(Int) = 1 Then + Private maxcajas As Int = 0 +' Log("cajas a 0") + Else + Private maxcajas As Int = clv_prods_ll.GetValue(i).As(Map).Get("almacen")/clv_prods_ll.GetValue(i).As(Map).Get("conversion") +' Log("cajas no a 0") + End If +' Private maxcajas As Int = clv_prods_ll.GetValue(i).As(Map).Get("almacen")/clv_prods_ll.GetValue(i).As(Map).Get("conversion") + 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}${CRLF}Max. Cajas: ${maxcajas}"$).Popall + 'aqui si lo comentamos aparece la parte de cajas + '' por aqui vamos a corregir + ''Or clv_prods_ll.GetValue(i).As(Map).Get("almacen") < clv_prods_ll.GetValue(i).As(Map).Get("conversion") + If clv_prods_ll.GetValue(i).As(Map).Get("conversion") = "1" Or clv_prods_ll.GetValue(i).As(Map).Get("precio_caja") = "0" Then + p_botMasMenc.Visible = False + End If + If clv_prods_ll.GetValue(i).As(Map).Get("almacen") < clv_prods_ll.GetValue(i).As(Map).Get("conversion") Then + Log(clv_prods_ll.GetValue(i).As(Map).Get("cant")) + If clv_prods_ll.GetValue(i).As(Map).Get("cant").As(Int) = 0 Then + Log("Aqui debemos ponerlo invisible") + p_botMasMenc.Visible = False + Else + + End If +' p_botMasMenc.Visible = False + End If + 'fin aparecer parte de cajas + 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"$) + Dim p As ResultSet = B4XPages.MainPage.skmt.ExecQuery($"select CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_ALMACEN, CAT_GP_PRECIO, CAT_GP_TIPOPROD, CAT_DP_CONVERSION1, CAT_DP_PRECIO4, PE_BCAJAS from ${Starter.tabla} LEFT JOIN PEDIDO ON CAT_GP_ID = PE_PROID where CAT_GP_NOMBRE like '%${New}%' AND 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, CAT_DP_CONVERSION1, CAT_DP_PRECIO4 , PE_BCAJAS from ${Starter.tabla} LEFT JOIN PEDIDO ON CAT_GP_ID = PE_PROID 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"$) + 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, PE_CANTC, PE_BCAJAS 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 + If pe.GetString("PE_BCAJAS") = 0 Then + cantsMap.put(pe.GetString("PE_PROID"), pe.GetString("PE_CANT")) + Else If pe.GetString("PE_BCAJAS") = 1 Then + cantsMap.put(pe.GetString("PE_PROID"), pe.GetString("PE_CANTC")) + End If + Log(clienteId &"|||||"&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 distinct CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_ALMACEN, CAT_GP_PRECIO, CAT_GP_TIPOPROD, CAT_DP_CONVERSION1, CAT_DP_PRECIO4, PE_BCAJAS from ${Starter.tabla} LEFT JOIN PEDIDO ON CAT_GP_ID = PE_PROID 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, CAT_DP_CONVERSION1, CAT_DP_PRECIO4 , PE_BCAJAS from ${Starter.tabla} LEFT JOIN PEDIDO ON CAT_GP_ID = PE_PROID 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 + Log(p.GetString("CAT_GP_ID")) + cant = cantsMap.Get(p.GetString("CAT_GP_ID")) + End If + 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, "conversion":p.GetString("CAT_DP_CONVERSION1"), "precio_caja":p.GetString("CAT_DP_PRECIO4"), "b_caja":p.GetString("PE_BCAJAS")) +' Log(tempMap) + 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, 300dip) + Pnl.SetLayoutAnimated(0, 0, 0, clv_prods_ll.AsView.Width, 135dip) + 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, 135dip) + 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 + + + + +Sub b_prodMenosc_Click + totalcajasmaspiezas = 0 + 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 laCant2 As B4XView = pnl.GetView(3).GetView(2) + Dim lProdX As B4XView = pnl.GetView(1) + Dim panelcajas As B4XView = pnl.GetView(3) + Dim panelpiezas As B4XView = pnl.GetView(2) +' Log($"precio|stock:${laCant.tag}"$) + If laCant2.Text = "" Then laCant2.Text = 0 +' Log("lacant.text="&laCant.text) + laCant2.Text = $"${NumberFormat2(laCant2.Text-1,0,0,0,False)}"$ + If laCant2.Text < 0 Then laCant2.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":laCant2.Text, "almacen":Subs.traeAlmacen) + Private nombreX As String = Subs.traeProdNombre(id) + Private conversion As String = clv_prods_ll.GetValue(index).As(Map).Get("conversion") + Private preciocaja As String = clv_prods_ll.GetValue(index).As(Map).Get("precio_caja") + + Log(tmpMap) +' prodsMap.Put(id, tmpMap) + If laCant2.Text = 0 Then prodsMap.Remove(id) + If laCant2.Text = 0 Then + panelpiezas.Visible = True + Else If laCant2.Text > 0 Or clv_prods_ll.GetValue(index).As(Map).Get("conversion") < clv_prods_ll.GetValue(index).As(Map).Get("almacen") Then + panelpiezas.Visible = False + End If +' If laCant.IsInitialized Then +' totalcajasmaspiezas = laCant.Text + laCant2.Text +' Else +' totalcajasmaspiezas = laCant2.Text +' End If + 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}, ${laCant2.text}, ${Subs.traeProdNombre(id)}, ${id}, ${clienteId}"$) +' Subs.actualizaProducto(Subs.traeAlmacen, preciocaja,(laCant2.Text * conversion), Subs.traeProdNombre(id), id, clienteId, Subs.traeFecha, Subs.traeUsuarioDeBD, rutaUsuario, 0, B4XPages.MainPage.tipo_venta,laCant2.Text,1) + Subs.actualizaProducto2(Subs.traeAlmacen, preciocaja,(laCant2.Text * conversion), Subs.traeProdNombre(id), id, clienteId, Subs.traeFecha, Subs.traeUsuarioDeBD, rutaUsuario, 0, B4XPages.MainPage.tipo_venta,laCant2.Text,1) + 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 clv_prods_ll.GetValue(index).As(Map).Get("precio_caja").As(Float) = 0 Or clv_prods_ll.GetValue(index).As(Map).Get("conversion").As(Int) = 1 Then + Private maxcajas2 As Int = 0 + Log("cajas a 0") + Else + Private maxcajas2 As Int = invActualizado/clv_prods_ll.GetValue(index).As(Map).Get("conversion") + Log("cajas no a 0") + 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)}${CRLF}Max. Cajas: ${maxcajas2}"$).Popall +' Log(lProdX.Text) + End If + If Subs.totalPedido < 1 Then laCant2.Text = "0" + invTotal = totalcajasmaspiezas + Subs.traeinventario(id) +' LogColor("InvTotal PRODMAS: " & invTotal, Colors.Red) + +End Sub + +Sub b_prodMasc_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 laCant2 As B4XView = pnl.GetView(3).GetView(2) + Dim lProdX As B4XView = pnl.GetView(1) + Dim panelcajas As B4XView = pnl.GetView(3) + Dim panelpiezas As B4XView = pnl.GetView(2) +' 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") + Private conversion As String = clv_prods_ll.GetValue(index).As(Map).Get("conversion") + Private preciocaja As String = clv_prods_ll.GetValue(index).As(Map).Get("precio_caja") + Log(conversion) + Log($"Existencias: ${existencias}"$) + If laCant2.Text = "" Then laCant2.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) + Log(Subs.traeinventario(id)) + Log((laCant2.Text * conversion) + conversion) + Log((laCant2.Text *conversion)+ Subs.traeinventario(id)) + If Subs.traeinventario(id) > 0 And ((laCant2.Text * conversion) + conversion <= ((laCant2.Text *conversion)+ 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 - conversion)) + inv = inv - conversion +' laCant.Text = $"$1.0{laCant.Text+1}"$ + laCant2.Text = NumberFormat2((laCant2.Text + 1), 1, 0, 0, False) +' Log(clv_prods_ll.GetValue(index).As(Map)) + Log("cuando entro aqui?") + End If + Private nombreX As String = Subs.traeProdNombre(id) +' Subs.actualizaProducto(Subs.traeAlmacen, laCant.text, id, clienteId) + Log((laCant2.Text * conversion)) + If laCant2.Text > 0 Then + panelpiezas.Visible = False + Else If laCant2.Text = 0 Then + panelpiezas.Visible = True + End If + +' LogColor(laCant.Text,Colors.Red) +' If laCant.IsInitialized Then +' totalcajasmaspiezas = laCant.Text + laCant2.Text +' Else +' totalcajasmaspiezas = laCant2.Text +' End If + +' Subs.actualizaProducto(Subs.traeAlmacen,preciocaja,(laCant2.Text * conversion), Subs.traeProdNombre(id), id, clienteId, Subs.traeFecha, Subs.traeUsuarioDeBD, rutaUsuario, 0, B4XPages.MainPage.tipo_venta,laCant2.Text,1) + Subs.actualizaProducto2(Subs.traeAlmacen,preciocaja,(laCant2.Text * conversion), Subs.traeProdNombre(id), id, clienteId, Subs.traeFecha, Subs.traeUsuarioDeBD, rutaUsuario, 0, B4XPages.MainPage.tipo_venta,laCant2.Text,1) + 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 clv_prods_ll.GetValue(index).As(Map).Get("precio_caja").As(Float) = 0 Or clv_prods_ll.GetValue(index).As(Map).Get("conversion").As(Int) = 1 Then + Private maxcajas2 As Int = 0 + Log("cajas a 0") + Else + Private maxcajas2 As Int = invActualizado/clv_prods_ll.GetValue(index).As(Map).Get("conversion") + Log("cajas no a 0") + 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)}${CRLF}Max. Cajas: ${maxcajas2}"$).Popall +' Log(lProdX.Text) + End If + invTotal = totalcajasmaspiezas + Subs.traeinventario(id) +' LogColor("InvTotal PRODMAS: " & invTotal, Colors.Red) + +End Sub + +Private Sub et_pCantc_FocusChanged (HasFocus As Boolean) + LogColor($"focus changed=${HasFocus}"$, Colors.Magenta) + If et_pCantc.Text = "" Then et_pCantc.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) + Dim laCant2 As B4XView = pnl.GetView(3).GetView(2) + Private id As String=clv_prods_ll.GetValue(index).As(Map).Get("id") + If laCant2.Text = "" Then laCant2.Text = "0" + etCantHasFocus = HasFocus +' LogColor(laCant.Text,Colors.Red) +' If laCant.IsInitialized Then +' totalcajasmaspiezas = laCant.Text + laCant2.Text +' Else +' totalcajasmaspiezas = laCant2.Text +' End If + invTotal = totalcajasmaspiezas + Subs.traeinventario(id) +' LogColor("InvTotal PRODMAS: " & invTotal, Colors.Red) + + cuentaProds +End Sub + +Private Sub et_pCantc_TextChanged (Old As String, New As String) +' Log(etCantHasFocus) +' Log("InvTotal: " & invTotal) + If etCantHasFocus = True Then +' Sleep(500) +' 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 laCant2 As B4XView = pnl.GetView(3).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) + Dim panelcajas As B4XView = pnl.GetView(3) + Dim panelpiezas As B4XView = pnl.GetView(2) + Private conversion As String = clv_prods_ll.GetValue(index).As(Map).Get("conversion") + Private preciocaja As String = clv_prods_ll.GetValue(index).As(Map).Get("precio_caja") + + invTotal = Subs.traeinventario(id) + Log("inventario total "& invTotal) + If(New = "" Or New = Null Or New = "-") Then New = 0 +' If New < 0 Then New = 0 + Log(($"new*conversion ${New * conversion} > ${invTotal} = ${((New * conversion) > invTotal)}"$)) + If((New * conversion) > invTotal) Then +' Dim maximocajas As Int = invTotal / conversion + Sender.As(EditText).text = 0 + New = 0 +' LogColor("cajas maximas "& maximocajas, Colors.Red) + pnl.GetView(2).Visible = True + Log("ponemos en 0") + End If + + ' Log($"inventario=${inv}"$) + Log("inventario total despues de max "& invTotal) + + If New = "" Then New = 0 + If laCant2.Text = "" Then laCant2.Text = 0 +' LogColor("la cant2 " &laCant2.Text,Colors.Red) + + If New > 0 Then + Log("lo ocultamos") + panelpiezas.Visible = False + Else If New = 0 Then + panelpiezas.Visible = True + End If + +' If laCant.IsInitialized Then +' totalcajasmaspiezas = laCant.Text + laCant2.Text +' Else +' totalcajasmaspiezas = laCant2.Text +' End If + Log("InvTotal: " & invTotal) + + If Not(Old = "0" And New = "") And laCant2.Text <> Null And laCant2.Text <> "" And etCantHasFocus Then + If invTotal - (laCant2.Text * conversion) >= 0 Then + LogColor("validacion inventariio " & (invTotal - (laCant2.Text * conversion)), Colors.Blue) + Log("actualizamos producto") + Subs.actualizaProducto2(Subs.traeAlmacen, preciocaja,(laCant2.Text * conversion), Subs.traeProdNombre(id), id, clienteId, Subs.traeFecha, Subs.traeUsuarioDeBD, rutaUsuario, 0, B4XPages.MainPage.tipo_venta,laCant2.Text,1) + cuentaProds + Else + Private totalcajaspermi As Int = invTotal / conversion + laCant2.Text = totalcajaspermi + Log("cajas permitidas total por guerra "& totalcajaspermi) + End If + End If + LogColor("la cant2 " & laCant2.Text,Colors.Green) + + +' 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 + If clv_prods_ll.GetValue(index).As(Map).Get("precio_caja").As(Float) = 0 Or clv_prods_ll.GetValue(index).As(Map).Get("conversion").As(Int) = 1 Then + Private maxcajas2 As Int = 0 + Log("cajas a 0") + Else + Private maxcajas2 As Int = invActualizado/clv_prods_ll.GetValue(index).As(Map).Get("conversion") + Log("cajas no a 0") + End If + 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)}${CRLF}Max. Cajas: ${maxcajas2}"$).Popall + End If + End If +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..6a4eea1 --- /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("prodItem1") + 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,0,0) + 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,0,0) + 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,0,0) + 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,0,0) + 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..bad6ce5 --- /dev/null +++ b/B4A/C_RespaldoDiario.bas @@ -0,0 +1,171 @@ +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.DirInternal + 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)"$) + agregaColumna2(rkmt,"pedidos","pe_cantc","text") + agregaColumna2(rkmt,"pedidos","pe_bcajas","text") + agregaColumna2(rkmt,"pedidos","pe_tipopago","text") + agregaColumna2(rkmt,"pedidos","pe_ticket","text") + agregaColumna2(rkmt,"pedidos","pe_comentario","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,pe_cantc,pe_bcajas,pe_tipopago,pe_comentario,pe_ticket) 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 + +Sub agregaColumna2(db As SQL, 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 diff --git a/B4A/C_Subs.bas b/B4A/C_Subs.bas new file mode 100644 index 0000000..cb94e13 --- /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.DirInternal, "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.DirInternal +' Log("Externo") + Else + p = File.DirInternal +' Log("Interno") + End If + Dim theDir As String + Try + File.MakeDir(File.DirInternal,"kmts") + theDir = "/kmts" + Catch + theDir = "" + End Try + Try + File.Copy(File.DirInternal,"kmt.db",File.DirInternal&theDir,"cedex_kmt.db") + File.Copy(File.DirInternal,"errorLog.db",File.DirInternal&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.DirInternal="&File.DirInternal) + 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_ADM3" + 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_pedido2_ADM3" + 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"),Subs.traeRuta2(c.GetString("PE_CLIENTE")), c.GetString("PE_COSTO_SIN"),c.GetString("PE_DESC"),c.GetString("PE_FOLIO"),c.GetString("PE_CANTC"),c.GetString("PE_BCAJAS"),c.GetString("PE_TIPOPAGO"),c.GetString("PE_COMENTARIO")) + 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_ADM3" + 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..de27694 --- /dev/null +++ b/B4A/C_TicketsDia.bas @@ -0,0 +1,165 @@ +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 UNION select CAT_CL_NOMBRE from kmt_info2 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) + Starter.pre_viejo = Subs.traeTotalClientepreventaparacredito + 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/CameraExClass.bas b/B4A/CameraExClass.bas new file mode 100644 index 0000000..4f4e2af --- /dev/null +++ b/B4A/CameraExClass.bas @@ -0,0 +1,401 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=6 +@EndOfDesignText@ +'Class module +'version 1.30 +'See this page for the list of constants: +'http://developer.android.com/intl/fr/reference/android/hardware/Camera.Parameters.html +'Note that you should use the constant values instead of the names. +Sub Class_Globals + Private nativeCam As Object + Private cam As Camera + Private r As Reflector + Private target As Object + Private event As String + Public Front As Boolean + Type CameraInfoAndId (CameraInfo As Object, Id As Int) + Type CameraSize (Width As Int, Height As Int) + Private parameters As Object +End Sub + +Public Sub Initialize (Panel1 As Panel, FrontCamera As Boolean, TargetModule As Object, EventName As String) + target = TargetModule + event = EventName + Front = FrontCamera + Dim id As Int + id = FindCamera(Front).id + If id = -1 Then + Front = Not(Front) 'try different camera + id = FindCamera(Front).id + If id = -1 Then + ToastMessageShow("No camera found.", True) + Return + End If + End If + cam.Initialize2(Panel1, "camera", id) +End Sub + +Private Sub FindCamera (frontCamera As Boolean) As CameraInfoAndId + Dim ci As CameraInfoAndId + Dim cameraInfo As Object + Dim cameraValue As Int + Log("findCamera") + If frontCamera Then cameraValue = 1 Else cameraValue = 0 + cameraInfo = r.CreateObject("android.hardware.Camera$CameraInfo") + Dim numberOfCameras As Int = r.RunStaticMethod("android.hardware.Camera", "getNumberOfCameras", Null, Null) + Log(r.target) + Log(numberOfCameras) + For i = 0 To numberOfCameras - 1 + r.RunStaticMethod("android.hardware.Camera", "getCameraInfo", Array As Object(i, cameraInfo), _ + Array As String("java.lang.int", "android.hardware.Camera$CameraInfo")) + r.target = cameraInfo + Log("facing: " & r.GetField("facing") & ", " & cameraValue) + If r.GetField("facing") = cameraValue Then + ci.cameraInfo = r.target + ci.Id = i + Return ci + End If + Next + ci.id = -1 + Return ci +End Sub + +Private Sub SetDisplayOrientation + r.target = r.GetActivity + r.target = r.RunMethod("getWindowManager") + r.target = r.RunMethod("getDefaultDisplay") + r.target = r.RunMethod("getRotation") + Dim previewResult, result, degrees As Int = r.target * 90 + Dim ci As CameraInfoAndId = FindCamera(Front) + r.target = ci.CameraInfo + Dim orientation As Int = r.GetField("orientation") + If Front Then + previewResult = (orientation + degrees) Mod 360 + result = previewResult + previewResult = (360 - previewResult) Mod 360 + Else + previewResult = (orientation - degrees + 360) Mod 360 + result = previewResult + Log(previewResult) + End If + r.target = nativeCam + r.RunMethod2("setDisplayOrientation", previewResult, "java.lang.int") + r.target = parameters + r.RunMethod2("setRotation", result, "java.lang.int") + CommitParameters +End Sub + +Private Sub Camera_Ready (Success As Boolean) + If Success Then + r.target = cam + nativeCam = r.GetField("camera") + r.target = nativeCam + parameters = r.RunMethod("getParameters") + SetDisplayOrientation + Else + Log("success = false, " & LastException) + End If + CallSub2(target, event & "_ready", Success) +End Sub +'Uncomment this sub if you need to handle the Preview event +'Sub Camera_Preview (Data() As Byte) +' If SubExists(target, event & "_preview") Then +' CallSub2(target, event & "_preview", Data) +' End If +'End Sub + +Public Sub TakePicture + cam.TakePicture +End Sub + +Private Sub Camera_PictureTaken (Data() As Byte) + CallSub2(target, event & "_PictureTaken", Data) +End Sub + +Public Sub StartPreview + cam.StartPreview +End Sub + +Public Sub StopPreview + cam.StopPreview +End Sub + +Public Sub Release + cam.Release +End Sub + +'Saves the data received from PictureTaken event +Public Sub SavePictureToFile(Data() As Byte, Dir As String, FileName As String) + Dim out As OutputStream = File.OpenOutput(Dir, FileName, False) + out.WriteBytes(Data, 0, Data.Length) + out.Close +End Sub + +Public Sub SetParameter(Key As String, Value As String) + r.target = parameters + r.RunMethod3("set", Key, "java.lang.String", Value, "java.lang.String") +End Sub + +Public Sub GetParameter(Key As String) As String + r.target = parameters + Return r.RunMethod2("get", Key, "java.lang.String") +End Sub + +Public Sub CommitParameters + 'Try + r.target = nativeCam + r.RunMethod4("setParameters", Array As Object(parameters), Array As String("android.hardware.Camera$Parameters")) + 'Catch +' ToastMessageShow("Error setting parameters.", True) +' Log(LastException) +' End Try +End Sub + +Public Sub GetColorEffect As String + Return GetParameter("effect") +End Sub + +Public Sub SetColorEffect(Effect As String) + SetParameter("effect", Effect) +End Sub + +Public Sub GetSupportedPreviewSizes As CameraSize() + r.target = parameters + Dim list1 As List = r.RunMethod("getSupportedPreviewSizes") + Dim cs(list1.Size) As CameraSize + For i = 0 To list1.Size - 1 + r.target = list1.get(i) + cs(i).Width = r.GetField("width") + cs(i).Height = r.GetField("height") + Next + Return cs +End Sub + +Public Sub SetPreviewSize(Width As Int, Height As Int) + r.target = parameters + r.RunMethod3("setPreviewSize", Width, "java.lang.int", Height, "java.lang.int") +End Sub +Public Sub GetSupportedPicturesSizes As CameraSize() + r.target = parameters + Dim list1 As List = r.RunMethod("getSupportedPictureSizes") + Dim cs(list1.Size) As CameraSize + For i = 0 To list1.Size - 1 + r.target = list1.get(i) + cs(i).Width = r.GetField("width") + cs(i).Height = r.GetField("height") + Next + Return cs +End Sub + +Public Sub SetPictureSize(Width As Int, Height As Int) + r.target = parameters + r.RunMethod3("setPictureSize", Width, "java.lang.int", Height, "java.lang.int") +End Sub + +Public Sub SetJpegQuality(Quality As Int) + r.target = parameters + r.RunMethod2("setJpegQuality", Quality, "java.lang.int") +End Sub + +Public Sub SetFlashMode(Mode As String) + r.target = parameters + r.RunMethod2("setFlashMode", Mode, "java.lang.String") +End Sub + +Public Sub GetFlashMode As String + r.target = parameters + Return r.RunMethod("getFlashMode") +End Sub + +Public Sub GetSupportedFlashModes As List + r.target = parameters + Return r.RunMethod("getSupportedFlashModes") +End Sub + +Public Sub GetSupportedColorEffects As List + r.target = parameters + Return r.RunMethod("getSupportedColorEffects") +End Sub + +'Returns a list with the supported preview fps. Each item in the list is an array of two ints (minimum value and maximum value). +Public Sub GetSupportedPreviewFpsRange As List + r.target = parameters + Return r.RunMethod("getSupportedPreviewFpsRange") +End Sub +'Returns the current preview fps range. +'Range is a two elements array. The minimum value and maximum value will be stored in this array. +Public Sub GetPreviewFpsRange(Range() As Int) + r.target = parameters + r.RunMethod4("getPreviewFpsRange", Array As Object(Range), Array As String("[I")) +End Sub + +Public Sub SetPreviewFpsRange(MinValue As Int, MaxValue As Int) + r.target = parameters + r.RunMethod4("setPreviewFpsRange", Array As Object(MinValue, MaxValue), _ + Array As String("java.lang.int", "java.lang.int")) +End Sub + +Public Sub GetPreviewSize As CameraSize + r.target = parameters + r.target = r.RunMethod("getPreviewSize") + Dim cs As CameraSize + cs.Width = r.GetField("width") + cs.Height = r.GetField("height") + Return cs +End Sub + +Public Sub GetPictureSize As CameraSize + r.target = parameters + r.target = r.RunMethod("getPictureSize") + Dim cs As CameraSize + cs.Width = r.GetField("width") + cs.Height = r.GetField("height") + Return cs +End Sub + +'Converts a preview image formatted in YUV format to JPEG. +'Note that you should not save every preview image as it will slow down the whole process. +Public Sub PreviewImageToJpeg(data() As Byte, quality As Int) As Byte() + Dim size, previewFormat As Object + r.target = parameters + size = r.RunMethod("getPreviewSize") + previewFormat = r.RunMethod("getPreviewFormat") + r.target = size + Dim width = r.GetField("width"), height = r.GetField("height") As Int + Dim yuvImage As Object = r.CreateObject2("android.graphics.YuvImage", _ + Array As Object(data, previewFormat, width, height, Null), _ + Array As String("[B", "java.lang.int", "java.lang.int", "java.lang.int", "[I")) + r.target = yuvImage + Dim rect1 As Rect + rect1.Initialize(0, 0, r.RunMethod("getWidth"), r.RunMethod("getHeight")) + Dim out As OutputStream + out.InitializeToBytesArray(100) + r.RunMethod4("compressToJpeg", Array As Object(rect1, quality, out), _ + Array As String("android.graphics.Rect", "java.lang.int", "java.io.OutputStream")) + Return out.ToBytesArray +End Sub + +Public Sub GetSupportedFocusModes As List + r.target = parameters + Return r.RunMethod("getSupportedFocusModes") +End Sub + +Public Sub SetContinuousAutoFocus + Dim modes As List = GetSupportedFocusModes + If modes.IndexOf("continuous-picture") > -1 Then + SetFocusMode("continuous-picture") + Else If modes.IndexOf("continuous-video") > -1 Then + SetFocusMode("continuous-video") + Else + Log("Continuous focus mode is not available") + End If +End Sub + +Public Sub SetFocusMode(Mode As String) + r.target = parameters + r.RunMethod2("setFocusMode", Mode, "java.lang.String") +End Sub + +Public Sub GetFocusDistances As Float() + Dim F(3) As Float + r.target = parameters + r.RunMethod4("getFocusDistances", Array As Object(F), Array As String("[F")) + Return F +End Sub + +Public Sub GetSupportedPictureFormats As List + r.target = parameters + Return r.RunMethod("getSupportedPictureFormats") +End Sub +'This method should only be called if you need to immediately release the camera. +'For example if you need to start another application that depends on the camera. +Public Sub CloseNow + cam.Release + r.target = cam + r.RunMethod2("releaseCameras", True, "java.lang.boolean") +End Sub +'Calls AutoFocus and then takes the picture if focus was successfull. +Public Sub FocusAndTakePicture + cam.AutoFocus +End Sub + + +Private Sub Camera_FocusDone (Success As Boolean) + If Success Then + TakePicture + Else + Log("AutoFocus error.") + End If +End Sub + +Public Sub IsZoomSupported As Boolean + r.target = parameters + Return r.RunMethod("isZoomSupported") +End Sub + +Public Sub GetMaxZoom As Int + r.target = parameters + Return r.RunMethod("getMaxZoom") +End Sub + +Public Sub getZoom() As Int + r.target = parameters + Return r.RunMethod("getZoom") +End Sub + +Public Sub setZoom(ZoomValue As Int) + r.target = parameters + r.RunMethod2("setZoom", ZoomValue, "java.lang.int") +End Sub + +Public Sub getExposureCompensation As Int + r.target = parameters + Return r.RunMethod("getExposureCompensation") +End Sub + +Public Sub setExposureCompensation(v As Int) + r.target = parameters + r.RunMethod2("setExposureCompensation", v, "java.lang.int") +End Sub + +Public Sub getMinExposureCompensation As Int + r.target = parameters + Return r.RunMethod("getMinExposureCompensation") +End Sub + +Public Sub getMaxExposureCompensation As Int + r.target = parameters + Return r.RunMethod("getMaxExposureCompensation") +End Sub + +Public Sub SetFaceDetectionListener + Dim jo As JavaObject = nativeCam + Dim e As Object = jo.CreateEvent("android.hardware.Camera.FaceDetectionListener", "FaceDetection", Null) + jo.RunMethod("setFaceDetectionListener", Array(e)) +End Sub + +Private Sub FaceDetection_Event (MethodName As String, Args() As Object) As Object + Dim faces() As Object = Args(0) + For Each f As Object In faces + Dim jo As JavaObject = f + Dim faceRect As Rect = jo.GetField("rect") + Log(faceRect) + Next + Return Null +End Sub + + + +Public Sub StartFaceDetection + Dim jo As JavaObject = nativeCam + jo.RunMethod("startFaceDetection", Null) +End Sub + +Public Sub StopFaceDetection + Dim jo As JavaObject = nativeCam + jo.RunMethod("stopFaceDetection", Null) +End Sub + diff --git a/B4A/DBRequestManager.bas b/B4A/DBRequestManager.bas new file mode 100644 index 0000000..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/abordo.png b/B4A/Files/abordo.png new file mode 100644 index 0000000000000000000000000000000000000000..a6b5911c4a2df64a1e105c0d68d867fc405137d8 GIT binary patch literal 2146 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

pV;E;n;yZJ7-TWMP_hFF&pI0jD9Xe zF?9W)!W-Z!Bkl9GdG`Rx+r-mj@ZyBEP>o)HC&hI~D0Rbg`2ES#^P1y~4E6Lv0qDAIJ=@UScZ_xERV(74Z-G@zC?F}j=OV$$XN+1U7-sDc z^Y?UqYkQaaOI(n1tvsn>TwA{k$a~_`SG~i8j0RQ7tOh3ep@UIH$Gfn^LM|an{+#C3 z;uP)rS`5+EBN8n$w>+iDA?z_EMEEl>YM|k~I=0&6fv5KOfbb7tv5L%=X8|MtmTV}- z{fdt(I?@_Z~RI!|E7~{4ppI38Ny4jT4E&A@-1n_sAaj1m1(u4b6~2+0 zYQ#^ebT*ryijHsYuK+#aOV`__&|Roe;=Rw1ZpMH%{W< zMdJ`N1p%H%iDjo3DQKe-Nl2rT92S63HlP;?iUibJ*QrH4(2-L&i5}wY(hV&bU5PjD zjtw`sv2~(AK7b>vt)c0-+34ohGc(QUMMsvZ-D^@hWx?kG-BGzBGof=Y0dYG(vPGE{ zjID(Jc}a&mf4Im4fa|8nL*{6J+2L%USrU%y;TbM8@kuJ=icVBdMt6U5%*YFWJX+Rx z%W&%1&i}HD`zI!14M6D&iXA z`(xgo$S-Bs@&#ITAzF*hPQ{!bEL(^3+oRMF95zBY)n$sw34>LuCk;eqFD6rckr^1oAWFG~w!!xWUnX)Je9jzE=dl9kRWQhalg8r9JN7EKO}rRGYH8U) zYkv_nkd~RN2lIB zVRAf#Bgn;Fi)I{yZNZ&QFqa!|n<_an@?2yC5M+k2Ww7(xM$+j)@V}H0h>^S!(LtYY zy`*n36o7LeIwrm1tlZ109D)ryxew*sO(x|nz$8~r7%u2Us<6-dY>aaLd+9gv)-jx# zyx$Ewj;kep-d?y7`DxQz@f1Y$`SD2Sr~C}4@T*^MH`$cj`W^Z;9bdTg z0t-;9bmrT{OIh$~EDIAjt8*}_=WvI{djs8RyBS_HlOk(N;G^Z2(=h<1K0$`a4!V*tl)@L;O<*`n}h zsG>kCMm>^69Oc*Q;3K9Bsm!Y%ctFy3hR^K$(A$<%lRvzGhkMBFvef&x@b5ihFLx(g z!Lo{YLaSh6&XkOu}?itgX-gTH?u#~Ex{n%h2m`R+YXHdWpaBRry6 zzVg)>mWf3UuTa_926?14c@Zz4Cilgg-yNeQU^5UlI6KhC3$a0cc=iTOxkr`9T;|C^ zH7X}@1T!LXZcb?Jd|f`FY-af`@#kAeOi)uTb-fLE?gWS8uHuMzZ{F9qIQx;D^VzUt zmF;6%`vU_?P8Q_zzA{rUZt!)MgMzpq;o(P3DaY;mb>=bR$jeFHokeCG0A0C(joLD6*w5sRs+;X^u|C zewgorQMzT;8y|3EwA9*ly%fVxz6=8{EG?1mRC>Uce5vI#-sZWR4uE7>bM7Qxy!qG0 zRX+E+3lx;#eSc7s9~Ap?_`p@Sn0>ot1$bdUjmX?{6?Fd=!QFEa*sdD9Rsb~3W~o$Q zjMmK4v~3ADTN&$FUbeaF%aq;(93rpcOj7tV#*}vl6e**>3;&6eVn4XuqoGFL{%)hH zH_AZy`g&ZZYA_C6kJz&Q6x3jS>AZO-7QnH3foyC%G6CgCFCFpK>?0nGR|L<{6$24~ zw4ZYN4g0j5W%j^?H-*VT%n+)}7d#b$>8raDqFs6Uu24v=on3rXLM5fI3ZDeg@AS7j zlHeqsNw=ulNdNvr(YEiRoD_fmMVDQQ?TP>;JL^!94-7Y(<#^E&sTyNeVv^0QID9*V z#rcW?mI`qm->1Tf;o+hLW3x}l$}6T%2=UV&61NU>iUGR15-40M&B0Na?jy&f?wX48 zby%x+Kk8ruZihr59b!CWBa&VWt^3RMh016NiQMmChDxz(`oL)d1#l-7npA$V(Gg2X zNr9!gkhjH;h8*sRDHRY9x6Q}?z%wrvgC1oJ zS;h+zAtj)iFL8g~Tt%|h$HtF8+P2j_!?=IsQAC{Na-Stz;yKx^LW(8?vv^Th4D+F^ znfAP@N+aCf68SB=PReA$`gdj#pZ4B#bY0^8?N?$uQQE|zSeRG^x)oXemlsk(A7Qw# zobJKD7AdN1Sey6}gTB23V$IxIoqs>(ckNkMh_+@X2)akpFQGgR{0Hu4)t^lFj|d&g z8;^8Y!MvVhnyvV)c$@xX?2rJK(9oirFNjaemi=AyL>Hx6{wghm$!_!&5@033cP`xq z8_+c^d2gU>Hk*1ch23$=ih+wZf#lXODX5~R6@e@Ig zAbItiOGCzpI4{91TTz6RLWK#*YZ5HrCE&+TXp`f|uV*a8j{ZpiT;Hc*^_T3!`Pl3Q zCXrAV=1}`E&?)`|a&pEhio)UOLmq2`w~S7WvGH1})3F`cg{1P_n{DHipM*%PMQ4aKN)NmqINWBm7At%c;jq z`L00+#H=g71< zo7d!{n%$1lUz59HqP7HE#WPIpoL~Tj^Ebxlmh?!4`I(JAguEH_IHk3_;tQ{%(7ax| z7I3{AD)K~O(?~is?yM{z=x@>MC6xN!eoB?_WecM$cT+Nqc12+4$hiRv*VP|g37z$( z)ZMb&>o2|NkOnj%Co|20(%7D&;~{L2Y~iF7phX=QBq4`OF-O9|! zNXO;8{DCPtJ%4ugfea6@b7(olQqha)5O?mHV&2*DV}4&BKBURc%3SocDl*d{uc~}U z5hnUR(>aYs8n_Bw*(M3OMkD8h%D=3?dR_MAon37%T_b^R>dDGXv?sJ$`A1Bi;qTFw zo3==s+HWwaHK)2+!N_X!Hv(oVqWF5s+%%r@rgrjh_FLU!{oO9+@Jc8kt6`0v z5yP>ilZW)U7JTK{JshMGW7Ji#EqXOU$8SH+XF9(=RxxqX5W)j&1Fgn0&Ve5k<#7P{BEC-qb z>cI=Ip9}W#&mT@fr;JO?AW~IR zjelM}p1ti_$oX|Yj(B?I{Y?;AQFf?qTLT@%#q?`;o)-Nn1{J#VYzYghM@>mgLyD_l z{;iy720HqhSRglep0zEW_a>D4T_iXuc$J@~Zv8()CP|9OTvUS#{5hU>xW+^c?U<1g zqUOjv?mn}E8o9_x-uEg@rvA=eK3WOJB_49SPl;^c0f`1aKcjLy-M@-9CoHydxc`_j zWcHCW9iBVAza5$=XQR<6(kE$dL|%1-a&eGOx1Y`{YNt2I;`VJ8jI(Dl>`9G3KEbNW z%C@bw5SlmII)I!1utbKaUG|t#2+2vax-rdOms;=?Cc~_`mub0hH#NAvkADRi58a9= z#ZyaZ)Qeq+6pE(9vE}y7&H_!p^cqNYbKNJk#$%PS{x>Us28S>=$}a3q74O{z!uA=q zZ@$6>kR^rp*SH752|CRnd;z-0c3% zYmrksaHwkvU0E4{y_8^8>$sf^E|&pgwwDg;oIq{1Lm12O?m5T)X-zZps_u7qpwxr$ zcWkYjpGe)0LRnXGLP*l( zGd0R>W|#4Mj}q@0Ufm;bZMEIVy^EoZ=+7R8!O|QMxo>j7CSE>ox*3>{>2V3vM)y54%XR3%FdMrx1 zrCifYRp{hmCU&2u1ZS{0_t9KrCZ~xOL{v6=#5SV?1s~asTl3C(=4-7H2M0X zF!T1pEX_97Tz|u~Q;Abd>iCO_dU9EY2RpJvDREn@8*&i~yxh9^^z1W|;^|)k!!UML zSs=eLAdPag&F-`etnPEY{$Bx$Fm%r%oGEKS&+|He5Q?duc3t?%f?cq0U5nq18bE89 zfSSqKCgFGIBz}=8$tWM5gyWp(B7*eb?eXYXl4H&f6%El$tLEY0I5~Ky9;IbF3&-2k ztsyOuub?Dh0nzaPEKXJ6NOgV3uq@1PIeK9^ZErn?$HWXq<9@X_!%)a0g_FSCuB zR^6O-lcLs+&OqB;*P-MG{Ib7{Auaq2DdOkNu9$XAJ1I5}oa%yvo$)h?Xhr1CnRdGr zm#T;yiLy9EQDqtZ8|gC=Sf0(-z(I=IrIPTQ!Y#Z=S$iZ}yRW}lXl)%E`lIQYG;E{w zZycX$YJzU(gdcc(jM1eMQwc!>s5>qKgg4F$Yzia67Yc=pz}bv#6Tgf~F1#YnQ`MM$ zW@GK-+!SDCzo@{AlulYZNhA;>>8g*GPwmJ&ixT0SM_+!HMFr*0DdD^Kd|q%N__U5( z{8=E>d0@wEKE5CUj-@F$_|sUEo}>zChi@N@rfKN}BkxlosdC)`&eeyv@q2As4qwoP zE>pGO6z9rmIxAg>>%2jzP^*y2Dsc6**qu0ivgK?<(W5tF$9H0IY+8m%0^UuNu7WtG zdB&tf)J}=RHr{V~oYZIi7lC!x8SSVbSxizmP**=&J8BeySmNUEtCxTZz>20S zkX#g17Eb_iz0$jv-k-s9!9cj_dIVk{jP@l1@DUYJ_1I)C^cWP3iNo&vuMin(5E6jR z$H^7u#Ou|oj+gxc+QMi6G$7o+9XoCtV11^E^y5cZW!yVCUfrwvou-&)5&aizUvvoQK(@ead*C1(KpPN>d8xG+UOnx znb=E8S}aDu_4z)3mIZ8jZa7_plg7Ac+f0+AHBPd^2Xst-{@3|~uv;bcfi|a=ZDHaE zy4`ShS@aa8oAHOKU&9`Lp@Wl>%?@c{KCJ-1sA!K;Lw3_b>{I^XGnojk7>dC1fhKTU zhw{+|Hkud^@>UW)Ly~BFTPaflr&$P`4Ec@T1!?dv$vh3hGXXIYP=AXkk=L_@7G=`_ zl--|-igD>^;CCYqIkeDrDWtB6}86QM{OD09bu{4EBnd&_$}J#Zz*#st3vfs_^nVKa55F z1K%>)Lhx8|y~-q#cC^{M%ryD07!ZcsusK~OSk>cG+#LCGu-!y~m~)iwW9WEyKHj_S z8q|%+MlBa%;caoK%uB-2shOxAMa#g+S2|Py2d3+#!SoNmM29&Or=C0eh={O7l*Kbn zKNo?-Monm_DHnlu#ym6QjnAkvCoPU>Ae3Av5IR?W2DXi)KkGBm_~<}X=Vzmlib&-K zMbY1z@O|K92|;*@<7GFyr8J9%>bTwKKgqoT*c*iJj{Gc|N2H>j3vjQhhK)%?>#yPw zczXz1Ue1ULyhu?Wc+X0LacQEld;(w>=fi+cOe6w;#%-XV-Z>)8CKXnsFJZoyxhO|EGGayUEUUR=Ra;9E$FwtFUdM)yz|8w>}4K zatC!k{GJO|E~31+^| z^&0)jE&Tm8>J~cyfwiB9XX#f_bcaIwv=bMD{nWa}^f_AIehQuL4x?S+Itjm{h9jmL zYd{BQU7=Bm#86O1$fpHCi%Bq9!WT*S%PM^s;On$~ZYUGQEE<(r_jd7TuN73R;ES#n z{OQR%3@uhCW*r~NEhxXAO6;Y6<_O2LF&iBlGho|5S(i@GrBSJ*n(#6OSgZYX)G@t; za+Cm54I^`3fO~{sSFS1*uQusgU!*^{GzPu}**Ntmjlk4olL@aR1JTcexA1#QAx_Uk z(d0Dz{)c?e>G8m;&skloFTr)uL8yagxVUJ1?I>AzmnlSh*!UkY*ghs6)hZUn`=&g` zq)gLze=jM*Nm3QO^A*yYY}j5%G9dBKii3xPuI=Vl`F*o5fF>1P3DaJ6@0phbHI}q3 zNrP>9hB?-VW-Y^(@^pr|ZV6C)Z6vC!|p^#+r)Kg&g-ok0ijoY#^23AXDkgK?`nQmtmdp zt)TT=LK?Xsp7TOB!3F+T<9Ufi06fL{lht+8;`&K<_SUolsyT&D=fR7&}TdQCCAcvS^-)YsKzu4DB2O&bo%z`qxRlYW~ zK0Olk{IWYK4WvH`Y1>CCq+O|+yhLLe)nZCbQJnLv7*n0)=xj$lEp(13|4zZZUC&+s z$G(RyNzB%HkF@bQi8=gVluj$AD35;dtsP*FI&}6JRPwOS8!29jN4u@BSm4w7U|2df zWFhdTl8_0~#Y3oZEq|nP6n!yj;HKPU>>NE1II+i+Cp^UY_jD3zffjRw0B;)sBtU9A z&H^2W)NJIqySsSn=A#~y@#1&c(QPNpJcJu9o?a)=>USF29R`Gf>g`zhKlt6rI_jt7 zSoLKn_4jcMW@jU~sy_k*pLZQ;=E@AXN#)#2X#p3i*B_~*S{raaL@%R`=_M4`>;&Uh z2!sNkm!C^aNj{)|X$nG12B7(g1k+7d@v)|tU~Vkkp?DLN{qeL!?3tEgas;b?5Q~O+ zKQqcp9R!1BHZJ~k@j>WoHvKF*q`i$AuEFm6{s|4Y#nKs$K?(V|D5}zDw0m03!6~D5 zQqdtruy@R-6iRqi@ro)1qRy?jA91sVTOXuR+(V{o#Bqn^rQ-gv=dzgp`QivGC?3 zG>uC`xi$ni2HPj!036%5waK!@cAMkk?Y+Sh^l z4~Z7HL7WzZ{5SzqxAOI@(d55gJ}QjzM^RYmIK8fw3#gqC?b4I{1-(ayauauMCh)RN z#EydLi*F(w=Ff_dX`~f&&B;b+Dd|70NDHk=J8vV$NDeExEX=h;LAXVaG_ z@KoDYd4cW)DO4O8XeLuC%a1ckUKQn3`oCdXhABiQ_9ZD89)rW2hsJ0Bm7{b7KBq=k zr6K)rcWSgR{&mqoXbgH6^>BA5+PJW!#f?vM;9czh$$!U(Bjd1*gCQ-Y{)Yl)Iki+> zex@mkq+L@{iRLHM(7p0{VC{7r;4~9_doD*9XOc(|>V7!dMmwp}u;GJ$bM`12OmHg8 z-~4_3-ds}R7ZYHAiGC}6N!MbWh#+QPVcd4BheIoVJ69DBaH9ryy@7z>)=Es|WiDrIREo#v` ziHXnU{cuE*7=m`1dynU(7JV+~Oe#l$P?0d21OK9dr_TYU+_e!?If2S9KbclA9>ubP z{O;Nnt@<8W*8~5D<4B*`6ol-w##w{hCGK$XuZs>skA3kA&W#RRC-Gcwo)U@BD(J$jCa2qgLm%#9|-MQ2h@E)6L*kcqjjW} z)A3=@6GF(tA9!E=?-X#OeH)V*tUw7z6VOtMg4gEY_cskhE5~pr$9B*398^#JGU{__ z5d`{sV{qc3SaduS3md<;MBhbzakJtrdlZlW7)~eB_q|X_wdX4ee-k@WEU0ra-IIA~ zIQA%6)D$W>TDcN}usk;o731PiO5kZzM$J4cCd8U>%F+k_7ecObxSdpAURgk^--l6N zCTITQUl-peq?T5xDDBz>ZFZw)q|Jja(Ntc07o+r^zvDuoKR7)FrCgLMuA>2}o|uY5 z6R$y4UOIMi06!*etNIl+-jXc%*5p93f6*r9T*Nr_6j``PE2nxR5}iASYnzw=@tKwd zkjPp(`Fe@jVeR!^S|IW(Pd>ue%t^(m87Vk9D+MPAR?o^b*i=^U@uAp5f9ySK=Z1;> zQF&`3whxOz6Rp!xDxp7(%*2i#{UfRu{TQvgen+lJZXw{wI`WokjTXE z^g0TEeJ9=={Y?~(&O$LQKp}zNJTV=`x20n1#C|BGk~_|^ZhJhL{#2?_Kmwh7Dle6X zhgAR6IO3}10;Pfry3r;lTZ@y!*x|PsANo>U7axRuTy0!CD0?3VfBbdS z5@-jfCZaYk1AFr_@u$hDs2`n8+K_~5`i`pNR!p!qsh9ieY&8EV9VeE?;5a8i3*P^9 zGVoL?{7=$Xqh@!`BBd0qq+_EQgQF0ve`CqFbXGq-fVy!ppvhC z=zrmG8^L!4T$de$W@ABH4$V8TZ{k-`{e4=5JL64$R|U0q(FjtD>9htM$X(QGs^V6| z+r1pzCi-J|>kFnhtTM7i4`rPMIQeyIN*d104og_0hk+Pv;xDDB8II%mWZ0ig$FW~n z!3sOLNK}DfAICt8N(HlYjIfVdeBY=qWIH`C8Sn zspEnxpO}Hdv9V_Cv_-F)u*V*ZL+4W|#sWtBOjnY4W+#}amu7;m>v>Xq&hJU>fD(jQ zkpR5;MgE+M3Mw&G5UC1*;$LX}DoELnnIa!R~wh9u=fvC%AxQ8B21Lv5kvwn|!B9iKrr-s=GM}jicjH%K^5{ z90aWTBCv5NY>VP?g8qz3q?^1%PL>>Z6Rl4PQ%183+5^OB6Mrd1*4Q~C!B|8Ab`9J}iHR8Z7xRAm_yr>k<4 z>KCHym4o-I+H@LRGcw?!Ww{gq)aNU0J<%@?j+3$=Wc_qb>0Oj=VvLVHoMT!p$e%8t zUtK*m8?_U1Ob|kGUIJ?GzSitF)RLYaR2to*-vZhX!DXZ34>`2*F8g)aLD(9w82~!y z1Dh~eUjyoX^3SLm7H1YxZC;|GW1?#n(?~5y$r^HV&@yePIbc+^K8fiL90i17ALp_O7n(G^XjaElq|7rj`MGj%;+ILNyPMy8D!(_a zW03&G?<#*;8&$H5rQ>KhM`faDWGV`V$73hQ!_>2q_;%5S8P_|Q#&x5e7U;(BW~EbQ`Mm!FQh6~*C&5=4S_fsl^{+pz7K(I^;} zg%WDFqtlX5Pi?2gRXHsIC6m&ylRlFA0+fu3x0?8Cp)JWoaLZs5R4i*KD=5twj)Dmv zMHmngj3&FH=dsHrCx6Y)&Ce++Ez9J1K9O2Kg_35({$xM2J)D8V_tQd7w*aY{m{qiF zH3V4Q#3U2_p`A`CE!Fec|D#kKe=rBFj}9@`Ra95t>v}d3Z3MhPFAyrSB-&@XlB9c1 zwmBlv7zG#7{aBuX_UDsO!}%`a_b(rxMtUBHYAU3ocVuDz6w-2n(q!n|k&Hinm*5*l zA93bbm}>Gm!wG7KK4ir~TmjeR2Vp3HuI5JGwwuGQQ=XpPVP6~S7XA!7^M_(9X~fR& z(JIg)*4{;bk%0VwfK>XEjxf|ee>=5a0T=19XH#hvKTEk5o`qa^b5%|uo({eu_pL2; zfzSkPQ+m^%OD)Q^(>a%XA8q*?3&llee=fn4XAjQKL10!t`nuV)2pObi>9GAe9UYIQ zqWw`S8(NA^ZC3OgCm038_jAvRH}9$H(hBc0H9Ym5XVTj8Ia6mv%pl5Vx{^fxpJ#3& z!Pg(51^sY>?52$DU@sMpXlT(m>)cOS5h~Sq;7)C3S$?%rk`9r|SHJXQuC1PR#arol zRm?Vl?N`8c*+J-3z_BL;-*F}KsIemPXyY*H+zWmjdHrd;JMC+R^BT7;8NWW&2+FuGRK|5161g}i+!#q6?~V+Jn#a0Y&~iNBQM zonr;3%MykubJz;#G1b~J^-=h^ij${h^ZyFCF25xt*c4Z)K71aRxH>sI z+KjeR8jtc3ogXei*98a;O&y4u{4DII|D&9|GSV`Y*)QXu9~yTJYR0CUEQO+< z5RA)pxKAsxEDOHH87B5q0l#KLMgY757NIF(%!MW^6|Oif0G@uH_rr0Tr{gvC8j5oE zY|qikQ)D>>OtlPfJsk@t-%BC@>OE!o^nUtTfK+m=`-RJ&iqx0j%^Vz~ViC*Pt>cGD zsi>Wpfy%M;cWLdar{$Q2Es8Z(?~|J8>G)`P0?Ma<4S08kmKShR;n)Ey|Ig1y0w?%` z1D#jt=-FKYr#L)nccb``8}Z?A4m=0Dfqs!PE?Oq$ppv)Rv`}~8eWW6ayip(h%A4Y7 z6?0&p*AM{nVya}zLJg!95ZPlW^!T9NIWfJs}yOSBwEap zXbb16{8>~%T?gta;M_`!-cIXmqc|RqHR7I;V|-xw>!yjUl7biT`DHP1uS`J89aOMX zw)-dwGt(wr=~(*5`6#)qQNKf%<)LpQc(}#{p?w;zD;|U{(gvTM zc2T)?oi#YH{6~1>)(pHy>Um&FJSqrAD<@I)JX26JG20ZB+Dfq2-kpuo`~+0p9gn8R z=o>CfLHCAi`ioicE=)90A}zFr+O$zFp`v1R=zn_SqGt;~8VJKc?7ir&%3q3q9^HXi zNwn6n#@d_K=oHawMHA`RL6s1kFY>jE6A@gR4*T46G|~4fzlVyI%2fdi>Jg}Z8M_I% z#_37|&%g%+T#33QaSb%k627l9=9liKkJD`S8m!(BSN?UygHT0~RFO=LQ_PSC9I$<~ z61(pEI(CjpFf~Hdyh9lm)su%{@2GT?5s1~dXW~Or){@bw*fWxTB(-GqPh!#fLIwh> zvJhI60RM7oX!=nnxFC*kK`1#?mBD;3CQw6@CPvWJGXXJj!CjRo!ZDQ(tH25QqV72f zCN@_Ed0R-An>n7UOVhm~385vKRD$VfyjN|>;y7>dD4d*WEZy$0aj2TYx#ih|Dvl7g1Z3o9$O=81%n^v)tl*4ucU2A@U_a=M+@BWbB znizvR0!?9U2dOpdCl5vqC$)~EYFZ_vtGh#P8&!H3@{lFdTcJ4hKYFT2k*S=aQu-Jlu|jW+JbgI zE62wge@}U(MR`dk{iu<1dz7r_ApL$NV*%`XK8^JhDYc#>qFTOesuY- zjNQ+^t}7md+FCy4^1-M4Ia);1xd&z(N5tSg zl~|;8ltVAASw1$&^o%dcO~F1o_JvcEQ2zjb=cyzF77YYeT}xV&WBQfb=Miv}FbK~C z#K_04%3q6^MLQXT0O*>V1T3S{TSn?QD;q~2i^u+Zvgk$-Z1nevIBx=+6sHRCD(r6m zv+y?sXWdvEB;yWj1pkiF2m2|6JP%2P06gqNe7N3vBpS~A^_a|M8#?|*D za9|ggfmQL{^x|~4@`otsFY_Y!Dtz`bEfL zHo-(XL|0W)v!(END0uYWOwAfQCvxZL6zru1RAQ$}EvmzgjyP2MynvHmKRLrV`|8iP zgU{`|huT*=rc0CHdzt*-*`0m!caDEh8W~>}(XeIBL zj*LU`$OP;g9cMB^m0VCO;$UBv0Q>!}3To=8UL<7t$1E8bO# ziSMQC22pq?f#+Po@4q?*-sMAZ=$B+89Pct(z4}`dP&+cwR3O(bX9bza0Y29>Ap>=j z2BDIEymq&D=Oy5e1Y#AbXVH`|V*k2dBiM1=08LRX9FJBL=A4J-kgsvCqe{!LopoZ6hv?`H#W+%cwI|cq( zY4FeFB7G(v_NU`aFu7tvjqvsA#n@pgfq$~-5c_;Ye>W`Ql&;9MuCT>A?c-9hD7DHn zD;d5yN_R>&X;!Y8$&^GB`li@afmoo{A-oifYSRRlWYV|Jf%C;Iv_6-LV~;0b8^^qi z%C2T|B8qN{#V!JI@0d7L+@6N&A7!BA=0p@sO2e*c2}b$tx`oe^snp~q;pk1tsC+sX zD0qz%tVpU5PP&7zixo-pcFX>K`mawt2tBlXDljYn3W)At(3Ai~x4gx6i=&j3qUMn? zD4E_FORW2u1h}6}up&kt zRq2StPn2lDJQp!R-2_TlOvQm7QHWc|lkw=3b$i;f<_h+f$T~_~vj@QbLIyhcS#-9i ztQ2La*r|Y=^SON1tA(2SL8j2BPQam`Czw|0%7rus>tj=C^+@*##)5H4C?>-wxhow7 zRBqe&n)iP;0J}NnwFKV*K31z^reP^K_Q1cx{o5H=x5$$Zsk86=);eGY?5Z!byjD>G$90JQ#2sjxhXx(dn zLfS}LFKcF<^U;dsW}|UT7HV^8@x~{bqamH;Dg#2jABq%kO>maTBRZz_aq z*G?6jrMY+T_qGa@w-c22Qj0$vi&F%ZV__=1D`@#vaiP+mbg!i!Nq@3!Ar~`&d4h{s z3tALT^;06FZ=y*w>vk>@ZbKFpD`!#J7s}@6XQLmdQW3J=Ed-p(9EQWlybJjGY2m$# z;}KYviont=xaMb(dZ*#=Bk^dUB2xX9Jp`31cq@xvezm&X*5@Z<|CBUSV5(-4x*)}y zU1$YaADm2|ctX7C19607UjA*4W!~qo>$gwfl&2A|V%)zcLf<)tT_G&p~Ko4*cs>EI1Jz1m!7O6_u0!Bnejr_*+F3vW*rv zEV9UvA}gnofdXA%aRR!RkzOyQKe!;#_<7w+)8Hl5Y$t%5e#!CR_fsC{PL74C7dt+a z1Klh>^ZJ`hoz!o%usxM+ux)0?H8#W zmGRE0;&jUUvuhF+1M0DH(&$$BNIkoCAR!=HA&gztw0`QZPdy0Lp(sS4g+kWENQ{Cc zF8%6wE5<_c(6_L)oitWccZOoe0K z0EAXtYif>$Ru4d6Wj}PiMB4WWqBFMh5`rr%odSK2*yztmoc!6hC;?cJMc-}!K{pug z7jw||Y$}dFo`BlBXsHMueIFew?2vCq0G3iwRZYo64gG0L5>Yjt-=FkeRq-k~2C8{e zI*|&Bzh@P67K@0-Tf?&P(NAu~iA~RPE=Vh-EmiE3`qDy|6F~w`1u{d9E`+?=fRQCs zc}Fk095y)J>YDqXF&WElNEQqRge2cm3hwy9>Ovqbqj+BsDOP7N1Yji{_-bR24F zA*;q_kh=Cm*_i$)8%=*QH_n7vX~Rc=E~XW!y^sFnqoROGa4shhK0(||;?GZ1`MXCv ztCCNPcXf&pmAzL()+78p6+a?K2$XG99^3d?RjokvJ5}LL0rFB#_0zIYGexnS308S| zf>M-TotUc$Q~|M!fK|RW&^nK~cB#3i&T5@apd9f0C=)DxRwi9s$;D1vFRS=*AiN;I1Fg zXZbw#5ATN>0#e~rY93-T`Y8>hUTb$F z`>+(89GgN57mGh~@$DMj4?A+Ru{}QpcUTJPdxb?ikP=m0 zlN3|b0V`ZSQ4LZmCM2U`QVzkAMY_q)PUWB@o4qO&JT(&~)BBn4__01eKhJJTf&Lah zmyT@8>ED%)qAyM6P?VpJUHrX|X$94HvXBaz@wm==RKDewQ7uj6Yg zZj8bH?_}fHgnz-Qr4PYz;E!|z4$<(bfLFlyZ+}*Fx=1I3S8buL|MDOd26e>f53de^ zkvA4y;vIFgaam8<<+~^Vpm`UXH#~~MyZ#kN=sVVNfomslCoP<;g*GG(j*CSz!BlrE z7x!>d)DiKhx-A|RqY?}qRSQ+=fI)M^r0u=N++SN3FgWo}v z_0UfUY+5|gRaLt?#Lw0=IvEFUNx;FI_+9>)RP^@G;PASMXs%s_PIobUAu2ApcEp&* zkt2qq&VXroa2kXmzJS#9>U9-_TqItu7Z2Pn2bD9Ihc<15Ol{a0L=uvGINbkF=T_$G zCbbH+Akef6_H7%{H2*$SP5&lJf0%)a@6q}Zm`z;Bd-FsY6HWE-;wh5Yzo4i(HR!5BxRv`L`knEI{SRMA?we9CIk8Ijqs_EQ2>Y!Yi|-TnXqrraRM_v&>Ogf2qR^zsYQ+<7UA z#IO-y>P_cxQj0rGvrXf@2!LUba{V}U`Y+XPRu>g#sLDQiMJ|Tyq61Iew(pAJ)(uL9oXWLv|9AL!cs~r6qYj5$+9u} zS&v&%GD@$vL>URjy7gE|y`KReL9dM8*pX>!uuh zkozT+Je!O5t;-Q=FM_}OC=J~SLlk7~jBesT0cQ|ShZi;iO{aSPF8YG*w>j z%~`x&uVK7;T?HZhUIQ;<^|UEtHfF2`%qo!<_jG&E?zJ0V(Y#vEX%!KG_F%wjPpuUt zfJ)4Y>{(=G{{eik0=AXEK;1((Vb8>`VEeFa?7ETGh8DAALb^E;*-Kie^E8FWl@J8g zdCD#)-6KFEMdy$bb@!EsYKBFWQ&K%K^R%cIOU-y%Pg>+EQeK^XD*C6Ke?xMRe^Y+n z-tWg?JN?5Qqcc!?&sTBq$$vx3+_5;iX9EI__ZL^Tf645_KM6u-P zXaPF;YpQ!=9sEmt1h0?xef-U!HXQtXCtn**@r}E<;)15gF&}HLMt8-#aDKE3ZEw#; z%Y)y<;d{S^iu~(PaBCWN5D04KxoJJ)*={iRt~{BiacKi{7W` z)*cy7iaR{cNb#+-l$3^tM&S6&J7Iry7O;m3<7h2EXO{tqhUWD5=-NzT-etOiD*Fea#a3iaKsk z`jsMj%BSU^@<(4m5002ovPDHLkV1o9p?e+iw 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/bus-ar.png b/B4A/Files/bus-ar.png new file mode 100644 index 0000000000000000000000000000000000000000..60678c7a69fe1d5c375db50128645761f535dee6 GIT binary patch literal 31189 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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..d0629c91e0a4ac2cd74fe6291e29ae97ee031ed5 GIT binary patch literal 46573 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 Je3XmF{s-{}bBzE1 literal 0 HcmV?d00001 diff --git a/B4A/Files/datoscliente.bal b/B4A/Files/datoscliente.bal new file mode 100644 index 0000000000000000000000000000000000000000..81e7a6ec1772df531f061db62a07b56b8c78f2f4 GIT binary patch literal 3719 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 SIO>W30000m@4y 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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 O0000nK?m}Ucl_GT}3@Xi|0JrFijGF4-^UF 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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 zcmc&#&2Jk;6dw~iV46}sS_q&007BZjCQ11$AZo=%4Y&@trja<%PIkxfz-HIloj9bY zNL)|>DX0?S%AG3*4xG5qC^tB9g8u+++|2LyHoFOJih2NHX=dMh^XAR({ob2#Nhvj6 zQ0i`c%NTcI)I4Vg)~($Oxtb{pvF`Uxd?#$drEV11Xg`;mdeH>iYb6*&Pn{AS_|YhA zZ|l$m)8a1TE_cz3@Zk?ISF%Th-0Va2A|D<)(6QB_n_{TIbRA3SqCPjTTHo~;x@YWC&v9chfXx8PB7<1VZuEL zKnA91LqpmVw-!k0Tl4MnwWhST`N$EM!&m5GiP`U6?HOXLH{Phd+w3sdAO~;&+BSfT zjdo{lw$@}dr_*HQl}K;?`s-&Q{F*AN%rBpUa(4d<8!!)FI7S}lM78_`CV_q!!cIm~lUOQ@(+DIw>ELI799b10^Mf zf~+3{YB`%n=4kRr^t+LmN!Wy#;}C9(7<%7=m=jnkpTx9_m0nA;lJxj|J zrW~c}IpOi(TDS)z!7!x_jn{aCc={lzDyT<{l@`$>ruP=0W1(+|0AY;^t=d*=L_QbMv@) z+&o^`hr781H;Jt4rTzd#{_J>TnJ^m9*FlE+=EP5=Do z+g(Q3Y@gq@xAKal>vS(K*2$#nab5=)q`mSBo?gIvZFhR$^PHaDwYIL?&iC9SQhPZc zc$I6^UK@klH}$p8`x2f1z1;=w=xYMt>m244=X(W5YcFSAUV*o<&-ET%b7!l;oy$AN z&hA-=6k-OS(?xYOmJv(8)-jm*i9zywJsNC04G6)$`A%m-}3dcDDhiU5>@9 zs7ba0<^`8%FLQD1+(hiD>+I!#W9V%AKJ9h??23zc&YJVZhS~PY-?&%AYY%grhSl+Zr`Zm z{J7b{*~q~u>tWtIoo@>`0IRTvF3^1~*{(x6>}vDAf;jm+c!XWVu2RjA4v0j~dHc*h zjlFBjNOnaCec1kYo;!Mg>pLKSKEUDcEd1DAxyH`8cTMwFY9}(SqfNVjpPdo7T@l4x zxNWbmv@NVdw|@!Eu5-Kx1e^O_gzmzx??T+K@ASoP;peRD?#qkb*JHcdiMti|*sj~= z?XELgIAB-%Oo2X?Zd%`HSKreEHo+? z52{!CF1vp~xH3Ahiz{9OEopxPu$Oti%=tpC<Co(V&4!zH-JtG5a@TYb z$9;J>?0`M!qC&3=tfN*U|lJX?18|_s?AH#VtJBjv({_ zbQh9B*h{`u<|3@?0!{G(Pw=96h3gae*6UkH)%iWlrDnp*tMsr1ydD|8a2D{sutK-y z>Ripfd-c}!93#35tje4}+FxJBOuHQWUY_ur=Zg&Cw9g$`6ZvDr;jUyST6xNLF9W_Z z^Y{Wh)__>{njP)3v)zjs_FQPvX;&_gR;*zw+uF@OJ>lkR@2}m<1EuJ?{z3fs?ZC_aRI`k*3OoMlJ8sP$V?IiR0TI|k8cOIL$45Z;=Q=s*j&{c*Z>m^r~ z`-<0`(RGfV&glcv>NwLhib-g_SCidbkpZWDuHExRj}Nxwv}f{mQRU_J8KAAXg|z1x z9d>uFMos>bL`ZBSN7zYvvoDU_E*WsT&>N7h%5)F=qI7OoV0Za}mFi-LVHnHXgnfS2 z^&CC$$}QfmE)-pB1Ga~bJ2+1!e3)!s+UMS+b^CO>pATjB%V@s@i_^=-Gv+=rrOIf>@}Hrx~?{yURd~K&3UEgdI0+_ z=`Vr-oBcaoo{P&`xl>&K4CjkCSA7ln>54DxwW1zfx&fPgaM9&}@CA*IF1xaAuWP7$ z+1Kzg?$kw9Jzvl}(zPgN3%^+os_pYwD;K*m_U-1``9@n4Uiv#_x;x#&C26dG@j{_W zGlSigGh9YKd~I!bCE=+GgWDH>eO%?@TTcG%ig_p(GGFF}xI6o)QrZ{rv|IXn=jkci z%Reu(2yP7cfFP)E>%Xzyo5vT-dJ7kINfGkS zmo1;W-DTL_%@VnJ+&nJUbnQXetf|!w#|`H;?H7r}N_NWWL zoTotOpFn>K^b_S<4xG$z*@|#Ck1yov-?wa&uKX;_o=1qYSC)lqQakpx;At&SW{&i; zrGGUu+^sZVYpq$f-jvQ>^y$BQL>_y-{^oIQGeBM*pDl^@Z50b?_1(AdHi6%yboQ5Y zzE$)&7mB_lDYsPpeA{43Ei>dl519Fc&OY3;(f0hBGg}?mbam!j{i1Hk%+?I8m=7pl z=LLJlTUfki{?q*4g(trrLx9%a^w?6HAci`q03fn1v;K6sf_Tk#zJ~M3j z6&1NSI*f$@8d)awY}YxnH-EPKu<0gtvpGn%4LnS5AD{i^=y}I2m$=L>j%t(IpPbJ3 zr3*ZnD<_vlXktgb*XL5d9DnS&q-3UjT|_sBzd;jo}UClp#o!3W*@di z(jK@t|LPT4`J|O3r$ym~<=33w>h`s$oeS=OQ(nHREi1aR@vcefKc^KdVa>U(d3*8g zwtY2Btvz@pJHo0D!3_5N2d|IH^G|-)S%mylN|(FEy{vVcgaNk-&^mOnjTg7X)0bbf z@X0%2vvWRKMq;Y(YVFo*y7t%XiR(Z4GO)weO!~c83U<#YR$caD!?KMNx2x}RT75ch z*EV64VsY`C{P1K~o)gsB(@vb+T4}d??aNjfNVg^gHFASYjdNJ8KF`02wN(;p!KZES z!KOC)wR&Ji9kXdaU$|}6tFhOL-?^r3+bWVY@)sBRFAT35wCiQCJX^zoT1EAyBz0}| zGG1`I*)w#vZJfMY`A&T%%jVj8jcpTCQX9cD?aR09 z0Tz6VX#`ZJJ?C17d24piH358TT#CIy#A|D`1(vfAtW|fh!Y${B*R6mgs!PSTeed#2 z^D1-0v$O4)VsQcmTP*o_c@b zNxf!y=GOaN_1Q4k5#6dFTUHwi!kbq%R!~74fswq3_0_n1~#F&@Uvxq zi^;8nb1#B?FTHVbJS`85&O9ZJ+SMJh25+NpO1>Q1!G3&6)O=zcM>$g$WBa z`Zd_tPG!s&ozUha@xaN|Y$Vx6^7!eIcDryE5&C&yUKDByi47 z-HcSr8d4jFxVF>Gl1w;b&C4Ztg5K4&;r$}aac$4Jm-5?6bbUF1_k2i}jCRg!dnP2G z{XAl_RL9nBw;56eZYvb)JTKZ;7<$X zBKv|Et&=s6DB;uM5}^fpX~s^OWrBvdHORARZ+vzac4gZa->J7-sM#LTzZ;H+PuOlp zK#%OM+0?C-HuvssX^+T2SI_%eU=TZAD+AUiS!`VavW_V8CC%|Dg0xtRify~JVAnCj zOf3Xxab==hyGbpP7sb;iKu7X*wl!E$XF6V9bM$zw4d)&vUA%rT#^Oz=x!l8m`qpmC9EpPvN{Z55s zwvmyVc4=CB<5Ww_y>v}4P=u_V;hfP0#im?{^g4i}3hX0EPn8Eao=+{cV6=l;HYeR?u)Ty+ckb*P=1=QzCB?&pg$G{RCNi&FDr zx+aPosdj5MUb1i1ci96MH$E!k_lh^?V8?l}!ed>8(5ot+OO(bL{+iu* z_ktE7Q_Ze!9vXA9e7^?Ltf9=fI>^l}1J{B(W94&YJ8xPnOK0hb;+;#H4-aKC1M^3SlgnunSBRNQ3kV@>Y zE4L&w5IqMA82RUOIpX~GHvP<5ZlWOhC**RsEMap5>C#T*rMS*T{L;xM3Gi)<<2vSk z;9C-)xtdlP77wPgau>Oz0O|a3)Q!GI>vCm!Ef!imKq;LHTRfyyNxj8f8|$?yi|P1K zi_&g3$eujynbF?mQ2Fdke__mrsDq9eQ6*p7;m>O=7B!sbaP9mSI#!i2o54t%q0 zEtIgT)DjrZ=;k+XLAugFMJLpZC&A({vcTKIEsFN#(0EO1-$k#U-^9sDIs}dDBH$e1 zx{Z?LXs_#eS(S?GbL`n@H)OGAHhhosh5Lj~eav<{Kr-nR+Tv>#>tGX{Rx4)sLtj(< zWdH~*JKCOkGF{@$I7rJx{%VF^2fh%NtKM_@d&5vc&tZduM5TiZ7y0v(%*f}n+H&9X zjOm~9&)izM<)6s4@1#)H7U=RtGFl56R8iJSGJmU9$hvFhW{Xpcu#{b`r{BO*?8tO) zv%j5z=T+yEQvs;Ya zIj)s;9IrdRxFg%xQ#R~uV~@dy=i@$wD>z@T4c`gRRrP_xj5~laO#Eq)jroLvqGv=; zeZZCXr}PumCGa)U@-;{4oLo#6G=ZJ!PsXi1N|tg)Wv<;}v&Hap`gsIB21V7dlVM8%jI~m>YD9n`eXhMFNN03T8&ykik~W!YYz@<{ zb$@yQ{{>xz4d3G#(|Sh6FvnUS(-k?T7o5&*i1blxxWMmqzHUoqxY zI^ewZ&H@ODj{hV2c|gg}eX{CNUa#&N!|zr`k^vTaP)bf27nvmfY-Fx@#VE0FBQKai(y*=E3f(&3*1?`=0h!mQ=HQeu zXDI+`C&8-X9FxpzBA7ss__m0rPH2@s0pGP{LrqZr3b2P2{O?VhQx+S^@ET5XetTqO z^(mz^`q9(voc;Ehg}+8O_zh#e#eaR3Z1@S?<9ErVKV~!%WdXbA9eZPhj4e=J^?4`7 z2a1w=>{J|hHFk?Rs;yOSh*y&Zi*9F)c+K(DKzq|5L($LPc$>52f?ZU!u!nX| zg;p2k3TuhuT}Tj%tqxJaX@pm@rBEol< zGeQ>k+Njb$y!eyiu>?S3r<%b3a|!Yj#E@neAzb^VB1_Dn@*R$o&;I=q+3g%Ezefe3 zkDywEi?-V}Bmw*EkyDlA?++k{Y08jQA_RNoafP3sWFhd=|GvB{mJ4!QUB8+`W8X?O z9&)%$!PKoh?147&Z_r-;4``Ll?3_6aIa?X;(7zuuN5^tbZqI!rei7Tq;pNJX2&_h4 zrQLe<-?-xXEHgtA-{Brd-^1P#X(vu{5h146!7;aHdJd z5j)p>FLN0SZIuQB_+0!8^1BL}bb{heHJ;sJz@}Xgn$%XBpGUzg$6Gp{x*UIh|wUZLpDF(9GTeQ8-cjPYp^(;90u|%gj2_Uy_x|6n%opad5VP3;k zF2E-T-NF-WYNmz|6}hgduilOQhoppO;XMm2EJ2`<~QFPHiAb_jOI@H()eN2Sug`2U?A z7nY+{1dJ=gz+Ei@^s*eHebLTCO(1%{p`SZk2YQvV+`B|newU)2pHs-=p*_eh_Wj!$ z=B$qpUlSmZE_NkF7NhW=tt63fEvm{wUaBz1cBS8t3ct^5riJ9J?0wQ3I;VO~#tXNOGSu z`wYBleWQgv&qI*21tQcjEx~V6nEmUNLVrS$_V*YJd%|$bkt`=%heuL`%B0%#Ef-Xh z++Mp~^$4`*xg{v$Quin^d6O=eBk=!w6fJ+qM&)Y_bVf?~6znJ+9{a{G*MREP9KO1= zyed8$Hrfe<0gOyA9kig2jHr!^5OUMJ?_KR?kD?9JpnWkUPDO#j{^Tm2~oBY#8H^}slmZ3M}tQ7E#i zuAAB<7EEiA{nFRG#ZEY?;{)!v!Df(Dg$2Y<$}$|m zUqhZe@V8R!$iiZE!N|@j51dLPO9DZ8m`T;Hux{=^Cjs4iHtY`KTMPJSg57Q6uz8g6 zxoL0w^NVLg{VK6X&cf`klc#z}=+|G8F+bv{th)$Li)(jU5k}fQ!Ggp`d(3pVyA*f4 zOm_PQ{pJ~+*IyD`|Iy;vIo@SV!xSxWgX3aIk0Lt>b^+a6s{`gF*H2_Qo(+H0Q!uRs zF%0yGx*TQNm8vyNM@&CIHQ*=*&m?H(O0bl%RBOPMSJf`#;&M4GCf7J8nzvEY0}=!w z2FeCn;uvef#XU%%)1P1ucF<6D%Dd9UwwhE`EMs`NTkBO?<^O;I?TJ9I?=Zjj1c-sY z9Sj?_4zR5!@cz{|#CP{XyfyFQn9|yp$j!dSF83As_J2qI_6OW!aEmXR#)tBhgS03m zZy|=#OpH#+gQB^*#gpn_J!e6`ffE78-ER}rc-PP&V*~9=YMyRk8sk0@xP7Am`FcRT z6S$xPe0s4YwbDW2X;oA#S2%h$>?0V=kwM7Z;XFbuA!8C-z8QC@B6XH6|3k8b2OMMn zh+^!Sp}k?G$0;cVC(Gjodh|L;-*dYNObgC7ksZ#h1+S2&o$EkncKb{8%ctyb|AOo` zaD%F@)_9rO>dn0flKtYiz$E9nB*+o$A{K!Bg4~%i_qQ4D$(v*oTU5dM`5%+qf}>KO zZRs}}G~l9kj7jO#;IiC^Y3a+FYxl=c5y=&)yqBLSS+iNRz>@+0DjD-PX(f$h$=@T) z_7l3hN0NA872cK?eNaNp>-h;Nc`_5PQ{`;z1h-OKXeIwt z3^;<6VG*14azk>BT=ehq!@*@V+zaMteONiUV++lj6MN(Q8&9F>E0ist#n``0HuE-{ z%FoG5=isx4Fw(BeK6aK5W~rKEW+uNzKWF~-YxM6cbdY~V&h{_KZcjKy=xRf#Gin%> zpDgC@w9cZJl$b%)CXy^?cr{|%DlLJ5t6X!4^o-jibSNHGm)<0?%%JExttZ(;*K72c zM&&hD4Y=jv1DBhTuQSP6I7q#^wyx6D=+-FVJu2yjX%U-sfFRh$)yM18v4y+@U97V` zKjV!0go_h_p|!7)G5;o&rXG_GzeV+!pOG1VdpHz`Pdh5q!6 zGTT2Q>wTXW){**N+fW|2GUjg)r>nx?PNFcb78N^*T3MNSTJCnb#gdfI=sKTrw9-p5 zMlZ3FL)fm^|%0+E%_oneD5TnZHhl{Q-T&cgX+0M~86>xS~bu>g7c?O2&C1 zr1w(zwo2_N!eb|?ok>NURjcyVOYA)+m03%D$}?^jiZNsuO(*w&t3A(l#bJ1+^1rc301C zu;&8C#2RC>{MZRu>71dxPM-N!D9rvcecF$y)|#R0kr#)SV%=~BXqGX#M|S%redgC` zYq0bo|JIm4rjPxQGw_YUx z`qvWkru}PR%s!aBWc==titmp5+IgF-C34bG|{A{Oe?pBbnS!h-UmQm0{=f=PrHDtL$&TLjS%=Uj1b# z-hS7ZKcSTS35V84YHFF2VxW3xNKt^*43kc>H9Hxv7TR&P238fl)&mDJFL8jdrM>S7 zuT>BGvX|UmWO|J4{>^DcYiCg_LIP5fNobTFJ1L_mde@3(A^Rryld#CTT$xH0b?Qlq zj9Uo|7}=IIH9{uWh=FaR&D}Tn00k3kfdXNbIIBJ?-FBzVJILK(eSI&=_Qn7?>M_?R z2TtB*OMc8T;Vk<5D}-bJ8n+NUCVT#X-10H4@0oP*HTto{51T0^-=VzvF$3vCE!MzZ zxgz-VwW*v%6jR7ACpETnXS{8tg!+a%oNlqT%%Y_aBm)ooQfy<9T)_jSbE`%d7O5R# zTIx6CAB>DS!=Y}uKw@3Zq>~J*ut4t`<$j}%(ANT5D~+(22bcY!SIrDw4(Y%xu&a4* zw<~g9NS+Htt4T3oG&G34X&%P^95eQo1ME}g1H43L{7rJpzd~sCG1F0IKl4*#{=k@j zO)mE%?%X(Le`{0;#5Y80JE*2s1>dTgZ&rOWQYniKwBxIk!M2$JcAHQC3CoW@1Dp4I zP9$@xXu8*vbDE4*WMK_i3)!8o*MQRuSZnIiVU=quiMXR`p*B+JxRX(nkp|;y^#fPi zwu{~)FTcpjY0HI+NGg#_wbf}QE^1-Vs&1U7Cc&E^fUD*rP5%zt`HIqeT9c%A{OQ=(oxARGRK2%b-2LwCU7cj_7%aBE$y=&E64qZF!& zx!cGc$`scl9-DHHZ8#7X^^pF>1_0aWWT?vAr&@1AYRJMYye6%~M53ey+ZFCw<7A&N z!f&*M{Kr|^kl2Q35>I;D{8<;ZhAb{OYS>KkcPcGQZlQThnM ztpMqbZzK7!0VPyloIOvWCz`+$9x=W;t2cg$8~0}Iff+7-OuVi?rwI9P*=XlMLEog; ze}fEThH7W^sZYqNAJNZ84F4FJvU&)ojY1!++)u0MAhHbd+@rbDlLw~U0@msb%Rhig z+sMwrUj_miI(QhKV>jIB)(7c88sf-U>K9M+Ets15GK+N`v)uVH zFOg3uvz>c@-lP9|Hv78_XnVGb$4mta5VZ!`pzC=I!iG%xH9p{(R+*R?dcv2kV>8Q3 zCCDB|&xmnkv}vRde@sU^Z!V8vfJ44J1Fsg{^ow9hZguuxa>&L(UXIPvW}mNDCnp=xHm;vzgPTzFZYq+is%GsfTp%WQ`@RW#XQv!`Msk=Yf=sR z%Bfx6bR)>G zo^qMgNa>~t-kzX{noHJ^Z`=_d?M9|;4pvlTy5b41;39qKVI`!tMhEuHdBD#iz>^j< zPd${`Bi!X6A@K<9r6X9*#07a@(?3YHiR#rZ!rX7vLkJnAZCj}X>N(bnT+Qw<3H{ct z#B~JtCn;UbtdVWx?|rRE+bI^iQ*PGrkC(0+WssbN3OlyF7FcRk?BT)rcaUsH7D=-z zUocXywC8R681D3zKWBt=$btBdhZrfhOb-w&Wcc?kxZJz+*BQBaiO>BRIjbL$xxP&~ z?IYglH?U06Hu3>X+&htLFdHCgM+%SUfptmAl;Xt7O-~cdKlG0*MZcnL3QizhIVPMci zF*O2Z$&Tsw^XA($;G`4}ilwZ1Fnx_I;g#JQZi}<>exSK-;Nn{Fw>f?&I>L@5bG3uL zpp&6~F3AoM1$pp(UU4%zIeyMdki)gpjY+aBog9qPf$%DncV-FTkXbLi8w+YQIO=T z%=02*EV>kWFoRBZ7gcBZV!MB*s&U1_)`%_=B&=-N!~T|R(j70D;x!f=LrcH0pfh1` z>XbF*`MVu#E}tvx|ArJ{x3V_lC7rbhkDbDtJ6RwdYMyp}94p_xkxm|!Cgzw~OGSC`WgIDfIlk0a%>b@qBs({sS3V*&1!7m-q^zubl#o zjKmC+WakWE@L2ol;g=a393Uy}VWk?lRXMHiAQIcikTpB}z^@-9niavfC#8CaR8yzw zA~~t+As4vAhcWxr03NvK*9Qi5p0J_bXBQWx0FvXd4atK6u;SUCd!|YEYGyh2O0Kv@L~%gyHE z|5?dfDi#EiweL5|=_isRA2yjTwvcx2032~FXN2Zq6rcpm`EuyViK^12GLyl-KbK@9v9 zUX!O2I@o8mfI)<0KJ#I-a?3M*W6r{ygo-?PCi}l}A+G0DmGQ}^d}~M8!XqEwDA$cu zJy|_yc3R$7JOrh;WbyMBUpot^Y=YIlfnYU<(*yWn2irsk9t`7x4)$OJOt1Wz`S%^f z5ji(LmKj0Mr_+OcoPiMQ8B>&J2E`MO^G_ucy9d*9HBw&A)lc~pMm2_O0;OW3reh_U zE$6#%%DyWP5IbS`*RYH5Y`P=g`V7L45d99E*k`n6qE$3;V2@@~kWU?`Kt^^o7E-NF z*4Qk3%dyNF0_cHFa^P6rK>{SJ0jez{T(Pa`jkY}6EIBVdwJtKu3 zGq)pbA{`j2XQwqmy!rV`ewS8N;QHPP6V@iFv3LSo^&G7|g1HhSAM}>j;+8Yj0^+i= z9@DG6aKj(C;R`px&BNLAgX}=)WoC=@o(@1x^l}3@*a6l=t|u9As^~Y0UiloSjGV+i zW%bD*<1}=t4u}c{qB|>5im8@87XGuSRRrl{C)t`(u;fR@X9~P(PodWB__l6%G32R^ z8*YlqQBO9iBZgs~F(x;1smVxGuj6H%u{|$keVrs-oI>E5*w_qkY$iCKAUiYzbZ;%RLER)lobkd>+ErQ*JGa&|~zB%itYB z20f$excod9kb`Vm-0*1*u(?|Z)Q{jU3=9NBHa5@uU4SejgCkogKn(D813qV;>8DPn58Dz>i$q0ha6VwKh6iJ() zJP=_&nt))~NsKB$>=31}c9L$S=sI)&x;S3nj&Tty`HWG@`c#{2G7Y0pH9J*#c#=GA z3+1a*z6Be=BL z)bY%)OSZkpfiAKv^I?yGERMWYO=LS0)R|9U2kbc*wo>rGF-&y|uDIYh8Azc&Tgm?w zf1+2#kGaeAWhT((t3S{$d;X1uSf~dEUs%*1j?%N`O=aYdn&9-pIffNP=}EBmI7uuw zK@;T&th!zjBs)2!X5f$NdDox7-twMu%F$Gi=7HS3tOe1*`a{&Gz;!LGOVllLV1yIo zt9l}wWgW~y-NL|vONy{<;246U_jGKx#|%Jrx#q!U`Irk)&p3qX0g}ir?i83+C+q_} zL;z~9RqR?W1ZqSa81d~kkJrP(? z8T&nwy>t!`6U=LJIMZ>!pI?yog`%~_ODx?>MO(*r=R*=C{Y4I;u_lfjsa{6gUhV-= za)S%78!NpI7>f>mdME|uVs8Yr8NV0HYrPW6in5%GHc;@%df4+ukZ2y{erzR1+NrS> z765`%zExXBo@W66KCj(Vb~W?(ufRZ80tLyLDfv3RX5zZQHz4WyC4PR7L$yH?Gb41y zSkB)9c;+DC(;z#`4fHeTfFg1DU}Sr}Wh>217ropOK4FVJh2ecg6I+1n6gTA{;{^mD zEw}+hZLr1`09JHTOd?38x`BiXTdcLXR{*F#0TJzlKViOuw?W?*Cn1i!-4t_MjU2_$ zOA=^a$pfnz{*;KcPr<^wm(=t?EBk32Y>f^&MKagqNVX_B)r920?7ft>G0+W@n>;7z zF0|5|P#w-nzNmxXB)i8>(vJ-UGYJYFJsh5gebjOltmwfZ-7Z)c%K$n{eGE46zXb~AW#t9ry^emd4fu0iy!35xP43dD^LtOnK&CPlj z$grPx<8CC^6w6Q!NF;fJ>yZ*7^b$RDl0bvJB@52e0|(2&n6eHGsnG679A72%u|dvB zw6ZzbLQ%m>wn@)0)$9@<(E59ySjV#%#fPNu_K3A0o&t@*LPS)wD;bz@ZQC*+Mm0`& z$@(g&NQO3x$MoNa(m@#@ht28FZH6cB@>G<0>gOGLK9E?)e1sF!RMEWzPKyGwuRLtu zo(qs4gBX22i$V6gPOtzBfY^mdYNli&w5uU>BeRU4`gJE&2uQL+)e@(lq?7#TtmDx!E|6IUC$N<#CGj&W7TzbX`vDJ>?xjA|r^oz1L3EzGYQ0n; z=_G+^BPrJdrp|%sg55j?QjFz^9Bl`9q_IuC6SfXC`U~Ctt=O3Aa`!W`-JRs z?(F$FU8awq2EK(f*hz9#(Nk$^s$B(9p*33BN*RM#Yy2ucP%9ibrMBh43?{hFS!;T3 z&7aNq6?(p*0Df*ZPCzx=00fm7lzztA)LXElzLq_Eqdi)KNMrYIgIw?iZ1CYMXZONw~BJq?RH5RlwXn`=ybMEA8qU;>@5@3&# z8;l5FRGw2Cwvit)!Jb%56w&h&B48+SQD|1nKgC+tt*t3(=&mee(Qo)_JS4k)hZ{M2 zpom1s`7)jqaxiZF*mE{BiKl96F3333VbfEU<7`z z1OB?9Sod!!@R+rren@-R15RQ`&VhRc9c%GAv#4%Y%*$GMXq7zQm?~0LnJ_BKa!R8s zs%FowrtQ$FZf(n@gn5G5E98Xlu|u9XJb8~ty38thcj@P4z+j`osDfkyM&KB3B^4|{ zWhkTQSV$kC@Z$kHG_sv@lIfCF#KzR_{X9%T*0nn&jk1^6Xlcy#$d7r6KI0RNFagg% z8rTDK#{M=pwG~OD1Cz!`xR8K5l2vstHMlZJ;270BhB~KL{l)Ov0OUk z+wqf)q+!fa^gN&8%Vf8+*wtLH`65cbPuVXGv#3X3`guC*RMr0ugs^+~EtN((t+6WAbW4mpdQC!Wta z@Fx@=e$3E@1O2lsdopr$qhpiKxSIWa*;j-%JThG--;9|@bqwBbk`h}R$r*Ms>aaC2 zx=zN)2EH*s^PORS`6IH@Kc^EubFhC(k;W+E&*et}T3Fdfoz(3w zRQ`(l-PZ=;75XxTV1*w0)XUw$N+81k5_!zy%kEOB{5sifN3rqGNDA*Aj*~m+ddoZb zC>dZGlANVHUL}z1%OFyX)cjM>011F&8Hjrw*jUddYQV`m30xbgzdOQQr3l(_Ms@!> z*$Iz5Ax?^!;WX2zn*Md$u$7?HBy}lrsQf_2~Ysf2zCd2@5rRx+`M4F18cXa zqdKU~4p9Eas*(q)pjWD5MbQ}R-L|HjZa9fWsg(Pq`Scd?PJTqr;XR&?i-h>g8-Q3a zer#@CUqxas!qZoR&HKcd#euJvnm)ac0;S;RDgc3L1yexJ;`owlKCo92|efmp3v&e`o6i%?kPlkQAYR~>&~0V zmWkq@p6Oo!*~rOs)W`@EW4uW!V0j=^4DkCX(J!lnEG<-Y40JI6jL@btH~Vd})t{3Y zpUPf;t6XAL0-`n3(X^dyF`PC?gt@5Y#@et_qb3qWC4PWtS?1*ql1ZW=YpoDga1si= zi;kS(Yg8Q0cKa$_&!6zD@Q?ZJgX9KbCr|*T-Yu{l0!&WG%{K@mMIhUDOu~H)s$6$? z*^De~WMz~zNjh35!&I*Z=tXD-O5k{soW7fT=>pvA5$-t3J4gAhUcC!{gTh^j+rJ+Y znlM7x@1%Z6fMQ{gb%X?E+6{EDeQFUu0t!JfHN(qUk67Y&DrI+axjPBCqpuj`C(MtZ z)9JlMOX~aN6CQE2klFC4w2&mK9%ZhT;P{JSOUUbtvUkG5ZS&Bv*s1K-%9zE<{!*+l zIvA>uV0n3vRyVRV6=mLKp=riQ@=(#IVr1vPx16SM1 zp1a(h)dM3Ro4p5Mi8zS)o!q2QqNryKWp19i#~n+zfVGlo2!UGy1}QUes%Ym9WF@0C zRAfPS&`Rau;FD}V8D%9UD+D;m-UC20ndmxe-#??x@e!xH2Kw-foE(;gK2N!yp$EOe z9QdG*oJE@K+fd8tK>SeKs-*M#In{cPSQ?!0rgN` zKIIPhY#|f(au%d+%b35BHMTj$oss0PlB1hVcfQ)+C)521n8v0?9xNygorHe|NHUN3 zbda5&BTp|!=M?;(phT5DE9qrw{Ty$jaAyxRZ!5ih0+v+(PKX6@zoPfRKsnk;nzU&Q zWH10*AiSKIrS}P2>@&W_19Vv!xkoq&={e}AH>%1tf~n@Bo&7}v*Dew^TZ3VobVT{Y z^jxxRv>#Dm{38N6e@KDcBdJ+wCA`$L;K-cN-(ji5kwuc{4f`P=#yQ2$OoPZz0&oVR zWal|aqtlAMM$!z7s%cwUD#VHo68(@sim_#eo$@JrplZJaqef2I5j|zw-ZH1^HL~6} z>E~5?*V+C33%cNM^X7P)Z`P(ZjoM56!pMF%WY?jnqL&sMrGDtdSaD%gugwa9qskc%ugN!=+!8SL4f^gUWe-{IkR z^Zs!M$YnFcGGFnzfzeA9=%+k8^OQZ+Bk1*7uCicAA)i_J~782Yp%|Z2OqK{V2tZkb>rAC-w-}+{mVj z0D&}ifP5C^JysxRQiN$EHJOtduu#w~J|Pt9EIj^eLP|cO6Q0*u&s^M@*nOAJYRgX^ z^H7}GRx=4XLjQDO1D%|R-BJM7u+X@!&A33Ji?G?%C>iLRQHk5UaB~CwmS>tpXywbUubAHvWoa4(hH^Gh46+FT0|Dpo41o^kl0umu%(8dL~)t(l##4Lk}-LUYQ~zA^Bgr7x^T;;M&9zW-LiW8 zS@APVmrS(ly+)hhHz~h;lb(M}IKm7ioPt2#ynK%&nf{2a^qBk9=JoLev`3ERFi{U7 zagq|Hxt$}+rvwnY$erG!?6{5+-^!`%ksJZ<<c&(TPe13 zLKyPfJV^E-ixT8`;}n`g1DISv4@8rw&OV-`;%?gY#6X6YR6v`Qf~k=ct3$&ki>$a9 zm@=tyj#Hfp2I43yYsC?uudL#|mgOK##ppc&jcyD#XM&t z`x%VVQE+lSM9F8KB;RI~&}>fiM_Jl6Fu!h6AhU-CV=Id(7My?f`B}l@a|2%HeBxv7 zPJBR1=VL0^K4t9msqEP7piUT+K5$a{2?b#_s{GTgn}BQ@oQhCO4UBT3q2`~B>TR&K zF{MuBy#@7BgF^;9RW3!~?2DPQ{?zs2g{ zEjI5XMvrD)s4VPs0-*p!K)Sy;3Y|Jxp6KOtr~pExMj}r}Zq0>R79u2#I14dGQq>?VnOY^P5S7owIa*#S=oZ~u0h(YmTh%Id zhn2E`MZr+N%PKmwmwc%phkz%g0cPdo_+Aoyu~Bxz9lT$qIC*xtj$nm9rrq-s(6R|o zVfOOatZZp=a^{0&M0!#gQv?t=Gy6tH9}SFsNNnCGa%Mt~PB(JTD)>x=v|v$f@^UVr zQQLhdZ%}G;&O@!Ytmv>W#tTjmuX@?Blq;I23Md(6%^4>=BG1Ii8y5kT#tzvLxHMZC zr`QGR?-O#iKcVpKeX`pT810iBii^kO0mn1&f~W?!rJ5dUL5MSQ;)zw$E3IN#RVT`t z26M|u?uTyZYmuUooOxOOieiCwpc!Ohfn3Y++M5g;Svfgh}-usY{{O{6@Fj9s- z0^>ERBOI9^8D#X1a}Ne70oMUxAi@QiAX(_yya#9-o?rHq8`g8Frem<$N}#l$5L-C| z#noz@$z0;2;4tE01Swi#qzboDDxcVxkyK*rVP=g5xz!;}#KAz6$;I^21LlF#8x97@X84w2~OOl{hU@SQDr* z8fcit+5_tSMra&qnX!&w3%z2y+JMupFgq%U%SyVHM#YgN7*!!XM~@SO&s&)M@Cqfm zXBPV{`uA0W0KaFvi##9?%jCcp>G%{hG>QNcxsE#D*zFD8p1F6VD$5@`B zW98)QB$Z-&IUB{oyp^Z`j@as<1TF0@)3^B^APRg|?&KRk^ z=p|L&0z0jf<>NVpzFtL_3{qi%W81F!uK%0nkg>6E!q)KZ=vuPDZLpdnQiJ z;x*r(uz94+Pp zb*i_yia{h`gKwZmI+t4}U=(9+X;;({TTa!;>P}LPN(P|&YR9huG|S5Ae}%BlC?^z3*E90NI#jB-2eaEdXjRLU&LdW|nwTTjfuP9%s9i2kSqLMO6hoMl z7wYBEDwM+NAX(27LpLDX7oi&_$an*%V07@|$PC>;3rCRgVS*~iRw+>vKGiU>8B9l2cfG9poDZI+cVn}4IM7jOh23TdKo-Teu2N6VqK7PmTdq&FZ zV)~Qht`XE^R(yh8eo2~T%O~R^_mt@NGV+?_sMyDLw)8HA+2NTT>LXl8%Pc8=YKE5k#jl zD9`~KmouYKo6Ks!Po_4Kj1W(f7PXA31ey0~I#7iCG=g52SLU6hG;f5QKW~LIMs5EW zIUzCv>&-JV+{^iN0n$+e9x}-)HjaKCB}H+PQ>Tj7f1_%}#km?C0z%9@astOE!5hmnH%SXG`~?rW6j&MkgNRL=c2dEF17UlN(mID63nvK=6H z%{2WYgGIat>53b91u|>pND6@Te7m(|S0}rLt#qnRGHp8r<`qp~1!dJi3&bSj|3b{j zC^eNr=b)GZJ@VT}u!;omudT8D3a#lNH=VF6K98V=UD)tbKto5^OpTJPao{+Ow7$Gh zKefvLSw@eetl6Tu_wd(A4lh4}nL~K310384H+zJj*UQ4-sf1FUL==!m>SQHZ3(Do% zV=q%3WX5_$i**3ucpx^8Dz5f&ARxk_FS8oPSIFhQPOo`~vE|3y2^gU!oFvybr?N=E zK+Z76yATqFQvDaaoB2?~-%vRD#; z=NZ07VUPe3qpqPF8NxZGL>ZKJOl0us4MM8E$;ucHh=2MWYWWBp$`(SF84>Vms#BCG zebIFsq^4h|r~Y`55L4mrM6p^pC2R)i%T%&>e7$tAdHu}jf^+}L1s+Cv< z2Gx^{z@s7;Oj0y6)YzI)0`mEjpRlIt36H;fN?ZBd(|*cbKmimdgKVKSGNSx!meTB< zj-U_{Wm1$IkrUuxMK73xnL4+C`?%v3blODWl4=`^8vA#kOypthck{RPYC=0zpj`x@>_WvcJ)@OXQxA;0BeYfLo zfhZemldNqjdVP1*UmenZx7ojY1C6G)6saq#RdXNfFe=Q9jMep2})B z=&~J}6;BpE&^I_gMsDc&Opm~@vm3zb$tYDHurDn#Nd5`+bv`CC@*`@neL&0L3BP6w zYc0}!;W~L%5hCj8hbSX$HHawlKJ4-4pFqF(An>#4OF>k zR$e7klj~G(mQ|h7M$U!8x&zkg2bpCQ78{_y$0-VZ(c`TH^<1r;WI?#d{Eq-+xeFNQ zJpK41LNwkbHq?>f5_m1iKZm!v85bPdRnW7(n0{+XMD<3JAdj zmOR3SbRt#!a)=&f5aJ-+jgr5G6-6r%xk3p=w=VUvr!3VtdO<2Sry42RNg2KT`7e|G z&&~92@`!_Sn|X(m8k3=|PF@8v!l z>MwYT<-;tq&dy^12IT}PqydO~0+)~)F}bM?&@-^*btw5;WO|8@d!AKkINeVm3fajF z*?}GQe9n_B5?WbIcfblB0c)9LlWNibaI9*!SXJIg#X}V4>{Qob2l1zoRckBpSi_l7Qi)@^~i;LKa-*hO>+y5gN1yy)`(s zI65g!?&Ow{B)hHvrL|!4t<;VVFvEA{jUdpwmfpZWqwBgY?ig zq&&QAc+6qrDOu@HNVVc8JjL<}c!gdOR8M7DE(P`x2oFC4M=VFM z=z)9L=$u<0j^J)>r5do8b;T3eqwJK5zn87mJtS;7_Uj}=!^@1?%Nvj5+Y!3Jz7Q|# z6DSj7r5>G?g1we!g}g#W`!x!ck15sp0nsqtaLMr$z9fvK*K+0_Z1C)h&+56f9 zDJs{TyvzuU^wq95IVnlAw6bPflw`d`&WwsVi%LGC(5)J;k)oUdcx*{h9W&Uw0R%ql zJoZwMd5~kY^5B7}1{W?fIx|Ci&IIqX(f%#{d_YO;2+MM)oo@tL;+*##$w8;Kc5!UG z(Y4hE``Ixc%iU`Pybd|&Bjg(aHkBO9O)@OpaBaB*nNLJG1}X4^Gg%C{aW9G44n&MQ zsd$En8ulAF#)mvW=*8vB{0C$RY}u}6eb!eg#eIWpxTBiTpRzKp=T6tW#BWJVBEs^; zjIjsAsG!jfK;ayqUohZTm-D7k=b$>>tB?WKf~4rmkcaG~ zNK+xKVL)KO$~mb)HHsT4Y@7px4U}gbR53cK`EI}(17S|@&^>*Ngm~YlJ$K}lGt@Mv zszeT)EY|@-QMBAlHT&PU+qpB)&}X6iILWG4&n1~8CuMtpJ#$aYDFAvAxV5?Zx|O0+ zI1&-H?7CX9*8oDkRZ~R_nBt_E1`$Nwu#*|Lm>jF$W0CaNU!A!q?gb&?Kl6|rWJvc?G_)g$N@oRQvnQtoT4MD-f|>0_c{ zyiNH}$GAX{Ie&l~fwtC=!`99d9I0txbJOd!@X$z05U9DI~>=VyKV z+2lSVbNw5l#Jx>7H$az2zbM{P5H`~4qBLq{8Pz9y*yGdjqCrBn4kQ$uENV}(fTp|c zgH*=BZjS&Ro(Vb=dO*<%L0vDYogD}QPVh>sTNd3UK`Ms~;IxBmRF33J@6bK|5}EEi zu;&>MC3&A#?Xhg7D%7pU+UTta5!3)jTh!7DUa?m@dKI74eS9qxx)taeNmOphl3=OR zDD}T2wIH)C9m#2(UQ(Tl-voKgPBO`g5>b!>EJZ+vx~++mn#W|fv$n|(3AT79Lz}(& z$)|RmR;Rl`a&K|&`8gk*g)P>|_9!Q*UI>sRuvMcvwynCO5r$c9IYV}AQ5#U(vd}h& zm4F_4394TE)8(q;lAf;-P7|gI3{QZgvx}6g!B3HUvJsN72(?kk|c?@B0zd`PRC- zM!;NkxfTFatzjO_#XRgE!RRL|r3tXit%LO_YtYp{8QH*;VY}KbM!iG)0Vc zk#cC{RE{nGX$zgJIfmIXyX!U&p`HP%c{JWbstNs&3>c}xgXAY}q1In?3nW>xk2M)u zFJD##8=b2DdFelsgba#{(4r{e1aL&NI$%T;vlJ}^HCW#3l{#N1hZ0VJITt~eQM1A@ zK+rvaIHSw}Y+)3iY2NxD6P@PUERgVkU(nY&qITMCRHW$TfEndxdpZ5^Vjo>*BO@Z3 zTT({gwHC$0NmllZ6wXABagrUaNs5DcNpN%0y%6e@$DpyA?S&2ev(AcQ@p_B1^ zUxS6bqBLe*=tjs$i7T7p* z-1LaJtKVTJ+yf5Qj@$K^osZZEn5%5Z00xY`%A>jXhn`Anto*EK)|GESO~vI2*`Ui!b0z-7Out?!~g~;8Ae%J zA5`eu0csFc>!Ow52)3qpdGHg233`l1k#?ci3W~oqAKr#9@-r$8{0V6Q{w>w^3=f^i zlfKPr&BFr%W?d%_`%AU$_4w@8Sg4LppoW7Z>bz{Kj?x_&;2{)Y^8l{6gH*N{q!y*` z>fjKMWEXw{!h@68kCPE^u9wUMW^XaJe3uM3aftOJLLi^eYmUM2Itk?BT^!^vbg#-S zR^9bt7#c3t0n!jBXSG>b&2}oNjmptgFz z+Jeu7Gf=f+riE`YAP}4Jo(@W>PG0a1@GZlxYzr}ktD#n1ZC0QK#@GbgYbT?viKAZ& z7omglgl;qF;If~>W;Cai^HBIdqEPu0z5*NB))Q;QkIM*{O=IB0Ma9XXjeB(iG`=74 zmCEDoad5Z?i^{6P9Y}!|-PN7y-5DT=iqeG|H6f~?>4e(VNwO7T;I(**Lgm}!a(iCf zpRf+bGw3nw6;H@0Lb#LJBRbMvDi058xlgiB$OC)UNO`9oWO`b~i6qh21Y%tVcrTrl z<3-<90K!gAPO{QdSs2|=3=<9tHnXrW97J$~q|@RIH{>d9B~8Ukm6aoAwtQsFzcJ1Z@l%h@Qs|&)CvE<}J_k<4-8LeUIP`55);n z3y?I&-PQ(t7#R|~T2faSs+Y-sR+$^*heRcqY8AWP$ue&T-C#H%H%JCZ2jcHe1`fy; z!hm*=%FHOlg?fEfjzo8m!eE@=b7QTQ{UHW4qJ!j_%ru(~Rp9@cO!p5dfI4OWd{@rR zm;kQd%kf6&mP@;s7*++$_Coz_RH>+yR5n{sDWgnaEQDm)6{C3vMPSJN^m9;p3&aFE z(7!c6%1_V(X(Xe)xPp_Ej4*t&9goB8*x$|_^Bbnx{DL>>`O@E2ak5c8q6J4EBgU4_ zu#tLzRvHX;+j$wDphReHGm4TAXe8^qAQ(rG?C9a@^*{{9=7FT>`$_d$1+LPc%5OI? zh$G1+Dx(mMWvE$GwI}&Go+a-cA<5r1=J#k0<3rw7j-`((c$Z<3U!e_VlJmq&t&2EI z!4;ie=|aQipya8wx`-{hmu_)LS>&H6K$Ew|NjAGAxrQ)E!sZ;QTjhuntB#}D;JJ-r$ zPgFaFg+TO3YJhB@;@>w2#=VRYIw_~_B_j=)&xNjtkwe%AXnrVUoIBaHoK&c3qyTzS z^FE7g#Y;MuXPWvWa<>1{m_MT%Iy;ZMN?$HX7;oA?K-I&j7wYGZk+Ta&r-G!QE^IfZ z;Q7DHt$#@>$0P3V0c<#h*~C^Jfmgx+LDuoNP=9h#aW6>1fKkKgX74(%k3ELs-ZSp8 ze!!9?o$~6ot?L_LxjV@XL^nGsG2tk?0*tIxST*VrRjdjLJEu|xOnQSX!bjPnlt38| zx!E1?C6EV#(03s>9VAB*eJnOz7in`)1hoLeyB$PZot${!;WY!GQ@>Bm)qlg4d4bA5uG*9dfI=#O?LYybXy(kX@{EAn-pWj9278{Hpo25sqW@N zD?_2igkKI5G=!E(3ZMC2gz}G|jE>1V&UEU4^g96T86__oJAqD^9&Di6jB;7Cx!&f5 za>N#U1XQ8>%u3IiL%p18od6}mIk!obPm}EPvNFN5s<5Gpa$Y9YNGu-!v9t1uSx7pp ztQ>B@t8~z?>7Xi;q?pD8sPDw%>55{$0l`YEIspoldy<9jPI8{`*ieBWCs{ohZP9F$ z0F&=Hlsk(7f13cR?=gY=7RaC{six$V+YILjm|G%y_JVr-w98G>F%&A$UcK1J2q>sw z4qbxyxr6-V2%JM6I~G867W-fV_=7m03?TnlVivnsV%p407R#ETW|PBrC5Ic6?^q)rETW)A}HiId@}rdeU+ zK=2M!0Sc79my}}zY#F0Kbq5~aO5NE4{5<9@I1`~U;lhF75%y>!XV&yAJb1Pd|9_;~ z`NxDcI+iQSyW0qHI1XwpbiDTpm{S9w(oIh3;{0urA8wTpuU36CvXB{7;9Yhjoic_z z!1!>>rsA3Uzf}=wk=USAWv)VDi_C`KJ8+ofKxVP$#dJcpIt%AMQo0`A@%5_wcG+Ow3n=JFKM9#!DE1m zlx-|ZUmIbC6|Y=v_CP5gRS4r{aAbj-g$3j!$u?0oHb=>RpT!SGsssI=G5cgfkuC;hMgNJ6lOq^1?7|@Gn`SJ05xtR#Dr1KUa^vW zg+>x&6O!eY_v}CdXp&@A17tD{5STd0dDuX`-O8CyQ6|6z3AvN45uVTeM9OR8v{Va- zqg4|X#s<9srD`YHiyNRlD3O!+ePjM9<+?v(XycAtxW&0lO3`+`G6Gsg zr;J?HPIA1KKcvIf77J>C10WEn7=}}@HlR6fn4Y=;q$JaWIz_jPEWY!MEOtw4D+11u zXIoB6p4NiIM9-Azt(-Q9^u}Hm2|e^GVyv4aBgIRqbA*)6wdqw=vmln`eW!;q3^EWVDLq%PBa&?A%3XCm?5$3U zU>zyJP$LN;2E1I7Id)Rz6Ia7BgNy=lQgfSZ^-rmm`}-6&Cvdq&PRb6A_|wW6xhq{? zk~vP*@kYtVIA_2dq*7lI@P}HcY!w0FFwfuJQ5r}Sls5u63a^NuErMaz-#KAfT|==k zDs(5vkb}%lgM?BeV4g*9isg90$uR{HG|Cpm$hsFB#Ug9{O*GFBd3+Dl+PsgVv=@kleh z=?I!doorW3a@JlC`5w|g@}%kPzK%H6j8ereg0pf`uCW;ZRRrfzMLiSjfTOI4V!LIM zlPo(m;KEDMLfo(dOiMow4Yi&ty|Bb`0$jMzDppx$G+aCj`^Y6C-L z^TPNN)r9_nvfMu+fXYioO{&G5x@mUWhu(nwL%ufm2ywUxuEzN>ssKd_S4*0rYKbv> zif`>#+-v{sWIHVfe>zWT6EFog_3I%WbY0jSY z$(43a4)Y}Ecm;XoqwK!MM%PQ~H2fTec8VJq)kNkbb;FEo_cy>R=s<;MfD`LwC>X$6 z(4kGTOcJF|$n3#RAm%i(-^xjx1`8_KD-)${XEZJVjAUeEDkd{n7V;n&i*nW*#_cu` zgimlJz3fo4ib>*`GZR7KWCEUZ5Bux}+>wLqbdW>UM%mQebAjgw~2 zkksyPQ#to7-iGchqCrVAE3K-RhJC_U%!#5DzQefMDKUuyqGb!AoRPgZn$uQTY%rJm z=)Bs@P_HyVFo2nco^6q!;@1Oa>!eroFxnf_ut{oSc{xL9fW$R%*qmfD9jaAD*|utA zu@`B&0~C;uCecAFED}Wm)X6)5e2d-3!-Pi*f~l?Ml7cIr*X0IwoQ)iqx`oloWg2rW#~~#z#FLUxZ0vLvL|Uy%m&~RpUQ33gHW(e zIU+EzQF_jRrX_9)!t0|beWqjh9T1Rp_ zOAxco0q`k@#~To-2{3ot$vP+MIrcK6Hi|~(rHVje9gKMceVhF4?@~GUWS!}1y}KmK z+G$aNq#7`{v@$M=l7aYeT!eD14DrHcO4u!h&_+rwU}|1;!+AMF*nxYru+EGm`WskP z15`Wmlg*#;NCzH>!ijNW`vHFHJmG?L%T>{8MW2 zdqf9$R}I-|)pc6jj3_Vi&ic>)67oB|Tzo|xPHkYg#yM{FK>FJ}`yvCf9 znjNkMXrfGG@C$-0({BNGLZGOqo^`N&IMu3V$S-YRM)3rLVYe_5#sk?1TNez>5C|Y) z-@|KyL}hWDQUJBYBnwwT2}DKSCKANG5r~$k9;}BO75ckLR=JG|%Z<7_LH0$O1~E8S zmFF1YC&v6=Wb~Q5ZO!x)hyQ3Ly%eFO|73Pz#5nh`vml^W_qsyCQ__z6IT-+n>M}d^Vi3=s#{QHx+sZ3%Rry4h2na3 z>bjqmUv1=2VqLONa_8=3y`-SaBw$nFf-B^>qI_|zjS+;F4xy=egUVc7G^D|GKF3KHgH_ivx-Ac z|K5hwDeIy}mQTtO@R9$j!$u7fT-J)8F_>?u2=@$-krdl-CZOU@Vn zM%4{l^mBv;Ol=jrwaRqG83;)>+!lkLV~rqb7b}oSRVFNkyujol)g) zNu}0F5d*AhK(nfn;Z>uVX$0p+ey^+1T2d`v@{*uyWYZ6Jd-uu+Cm49`WdooC&9Ewc zZ<5`)MSe8!*Zq_PF@Bf&4IZkWMa8BTu4uNmY3w4)--Xfw1(0KEN|9LdS0Jg1)#M?GRXsW@=OKAj{Fvj?d3fLNP{8~achwgS^g(s-?8J(r^a0q)I~T5x z$zorke{+BTGu9-0Bt?;>3g#=_Bqe_L#>gTrBlWi4ox{9xaMrzkWP)%)sSdfju8Z{}R5v^(F zpk?Pdyvu1cN1Is3T*b!2DYDSWxT6SH5AIOK_J%qQ%kC(e@cWlT~O zK^O3=ruW(Nv@QtoG7`{pG<9_C<#ukN92WtY(e6}(+jxNrP{i&dl4Mt82d0tM8dVXo z%KxwboaGm%_9ts$H?3ba*T&~zLjQt>l04>a`)Ww66(sDgRhw9)^oRoE*Qu#+j*XuY zdFul*-BVzXAV)y2$Rt|@4(NBs=_h*iM!Av?rb$mQg(FAN9Z2(M=Q&ArmpQ)M0*A+| zBh==woMy&a7`21HVpRdXfR~eMOg9n+Fmiu&YB=x-H2N92n!O|v2IZDxBbwdU$WsH! zEa0drPs{8|_}A<&3-`h+u>=b$Vh>2g=66Vj>Rq~4$2^pzY86QeM5Xp%#8Z%xze^VT z23MgTk;Q&QJH;tv85>9rEu_i|(izi1NY&I<-oa``zplAY2iQG#Vr^7`ZDe$M1bjCt zzD>^+?8u?@D4TPgocMzhD+|YL(*;ElcHR8))DYL~pwYysk4n2j13gI>w0dvc4*Vq6;aVQViaXWg}SID-S3(jNh0@}uL zMwmk|fKc2PT=xRLdnpENY9Mx%iMHm6lVE0Q1QJy@vK$__;<2~_g=)FeHQUo(FZPPT zVw8l?1g#n~DE)nMw!cSnz#j4d8XUIV3YcAcmV97R>MaV7zf9J9i)UhdNdEQ-D1NlO z;(|YqYQ^t`B((zOl_#j_eH(5pLE+BGwdkZ&JNIo@EEp3WhN|Z7>+Sx-N-w~GHHaPC z0=!kek*SSNPBkFc$@_u*t5G_!>Opoj%fXJ>D2IR+RWU?0&Ek`)Pi`SzMgdVt&9E{s zH*`Mck0@0B1G3xqxa)WT^GFRPD%;Te56~X`iZQ=LraSY@enCHne8&_0g>6Ww*RDicYdip_)wC>J`u0c{s`1(>7PAPD;5`(W*w((^>@Nh=BYxe35cx5Sd;lG-aX05fkTgf@Vn+SIP7+5g6v|J0cOoI)ml`KBA&YSKnhK^A;+Y>ek_ znTJuC`2wP5RqWb2{!}ZTrACdX`gN`rDc~%nPpCcUUs5giEkdd+nQlS7UasF}{&2>k z&SK+l8uJ>XUq2_j`XiRz$FUMPAbKU|Dc1DmOd~Yd>CmQ{AS-&>0ELN;snnUWw&nCP zlPl~ll-t5+^`g_R7?PN3a!7cK^RXRJb55{}qB^yhA0QuMmd(68-)?qCo!XSC?I|JR+=w=BAaUrp5r64)va;}3x zhaQIJZF!u)D8GGYKVVY3VYLA}0B%>r$>!Xw&jm}y$wWxfvi}KRlzDQ(*_}Q!>EANu z9~$$I=w@H#1NA!g3dNlqjFNU0W0%W6J0p3!u8g$ibMV;yntuM2aH*frLOfPdWD5av zz5-j8{`wj_+gZEsBMOh-B`hicmmnxE^j=MEqbi@o2K8mH+9Zx^%4t!a7oA1RPPst+ zOh)hfHatx0!p10V)ipNdOMM8q=eIb~N{oQb@y1JZ~}d&GY}W$sQ7)~@l=y#nS|lyMk`xhU0SMS;6)y@6?oTlTToT6jR0QmD03>)D7= z!IK!FJeNRqwq*OCabt9V$pg6(IHS9-l0!Z-<9|Y!$1CPVeZ*bawKlwcVYXHXjp7(v zGSnX#^M`~>{e^n?mM8bUnG1>y4#@6e!B2b!Y zx$Xf0^CU-IcTke;S*7%p9qbmqqy&3mlPza@MAggnC|4!r_r8gsSkbpoz` z&6t0m?D@@=yy|QGNVUFDt8hivZm!f_fse@3{uv2hyhSPK69#66T3OYCz{LnY;Vxb9 zuh4aVgI@52EcOG=X&(bW!PdN-Q`T$u33NkSQ^CqknyRl$;KzDSVtdvhjV!@&!tn(b zKQAhGn-m2Ad%O$n5i8rvZQ}%=*W+{I`ac3Te8PqVF_u$0HB)Qg;)tb4G( zjf)m@GWe z$~!aWUnl4MEn|L#JjUHGuEi!Y(Vvjf{)mF)w+T9W$_(58pSmmCvEw$PMK)(-*@|ri zP85H?7kTG-8AW@KFmgFBQvRKsZ-sa zE7(~o=07TT__K1~Uew3)y4=`*l|#I$nasP@3S{EMay$)~#a^Q$UbM7D;v+yS(p`3ex+|zMk9d)f@>>-YvELc~G<>pN6{7!qy)xwg|N9RvL7KVLOY8h>{MJXs8ebNx z{ESLNSxuHO1#z226{;+x`KzbUOh-T$p<>Mlid*v!W- zBJI?U@=*Hpd)vVN#V&iD~H+gBVckPYiZAkL@#`j4i7DL{Gu5EyQ12 zi$D-LO{f(aNC&cg&x;wqELi$?1@$ex-9MHi{iimsysk5K{!j>*KNrLPWBK3`gn#lI zv(=@$^@no)-xk;U&jMm!70~gZDyTfPu((>y_pDsk=e6?bF9nh;${0VFd-Ct%!2es! z^#*wn-wqs`CxN=D^3uFQyvJOJ7@!F>W!^Q{Q;T*!~}-O`_$b|-Mn3xQjWooCfiFTVQs6(uf9VG&q) zR~$~R;x9{S?joV|vUsFV>&IU_W|`+hIhiFESQMMSt0www`TAWoSE@5UCoq^9_?W3! z>C56^zpSz{FUq$|>T>y0KNh2HaclYIl?;e;g_XLR#6iRJY_k~!KBV-j|k(@vg?Zy;otRGW>d8E!!6zwcz5L@paUR3=_M z*K{|jZrh)frMzT8KCP0XpVyZ3RPpEA;_;r$r9W2%iADV7b$RoB-BaGx{+l*n@uNx_-`9kPE5`X{xr+Pp^^1yKmu|Zs zYV+OqH8b~9#UlwOq&hIO0F}Lir4*?z+LkQGo2_&%)yr(tVV~8X#OhAbVzX+IaUCR& zAoj);k-|mPuGk>fJu{sifOZBRdx&VX0pn21eGvL@90XFo0BGcH1~}NHq~SBDkYw27 zeKp9YKl)jD^P+t9wLJa4vOcZCWEr>lQ;k1cH7wN`8OyqPQ+vm5wL&<+d|+%1ZE6Y6 z%Q}8h(;m5w)olX=-&82^x(2R`mACju=;m@R;RygBv& zkA`YG$MIX&Y?Yu1M)V=NEr{4^4{s0!8%o z(R0vSoxu2!mw(Hpx|fQdUuq@O0s$V1JAGFy76*JJu4df)>NC}t+DO648XF%ikxkQX zg^p+D%O%u1JOT8jdP<2;A^EWubqNJid{|zMK^TOH37TUCc0D{F3=?2U6(6@Sjd8sNQoMrWd^&=ku(hL5C(07;1!pw`ux(Pq;|YXw9ZW?CI9;NC z@S&3oYYyR^(vcD2!vt~-dEn|WCdqv~X)5{>kJyPX1rPUOss=gn;;^@{Ge(fk5OXkY ze2ARm4mPVX*+OG*ko6_5e2{rKM<(l}oUhP+7h135MxhJ!h@Yh6OuO$V)y1bY z@=uD-Pt5}pf3&&Zb3ZG$naB9y-2XcQwk58^Zhl0Z16rW4kcrRo!dy#$35H~iL`(x4 zq>wVEe%HQOPf^KAi&Cfd?K_x`hd@_gX>+}1K(^kRfaTQFcObU72^xEm`Bi{9ssYr# z6OFquQQoU)WH$_kX%B=>ypc2VOnzJQh>^oemW+5X?5wOKaTWYC<^eShlTXen(Q~uLU#+uTJrfIYC-l|L&}j^Bdo|E7b~W2^m!2$wJHP8-cm}gwmsjbV;~D{NM+e03CKBx^}!aNQa$S zVg00H;LEGqoSI{l72}<)-_)Wrf?plq^0HN99QhEve01q&C{591kEl8xS2n$Y_|D~k zxrfPf=U5JAkz8oBLQPH21f*36?Uc4oQiqsUFHj&F%)MvM;d!O+^J^L@sAKzKhFNdG zlgd~)6?RU2RN$}nz*!NSUg1D9`9vzg7WeELD>b^2W0`4ntc1CTCLWt;Gs}>EBR*$f z@SJ_88}SmrJXpHyPVftx{C4ZCa0Bkq{I4{&{LD1L%x6A3&bE-6m_=6L7I575q*loc zeswzZY%r6Npin7V%t7eG*Ui~QE1%LA9|4UBmnfWb+_`{+l(FOGaA^TFpP*3ix^KZ5DH0ZXI4D~?u>7=~A-gN`84v#ni@vwk93=&VQ` zvJ`{7f&_lxVK^%iKzB{N<__oCZGK$5yd{sQkC;I`Sv=ZZl(LvlPfCS6LN!t==-)+| zW{7X8GrH099M#^@*hv2h78D7BGp4KCq|)lK+@)R@)6v-~4qX|mt)q{$I$KZMm{U{5 zT?ZRuuqjHL9e4WjFLmTPD6&E3VD7{Ypm~6Enm_@}K{Hq4W`9-6H=W)N=xRwc zJvb{vx$?|2{!U4p55C$=vl|qR=(#Y&Y02B6OP&EK=wUHu>^86dg{%_PqICJ>gUg&x zF)1i>Ao~hV9tY>UG|6)xv6?501*9Q&6q`uRckw)R)V`fn?pt>wJY_}4Rdkmw4@eej zYI(TE+2*6iMdvv~e&4B0!SlrRnbFvyv8gG`r4uHE#EMx()OP%!0&jQ4rl0w=ds3}J zD-gN|+{~-c{DltOMBNz9bH_$P+G2U2NQT+MDOv$@7?>Y=y1Hw z)~VuwO?FglaPy&hpdL;(Nz26R?A%uS;ku*18Oy>)%~u%Dio?f;eqjYwRLd!^GR&Ht z+NECNc&E2HeVO3Q{mE9cTBveRmpY{uJCm$xErbhGwu7M@>`5XU%kIWy-(dJezkIiG-7 z&Yg%_Bx#b8x$ALMi5D{Xt@uc+uDBKM9Wh{RG(#|Ovzp!3eR}42`&P|Q&&W+x>}Il% zy?8TUAyY{F0uwxjtZXK8bUIn^CLcNtkqnCUwr&!YS4|G;VyUt>dO$a@YE#R#B*vvyvXCm~|XypaZ#mzF$(dA)KJ-)CqPc1|% zyW>5l<0^|vRX*kB(*n*Qh~#f0+v|fR^rd?3nRULj`IcAqUB_PSOLyW z2%TUTo0MzCk0+~qKtPNYef;+_IVoh7Q6!amHpi|vr=12!>`O@Fao6`Wuc(Yuw{)7! zXH@rj@4TW-0yaUG;v~0B9l<(MP?=QS!X;~Zwnja={u^=H*@AK=1Fxy+UT66G?Sy3p zZ0;gv*L$!+4kQD{N$d~wnBWFZr(>D->4AHEa^`cQnq-`A{YjjR5v933Of~H^DtF@7OwvpE9IT89 zW8f`W%r^dlKe4`@D&!F0d4|0D`OpBv$Y=rD$17cqJk+F)9x|?+)EUAiwmjFN5=m(T z(|`{4Zv_?p>BJ^|p)Xy(S-wtAp*my1q!8|S)koUWtXtVr_BOJ)N87Dk)po|)o*#!k zdEicI<#zeUxn2#43F-(){cr|vnV}Rvf`dWANhk2k#g^!UdHqj-0RX$c!`qfxqoDu* N002ovPDHLkV1l*Gg!=#h literal 0 HcmV?d00001 diff --git a/B4A/Files/gps20.png b/B4A/Files/gps20.png new file mode 100644 index 0000000000000000000000000000000000000000..23bea1a92b9cbd34ea47ee8ef3e6171580324523 GIT binary patch literal 8326 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 QhyVZp07*qoM6N<$f{fjFRR910 literal 0 HcmV?d00001 diff --git a/B4A/Files/guna-fondo.jpg b/B4A/Files/guna-fondo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a443511ee2d08cb1b4a73bc4ed1909e9c189bed1 GIT binary patch literal 6760 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 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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