From 67195ae824a6ef916c039f0219db04738e4ded0c Mon Sep 17 00:00:00 2001 From: cvaldes1201 Date: Mon, 26 Feb 2024 11:14:22 -0600 Subject: [PATCH] ... --- .gitignore | 3 +- B4A/B4XMainPage.bas | 783 ++++++ B4A/BatteryUtilities.bas | 126 + B4A/C_Cliente.bas | 960 +++++++ B4A/C_Clientes.bas | 246 ++ B4A/C_Historico.bas | 124 + B4A/C_Mapas.bas | 24 + B4A/C_NoVenta.bas | 178 ++ B4A/C_Nota.bas | 245 ++ B4A/C_NuevoCliente.bas | 336 +++ B4A/C_Pedidos.bas | 583 ++++ B4A/C_Principal.bas | 2454 +++++++++++++++++ B4A/C_Productos.bas | 983 +++++++ B4A/C_Promos.bas | 449 +++ B4A/C_RespaldoDiario.bas | 186 ++ B4A/C_Subs.bas | 607 ++++ B4A/C_TicketsDia.bas | 158 ++ B4A/C_UpdateAvailable.bas | 74 + CameraExClass.bas => B4A/CameraExClass2.bas | 171 +- .../DBRequestManager.bas | 17 +- B4A/FileHandler.bas | 162 ++ {Files => B4A/Files}/alert2.png | Bin {Files => B4A/Files}/alerta_amarilla.png | Bin {Files => B4A/Files}/anterior.jpg | Bin {Files => B4A/Files}/carrito.png | Bin B4A/Files/celltitle.bal | Bin 0 -> 1638 bytes B4A/Files/cliente.bal | Bin 0 -> 34659 bytes B4A/Files/clientes.bal | Bin 0 -> 4955 bytes {Files => B4A/Files}/durakelo.png | Bin {Files => B4A/Files}/engrane.jpg | Bin {Files => B4A/Files}/fondo_kmt.jpg | Bin B4A/Files/hacer pedido.jpg | Bin 0 -> 609560 bytes B4A/Files/intmex_logo_192x192.jpg | Bin 0 -> 6004 bytes B4A/Files/intmex_logo_192x192_old.jpg | Bin 0 -> 8284 bytes {Files => B4A/Files}/itembuttonblue.png | Bin kmt.db => B4A/Files/kmt.db | Bin 58368 -> 46080 bytes B4A/Files/login.bal | Bin 0 -> 11649 bytes B4A/Files/logo_192x192.jpg | Bin 0 -> 4238 bytes .../profina.png => B4A/Files/logo_mariana.png | Bin B4A/Files/logo_mariana1.jpeg | Bin 0 -> 9983 bytes B4A/Files/mainpage.bal | Bin 0 -> 1584 bytes {Files => B4A/Files}/malo.jpg | Bin B4A/Files/mapa_rutas.bal | Bin 0 -> 5796 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 -> 6118 bytes B4A/Files/nuevocliente.bal | Bin 0 -> 8611 bytes B4A/Files/nvo cliente.jpg | Bin 0 -> 592665 bytes {Files => B4A/Files}/palomita_verde.png | Bin B4A/Files/pedido.bal | Bin 0 -> 11748 bytes B4A/Files/planfia_logo.png | Bin 0 -> 225383 bytes B4A/Files/principal.bal | Bin 0 -> 46787 bytes B4A/Files/proditem.bal | Bin 0 -> 5141 bytes B4A/Files/proditempromo.bal | Bin 0 -> 5141 bytes B4A/Files/productos.bal | Bin 0 -> 16195 bytes B4A/Files/promociones.bal | Bin 0 -> 9382 bytes B4A/Files/resdia.bal | Bin 0 -> 40003 bytes B4A/Files/resdia.jpg | Bin 0 -> 609996 bytes B4A/Files/salma.jpg | Bin 0 -> 7839 bytes B4A/Files/salma.png | Bin 0 -> 20988 bytes {Files => B4A/Files}/senial.jpg | Bin {Files => B4A/Files}/sync.png | Bin {Files => B4A/Files}/tache_rojo.png | Bin B4A/Files/ticket dia.jpg | Bin 0 -> 588975 bytes B4A/Files/ticketsdia.bal | Bin 0 -> 2656 bytes {Files => B4A/Files}/tiendita.jpg | Bin {Files => B4A/Files}/verde.png | Bin B4A/MAPA_RUTAS.bas | 352 +++ B4A/ManageExternalStorage.bas | 79 + B4A/Mariana.b4a.meta | 87 + B4A/NotificationService.bas | 178 ++ B4A/Profina.b4a | 1139 ++++++++ B4A/Profina.b4a.meta | 87 + B4A/Starter.bas | 160 ++ B4A/Subs.bas | 1317 +++++++++ B4A/Tracker.bas | 297 ++ B4A/appUpdater.bas | 282 ++ BUSCAR.bas | 172 -- EscPosPrinter.bas | 1152 -------- Files/alcancia.png | Bin 2249 -> 0 bytes Files/alerta.jpg | Bin 1459 -> 0 bytes Files/amarillo.png | Bin 10753 -> 0 bytes Files/buscar.bal | Bin 2337 -> 0 bytes Files/detalle_promo.bal | Bin 2738 -> 0 bytes Files/durakelo1.png | Bin 5896 -> 0 bytes Files/fila.bal | Bin 4923 -> 0 bytes Files/foto.bal | Bin 3489 -> 0 bytes Files/guardagestion.bal | Bin 13086 -> 0 bytes Files/guna_viejo.png | Bin 3543 -> 0 bytes Files/info_gral.bal | Bin 29700 -> 0 bytes Files/infonavit1.jpg | Bin 30576 -> 0 bytes Files/kelloggs.png | Bin 4718 -> 0 bytes Files/keymon_logo.png | Bin 10983 -> 0 bytes Files/kmt.db | Bin 58368 -> 0 bytes Files/login.bal | Bin 10098 -> 0 bytes Files/logo sanfer.jpg | Bin 7991 -> 0 bytes Files/logo_exitus1.jpg | Bin 30576 -> 0 bytes Files/mapa.bal | Bin 2101 -> 0 bytes Files/nopago.bal | Bin 6199 -> 0 bytes Files/nuevocliente.bal | Bin 4282 -> 0 bytes Files/pedido.bal | Bin 11743 -> 0 bytes Files/planfia_logo.png | Bin 22355 -> 0 bytes Files/planfia_logo_old.png | Bin 34019 -> 0 bytes Files/planfia_logo_old2.png | Bin 40821 -> 0 bytes Files/productos.bal | Bin 16982 -> 0 bytes Files/qr.bal | Bin 825 -> 0 bytes Files/rechazo.jpg | Bin 10453 -> 0 bytes Files/rojo.png | Bin 10751 -> 0 bytes Files/salma.jpg | Bin 17025 -> 0 bytes Files/salma.png | Bin 5896 -> 0 bytes Files/seleccion.bal | Bin 45254 -> 0 bytes Files/tarjeta.bal | Bin 6923 -> 0 bytes Files/telefonos.bal | Bin 8167 -> 0 bytes Historico.bas | 185 -- QR_MODULE.bas | 98 - README.md | 2 + UserGuide/UsersGuide.pdf | Bin 4832382 -> 0 bytes colonia.bas | 237 -- colonia2.bas | 1057 ------- db/kmt (2).db | Bin 773120 -> 0 bytes db/kmt (3).db | Bin 998400 -> 0 bytes db/kmt (4).db | Bin 1067008 -> 0 bytes db/kmt.db | Bin 310272 -> 0 bytes db/kmtold.db | Bin 505856 -> 0 bytes db/ruta2 | 50 - db/ruta8 | 22 - db/salma.apk | Bin 545959 -> 0 bytes detalle_promo.bas | 138 - fila.bas | 1235 --------- fila2.bas | 138 - foto.bas | 129 - gestion.bas | 267 -- gitpull.bat | 1 + mapas.bas | 51 - nopago.bas | 119 - nuevocliente.bas | 103 - pedidos.bas | 555 ---- primero.bas | 35 - profina3.b4a | 647 ----- prueba | 1 - qr.bas | 97 - seleccion.bas | 2406 ---------------- tarjeta.bas | 316 --- telefonos.bas | 130 - 597 files changed, 12812 insertions(+), 9378 deletions(-) create mode 100644 B4A/B4XMainPage.bas create mode 100644 B4A/BatteryUtilities.bas create mode 100644 B4A/C_Cliente.bas create mode 100644 B4A/C_Clientes.bas create mode 100644 B4A/C_Historico.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 rename CameraExClass.bas => B4A/CameraExClass2.bas (63%) rename DBRequestManager.bas => B4A/DBRequestManager.bas (93%) create mode 100644 B4A/FileHandler.bas rename {Files => B4A/Files}/alert2.png (100%) rename {Files => B4A/Files}/alerta_amarilla.png (100%) rename {Files => B4A/Files}/anterior.jpg (100%) rename {Files => B4A/Files}/carrito.png (100%) create mode 100644 B4A/Files/celltitle.bal create mode 100644 B4A/Files/cliente.bal create mode 100644 B4A/Files/clientes.bal rename {Files => B4A/Files}/durakelo.png (100%) rename {Files => B4A/Files}/engrane.jpg (100%) rename {Files => B4A/Files}/fondo_kmt.jpg (100%) create mode 100644 B4A/Files/hacer pedido.jpg create mode 100644 B4A/Files/intmex_logo_192x192.jpg create mode 100644 B4A/Files/intmex_logo_192x192_old.jpg rename {Files => B4A/Files}/itembuttonblue.png (100%) rename kmt.db => B4A/Files/kmt.db (71%) create mode 100644 B4A/Files/login.bal create mode 100644 B4A/Files/logo_192x192.jpg rename Files/profina.png => B4A/Files/logo_mariana.png (100%) create mode 100644 B4A/Files/logo_mariana1.jpeg create mode 100644 B4A/Files/mainpage.bal rename {Files => B4A/Files}/malo.jpg (100%) create mode 100644 B4A/Files/mapa_rutas.bal 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/nuevocliente.bal create mode 100644 B4A/Files/nvo cliente.jpg rename {Files => B4A/Files}/palomita_verde.png (100%) 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/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/salma.jpg create mode 100644 B4A/Files/salma.png rename {Files => B4A/Files}/senial.jpg (100%) rename {Files => B4A/Files}/sync.png (100%) rename {Files => B4A/Files}/tache_rojo.png (100%) create mode 100644 B4A/Files/ticket dia.jpg create mode 100644 B4A/Files/ticketsdia.bal rename {Files => B4A/Files}/tiendita.jpg (100%) rename {Files => B4A/Files}/verde.png (100%) create mode 100644 B4A/MAPA_RUTAS.bas create mode 100644 B4A/ManageExternalStorage.bas create mode 100644 B4A/Mariana.b4a.meta create mode 100644 B4A/NotificationService.bas create mode 100644 B4A/Profina.b4a create mode 100644 B4A/Profina.b4a.meta create mode 100644 B4A/Starter.bas create mode 100644 B4A/Subs.bas create mode 100644 B4A/Tracker.bas create mode 100644 B4A/appUpdater.bas delete mode 100644 BUSCAR.bas delete mode 100644 EscPosPrinter.bas delete mode 100644 Files/alcancia.png delete mode 100644 Files/alerta.jpg delete mode 100644 Files/amarillo.png delete mode 100644 Files/buscar.bal delete mode 100644 Files/detalle_promo.bal delete mode 100644 Files/durakelo1.png delete mode 100644 Files/fila.bal delete mode 100644 Files/foto.bal delete mode 100644 Files/guardagestion.bal delete mode 100644 Files/guna_viejo.png delete mode 100644 Files/info_gral.bal delete mode 100644 Files/infonavit1.jpg delete mode 100644 Files/kelloggs.png delete mode 100644 Files/keymon_logo.png delete mode 100644 Files/kmt.db delete mode 100644 Files/login.bal delete mode 100644 Files/logo sanfer.jpg delete mode 100644 Files/logo_exitus1.jpg delete mode 100644 Files/mapa.bal delete mode 100644 Files/nopago.bal delete mode 100644 Files/nuevocliente.bal delete mode 100644 Files/pedido.bal delete mode 100644 Files/planfia_logo.png delete mode 100644 Files/planfia_logo_old.png delete mode 100644 Files/planfia_logo_old2.png delete mode 100644 Files/productos.bal delete mode 100644 Files/qr.bal delete mode 100644 Files/rechazo.jpg delete mode 100644 Files/rojo.png delete mode 100644 Files/salma.jpg delete mode 100644 Files/salma.png delete mode 100644 Files/seleccion.bal delete mode 100644 Files/tarjeta.bal delete mode 100644 Files/telefonos.bal delete mode 100644 Historico.bas delete mode 100644 QR_MODULE.bas create mode 100644 README.md delete mode 100644 UserGuide/UsersGuide.pdf delete mode 100644 colonia.bas delete mode 100644 colonia2.bas delete mode 100644 db/kmt (2).db delete mode 100644 db/kmt (3).db delete mode 100644 db/kmt (4).db delete mode 100644 db/kmt.db delete mode 100644 db/kmtold.db delete mode 100644 db/ruta2 delete mode 100644 db/ruta8 delete mode 100644 db/salma.apk delete mode 100644 detalle_promo.bas delete mode 100644 fila.bas delete mode 100644 fila2.bas delete mode 100644 foto.bas delete mode 100644 gestion.bas create mode 100644 gitpull.bat delete mode 100644 mapas.bas delete mode 100644 nopago.bas delete mode 100644 nuevocliente.bas delete mode 100644 pedidos.bas delete mode 100644 primero.bas delete mode 100644 profina3.b4a delete mode 100644 prueba delete mode 100644 qr.bas delete mode 100644 seleccion.bas delete mode 100644 tarjeta.bas delete mode 100644 telefonos.bas diff --git a/.gitignore b/.gitignore index 618d244..af94e9d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ **/Objects -**/AutoBackups -*.meta \ No newline at end of file +**/AutoBackups \ No newline at end of file diff --git a/B4A/B4XMainPage.bas b/B4A/B4XMainPage.bas new file mode 100644 index 0000000..b0317f4 --- /dev/null +++ b/B4A/B4XMainPage.bas @@ -0,0 +1,783 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=9.85 +@EndOfDesignText@ +#Region Shared Files +'#CustomBuildAction: folders ready, %WINDIR%\System32\Robocopy.exe,"..\..\Shared Files" "..\Files" + 'Ctrl + click to sync files: ide://run?file=%WINDIR%\System32\Robocopy.exe&args=..\..\Shared+Files&args=..\Files&FilesSync=True + 'Ctrl + click to export as zip: ide://run?File=%B4X%\Zipper.jar&Args=Project.zip + '########################################################################################################### + '###################### PULL ############################################################# + 'Ctrl + click ide://run?file=%WINDIR%\System32\cmd.exe&Args=/c&Args=git&Args=pull + '########################################################################################################### + '###################### PUSH ############################################################# + 'Ctrl + click ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=github&Args=..\..\ + '########################################################################################################### + '###################### PUSH TORTOISE GIT ######################################################### + 'Ctrl + click ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=TortoiseGitProc&Args=/command:commit&Args=/path:"./../../"&Args=/closeonend:2 + '########################################################################################################### +#End Region + +'Ctrl + click ide://run?file=%WINDIR%\System32\cmd.exe&Args=/c&Args=github&Args=..\..\ + +Sub Class_Globals + Private Root As B4XView + Private xui As XUI +' Dim ks As kms_helperSubs + 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 + + Dim reqManager As DBRequestManager + Dim s As C_Subs + 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 Starter.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 + Dim et_server As EditText + Private b_server As Button + Private b_envioBD As Button + Public Provider As FileProvider + Public rutaBDBackup As String = "" + Dim MES1 As ManageExternalStorage + Dim device As Phone + Private b_importarBD As Button +End Sub + +Public Sub Initialize +' B4XPages.GetManager.LogEvents = True +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + B4XPages.GetManager.LogEvents = True + Root = Root1 + Root.LoadLayout("login") + s.Initialize(Me, "Subs") + B4XPages.SetTitle(Me, "PROFINA Preventa") + login.Initialize + B4XPages.AddPage("Login", login) + principal.Initialize + B4XPages.AddPage("Principal", principal) + clientes.Initialize + B4XPages.AddPage("Clientes", clientes) + cliente.Initialize + B4XPages.AddPage("Cliente", cliente) + productos.Initialize + B4XPages.AddPage("Productos", productos) + updateAvailable.Initialize + B4XPages.AddPage("updateAvailable", updateAvailable) + mapas.Initialize + B4XPages.AddPage("Mapas", mapas) + nuevoCliente.Initialize + B4XPages.AddPage("NuevoCliente", nuevoCliente) + ticketsDia.Initialize + B4XPages.AddPage("TicketsDia", ticketsDia) + noVenta.Initialize + B4XPages.AddPage("NoVenta", noVenta) + nota.Initialize + B4XPages.AddPage("Nota", nota) + pedidos.Initialize + B4XPages.AddPage("Pedidos", pedidos) + promos.Initialize + B4XPages.AddPage("Promos", promos) + historico.Initialize + B4XPages.AddPage("Historico", historico) + ruta = Starter.ruta + +' Dim px As B4XView = xui.CreatePanel("") +' px.SetLayoutAnimated(0, 500, 30, 200dip, 45dip) +' px.Color = Colors.Cyan +' Dim tf As Label +' tf.Initialize("") +' tf.TextSize = 20 +' tf.Color = Colors.gray +' tf.Gravity = Gravity.CENTER_VERTICAL +' tf.Text = "Hola" +' px.AddView(tf, 0, 0, px.Width - 10dip, px.Height) +' B4XPages.GetManager.ActionBar.RunMethod("setCustomView", Array(px)) +' B4XPages.GetManager.ActionBar.RunMethod("setDisplayOptions", Array(16, 16)) + + 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") + Log(File.DirAssets) + LogColor("copiamos kmt.db de "&File.DirAssets & " a " & ruta,Colors.Green) + End If +' Log(ruta) +' Starter.skmt.Initialize(ruta,"kmt.db", True) + s.guardaAppInfo(Starter.skmt) + Starter.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)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_GPS (HGDATE TEXT, HGLAT TEXT, HGLON TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_STAY_STORE (HSS_CODIGO TEXT, HSS_IN TEXT, HSS_OUT TEXT, HSS_TOT TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_STAY_OUT (HSO_INI TEXT, HSO_FIN TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS INVENT_X_ENVIAR (ALMACEN TEXT, PROID TEXT, CANTIDAD TEXT)") + Starter.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)") + Starter.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)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_GEOCERCA (HGCLIENTE TEXT, HGDATE TEXT, HGLAT TEXT, HGLON TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_FACE (HFCLIENTE TEXT, HFALIAS TEXT, HFRUTA TEXT, HFALMACEN TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS RUTA_GPS(FECHA INTEGER, LAT TEXT, LON TEXT)") + Starter.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") + Starter.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") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_MARCAS_CUOTAS (HMC_MARCA TEXT, HMC_TOTAL TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS HIST_CODIGO_BARRAS(CODIGOKMTS TEXT, CODIGOB TEXT, LAT TEXT, LON TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS ABONOS (a_usuario TEXT, a_ruta TEXT, a_cliente TEXT, a_abono TEXT, a_fecha TEXT, a_enviado TEXT)") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS CAT_GIRO(GIRO TEXT)") +' Starter.skmt.ExecNonQuery("drop table kmt_info") + Starter.skmt.ExecNonQuery("CREATE TABLE IF NOT EXISTS kmt_info (CAT_CL_FOTO BLOB, CAT_CL_NUM_SERIEFISICO TEXT, CAT_CL_MTOCOMPRA TEXT, CAT_CL_CEDIS TEXT, CAT_CL_LAT TEXT, CAT_CL_LONG TEXT, CAT_CL_FBAJA TEXT, CAT_CL_FALTA TEXT, CAT_CL_CP TEXT, CAT_CL_EDO TEXT, CAT_CL_MUNI TEXT, CAT_CL_COLONIA TEXT, CAT_CL_CALLE2 TEXT, CAT_CL_CALLE1 TEXT, CAT_CL_NOINT TEXT, CAT_CL_NOEXT TEXT, CAT_CL_CALLE TEXT, CAT_CL_EMAIL TEXT, CAT_CL_TELEFONO TEXT, CAT_CL_ATIENTE2 TEXT, CAT_CL_ATIENDE1 TEXT, CAT_CL_NOMBRE TEXT, CAT_CL_GIRO TEXT, CAT_CL_DIAS_VISITA TEXT, CAT_CL_TIPO_RUTA TEXT, CAT_CL_RUTA TEXT, CAT_CL_CODIGO TEXT, gestion NUMERIC, CAT_CL_DIASEMANA TEXT, CAT_CL_SECUENCIA INT)") + Subs.agregaColumna("PEDIDO", "PE_ENVIO_OK", "TEXT") + Try 'Intentamos usar "pragma_table_info" para revisar si existe la columna "CAT_CL_DIASEMANA" en la tabla + c=Starter.skmt.ExecQuery("SELECT COUNT(*) AS fCol FROM pragma_table_info('kmt_info') WHERE name='CAT_CL_DIASEMANA'") + c.Position = 0 + If c.GetString("fCol") = 0 Then 'Si no esta la columna FECHA la agregamos + Starter.skmt.ExecNonQuery("ALTER TABLE kmt_info ADD COLUMN CAT_CL_DIASEMANA TEXT") + End If + Catch 'Si no funciona "pragma_table_info" lo hacemos con try/catch + Try + Starter.skmt.ExecNonQuery("ALTER TABLE kmt_info ADD COLUMN CAT_CL_DIASEMANA TEXT") + Catch + Log(LastException) + End Try + End Try + Try 'Intentamos usar "pragma_table_info" para revisar si existe la columna "CAT_GP_TIPOPROD2" en la tabla + c=Starter.skmt.ExecQuery("SELECT COUNT(*) AS fCol FROM pragma_table_info('CAT_GUNAPROD') WHERE name='CAT_GP_TIPOPROD2'") + c.Position = 0 + If c.GetString("fCol") = 0 Then 'Si no esta la columna FECHA la agregamos + Starter.skmt.ExecNonQuery("ALTER TABLE CAT_GUNAPROD ADD COLUMN CAT_GP_TIPOPROD2 TEXT") + End If + Catch 'Si no funciona "pragma_table_info" lo hacemos con try/catch + Try + Starter.skmt.ExecNonQuery("ALTER TABLE CAT_GUNAPROD ADD COLUMN CAT_GP_TIPOPROD2 TEXT") + Catch + Log(LastException) + End Try + End Try + Try 'Intentamos usar "pragma_table_info" para revisar si existe la columna "CAT_CL_SECUENCIA" en la tabla + c=Starter.skmt.ExecQuery("SELECT COUNT(*) AS fCol FROM pragma_table_info('kmt_info') WHERE name='CAT_CL_SECUENCIA'") + c.Position = 0 + If c.GetString("fCol") = 0 Then 'Si no esta la columna FECHA la agregamos + Starter.skmt.ExecNonQuery("ALTER TABLE kmt_info ADD COLUMN CAT_CL_SECUENCIA INT") + End If + Catch 'Si no funciona "pragma_table_info" lo hacemos con try/catch + Try + Starter.skmt.ExecNonQuery("ALTER TABLE kmt_info ADD COLUMN CAT_CL_SECUENCIA INT") + Catch + Log(LastException) + End Try + End Try + c=Starter.skmt.ExecQuery("select COUNT(*) AS CUANTOS from HIST_STAY_OUT ") + C.Position = 0 + If c.GetString("CUANTOS") = 0 Then + Starter.skmt.ExecNonQuery("INSERT INTO HIST_STAY_OUT(HSO_INI, HSO_FIN) VALUES (0,0)") + End If + C.Close + l_version.Text = Application.VersionName + 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_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 Activity_PermissionResult (Permission As String, Result As Boolean) +' If Result Then +' StartService(Tracker) + '' Log("Start Tracker") +' Else +' ToastMessageShow("No permission", True) +' End If + p_appUpdate.Visible = False + MES1.Initialize(Me, "MES1") + ' get the device SDK version + Dim SdkVersion As Int = device.SdkVersion + ' Choose which permission to request in order to access external storgage + If SdkVersion < 30 Then +' Log("SDK = " & SdkVersion & " : Requesting WRITE_EXTERNAL_STORAGE permission") + Dim rp As RuntimePermissions + rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE) ' Implicit read capability if granted + Wait For Activity_PermissionResult (Permission As String, Result As Boolean) +' Log($"PERMISSION_WRITE_EXTERNAL_STORAGE = ${Result}"$) + Else +' Log("SDK = " & SdkVersion & " : Requesting MANAGE_EXTERNAL_STORAGE permission") +' Log("On Entry MANAGE_EXTERNAL_STORAGE = " & MES1.HasPermission) + If Not(MES1.HasPermission) Then + MsgboxAsync("This app requires access to all files, please enable the option", "Manage All Files") + Wait For Msgbox_Result(Res As Int) +' Log("Getting permission") + MES1.GetPermission + Wait For MES_StorageAvailable + End If + End If +End Sub + +Sub B4XPage_Appear + + If Starter.muestraProgreso = 1 Then + muestraProgreso("Descargando actualización") + Starter.muestraProgreso = 0 + End If + Dim ph As Phone 'Get Id Device + Dim DeviceID As String = ph.GetSettings("android_id").ToUpperCase + LogColor($"////////////////// DeviceID: ${DeviceID} ////////////////// "$, Colors.Blue) + DBReqServer = Starter.DBReqServer + reqManager.Initialize(Me, Starter.DBReqServer) + 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=Starter.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=Starter.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 'ignore + 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(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 +' ks.Initialize(Me, "ks") +' ks.vacuum +' ks.centraEtiqueta(l_version, Root.Width) +End Sub + +Sub ks_etiquetaCentrada(success As Boolean) + If success Then Log("Etiqueta Centrada") Else Log("Etiqueta Centrada") +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub Entrar_Click + Dim r As Reflector + Dim Api As Int + Dim PP As Phone + user.Text = user.Text.Trim + 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=Starter.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 + Starter.skmt.ExecNonQuery2("UPDATE CAT_CODIGOS SET CAT_CO_PONDERACION = 1 WHERE CAT_CO_ACCION = ? AND CAT_CO_RESULTADO = 2", Array As String ("SERVER")) + Starter.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 + Starter.skmt.ExecNonQuery2("UPDATE CAT_CODIGOS SET CAT_CO_PONDERACION = 1 WHERE CAT_CO_ACCION = ? AND CAT_CO_RESULTADO = 1", Array As String ("SERVER")) + Starter.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=Starter.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 + Starter.skmt.ExecNonQuery("delete from usuarioa") + Starter.skmt.ExecNonQuery2("INSERT INTO USUARIOA VALUES (?,?)", Array As Object(user.Text, pass.Text)) + Starter.skmt.ExecNonQuery("delete from cat_almacen") + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_ALMACEN(ID_ALMACEN) VALUES (?)", Array As Object (pass.Text)) + Starter.skmt.ExecNonQuery("delete from VERSION") + Starter.skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object ("2.1")) + B4XPages.ShowPage("Clientes") + else if user.Text = "BERNA1" Then + Starter.skmt.ExecNonQuery("delete from usuarioa") + Starter.skmt.ExecNonQuery2("INSERT INTO USUARIOA VALUES (?,?)", Array As Object(user.Text, "1")) + Starter.skmt.ExecNonQuery("delete from cat_almacen") + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_ALMACEN(ID_ALMACEN) VALUES (?)", Array As Object ("1")) + Starter.skmt.ExecNonQuery("delete from VERSION") + Starter.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=Starter.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_guna_PRO" '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_guna_PRO" + 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_guna_PRO" '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_PRO" + reqManager.ExecuteQuery(cmd , 0, "version") + Else + usuario = user.Text + B4XPages.ShowPage("Principal") + End If +End Sub + +Sub JobDone(Job As HttpJob) + Log("JOBDONE MAINPAGE - " & 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 result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "version" Then 'query tag + For Each records() As Object In result.Rows + Starter.skmt.ExecNonQuery("delete from VERSION") + Dim CAT_VE_VERSION As String = records(result.Columns.Get("CAT_VE_VERSION")) + Starter.skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object (CAT_VE_VERSION)) + Next + End If + + If result.Tag = "select_fechat" Then 'query tag + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + Log("select_fechat: " & k & ": " & records(result.Columns.Get(k))) + Next + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "agencia" Then 'query tag + For Each records() As Object In result.Rows + Dim ID_ALMACEN As String = records(result.Columns.Get("ID_ALMACEN")) + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim result As DBResult = reqManager.HandleJob(Job) + If result.Tag = "fecha" Then 'query tag + For Each records() As Object In result.Rows + Dim FECHA_HOY As String = records(result.Columns.Get("FECHA")) + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("FECHA")) + Starter.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 + 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 + Starter.skmt.ExecNonQuery("delete from usuarioa") + Starter.skmt.ExecNonQuery2("INSERT INTO USUARIOA VALUES (?,?)", Array As Object(user.Text, pass.Text)) + Starter.skmt.ExecNonQuery("delete from cat_almacen") + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_ALMACEN(ID_ALMACEN) VALUES (?)", Array As Object (ID_ALMACEN)) + 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 + Starter.skmt.ExecNonQuery("delete from usuarioa") + Starter.skmt.ExecNonQuery2("INSERT INTO USUARIOA VALUES (?,?)", Array As Object(user.Text, pass.Text)) + Starter.skmt.ExecNonQuery("delete from cat_almacen") + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_ALMACEN(ID_ALMACEN) VALUES (?)", Array As Object (ID_ALMACEN)) + usuario = user.Text + B4XPages.ShowPage("Clientes") + Else If name = "OKExpirado"& IMEI Then + Msgbox("Usuario Expirado llamar al administrador","") 'ignore + Else If name = "OKCancelado"& IMEI Then + Msgbox("Usuario Cancelado llamar al administrador","") 'ignore + Else + Msgbox("Usuario o password No validos","") 'ignore + End If + paso1 = 0 + Else IF name = "OKActivo" Then + Msgbox("Telefono no VALIDO!","") 'ignore + Else + Msgbox("Usuario o password No validos","") 'ignore + End If + End If + End If +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub + Log("closreq") + Sleep(0) + If p_appUpdate.Visible Then + Log("update visible") + 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=Starter.skmt.ExecQuery2("select count(*) as EXISTE1 from usuarioa where usuario = ?", Array As String(user.Text)) + c.Position=0 + existe = c.GetString("EXISTE1") + c.Close + If existe > 0 Then + c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + Else + usuario = "SINUSUARIO" + End If +End Sub + +'#if Java +'import java.util.concurrent.Callable; +'import com.google.android.gms.ads.identifier.AdvertisingIdClient; +'import com.google.android.gms.ads.identifier.AdvertisingIdClient.Info; +' +'public static void GetAdvertisingId() { +' BA.runAsync(processBA, mostCurrent, "advertisingid_ready", new Object[] {false, ""} +' , new Callable() { +' @Override +' public Object[] call() throws Exception { +' String id = AdvertisingIdClient.getAdvertisingIdInfo(mostCurrent).getId(); +' return new Object[] {true, id}; +' } +' }); } +'#End If + +Sub copiaDB + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_WRITE_EXTERNAL_STORAGE) + Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) + Dim theDir As String = "" + If Result Then +' Private x As String +' If File.ExternalWritable Then +' x = File.DirRootExternal +' Else +' x = File.DirInternal +' End If + Dim theDir As String + Try + File.MakeDir(File.DirRootExternal,"kmts") + theDir = "/kmts" + Catch + theDir = "" + End Try + Try + File.Copy(File.DirInternal,"kmt.db",File.DirRootExternal&theDir, "profina_kmt.db") + ToastMessageShow("Listo, copiado a " & File.DirRootExternal&theDir & "/profina_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 + lv_server.AddSingleLine("http://keymon.lat:1781") + If user.Text = "KMTS1" Then lv_server.AddSingleLine("http://11.0.0.89:1781") +' l_server.Text = Starter.DBReqServer + et_server.Text = Starter.DBReqServer + If user.Text = "KMTS1" Then b_importarBD.Visible = True Else b_importarBD.Visible = False + Subs.panelVisible(p_appUpdate,0,0) +End Sub + +Sub b_regesar_Click + p_appUpdate.Visible = False + Subs.panelVisible(p_Main,0,0) +End Sub + +Sub i_engrane_LongClick + copiaDB +End Sub + +Sub B_SERVER_Click + Starter.DBReqServer = et_server.text + If Logger Then Log("Inicializamos reqManager con " & Starter.DBReqServer) + reqManager.Initialize(Me, Starter.DBReqServer) + CallSubDelayed2(Starter, "reinicializaReqManager", Starter.DBReqServer) + s.reqManagerReInit 'Inicializamos el reqManager de C_Subs. + Subs.panelVisible(p_Main,0,0) + p_appUpdate.Visible = False +' Entrar.Visible = True +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 + +'Enviamos la base de datos por correo o Whatsapp +Private Sub b_envioBD_Click +' copiaDB +' Sleep(1000) + Dim FileName As String = "kmt.db" + 'copy the shared file to the shared folder + Log("xxxxxx:"&Provider.SharedFolder) + Sleep(1000) + File.Copy(File.DirInternal, FileName, Provider.SharedFolder, FileName) + Dim email As Email + email.To.Add("cheveguerra@gmail.com") + email.Subject = "subject" + 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 + +'Revisa si la aplicación tiene permiso para acceder a las notificaciones. +Sub CheckNotificationAccess As Boolean + 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 + +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 \ No newline at end of file diff --git a/B4A/BatteryUtilities.bas b/B4A/BatteryUtilities.bas new file mode 100644 index 0000000..53902d5 --- /dev/null +++ b/B4A/BatteryUtilities.bas @@ -0,0 +1,126 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=9.5 +@EndOfDesignText@ +'Class module +Sub Class_Globals + Private nativeMe As JavaObject + +End Sub +'Initializes the object. +Public Sub Initialize + nativeMe = Me +End Sub +'Return information about the battery status. It returns the following 11 values in an integer Array: +'EXTRA_LEVEL = current battery level, from 0 To EXTRA_SCALE. +'EXTRA_SCALE = the maximum battery level possible. +'EXTRA_HEALTH = the current health constant. +'EXTRA_ICON_SMALL = the resource ID of a small status bar icon indicating the current battery state. +'EXTRA_PLUGGED = whether the device is plugged into a Power source; 0 means it is on battery, other constants are different types of Power sources. +'EXTRA_STATUS = the current status constant. +'EXTRA_TEMPERATURE = the current battery temperature. +'EXTRA_VOLTAGE = the current battery voltage level. +'A value indicating if the battery is being charged or fully charged (If neither it returns 0 Else it returns 1) +'A value indicating if it is charging via USB (0 = Not USB, 2 = USB) +'A value indicating if it is charging via AC (0 = Not AC, 1 = AC) +Public Sub getBatteryInformation () As Int() + + Dim batteryInfo(11) As Int + batteryInfo = nativeMe.RunMethod("getBatteryInformation",Null) + Return batteryInfo + +End Sub + +Public Sub getBatteryTechnolgy() As String + + Dim batterytech As String + batterytech = nativeMe.RunMethod("getBatteryTechnology",Null) + Return batterytech + +End Sub + + + +#If Java + +import android.os.BatteryManager; +import android.os.Bundle; +import android.app.Activity; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; + + public int[] getBatteryInformation() { + + int[] mybat = new int[11]; + + Intent batteryIntent = ba.context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + + int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); + mybat[0] = level; + int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); + mybat[1] = scale; + int health = batteryIntent.getIntExtra(BatteryManager.EXTRA_HEALTH,-1); + mybat[2] = health; + int icon_small = batteryIntent.getIntExtra(BatteryManager.EXTRA_ICON_SMALL,-1); + mybat[3] = icon_small; + int plugged = batteryIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED,-1); + mybat[4] = plugged; +// boolean present = batteryIntent.getExtras().getBoolean(BatteryManager.EXTRA_PRESENT); + int status = batteryIntent.getIntExtra(BatteryManager.EXTRA_STATUS,-1); + mybat[5] = status; +// String technology = batteryIntent.getExtras().getString(BatteryManager.EXTRA_TECHNOLOGY); +// BA.Log("Technology = " + technology); + int temperature = batteryIntent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE,-1); + mybat[6] = temperature; + int voltage = batteryIntent.getIntExtra(BatteryManager.EXTRA_VOLTAGE,-1); + mybat[7] = voltage; +// int ac = batteryIntent.getIntExtra("plugged",BatteryManager.BATTERY_PLUGGED_AC); +// mybat[8] = ac; +// int usb = batteryIntent.getIntExtra("plugged",BatteryManager.BATTERY_PLUGGED_USB); +// mybat[9] = usb; + + boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || + status == BatteryManager.BATTERY_STATUS_FULL; + mybat[8] = 0; + if (isCharging == true) { + mybat[8] = 1; + } + + // How are we charging? + mybat[9] = 0; + mybat[10] = 0; + int chargePlug = batteryIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); + boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; + if (usbCharge == true) { + mybat[9] = 2; + } + + boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; + if (acCharge == true) { + mybat[10] = 1; + } + + return mybat; + } + + + public String getBatteryTechnology() { + + Intent batteryIntent = ba.context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + + String technology = batteryIntent.getExtras().getString(BatteryManager.EXTRA_TECHNOLOGY); + + return technology; + } + + + + + + + +#End If \ No newline at end of file diff --git a/B4A/C_Cliente.bas b/B4A/C_Cliente.bas new file mode 100644 index 0000000..47a16b7 --- /dev/null +++ b/B4A/C_Cliente.bas @@ -0,0 +1,960 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=11.5 +@EndOfDesignText@ +Sub MODS 'ignore + 'V3.04.10 - Se agregó código para el registro de abonos, en B4XMainPage se genera la tabla y aquí se agregó el panel p_abonos para ralizar el abono, y el codigo en el sub "mandaPendientes" para cambiar la bandera de enviado en el abono. +End Sub + +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore + Private p_cliente As Panel + Dim reqManager As DBRequestManager + Dim cmd As DBCommand + Dim ime As IME + + Dim g As GPS + Dim ruta As String + Dim skmt As SQL + Dim clie_id As String + Dim sDate,sTime As String + Dim usuario As String + Dim total_cliente As String + Dim m_lat, m_lon As String + Dim btAdmin As BluetoothAdmin + Dim cmp20 As Serial + Dim printer As TextWriter + Dim PairedDevices As Map + Dim L As List + Dim TAMANO As Int + Dim ESPACIO As Int + Dim BLANCO As String + Dim cuenta As String + Dim tipo_venta As String = "PREVENTA" + Dim MAC_IMPRESORA As String + + Dim c As Cursor + Dim s As Cursor + Dim DD As Cursor + Dim c2 As Cursor + Dim ListView1 As ListView + Dim la_cuenta As Label + Dim La_nombre As Label + Dim la_Calle As Label + Dim la_numero As Label + Dim la_nint As Label + Dim la_edo As Label + Dim la_pob As Label + Dim la_col As Label + Dim la_cp As Label + Dim la_zona As Label + Dim gest As Button + Dim la_saldotot As Label + Dim la_saldooper As Label + + Dim Tels As Button + Dim Label10 As Label + Dim Label11 As Label + + Dim Tar As Button + + Dim la_comm As Label + Dim la_actdte As Label + Dim la_usuario As Label + Dim la_resultado As Label + Dim l_entre1 As Label + Dim l_entre2 As Label + Dim l_atiende As Label + Dim l_atiende2 As Label + Dim DATOS As Button + Dim Guardar As Button + Dim NUEVO As Button + ' Dim lat_gps, lon_gps As String + + Dim l_total As Label + Dim c2 As Cursor + Dim S2 As Cursor + Private s As Cursor + Dim res As String + Private HIST As Button + Private MONTO_COMPRA As String + Private META As String + Private META2 As String + Private VERIFICA As String + Private L_QR As Label + Private BT_QR As Button + 'Private qr As QRCode + Dim CODIGO As String + + Private b_mapa As Button + Dim CUANTOS As String + Private B_IMP As Button + Dim Toggla As Toggle + Dim tgl As Toggle + Private Panel1 As Panel + Private I_COMPRA As EditText + Private B_GUARDA_C As Button + Private b_venta As Button + Dim ALMACEN As String + Private LA_GPS As Label + Private B_E_NEXT As Button + Private E_RES_E As EditText + Private t_tenc As Label + Private Panel2 As Panel + Private CONTADOR_E As String + Private HR_RES1 As String + Private HR_RES2 As String + Private HR_RES3 As String + Private EXISTE As String + Private TELEFONO As String + + Private RB1 As RadioButton + Private RB2 As RadioButton + Private RB3 As RadioButton + Private RB4 As RadioButton + Private RB5 As RadioButton + + Private stay_hh As String + Private stay_mi As String + Private stay_ss As String + + Private LA_GEO As Label + Dim result As Int + Private cercavalor As String + Private LA_RUTA As String + + Private b_like As Button + Private B_GPS As Button + Dim 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 + Private Label20 As Label + Private l_calle1 As Label + Private l_ubicacion2 As Label + 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) + B4XPages.SetTitle(Me, $"${Subs.capitalizar(B4XPages.GetPageId(Me))} - ${Application.VersionName}"$) + Root = Root1 + 'load the layout to Root +' Activity.RemoveAllViews + Root.LoadLayout("cliente") + l_version.Text = Application.VersionName + Subs.centraPanel(Panel1, Root.Width) + 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)") + 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_NOEXT") + l_entre2.Text = c.GetString("CAT_CL_NOINT") + 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") + Label20.Text = c.GetString("CAT_CL_CP") + End If + c.Close + s.Close + btAdmin.Initialize("BlueTeeth") + cmp20.Initialize("Printer") +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub B4XPage_Appear + reqManager.Initialize(Me, Starter.DBReqServer) +' 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) + Tels.Visible = True + gest.Visible = True + 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 + cb_factura.Checked = False + p_abono.Visible = False + Subs.centraPanel(p_abono, Root.Width) + 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,CAT_CL_NUM_SERIEFISICO 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, PC_FACTURA FROM PEDIDO_CLIENTE INNER JOIN PEDIDO ON PEDIDO_CLIENTE.PC_CLIENTE = PEDIDO.PE_CLIENTE WHERE (PE_CLIENTE IN (Select cuenta from cuentaa))") + 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") + la_col.Text = c.GetString("CAT_CL_COLONIA") + la_edo.Text = c.GetString("CAT_CL_EDO") + l_entre1.Text = c.GetString("CAT_CL_NOEXT") + l_entre2.Text = c.GetString("CAT_CL_NOINT") + l_atiende.Text = c.GetString("CAT_CL_ATIENDE1") + l_atiende2.Text = c.GetString("CAT_CL_ATIENTE2") + Label20.Text = c.GetString("CAT_CL_CP") + l_calle1.Text = c.GetString("CAT_CL_CALLE1") + 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=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=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 = 1200 - MONTO_COMPRA + Else + META2 = 1200 + End If + If META2 < 1 Then + META2 = "CUBIERTO" + End If + la_saldooper.Text = META2 + c=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=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=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") + + 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") + 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 + 'Si el cliente es nuevo, no aparece el boton de venta + If la_cuenta.text.SubString2(0,1) = "N" Then gest.Visible = False + If LA_GPS.TextColor = Colors.Blue Then + Tels.Visible = True + gest.Visible = True + Else + Tels.Visible = False + gest.Visible = False + End If +End Sub + +Sub GPS_LocationChanged (Location1 As Location) +' LogColor($"Entrando a Cliente.GPS_LocationChanged"$, Colors.red) + If Tracker.FLP.GetLastKnownLocation.IsInitialized And Tracker.FLP.GetLastKnownLocation.Latitude <> 0 Then + B4XPages.MainPage.lat_gps = Tracker.FLP.GetLastKnownLocation.Latitude + B4XPages.MainPage.lon_gps = Tracker.FLP.GetLastKnownLocation.Longitude +' Log("Coords set to: " & B4XPages.MainPage.lat_gps & " and " & B4XPages.MainPage.lon_gps) + End If + + Dim l1, l2 As Location + l1.Initialize2(B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps) +' Log($"Coordenadas de la tienda - lat:${m_lat}, lon:${m_lon}"$) + l2.Initialize2(m_lat, m_lon) + + BT_QR.Enabled = True + LA_GPS.TextColor = Colors.Blue + LA_GPS.Text = "CON UBICACION GPS" +' B_GPS.Enabled = True + 'now we need the distance between our location and the target location + Dim distance As Long + distance = l1.DistanceTo(l2) 'the result is in meter + gest.Visible = True + Log(distance) + If distance < 30 Then + Tels.Visible = True + gest.Visible = True + LA_GEO.TextColor = Colors.Blue + Else If distance > 30 Then + Tels.Visible = False + gest.Visible = False + LA_GEO.TextColor = Colors.Red + End If + LA_GEO.Text= $"$1.2{distance/1000} kms"$ + skmt.ExecNonQuery("DELETE FROM HIST_GPS") + skmt.ExecNonQuery2("INSERT INTO HIST_GPS (HGDATE, HGLAT, HGLON) VALUES(?,?,?) ", Array As Object (sDate & sTime, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps)) + + l_ubicacion2.TextSize = 13 + l_ubicacion2.Text = $"Precisión GPS $1.0{Location1.Accuracy} m"$ + If Location1.Accuracy > 200 Then + l_ubicacion2.TextColor = Colors.Red + l_ubicacion2.TextSize = 16 + l_ubicacion2.Text = $"Mala señal $1.0{Location1.Accuracy} m"$ + End If + + CallSubDelayed(Tracker, "CreateLocationRequest") +End Sub + +Sub ListView1_ItemLongClick (Position As Int, Value As Object) + +End Sub + +Sub gest_Click + B4XPages.MainPage.tipo_venta = "PREVENTA" + + 'Si hay mapa de productos es que hay venta en proceso, entonces borramos la actual para meter la nueva. +' If B4XPages.MainPage.productos.prodsMap.IsInitialized And B4XPages.MainPage.productos.prodsMap.Size > 0 Then Subs.borraPedidoClienteActual + + B4XPages.ShowPage("productos") +End Sub + +Sub Tels_Click + B4XPages.ShowPage("NoVenta") +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub +' BACK key pressed +' Return True To close, False To cancel +' Log($"venimosDeTicketsDia=${venimosDeTicketsDia}"$) + If IsNumber(l_total.text) And l_total.text <> "0" 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 + ToastMessageShow("Por favor presione GUARDAR para continuar", True) +' venimosDeTicketsDia = False +' B4XPages.ShowPage("Clientes") +' 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 + + If l_total.Text = Null Or l_total.Text = "null" Then + B4XPages.ShowPage("Principal") + Log("aqui no guarde nada") + Else If l_total.Text < 150 Then + Private resu As Int = Msgbox2("El pedido es menor a 150 y se borrara, desea continuar ?","Atención", "Continuar", "", "Cancelar",LoadBitmap(File.DirAssets,"alert2.png")) + + If resu = DialogResponse.POSITIVE Then + Subs.borraPedidoClienteActual + ToastMessageShow("Venta Borrada", False) + B4XPage_Appear + End If + + Else + + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c.Close + c=skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + c.Close + c = skmt.ExecQuery("Select sum(pe_costo_tot) As TOTAL_CLIE, SUM(PE_CANT) As CANT_CLIE, COUNT(*) As CUANTOS, PC_ENVIO_OK FROM PEDIDO left join PEDIDO_CLIENTE Where pc_cliente = pe_cliente And PE_CLIENTE IN (Select cuenta from cuentaa)") + c.Position=0 + If c.GetString("CUANTOS") > 0 Then + Private cbFactura As Int = 0 + If cb_factura.Checked Then cbFactura = 1 + skmt.ExecNonQuery("delete from NOVENTA where NV_CLIENTE In (select cuenta from cuentaa)") + skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + 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, c.GetString("PC_ENVIO_OK"), cbFactura)) + 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) + 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)) + ' skmt.ExecNonQuery("UPDATE HIST_STAY_STORE set HSS_TOT = HSS_OUT - HSS_IN where HSS_CODIGO In (select cuenta from cuentaa)") + Try + c=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") + 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)) + 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!!! + + B4XPages.MainPage.productos.reiniciarlistaProds = True + B4XPages.MainPage.productos.prodsMap.Initialize + B4XPages.MainPage.promos.promosMap.Initialize + B4XPages.ShowPage("Principal") + 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=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 + 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 + 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 + TAMANO = 0 + ESPACIO = 21 + BLANCO = " " + printer.Initialize(cmp20.OutputStream) + printer.WriteLine("DURAKELO S.A. de C.V.") + printer.WriteLine("RFC: DUR-011025-T12") + printer.WriteLine("Tel.: 618-826-0104") + printer.WriteLine("Vendedor: KMTS ") + printer.WriteLine("Tienda: " & La_nombre.Text) + printer.WriteLine("-----------PREVENTA-----------") + s=skmt.ExecQuery("select PE_PRONOMBRE, PE_CANT, length(pe_cant) as L_CANT, PE_COSTOU, length(PE_COSTOU) as L_COSTOU, PE_COSTO_TOT, length(PE_COSTO_TOT) as L_COSTO_TOT FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") + If S.RowCount>0 Then + For i=0 To S.RowCount -1 + S.Position=i + printer.WriteLine(s.GetString("PE_CANT") & " " & s.GetString("PE_PRONOMBRE")) + TAMANO = s.GetLong("L_CANT") + TAMANO + TAMANO = s.GetLong("L_COSTOU") + TAMANO + TAMANO = s.GetLong("L_COSTO_TOT") + TAMANO + ESPACIO = ESPACIO - TAMANO + For E=0 To ESPACIO -1 + BLANCO = " " & BLANCO + Next + printer.WriteLine(BLANCO & s.GETSTRING("PE_CANT") & " X $" & s.GETSTRING("PE_COSTOU") & " $" & s.GETSTRING("PE_COSTO_TOT") ) + TAMANO = 0 + ESPACIO = 21 + BLANCO = " " + Next + End If + s.Close + printer.WriteLine("Total Preventa: $" & total_cliente) + printer.WriteLine("------------VENTA-------------") + printer.WriteLine(" ") + printer.WriteLine("TOTAL: $" & total_cliente) + printer.WriteLine(" ") + printer.WriteLine("----ESTE TICKET NO ES UN -----") + printer.WriteLine("--COMPROBANTE FISCAL, SOLO ES-") + printer.WriteLine("--------INFORMATIVO-----------") + printer.WriteLine("------------------------------") + printer.WriteLine(" ") + printer.Flush +' printer.Close +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=skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c.Close + c=skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + c.Close + 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)) + 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=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=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 +' 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 +' 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 + 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 +' 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 +' Log("MandaPendientes") +' 'PEDIDO (Pendientes) +' c=skmt.ExecQuery("SELECT PE_ENVIO_OK, PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_FECHA, PE_USUARIO, PE_COSTO_SIN, PE_RUTA, PE_DESC, PE_FOLIO FROM PEDIDO where PE_ENVIO_OK <> 1") +' Log($"Pedido PENDIENTE: ${c.RowCount}"$) +' If c.RowCount > 0 Then +' For i = 0 To c.RowCount -1 +' c.Position=i +' Dim cmd As DBCommand +' +'' cmd.Initialize +''' cmd.Name = "DELETE_PEDIDO_MARDS_PE" +'' cmd.Parameters = Array As Object(ALMACEN, B4XPages.MainPage.principal.l_ruta.text,c.GetString("PE_CLIENTE") ) +'' reqManager.ExecuteCommand(cmd , "DEL_PE") +' +' cmd.Initialize +' cmd.Name = "insert_pedido_PRO" +' 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"),"PREVENTA") +' reqManager.ExecuteCommand(cmd , $"ins_pedidosPendientes_prods_${c.GetString("PE_CLIENTE")}"$) +' Next +' End If +' +' 'PEDIDO_CLIENTE (Pendientes) +' c = 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, PC_ENVIO_OK FROM PEDIDO_CLIENTE where PC_ENVIO_OK <> 1") +' Log($"Pedido_Cliente PENDIENTE: ${c.RowCount}"$) +' If c.RowCount > 0 Then +' For i = 0 To c.RowCount - 1 +' c.Position = i +' Log($"**************** PC_ENVIO_OK: ${c.GetString("PC_ENVIO_OK")} "$) +' Dim cmd As DBCommand +'' cmd.Initialize +'' cmd.Name = "DELETE_PEDIDO_MARDS_PC" +'' cmd.Parameters = Array As Object(ALMACEN, B4XPages.MainPage.principal.l_ruta.text,c.GetString("PC_CLIENTE") ) +'' reqManager.ExecuteCommand(cmd , "DEL_PC") +' +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "insert_pedidos_PRO" +' 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, B4XPages.MainPage.principal.l_ruta.text, C.GetString("PC_COSTO_SIN"), C.GetString("PC_FACTURA")) +' reqManager.ExecuteCommand(cmd , $"ins_pedidosPendientes_head_${c.GetString("PC_CLIENTE")}"$) +' Next +' End If +' +'' 'ABONOS +'' Dim ab As Cursor = 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_PRO" +'' 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")}"$) +'' Log($"ins_abonosPendientes_${ab.GetString("a_cliente")}"$) +'' Next +'' End If +'' ab.Close +' +'' BANDERA FACTURA (Pendientes) +'' c=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 +'End Sub + +Sub JobDone(Job As HttpJob) + Log("JOBDONE CLIENTE . " & Job.Success) + If Job.Success = False Then +' ToastMessageShow("Error: " & Job.ErrorMessage, True) +' LogColor("JobDone Error: '" & reqManager.HandleJob(Job).tag, Colors.red) 'Mod por CHV - 211027 + 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 + Private cliente As String= resultado.Tag + cliente = cliente.SubString(cliente.IndexOf("_")+24) + Log($"Cliente1:${cliente}"$) + For Each records() As Object In resultado.Rows + For Each k As String In resultado.Columns.Keys + Log(resultado.Tag & ": " & k & ": " & records(resultado.Columns.Get(k))) + Next + Next + skmt.ExecNonQuery($"UPDATE PEDIDO_CLIENTE set PC_ENVIO_OK = 1 where PC_CLIENTE = '${cliente}'"$) + 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 + Private cliente As String= resultado.Tag + cliente = cliente.SubString(cliente.IndexOf("_")+25) + 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 + skmt.ExecNonQuery($"UPDATE PEDIDO set PE_ENVIO_OK = 1 where PE_CLIENTE = '${cliente}'"$) + 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 + skmt.ExecNonQuery($"UPDATE ABONOS set a_enviado = 1 where a_cliente = '${cliente}'"$) + 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 <> "" 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 + 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 \ No newline at end of file diff --git a/B4A/C_Clientes.bas b/B4A/C_Clientes.bas new file mode 100644 index 0000000..aaebe45 --- /dev/null +++ b/B4A/C_Clientes.bas @@ -0,0 +1,246 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=11.5 +@EndOfDesignText@ +Sub Mods + '20230526 - + +End Sub + +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 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 +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 + B4XPages.SetTitle(Me, $"Clientes - ${Application.VersionName}"$) + busca.Text = "" + entro ="2" + colonia = 0 + c=Starter.skmt.ExecQuery("select CAT_CL_NOMBRE, CAT_CL_CALLE, CAT_CL_CODIGO, CAT_CL_NOEXT, CAT_CL_CALLE1 from kmt_info where gestion = 0 ORDER BY CAT_CL_CODIGO") + ListView1.Clear +' Log("LIMPIAMOS LISTVIEW") + lfila.Text = "NOMBRE" + If c.RowCount>0 Then + Dim label1 As Label + label1 = ListView1.TwoLinesLayout.Label + label1.TextSize = 14 + label1.TextColor = Colors.Black + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 14 + label2.TextColor = Colors.Black + label2.Height = 50dip + label2.Width = ListView1.Width * 0.99 + ListView1.TwoLinesLayout.ItemHeight = 85dip + For i=0 To c.RowCount -1 + c.Position=i +' Log($"${c.GetString("CAT_CL_CODIGO")}, ${c.GetString("CAT_CL_NOMBRE")}"$) +' ListView1.AddTwoLines(c.GetString("CAT_CL_CODIGO") & " - " & c.GetString("CAT_CL_SECUENCIA"), c.GetString("CAT_CL_NOMBRE") & ", " & c.GetString("CAT_CL_CALLE") & ", " & c.GetString("CAT_CL_NOEXT")) + ListView1.AddTwoLines(c.GetString("CAT_CL_CODIGO") , c.GetString("CAT_CL_NOMBRE") & CRLF & "Calle: " & c.GetString("CAT_CL_CALLE")& ", No. ext.:" & c.GetString("CAT_CL_NOEXT")) + Next + End If + c.Close + p_clientes.Height = Root.Height + ListView1.Height = Root.Height * 0.75 + entro = "4" +End Sub + +Sub ListView1_ItemClick (Position As Int, Value As Object) + Private value2() As String = Regex.Split(" - ", Value) + + If colonia = 0 Then + colonia = value2(0) + End If + + Log("-------------------------------" & value2(0)) + + If entro = "2" Then + c2=Starter.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(value2(0))) + 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=Starter.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(value2(0), 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 + Starter.skmt.ExecNonQuery("delete from CUENTAA") + Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object(value2(0))) + DateTime.TimeFormat = "HHmmss" + STIME=DateTime.Time(DateTime.Now) + + s=Starter.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 + Starter.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 + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_STAY_STORE(HSS_CODIGO, HSS_IN , HSS_OUT , HSS_TOT) VALUES (?,0,0,0)", Array As Object (value2(0))) + Starter.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 + Starter.skmt.ExecNonQuery2("UPDATE HIST_STAY_OUT set HSO_INI = ? where HSO_INI = 0 ", Array As Object(STIME)) + DateTime.TimeFormat = "HH:mm:ss" + + Subs.guardaClienteHoraInicio(value2(0)) + + 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) +' Log($"${Old} - ${New}"$) + If Old <> "" And New <> "" Then +' Log("BUSCA_TEXTCHANGED") + q_buscar = "%" & busca.Text & "%" + c2=Starter.skmt.ExecQuery2("select CAT_CL_NOMBRE, CAT_CL_CALLE,CAT_CL_NOEXT, CAT_CL_CODIGO, CAT_CL_CALLE from kmt_info 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" +' Log("=========================================================================") + If c2.RowCount > 0 Then + Dim label1 As Label + label1 = ListView1.TwoLinesLayout.Label + label1.TextSize = 14 + label1.TextColor = Colors.DarkGray + Dim label2 As Label + label2 = ListView1.TwoLinesLayout.SecondLabel + label2.TextSize = 14 + label2.Height = 50dip + label2.Width = ListView1.Width * 0.99 + label2.TextColor = Colors.DarkGray +' ListView1.TwoLinesLayout.ItemHeight = 350dip + For i=0 To c2.RowCount -1 + c2.Position=i +' Log($"${c2.GetString("CAT_CL_CODIGO")} - ${c2.GetString("CAT_CL_NOMBRE")}"$) +' ListView1.AddTwoLines(c2.GetString("CAT_CL_CODIGO"), c2.GetString("CAT_CL_NOMBRE") &" CALLE: "& c2.GetString("CAT_CL_CALLE")) +' ListView1.AddTwoLines(c2.GetString("CAT_CL_CODIGO"), c2.GetString("CAT_CL_NOMBRE") & CRLF & c2.GetString("CAT_CL_CALLE")) + ListView1.AddTwoLines(c2.GetString("CAT_CL_CODIGO") , c2.GetString("CAT_CL_NOMBRE") & CRLF & "Calle: " & c2.GetString("CAT_CL_CALLE")& ", No. ext.:" & c2.GetString("CAT_CL_NOEXT")) + + 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=Starter.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=Starter.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 + Starter.skmt.ExecNonQuery("delete from CUENTAA") + Starter.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 \ No newline at end of file diff --git a/B4A/C_Historico.bas b/B4A/C_Historico.bas new file mode 100644 index 0000000..c4d9456 --- /dev/null +++ b/B4A/C_Historico.bas @@ -0,0 +1,124 @@ +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) + B4XPages.SetTitle(Me, $"${Subs.capitalizar(B4XPages.GetPageId(Me))} - ${Application.VersionName}"$) + 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=Starter.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=Starter.skmt.ExecQuery("select HVD_CLIENTE,HVD_PRONOMBRE,HVD_CANT,HVD_COSTO_TOT from HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) order by HVD_PRONOMBRE asc") + 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=Starter.skmt.ExecQuery("select SUM(HVD_CANT) AS PC_NOART, SUM(HVD_COSTO_TOT) AS PC_MONTO from HIST_VENTAS where HVD_CLIENTE in (Select CUENTA from cuentaa)") + 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_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..bf12ce4 --- /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 + + Private stay_hh As String + Private stay_mi As String + Private stay_ss As String + Dim reqManager As DBRequestManager +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("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 +' 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 + reqManager.Initialize(Me, Starter.DBReqServer) + 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 +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=Starter.skmt.ExecQuery("select CUENTA from cuentaa") + c.Position = 0 + cuenta = c.GetString("CUENTA") + c=Starter.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c=Starter.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 + Starter.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 + + + Starter.skmt.ExecNonQuery("delete from pedido_cliente where pc_cliente in (Select CUENTA from cuentaa)") + Starter.skmt.ExecNonQuery("delete from pedido where pe_cliente in (Select CUENTA from cuentaa)") + + Starter.skmt.ExecNonQuery2("INSERT INTO NOVENTA (NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON,NV_ENVIO) VALUES(?,?,?,?,?,?,?,0) ", Array As Object (cuenta,sDate & sTime, usuario, motivo,e_comm.text, B4XPages.MainPage.lat_gps, B4XPages.MainPage.lon_gps)) + Starter.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) + Starter.skmt.ExecNonQuery2("UPDATE HIST_STAY_STORE set HSS_OUT = ? where HSS_CODIGO In (select cuenta from cuentaa)", Array As Object(sTime)) + ' Starter.skmt.ExecNonQuery("UPDATE HIST_STAY_STORE set HSS_TOT = HSS_OUT - HSS_IN where HSS_CODIGO In (select cuenta from cuentaa)") + + c=Starter.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") + + Starter.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)) + Starter.skmt.ExecNonQuery2("UPDATE HIST_STAY_OUT set HSO_FIN = ? ", Array As Object(sTime)) + DateTime.TimeFormat = "HH:mm:ss" + + Starter.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 +' +' c=Starter.skmt.ExecQuery("SELECT NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON, NV_NOMBRE, NV_DIRECCION FROM NOVENTA where NV_ENVIO <> 1") +' Log($"NOVENYA_Cliente PENDIENTE: ${c.RowCount}"$) +' If c.RowCount>0 Then +' For i=0 To c.RowCount -1 +' c.Position=i +' +' Dim cmd As DBCommand +' cmd.Initialize +' cmd.Name = "insert_noventa_PRO" +' 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"),B4XPages.MainPage.principal.ALMACEN, B4XPages.MainPage.principal.l_ruta.Text) +' reqManager.ExecuteCommand(cmd , $"ins_NOVENTAPendientes_head_${c.GetString("NV_CLIENTE")}"$) +' Next +' End If +' c.Close +'End Sub + + +Sub JobDone(Job As HttpJob) + Log(Job.Success) + If Job.Success = False Then +' ToastMessageShow("Error: " & Job.ErrorMessage, True) + Else + LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211027 + If Job.JobName = "DBRequest" Then + Dim resultado As DBResult = reqManager.HandleJob(Job) + If resultado.Tag.As(String).IndexOf("ins_NOVENTAPendientes_head_") > -1 Then + Private cliente As String= resultado.Tag + cliente = cliente.SubString(cliente.IndexOf("_")+24) + Log($"Cliente1:${cliente}"$) + Starter.skmt.ExecNonQuery2("update NOVENTA SET NV_ENVIO = ? WHERE NV_CLIENTE = ? AND NV_ENVIO <> 1",Array As String ("1", 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..9b28476 --- /dev/null +++ b/B4A/C_Nota.bas @@ -0,0 +1,245 @@ +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 +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 + ruta = File.DirInternal + Root.LoadLayout("nota") + borra.Visible = True + Titulo.Text = "Pedido Actual" +' If Existe <> 0 Then +' c=Starter.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=Starter.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=Starter.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=Starter.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 + 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_CEDIS").Contains("PRO") Then textColor = Colors.RGB(210,105,30) 'Si es promo, cambiamos el color del texto. + If Not(IsNumber(c.GetString("PE_CEDIS"))) Then textColor = Colors.RGB(210,105,30) 'Si es promo, cambiamos el color del texto. + 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") + Next + End If + If Existe <> 0 Then + c =Starter.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 ) ") +' c=Starter.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") + c.Close + c=Starter.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 + If Subs.pedidoGuardado Then borra.Enabled = False Else borra.Enabled = True +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=Starter.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 + Starter.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"))) + Starter.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 + Starter.skmt.ExecNonQuery("delete from pedido_cliente where pc_cliente in (Select CUENTA from cuentaa)") + Starter.skmt.ExecNonQuery("delete from pedido where pe_cliente in (Select CUENTA from cuentaa)") + Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + B4XPage_Appear + 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) + 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=Starter.skmt.ExecQuery2("select PE_PROID,PE_CANT FROM PEDIDO where pe_pronombre = ? and pe_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) + c.Position=0 + Starter.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"))) + Starter.skmt.ExecNonQuery2("INSERT INTO INVENT_X_ENVIAR (ALMACEN , PROID , CANTIDAD ) VALUES(?,?,?) ", Array As Object (almacen,c.GetString("PE_PROID"),c.GetString("PE_CANT")* -1)) + c.Close + c=Starter.skmt.ExecQuery2("select count(*) AS CUANTOS from cat_gunaprod 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)) + c.Position=0 + If c.GetString("CUANTOS") > 0 Then + Starter.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)", Array As Object(Value)) + Else + Starter.skmt.ExecNonQuery2("delete from pedido where pe_pronombre = ? and pe_cliente in (Select CUENTA from cuentaa)", Array As Object(Value)) + End If + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + c=Starter.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 + Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + Starter.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)) + Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + Else + Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + Starter.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("El pedido ya fue guardado, no se puden borrar productos.", True) + 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=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c.Close + c=Starter.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 + Starter.skmt.ExecNonQuery("UPDATE pedido SET PE_COSTO_TOT = PE_COSTO_TOT * .95, PE_DESC = 5 WHERE PE_CLIENTE In (select cuenta from cuentaa)") + c=Starter.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 + Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + Starter.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=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c.Close + c=Starter.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 + Starter.skmt.ExecNonQuery("UPDATE pedido SET PE_COSTO_TOT = PE_COSTO_TOT / .95, PE_DESC = 0 WHERE PE_CLIENTE In (select cuenta from cuentaa)") + c=Starter.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 + Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + Starter.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..d4581d2 --- /dev/null +++ b/B4A/C_NuevoCliente.bas @@ -0,0 +1,336 @@ +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 +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("No permission 1!!!", True) + End If +' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_WRITE_EXTERNAL_STORAGE) +' Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) +' If Result Then +' Log("conpermisos para escritura") +' Else +' ToastMessageShow("No permission 2!!!", True) +' End If + +' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_READ_EXTERNAL_STORAGE) +' Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) +' If Result Then +' Log("conpermisos para escritura") +' Else +' ToastMessageShow("No permission 3!!!", 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 + + E_NOMBRE.Text = "" + If Not(Starter.gps.GPSEnabled) Then + ToastMessageShow("Es necesario tener el GPS encendido", True) + StartActivity(Starter.gps.LocationSettingsIntent) + End If + GUARDA.Visible = False + Subs.panelVisible(p_nuevoCliente, 0, 0) + p_nuevoCliente.Height = Root.Height + p_nuevoCliente.Width = Root.Width + Subs.centraEtiqueta(Label1, Root.Width) + Subs.centraEtiqueta(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 = False + 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 + If E_NOMBRE.Text = "" Then + MsgboxAsync("Por favor captura el nombre de la Tienda","Atención") + Else + If et_direccion.Text.Length > 3 Then + If lat <> 0 Then + If fototomada <> "0" Then +' If giros <> "SELECCIONA UNA OPCIÓN" Or cb_giro.SelectedItem <> "SELECCIONA UNA OPCIÓN" Then + DateTime.DateFormat = "MM/dd/yyyy" + DateTime.Timeformat = "HHmmss" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + Log($" //////////// Date: ${sDate} - Time: ${sTime} ////////////////"$) + 'Aqui creamos manualmete la hora con el separador de los 2 puntos porque en algunas versiones de android no respeta el formato "Timeformat = 'HH:mm:ss'" + Private hora As String = sTime.SubString2(0,2) + Private mins As String = sTime.SubString2(2,4) + Private segs As String = sTime.SubString(4) + sTime = hora&":"&mins&":"&segs + Log("////////////// sTime: "&sTime&" ////////////////") + c=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) 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)) + 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, NOM_FOTO) VALUES(?,?,?,?)", Array As Object(no_cliente, ALMACEN, no_ruta, fototomada)) + 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_ALMACEN, CN_RUTA) VALUES (?,?,?,?,?,?,?,?,?,?)",Array As String(no_cliente,sDate2 &" "&sTime2, usuario, lat, lon, E_NOMBRE.Text,et_direccion.Text, fototomada, ALMACEN, no_ruta)) + fototomada = "0" + B4XPages.ShowPage("Principal") + CallSubDelayed(Tracker, "StartFLP") + +' Else +' MsgboxAsync("Por favor captura el giro del cliente","Atención") +' End If + + Else + MsgboxAsync("Por favor captura la foto 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 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("No permission 1!!!", True) + End If +' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_WRITE_EXTERNAL_STORAGE) +' Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) +' If Result Then +' Log("conpermisos para escritura") +' Else +' ToastMessageShow("No permission 2!!!", True) +' End If + +' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_READ_EXTERNAL_STORAGE) +' Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) +' If Result Then +' Log("conpermisos para escritura") +' Else +' ToastMessageShow("No permission 3!!!", 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 \ No newline at end of file diff --git a/B4A/C_Pedidos.bas b/B4A/C_Pedidos.bas new file mode 100644 index 0000000..eda746c --- /dev/null +++ b/B4A/C_Pedidos.bas @@ -0,0 +1,583 @@ +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) + B4XPages.SetTitle(Me, $"${subs.capitalizar(B4XPages.GetPageId(Me))} - ${Application.VersionName}"$) + Root = Root1 + 'load the layout to Root + Root.LoadLayout("pedido") + i_fotol.Visible = False + ruta = File.DirInternal + If File.Exists(ruta, "kmt.db") = False Then + File.Copy(File.DirAssets, "kmt.db", ruta, "kmt.db") + 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 + 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=Starter.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=Starter.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=Starter.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=Starter.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=Starter.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=Starter.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=Starter.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=Starter.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=Starter.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=Starter.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=Starter.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 + Starter.skmt.ExecNonQuery("delete from PROIDID") + Starter.skmt.ExecNonQuery2("INSERT INTO PROIDID VALUES (?)", Array As Object(L_PROID.text)) + c=Starter.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=Starter.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=Starter.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=Starter.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 + Starter.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=Starter.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 + Starter.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=Starter.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 + Starter.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=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c.Close + c=Starter.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=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + e=Starter.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=Starter.skmt.ExecQuery("select CAT_DP_IDPROD, CAT_DP_PZAS,CAT_DP_PRECIO FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) 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=Starter.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 + Starter.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 + Starter.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)) + Starter.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 + Starter.skmt.ExecNonQuery("delete from PROIDID") + Starter.skmt.ExecNonQuery2("INSERT INTO PROIDID VALUES (?)", Array As Object(L_PROID.text)) + c=Starter.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=Starter.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=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + 'Starter.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=Starter.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=Starter.skmt.ExecQuery("select CAT_DP_IDPROD, CAT_DP_PZAS, CAT_DP_PRECIO FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID)") + For i =0 To f.RowCount -1 + F.Position =i + h=Starter.skmt.ExecQuery2("select CAT_GP_NOMBRE from CAT_GUNAPROD where CAT_GP_ID = ? ", Array As String(f.GetString("CAT_DP_IDPROD"))) + h.Position=0 + Starter.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 + Starter.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)) + Starter.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=Starter.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 + Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + Starter.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"))) + Starter.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=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c.Close + c=Starter.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=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + Starter.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)) + Starter.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=Starter.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 + Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + Starter.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"))) + Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + Starter.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 + Starter.skmt.ExecNonQuery("delete from PROIDID") + Starter.skmt.ExecNonQuery2("INSERT INTO PROIDID VALUES (?)", Array As Object(L_PROID.text)) + c=Starter.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=Starter.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=Starter.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=Starter.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 + 'Starter.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. + Starter.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=Starter.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 + Starter.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=Starter.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 + Starter.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=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c.Close + c=Starter.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=Starter.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=Starter.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=Starter.skmt.ExecQuery("select CAT_DP_IDPROD, CAT_DP_PZAS,CAT_DP_PRECIO FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID) 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=Starter.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) + Starter.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) + Starter.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)) + Starter.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 + Starter.skmt.ExecNonQuery("delete from PROIDID") + Starter.skmt.ExecNonQuery2("INSERT INTO PROIDID VALUES (?)", Array As Object(L_PROID.text)) + c=Starter.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=Starter.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=Starter.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=Starter.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=Starter.skmt.ExecQuery("select CAT_DP_IDPROD, CAT_DP_PZAS, CAT_DP_PRECIO FROM CAT_DETALLES_PAQ WHERE CAT_DP_ID IN (Select PROIDID from PROIDID)") + For i =0 To f.RowCount -1 + F.Position =i + h=Starter.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) + Starter.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) + Starter.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)) + Starter.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=Starter.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 + Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + Starter.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"))) + Starter.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=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c.Close + c=Starter.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=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + Log(555) + Starter.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)) + Starter.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=Starter.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 + Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + Starter.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"))) + Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + Starter.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 + Starter.skmt.ExecNonQuery("delete from PROIDID") + Starter.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=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + Starter.skmt.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)) + Starter.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..73c7626 --- /dev/null +++ b/B4A/C_Principal.bas @@ -0,0 +1,2454 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=11.5 +@EndOfDesignText@ +Sub Class_Globals + Public rp As RuntimePermissions + Dim s As C_Subs + Private Root As B4XView 'ignore + Private xui As XUI 'ignore + Dim reqManager As DBRequestManager + Dim rd As C_RespaldoDiario + Dim conectado As String + Dim t1 As Timer + Dim sb As StringBuilder + Dim PHONE As Phone + Dim g As GPS + Dim IME As IME + 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 dd As Cursor + Dim lv As ListView + Dim cargar As Button + Dim pendiente As Button + Dim foto1() As Byte + Dim usuario As String + Dim connecta As Button + Dim conn As String + Dim Subir As Button + Dim cmd As DBCommand + Dim TOPE As Int + Dim COUNT_CLIE As Int + Dim fecha As String + Dim drop As Double + Dim efectiva As Double + Dim L_MONTOD As Label + Dim l_cuantosc As Label + Dim l_drop As Label + Dim l_efectiva As Label + Dim l_ctast As Label + Dim BUSCA As Button + Dim Cuantos As String + Dim l_cuantosn As Label + Dim e_ruta As EditText + Dim l_porvisitar As Label + Dim b_mapa As Button + Dim l_ruta As Label + Dim ALMACEN As String + Private img2 As ImageView + Dim Listo1 As String + Dim Listo2 As String + Dim Listo3 As String + Dim Listo4 As String + Dim Listo5 As String + Dim EJECUTANDO As String + Dim RES As String + Dim inve As String + Dim cuantos_pedidosc As String + Dim cuantos_pedido As String + Dim cuantos_noventa As String + Dim datos_iguales As String + Dim p As PhoneId + Dim imei As String +' Dim SERVER As String + + Private inv As Button + Private P1 As Panel + Private CLAVE As EditText + Private B_OK_PAS As Button + Dim PASO As String + Private USUARIO1 As EditText + Dim connecta1 As Double + Dim armafolio As String + Private NUEVO As Button + Private S_CC As Label + Private S_CP As Label + Private S_CH As Label + Private PB2 As ProgressBar + Private PB1 As ProgressBar + Private L_P_1 As Label + Private L_P_2 As Label + Private L_P_3 As Label + Private CARGA As String + Private PORCENTAJE As String + Private P_RESUMEN As Panel + Private B_OK_RES As Button + Private Resumen As Button + Private L_CUANTOST As Label + Private img3 As ImageView + + Private ImageView3 As ImageView + Private ImageView5 As ImageView + Private L_TICKPROM As Label + Private L_MARCAS As ListView + Private ImageView9 As ImageView + Private E_RUTA2 As EditText + Private resdia As ImageView + Private hacer_ped As ImageView + Private nvo_cliente As ImageView + Private tickets_dia As ImageView + + Private l_monto_ks As Label + Private l_monto_kp As Label + Private l_monto_k As Label + + Private l_monto_c1 As Label + Private l_monto_c2 As Label + Private l_monto_c3 As Label + + Private l_encuesta As Label + + + Private bpv1 As BatteryProgressView + Dim batterystatus(11) As Int + Private bu As BatteryUtilities + + + Private Panel4 As Panel + Private L_NES As Label + Private L_REAL As Label + Private L_ALCANCE As Label + Private L_VPLAN As Label + Private L_VREAL As Label + Private L_EFEC_VIS As Label + Private L_VISITCC As Label + Private L_EFEC_PV As Label + Private L_EFEC_PURA As Label + Private L_CTE_PROMO As Label + Private L_REDEN_PROMO As Label + Private L_LIN_TICK As Label + Private SCROLL_RESDIA As ScrollView + Private L_ACUMULADO As Label + Private L_UNILEVER As Label + Private L_RECHAZOP As Label + Private L_RECHAZOM As Label + Private L_VTA_3MES As Label + Private L_VTA_2MES As Label + Private L_VTA_1MES As Label + Private L_MES_PY As Label + Private L_FREC_DE_CREAL As Label + Private L_FREC_DE_COBJ As Label + Private L_COB_VISIT As Label + Private L_VISIT_REAL As Label + Private L_VISIT_PLAN As Label + Private L_ECO As Label + Private L_COB_CCC As Label + Private L_CTES As Label + Private L_VPO_VTA As Label + Private L_VPO_OBJ As Label + Private L_DS_VTA As Label + Private L_DS_OBJ As Label + Private L_DRA_VTA As Label + Private L_DRA_OBJ As Label + Private L_ALCANCEM As Label + Private L_TENDENCIA As Label + Private L_VTA_ACUM As Label + Private L_OBJ_MES As Label + Private L_DS_OBJD As Label + Private L_DS_VTAD As Label + Private LPT As String + Private STEYIN As String + Private STEYOUT As String + + Private L_PRIO As Label + Private L_SECUND As Label + Private L_COMP As Label + + + Private stay_hh As String + Private stay_mi As String + Private stay_ss As String + + Dim sDate,sTime As String + Dim HORAINGRESO As String + + Private L_QUALA As Label + Private L_FERRERO As Label + Private L_SANMARCOS As Label + Private L_CAMPARI As Label + Private L_IBERIA As Label + Private L_BEPENSA As Label + Private L_SCJ As Label + Private L_MEDJ As Label + Private L_DURACELL As Label + Private L_GUNA As Label + Private L_KIMB As Label + Private L_TRESM As Label + Private L_REDB As Label + Private Btn_Ubicar As Button + Private B_COMM As Button + Private L_TOTAL_MM As Label + Private L_TOTAL_VIVE As Label + Private L_TOTAL_GUNA As Label + Private L_TOTAL_BA As Label + Private L_TOTAL_COMIS As Label + Private L_TOTAL_MM_1 As Label + Private L_TOTAL_VIVE_1 As Label + Private L_TOTAL_GUNA_1 As Label + Private L_TOTAL_BA_1 As Label + Private L_TOTAL_COMIS_1 As Label + Private B_OK_COMISS As Button + Private Panel_C As Panel + + Private TitleHeight As Int = 50dip + Private Title2Height As Int = 100dip + + Private DividerHeight As Int = 5dip + Private CLV1 As CustomListView + Private pnlTitle As B4XView + Private xui As XUI + Type TitleData (Title As String) + + Private B_MARCAS As Button + Private Panel5 As Panel + Private lblTitle As Label + Private B_OK_PANEL5 As Button + + + Private p_principal As Panel + Private p_mandaInfo As Panel + Private l_version As Label + + Dim cpb As Cursor +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + Root.LoadLayout("principal") + B4XPages.SetTitle(Me, $"${Subs.capitalizar(B4XPages.GetPageId(Me))} ${Application.VersionName}"$) + s.Initialize(Me, "Subs") + p_mandaInfo.Width = Root.Width + p_mandaInfo.Height = Root.Height + s.centraPanel(P1, Root.Width) + l_version.Text = Application.VersionName +' rd.Initialize 'Inicializamos el respaldo diario. +' 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) + Starter.skmt.Initialize(ruta,"kmt.db", True) + b=Starter.skmt.ExecQuery("Select count(*) as CUANTOS from pedido_cliente") + b.Position=0 + Cuantos = b.GetString("CUANTOS") + b.Close + d=Starter.skmt.ExecQuery("select count(*) as TOTAL_VISITAR from kmt_info where gestion = 0") + d.Position=0 + e=Starter.skmt.ExecQuery("select count(*) as POR_VISITAR from kmt_info") + e.Position=0 + f=Starter.skmt.ExecQuery("select count(*) as CAT_CL_RUTA from kmt_info") + f.Position=0 + l_ruta.Text = f.GetString("CAT_CL_RUTA") + f.Close + If l_ruta.Text = 0 Then + l_ruta.Text =0 + Else + f=Starter.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=Starter.skmt.ExecQuery("select sum(pc_monto) as MONTO_DIA, count(pc_cliente) AS CLIENTES_DIA from pedido_cliente ") + b=Starter.skmt.ExecQuery("select count(*) as CUANTOS from noventa") + 'where pc_fecha = ?", Array As String(fecha) + c.Position=0 + b.Position=0 + L_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 +' Private ds As Cursor = Starter.skmt.ExecQuery("select cat_cl_diasemana from kmt_info") +' If ds.RowCount > 0 Then +' ds.Position = 0 +' Starter.dia_semana = ds.GetString("CAT_CL_DIASEMANA") +' End If +' CallSubDelayed(FirebaseMessaging, "SubscribeToTopics") +End Sub + +Sub B4XPage_Appear + Checapedido + cpb = Starter.skmt.ExecQuery("SELECT PC_CLIENTE, PC_MONTO FROM PEDIDO_CLIENTE") + If cpb.RowCount > 0 Then + For i = 0 To cpb.RowCount-1 + cpb.Position = i + Private clieborrar As String = cpb.GetString("PC_CLIENTE").Trim + Private montoborrar As Int = cpb.GetString("PC_MONTO") + Log(montoborrar) + If montoborrar < 150 Then + Starter.skmt.ExecNonQuery2("DELETE FROM PEDIDO WHERE PE_CLIENTE = ?",Array As String(clieborrar)) + Starter.skmt.ExecNonQuery2("DELETE FROM PEDIDO_CLIENTE WHERE PC_CLIENTE = ?",Array As String(clieborrar)) + LogColor("Borre "&clieborrar ,Colors.Blue) + End If + Next + End If + cpb.Close +' s.reqManagerReInit 'Reiniciamos el DBReqManager de C_Subs por si hay modificacion en el servidor. + reqManager.Initialize(Me, Starter.DBReqServer) +' B4XPages.MainPage.cliente.mandaPendientes 'Ejecutamos mandaPendientes. +' rd.respalda_pedido +' rd.respalda_cat_gunaprod +' rd.respalda_cat_detalle_paq +' nvo_cliente.Enabled = False + HORAINGRESO ="000000" +' Btn_Ubicar.Left = (Root.Width/2) - (Btn_Ubicar.Width/2) +' reqManager.Initialize(Me, B4XPages.MainPage.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=Starter.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" + reqManager.ExecuteQuery(cmd , 0, "fecha") + Msgbox("AJUSTAR FECHA","AVISO") 'ignore + B4XPage_Appear + Else + c=Starter.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=Starter.skmt.ExecQuery("Select count(*) as CUANTOS from pedido_cliente") + b.Position=0 + Cuantos = b.GetString("CUANTOS") + b.Close +' If Starter.marcaCel <> "Sony" Then ToastMessageShow(Cuantos , True) + d=Starter.skmt.ExecQuery("select count(*) as TOTAL_VISITAR from kmt_info where gestion = 0") + d.Position=0 + e=Starter.skmt.ExecQuery("select count(*) as POR_VISITAR from kmt_info") + e.Position=0 + f=Starter.skmt.ExecQuery("select count(*) as CAT_CL_RUTA from kmt_info") + f.Position=0 + l_ruta.Text = f.GetString("CAT_CL_RUTA") + f.Close + If l_ruta.Text = 0 Then + l_ruta.Text =0 + Else + f=Starter.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info") + f.Position=0 + l_ruta.Text = f.GetString("CAT_CL_RUTA") + f.Close + End If + If Cuantos = 0 Then + L_MONTOD.Text =0 + l_cuantosc.Text = 0 + l_cuantosn.Text = 0 + L_CUANTOST.Text = 0 + drop = 0 + l_drop.Text = 0 + efectiva = 0 + l_efectiva.text =0 + l_ctast.Text = d.GetString("TOTAL_VISITAR") + l_porvisitar.Text = e.GetString("POR_VISITAR") + d.Close + e.Close + b=Starter.skmt.ExecQuery("select count(*) as CUANTOS from noventa") + b.Position=0 + l_cuantosn.Text = b.GetString("CUANTOS") + b.close + Else + c=Starter.skmt.ExecQuery("select SUM(PE_COSTO_TOT) as MONTO_DIA, COUNT(DISTINCT(PE_CLIENTE)) AS CLIENTES_DIA from PEDIDO ") + b=Starter.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=Starter.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=Starter.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") + C.Position =0 + ALMACEN = C.GetString("ID_ALMACEN") + c.Close + bu.Initialize + batterystatus = bu.BatteryInformation + + + c=Starter.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=Starter.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + B4XPages.MainPage.usuario = usuario + c.Close + '/////// + CallSub(Starter, "ENVIA_ULTIMA_GPS") + +' c=Starter.skmt.ExecQuery("select AUTORIZADO from BANDERA") +' c.Position = 0 +' If c.RowCount > 0 Then +' If c.GetString("AUTORIZADO") = "0" Then +' nvo_cliente.Enabled = False +' Else if c.GetString("AUTORIZADO") = "1" Then +' nvo_cliente.Enabled = True +' End If +' End If +' c.Close + + + +End Sub + +Sub Subir_Click + CARGA = "SUBIR" + P1.Visible = True + 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 + Starter.skmt.ExecNonQuery2("delete from PEDIDO WHERE PE_PRONOMBRE = ? ", Array As Object("N/A") ) + Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE not In (select PE_CLIENTE from pedido)") + c=Starter.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c.Close + c=Starter.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_PRO_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 + ' PEDIO_CLIENTE + + c=Starter.skmt.ExecQuery("SELECT PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT, PC_COSTO_SIN, PC_RUTA, PC_ALMACEN, PC_FACTURA FROM PEDIDO_CLIENTE ") + d=Starter.skmt.ExecQuery("SELECT COUNT(*) as CUANTOS_PEDIDOSC FROM PEDIDO_CLIENTE ") + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_pedidos_PRO" + cmd.Parameters = Array As Object(c.GetString("PC_CLIENTE"), c.GetString("PC_FECHA"), c.GetString("PC_USER"), c.GetString("PC_NOART"), c.GetString("PC_MONTO"), c.GetString("PC_LON"), c.GetString("PC_LAT"), ALMACEN, l_ruta.text, c.GetString("PC_COSTO_SIN"), c.GetString("PC_FACTURA")) + reqManager.ExecuteCommand(cmd , "ins_pedidos") + Next + End If + c.Close + d.Position=0 + cuantos_pedidosc = D.GetString("CUANTOS_PEDIDOSC") + d.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=Starter.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_PRO" + 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=Starter.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_MARDS" +' cmd.Parameters = Array As Object(C.GetString("CAT_CL_NUM_SERIEFISICO"),C.GetString("CAT_CL_CODIGO"),C.GetString("CAT_CL_LONG"),C.GetString("CAT_CL_LAT"),ALMACEN,l_ruta.text, foto1 ) +' reqManager.ExecuteCommand(cmd , "ins_QR") +' Next +' End If +' c.Close + +' c=Starter.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_MARDS" +' 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 + + c=Starter.skmt.ExecQuery("SELECT PE_CEDIS,PE_COSTO_TOT,PE_COSTOU,PE_CANT,PE_PRONOMBRE,PE_PROID,PE_CLIENTE,PE_FECHA,PE_USUARIO, PE_COSTO_SIN, PE_RUTA, PE_DESC, PE_FOLIO FROM PEDIDO") + d=Starter.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_pedido_PRO" + 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"),"PREVENTA") + reqManager.ExecuteCommand(cmd , "ins_pedido") + Next + End If + c.Close + d.Position=0 + cuantos_pedido = D.GetString("CUANTOS_PEDIDO") + d.Close + + ' NOVENTA + c=Starter.skmt.ExecQuery("SELECT NV_CLIENTE,NV_FECHA,NV_USER,NV_MOTIVO,NV_COMM,NV_LAT,NV_LON, NV_NOMBRE, NV_DIRECCION FROM NOVENTA") + D=Starter.skmt.ExecQuery("SELECT COUNT(*) AS CUANTOS_NOVENTA FROM NOVENTA") + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_noventa_PRO" + cmd.Parameters = Array As Object(C.GetString("NV_CLIENTE"),C.GetString("NV_FECHA"),C.GetString("NV_USER"),C.GetString("NV_MOTIVO"),C.GetString("NV_COMM"),C.GetString("NV_LAT"),C.GetString("NV_LON"), ALMACEN, l_ruta.Text) + reqManager.ExecuteCommand(cmd , "inst_noventa") + Next + End If + c.Close + d.Position=0 + cuantos_noventa = D.GetString("CUANTOS_NOVENTA") + d.Close + + ' 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 FROM CLIENTES_NUEVOS") + If c.RowCount>0 Then + For i = 0 To c.RowCount - 1 + c.Position = i + Log(File.Exists(Dirp&Dir&Dir2,c.GetString("CN_FOTO"))) + If File.Exists(Dirp&Dir&Dir2,c.GetString("CN_FOTO")) Then fotocn = Bit.InputStreamToBytes(File.OpenInput(Dirp&Dir,c.GetString("CN_FOTO"))) + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "insert_clientesnuevos_PRO" + 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"),c.GetString("CN_ALMACEN"), c.GetString("CN_RUTA"), fotocn, "EN ESPERA",c.GetString("CN_GIRO")) + reqManager.ExecuteCommand(cmd , "inst_clientesn") + Next + End If + c.Close + ' GEO CERCA + +' c=Starter.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_PRO" +' 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=Starter.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_MARDS" +' 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 + + 'fotos +' Dim fotox() As Byte +' Dim cmd As DBCommand +' c = Starter.skmt.ExecQuery("Select CODIGO, ALMACEN, RUTA, NOM_FOTO from HIST_FOTO_CLIENTE") + ' +' c.Position = 0 +' +' Dim Dirp As String = File.DirInternal +' Dim Dir As String +' Dim Dir2 As String +' Dir = "/promotoriakmts" +' If c.RowCount>0 Then +' For i = 0 To c.RowCount - 1 +' c.Position = i +' Log(File.Exists(Dirp&Dir&Dir2,c.GetString("NOM_FOTO"))) +' fotox = Bit.InputStreamToBytes(File.OpenInput(Dirp&Dir,c.GetString("NOM_FOTO"))) +' cmd.Initialize +' cmd.Name = "insert_fotos_cliente_nuevo_MARIANA" +' cmd.Parameters = Array As Object(c.GetString("CODIGO"),c.GetString("ALMACEN"),c.GetString("RUTA"),fotox) +' reqManager.ExecuteCommand(cmd, $"insert_clientes_${c.GetString("CODIGO")}"$) +' 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_PRO_2" + cmd.Parameters = Array As Object(usuario,l_ruta.Text,sDate & sTime, l_porvisitar.Text,l_drop.Text,l_efectiva.Text,l_cuantosc.Text,l_cuantosn.Text, L_MONTOD.Text,"ENVIO",ALMACEN) + reqManager.ExecuteCommand(cmd , "inst_noventa") + img2.Visible =True + PORCENTAJE = Round(100/ (cuantos_noventa + cuantos_pedido + cuantos_pedidosc + 1)) + If Starter.marcaCel <> "Sony" Then ToastMessageShow("Se Actualizaran los datos, Este proceso podria tardar hasta un minuto, gracias "& l_ruta.text , True) + End If +End Sub + +Sub cargar_Click + IME.HideKeyboard + Dim pedidodiaanterior As Boolean = False + Dim cp As Cursor = Starter.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" + s.panelVisible(p_mandaInfo, 0, 0) + 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 + 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 + + Starter.skmt.ExecNonQuery("delete from kmt_info") + Starter.skmt.ExecNonQuery("delete from cod_result") + Starter.skmt.ExecNonQuery("delete from CAT_GIRO") + Starter.skmt.ExecNonQuery("delete from BANDERA") + Starter.skmt.ExecNonQuery("delete from hist_gest") + Starter.skmt.ExecNonQuery("delete from cat_gunaprod") + Starter.skmt.ExecNonQuery("delete from CAT_DETALLES_PAQ") + Starter.skmt.ExecNonQuery("delete from telefonos") + Starter.skmt.ExecNonQuery("delete from HIST_VENTAS") + Starter.skmt.ExecNonQuery("delete from HIST_PROMOS") + Starter.skmt.ExecNonQuery("delete from HIST_CLIENTE_CANT_PROMOS") + Starter.skmt.ExecNonQuery("delete from PROMOS_COMP") + Starter.skmt.ExecNonQuery("delete from CAT_VERIFICACION") + Starter.skmt.ExecNonQuery("DELETE FROM MARCAS_RUTAS") + Starter.skmt.ExecNonQuery("DELETE FROM HIST_STAY_STORE") + Starter.skmt.ExecNonQuery("DELETE FROM HIST_GEOCERCA") + Starter.skmt.ExecNonQuery("DELETE FROM HIST_MARCAS_CUOTAS") + Starter.skmt.ExecNonQuery("DELETE FROM HIST_AVANCE") + + c = Starter.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 + Starter.skmt.ExecNonQuery2("Update cat_variables set CAT_VA_VALOR = ? WHERE CAT_VA_DESCRIPCION = ?" , Array As String(DateTime.Time(DateTime.Now),"HoraIngreso")) + Else + Starter.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=Starter.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 = "yyyy" + cmd.Initialize + cmd.Name ="insert_drop_PRO_2" + cmd.Parameters = Array As Object(usuario,l_ruta.Text,sDate & sTime, l_porvisitar.Text,l_drop.Text,l_efectiva.Text,l_cuantosc.Text,l_cuantosn.Text, L_MONTOD.Text,"CARGA",ALMACEN) + reqManager.ExecuteCommand(cmd , "inst_noventa") + + LogColor(ALMACEN,Colors.Yellow) + cmd.Initialize + cmd.Name = "select_cat_gunaprod_PRO" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "gunaprod") + + cmd.Initialize + cmd.Name = "select_cat_paquetes_PRO" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "gunaprodp") + + cmd.Initialize + cmd.Name = "select_cat_paquetess_PRO" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "gunaprodp") + + cmd.Initialize + cmd.Name = "select_cat_detallepa_PRO" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "detallepaq") + + cmd.Initialize + cmd.Name = "select_cat_clientes_guna_PRO" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "kmt_datos") + + cmd.Initialize + cmd.Name = "select_hist_datos_PRO" + 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_PRO" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "hist_promos") + + cmd.Initialize + cmd.Name = "select_hist_cliente_promos_PRO" + 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 + cmd.Initialize + cmd.Name = "select_cat_clientes_guna_PRO" + cmd.Parameters = Array As Object(E_RUTA2.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "kmt_datos") + + cmd.Initialize + cmd.Name = "select_hist_datos_PRO" + cmd.Parameters = Array As Object(E_RUTA2.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "hist_datos") + + cmd.Initialize + cmd.Name = "select_hist_promos_PRO" + cmd.Parameters = Array As Object(E_RUTA2.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "hist_promos") + + cmd.Initialize + cmd.Name = "select_hist_cliente_promos_PRO" + 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_PRO" + cmd.Parameters = Array As Object(e_ruta.Text, 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_PRO" + cmd.Parameters = Array As Object(e_ruta.text, ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "folio") + + cmd.Initialize + cmd.Name = "select_marcas_PRO" + 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_MARDS" +' cmd.Parameters = Array As Object( ALMACEN, e_ruta.text ) +' reqManager.ExecuteQuery(cmd , 0, "COMISIONES") + +' cmd.Initialize +' cmd.Name = "select_hist_avance_MARDS" '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 Not(Job.Success) Then + LogColor("Error: " & Job.tag & " : " & Job.ErrorMessage, Colors.red) + If Job.ErrorMessage = "STREAM" Then + If CARGA = "SUBIR" Then + PB2.Progress = PB2.Progress + PORCENTAJE + S_CP.Text = "SUBIENDO" + If PB2.Progress > 99 Then + S_CP.Text = "VALIDANDO" + End If + End If + End If + Else 'If Job Success then ... + LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) '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 + MsgboxAsync("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 = "bandera" Then 'query tag + For Each records() As Object In RESULT.Rows + Dim aurotizado As String = records(RESULT.Columns.Get("CAT_RU_B_ALTA_CLIENTES")) + + Starter.skmt.ExecNonQuery2("INSERT INTO BANDERA(AUTORIZADO) VALUES (?)", Array As Object (aurotizado)) + 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_DIASEMANA As String = records(RESULT.Columns.Get("CAT_CL_DIAS_VISITA")) +' Dim CAT_CL_SECUENCIA As Int = records(RESULT.Columns.Get("CAT_CL_SECUENCIA")) +' Starter.dia_semana = CAT_CL_DIASEMANA + 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)", 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)) + Starter.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")) + + Starter.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")) + Starter.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")) + Starter.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")) + Starter.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")) + Starter.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")) + Starter.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")) + Starter.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")) + Starter.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")) + Starter.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")) + + 'AQUI EMPIEZA LO DE LA GORRA +' Dim CAT_GP_TIPOPROD2 As String = records(RESULT.Columns.Get("CAT_DP_TIPOPROD2")) +' CAT_GP_INICIATIVA = 5 +' skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG,CAT_GP_ALMACEN,CAT_GP_DEV) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object (CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG, CAT_GP_ALMACEN,CAT_GP_DEV)) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG,CAT_GP_ALMACEN,CAT_GP_TIPOPROD,CAT_GP_INICIATIVA) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)", Array As Object (CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG, CAT_GP_ALMACEN,CAT_GP_TIPOPROD, CAT_GP_INICIATIVA)) + Next + c=Starter.skmt.ExecQUERY("SELECT COUNT(*) AS CUANTOS FROM PEDIDO WHERE PE_CLIENTE <> 0") + c.Position = 0 + + cuantos_pedidosc = c.GetString("CUANTOS") + c.Close + If cuantos_pedidosc > 0 Then + c=Starter.skmt.ExecQUERY("SELECT PE_PROID, SUM(PE_CANT) AS PE_CANT FROM PEDIDO WHERE PE_CLIENTE <> 0 GROUP BY PE_PROID") + If c.RowCount>0 Then + For i=0 To c.RowCount -1 + c.Position=i + Starter.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 + End If + + 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 + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG,CAT_GP_ALMACEN,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")) + ' + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_GUNAPROD(CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_IMP1,CAT_GP_IMP2,CAT_GP_PRECIO,CAT_GP_CLASIF,CAT_GP_STS,CAT_GP_TIPO,CAT_GP_SUBTIPO,CAT_GP_IMG,CAT_GP_ALMACEN,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")) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_DETALLES_PAQ(CAT_DP_ALMACEN,CAT_DP_ID,CAT_DP_IDPROD,CAT_DP_TIPO,CAT_DP_PZAS,CAT_DP_USUARIO,CAT_DP_FECHA,CAT_DP_REGALO,CAT_DP_CLASIF,CAT_DP_PRECIO,CAT_DP_PRECIO_SIMPTOS) VALUES (?,?,?,?,?,?,?,?,?,?,?)", Array As Object (CAT_DP_ALMACEN,CAT_DP_ID,CAT_DP_IDPROD,CAT_DP_TIPO,CAT_DP_PZAS,CAT_DP_USUARIO,CAT_DP_FECHA,CAT_DP_REGALO,CAT_DP_CLASIF,CAT_DP_PRECIO,CAT_DP_PRECIO_SIMPTOS)) + Next + 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")) + Starter.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")) + Starter.skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object (Cat_Va_Descripcion, Cat_Va_Valor)) + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "CUESTIONARIO" Then 'query tag + For Each records() As Object In RESULT.Rows + Dim Cat_Va_Valor As String = records(RESULT.Columns.Get("CAT_VALOR")) + Starter.skmt.ExecNonQuery2("DELETE FROM CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As Object ("CUESTIONARIO")) + Starter.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 + Subs.logJobDoneResultados(RESULT) + 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)" + Log("No se cargo bien la info P. Sync Nuevamente" & CUANTOSP & " " & cuantos_pedido) + 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 + Subs.logJobDoneResultados(RESULT) + 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) + Log("No se cargo bien la info C. Sync Nuevamente " & CUANTOSC & " " & cuantos_pedidosc) + 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 + Subs.logJobDoneResultados(RESULT) + 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) + Log("No se cargo bien la info N. Sync Nuevamente " & CUANTOSN & " " & cuantos_noventa) + 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 = "LISTO" + 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 + Starter.skmt.ExecNonQuery("delete from VERSION") + Dim CAT_VE_VERSION As String = records(RESULT.Columns.Get("CAT_VE_VERSION")) + Starter.skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object (CAT_VE_VERSION)) + Next + End If + End If + + If Job.JobName = "DBRequest" Then + Dim RESULT As DBResult = reqManager.HandleJob(Job) + If RESULT.Tag = "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 + For Each records() As Object In RESULT.Rows + Dim VALIDO As String = records(RESULT.Columns.Get("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")) + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("FECHA")) + Starter.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")) + Starter.skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("FOLIO")) + Starter.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")) + Starter.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 + + 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 + +'############################################################################################ +'################### Codigo de prueba JAGU, no poner atencion ############################ +Sub connecta_LongClick + ProgressDialogShow("Enviamos") +' s.reqManagerReInit 'Reiniciamos el DBReqManager por si hay modificacion en el servidor. + s.envioTest 'Llamamos envioTest de C_Subs. +End Sub + +Sub tickets_dia_LongClick + cuantos_pedido = 0 + cuantos_pedidosc = 0 + cuantos_noventa = 0 + t1_tick +End Sub + +Sub Subs_envioOk(succes As Boolean) + Log("###################### ENVIO OK - " & succes) + If Not(succes) Then + ToastMessageShow($"El envio no se completo con exito, por favor vuelva a enviar."$, True) + Else + ToastMessageShow($"¡El envio exitoso!."$, True) + End If + ProgressDialogHide +End Sub +'################################ Termina codigo de prueba ############################# + +Sub connecta_Click + reqManager.Initialize(Me, Starter.DBReqServer) + Log(Starter.DBReqServer) + connecta1 = connecta1 + 1 +' imei = p.GetDeviceId + IME.HideKeyboard + imei = "" + conn = "1" + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_version_PRO" + reqManager.ExecuteQuery(cmd , 0, "version") + +' Cuando nos conectamos verificamos que el usuario guardado en BD sea VALIDO. + c = Starter.skmt.ExecQuery("select USUARIO, PASS from usuarioa") + c.Position=0 + If c.RowCount > 0 And c.GetString("USUARIO") <> "KMTS1" Then + Private usrT As String = c.GetString("USUARIO") + Private passT As String = c.GetString("PASS") + cmd.Initialize + cmd.Name = "select_usuario_guna_PRO_1" + cmd.Parameters = Array As Object(usrT, passT) + reqManager.ExecuteQuery(cmd , 0, "usuarioA") + End If + c.Close + + + Dim cmd As DBCommand + cmd.Initialize + cmd.Name = "select_ruta_PRO2_224_2" + cmd.Parameters = Array As Object(ALMACEN,e_ruta.text) + reqManager.ExecuteQuery(cmd , 0, "ruta") + + If e_ruta.Text = "KMTS1" Then + cargar.Visible = True + Subir.Visible = True + e_ruta.Text = "" + End If + + If e_ruta.Text = "BERNA1" Then + cargar.Visible = True + Subir.Visible = True + e_ruta.Text = "" + End If + + ToastMessageShow("Validando Conexión." , True) + +' If connecta1 / 2 = 1 Then +' 'SERVER = "http://177.244.63.54:1782" +' 'SERVER = "http://keymon.com.mx:1782" +' 'SERVER = "http://201.99.139.28:1782" + '' B4XPages.MainPage.SERVER = "http://187.189.244.154:1782" + '' SERVER = "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" + '' B4XPages.MainPage.SERVER = "http://187.189.244.154:1782" + '' SERVER = "http://10.0.0.205:1782" +' reqManager.Initialize(Me, Starter.DBReqServer) +' End If +End Sub + +Sub BUSCA_Click + B4XPages.ShowPage("TicketsDia") +End Sub + +Sub b_mapa_Click + Log("mapClic") + B4XPages.GetPage("Mapas") +End Sub + +Sub e_ruta_EnterPressed + If e_ruta.Text = "FIN DIA" Then + RES = Msgbox2("Seguro que desea hacer el cierre todos los datos se borraran?","Cierre", "Si", "", "No",LoadBitmap(File.DirAssets,"alert2.png")) 'ignore + If RES = DialogResponse.POSITIVE Then + e_ruta.Text = "" + Starter.skmt.ExecNonQuery("delete from pedido_cliente") + Starter.skmt.ExecNonQuery("delete from pedido") + Starter.skmt.ExecNonQuery("delete from noventa") + Starter.skmt.ExecNonQuery("delete from clie_act") + Starter.skmt.ExecNonQuery("delete from kmt_info") + Starter.skmt.ExecNonQuery("delete from cat_gunaprod") + Starter.skmt.ExecNonQuery("delete from CAT_GIRO") + Starter.skmt.ExecNonQuery("delete from CAT_DETALLES_PAQ") + Starter.skmt.ExecNonQuery("delete from HIST_VENTAS") + Starter.skmt.ExecNonQuery("delete from HIST_VERIFICACION") + Starter.skmt.ExecNonQuery("DELETE FROM HIST_ENCUESTA") + Starter.skmt.ExecNonQuery("DELETE FROM HIST_STAY_OUT") + Starter.skmt.ExecNonQuery("DELETE FROM HIST_GPS") + Starter.skmt.ExecNonQuery("DELETE FROM HIST_FACE") + Starter.skmt.ExecNonQuery("INSERT INTO HIST_STAY_OUT(HSO_INI, HSO_FIN) VALUES (0,0)") + Starter.skmt.ExecNonQuery("DELETE FROM HIST_CODIGO_BARRAS") + Starter.skmt.ExecNonQuery("DELETE FROM HIST_FOTO_CLIENTE") + Starter.skmt.ExecNonQuery("DELETE FROM CLIENTES_NUEVOS") + B4XPage_Appear + End If + End If + If e_ruta.Text = "IWL" Then + ' trabajar.Visible = False + NUEVO.Visible =False + BUSCA.Visible=False + connecta.Visible=False + img3.Visible =True + Resumen.Visible= False + End If + If e_ruta.Text = "SUPLENCIA" Then + E_RUTA2.Visible = True + ImageView9.Visible = True + End If +End Sub + +Sub inv_Click + img2.Visible =True + EJECUTANDO = 1 + inve = 1 + Starter.skmt.ExecNonQuery("delete from cat_gunaprod") + Starter.skmt.ExecNonQuery("delete from CAT_DETALLES_PAQ") + c=Starter.skmt.ExecQuery("select usuario from usuarioa") + c.Position = 0 + usuario = c.GetString("USUARIO") + c.Close + cmd.Initialize + cmd.Name = "select_cat_gunaprod_PRO" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "gunaprod") + cmd.Initialize + cmd.Name = "select_cat_paquetes_PRO" + cmd.Parameters = Array As Object(ALMACEN) + reqManager.ExecuteQuery(cmd , 0, "gunaprodp") + + cmd.Initialize + cmd.Name = "select_cat_detallepa_PRO" + 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_PRO" + cmd.Parameters = Array As Object(ALMACEN,l_ruta.text) + reqManager.ExecuteQuery(cmd , 0, "valida_pedido") + + cmd.Initialize + cmd.Name = "select_cuantos_noventa_PROF" + cmd.Parameters = Array As Object(ALMACEN,l_ruta.text) + reqManager.ExecuteQuery(cmd , 0, "valida_noventa") + + cmd.Initialize + cmd.Name = "select_cuantos_pedidoc_PRO" + 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) + Checapedido + 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) + Starter.skmt.ExecNonQuery("delete from kmt_info") + Starter.skmt.ExecNonQuery("delete from cod_result") + Starter.skmt.ExecNonQuery("delete from CAT_GIRO") + Starter.skmt.ExecNonQuery("delete from hist_gest") + Starter.skmt.ExecNonQuery("delete from cat_gunaprod") + Starter.skmt.ExecNonQuery("delete from CAT_DETALLES_PAQ") + Starter.skmt.ExecNonQuery("delete from telefonos") + Starter.skmt.ExecNonQuery("delete from HIST_VENTAS") + Starter.skmt.ExecNonQuery("delete from HIST_PROMOS") + Starter.skmt.ExecNonQuery("delete from HIST_CLIENTE_CANT_PROMOS") + Starter.skmt.ExecNonQuery("delete from PROMOS_COMP") + Starter.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=Starter.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=Starter.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=Starter.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=Starter.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=Starter.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=Starter.skmt.ExecQuery("Select sum(PE_COSTO_TOT) As MONTO_DIA from pedido where PE_CLIENTE <> 0 ") + 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 + Dim cuantos_obj As String + c=Starter.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=Starter.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=Starter.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=Starter.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=Starter.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=Starter.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=Starter.skmt.ExecQuery("Select COUNT(*) AS CUANTOS FROM PEDIDO WHERE PE_CEDIS = PE_PROID ") + c.Position = 0 + If c.GetString("CUANTOS") > 0 Then + d=Starter.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=Starter.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=Starter.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 + + + SCROLL_RESDIA.Visible = False + Panel5.Visible = True + pnlTitle.Visible = False + pnlTitle.SetLayoutAnimated(0, 0, 0, CLV1.AsView.Width, TitleHeight + DividerHeight) + pnlTitle.LoadLayout("CellTitle") + CLV1.Clear + + dd=Starter.skmt.ExecQuery("SELECT SUM(PE_CANT) AS CUANTOS, PE_PRONOMBRE FROM PEDIDO GROUP BY PE_PRONOMBRE") + If dd.RowCount>0 Then + For i=0 To dd.RowCount -1 + dd.Position = i + CLV1.AddTextItem(dd.GetString("PE_PRONOMBRE"),"1") + CLV1.AddTextItem("CANTIDAD = " & dd.GetString("CUANTOS"),"1") + Next + End If + dd.Close +' c=Starter.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=Starter.skmt.ExecQuery2("SELECT SUM(PE_CANT) AS CUANTOS, PE_PRONOMBRE FROM PEDIDO WHERE PE_PROID in (select CAT_GP_ID from cat_gunaprod WHERE CAT_GP_CLASIF =? ) GROUP BY PE_PRONOMBRE", Array As String (c.GetString("CAT_GP_CLASIF"))) +' If D.RowCount>0 Then +' For i=0 To d.RowCount -1 +' d.Position = i +' CLV1.AddTextItem(D.GetString("PE_PRONOMBRE"),"1") +' CLV1.AddTextItem("CANTIDAD = " & d.GetString("CUANTOS"),"1") +' Next +' End If +' d.Close +' +' End If +' Next +' End If +' c.Close + + + + +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=Starter.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=Starter.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=Starter.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=Starter.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=Starter.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=Starter.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=Starter.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=Starter.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=Starter.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 Checapedido + c = 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 +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..cb3f8a1 --- /dev/null +++ b/B4A/C_Productos.bas @@ -0,0 +1,983 @@ +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 + + Private 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 h 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) + B4XPages.SetTitle(Me, $"${Subs.capitalizar(B4XPages.GetPageId(Me))} - ${Application.VersionName}"$) + 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 = Starter.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 + 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) + 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 + clienteId = Subs.traeCliente + rutaUsuario = Subs.traeRuta + Starter.skmt.ExecNonQuery2("UPDATE CAT_GUNAPROD SET CAT_GP_TIPOPROD = (?) WHERE CAT_GP_TIPOPROD = (?) ",Array As Object("PRIORITARIO","1")) + Starter.skmt.ExecNonQuery2("UPDATE CAT_GUNAPROD SET CAT_GP_TIPOPROD = (?) WHERE CAT_GP_TIPOPROD = (?) ",Array As Object("ESTRATEGICO","2")) + Starter.skmt.ExecNonQuery2("UPDATE CAT_GUNAPROD SET CAT_GP_TIPOPROD = (?) WHERE CAT_GP_TIPOPROD = (?) ",Array As Object("COMPLEMENTARIO","3")) + Starter.skmt.ExecNonQuery2("UPDATE CAT_GUNAPROD SET CAT_GP_TIPOPROD = (?) WHERE CAT_GP_TIPOPROD = (?) ",Array As Object("CATALOGO REGULAR","0")) + Starter.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.68) '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 - 25 + 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 = Starter.skmt.ExecQuery("select count(*) as hayPromos from cat_gunaprod where CAT_GP_TIPOPROD = 'PROMOS'") + c.Position = 0 + If c.GetInt("hayPromos") > 0 Then + lv_catalogos.AddSingleLine("PROMOS") + 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) + If reiniciarlistaProds Then + Log("Llamamos LlenaProdsLL") + LlenaProdsLL(Null) + else If hayPedido Then +' LogColor("HAY PEDIDO ANTERIOR", Colors.red) + Log("Llamamos LlenaProdsLL") + LlenaProdsLL(Null) + End If + clv_prods_ll.JumpToItem(0) 'Vamos al primer artículo de la lista. + PCLV.lblHint.SetTextSizeAnimated(0,13) + PCLV.B4XSeekBar1.Color1=Colors.DarkGray + PCLV.B4XSeekBar1.Color2=Colors.DarkGray + PCLV.B4XSeekBar1.ThumbColor=Colors.red + PCLV.B4XSeekBar1.mBase.Left=Root.Width *0.91 +' PCLV.B4XSeekBar1.mBase.Top=-50 + PCLV.B4XSeekBar1.mBase.Height=clv_prods_ll.AsView.Height + PCLV.pnlOverlay.Height = clv_prods_ll.AsView.Height + PCLV.B4XSeekBar1.Update +End Sub + +Sub PCLV_AddProds + +End Sub + +Sub lv_catalogos_ItemClick (Position As Int, Value As Object) + If Value = "CATALOGO" Then +' lfila.text = "TIPO" + lfila.text = "PRODUCTOS" + lv_catalogos.Visible = False +' lv_tipo.Visible = True + 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 = 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" + c2=Starter.skmt.ExecQuery2("select CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_PRECIO, CAT_GP_ALMACEN, CAT_GP_IMG from cat_gunaprod 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)) + 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) + Log(c2.GetString("CAT_GP_ID")) + 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=Starter.skmt.ExecQuery2("select CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_PRECIO, CAT_GP_ALMACEN, CAT_GP_IMG from cat_gunaprod 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=Starter.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 cat_gunaprod 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") + Starter.skmt.ExecNonQuery("delete from PROID") + Starter.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=Starter.skmt.ExecQuery2("select CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_PRECIO, CAT_GP_ALMACEN, CAT_GP_IMG, CAT_GP_TIPOPROD, CAT_GP_INICIATIVA from cat_gunaprod where CAT_GP_PRECIO > 0 AND CAT_GP_ALMACEN > 0 and CAT_GP_TIPOPROD <> 'PROMOS' and CAT_GP_SUBTIPO = ? ", Array As String(subtipo1)) +' Private bgColor, textColor As Int +' If c2.RowCount > 0 And clv_productos.Size <> c2.RowCount Then +' clv_productos.Clear : Log("limpiamos productos") +' For i=0 To c2.RowCount -1 +' c2.Position=i +' If c2.GetString("CAT_GP_TIPOPROD") = "PRIORITARIO" Then +' bgColor = Colors.RGB(255, 212, 163) 'naranja +' Else If c2.GetString("CAT_GP_TIPOPROD") = "COMPLEMENTARIO" Then +' bgColor = Colors.RGB(177, 200, 249)'azul +' else If c2.GetString("CAT_GP_TIPOPROD") = "CATALOGO REGULAR" Then +' bgColor = Colors.White +' else If c2.GetString("CAT_GP_TIPOPROD") = "ESTRATEGICO" Then +' bgColor = Colors.RGB(241, 255, 163) 'amarillo +' End If +' textColor = Colors.Black +' clv_productos.Add(CreateListItem(c2.GetString("CAT_GP_NOMBRE"), c2.GetString("CAT_GP_PRECIO"), c2.GetString("CAT_GP_ALMACEN"), clv_productos.AsView.Width, 60dip, bmp, c2.GetString("CAT_GP_ID"), bgColor, textColor), c2.GetString("CAT_GP_NOMBRE")) +' Next +' End If +' c2.Close +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub +' BACK key pressed +' Return True To close, False To cancel + If l_info.Visible Then + l_info.Visible = False + Return False + else if p_vistaPreviaTrans.Visible Then + p_vistaPreviaTrans.Visible = False + Return False + else if lv_promos.visible Then + lv_promos.Visible = False + lv_catalogos.Visible = True + p_botonesVenta.Visible = False + l_total.Visible = False + l_totProds.Visible = False + Return False + else if clv_prods_ll.AsView.Visible Then + lfila.text = "CATALOGO" + clv_prods_ll.AsView.Visible = False + lv_subtipo.Visible = False + p_botonesVenta.Visible = False + l_total.Visible = False + l_totProds.Visible = False + lv_catalogos.Visible = True + Return False +' else if lv_subtipo.Visible Then +' lfila.text = "TIPO" +' lv_subtipo.Visible = False +' lv_tipo.Visible = False +' Return False +' else if lv_tipo.Visible Then +' lfila.text = "CATALOGO" +' lv_tipo.Visible = False +' lv_catalogos.Visible = True +' Return False + else If entro = "4" Then + entro = "3" + B4XPage_Appear + Return True + Else If entro = "3" Then + B4XPages.ShowPage("Cliente") + Return False + Else + B4XPages.ShowPage("Cliente") + Return False + End If +End Sub + + + +Sub b_QR_Click + If ciclo = 1 Then + ciclo = 2 + ya_entro = "0" + B4XPage_Appear + else if ciclo = 2 Then + ciclo = 3 + ya_entro = "0" + B4XPage_Appear + else if ciclo = 3 Then + ciclo = 4 + ya_entro = "0" + B4XPage_Appear + else if ciclo = 4 Then + ciclo = 5 + ya_entro = "0" + B4XPage_Appear + else if ciclo = 5 Then + ciclo = 1 + ya_entro = "0" + B4XPage_Appear + End If +End Sub + +'**************************************************************************** +'***************** PARA EL MAS/MENOS ************************************* +'**************************************************************************** +Sub CreateListItem(Text As String, precioU As String, inv As Int, Width As Int, Height As Int, img As Bitmap, prodId As String, bc As Int, tc As Int) As Panel +' Dim p As B4XView = xui.CreatePanel("") +' p.SetLayoutAnimated(0, 0, 0, Width, Height) +' p.LoadLayout("prodItem") +' p_prods.Color = bc +' l_prodX.TextColor = tc +' l_prodX.TextSize = 15 +' p_prods.Height = Height +' l_prodX.Height = Height +' l_prodX.Text = Text&CRLF&"# " & inv & " $ " & precioU +' l_prodX.Tag = $"ID: ${prodId}${CRLF}${Text}${CRLF}Precio: $$1.2{precioU}${CRLF}Inv: ${inv} pzs"$ +' l_pCant.Tag = precioU&"|"&inv&"|"&prodId +' et_pCant.Tag = precioU&"|"&inv&"|"&prodId +' et_pCant.BringToFront +' Return p +End Sub + +Sub b_prodMenos_Click + etCantHasFocus = False +' 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) +' Log($"precio|stock:${laCant.tag}"$) + If laCant.Text = "" Then laCant.Text = 0 +' Log("lacant.text="&laCant.text) + laCant.Text = $"${NumberFormat2(laCant.Text-1,0,0,0,False)}"$ + If laCant.Text < 0 Then laCant.Text = 0 + Private tmpMap As Map = clv_prods_ll.GetValue(index).As(Map) + Private precio As String=clv_prods_ll.GetValue(index).As(Map).Get("precio") + Private id As String=clv_prods_ll.GetValue(index).As(Map).Get("id") + Private tmpMap As Map = CreateMap("precio":precio, "cant":laCant.Text, "almacen":Subs.traeAlmacen) +' Log(tmpMap) + prodsMap.Put(id, tmpMap) + If laCant.Text = 0 Then prodsMap.Remove(id) +' LogColor("prodsMap="&prodsMap, Colors.blue) +' (Subs.traeAlmacen, p1.Get("precio"), p1.Get("cant"), pn, p, clienteId, Subs.traeFecha, Subs.traeUsuarioDeBD, rutaUsuario, 0, B4XPages.MainPage.tipo_venta) + Subs.actualizaProducto(Subs.traeAlmacen, precio, laCant.text, Subs.traeProdNombre(id), id, clienteId, Subs.traeFecha, Subs.traeUsuarioDeBD, rutaUsuario, 0, B4XPages.MainPage.tipo_venta) + cuentaProds +' Log($"Total Prods: ${totalProds}, Total Compra: $$1.2{totalCompra}"$) +End Sub + +Sub b_prodMas_Click + etCantHasFocus = False +' 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) +' 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") + If laCant.Text = "" Then laCant.Text = 0 + + 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 +' Subs.actualizaProducto(Subs.traeAlmacen, laCant.text, id, clienteId) + Subs.actualizaProducto(Subs.traeAlmacen, precio, laCant.text, Subs.traeProdNombre(id), id, clienteId, Subs.traeFecha, Subs.traeUsuarioDeBD, rutaUsuario, 0, B4XPages.MainPage.tipo_venta) + cuentaProds +' Log($"Total Prods: ${totalProds}, Total Compra: $$1.2{totalCompra}"$) +End Sub + +Private Sub et_pCant_TextChanged (Old As String, New As String) +'' LogColor($"txt changed: ${Old}|${New}, hasfocus=${etCantHasFocus}"$,Colors.Magenta) +' Dim index As Int = clv_prods_ll.GetItemFromView(Sender) +' Private inv As String=clv_prods_ll.GetValue(index).As(Map).Get("almacen") +' If(New = "" Or New = Null) Then New = 0 +' If(New > inv) Then +' Sender.As(EditText).text = inv +' End If +'' Log($"inventario=${inv}"$) +' If Not(Old = "0" And New = "") And etCantHasFocus Then cuentaProds + + + 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) + 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=clv_prods_ll.GetValue(index).As(Map).Get("almacen") + If(New = "" Or New = Null) Then New = 0 + If(New > inv) Then + Sender.As(EditText).text = inv + End If + ' Log($"inventario=${inv}"$) + If Not(Old = "0" And New = "") And laCant.Text <> Null And laCant.Text <> 0 And laCant.Text <> "" And etCantHasFocus Then + Subs.actualizaProducto(Subs.traeAlmacen, precio, laCant.text, Subs.traeProdNombre(id), id, clienteId, Subs.traeFecha, Subs.traeUsuarioDeBD, rutaUsuario, 0, B4XPages.MainPage.tipo_venta) + cuentaProds + End If + 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 = Starter.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 +End Sub + +Private Sub et_pCant_FocusChanged (HasFocus As Boolean) + LogColor($"focus changed=${HasFocus}"$, Colors.Magenta) + etCantHasFocus = HasFocus + cuentaProds +End Sub + +Sub b_terminar1_Click +' Log("b_terminar1_Click") +' ya_entro = "0" : Log("ya_entro=1") + Starter.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 = 50dip + Private c_prods As Cursor=Starter.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 + 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 Not(IsNumber(c_prods.GetString("PE_CEDIS"))) Then textColor = Colors.RGB(210,105,30) 'Si es promo, cambiamos el color del texto. + + Dim label2 As Label + label2 = lv_prodsPedido.TwoLinesLayout.SecondLabel + label2.TextSize = 15 + 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")) + folio = c_prods.GetString("PE_FOLIO") + Next + 'select PE_PRONOMBRE,PE_COSTO_TOT, PE_CANT, PE_FOLIO, PE_CEDIS FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) + c=Starter.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 )") + C.Position=0 + l_cant.Text = c.GetString("PC_NOART") + l_total2.Text = c.GetString("PC_MONTO") + c.Close + End If + c_prods.Close + p_vistaPreviaTrans.Width = Root.Width + 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 + 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 = Starter.skmt.ExecQuery($"select CAT_GP_ID from cat_gunaprod 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 = Starter.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) + 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=Starter.skmt.ExecQuery2("select PE_PROID,PE_CANT FROM PEDIDO where pe_pronombre = ? and pe_cliente in (Select CUENTA from cuentaa) ", Array As String(Value)) + c.Position=0 + Log("aqui1") + Starter.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"))) + Starter.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)) + c.Close + Log("aqui2") + c=Starter.skmt.ExecQuery2("select count(*) AS CUANTOS from cat_gunaprod 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)) + c.Position=0 + If c.GetString("CUANTOS") > 0 Then + Starter.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)", Array As Object(Value)) + Log("aqui3") + Else + Starter.skmt.ExecNonQuery2("delete from pedido where pe_pronombre = ? and pe_cliente in (Select CUENTA from cuentaa)", Array As Object(Value)) + Log("aqui4") + End If + DateTime.DateFormat = "MM/dd/yyyy" + sDate=DateTime.Date(DateTime.Now) + sTime=DateTime.Time(DateTime.Now) + c=Starter.skmt.ExecQuery("Select CUENTA from cuentaa") + c.Position=0 + clie_id = c.GetString("CUENTA") + c=Starter.skmt.ExecQuery("select USUARIO from usuarioa") + c.Position=0 + usuario = c.GetString("USUARIO") + c=Starter.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") + Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + Starter.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)) +' Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + + Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + h =Starter.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") + Starter.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") + Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + h =Starter.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 = 30 'List size + For i = Max(0, FirstIndex - ExtraSize) To Min(LastIndex + ExtraSize, clv_prods_ll.Size - 1) + Dim Pnl As B4XView = clv_prods_ll.GetPanel(i) + If i > FirstIndex - ExtraSize And i < LastIndex + ExtraSize Then +' Log(listaRenglones) + If Pnl.NumberOfViews = 0 Then 'Add each item/layout to the list/main layout + Pnl.LoadLayout("proditem") + p_prods.Width = Root.Width * 0.92 + p_botMasMen.Left = p_prods.Width - (p_botMasMen.Width + 5) + Log("1") + p_prods.Height = 200dip + Log("2") + Pnl.Height = 300dip +' p_prods.Height = 200dip + Private cs As CSBuilder + cs.Initialize + l_prodX.SetTextSizeAnimated(0, 13) + If clv_prods_ll.GetValue(i).As(Map).Get("cant") <> Null And clv_prods_ll.GetValue(i).As(Map).Get("cant") > 0 Then + p_prods.Color=0xFFE2EEFF + et_pCant.TextColor=Colors.Red + If Subs.pedidoGuardado Then + Log("YA SE GUARDO") + et_pCant.Enabled = False +' b_prodMas.Enabled = False + b_prodMenos.Enabled = False + End If + End If + Private precio As String=NumberFormat2(clv_prods_ll.GetValue(i).As(Map).Get("precio").As(Double),1,2,2,False) +' Log(clv_prods_ll.GetValue(i).As(Map)) + If clv_prods_ll.GetValue(i).As(Map).Get("cant") <> Null Then et_pCant.Text = clv_prods_ll.GetValue(i).As(Map).Get("cant") + + l_prodX.Text = cs.Color(Colors.red).append(clv_prods_ll.GetValue(i).As(Map).Get("id")).append(CRLF).append(clv_prods_ll.GetValue(i).As(Map).Get("prod")).pop.append(CRLF).Append("Existencias: " & clv_prods_ll.GetValue(i).As(Map).Get("almacen")).Color(0xFF017F01).Append($" $${precio}"$).Popall + End If +' Log($"${i}, ${FirstIndex}, ${LastIndex}, ${Pnl.NumberOfViews}. ${clv_prods_ll.Size}"$) + Else 'Not visible + ' If Pnl.NumberOfViews > 0 Then + ' Pnl.RemoveAllViews 'Remove none visable item/layouts from the list/main layout + ' End If + End If + PCLV.B4XSeekBar1.Value = clv_prods_ll.Size - FirstIndex +' Log($"Bar value: ${PCLV.B4XSeekBar1.Value}"$) + Next +End Sub + +Sub Busca_TextChanged (Old As String, New As String) +' Private inicioContador As String = DateTime.Now + If Not(clv_prods_ll.AsView.Visible) Then clv_prods_ll.AsView.Visible = True + If (New.Length = 1 Or New.Length = 2) And Not(forzarBusqueda) Then Return + forzarBusqueda = False + clv_prods_ll.Clear + listaProds.Initialize + listaHints.Initialize + Sleep(0) +' Dim p As ResultSet = Starter.skmt.ExecQuery($"select CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_ALMACEN, CAT_GP_PRECIO, CAT_GP_TIPOPROD from CAT_GUNAPROD where CAT_GP_NOMBRE like '%${New}%' and CAT_GP_PRECIO > 0 AND CAT_GP_ALMACEN > 0 and CAT_GP_CLASIF <> 'PROMOS' And CAT_GP_TIPOPROD2 <> '2' order by CAT_GP_NOMBRE"$) + Dim p As ResultSet = Starter.skmt.ExecQuery($"select CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_ALMACEN, CAT_GP_PRECIO, CAT_GP_TIPOPROD from CAT_GUNAPROD where (CAT_GP_NOMBRE like '%${New}%' or CAT_GP_ID like '%${New}%') and CAT_GP_PRECIO > 0 AND CAT_GP_ALMACEN > 0 and CAT_GP_CLASIF <> 'PROMOS' order by CAT_GP_NOMBRE"$) + Log("Llamamos LlenaProdsLL") + LlenaProdsLL(p) +' Do While p.NextRow +' Dim tempMap As Map = CreateMap("prod":p.GetString("CAT_GP_NOMBRE"), "precio":p.GetString("CAT_GP_PRECIO"), "almacen":p.GetString("CAT_GP_ALMACEN"), "id":p.GetString("CAT_GP_ID")) +' listaProds.Add(tempMap) +' listaHints.Add(p.GetString("CAT_GP_NOMBRE")) +' Dim Pnl As B4XView = xui.CreatePanel("") +' Pnl.SetLayoutAnimated(0, 0, 0, clv_prods_ll.AsView.Width, 50dip) 'Panel height + 4 for drop shadow +' clv_prods_ll.Add(Pnl, tempMap) +' Loop +' LogColor(clv_prods_ll.Size, Colors.red) +'' Log(listaProds) +' p.Close +' PCLV.B4XSeekBar1.MaxValue = clv_prods_ll.Size +' PCLV.B4XSeekBar1.MinValue = 0 +' PCLV.B4XSeekBar1.Interval = clv_prods_ll.Size/10 +' PCLV.B4XSeekBar1.Value = clv_prods_ll.Size +' PCLV.B4XSeekBar1.Update +' Log($"Min:0, max:${clv_prods_ll.Size}, Interval:${clv_prods_ll.Size/10}"$) +' LogColor("TIEMPO DE PROCESO DEL TEXTCHANGED: " & ((DateTime.Now-inicioContador)/1000), Colors.Red) +End Sub + +Sub LlenaProdsLL(p As ResultSet) +' Log("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 = Starter.skmt.ExecQuery($"select PE_PROID, PE_CANT from PEDIDO where PE_CLIENTE = '${clienteId}' and PE_CEDIS = '${Subs.traeAlmacen}'"$) +' LogColor("Ponemos productos de pedido anterior: "&pe.RowCount, Colors.red) + Do While pe.NextRow + Private cant As Int = 0 + cantsMap.put(pe.GetString("PE_PROID"), pe.GetString("PE_CANT")) + Loop + pe.Close + End If +' Log(p.IsInitialized) + If p.IsInitialized Then +' Log("YA HAY RESULSET") + Else +' Log("NO HAY RESULSET") + Dim p As ResultSet = Starter.skmt.ExecQuery($"select CAT_GP_ID, CAT_GP_NOMBRE, CAT_GP_ALMACEN, CAT_GP_PRECIO, CAT_GP_TIPOPROD from CAT_GUNAPROD where CAT_GP_PRECIO > 0 And CAT_GP_ALMACEN > 0 And CAT_GP_CLASIF <> 'PROMOS' order by CAT_GP_NOMBRE"$) + End If + + Do While p.NextRow + Private cant As Int = 0 + If hayPedido And cantsMap.ContainsKey(p.GetString("CAT_GP_ID")) Then cant = cantsMap.Get(p.GetString("CAT_GP_ID")) + Dim tempMap As Map = CreateMap("prod":p.GetString("CAT_GP_NOMBRE"), "precio":p.GetString("CAT_GP_PRECIO"), "almacen":p.GetString("CAT_GP_ALMACEN"), "id":p.GetString("CAT_GP_ID"), "cant":cant) + listaProds.Add(tempMap) + Loop + p.Close +' Log(listaProds) + PCLV.Commit + clv_prods_ll.Clear + Private listaProdsConCant, listaProdsConCantIndex As List + listaProdsConCant.Initialize + listaProdsConCantIndex.Initialize + listaHints.Initialize + For q=0 To listaProds.Size-1' Sacamos los productos con cantidad previa. + If listaProds.Get(q).As(Map).Get("cant").As(Int) <> 0 Then +' Log(listaProds.Get(q).As(Map).Get("cant")) + listaProdsConCant.Add(listaProds.Get(q)) + listaProdsConCantIndex.Add(q) + End If + Next +' Log(listaProdsConCantIndex) + Private cont As Int = 0 + For pr0=0 To listaProdsConCant.Size - 1 'Agregamos los productos con cantidad previa. + Private Pnl As B4XView = xui.CreatePanel("") + Pnl.SetLayoutAnimated(0, 0, 0, clv_prods_ll.AsView.Width, 50dip) + 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, 60dip) + clv_prods_ll.Add(Pnl, listaProds.Get(pr)) + listaHints.Add(listaProds.get(pr).As(Map).Get("prod")) + cont = cont + 1 + End If + Next +' LogColor(clv_prods_ll.Size, Colors.red) +' PCLV.Commit +' Log("CONT=" & cont) +' Log("CLV_PRODSLL="&clv_prods_ll.Size) + PCLV.B4XSeekBar1.MaxValue = clv_prods_ll.Size + PCLV.B4XSeekBar1.MinValue = 0 + PCLV.B4XSeekBar1.Interval = clv_prods_ll.Size/20 + PCLV.B4XSeekBar1.Value = clv_prods_ll.Size + PCLV.B4XSeekBar1.Update +' Log($"Min:0, max:${clv_prods_ll.Size}, Interval:${clv_prods_ll.Size/20}"$) + reiniciarlistaProds = False +End Sub + +'Return the hint that will be displayed when the user fast scrolls the list. It can be a string or CSBuilder. +Sub PCLV_HintRequested(Index As Int) As Object + Dim word As String = listaHints.get(Index) + Return word +End Sub \ No newline at end of file diff --git a/B4A/C_Promos.bas b/B4A/C_Promos.bas new file mode 100644 index 0000000..33d1921 --- /dev/null +++ b/B4A/C_Promos.bas @@ -0,0 +1,449 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=11.5 +@EndOfDesignText@ +Sub Mods 'ignore + '20230526 - Se cambió en b_terminar_click y b_continuar_click la funcion "guardaProducto" por "guardaProductoSinGestion", para que no ponga que ya esta guardada la orden y no deje borrar productos. +End Sub + +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 As CustomListView + Private l_prodsFijos As Label + Private l_prodsVariables As Label + Private i_prod As ImageView + Private l_prodX As Label + Private p_prods As Panel + Private b_prodMenos As Button + Private et_pCant As EditText + Private b_prodMas As Button + Private l_pCant As Label + Dim totalProds As Int = 0 + Dim prodsVarReq 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 As Panel + Dim laPromo = "", elCliente = "" As String + Dim prodsPedidoActual As String 'ignore + Dim montoPedidoActual As String 'ignore + Dim promosMap As Map +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("promociones") + promosMap.Initialize +End Sub + +Sub B4XPage_Appear +' LogColor(B4XPages.MainPage.productos.prodsMap, Colors.blue) + p_promociones.Top=0 + p_promociones.Left=0 + p_promociones.Height=Root.Height + p_promociones.Width=Root.Width + b_terminar1.Left = Root.Width - (b_terminar1.Width + 10) + b_continuar.Left = Root.Width - b_terminar1.Width - (b_continuar.Width + 20) + 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) + '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") + Private listaPreciosPV As List = mp.Get("prodsVariablesPrecios") + 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") + prodsVarReq2 = prodsVarReq + l_prodsVariables.Text = $"Productos variables requeridos: ${prodsVarReq}"$ + 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(pv) + If thisLog Then Log("invDisp=" & invDispPromo) + clv_prodsVariabes.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. +' c2.Position=i +' jpeg = c2.GetBlob("CAT_GP_IMG") +' ins.InitializeFromBytesArray(jpeg, 0, jpeg.Length) +' bmp.Initialize2(ins) + Private indicePV As String = pv.IndexOf(p) + Private estePrecio as string = listaPreciosPV.Get(indicePV) + 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 + 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("proditempromo") + l_prodX.TextSize = 15 + l_prodX.Text = Text + l_prodX.TextSize = 15 + p_prods.Height = Height + p_prods.Width = clv_prodsVariabes.GetBase.Width + l_prodX.Height = Height +' l_pCant.Text = 0 + l_pCant.Tag = precioU&"|"&inv&"|"&prodId + et_pCant.Tag = precioU&"|"&inv&"|"&prodId + et_pCant.BringToFront +' i_prod.Bitmap = img + 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 totalProds < prodsVarReq + tpf 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 + +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 + If thisLog Then LogColor($"ProdsFijos=${tpf}, totalProds=${totalProds}, totalCompra=${totalCompra}"$, Colors.Red) + prodsIds2.Clear + prodsCants2.Clear + prodsPrecios2.Clear + lv_prodsFijos.Clear + 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. + 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 + 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 + 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 + tpf Or totalProds > prodsVarReq + 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: ${prodsVarReq2 * et_promoCant.Text.As(Int)}"$ + tpf = tpf2 * et_promoCant.Text.As(Int) + prodsVarReq = 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: ${prodsVarReq2 * et_promoCant.Text.As(Int)}"$ + tpf = tpf2 * et_promoCant.Text.As(Int) + prodsVarReq = prodsVarReq2 * et_promoCant.Text.As(Int) + Log($"Max promos=${et_promoCant.Text.As(Int)}, Prods fijos=${tpf}, "$) + End If + If et_promoCant.text > maxCantPromos Then et_promoCant.Text = maxCantPromos + cuentaProds +End Sub + +Private Sub b_terminar1_Click + cuentaProds + Log("====================================================================") + For t = 0 To prodsIds.Size - 1 'Guardamos los productos fijos de la promocion en pedido. + Private pn As String = Subs.traeProdNombre(prodsIds.Get(t)) + If prodsCants.Get(t) > 0 Then Subs.guardaProductoSinGestion(estaPromo, prodsPrecios.Get(t), prodsCants.Get(t), pn, prodsIds.Get(t), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, B4XPages.MainPage.tipo_venta) + Next + For t = 0 To prodsIds2.Size - 1 'Guardamos los productos variables de la promocion en pedido. + Private pn As String = Subs.traeProdNombre(prodsIds2.Get(t)) + Subs.guardaProductoSinGestion(estaPromo, prodsPrecios2.Get(t), prodsCants2.Get(t), pn, prodsIds2.Get(t), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, B4XPages.MainPage.tipo_venta) + Next +' Log(B4XPages.MainPage.productos.prodsMap) +' For o=0 To prodsIds.Size - 1 'Ponemos los productos fijos en el mapa de la compra. +' Private tmpMap As Map = CreateMap("precio":prodsPrecios.Get(o), "cant":prodsCants.Get(o), "almacen":estaPromo) +'' Log(tmpMap) +' If prodsCants.Get(o) > 0 Then B4XPages.MainPage.productos.prodsMap.Put(estaPromo&"|"&prodsIds.Get(o), tmpMap) +' Next +' For o=0 To prodsIds2.Size - 1 'Ponemos los productos variables en el mapa de la compra. +' Private tmpMap As Map = CreateMap("precio":prodsPrecios2.Get(o), "cant":prodsCants2.Get(o), "almacen":estaPromo) +'' Log(tmpMap) +' B4XPages.MainPage.productos.prodsMap.Put(estaPromo&"|"&prodsIds2.Get(o), tmpMap) +' Next +' LogColor(B4XPages.MainPage.productos.prodsMap, Colors.red) + lv_prodsFijos.Clear + B4XPages.MainPage.bTerminarClicked = True + B4XPages.ShowPage("productos") + B4XPages.MainPage.productos.b_terminar1_Click +End Sub + +Private Sub b_continuar_Click + cuentaProds + Log("====================================================================") + For t = 0 To prodsIds.Size - 1 'Guardamos los productos fijos de la promocion en pedido. + Private pn As String = Subs.traeProdNombre(prodsIds.Get(t)) + Subs.guardaProductoSinGestion(estaPromo, prodsPrecios.Get(t), prodsCants.Get(t), pn, prodsIds.Get(t), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, B4XPages.MainPage.tipo_venta) + Next + For t = 0 To prodsIds2.Size - 1 'Guardamos los productos variables de la promocion en pedido. + Private pn As String = Subs.traeProdNombre(prodsIds2.Get(t)) + Subs.guardaProductoSinGestion(estaPromo, prodsPrecios2.Get(t), prodsCants2.Get(t), pn, prodsIds2.Get(t), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, B4XPages.MainPage.tipo_venta) + Next +' Log(B4XPages.MainPage.productos.prodsMap) +' For o=0 To prodsIds.Size - 1 'Ponemos los productos fijos en el mapa de la compra. +' Private tmpMap As Map = CreateMap("precio":prodsPrecios.Get(o), "cant":prodsCants.Get(o), "almacen":estaPromo) +'' Log(tmpMap) +' If prodsCants.Get(o) > 0 Then B4XPages.MainPage.productos.prodsMap.Put(estaPromo&"|"&prodsIds.Get(o), tmpMap) +' Next +' For o=0 To prodsIds2.Size - 1 'Ponemos los productos variables en el mapa de la compra. +' Private tmpMap As Map = CreateMap("precio":prodsPrecios2.Get(o), "cant":prodsCants2.Get(o), "almacen":estaPromo) +'' Log(tmpMap) +' B4XPages.MainPage.productos.prodsMap.Put(estaPromo&"|"&prodsIds2.Get(o), tmpMap) +' Next +' LogColor(B4XPages.MainPage.productos.prodsMap, Colors.red) + lv_prodsFijos.Clear +' Activity_KeyPress(KeyCodes.KEYCODE_BACK) +' CallSubDelayed2(productos, "Activity_KeyPress", KeyCodes.KEYCODE_BACK) + Private prodspage As C_Productos 'ignore + 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..cf0baaf --- /dev/null +++ b/B4A/C_RespaldoDiario.bas @@ -0,0 +1,186 @@ +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 Dirp As String = File.DirRootExternal + Dim Dir As String +' Dim Dir2 As String + Try + File.MakeDir(Dirp,"/kmts") + Dir = "/kmts" +' Log("creado en kmts " & Dirp & Dir) + Catch + Dir = "" +' Log("creado en raiz") + End Try + safePath = Dirp & Dir + rkmt.Initialize(safePath,"md.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, pe_envio_ok TEXT)"$) +' 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 inventarios2 (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)"$) + If chkIfTableExists(skmt, "PEDIDO") Then rkmt.ExecNonQuery($"create table if not exists PEDIDO (${getTableColumnList(skmt, "PEDIDO")}, FECHA TEXT)"$) + If chkIfTableExists(skmt, "CAT_DETALLES_PAQ") Then rkmt.ExecNonQuery($"create table if not exists CAT_DETALLES_PAQ (${getTableColumnList(skmt, "CAT_DETALLES_PAQ")}, FECHA TEXT)"$) + If chkIfTableExists(skmt, "CAT_GUNAPROD") Then rkmt.ExecNonQuery($"create table if not exists CAT_GUNAPROD (${getTableColumnList(skmt, "CAT_GUNAPROD")}, FECHA TEXT)"$) + If chkIfTableExists(skmt, "CAT_GUNAPROD2") Then rkmt.ExecNonQuery($"create table if not exists CAT_GUNAPROD2 (${getTableColumnList(skmt, "CAT_GUNAPROD2")}, 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 "skmt1" y si no, la monta +'Para que "rkmt" vea a "skmt", es necesario montarla (attach). +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 "skmt1" 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 respalda_pedido + Private inicio As String = DateTime.Now +' Log("Copiando PEDIDO ...") + Private lasCols As String = getTableColumnListName(skmt, "PEDIDO") + rkmt.BeginTransaction + rkmt.ExecNonQuery($"delete from PEDIDO where FECHA = '${fechaHoy}'"$) + rkmt.ExecNonQuery($"insert into PEDIDO (${lasCols}, FECHA) select ${lasCols}, '${fechaHoy}' as FECHA 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 respalda_cat_gunaprod + Private inicio As String = DateTime.Now +' Log("Copiando CAT_GUNAPROD ...") + Private lasCols As String = getTableColumnListName(skmt, "CAT_GUNAPROD") + lasCols = lasCols.Replace(", CAT_GP_IMG", "") 'Quitamos la imagen del respaldo. + rkmt.BeginTransaction + rkmt.ExecNonQuery($"delete from CAT_GUNAPROD where FECHA = '${fechaHoy}'"$) + rkmt.ExecNonQuery($"insert into CAT_GUNAPROD (${lasCols}, FECHA) select ${lasCols}, '${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 respalda_cat_detalle_paq + Private inicio As String = DateTime.Now +' Log("Copiando CAT_DETALLES_PAQ ...") + Private lasCols As String = getTableColumnListName(skmt, "CAT_DETALLES_PAQ") + rkmt.BeginTransaction + rkmt.ExecNonQuery($"delete from CAT_DETALLES_PAQ where fecha = '${fechaHoy}'"$) + rkmt.ExecNonQuery($"insert into CAT_DETALLES_PAQ (${lasCols}, FECHA) select ${lasCols}, '${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 + +'Realiza un "vacuum" de la base de datos "rkmt". +Sub vacuum + Log("Vacuum") + rkmt.ExecNonQuery("vacuum;") +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(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 + +'Regresa los nombres y tipos de las columnas de una tabla dada. +Sub getTableColumnList(db As SQL, table As String) As String 'ignore + Private l As String = "" + If chkIfTableExists(db, table) Then + Private c As Cursor = db.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 + +'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 = db.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 + +'Revisa si una tabla dada existe en una base de datos dada, regresa true o false. +Sub chkIfTableExists(db As SQL, table As String) As Boolean 'ignore + Private t As Boolean = False 'ignore + Private c As Cursor = db.ExecQuery($"SELECT name FROM sqlite_master WHERE type='table' AND name='${table}'"$) + If c.RowCount > 0 Then t = True + c.Close + Return t +End Sub \ No newline at end of file diff --git a/B4A/C_Subs.bas b/B4A/C_Subs.bas new file mode 100644 index 0000000..777eff4 --- /dev/null +++ b/B4A/C_Subs.bas @@ -0,0 +1,607 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=12.2 +@EndOfDesignText@ +Sub Class_Globals + 'These global variables will be declared once when the application starts. + 'These variables can be accessed from all modules. +' Public GZip As GZipStrings 'Usa la libreria CompressStrings +' Private su As StringUtils 'Usa la libreria StringUtils + Dim reqManager As DBRequestManager + Private EventName As String 'ignore + Private CallBack As Object 'ignore + Dim phn As Phone + Dim devModel As String + Dim db, kmt, errorLog As SQL 'Requiere la libreria "SQL" 'ignore + Dim ssid As String 'ignore + Dim reqsList As List + Dim reqError As Boolean = False + Private subsLogs As Boolean = False +End Sub + +'You can add more parameters here. +Public Sub Initialize (vCallback As Object, vEventName As String) As Object + reqsList.Initialize + EventName = vEventName + CallBack = vCallback + db = dbInit + reqManager = reqManagerInit + Return Me +End Sub + +'Inicializa la BD con "kmt.db" en File.DirInternal, si el archivo no existe, lo copia desde File.DirAssets. +'Dispara el evento "dbOk" cuando termina. +Sub dbInit As SQL + If File.Exists(File.DirInternal, "kmt.db") = False Then File.Copy(File.DirAssets, "kmt.db", File.DirInternal, "kmt.db") + db.Initialize(File.DirInternal,"kmt.db", True) + dbOk(True) +' Log(db.IsInitialized) + Return db +End Sub + +Sub dbOk(Success As Boolean) + If SubExists(CallBack, EventName & "_dbOk") Then + CallSub2(CallBack, EventName & "_dbOk", Success) + End If +End Sub + +'Inicializamos el DBReqServer. +Sub reqManagerInit As DBRequestManager + Private rm As DBRequestManager + rm.Initialize(Me, traeDBReqServerDeBD(db)) + Log($"Inicializamos reqManager con ${traeDBReqServerDeBD(db)}"$) + Return rm +End Sub + +'Reinicializamos el DBReqServer de C_Subs. +Sub reqManagerReInit + Log("reqManager ReInit") + reqManager = reqManagerInit +End Sub + +Sub envioTest + reqsList.Initialize ' Ponemos la lista de DBRequests en cero. + Private cmd As DBCommand + cmd.Initialize + cmd.Name = "select_fecha" + For i = 0 To 50 +' Sleep(200) + reqManager.ExecuteQuery(cmd, 0, $"select_fecha_${i}"$) + reqsList.Add($"select_fecha_${i}"$) + Next +End Sub + +'Dispara el evento "_envioOk" del caller. +Sub envioOk(Success As Boolean) +' Log($"_ENVIOOK_"$) + If SubExists(CallBack, EventName & "_envioOk") Then + CallSub2(CallBack, EventName & "_envioOk", Success) + End If +End Sub + +Sub JobDone(Job As HttpJob) + LogColor("C_SUBS JOBDONE - " & Job.Success, Colors.Red) + If Job.Success = False Then + Log($"Error en el request ${Job.Tag}"$) + LogColor("** " & Job.Tag & " Error: " & Job.ErrorMessage, Colors.Red) + If reqsList.IndexOf(Job.Tag) > -1 Then reqsList.RemoveAt(reqsList.IndexOf(Job.Tag)) + reqError = True + Else + If Job.JobName = "DBRequest" Then + Dim resultado As DBResult = reqManager.HandleJob(Job) + If reqsList.IndexOf(resultado.Tag) > -1 Then reqsList.RemoveAt(reqsList.IndexOf(resultado.Tag)) + If resultado.Tag = "select_fecha" Then + For Each records() As Object In resultado.Rows + For Each k As String In resultado.Columns.Keys + Log(resultado.Tag & ": " & k & ": " & records(resultado.Columns.Get(k))) + Next + Next + End If + End If + End If + Log(reqsList.Size) + If reqsList.Size = 0 Then 'Ya no hay DBReqs pendientes. + Log(reqError) + If Not(reqError) Then + envioOk(True) + Else + envioOk(False) + End If + reqError = False + Log("-= FIN =-") + End If + Job.Release +End Sub + +'Pone el valor de phn.Model en la variable global "devModel" +Sub getPhnId As String 'ignore + 'Requiere la libreria "Phone" + devModel = phn.Model + If devModel.Length <= 3 Then 'Si phn.Model esta en blanco ... + Dim t As String = phn.GetSettings("android_id") 'Intentamos con "android_id" + devModel = t + End If + If devModel.Length >= 3 Then 'Si tenemos valor para phn.Model + File.WriteString(File.DirInternal, "phnId.txt", devModel) 'Sobreescribimos archivo phnId.txt with deviceId +' Log("Tenemos phnId: "&devModel&" "&File.DirInternal&"/phn.txt sobreescrito") + Else If devModel.Length < 3 Then ' Si no tenemos valor, lo leemos de phnId.txt + Dim s As String = File.ReadString(File.DirInternal, "phnId.txt") + devModel = s +' Log("Leemos id de "&File.DirInternal&"/phnId.txt") +' Log(devModel) + End If + Return devModel +End Sub + +'Convierte una fecha al formato yyMMddHHmmss +Sub fechaKMT(fecha As String) As String 'ignore +' Log(fecha) + Dim OrigFormat As String = DateTime.DateFormat 'save orig date format + DateTime.DateFormat="yyMMddHHmmss" + Dim nuevaFecha As String=DateTime.Date(fecha) + DateTime.DateFormat=OrigFormat 'return to orig date format +' Log(nuevaFecha) + Return nuevaFecha +End Sub + +'Escribimos las coordenadas y fecha a un archivo de texto +Sub guardaInfoEnArchivo(coords As String) 'ignore + ' Cambiamos el formato de la hora + Dim OrigFormat As String=DateTime.DateFormat 'save orig date format + DateTime.DateFormat="MMM-dd HH:mm:ss" + Dim lastUpdate As String=DateTime.Date(DateTime.Now) + DateTime.DateFormat=OrigFormat 'return to orig date format + + Dim ubic As String = coords&","&lastUpdate + Dim out As OutputStream = File.OpenOutput(File.DirRootExternal, "gps.txt", True) + Dim s As String = ubic & CRLF + Dim t() As Byte = s.GetBytes("UTF-8") + out.WriteBytes(t, 0, t.Length) + out.Close +End Sub + +'Escribimos las coordenadas (latitud, longitud, fecha) y fecha a una BD +Sub guardaInfoEnBD(coords As String) 'ignore + Log("Guardamos ubicacion en BD - "&coords) + Try + Dim latlon() As String = Regex.Split("\|", coords) + If latlon.Length < 2 Then latlon = Regex.Split(",", coords) 'Si son menos de 2, entonces estan separadas por comas y no por "|" + If subsLogs Then Log("LatLon="&latlon) + kmt.ExecNonQuery2("INSERT INTO RUTA_GPS(FECHA, LAT, LON) VALUES (?,?,?)", Array As Object (latlon(2),latlon(0),latlon(1))) + Catch + LogColor(LastException, Colors.red) + End Try +End Sub + +'Limpiamos la tabla RUTA_GPS de la BD +Sub deleteGPS_DB 'ignore + kmt.ExecNonQuery("delete from RUTA_GPS") + kmt.ExecNonQuery("vacuum;") + ToastMessageShow("Borramos BD Coords GPS", False) +End Sub + +'Limpiamos la tabla errorLog de la BD +Sub deleteErrorLog_DB 'ignore + errorLog.ExecNonQuery("delete from errores") + errorLog.ExecNonQuery("vacuum;") + ToastMessageShow("BD Errores Borrada", False) +End Sub + +'Mandamos "coords" en un mensaje a "Sprvsr" +'Sub mandamosLoc(coords As String) 'ignore +'' Log("Iniciamos mandamosLoc "&coords) +'' Log("locRequest="&Tracker.locRequest) +' guardaInfoEnBD(coords)'Escribimos coordenadas y fecha a una bd +' Dim t As String +' If Tracker.locRequest="Activa" Then +' If PushService.au = 1 Then +' t = "au" ' es una actualizacion +' Else +' t = "u" ' es una peticion +' End If +' Dim params As Map = CreateMap("topic":"Sprvsr", "coords":coords, "t":t, "b":PushService.battery, "mt":Main.montoActual) +' CallSub2(PushService, "mandaMensaje",params) +' Tracker.locRequest="Enviada" +' CallSubDelayed(Tracker,"CreateLocationRequest") +' End If +'End Sub + +'Regresa la fecha y hora de hoy a las 00:00 en el formato "yyMMddHHMMSS" +Sub fechaInicioHoy As String 'ignore + Dim OrigFormat As String = DateTime.DateFormat 'save orig date format + DateTime.DateFormat="yyMMdd" + Private h As String = DateTime.Date(DateTime.Now)&"000000" + DateTime.DateFormat=OrigFormat 'return to orig date format + Log("Hoy="&h) + Return h +End Sub + +'Guardamos "texto" a la bitacora +Sub log2DB(texto As String) 'ignore + LogColor(fechaKMT(DateTime.Now)&" - log2BD: '"&texto&"'", Colors.LightGray) + kmt.ExecNonQuery2("INSERT INTO bitacora(fecha, texto) VALUES (?,?)", Array As Object (fechaKMT(DateTime.now), texto)) +End Sub + +'Regresa verdadero si ya pasaron XX minutos de la fecha dada +Sub masDeXXMins(hora As Int, mins As Int) As Boolean 'ignore + If (hora + mins * DateTime.TicksPerMinute) < DateTime.Now Then + Return True + Else + Return False + End If +End Sub + +'Regresa verdadero si ya pasaron XX minutos de la fechaKMT dada +Sub masDeXXMinsKMT(hora As String, mins As Int) As Boolean 'ignore + Try + ' LogColor($"Hora=${fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute)}, Mins=${mins}, Actual=${fechaKMT(DateTime.Now)}"$,Colors.red) + If fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute < DateTime.Now Then + ' Log("+++ +++ "&fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute) & " < " & fechaKMT(DateTime.Now)) + Return True + Else + ' Log("+++ +++ "&fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute) & " > " & fechaKMT(DateTime.Now)) + Return False + End If + Catch + Log(LastException) + End Try +End Sub + +'Limpiamos la tabla "bitacora" de la BD +Sub borraLogDB 'ignore + LogColor("Borramos BD de log", Colors.Magenta) + kmt.ExecNonQuery("delete from bitacora") + kmt.ExecNonQuery("vacuum;") +End Sub + +'Monitoreamos los servicios para ver si estan activos (No pausados), y si no, los reniciamos +'Sub Monitor 'ignore +' Private monitorStatus As Boolean = True +' LogColor("Corriendo Subs.Monitor", Colors.RGB(161,150,0)) +' If IsPaused(Tracker) Then +' log2DB("Reiniciando 'Tracker Pausado' desde Subs.Monitor") +' StartService(Tracker) +' monitorStatus = False +' Else +' CallSubDelayed(Tracker, "revisaFLP") +' End If +' If IsPaused(PushService) Then +' log2DB("Reiniciando 'PushService Pausado' desde Subs.Monitor") +' StartService(PushService) +' monitorStatus = False +' Else +' revisaPushService +' End If +' If monitorStatus Then LogColor(" +++ +++ Servicios Activos", Colors.Green) +'End Sub + +'Convierte una fecha en formato YYMMDDHHMMSS a Ticks +Sub fechaKMT2Ticks(fKMT As String) As Long 'ignore + Try + If fKMT.Length = 12 Then + Private parteFecha As String = fKMT.SubString2(0,6) + Private parteHora As String = fKMT.SubString(6) + Private OrigFormat As String = DateTime.DateFormat 'save original date format + DateTime.DateFormat="yymmdd" + DateTime.TimeFormat="HHmmss" + Private ticks As Long = DateTime.DateTimeParse(parteFecha,parteHora) + DateTime.DateFormat=OrigFormat 'return to original date format + Return ticks + Else + Log("Formato de fecha incorrecto, debe de ser 'YYMMDDHHMMSS', no '"&fKMT&"' largo="&fKMT.Length) + Return 0 + End If + Catch + Log(LastException) + LogColor($"Fecha dada: ${fKMT}, Parte Fecha: ${parteFecha}, Parte Hora: ${parteHora}"$, Colors.Red) + Return 0 + End Try +End Sub + +Sub InstallAPK(dir As String, apk As String) 'ignore + If File.Exists(dir, apk) Then + Dim i As Intent + i.Initialize(i.ACTION_VIEW, "file://" & File.Combine(dir, apk)) + i.SetType("application/vnd.android.package-archive") + StartActivity(i) + End If +End Sub + +'Copia la base de datos del almacenamiento interno al externo en el directorio kmts. +Sub copiaDB(result As Boolean) 'ignore + ToastMessageShow("copiaDB", False) + If result Then + Dim p As String + If File.ExternalWritable Then + p = File.DirRootExternal +' Log("Externo") + Else + p = File.DirInternal +' Log("Interno") + End If + Dim theDir As String + Try + File.MakeDir(File.DirRootExternal,"kmts") + theDir = "/kmts" + Catch + theDir = "" + End Try + Try + File.Copy(File.DirInternal,"kmt.db",File.DirRootExternal&theDir,"cedex_kmt.db") + File.Copy(File.DirInternal,"errorLog.db",File.DirRootExternal&theDir,"cedex_errorLog.db") + ToastMessageShow("BD copiada!", False) + Catch + ToastMessageShow("No se pudo hacer la copia: "&LastException, True) + End Try + Log("rootExternal="&p) + Log("File.DirInternal="&File.DirInternal) + Log("File.DirRootExternal="&File.DirRootExternal) + Else + ToastMessageShow("Sin permisos", False) + End If +End Sub + +'Hace visible y trae al frente el panel con los parametros "Top" y "Left" dados. +Sub panelVisible(panel As Panel, top As Int, left As Int) 'ignore + panel.BringToFront + panel.Visible = True + panel.Top = top + panel.Left = left +End Sub + +'Centra una etiqueta dentro de un elemento superior. +Sub centraEtiqueta(elemento As Label, anchoElementoSuperior As Int) 'ignore + elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2) +End Sub + +'Centra un panel horizontalmente dentro de un elemento superior. +Sub centraPanel(elemento As Panel, anchoElementoSuperior As Int) 'ignore + elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2) +End Sub + +'Centra un panel verticalmente dentro de un elemento superior. +Sub centraPanelV(elemento As Panel, altoElementoSuperior As Int) 'ignore + elemento.Top = Round(altoElementoSuperior/2)-(elemento.Height/2) +End Sub + +'Centra una barra de progreso dentro de un elemento superior. +Sub centraProgressBar(elemento As ProgressBar, anchoElementoSuperior As Int) 'ignore + elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2) +End Sub + +'Regresa 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_PRO" +' 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")) +' reqManager.ExecuteCommand(cmd , $"ins_pedidosPendientes_head_${c.GetString("PC_CLIENTE")}"$) +' Next +' End If +' +' 'PEDIDO (Pendientes) +' c=Starter.skmt.ExecQuery("SELECT PC_ENVIO_OK, PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_FECHA, PE_USUARIO, PE_COSTO_SIN, PE_RUTA, PE_DESC, PE_FOLIO FROM pedido_cliente left join PEDIDO where pc_cliente = pe_cliente and pc_envio_ok <> 1") +' If logger Then Log($"Pedido PENDIENTE: ${c.RowCount}"$) +' If c.RowCount>0 Then +' For i = 0 To c.RowCount - 1 +' c.Position = i +' Dim cmd As DBCommand +' +'' cmd.Initialize +'' cmd.Name = "DELETE_PEDIDO_MARDS_PE" +'' cmd.Parameters = Array As Object(almacen, ruta,c.GetString("PE_CLIENTE") ) +'' reqManager.ExecuteCommand(cmd , "DEL_PE") +' +' cmd.Initialize +' cmd.Name = "insert_pedido_PRO" +' 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"),"PREVENTA") +' 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_PRO" +'' 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 + +'Borra el pedido del cliente actual. +'Borra los registros de la tabla "pedido" y "pedido_cliente" +'Actualiza las tablas "cat_gunaprod" y "kmt_info". +Sub borraPedidoClienteActual As String + Private thisC As Cursor + thisC=Starter.skmt.ExecQuery("select PE_PROID,PE_CANT FROM PEDIDO where pe_cliente in (Select CUENTA from cuentaa) ") + If thisC.RowCount>0 Then + For i=0 To thisC.RowCount -1 + thisC.Position=i + Starter.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_id = ?", Array As Object(thisC.GetString("PE_CANT"),thisC.GetString("PE_PROID"))) + Starter.skmt.ExecNonQuery2("INSERT INTO INVENT_X_ENVIAR (ALMACEN , PROID , CANTIDAD ) VALUES(?,?,?) ", Array As Object (traeAlmacen, thisC.GetString("PE_PROID"),thisC.GetString("PE_CANT")* -1)) + Next + End If + Starter.skmt.ExecNonQuery("delete from pedido_cliente where pc_cliente in (Select CUENTA from cuentaa)") + Starter.skmt.ExecNonQuery("delete from pedido where pe_cliente in (Select CUENTA from cuentaa)") + Starter.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)") + Return 1 +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..f71db5d --- /dev/null +++ b/B4A/C_TicketsDia.bas @@ -0,0 +1,158 @@ +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) + B4XPages.SetTitle(Me, $"Tickets Día - ${Application.VersionName}"$) + 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=Starter.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 = 15 + label2.TextColor = Colors.Blue + label2.Height = 60dip + label2.Width = ListView1.Width * 0.99 + ListView1.TwoLinesLayout.ItemHeight = 80dip + 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=Starter.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 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) + Starter.skmt.ExecNonQuery("delete from CUENTAA") + Starter.skmt.ExecNonQuery2("INSERT INTO CUENTAA VALUES (?)", Array As Object(Value)) + DateTime.TimeFormat = "HHmmss" + STIME=DateTime.Time(DateTime.Now) + s=Starter.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 + Starter.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 + Starter.skmt.ExecNonQuery2("INSERT INTO HIST_STAY_STORE(HSS_CODIGO, HSS_IN , HSS_OUT , HSS_TOT) VALUES (?,0,0,0)", Array As Object (Value)) + Starter.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=Starter.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=Starter.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..1f785b6 --- /dev/null +++ b/B4A/C_UpdateAvailable.bas @@ -0,0 +1,74 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=11.5 +@EndOfDesignText@ +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + Root.Color = Colors.Transparent +End Sub + +Sub B4XPage_Appear + Try + Do While Not(CanRequestPackageInstalls) + MsgboxAsync($"Por favor permita que ${Application.PackageName} instale actualizaciones"$, "Instalar actualización") + Wait For Msgbox_Result(Result As Int) + Dim in As Intent + in.Initialize("android.settings.", "package:" & Application.PackageName) + StartActivity(in) + Loop + Catch + Log("updateAvailable() Error - " & LastException.Message) + End Try + If appUpdater.newApp.update Then + ofreceActualizacion + Else + sinActualizacion + End If +End Sub + +'//////////////////////////////////////////////////////////////////////////////////////////// +'//// Esta es una actividad usada por el servicio appUpdater para mostrar notificaciones +'//// cuando hay alguna actualizacion de apk. +'//////////////////////////////////////////////////////////////////////////////////////////// + + +public Sub CanRequestPackageInstalls As Boolean + ' // https://www.b4x.com/android/forum/threads/version-safe-apk-installation.87667/#content + Dim ctxt As JavaObject + ctxt.InitializeContext + Dim PackageManager As JavaObject = ctxt.RunMethod("getPackageManager", Null) + Return PackageManager.RunMethod("canRequestPackageInstalls", Null) +End Sub + +Sub ofreceActualizacion + If Msgbox2(appUpdater.newApp.newMsg,"Actualización disponible","Si","","No",Null) = DialogResponse.Positive Then 'ignore +' StartService(DownloadService) + CallSubDelayed(appUpdater, "download_newApk") +' ToastMessageShow("Descargando actualización", True) + End If + B4XPages.MainPage.ocultaProgreso + StartActivity(Main) +' Activity.Finish + B4XPages.ShowPage("Login") +End Sub + +Sub sinActualizacion + Msgbox(appUpdater.newApp.okMsg, "Aplicación al corriente") 'ignore +' StartActivity(Main) + B4XPages.MainPage.ocultaProgreso + B4XPages.ShowPage("Login") +End Sub \ No newline at end of file diff --git a/CameraExClass.bas b/B4A/CameraExClass2.bas similarity index 63% rename from CameraExClass.bas rename to B4A/CameraExClass2.bas index 1743551..cf3a43e 100644 --- a/CameraExClass.bas +++ b/B4A/CameraExClass2.bas @@ -2,11 +2,10 @@ Group=Default Group ModulesStructureVersion=1 Type=Class -Version=7.01 +Version=6 @EndOfDesignText@ - 'Class module -'version 1.20 +'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. @@ -17,8 +16,6 @@ Sub Class_Globals 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 @@ -43,14 +40,18 @@ 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 - If r.GetField("facing") = cameraValue Then + Log("facing: " & r.GetField("facing") & ", " & cameraValue) + If r.GetField("facing") = cameraValue Then ci.cameraInfo = r.target ci.Id = i Return ci @@ -97,12 +98,13 @@ Private Sub Camera_Ready (Success As Boolean) 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 -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 @@ -141,13 +143,13 @@ Public Sub GetParameter(Key As String) As 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 + '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 @@ -158,12 +160,28 @@ 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) + r.target = list1.get(i) cs(i).Width = r.GetField("width") cs(i).Height = r.GetField("height") Next @@ -200,6 +218,24 @@ Public Sub GetSupportedColorEffects As List 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") @@ -241,24 +277,24 @@ Public Sub PreviewImageToJpeg(data() As Byte, quality As Int) As Byte() End Sub Public Sub GetSupportedFocusModes As List - r.target = parameters - Return r.RunMethod("getSupportedFocusModes") + 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 + 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") + r.target = parameters + r.RunMethod2("setFocusMode", Mode, "java.lang.String") End Sub Public Sub GetFocusDistances As Float() @@ -267,6 +303,11 @@ Public Sub GetFocusDistances As Float() 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 @@ -278,6 +319,8 @@ End Sub Public Sub FocusAndTakePicture cam.AutoFocus End Sub + + Private Sub Camera_FocusDone (Success As Boolean) If Success Then TakePicture @@ -286,5 +329,71 @@ Private Sub Camera_FocusDone (Success As Boolean) 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/DBRequestManager.bas b/B4A/DBRequestManager.bas similarity index 93% rename from DBRequestManager.bas rename to B4A/DBRequestManager.bas index 8dcb5fa..e0e2b63 100644 --- a/DBRequestManager.bas +++ b/B4A/DBRequestManager.bas @@ -2,7 +2,7 @@ Group=Default Group ModulesStructureVersion=1 Type=Class -Version=7.01 +Version=6.8 @EndOfDesignText@ ''Class module Sub Class_Globals @@ -15,6 +15,8 @@ Sub Class_Globals ,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). @@ -22,6 +24,7 @@ End Sub Public Sub Initialize (Target As Object, ConnectorLink As String) mTarget = Target link = ConnectorLink + reqsList.Initialize End Sub 'Sends a query request. @@ -32,7 +35,8 @@ 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) @@ -58,6 +62,7 @@ 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 @@ -112,7 +117,7 @@ Private Sub WriteObject(o As Object, out As OutputStream) Else If GetType(tempArray(0)) = "[B" Then data = o out.WriteBytes(Array As Byte(T_BLOB), 0, 1) - WriteInt(data.Length, out) + 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") @@ -185,7 +190,7 @@ End Sub 'Handles the Job result and returns a DBResult. Public Sub HandleJob(Job As HttpJob) As DBResult - Dim start As Long = DateTime.Now + Dim start As Long = DateTime.Now 'ignore Dim In As InputStream = Job.GetInputStream Dim cs As CompressedStreams In = cs.WrapInputStream(In, "gzip") @@ -196,6 +201,8 @@ Public Sub HandleJob(Job As HttpJob) As DBResult table.Columns.Initialize table.rows.Initialize table.Tag = Job.Tag + If jobTagAnterior <> Job.Tag Then LogColor("HandleJob: '"&Job.Tag&"'", Colors.Blue) 'Mod por CHV - 211109 + jobTagAnterior = Job.Tag 'Mod por CHV - 211109 If method = "query" Then Dim numberOfColumns As Int = ReadInt(In) For i = 0 To numberOfColumns - 1 @@ -217,7 +224,7 @@ Public Sub HandleJob(Job As HttpJob) As DBResult Next End If In.Close - Log("HandleJob: " & (DateTime.Now - start)) +' Log("HandleJob: " & (DateTime.Now - start))'Comentado por CHV - 211112 Return table End Sub 'Reads a file and returns the file as a bytes array. diff --git a/B4A/FileHandler.bas b/B4A/FileHandler.bas new file mode 100644 index 0000000..a9529f8 --- /dev/null +++ b/B4A/FileHandler.bas @@ -0,0 +1,162 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=11 +@EndOfDesignText@ +'Requiere la librería "ContentResolver" y "FileProvider" o "AppUpdating" +' +'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/Files/alert2.png b/B4A/Files/alert2.png similarity index 100% rename from Files/alert2.png rename to B4A/Files/alert2.png diff --git a/Files/alerta_amarilla.png b/B4A/Files/alerta_amarilla.png similarity index 100% rename from Files/alerta_amarilla.png rename to B4A/Files/alerta_amarilla.png diff --git a/Files/anterior.jpg b/B4A/Files/anterior.jpg similarity index 100% rename from Files/anterior.jpg rename to B4A/Files/anterior.jpg diff --git a/Files/carrito.png b/B4A/Files/carrito.png similarity index 100% rename from Files/carrito.png rename to B4A/Files/carrito.png diff --git a/B4A/Files/celltitle.bal b/B4A/Files/celltitle.bal new file mode 100644 index 0000000000000000000000000000000000000000..17a132752bacf191552eb3e1ac7a582be76a221d GIT binary patch literal 1638 zcmZuwOK;Oa5O!!2Fz@#pS}2c}wjn$UhzmqbP$OIy(zKNT2{!h&S#a%OZ&L~vICJ3_ zaD@X%^nk=qD4{%r#1V1f2Ox3bR_2@3DUVv3@i#lWvoqh!CJn>*O0t?HNwSJ0>u6O| zdS)ZxbZm@;qFR+9{9f5BDecL1@LQrRy+tPiu)Tr+zC`0^z-}RFU9|7ezwI$%VQqM> zP&eQ9ye)kBId{DNqW-bFFn`y6-(Bb}z8cB&U3q!SH6EoNtZeT{&V4R!xZG2>=DV+U zrUwQ;SnsUSPCH%i>6|TQ&YXOnIi2~`W!v+G*L~kt7{Ryevp499b0jGeCo0WU662klJ9$NqMKM+bXN0aU8BViDkGXfc6{G+K#x3^>J=WYtups2+r>iBJh&XAsJh;~JgRK^2Fmm8&ZV zU6E>{qH(Yye5VqG9HRlT@%$a-Mi__8E>g?U&x7;dNS#<_cg$dev@xYC{Xs}wjAF+c zI#doqSB6~9k~xNS!Ir}Zio#V>5tHnBsv4>LOqV@m=aIhj(NPx^#3PSTltp^RR{K-OYX zqxoW~(4Vy$FZAJsiv(P9<1?{{Cu_!UHt~d(a4{AP6AfoSZoY$cFPY$M&Wom2wp;n6VI83T+Huj~dO zG4{j&Mk`)>%RVTW=6+I~dK-bIirV94RCItOg>nv(aL7iDPoFJxUA%V_egjj5IhFtb literal 0 HcmV?d00001 diff --git a/B4A/Files/cliente.bal b/B4A/Files/cliente.bal new file mode 100644 index 0000000000000000000000000000000000000000..d58b85b23f2ee3b175e77bd84aa9a3031c339ba3 GIT binary patch literal 34659 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 literal 0 HcmV?d00001 diff --git a/Files/durakelo.png b/B4A/Files/durakelo.png similarity index 100% rename from Files/durakelo.png rename to B4A/Files/durakelo.png diff --git a/Files/engrane.jpg b/B4A/Files/engrane.jpg similarity index 100% rename from Files/engrane.jpg rename to B4A/Files/engrane.jpg diff --git a/Files/fondo_kmt.jpg b/B4A/Files/fondo_kmt.jpg similarity index 100% rename from Files/fondo_kmt.jpg rename to B4A/Files/fondo_kmt.jpg 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 zcmeFa1z1#F*D!n#6ciH!Tf|msXi%gT+aFtEG3 z1Niq0494TD-p~Jj-*x@he;=GPXUFQb*Is*{bH;&71Gg0WY_UQ95aj3xEr%dT2~w0( zf#kuJ9QcFeWRqY^o0fXdwA)xk1_k0}zxwLPkSzR<^wC8hR?}2#!&5@4DsE&pDY z5ppsda=IgiagXXALJ9fg<>60f^I2}3vhuj`<0g(DKXJm#%jUBsjmBc^z@PRGuDcWL~bu{z4ApFOv|lhEVhZ?=x5uNhc;9_yXiLk zbse+&9Olj&yCn(vtop?L=kLBPXgJVw@147U1Usp)@!*B~?~Uv|0wOudMNNk;KKL*R z8ZiQJt03h`anwiyDGT#qDhhyu-RhG^>eAw-NI2N%dgi6xLZ4emy2#pXsxM0a)uK@n z1{4>_$d}`{8L*Dnxf@hPTqzyo%^}4m| zX3hy6b+94-M8Mu%+nEbXI|sX)kYdsO;p?Nm!+zDtozxaB_;DV zeLnP#Q`CEqAB38#zqoeI0(*nc7vFYdo!&SAJ;=JSEV^g?e*EHq59F+~{c9C>5VF=y ze{JT`oS^{Cyy0wjYycAVD4RAceu9A8HYz{uh^{@m?LFS$3gN@$#@?pYH_jM6s?gdt z+J~p3@Ywu-sX>8g8*=U~XpYf&!z=HOJ(-odt$S2PBkxwdv) zpCMZ~d%HDN;pN4!$cCfhligwN2Jg~>%BH<=@f~$+-S(iPsMM{#vmWc6e{1%vZ^`B2 zz9paMr}u8<_^())%!jHK^$Gn)ZOIwQ+dmuiC7tr1lpx-aMagvY=G6!GAoD(-E8^!2 zK&v`xgtN!N^Pi2M(oDbeiFTzw>$OVc#R=u*Ix5O*p2DwS>=UVVTdD*NET^=7E;g6H}`Ps$M@~*`%HOO)wd>1ay=I$S?*jwbQVo@RBBFQR^EoIC)XaxS0uXxRYN*!fPq%RzhByjCE|WpiR* z<%_THKJWYTb^yBK^*PQ+Qs@_DeF+|bTs8DX?{mK7J@sgh|8T1J`Hx7v-dud5_~P6E z6iRt)%M|U95Rdv$OaAm_`;AXe-ZAZ8*ZmsWGWwEQ-Ze$Ozevl^JMr~y zRp&>qTLX}1;jX;b6vlzBFHVtPFMM(M;`~hWrQxBXCdB>EyFZn7_Hiipfpg36SS4zY z>T4c=OsYQ_W6k$%*>&p8yd6s}QJ$_GfDFAp&h&aeYXC~q{yGl(+Trs6R51XhMw_3f zoFsAjyF1^&2OwI(0OWn+Q|$n>_hRhAq|PUl`(@7W=Do@C9)PM}e7#J$8AQ1h*&ovR z(%{aKMOB|~d@4QHXaDuV_ax>FlL+o_>fcpA0Bryqy`T4G+yHbUxqno0AA10j@w;V^ ziwYSRl>f6_3|t;~HsSua30O}{2Qs#Da8!^?+YmHww%is-e%2!U*lTES^sov-OJF3; zgE-+xC+|@BM%&FBLDe9!K>!yd0^#olM`OaBeRlbR#<7qKgoF^_&mU5Q+#ooFhA>dL z1Qj$Ue7H9#Nzqt^pu>hZ8ta1z3PA^jNl}9K(bC@5j-KlVwXsryVuU6*eUn(_JBgjc z(LsnX6lhnK^t28~hslHhLi!+w3$6hu$KirCGR*p0Aq@Sku-+#GHQeG9fQ}e0*oKDK z3>SbNzoEAB4GtJm#GsZSU{q_sjl6^YvD3i;1|R!F~% zo5Ij`3tU4awjDmKLj2TzRqu)lK}+jhupt&cdu9E{M8JK~2&9cS+FK%llu4HW7nIB^ zB-fI@;9J5rv>xt1h~_7<8$nX}E3$6BA%pcUNM8$22?psg(HDsb_Xvao;{p#23JZ{_ zZ@i?z74T$*K%)_%A&9VmA&{}M76}XA)sK_ay9NaWe&3)hYXH0r_m_+n`DcSXKuO>m zBo(r6={Q;}Z5uyC6nvRep+SEeC#{o=*SXT3Gkz?~zmb+lOV8jWCxrqjxa1f!G)REM zN;!BZtz83Y`}>2I5O4-bGdSdiYI0Iihii1D^;^JM*2h3vBk}y98Y#|?pbSYy*1#_h z`G=C`Up5W=ziE@|LP>&KHV#Kv05QR5NN;l`SJG5}P>(YuMR`YX8suJ5ge1!d#aZBc zEJ*mhAzu(DkRV=!gKs}52z(HrZD{=Cc*A3tphm5d1KHBdw3We>5Yc_ zfeL6NE?gGu#|(Cs)JR$!LIc#m*Z*nx=6HDOTrHL_|TxuPH3-y0(hq@yF? zNc1ndyUVJ7?5^w+V2ubtAiq=Yq(S^v_QMST1ad-zNpw9LjR*%5G7A2Eq#6?fLfU`S zj`fj-!2hUM1||;txw~`}E|m}hBM7*&`Ag~b;E0oK5e&MpH2Nq=dO)LYfRkkOWP{IC zaCsAK80-Y~-OzNfp#FEk{qKVN-v#%-3+{gx-2X1P|G&B59-RB;gV_y&Hi3_vWU`w8 zSxS>hACOq8fu(66NG#FdgOXl>HCVVO*3&)?M5#%_ofD4D4b2^AR`sTHZGg+K;q!%R#}Bsg?+H9-$e6fO+y zjnxc8Es$ZbfunqpLDF@&ngkVQ+J2!6i9Si?bXD8=dLs|^o;?VYDc;EBu>mzeJ3Zb0bM@APo!bX>XU&F}U46Pj=@ST)4L7~6z zKgcNP1`k6?woQh)M4|1%{z^zY#CNg*7VUpe@EdpG-+9*$761)EZoOeK!e#fbevNs! zc}Q7)zNY>NWT-dbJ}A^X0It0&93CLiVYsO^5-w5uMzG}}8!Zmstf6LYt){E1rSttQ zvhU#FV7CNrrY^Z>rm3T+sR!FAxo2i*YM`&FV`!?QGuYJ;;TPnO`(;FO9716W;MOKW{AJpgE{udAykgLMc) zp}oU=;S!<}*dPh4;orf!!o&Q6B%5;9A>JsInYwgC&lFf0guidvH+4gMBf$nD*!S}f z3IU3?@&;R=YGC6`$^-CxQzsW-PJjS5T(ia-gbHa4;MPBd80AfFVIXNN*%g4W^@|1LzGqnW=Pn2doS@ z)c?NT!P+kcdz}Ge1C@XX{%e(Z>zVlY8yRc*7#bRB>g)UZX`1-z8*9S-{9(F=`o4y~ zy52JQNU)Ll+juZY28HlPM*_#R3;=^x=3;*gJA<&kfxsEyAV<(vmquLA8e3W=>N3(zMEhENAvg%4n-MD-y3Jxa%%r!re7FC zVz0j;_-E7nF>Vj){QstDq|t0};A;Oora@T}{T;orlKAfygolF>08$pyNH7%`g7_>w zBnp;P27)08Ch;HYFkwMpQTAtvi#=N%dp0_L1=ebj!@$5%3={R}EeG0oIBg$0KpBEw`j!C;o8 zVs2<~j|5BvUSM8qM3y#2rwrs)a~z=U`swE#Y;vZS^dRFA|q z5?ja=H&k>90n?lWjZB%}hv3!LIPb9UCa$3w%n{fUEFAu`!4vHAA|n5@UaGzCs(*4B z30pt#F~pl&q&M0(&|b2S{!8u#qw4od7652(D&2S=)Qmk66OK^xgR6yN;F820r527r zg0jEl9-1`C80tP~P94c4FU28E6}-Q>*!NnITGT6<~BqVDVZ2_4Ge}^0Q>ykSNMcrfXO8tz6(zOLDmTlL>)r$*Hj0SU5VII znzG^`MV;T$b4Bbz3}u-YlKeMxzbW;Xp8O|qUCm%7dTRD&dM0XC zX8N*$_}3N&z(0;%JrJ{{19VVufbn-D*VRl{&j?W0H3ro64FBmE2Ead3*ERluI>7h` z>iRH1-9+cVqpm-=iW`n0CO;beFQ`johv^$h$je~=TJ^g6KM4;I{V4q(qL`Vkfkb+k zks+XOAhX-w(>M4@e1PZ&`T*r0v~Qp*vAv$u_%c8G2lRD+GQQqV*4O(JeVEkuboC|r z|L62!GIh(sn=V*Qf9LxEFY@JZz7T3@E_9$&_Bu#5dA*h%j>PW6xyN4%{xfYI znd%1R{zI-{Im>rdldSEh_1>Hy>K zsl#+6(O%y`LjJ!cyKaWFg$3~>N({(%FS0pI{A!ph88Hj@9I{_s3CM1NQ#gX96m-%~f1 zh%XKLhW~iRGnN@_i1tq*A0YfaZApFwbZ;QZG+;V1Q~tf|!&#L~_Xe_QYe@G1=N~vQ zl!SelG|x1ajitY5z)(g{#=uW`CP4WI`qDg8nr8m<8UH`h%wc^DivPzMANae(_!9O1 z^A+B=!6LK1Oc{gJ|G367k*I#q_W#)QCNf$>w0}1IpX@F*yPh=H_{UN2XQL0VPllXs zFy{TVfoMN?Yj0@3PTKh0t{~XclU7OZy$#=llU#h)X>bAa-PWNUvb(|?H9P@;J;=d5 zLfC(~M`$gvh9j5;Qxyb;tGs1m?!;X z*N_1WIfkq_sFFWsDUwJ5>;e`hGUfhtj2?!NxugukkTw34nM*ffzzM8JWv=ztw1**N zQA&nkkTz)k{p?^Q4bPH2D5HOz7z{%U(H<@j(gwxf(;i$CNY0YE`JYdX!yrTSzu_2U zKvMn#2Vm<_GB-AKYDA5W98VGtPy!xcjufb#EkpbPe5Bui6Cehkh-D*bCKd;=Nc;9JEY2a@t1 zH~`BN$zG&nkpj;Dn1f*u83)4^LmYteA2`sLuF=35aG?K>$HF%d83)5ShByFa2?zgu z&hQhYE{{f!hPO!6V3C;1MA^hxN9Q+-OLN8g6N0Wjg}A_8g8xBPBnfu-@B8P4P6O z2uXf)Y8hnU?TZSxba7b^UTc9QeI?)D9pKfO_ZJ4=zdon=i}vrj{_=8+A9xc4w0s30 zv@c)+ygeg%*=9u~I$Uy{4z8zI>RRc5>uLzf9R;qzd+)>7;1%q=W=Xx3uB8qnXS)}? zM_&)FVURo-J#?)Ljci&fxeo9SMMH`&u0oJ7Zip^G56%1^AI6rn{x2SA@Mf|Eoi!pH zJW2=N)derx=;){oK2q+6L!sfJC=E4-FkdYQ+U&VSZIE;Wc*B1W_^|_#PN+Xx^3Fe` zAP;^_K=RVk_s1{Fpi1(qAqy4ejODCR~{I_FwM0us{tnlveIpurP@0I_E0F}T6L3+Ea zf?Y#)ga(A|M&QF4y9LMuR605jQyNhd*@SJ!b>j~cP7qI$PLPjNj!}=$4$%)Vx|p4; zHg*%Ij$6qqiOT0^3dGTIG3;1^Fg(srv^jo#f<>ZU(&FS9;<4g^l-H?u(=MbR&S=Z5 z$jZu&$sy+M%Jay#Ezm1eD;i()wfJ$##nJ<1b>%q~v6ZB%;A+nr`&z@gh4m^8P{T9u z<4lK}8(Q*Og>B?L!R?+M_MHZM)%Q)@*WdNDyLbPg0}TiB4#gcN9|<|?dCcax)`{sS z6PB=39lc&>3*C34)xyQ!`u&V zJ|6s(_}Tl*vM*1*7WHlGSMIML*dqCPHo1rLMI$vvF%>(N9*j{?o;G&&xVhtJPna=L zbVs+Xo8pK)R4^;x%O-43}S?luF7dn zK7r|uXo;-C7U0tGLIR73Cn3mwl+9E}nkC(Uv5YyJHIdcNe#W`NJ<4m2D&!{$7}2|9 zcE&mh&Ehmfv*O3Ze@=Lmcsc1va;vx~B|ep!7Mi{#V@;-E)}rhwISM)Na_{F|%0F7r zURYC9Se#Z8SIQ})lt)$|Dg&x^R&S}N)CLf>#Gu7|l1HW}<8gnZ957Y}FmJ zE340$AG6qR*>2TjU29WrTWFVKpS~v9Az`g>UCesEW0Vumnd`#cz;orgaW`@|aou?y zQJeXm(OY7-#%+t=p0q;@;zEXZmQS{Cj$a-;-@h=RD6lxFWLIf$X-HXUSy&mOEWBiQ zF|q)aht9@iM5II}V&iZEJcmFh5=jwc1SN>-P1{1>z*xgv%`#xG;LPW$^2SDui2A^P zCb%7aDdt3Mx3DFyN>mV^o*+u(B~g>H;_#GRslI7D(mgXaWx8g$WIN|L=ep#%=5H$S zEc7b!FAgigmeR{&%F`>#D%+}#SKp|4Q#ZO^t--i)LsLjIrzO9&tL;|1T*v%Q>%H)O zoUYRDllxyCoO;OQ@Qx$&qlL$g9)EUn;wjzJ8_%H6CY-B1f2!xn#Zi~$UN-Dqf5rPM z`WolD_(svqx?3H$58XL&_sqSs_fJ1K{&4@J*2m>f(w=gjA)ar3vF+v7SMIOZzcG8e z{GH0X_wO%!sQVcG$>+27=eJ*KzWVn~>Z|K_?7uazTRQ$P%SVqKJ!+#OMJZ`?&X|1V ztg-Rq=;OmDcuibC$w+1X)dHX(oD>|Lje3Eaz&>Q&of19?w6g z-oBu4p>Pp?vELG>r6$W3EuXl&Z^dJci<8jmVx39jd;XvczrW4KQTCTL-X?wQkV~0ZLq`hkUbh<3MUHAJRz#oh~RCu`K$c3Y? zj*mUD{G|OU-_z7HS!X-X-RzOSu;k+UOQ_3fz5B1cxHj{;-3`>uoLi^vjJWG~FXjG& zhlY>Xk1su4@r?TX;!D^o;p-P~9p9CHQ24mzQ`zVDUrqZ6{cYe^eIP3MyH`&+LD_iR zoKisUt`$%c$U$NXC6m0KbceE!?CWDm=_iY9yr~q*$a#LWe(LP6&15tmcXtBWgI9a> z3fY-ErDipG8@oPPn@ne=5#z}n%+{TcC=(cOtszPh13M>|dY5tIa~^3?veNA}q}d6u zBb!N!;_y``N$XeuWq!q-*u%ZT`wC1!EA3G4HnB5MhIvs$ORy=LxV4h7H&2^WSAW#I%K_Ki62lb7o2ALF_)uAjJFJ~=LAMELvfV}qnUnl z+9y^dQ~uExc6j{9b8f82ILw}j%=Fk9`BND0q9^lt3=H2Lxrw35>+u+%U*Zy1YS5o> z5~gyQ1WxfoR~9PsG=0bDz`hq^g7~)AEuYxR0P=;s;FJ zXl&8g$y4d6f(Q3}nPVG#PF`Tlsg`eQpu3hn&K^l?Db(Wh(42A(hV{`#XYAQDk9sFn z&zMJjBQ{o+zXyX@-?I*bk}aN~*(P)cE{o8@Ey6 z*_Vv2QPG*3CvBw3^PBE0V=O$Lc)W^kcwl9Nm(^l~#O659LPv z3Aa_0*6KBeXDE9LCQe*Vc^mco+A5JZQG6&^h$mXtxX08IC#D{Xo=Kd)WULj7S-m`(!9=9g^1m{KbVgJK{q-&Z zFPhHXu!EaNw=lqS9q2nJDnyAH?8|jRC~o2Yj2QKpXO(>dU%?GAHR=_AF>MpCj#nGB zi(AMgx~%0K<3#93aB!TF<3ID<*=?8XW0lfG-CEJQVnPLt&rVEEo*Ok;)JIk2J`{EY zx^eEu>~Y@8nJgI4%V2j2=8T`hUCLu#coeg?aO%D@0&MQ$@`X|7Gf|0Wd4XwT$oILr z$&UlpaaJd4I+552(Q)0&?AdYq#yN2oaR+*eqHC%T?M>s~E{96rN3AZ3OsMBx$g?Ef z=HzE>^WV%aO6zrOU|kb`($!!^CBGh9%wEThJui&bYb)p!@dFx1mb~V5RTsv0aJQD_ zlg4m#ij?4)Y{T3Kj$>I~SyiwMmU4#q*tx7^F6>;M;Ml=K9d&&9y$&VQcsp9Bh#qj> z);kcb*vG3B{NA&!mPW4UutpZaVGEhLIi|{$ECtT}vo{6EvmWhVqNU9<)27PsOA$l#ZNBxe-&*I6HZfpeyHI zf;j4<;Ff4Bj~6*#xP!ZKCnF}4vtx}odO15=vq&IdXN)$8wr4#&Tr7Sdj;X(sWR`d` zyC}XrUZ39=zQ2jcc?tmH3=>rh(7pU;Xr=#`vSUQk<` z@UGZ1GektrU&~_(*JekfMAc`WTVWcdl6F{;&r4&?+%HP% z-iNJGOqknNkbWetsBs$Sc`UN}IWjhyRlaE(iQikCV!JwOTcPFh%e>guyFc2nzI2;BKe}eJO;6O!a;xP;UQl|g;xujw z^H{ri!D&3cbarka-ZAM+)@-~jV@kRb9vPOAVvIlUsgYDm@UwDD$R&XtINO5NGMsJvxT0XG&OS!?KFL7Y9DQN=oPUk^~q-6#4hSdOM3hs>Xjw>@yaxe zLZC>Vp4!UIdm`v6R?QCN%Ox(%n92*I1*fWVmxa7a-p*O#5tZ&wKt|#hGD@`${xQh#u_`wQ^mlCu#U5+P;%*|cn$ikNgroKsC^h8{~x?A`( z*?f_la7mJ~d{y*eI;rtkjz?{KerU$6%DHhNsTm~)Nk@~j3(f>3B|OP>-IyezW-(Sf z3qvwDE-a7D79W?7i=IgjYMhYWzo#+pUV!Vs< zrwkPSzUjQw_k?J*WvOD~ZU{;|M>$%4vT7-vkrr5bmzKgK7xq$bMtsSeO!f6G&Pt;$ zc6LjrP#2h>Q%6$Q&&x?kqJdvAO^BgFWj89#_*$t^CH=f;ZhOHq?#u{St`7T)&)v*D zY&EB>v_e*laZic{Yu!98aT(hVg5tvgluE^}_y;MaB}Q?noZ|&Lu}q9hPGEGqk4nZ@ z!3M{NsSo+a#+Kq;QMq%ECST;&fqf_}6)LqXKbl@I?kyIlbg|#$CnT$)G1;dQ_If*J ztP@o`TBVxBEj8*)ZWad5#UxJ=dPB-_BC2AEuw0|yxLCXBYc7nvCht?`ZPd|hgR~br zOVevpwym#9iA@eRa!ekRbZ_p`B(H?c&@AD8s!H+gvX(0O(!Qap{QitE%AYZJBHOs3v!>#IiBd8uo%*djiss=wUkZm+L2UPxPMO>^FnT8 z({7|s=KI>uUcPDUs@8SsVob$6Lqg)U{0no65=SSDgI2|=QI}>_w=!|)n4X3*oGIx{ z^;ev3h+jD$7qG>+*bjH!?nQnjei!UX&V7QS>dRatp#y^AmQtb2!j?u_evDOp7qy+_ zQ$3P8F8EEEfRgFiT;xYV+J)p*QW&t1?CX?$s?|9wsjXnwGK>mkd}uz#>xoXSyUukW zo~oM3ejdE3G>`Snb8aD?rEhyH_aO7Q&gZPB%>Amg?AdGu2#P%hpaPrTh$ad?)=h|g zK%80W8vSKgX~{`}?`Bd#8DG=ZGv|GjhfZSF9Ill;@Fgr9=QB1$ro%$*`lOy?T;CmN%^WvG6G_Y0n`pElyM& zUSm^KfESn3^Ct&s7c1n9^jMU4J~P?IBwH!NL3@At%k(9xQ`3uM(*V>M0JXN^V!eQ` zUVXmm3f`k!zN{?pQ4y{f=6)k@T|u?=*Q~_+Ozre^b~X$^sY;-t4^W}h%MI-ICsD_$ z(aj9}__Cb3#=!ETSygx3Yja;zWLw|JGA=FBj!W0hUZy%PtuZziK!NcU_vU~vZaRHl z=UMDAMe%A#5GEagsfU*WqM*I2H`?SW6 zHlwccy%L&>*Y##LpK_nTFed6Dle+g|KX(Vf65>89F1kf5Im2~Tv3xWzR4 z4kgZ#-8-5ySyy*nslzbeIOkMmF+I&(OSdp*EL%{tmgzL1s@R$N96;>@P_(WRVKDV! z`+^v+@JCI11c^I?YuWt8&ZZT$QH#u=l3l#`rSA*Z@a|0LEmGityKxyoID0ZeM z?Ae;w5H4zb8IRtnT+%B@CZ-f-fT#b+q4A{CjYmoIJ3yO|m`(J6lvAN+!rU0hopPIggyU)@j6QVOVkOnCr7QPTj_ z+LJ8K0Sw|Wk!|U3-Nj;lc2C*U&YW*&-n5R9sozl>$Dqwuu1aKlRJvcal+h2Mv;mae z31aLtjMt%%=o$WM`;hzq_lUN%sF`*P8<+Cd=r`2(bNlCOR66kPj^198#sd zOpc3_SeVTRu?dR)bM}VEy>#Eznk;m%o8K@scA@_M>P;~>=5MJ`izSRcUT($C22h&; z)SP4IGv{Mm4&3w$F>cY}m48~Wcrd7;8QKp-8WlUV@JkBBj zg#l1kkET`>Vr=(sEQ#=6+p)Az&b_PIEHB26S=*JHV_;VCG5eAFm{NMO!k7mo&KxfQ zMFmhDM^zdQU~Ib&R6q9jYmYB~?f$wcuhieJt9DWG4Fhh4d%mtZyyQx^<+h|#OFHHurm|S6v|=u#E*-1#UX@+sCW1!F~Ob~{1t)Yst^Jz ziasrsz~$a}{4!!>QQmndB0eubp{{kB)wnKK{wj^q74#2C5Ojcs> zO|d;w{qP=wDUaxwb#<<1Q!qW1>TSy+LQ0nA8AQ&=Cr7nM_GYW^7GsOjCwqk8g2n!( zN%#?ol~det0nvLOx}aM+=bQ<}m^Hs`>BpR`9mt&=fv@o6wM1GMYlPQfr{y`h$6+sJ zJ~6p~^G{zs8Hp{7Ui`oVz5bZ;X&m}!_v4mP7}s_vX9ng|V+8kj#Qy3)#KXwU(p#Gz zVEqbbo9JQh(+2&CtS%GyCahaAP@J=zLs8*h~6$ z{JKp$>CS`^CX4AQgmaT`Ff)iTH|No_>Fq~9(3jCZ)L)|=pgCsTpy8;;*$ZgaRCH(^ zZ5h>K<6N2!b*|BK8iT5#f@P>t3$HV2Yop7KI8kr$uh(s$a-y`;1E?Fg-OTe;U5+4x zP1R!4+{RKZSTTkVsL{;ZlUC7cnW(D|sLRF4hw>>05_@V&DG~9esgEgk!t)FwWmQa9 z@Mg*y!F5+9iXVTW!DmW2@7BZ>R19a|m7Nr`Jki00jS1Pcm0%B6Q4nN?Y_zn835y0G#Ysi&Y_ypB|p6HA*) zs?I10(j^^Bo#kRo`jo7!zk{rs=rx`|rt*$ndP92C^0@mjDW;xQ(Mwug1xsEpJSO+}2o{;8sjxT>rJluRS$%U9w zdxv5}%&rIx$RHjoPIT%ee#pP9r$L&Py?LA)X(?~SML&|k8P%>;#M4I}l#l z@nl{Mb~FjbO~%&xkK`P{;TlPOM^>)pjviaX=5mk}R(TC0jdj(IiuEaMhC|LA)zR2tZ%&2BH; zm0QZn%;iQ0GOIItBk7D6X^5TY7@NgA)_kEqPQ0U~NI#u8ZuABQ#9n{o69?HaqtS>B zt9Ht%VNEDY7GRiaMKdFc82-5*cB<0PX4$XVMBki_(In7~QyrA<)9u&_M>II{odXS_ ztOKn9**BP3_1F11jFKu5<~sdFX_r?3-M=v3{t)e1-X~23T5D#wQY@{Kb>wgyyYiS> z{RtL&|D|kgrb7ol>M>(ob0Efm9#aSH=%J6QY_MNTi!Z&Pkxbi>xmal}&488GrI^%? zVODu2L`5j4j}tK>k~uGhm63+XkFko8Z?=z$PQV_sZ4n@Gg)8I*PI$qn62Sm5eea$` z5=EoZE#8HEENx1h8=1_Ji{+BtkfWoYk)5~A7I4X-HYfQAa?0{0d~5ROQ5yUZs%mFU zf(Q3f#dMKACnM#H(2$K`-HpMrc;N$r$IOFUm-0nSZR=N2G)C((-zY~$%gBzXF^t6> zhjU`0R%Y>B* zhuLo!tJ=24nN$}QKZ;#c?v+>{ZBVR1+sh~C>xXJYDP)U14szQw7?v|QC25IElsTKk z9SX7RRg9^v`NC6ea>a%*?Tt{vC&AI02{Z-%`0^bgI9@`rj>l52NB%{N430(a)y1Xk z3#khgcCrfT?^|aIi3eJXief_d$|r0UU|U_OJEI!wUkBgj8C5&E7jeE+s90#SpBC?5 zyoOCnxvj90rA@z9+ntR^cjv6h;9{I&SEU}p+$IK!%_0PWHHnWR-P|6=_hNO;azwVc zu?qr34!HAjYlWV~)|%?9ouvEOr1W5tIEI)~PVyy`CNCsy2zZ)siRACLP;{1*vFb{k z1?iT0OPn5gqnt*}amuyowoE(D_$*x7HrCtdSaBNj6TUG?jj0zfGX5GP-PI-T76Z0w zj?j(%Tz#(4fU#0;QZ$0vQne?;O$f^jObw0MDF{oh7c}CU5_R}`{*y(Yd7n3s<3@7d ztPG3Aa!uwZ#;)boL7xQ{)RM}c^zf7@aEmfNS%HsCx}8vjtxJH5P;i)NmXPk!DAbF2 zZhADPDEjJr)tJy2ZRkGVjGA8YChd5hQhK@gdDfYzk|g8wj>wzwds6QC`NolwJ)8$( zqY}+bjidV$RMbkMn?yIE3sJt*xC-4g$MWp7r(#6$KHkH`ru_cMMe(LNWZzcdK&HQQ zSnQazS0-K2yV6FeZHk_jcojO#tE6(ug{e;(ccrtsL4>Wz^~n;N zRGe_a$E+{gZv0hHSqPukAy}Ol0o8L0sQCQRrEzGJ_^iUG=sonBJR-(<_ee0Gf8Bw~ zSQ~L*?Vi-)$Xo*taR)YdmPJZ1_9<9NWl|>P>69c9@5Cz?JRqjg7v_c&QQ;9;`o!?< zz3C>z&6%gg1|%_9JA_c7TvTxsiz_nEzsqFNLUQ~W`H0#~7`=b{ zytGwxt^-b-N4L=jyKVFpGeeVS&<}!Dz)mWZQ(cr8qaEj)_g=uDlCr5${b5%!YvggPl1!X(rbgWR;OrDEm&~`K0^82Jtiv!$1N~eab zN$oAfd%jD)nU`SKk+?p0yzZoUtt|A6#qks4zym~FWw29Gn*XWodJHLNW7B*RGvjnE zKloxQqZ02aOlFrc>_QS=lvu$|iZ11pPyZll5Z;0yPBj%ueAS?Y+Rr9cH=~Urgyp&D zF8GV$1DKGF0R<}}V3xVLN|Ev!FS9;ImaBy2&WEQ7x?tB2{R69@L#(Y|FDyj?pr6ixX z)6cV@hHLJ6A$K|_(84V9HT%+vv+1queJU$5N3o9rx#Fo%d|QoMf{3}XLO~Rc_AI_C z+N<@m`e6VqM`3?YbJM}PGNQ}XtkET?)tPDM3r{THlj4_tPi0ifeF1nPk9C_0aU(kKp*G-d zwZ21D?7G}&jb5>JNzGC8@wHJEnHY|7eCd=3yM?aBDfjr=SYGU zuBBB8e|}eG!zz6FmbcYq_{O!)eM;sw`f$-*cTlVN-f!%MyCohSUn3~=Wk_CS5_@hWNiRY%K+5sJ!3>W zu?0=jgg!ycTFaP1&%G6y(RvQ%B~F6bMzICu{G*ceH{#pZd@2@*HW_WtKNoj!L3eI&+(Tt_ZUUzhKy?8qPV4nt zFYM@s-YmbschxV_D?LrhSEmNA=_-0EzG7sOuOTj7(3&Go%2Q6yN#I-tP^kdQvDK$E zF|wy&OVQlGgVn)#?>#4!)#bp~q!#VSx@R;cuP|%Og3|1-;yKEDv+Fsp0Tcm1jcc7$ zw>olf{l_Ykz^1AgwJA2Gr5h-$}39t1HK0;s^F z7ImI>E)MMVXRqL8>>UglfA~+fyQEkt#)$GKJ)F2Py_Yfw4>oKlG3{ zC6v^K;$(WMwohUQxGZWq&th5ZsFP!j&|X_Lf_Yz(d4?Y!w z9~Ivh9z)&Hzehpv&}Bqp7r(&5x#mXHDQ%aEt5M~%Zj_zo>x`t8EM&9*sJQ^jGG>jGdTWqafl)POVR}LlPX0I#Bi=RJgW#LJt(I6E5{ee+M zI-%yBTl4yMd~Mm6qv0~G-aBiGML-oM(^EUT%su_wY;5t(c#Bb-f+x&f0BSZB!e8B= zQMEdBb;qr;c(2hd#>HD*me(CG)U#k!Ud%tK-BMbeZ9BWJ7#1He>TrP_Giea&{=A5A z)b!J{BG;i_wNSD1(8qI^V;^Ixq88$6BXV~8;wh1N9&Ca$HfyCe5r#{emO+}2dw6#O znnMme8I0kPXEl9}Ad>E7AB%*Oj&iSI*O5+yYvJ@rcip$*r;&DHj?(; zh9O__&K^%ikKp<>dSS+JRI=x%>9|^}~XB^SpEy~cY8-XlKd62#Wbs(vSS&6Gvoyw;Fg#l{y&aCJ1K={;2H*t~6D-NE7!g*)lF4Z=N6~_~Q#iv;DRb z)MFp4pFxO^zNK@O@K``m?jlBV-khw%rWKuSt;3$rpI7i2H#K{=5Q*EBejmRUcOfOt z*B$Sc#9X%;e?0!a&V0gD5nXv1A)3QKQ5pHF_FPLfc6p^!{$nh>q%$@I+fuL*w*{w> zqwmAQRc7p7%f!!5U8l{!ZxbWOl;V$Z43FQ9M76(az7tv6oSi>0@@kzy3?I9s;t7_9 zO)DAgy&tzEzscbqEnmY165n=}tF-(p>ruCkqRI}g~gsrcsF$E-H|<17?wEMXR3 zk%=LAU`iRE2t{678R^8)_N|OSVvxoqMlEr#k~XuHgxRmc8qfSxQ_S4Pgk^d$>KI7g zWrha*ESf`arElD^fgVhIV|R#dL(5w6h0dadDT)~;H07=e#-Z5d)iB1i=;-t#bRz!) zcQ+l1BBHEl#XQ692DD(Vifs>VEobry4H}kBR-8in$XvQ_BfUMvyYdo!TvA^ehK5hb z;4Gt!6m3AxqE-tvw;52GF&k|mYM@}xax9f87(FVFdY?(!s{?i+Ix3oJ7THOu9@Mf7 zKlT)=ajNa^*^~##TefbXG$wS}*idpr^~)|&szsAW*--kKW}P-Phf1UJW7MotrxZWx z$ij6jHA+nG)^Ib5O=j~J5oLNB-MWzcK1F@m2J**btC8<1=1ipyA@yW)Z}~*(;(A?i z3WZs2Engo;MNDiFgHQw%1woKh zKtvD}q`T{McX#(Woa7w38$|@W6T7c}?^Y`ajGi&cXGwVBR&0a>LJ+3Mk z&!Ky8cJ0hlWg_~T*C?uyuPPVI7ole{KT1zxe4wW#25efUMy$p0Bj1Sr#W#Ae#9;*1 zI4|p5zIPx?agUVRv_T$As@6D5FO!}zzDWe+2*_1&A-OH1T~t9?8aY|GgJN*sCj3tM zIQFKHO9SnQlS|mo8>h;~vh&sBBx=?r`ZaMX3j`h(1+nI*?-s^0A4CKSs+qf%eixi& z4vy6d9GLa}D`g2%ZT)4*X-T+pKnxZ=r45O^g#DnsLKi`2+F3z3|9CirZ{XW6P2vym z9*@oD-C*gqkC$%N#nl}WpRNp6m_-P+H&r4GRR#fj1%7f!>Ro=Z^wGK|-d;(M+jia& z$r%TZY#Mj zRg1@b<2+(z^sNy;YoAv0LWFA8$qopoH`tT+@Nd*u0ONUA%#;)`_m}bVS{ygt5WeI9 z*H>#9bA{u{TGy)< z?xS;ql8@(Fqfs&95pQE3YV1j|#V=H0q@xMv6`kay;Q4Yb zdDz)bvF7i2rSJw_)BMJe$qLh5&`n~V;yu&cWR_!IsU9&G6^~asG2SJNksBCygGyyA z##JYR>^I|sHM&7FZJIvm1I3ZrLzT}(F5F}4<3fA%XXP2e^rD4|+5GieLS#CgHt>Ly z&Re+Xr}Q?j!p4RlW~HX+d^D)avznKx2F_{KdBuIyXT>eKe_@Q=LArf2UD_m}1$s%O z;_gKX$$9Yu>(1PlY10^>MVOCO+G|#sk~x!A)AV;xOBD;W`~re3M+1yMCAq8WUSkj+ zRUTjDCVsC_S$D8onKliq%72=DG%4!phWYGxCAsE15-4Yxf99W*9yX=M2TEcL5o_GV z4*JT47sM;o=d3#-tyMjER|)Fbt=_Bl>zu;sP)=x#K^&LcHn!w@OQY+=an0g$HDv+) zB7^0|LWxMAuCcLU|FTlzN{1nndXwtk9l0zwMR)H9M6j%`bAMjD+BabN?6;aLcSdbhWDf+ZuKge8l~=jRYR~u;n1(8R%ivOkzRiPeT>)N%U7h4CW$>QX^8$+3#hPX#6#Zt%DnOdW>%V1uTzj0^U; zqyEEPF?T{`xOGT2oMlWKJ-wEyye-^dp(>(?v8FoNUI14AMVgg0NjS2*+D_fL*%!PL#`?$H6B21PL$T|Mg!NbuL;5sJkMCZ zV3*pjsvX1}wR(eLrB-%_;Mddb+R1o1!lwBZ{(a$s1}y=axT2Or_!0Kh@{uU@_lXy*<2uT;k?iWSr{~i!ZCSKGaB9;b+U^2LJ&0DH&{C5@YYiirkJFBM`d4Mr z?$}3I0_kB^${I;Yd^?`=0n~G?p*#ZYaAOCzKL15s0_R)8%<2ssR+vpyKPS-RU(*_n zw|zv_4$e&LxU8y(xT^h|oI?$0Ns!sYoEr{G`t#Si7P1M>}UE@lLZ2D^MfO^!InPT!bRsS+LZmz4kqst3rG0&S5va6|u4hPQw6VPiCG#KCqCpd#cQ;=^9~{58B?1E*=^?{^$OV^# zI^KU0CoNU=R^y(fi96fyCDHh{N%*&`Uo?9VaLz}Xd$~yS8}x5G-%)>~ z5Zi00meP$q0BS*+e+Q777VXt?hzeOf(0GNaa~^8gL9MexHw4leMyd9J{aiI_{5BM) zx8zv&I`+HNQ|-a*iVY{5b?iB-(G88Px6Y0AC2R+~fjS23;V89b$9`!rvat^>zE_gl z6)x&cO>YYlc5T2m@da;J`_*d%)y~Sg0O1O|cQxO+eIpd@ZU65|JLJ~hE_Gzd#7>k_ zpE|a+MB%Z)y|GY`RIKb+SA8ah-?Gr$ z7S-91SB3O5*T$RfJ6BXwD`gW%W;}1&C>6N9sxuaGzGp>SMlrYjU~_&-Su?xgMU=9> ztNyTGWsRcdgEQW8veG!Aw(2O)I`=ZI4c&8e6ZB4b(}7M{f0omp5O_`8rJXMk+E85o z7$j?XYF_}#dycN}8FJ9ZreislGD_7Su@<+MAKu@Gm1KqPw#8nFdpE$xMTY9O;c@$y z%X%32#dGKO9Kr3jncnt{Xw4P*e_IWQLn(vh?fa}NdzQ!04)U+Kt2>sGzk~|=#!+T1 zukLzJ37!k@x=;>nWmYX}p zOy%63PG9Emn8i(BnMXz`{DF(&DdmNGCJ0Yt9@x22Fc62^*2@1UG`SnYPhMW#5zCL8 z`>MT%uN1yxFtn57N_)>~WT6qAO7)@T18u>Y2@XZA-ipOz zW9#}^;!$e$zDu=5l(V?|jp-36KtL6ji z`UrJn2Z{x4KROM44Ib39AG;8-(^!RzLwU11@ep(a_ys|XU6?YSSc_u^l1a7r1GC1G zN%*d7I}w?LJBN|TTg2GzIP`krPQzx5f)v2QVlR^RfsW&+k&}~N5CX_o*8qu&Dd98D z5)YBPuH1)lIZg)~5ewOX&K*c2>yU03ZNrLVF2WQrp93}6ZA|ml8@NZz_y8z=597`B z1BCUAC70(zp3CF+UxCS`%J$cY`Qo?QP^4ajqxYhx3H<<>7`(tXaTwdryYJ7$p}9Aw zUB!Li_+BJ~D~*VKVbDn3a9bMeYGs6`8&ROTLQ6s3S5#KGqYGrJgtM4NN$ct+Y^>OE z+BEECe(MDfkhsyZ=LICV&aHJU^qi$#T@24NB~uq6p6b2IC!>Is5nCRh2UN{||6(E( zXYI=|4@A?>&jk+kT;6>f4CoLyzkqyeS)q!9@#>#Y91)JykIOueHC6sw=A)kK-}r^1 zb98g2-oPvr_MVFcy6m32dj{zAz?kN#kksD8$^z)s4g+}=9Nc`YG!yZ)9<~{Y+E9JM zw;iRgQceY+Ny3t|Lx4TUigqzU#Rq6j#o&K-l`728g#IED4E9g=xsnzHuA_Mtv{YL8W3C@fT@x zv9DL%qn*b)PYGd^;e$>*BRs{g9mpiA@DJ-7N!|pG>?P?4aS1VsoKHMe+(Z6DBFEjJ z)RPzZe4@sYm6IW~K62~va=aJwVShLNF;h^th@fSzlwyb*7*FxV`;<+o?E%Eys&w_X;)^}WROgv7n_0Qjo$Ev$y z77_xKk`;Ri5CwVS65?$h^Uw;EqJ!R3fi7+tt~!HpYxpJrVqVw!qw}%n%$<2OT%QrY z5sU}vF05FI7icpl93jr*MIMABzYZjHH=>UB-7tMev%38Fa!hoq1|`6HG$!Qk#m%gh zMxVufp2#vM1gO&}8RJo^K0k(CDnyXT<__KY*7peGH8cvsQ;`kawhFviXmxz1Q_ z>%{0VTv*c#FE5;%nLQy4|C#%6H=JDwHn;n+gP}zI3)VNd7nj7kfY^`t$r?f>>T|Tos&hP zf2GUT?_zk;)t+#MoKCeZVXElroqK4N!Yj>rG``?<iyIt1%tt*=F3h%2vnxjI|E4F zCq5qWoBC0tbpJzh6xog2M_N~=#UcdNk}sQZX=f?3 z^!vj*DdE~(}YY3mT|Pr;yGV3djDW6tHbOuS@oV{xN?OGaG+-EXjbm^LjP+-pXar}J4HUu_;1!Dedwi>0i0D&K^5 z7GFUO-pJZ0PjTMC%97o-u6nLao96r6MGdQUCpa5xg}g2{-qMM&u12O)MMqdc29E?A z<{9n#pyNz@<8IXsr>~5b%IFcQ=>f-k=K^gbyJ)*Vw}3_Met}-gY-_JAq%vnTzuA0^(bGr{ zJj2MUBRN$w>?3 zZ<{ZW*P}mMJ?}u?V|l5mMCT|RR3|VAj5$hAtUv6#yc0Jk_lPVD_ia)GuVUK-^EwiSutltm)Mj19*KNe zXB=mWt!G{%eC=LRTLFuMy8tzRfBSUQxtsgb6Oo-ua#uESDwBixYH8 z$B$6PM%kMhwpbv|vG|fn;xnclAhM{yur9MpxL7wi`ifvtWv*`lKU4G3;SYbCLN-b* zk^x(XMV}W3= znt2OYhPi7R3k@heqJINBnj+9mLBvJ8tmGs6R>W(bqPEX~>h7Rc{k26quZ*DHl=<8!bUT$MpIzb^vv%Po#eMn zm)Cm8wi<6OgGhr73#MdBFQ&#(1GYKFWM!xky?U+gp`JstvR;0!Y6Xzc37w z=T5X30pylZ%BCrbnS@o=hcay{3TqM>1DT0tDT5um$mGZXt&td(GYS{i>2Zv#iQRe$ zLo-6L${O8;v6#1YO9jO89o1|3T^Ti1B;LCio#8t#Z_Psebl%v-Il3s`oQZq1cR3eE zDCYHs&B{Uyur^UKzud=CEIXYs*JO|?VrCm=NrV9>bQ8qy7O&7Qm6S{zt}NnNHCX1~ z2CG*Z1n4g{M%~%6L368iY`Vqxk0xPbvp!k%K7gQItIAzGx6)bpbmD!@H2&C8YEJ!} z+DqueH4CeU%IM~KW>|W%aiuAEW0Fp5XbzZHDK`|m9@8MSjEPUxHhjAgigBTCPg@?E zR=ul$CcA&x^$dN_29sJEUg$*Qe z);i}}pvbhcu-Z`sbi8O85OK!283x!cqf}*Axpp1kaoa)7sT_E-n|i|*$NDbiowb*1 zOp4bleJx?i36B4mwesw78G0}~YLv?Fyk;2-=xg(?3d>pD#5ZPazFu#qZ&+Jd{ZhAM z#S61Whj-jvbxb)lPNYj^myJ?Bo%E)8fd1Bf4fAt+8h_TF-#l2CUwv{drFyyL!-^MG z`>HgK7fkP!C&qPZrEKa51zx>>Tt$EW+1-)AX-N-u>Oja1ZvErI#{#^1pF%#mx%7lX z>!&U5+XS)d`8Bo}Ypog6+CZ=Nt%I-5KesCcem&{aKor8fVdFLe5+0D-XK2abvK#{$uHhnL3K_NY|p1Wi+bNfpxg=Y?wmt;>!xXYPx(3>(0-p{ zRRF4hjJi>ZyvvWn$X_$y#{MTMW7}Nz=BWPe6|8FkbJ};ZOm3B}JXZDewl-f@w~dX- zs$h>&i9>6}yYroQEE1heite)!-ioU3vKP+q|JkMzsNF0rp@IX`AGdVyt$RG9@_*Fw zL5Avg{+#|;<%y(-UPlExsx%@eT|idB{MP_Ig+V1Hu`P5%u!`uRCvaaNuIUou zI#{Xv7gY+aq)bEKh0Ds)v0IU}El^w|I?1mK--fwrf1K!t891E>dW}jO%z`{Y0~%ql z0SrM=g8*Rpqz5QFoW3+1t;08MF2;N(RQdK{ZxPd{KE`7Sk4_2!C#gjPD$p%zUj04D zX=LNZX%?dRdH#k@obsTGnA3_VhSEp#T-25SQeuW*uK1is!Xfl z0A+HzWIC85-Hp2jg-hlYZi8SI`7otn`m%!<*&Hy+QED(xa1sD6U}A;ep~`t+RVCmqj+} zEnXGrwcmxifoT>9rVX58nw@_F>aY6~a~#%JnYQvG?6msBhUp4q0ddfR&IsfFyu|@LC)bz4}ptz@BQ7w zEBQY7q-tB)*Xm(R*7Qb*`4_01Y z)Mblf1NNDqcogUje;*+S@(Vqk7zO*0XU%p%yxy2fo{rkRVjTG{X8r^w%>hH(8-rel zc-!#|Q-KOI=3sGXByRwR#~4u4@EGjgTrdHJyBm!s=HnlF1(U`Tly;vexx_iU4^X`yCmQ#V@^S+Pf0ep=c@`m&8evB!U8O>IEr;iG zPqms5+qnKZKjce}j(rWiko_A@#B60Vvpumy_OvJ-4$i7sro!!H`PfY-@|b>u-Ovk) z)W5(|nP6yJr#puUK>Sqm@$!j$!`SZ_g?=N)V`pESOoP{x7oBtmpX zQ`1N2A3aQ?fG23(m>Uo(^*>NwA8kftINC)M?6C)RN9{J=lMv6L?l=v) z+pTX5hiqwoqB;syHGie!Vdom`zy!pSn&R{ZB-|Vn(TvJBe(;DxKG)s1{Ya?eWbeoT zl?*Ly7zCf}->Gtg{OvxOj;T!ld7{O(*uCNY42d=Y0>lyL~8g<`W4jlr8bNXw8xk)EC6;) zPb&EWytc-l;)$FsyGtRXfD|0%3c3yOff|Z=keW*E!OdA0Ok0U}a@#;ViLV(m!00BT zx}Atuh$_p!qy*A@=|0i`Nk!gF_8{9-JS3aR_>>BY3;ESrB*jA6vcyasOGz6;qpzT5 zb`BC|umNTa!N7Kx1Q8ur=ZN2lIu^RTo8-yzNX{YcVLl2|kVBabiyxEAm>FX>(=IS} zbyVQ=(#R@Tyq6?W^a$TCb|>@^B1AT2X2LbWi=+x7jsGL`IPp7w#o{>PQ{M0xSGptf zaQjv)NVnQF2{*2iD7=7Esde~9yqmJEv<`nzes!ywP$~-wolm$c`R2NxV2}*h{Gz8b zJKB&KV(luUJ9eIBpWr#Rp~?Yw(3&AuUNVgPM|(fmfWefsI0#l?o;Gx1|6tLzAtlprj+WVpE3A4KG58mLrE!MK8yvavqs?)8 zFO%PzhmP*g(!WLD?-lbEnB2}1Y!2pHYj80Ji*IBlG~t%i^#)UMoEp9h0o$sLvFWE@ zV3O(?yrX6FHMKm43K2)oH3JW!Be=2P3x$K+DbQ1!-*Minw8% z-kNpF8H91vEu4*rNo*$jDH4WS!>&Q?D>%%CU~D(fW9MMQ)*N8daKQ^ta1gkPzpEa3 zs8+(dfxn`vUM(k* zh^AOdrwPw7CeV`ve_#*kD+ErtSLx3D_)RMMYM#-58$F6=zaWI3&9kmzOlz}5)0FDh z@};zLm6kr47OI>MeNUS&C**vhO_P3&y+)fa>GNMiTPnUi|2XxB`2WXcjp%9Ab~8Yh zP34gAde$8lZic6F~LRoQw^i2CFBpZlbPGdCW&qj?4dx=pRvjG<}c`P;ND( zQ{|MFS_p(dAz9GbA_~fMGDbn+7!I#?p}_Rt=DU)QD1VLgu!=@u^wda0C?%b6%1_GT z)*IkEw9X%yVCDdRdyzdHWSm)U#Vj8CNFGU;B_(=+JvAjj%1pG9-qi7TUNcm-9 z83CC_6VwnFtiL9hO&s!$#gOw3O{gm<{~6Hm=^O8LaS z!DU67t+{7YSLSkEIs0c3xKBC!5lWdU2vh81r}5+E+b|n=MKVI^5-v~bnX;5KEPfmD zo)ay$S#gp5OH@6}g#!?Vj!=qLeu-fR%fut<=b?FAkv60Rz-iOOB*WP6RpN+rcDXWY z1%mZM=``~Z+gUn)lyc?msoTez#Jy3YLp|f%vn(tgW`8tElCH3W3_0OLtZllFUT;~U zx|o^USTiMGMkx6{-p2MXOg*=}H4|0JDQVhR9KkNBU!0W1($^TmGgy8Ke^vf1;fWoS*y`n zZ@vBdykhuQbiW{C(mAaQY%Ij6vHmoaV*lnnN(#y@WS@eC_H-vI@aPj$d{mC; zjU%@BuG&qQo5a@|A+`y8QFQ}nO{G*OL+yzXjqv~#pEe-?3hg*y8L`#Y#`$ z(TY~d8(@Tdy7*(Zqf{h%5oagy5&jA?i`|8}ZZAX!gpkQML;(K(zw=BRj zzpZ%-*dq&5mt^rJt;(aDAmRiCFlde_N^Wqg7H*Rtn|w^@B#0Za#qLvFwVcJ_L7`&^{aEeKQyrCNwvfZ$o>+{pui8G`UpDo0V)%*8p#&Nk*&oR-e3 zJD#Z$18P>qa)nMRkIcv=uLU9c>d9Juj9^szA}i~gN|5l`wH{^Kq7KXJirN&{ zswY5kRF=sZoalSs@EdY?5zBZG8Zqv!p$@w5uPw%T($Bi}U<$0ZdKhxQD8S5stxp~@ z<-@g6V+>5hMc)Q}Jo56Q3jI0M1Y1|#4AkgpI|))#kIsU=wnSkT7g|goF^`iM8!liw z*Ryr+aX{Z_Z6EIUqCnkv+z;Cn%~3+a$he3{s%Ma$psTBPlZy+^7>Q(a5>=l?z7_dW z%c3}~x>UKAvUTB?N&v;r7OOfy-7-p9>sDBAAVL$GHB{hiSi{0^J)xV;@{R;n1~9*_ zDpS8<-dear{fT+qR<8KPw2V*$e$_6~UGR4!MiiW{(fbN@4TRf||krnZXGSPQWjof%Wsi3uk#XGC)=(%5Vu@ zGD5*PoijiY#k<-Tf)#1MnqwgMVj~-BVP3&Obw%)0&xl$-#KKvqdT+S(#9Z%<0gY1g z+F8i$#UU*k6ei8k*pCj1xl=z5GbZR&%@Agn=fY|<)@PQwb~eUfW23DlT5Eim)&{L> zeNLQM)YCkUn40>lVI|QV1Fj_#-vo)O{YmRRZkunBptJPVtBIeiHxc<#OGl|?ElLKo zD7dkQk(A1+yTMqo@j;CT!#2pze4hT%!%~H$zn`Tx^XXO{K>hT;xDv9rS-^i^c%z|- zPe^sIJ7Sxv@Pku{cA-uxf6v}w9-MqygLN9Cs!bB({ICi;W9 zP@NqZY5b_#?*7bBtlBe+ZRnC(PXUyk|54z#jdhj>g&B2?=GGKrwZZfy`g&EpF(c65 zIL~m-{ihzRdortC-zKfLnW7LgCyscdc>5r=NR<9@2el+6u5O#M%yDgT&*AdJ-n+Y` z0QW`eu4usE#JuiCfK`3fWTCCf!(Y!A`|eZ$Zl)ja-wGNVr|z2z4ql7so&u@xe$-I| zEnD=qV={Et#CM&Opw{QBo=1R>P({xNrodmO6SnO~sN?c`(8!HzH*_YWCU{?MJBw;@ zn$tEOb#hW(TNBFqWhw7btONUNtEj!d40k=9`2{-$4D=kdjBZQDEWyS&?5T?td1 z=C!OQ*iC9}ArpdaY!v$$4x>sM!iL%csAg|@vzA)#G{4DO zkUQyllaOXzCFKYI^I?%s-#?spX~(-+9Q~$-j-?#0u&S1K?1SEjrcG>)lY8R~cI{-( zhGBMywf6JDe^lYG-k*{=X*;@PV%jD{yNhT~n56lhXrgz1qn~iVX+`}Vk?Z90`gp$3 zO8Nhfy3w1dj!E0rd0Iu^WN6!@#E0>kz9~fBn;X_E%AFkRUds1Orq;O#=2D1Rq%2znvrIC>*u#>#UT59IC1wsD);;i$|NpJ<#=LBoIGVSw8SO~|j{i^RNK7W6!6X7njIlGL+eI{XHC^2BH8TV(Iu zgu>0t{Iz-%kY_VGrZtVvD`}ys%>}<3_Av^J@wF2n@X{w{V@6lSN~0q3D&VBv)AMD;eeIG7 z(U?K*^MT1(mv?kF(sOt8MX1LWM0YmPcNO)uE(V_~b!r@!;Zj~yOOH&bcw6n_2`@ik zES%to9mgHs9t3|`7+Y^dZY}XsO+&SmJ);BBp8*7LKQ;pND*YLb1x<+9gKvZrJjN1o z5I=2KQzoHi^&Nt)1a;I=VCNuGr41qpmPCUf_rm{x4x?R>HR;nZMD*(Luh?3Q$vqP{ z9ZMW{kA%jZ?DYffzWDt;expwkZ!Hy| zACo-B8A&h5G2Lnao9nR@(Axjq|eTF%Rd%`N=p(5du zT3EiwW$btIH}<&pTP3&5J4~XomnO7mbH!=>Z-NU@tL0h0ggnifq(I1Tl}G3w*er!& z$tr7h)2*>rC_${}?QX>{n_n4+OMf>!6LQOM)VAU?05z79(jpMpRJ@f5nWMiD3WqM% zIV?U2Zr3Qs?xcWOSKGRZH}<(0V@lJyas^Mzm$W6|`YLWUZ7ewotgmZK{0@$<9te2> zi8p^=ycHzY@y1%Or(_*%Y9!1pIIJTRdWv`P1BiKLSZoVvPQ{Pnx1>uTK%yPF3bHd; zLaBi5cRo!GgJ1eP1E7l{nf#tk0cy}lWBf)=$dltPWoJL$pSVC+-L4yvH zD$vKBmyxbxlK)bK@eP6KdFZ6du^1N&obwPn4U0tsv0rf&g)edc;#0T8;ExjmgJu$V zgjY@$f|~gMC*Tyvx+92BlrL%-Y94hfI}7bXm7?ZjoT)P`C%rtO`ct@WNOVkvQ&7#AOtR>yqD(uH-1=(=j!id26WH1a{XV zFowrQjLd8`NzfiehSC-GMjp=iikL0^0zZRXDY4}3MQs$P$H~xJM1cV}(eH(&3*Vql z3pbBY)i4OtI9st6dO{z|m;-yQjexyHOwoAezDD|}0yf=31u299*{Gv()IudPUzRmO zS&o2p^_S#g$b;HUdKPTFMFm>}cQWnC4Map4R&4S`rs(GTUqD{gx-1MutWl9isWi~L zPQ830WL+DYb`YA@^d72*71l#?n&7mWgxDPjv1Ocp2I5Z@alsLIta>zRGbAze1v%n4 z2C_JY;>aMDeg*3o)fM=x>x^r_D;tk7eIWL}kC^+QcN})G*TDk*+QR4QQ)vqU22l(x z1k^|#Lo0&_Kq{IUmXP_1_5l7n`UibIQsEmy--|lw5Xjh$+WnUz19TzeYsh`VF%(zy z7~&&J3C0shr1WBgGQLwM;zFZWQIYuNtMt^H`0I0z(l+6Fe<|7r?Rer5(i8q3k{20G z(35!Nn*b8&9wj7W204);-+&??pxjzDiL#J7d2R*8iPAjc4b3IO1kN;GH-W+afaemP zvwJHNh$-xpbQj`r){iJ1X%nm8CzGUR;paRfC9qOQDD`DrqjWR34eucl;JA3bSXG`y zuoH38LJ4#sXZ^o~&w_66V?)CjrdGOPcj9PjYMBc6T6r*) zhKDMauV0V9FT3ZRga0W@ofCqmOGbANDlo1!2SDnhX= zl6x1au)oHSLs)me*5{QaD&S5)q*9$YjmQSrD^3*ZW&wfy0sTGUE_*k2O4xOFANITF zcJ>#Xz`mOE1p8*Bhr+GwIfSR=@2sOlJ#>&oBzfg?S*uB{2{tTyvU8XlYXX_&xstV- z++knAxR>I-v7RD`x9K8_lr*%o|>8ldiTXHy=lsQ}&qq;;vEzrp{nI1!DZy-Gee!?>1FTDHM**0Q3#2Z}}Cdf0U}C z1!W)ws-!u6mz+~RVdFm8VL(WLiwq4~=yFk>0iI`#t7$~^~edNDGLW6H~kxM<{|Js2ipW$!+j*D@J+AX^VyMPRp9!0p7 zJe2G~mZT+$&!gng60tqH!QV&JhT*#eirp~7b_7ukcEyM{C?_SaaL*9Y;@9~0;ya>m zgtSziXg1;9hHJunB4u@h;4|@w^KD@a@s%A_peF4fp~%m~@$~Ub;=jEIRvB*xs{=kKfQnmsw-EHU)KTX?Ln9s|u^i2B1O;=Obn>ZYmpYLV% zSLF$(L3Wkms-1}Sh--~;nAS$D=c{WHpeek4meU2#xr0^5lGvOkWBvL-_9272FQ4t9 zA8=x^dNd#GXskKh(h&;PQ*}LWTlqWVm%^y*Fhfys|K>#9&(a@jCu{$ynBa9^O9NCp z_~?0nN#)R9U?a43lR~t2_-Kj*rkJAbx}esAr-kd1a{Bs8bGe)wfVQ z8;l%@^&g=S8l4~JLFt7`9kwfTg=PY-JWi%k;Ae#zmAUxV<&P8x36tjDQQp9J+0;uR zr05X}eyy^KqAZ=KnM%2zfl{%lPMgjvCs8+q&XS*_0+!?CepKpQvtk-G)aJ0boi_TV zz*lQ>IXNX%)m2V-`Yq)q_K!_r@>A@(5Uz~R&RFg%-Nz1^i` zR*7fvC*>7!U3!{gqv&DmcG-T>+z>k{UWi|IPGS)z&&5d|2yMrV6WnEv<~hKkR1(eP z;y&d(^_uiqa*}FHEJ%7u(HFc&f|Xxdh7?yTZ0F7wAD7mSS-`)*{C_>lsvf*ieyy5T zT&SQKzorezE*lDCXGmRjeZgpPpZ3DC5YbVs=bWFSlXBlNp8Rpl6C*t=FKN!q?ai6h z=u$8@;cdNJQF&xXZElIo?|seqGN9{|n%U*zDL?9VmoKo!dX=zI6{~D}<8Y~Gc5}VF z>|KJU7FN+439Y68GyE=^|A6+pelTAFi>Gd_{to(Oz31l#dU(WE*^2t7U|jap+Cj)* z!u;w==(~uoW)s}mk5M%fvB34b=^#Qom1c$_?5vfQ6hi$7Rcfi5fa=JCRNqIFw*bv2 zF>51mrVE%)elv}murgPr;STojRJmzBHr;x&%^b?3QEFNZocK2Lo+Xu(wfRm}7^y4# zfiZ&g(zjpVM)q_~(0h~prpgUt$X?d0)C&yr2vwr2UdhbJM426!#hY=)ugp#1RQ(6$ z0^f99BICQOySAS3b*fh9%$#Yh3he(c8ZGg#cnkJt&aZM5kTx$hyybrlU#7douUPe6 zyP7}E<#8p9A3e3R63er<=CYpsk1D=mE>Nt<7&gVrtKu&i7RmOlyRQ8uy}7EpGFpmv zk!a}Bo~a^@``=lYxA=dQw(7L*OvZj=w{B_tQN8s}pmlq-%QT&h`SM_G< ze$`81jkT8We^GX}TVGdBS>l48lss8fS=ao6_BG}X$D(S_m2D47+~#UJic5gwHnt6v z=2)v!pP;NyjcILJ$X-A(En!#J{nCX|ZXMvVp*4&)pNde=(3ZV`qPfpo&jFC*E;jE6 zT6foiTKu+AYGSt<2uz6YoB~p=Ki?(-_pb?V35J~YbZqK`nj9uKW1v*qkcJO1qSc20 z^6e2Sv%9ke5xV7Wy9eUe`plMAC;zf&(ywYf)B?c7K2hk!t)U{Zezr(^>JX3E;#!IMsM_1mnZ27PGC-i{14cvSG{Yrq$wK zk?r*yF(6=d&2P~;kNoPzqEmDKRL>Lzj!!UlaIEV%+u?syNlSp5zGZ47S-m8(rEZrh zJ;0~NP1)!Hu&h!V9X!mRWe>-L4M-!RO`VeDk+w-?0;}r=-)<4Hl zua-S`ZTWKcO_vfVt~4&ss?Y~~{ptNM1X1L>AbS}=(m zLdh<=NY(@Alrkt|QZJW3r$E9J0j-oH?)r+`lo#W#;FnTOUHj6BocETPtg{@P)He44 z`!nfI!BIA;;(oD|Ju&4(*-Tc?I(+#lR@Tz@Wn9+G@fJLX3F}Nr#mg(IzGOU;If{pK z=12|@2lMU4;PSJD4@Jw8pOhellh^Jma~I5CT2g}JTgJojmpIKG-pS_-S4_{-vvdQZ z^I57&4&hX;L7iRprhutTOI}($N6uTjykt-|)$MK332FWK7=i;w)t;2ZZ3r|ur!B1A zAex++V+kTm%_%d5l?COe>8)i8h3~Y^Vdi47Cc}DVG*tC+ya!{pxT&ZTkyT=XxOqMhH1Rpl7fvo=kfLg0tehW4|p>>&QJ<& z%j*%GgF*@)#U7xNl?T(7lP}4FQGM2tv)3 zk|d%pM^{!!JdQ4`7$hYZ{sx{Q-P$4rx06eQIv|h9=bXQTE#!OFll?SmMO|w?gGEyp z70qYmv%O2GEDz-GvO(tkf~OVtn2nqDz{^ZR;8XB8=4NLI5X*G3c}~YMF4vakDkT)v zih?Myjy0)hP^3mYE1e|dU`NZ-X|S36~1 zZwr(^&uMC&NCjh}k^9u-PAl7-?s){%n z@4*BmGD!pcb@_CvA96ha1ZhA?L3P=W&=(;4Vjg2Bz;>+;#(qK+IbOt`MBMsI;ZGQN z;5w+QI0708J5HGi+lxpC^AH}$V_C0}9Q3jnN7P9S*3XD;!crYe(H>aMUy6KRZwnlc zGYSuaPUGn$4g^4m0fj0j2V#=~uz8c*7eQ&_v#fRYK?!?tX`7P&D_zUt89@;1ne#>RG(< zvI^yOd`v~4qM~9k;Fautx;;oOrA1u@f0SgbnhODoI~^<#H<5K8`KS_QhO+UBDH`>5O9J7o;Tuk3P!h4KbauwpIsC@6Qv9eNU|=r4tzBul~FE8fMNfj5>#qRfPp zimKvY#Oc6G$u7im;1}VyNm}S7uNrbJJaUGR!h?POOOaiqPMC$@9rV4}Nl+4!f_(sY zDtd(5ji^srjaQ&%g)boFqw~F{5ME(6&R9p9fj<40qU{i0L25ADXb@B@_Q3zK^%hW3 zFyG@hAR=KQDk>_7AkryFDbn2y3k&SB!6v(GcXz=8OLrP5b{E)Ph~3@Y|3&O%9eqB^0@F{=DcXtcrc;sul`Zs!5WPo%zI){@+$jCXtoABLddp;Oh{T94 z{&s2%@&TWMoQe9wpAI;NG2?NPnAmCDKfw>MH@Lc$1=v4a@T`1XJLmf(CEQZsrr1rX zLXhRR5$ljmvLgT^)Sy(IIEo&UP=jMJ3~`UscML`ho8?iNC&c`trt9N}yU1rMa%&?i zvR=9S!{ih=vt?_Ac|}W8 zTETflyY6;EFS5DrVo(&SxOSt{Jd~LhJhK<07XR}Du&=SDxqzx%c5Xo(WR#s>)Smm2 zO)nwF9%AnV*#u1CIF)1VFL0MYzM4MabwTb-=py4-rx@FT_wi81$+F_|%ZyjxZMoLW zrI07F7EB=Qy+4L|vSOD#gvCRgFulWmhG>|e=qAkFv>7k}E|8X8;S4@Qt3!wx+s3-SePgc&P%&7bVs--~jQ?orNd+=YP z3#fKgmsVL*h5AdN@YKtM^QK$q7^1}_MQ0JklmyH-k_F{vnT$lH#$~yY#;Llft>m@T zdwx=KKh0*@Lh?bHovHptDVlzT!_p`H6G_)Nw=r&n3eKIGUeGWOhb()jRRZNIycZ2;f^t zXcJzyizft&W|>x!#`t<$U_uww8<$@F7IhZ)LvvTZYYV4lW?12`sEi{zs{$3LeNI(T z6t1>6@plz7Ov{L8`Gb=bWq&29iH6F-IW_zOe!w;AW~W!<-q+2HScQ+%vVHJ)idO%W z8E(7gs;L{%oG+N9s*)u;a>ijS@sIqsg(WG-aE1Vt;x=Zb8KpFoF&y3&k-r$P@i15E$6i(zJ-3}kx(G_X}or{J`l*)q1%j- z`Bqr}$r4s#xNFgO%Gr+-gC450F>kq}s2*r-1{u_HS zJxmqzJ?ITn|AtO(Ix~yq6u*tRj5R%E8sjVTt?Mx38S~KsU&aUKQzJQZAM@*^F7#(c zpvVGL!Uz(M=A2{95QfIP(oYI%f-C8b0t;7XI-P&n`U~Afu*9gAL16#Wg@(~rs2s|! z(LI%wIZ<>21te~OwoM)q^od530bROiX|fP&6?Ln$z^IiDXOB+mLj9s;)F+g|X~4Sh z>`OE^?SZ&p>eU+ipgO9&dX7s0HBR%#I*n4LR2r#hZS1|16l_WjGshfozB)GVOWHZ%}lkd zY<0wGWg0knm9^qD#MWVraxt`E7EFzV=-XFdj{;5Vf}|<8mj@Jv>1BSUrplkdHbg9z z+f;=5$z^JUcKLnTVI*o+k%EJGrnhd2aJ`dMIYW*`?ky;iwV?i_luA!vT*AT9sn`(T zml9T`-Ey>~zOs2%fb?ADOufai_y2Z_fj3F%Rf+kvlD&j^$&KQ7gv0Av#2&;{-*Qna z@%Zv7q7LG(S<}TC#2UTDkxctH>w&(A@6+Dqy%u}X6Os)?5IS|8nXr{E_qi=Jrt9pl z3r^EJXITj6(6{N!X2UX=EFmagB;rZ)(uI$C#3ZQDj^`Oh5M*-C`{eV7xDtC7KbI?> z<;!2jjhU36%*$>IS+c0S8G<*`M@gOnTd70XTE3ek*vFFx5f9n>^Gqa$Gaqr=CT`$l z>C-=oCfHoFFn5DsSv4*36hBFmvGyJ>MQ!5!fQwV1?2S0DR4y}bZ~&5jW7;HDc(>(U z)}8e5=Dgh2=z~qB1yO-Ir90;ksUU@KgnYe(SOi&oSM;oGKJYn$K?_40MZf4i#kx7UYNsDR^H#Z3-JXzVdQ4JzxSAd0<0&T9bV@|TW{p0^8IY!W zMmgeKuQI0GS%_7+Q%+9{mVc#Qn3SK)bKh21u&t77HEYn;ylrw}T3wFqH!kB5U zl1|?B|DgiZ3gx3@GgYOsGyI5hp5m-OTCS4cSb1NTBR{<0o6J-stYrUnLWra;;Rh5c6>DWiQg1ujuX zdrkuaf(~>qE%x!?cOC+Mu`B3Amb%V7*1e^4n*Qtz0z7Yms`@vwrG)lml)Q;@@2V|R z1g-0M0bbx?+0G~@+gY_wgJjRV&~Xo9u0PLm8}@pFqJ&JAGx=DT1++J^vm+07JFu&5 zdxfEUdutrR!1iFv0fc(yXxm!EO8ssnBHDFAp8n?_mC#{<#zwlfRbY|>eOpGbmhP_2 ziP$b%SyMOm^UQ^beE4X&7ooc2-cIb@ra7pAx}C7V*n z32(k1S==p9&We585y#9*GHacOYD_)bG{5jgW`?dZepSxex>*0PTv)B$(%-p}nm<#L zC>5NLW?|`y43?q`1kTB2d@k1(n4p57JBmbwCGe4w$8l+hez3LQFv+1@2uk={78=|f}H$f4( z_37Eauq(u`^X)5(DH{P(a6&k#csss1&$KkEsyDg{ge7$Olz{m}!Xj62Fmd|?MXjyf znK_m6QdE@#pca$k^5N8du%&=CH1k}e;^(yNC`IW?T9@~RG8@{Xg+pbLw7;VVbB-32 z#^G%fhGZG?KqS{(Z|-;KyaGoqCucg~0e4R16`%uWm-iyzM-F>oY)Log-^sh0v=pcU zCs>JYIf4j`bB(d z8nQN$Aj%x6i7Qv<+|Z|-l2P3hSw1a$P^Zgs%oEkcMYt7=YUQ3M3ax5>EXXS=R}m&DbuMguMk%+YA~DAk z{{itf|1{VJr78-@oQ+vtLRz;TTMuHnS5ZA@+A03;eJjAwvl1z4JCHu zpFm()9;GUEHW)#9ye0->O-*w-4}nsf=lH=XRP+R;ztzn$uZ?3$yI2V4Oha`Py=UJk z2A4#$+ftm$AZ$=*GuVP1?2-g_V7pm9hJMjsDfgEWFU-+NQ>ah!>5>-Y2w;JDZ&7VA zQ*=BTRI*X{D&%`vf-v0qS(%gIkL56ANDwhei3+pyw}DZ;b6-_EAuS8EY6akBk&*Iw z(gC2qf*Mj#a#oIYMwg)Eah9C&0m;AJv%>3{yPI{Cft-Dftq4v&M3)UHD!f={niN$$ zMLR$EJ5X7D$=R&<{p6+;Bdrpc_91IFV3P^#%AO zu#PyhY>%Uk_zir`VmIYzxzR)ks}6IIAukrrBnF_pil@NX7+%TQ{BGFm5n%|ihUOxUD*4TsO=GIod)Am+*fZ`dZVPfHa?SA2C6BEat1xpT=gS?_iJpHodA`p)66SSAmP82 zHt84nb^33lF{LzH37kPS$orgjjXDHy4v(Qhfwo?M=<7;1F22t|fR-EcSkFLz#|^R_ zahL!sh^_cUTv_B#5!9}U_F}%N zio{HIl{@kp40mc13yQoNJsP<;8ky)C~T2v|;+gd9;ku<;7^)DNs=cf$mdIi}s+a zpr`;T{VUvQ#dC(F0y3wDDXv&Mp#@Eu{9Z65xg7SjD4Akh(Vm`0;UnFn5-49#_5KH_ zQ1saqiPRgI_BnwxB_?)49{+oif|e1kU@rkOiK@y^X#kQV?o(tMsRMt(e>vHrO73`^ z3?xjk{6zj*_1CvazCTGpaQHUzNFk<*L@7-b5tdS}L^KeZsgA3dgg;b}Bb{hV)mUC5 z?xF%GI9oia zWil_HgN+k66!=vpiL+8lafYIO;T#-ZG}RA++ar`ZRN}}OHQP#8IQRxVTcTUz4QO8$9zCs|;R44qb=Jx%&5^JY9z z+Mn|)v`MPXf9SbLdJOA$HHGwr~Q;4U) zxV+Y5s=xv2yrfj{3Hr;dQpQWE>+LO%pNAiTvnLrY&i4;4P*#N#VAfIhS;Qu_JRO>77|V zb1PXlDgTcOp}l2s*I-0RHFoq6d>~L+=f3n-=0^Nae)J#sl$n^a$mA{@! z=ATN%Q@`=gMn%(X_@qD+>O0;qS2T4y?}&|@n$Nc}OQ#ib@B9xHOo^8xQm0a`$z3C_ zQ~t=1t9vPDq#9QzN|iL$rj&eL>SLBjbrHn;STKLioBH&EK0{7TH$Xl?A^&+QGFqyC<*bd{TOFBqcg={Vw-DeX(nJEB*~{bw(ypHfdRS{r*)MFv9Fm@8kFBE83yLQvrHhssT0;haWw z7g%9rB0mLzOz0v!oGfR$fg&6n7Hc9uUj8n0r91)3_V$!LgWX%6DK~_lpA)aBhBq78 zO5P&6CgiFA=C8Cs>2X9>Or#WstPQD6(K;~%Ul@E*^s8!y=W~&)N@))hL94D=-WS_eiHxEIS)}+$`N=%x zzVJS!KYF@wC)GVTSC~ny@?;6FQ0wfC1=Z9Z%Ra#)s?-R>dhXM-9*hiy8f^_!V zpfUbu_BGGxdt|g`$pySqs3uCyLcZ&`#fj! zR*U8?d&T977Fj;zE)hByU1M)$zx*#1o7;g+E?#q|JtQsM57q|B_`EW&ZDn@y!Xxdt zoCBtvoi@4pm5I8h_~8VF`8SHj#I!!n{2ltW358<^eMWrc}78Vs9%#iV7<@bMzsFIi5m^yN*op(Y1~)x+_bLo zY-y_g+(!iLuROW`A2qEZq%5hpb3=&B&3`ZN8N zmybGy{?*}#N<<&G4p-sm$4%4aZy6;0EE)BGS|-^DmfDy%8sw-t%lqj0PUXWJcF-yF zcwp;zxpx}rRuW17B%Wt?xHor*35xaF4ty7d9&wD<$1 z+e$6{v7jE<8uVMk~;jK$H0DTYyLn$4EKG!fFx4v|ZEI8>PXcz5GS`)+`A<0??qZZiZ_EqeU zl@~~mPyHGSKcL5#%ml<^9Sj@j3HbZ9<)CKI)7%R<6xpjx(#za5sG}>rst)P^|-7!qg1{s*gw7D#0=vNY+V##_%xRlb`miL9W0Z+3yN1){>?%(M8RegY zZpz38bi?1TD=U77ob7%A*o+#Vx4G=@q$Ncxm7h$khQDCNq~Z|0*iV^;sO-|MIqB&4 z>CX9iSW+0ga8uX*O3_1Y+ucH7tD+i^22sIyVc@!TUZ*iQ3n`RsErEi9D&?fV>~)rHC&!Oj;rPkTNAz zD?J~2D*dM9o2z?zjAV4K3*d!VKN?Kv68>3Z*|3zlIAVJJd}MZvMEj{okf5o4pWK#W zu89ieq(!NhxZF$KptiEQQv{QT{nNFi;h?!x|voLLgdH7- zIzj+klGzLf%$pQ6SsTn3Nz16cI9BRCnsvEzfU--CyU zwoU4yX<@izD~w6SjI^JnyAeCGE@qaXa`U*6qv%_OKYW!~SD=;cW$gOWz-hk3?Paqk zs44+v7_=o@jcO|2k$1C%3+)G3WaPr>zkV!BE>sWD3N5nl1i0AETduZFVVs;f(Omi{1wnmoa05qXoff&Y+| zL0$$6&xMhX6%G}+Qj$|F0kxF9VVT8Zs=e1VU@n!rBn2p@?lHNFucSSnq;S8|)$CnR zVAeVIXu&=G&YPa()B+ziZfzT21v|yF3UHL2uw;4>gDo-{!=u@MSEPCyA~ZEZ5(wFp z(J9_l;Gf+h`kFMH=OS`iJFQ^8P~dU9fF@kGxViA5aKz*ip2TaO)Kxj0jL|ee+|ypE zJMxDzKdBOuJaagT`)lg+O5_(kBzZM*^5U?97WqPxX8a`{d6L3hz~YkbgH0-{)4Fm= zxHDN<@fWI0a&HHpA-EUXxjZ386kVU+O!5NGH|S+NF3q2yNaN^Ph!+#mj8w8V^|u?FD=(O^1_!>TG|+ z@-oZVF=R6s7PJC&3nFrEK)1pI<{iV(VH*tYG6V>h35vNFu?n=c+#2|`{3vuz=6z@r z>`TmTxPQgIz~~AdGHK;oge8hI4}e6W`VBrXz}SDW82E#d<*4Z5on__du8cik5aw0% zNr-jj{MDUM6wZDn5_$ypWS$ND1a92Wis3c>e6db1#bF$j1Cc)<9WZUeMsPLJ|0dC#;6 zuqkt8S~%d`>`eWdJdG;K?Shkn~ zDYcxwmA1Y#bb^Ba^;a-Hmb}CE7IJd{m9LAf6JF!zl&IEvR?RBA=JmbmG5EY4n?Qmr zolYaKgDje$(AkqE1P&pufPAuT&}rp<@k5w8=#n)7*!8eGUP~((6?wK-Du)qkr+X1{ z5q1;u_t_ul6?G1H9NzorXN$3>JH`@gC60FGLH|{(ZH9?X8 zdgt^OJpmGp+mdMlTZr$9-4Ac7!iT^sjuGrV&LQxGA=@bxHweEhK4Nu5+X;$(X|jZX zdQdf$l#x)brGALDf%?*df-k~~X{8>%u%|TXQVMJdZN0@c^kMqn+W5cKZ{d^Dc&<-+ z7YNB+7eg;!#+?=%0ZHTxyAMK!Ig%wW%b#<0SV&NX9O|T&$-J->h?KlcUr{5l#b zLWw^God#>g?(PZTG12KIec%;h7mGaP8o|JSsoW3T!bD)Qes6cmtq2~^IAcwKIjO}TPV&iG{y?A6m(2buvHT|V^I!?nVdmO;xVseOTx)4U>?@rjrFe3W~CK- zb5Y#+M`1_U;&La_y_lW_h+<7rX9;(PVp9(`i zn9xG2oYa-E0_%nujEks5WB07#;Xsu=KJ9oD9K^H?1E38_EyDCRSHk@qKTExE#>9otB5o!e2lg3K~jk>aU;SBC%B%4t0aCni4T z4e~T|XJ{_!3v;t~A6m?mJAl#YO!3@sOb~O(xRBJra{8~XG)MSa!TT6A!cg!mf-M-P9tsO{PisTpRU9=^0xSE5kNUS*?;vFIX4aFwom>i zGjeH`vN$_uI!k>k`?KB}l@$6-=t69m)R<5$K9yDzzFPb^QyQ>MVx5!fIwE1_?O&pk z))yeA2g>IaT-Do^$-uw0p^w+=S(ZUOpZ`4U0&wuV#sBK4lK6gd4mTnM7$l~ z!+Oa9`0WXK%D-!K=`i-dCcFL zi?M%FSIlneePrUAB-#)P-3m9l`v&dCFKdh%KS3TpMaQ`UEe|3fFbWyQ`0bA-fBs_BOtglJFylg<1mKHpR+~kv`pQJ+3 z3VOjWzf?sl;IqpD#g*dzr4S_u_;l7E)wL2AqXD@|ShB0Z|7YEVG)U)`Hu&PD zFwhF;Na+SJeu++IU!E|lS3bKOVx$v~K>xNE-gr{WWFCA<_#OuE=@ALx?3F6fql$_p zCgSjlceB=tyDF|4^$4e+ye1^c!T&?e<2z%Vy+87QW8OG@6%euH#d5&`?ADo21RJpe zqgvhwK4U_D;!Sy$K27F9G|nEPxi^4&j!1JN@W8~4i#>RC#J-uGyf~u92*ov`xc*oE zA2owDz;N<86HMrwutfP|4SJd{Lz2cprTs z42-9k85ro>=70YD|NLM7k&*tdgYlB7tN`Z5)%Q4rd?xr3qJ!8FK-eR8~ z-@|^lSN#ZBuzFQsS`ac=9MTrVFP+!=Yx^MeY~3d;ecB1v&0a6`%d(sN~ZLGQ|qAakJ0VZQM2 zigZK~5`w~_DH#1}p2`|r6TY)*fUudkgS3x)gmRpEhIW>IhH;vCigkj0j5ESL%sar} zBiJDv7Ht&wOS+^jvU<5%Ay86P7&S&SDTJE?`hf4 z+S;aQr**(PbGo9seS7SBXZHT=d)|L-U}SK3eftLGM*60Tp}fs8Tl|L|w$9mRuV0j&n8DcN>u1Kd+^D}vzg2oW=8oIl*>^wQ8@s>f zLCZtxqnyXSPi8)O`t;DVhUeH9u`idreEaIi>)JPjw^{Fe-_Lsg{KJutO`mX|CX&cu4V;tf|$XK5Lzg04Q(wwjJb{z z&W{jB%A+*V^)U^xjd9KKtqGlpJxK$}n^Lx>?oKf69MCzC*vlKEXd!yhXf5zCb-iKf>I@-mVP}R_OgDtR(h2&MK}mZ!v#1|F__k@P_E5c&DUCs+Do&SOrj- ztO`}TX>6*^tH0Mg(_XJVQMbFkS6AJ@YD6~WH^;X4w>q}XZ8vWJ)bY4;tm|a=zMjp! zJ$;S+>H*;(b3JhbdLv{La43Is=9ZM<#I14LqPIuwh};>qD|&bAp7_1V`_lL48~_|F zI|M&md4zhDHzFBT9jiUwe4_j0hEv;5A2@UT?8S38&p*EK?&6QjCRgTMU3$%BEZ}&WBvKyAHawx>tJ$J!xJTZ;(%(Z<61-RsR020n1j;53~p}2>KlSD&#@vjWw6n zo(em?;%eem35rB%k|bH2B1#pdiPJ?HqD)biC|jH($(82G z^OXha!fHTmQN4a#XfA0jZ7XXBb%MLfdmz2gK3G3|pke?qh#W)>q6abk*uKhcTqnM* zs+pi8YDsFcj3T6RXf!&3fo8&3CG31o8aI}=hQCVSDqJSA7EhNLNxn#5$?nU?6lau2 zRJ+uhG~LxrH5#qBmQ_cp$LQb8+`4DeWm8sh#OvS>1U(#l7WysD9D_ zXHc=eX~W>gJ)2Gs-P!zM*leraw$vSk5*{8na`x!E z(Rs%Lj~AWboa{Mu^7N~-v(NdQ&%A)YSaWI1<#ShFTr(M4dfk6K@kYr_{4L?_`a8XM zhwtsbf9%1ThZi1Qe0=`N>8D4Z?S8)gMdM51EA;E!H-&Et-etc}{1E!l<JLNbFa?ZGr!fEyMVorz6ftqzBp^ix}|Qm)^-MV&zD`Y-?zNSLFGtU z0dh)S8R+cjGTY^s>vOkj?ngZ~d$xGVyvaTg-z>k#RX+aq0hX%`SHBCqA9N}BXvntE zo;CGrC1Lb+=V~xTbgjN0P_mHO z#W`uY5qYcfR}?HLG%NfLcu{n-_%v`|$@ z1L#@|2aBl8#)aXXtL9YwAUq_VA#EqOPy|#IEt|fE;mDl9{K&e&KFsOk%6XOi96_+q zPBc~YTzpP4EUlN(<)w-krMqg5>Z|&;=4kamjao~p1=hvXd+HW67&bg_yxer4d7!1X zmD`4GFYZX`T-)WGc?eEJ%=^x=Lmx)^?SIDQ6@&54r2g>r-vIDC_#C{ z7^9va!CAn#&P##iGd;PG)Q!wdoc7goSp@du?|bR~wb=VV=w8*Dlc(rwROhw?(P4@r zT{V5Z%#HPiF->9*O=eVytWpj!rwa@M)-j)Q*MEIL^Jw33Pyb4M^MMn-v?Sfzp~EzO zZBBg@?N0R~<|%rL@&hEBenGY^`3-|6PVyHrA^gHG0o1Y$Q|@$A%X?oO8=wk1%{Kw5 zCt6^&UumwouZ%6UP1+shD0+l?U9t!LmyEjV5#yua&8NMTlRL9+ds2>VnL8RmdANS= z#)VY3o)Ya%s;+IE-bHh0%mZs_$F+S)9J*S`URA(Qi;6!IDd|TBZoZ^M@AVlmqX4#< zum48r-56Z+jB4B4NV`tm-u4tUMg!_@CBCAs(xm!5WrT`*Ka`QboHM*JMt(3FcH}$x z{l15TUnoJ_Ue*{RphPX`QtChb?1GK z%p$jr)(kEnKiCJa4yJ&%!l^{+jKQ$7!_?F5wTWi5O?AG0q4fRI?XNRLHyHlc1j3{A z!v|XhN9dS-8UHaoOOwubp;u9-@dWhIvZLI0j8%zBE{XAMm1g3F-j|_5y6Du^xq1^Q z>_7#d%YV>U#@oX?q+ZIi;oc!%=GJiCOPjb$IPwGy=Ll!M-xx>5KJ=U-h^Yo&#`BX@ zD-GiJb)lU^$IhAS);vUXC#X8_s_Ax0aegV5q1oiD;OZmo63VG7LwhIVu zbC>=-K+fgX-CYHofW{g*i+#9GOW4gORqp|svICV{;;Pt-q+nkMwyl8r*ns;kk!bxVU{^ z&wl3!cVzF}#@;)0zr&NgVxUjj$~xL5sj_5oTe6CJS($YgVqvTd)pZ{rt5Wpi!By_e z`m@9b%Z8rnoG)GjN@a+c*#2X35szt04)gE`vrD`t>+UYqTGllen( z?e-k?ecI6R*UERavf<5&1+<`+U>TGaBa%yQ)0CAXVi?^VU@81b?~9=dbc|}BG=3oS z-AxzORzcmd8pR=g`WB7sBQK=cUz)=$5GuqEIoq)pMIugUp{vlBJr=!-|BT(?eTvt? zZXWMcDpcChKzW}cXLF_WmTXPaJV}lOBOr;simqeM3%3cO1+fAm|7Y}6el)MuJCnDN z>vug|(b!OTbWC=j4ly)MI<2On;kcNi?&7D50+mb9*M(DMefeDem}Es1nzvi1^m@r{ z<88Y3T7Ivq=7>;c*2dnrTT;-}s8fn=*FWS13FX=p)LTJ?`byqee!Rjj@+mJ=QsAZL zt`b;W-6l`i*mSs1O6+gmpc9|$I$F;WrMFpg6NRRY4Adh2z1sVEuDr9FC6PGpdD$PY zD9*Sr@=CAl{Laopg_1v8hSs->)7FpIH41O_x^M)7#&!u(|Cn~;`P_D1srG#294=0Y z@Y25%ALcD>;|B*PD4|wNWyUu5Z=Nl6{%v|v| z(YLVo!W)7^9$I3FfaW{tV`~Hcw>S?qd#gv!w0t7Rd3vw-F8iF+doylPI0{R0=Y%j-qKrcE~(a) zrH_g@)%Vvv5hxWi+{bt_;hs^C+9~@M4uh+cw;yd=raCx8lW7#Nfk@JCS#*~rSS*Qb z-kn|{@~@k}c0jOBW#PV)mnc$=@U@#pv0Kh)ejZrdDppnQ7?u83EEyt_sL~((E5UZ+ z-|bt{7YTpqUarLmEY*kITX~DbVF&EGgp>{IPqclf$Qzi=G)k>#Zi6jltg5p1HdP;U zuI{EyPjyih(4K|flf7oxxxvN3%uD+^I-9td!TYW6IW*nbCLDX45T&zaJK{&QZ&(*g z%{9kZ8&kweC95YCC0oV1=@uudW9RMVcJ#~q2X3~SNKo}J8~LJh0$Ke!VHNI!cCjF} zBwaIwpPKwZah+EXYA#iA`EG8ashp#GIPJG;UiP1FiPRL-U2iz8{KnVTG31AFRy82$ z8DPCSQ~Wr&T;V7D9GS9S)CuRy>`52MP*2J zzj|%)V^zPRBI%yIMoJGUk)TBc*I&YU{Lo!{+mt;GeM_5ub--#Jbg~v8_fBnG0~0H% zcCFo1oTReXj3*J~^Arz4?8Uz&J6xX&b_k+&zG}1El-~<%k__Z(QMyIlSnewAjkW>I z7tPVe7e&{U2kPb}EtU0ZEP~&P8)XMwZwR15mz@Ev$99_a9BOjk;#70Be((BRPPdlP z(}clkD%u_vA(fcM>5125c{Lw`kBJi$GS_p0mBJT0+FHp6xAv@QyuRypO?EwecqYeL z>$N@}W2&+178fm2y0mm9>ST8M`(j(gi&b-7NBAE_;-Th^D=8~lCH-e8W(q|&gJMHx zwZ~H6i1_AZl&=L->)%oj#+%i&(KZLdRhINW&gZ3znMXGjZb;{pw_NVK&gLjgx_GSf zwBK#1to(`tO+GC9e0u#X){;1R^+}e0;4)(%NFw`$hCcp5EE4 zf0;6-6(@+PuxbSGWAmQXMe%TPi>fWS8&^M6G;(JCsz)T*t2uJ4u-nC0bb)twedIuCXF%hL?q99x zQj7MXMjd5QGq2thwp>?U!_Upurm3gK8tL5%6|3`QZ^fHjW{6Py%Y!ZbZw8ARBfD8W zeG)~xd&dHDbF)G7Cg^be8(n73ubRg-k77ntdsIoQ*T_Utq03y+VnO$yNq^liwBbm% z?S^s5!nTur2(oumOQ$U~v%b3dM$S-;ww@MKt%7S_u6B{Fk~_LA6pjfq2e|!-dq532 zT_?6a6>n{;+Q=teX-eu_2c1?Q-C>qPs!3?v7K2iGYJFE*%cdweE=z@-!UrAqcKjqC zt2W$nn%v0^*)TxfiL2_XrC65fI_Z@483$Tosocou`a3kis`%=~^e0YC*>&dj_J=#% z*>VkW^HbIk=j!^stm!z*-cDv;nQMoPDa^=i1~6M9-qn3)UR~v;iDYFt?UgNLFK%DE zJz5;DzOmU%IK)XA91|o}@_G*Q155kbH}VS8Uo;808zZ{wT)1;r%~x|deNOMC7*1*1 zj%}5y$Lh$THHvO_|KJ>%7W=aMz2s=AUE33}dpf&uRJb_;Sc??|t(vO3&KqC3Omdqm zYIECqtX`Bn#bJJ5RS|-RD`O=k zJb7#5*6=n*Rlp|WCNitD|EkUi^SW!dc5g{!YnMixcBO%#%nJXeT`imI_eyy{bZ8|^ z{DqHd^%&mWJEXk2kV1D8U{gzK%ht34U2OfE@U1not7rH< zS8SKhS-C-MCrs16JoJmq6#DFWPfjJNw|ym-!hUZ0Lq1#p>3>0iCcf-!r>3lV(L9q@ z>dmj6O26cYSD=~w+K@vlSYv_v&V%%r>mKe$YoWOHi@fS0E+6*y_p;h9zyZ=dH`%+c$;FODt{Q%lW>h zq0yZq_U^6;<0P!`mp$gJu2COIReA{K?#h?;u(uL4h8$!g$d}yzu$SBdV?U7*H z8b(7gAMd@hn#apn!IQ;ulWW5FSJ%e!M|Wzf$wc2R64i64Zaqa&o$uI_D+4EdZF7=j zuBp(i7lnAA(%cvLt~e$=%nPr6xbIgpfKT1=R(F%|Y4g3>Mrirq#cEC7=k9H)?u4uQ zL)VAa6zgV4E_vV5WC(diIi*SZ1^LwmdpkC7*{E>-Hvw zD5GE#h9QlP>;25Q5O}?92{XhaqV5>;ql2&FC+nHm_v9j>J+sTfG#WN6_9pg2OQK<*F*AbC#cb%yL z0jsv0P-`jfukevxTG!5(kLSbl;jI5zXZ_dS``JG(z(I1}fpY-A=pgV0 z*Td@!?*+(x*UQ?2UAXDY_CQY`abWi$&)Y6=d=Phy2j?Q(3J3r?9GLxpy9#;~6%S5_ zs=P+>)Ws$wz4ms?ZW^F`BDFWILATuwGeOpMKX45Z=wNG>-S z{p}eEnh^hg$1zr$-2T_eIH`X-^p%;fx!!!AHDCEbX<$8&Z)FFt_ezdre&95T7DVg@ z_7I^S9pDu7*Q)}0Xk+}~X5{%&DAlGF`+d zz)4i*Va=7|mX~8_>YlQHhUm8KGxjf`pKH9P^(_J&+KG?s;4$grNiC(~tP!Y8no(OrTQlQ_^ z{7p1?4z$$$KAZ%F-HU|-qyeW7K{v#uJ9Q8u++B4HiW2wBETt5K-SD3&B=}I{7VlU%D)W z!}AuFxKVk7xa-aDprZZ2aVqH6Jf}yTYTJ1XFzoX*1_5RLKInZw(7wI25x82Pp4iUy zG0zVAhkH`(>zV~pg&mjQN?y@#45`EbBcW}-$eD3RpCz@keuu?9MHAY0@Kt#7RpeB@oyB@tJ7e7K8$nU_=i9Dl^i+r9z& z#p7%|i#hQIUEZLjki*55qOGDm`{xSB3O!p;;uLXO>%kx5t05D95l4&O54Y+n6G|{A zw05H-%0Px(q{tQc^7-?^KuyEme&VZYP4jgAdHF;23;c|BuZ6Dv#}ji>k{^xsvz_&CiCFdK7Io-dq>;*TwTz^})sb$!Btj)xANxQ}GWSw)H2l^G$ygr_h_V_kdn>p5=6YJwh>5Z@mHE zQTqlYz~xeK6$H;EY)@D7Pwe|^ml+ogjI1AlWpxcV8KH$OHJqPFYaJthGBVrZzO?`* zbPWNM;U)5>RokHRf(551@oC4-?HY}*KX9-v5u3h?D^EmccH3|=k=W)dc~babP5#z# zu)nc;!!hWAQn1Pc(h43Q*{l6ZyW4YG-Aga8DpM*L(3>u(6)18p;9G;~hXKtYo=5jZ6$)Oj#1tiVxfKFkPgeyKluN0jXP0dmY?FE@JhY5n; zL$=BTrj;F3xxwIOS})aWV+CUIL6wl!ESe_2mU&D7Nj+oi`TvUO zzW?Icgu=;;UdA#H*eVy+Q`+gWuhnf8fs(K0=R}Rz#^_1CCS+>GnKOxJ%G;Y8`I)k5 zzDDeo@VC=&As#N!ZpJ` z{)L#6Y?V_ma-JaVn=ijN^rf|2dVCMxuu6Qe_ZF@bK53sfy!RK-5SOmzAFrfF^YP94 z`1KFa|K#_a+!3w7cIUJzUz&S;mf4PWUY%)NLubS9bvcY+l9RfQxh^$C@qm>YX_3uf zH~V;roq!;R4#5&|YybF4d+yJ=I@4_KE>)+&mMepUw8>mi8K|n~_U@>Ye*i~DPLjHV zh3l?}(s`2|EJP0PP2Xb6JpR7gj*6*xwepgF8CDHtYckPGrM=2MsC~+R^7%+r1Sly$ zmagLpTj0G8a{eK>sMp?XFVC!LHQGpdio?19@jf0$4T@%$+)+Fhm{Wpfv4nH@FL4jP zZ=IWP3>NNy^4*Y=J&~pe!_w+whFC3CeoaePJp|>dy^73|d5YQ6AIa6jdPqY!E*>ph z>-}0#%C8U zpd!4J2}j9Mhb*j>f4Q^O2oKULLv(_ESh`hR*O>^+R6J^4RCrAmQ}ZD4jQEa87B(DM z)lTwu<$sWcIizAFg4r~(d60TY57ytNB@?@Ame8j#OcombVV<|~JmcxMqq_O5MIkk+ zU^dh1zAOlEuyYaq1~)ajHy!0p(*0L=AGknxRWAm1F&3C9z^UAwhD+SZ+rqTATxQ4` zWhyw*t65qCp0tY)uH{{7;5826zPi=5!)h{LTD1h-PA@b8NPF&V{UgL7{*WdVJ{^2X zA%WRmOi3FYX_qY!!9MlJ8!kwbwYfDv#g%wZrJra7t+m1^kmcm*rx79XYt&r+^kB05 zB6iCwQv3()vSSk;5WId&!whYqrm@Cf^%Z+#!4(bEXU0b|a`s7GxFme*9@R;aPw-;7 zjo@!DJ8?Gt(oRZ{(6+j)`YelFGrrnTk&bOP-_>uVMjO{_ytCJ9852dgcs~u_>H)*Ho8vG!B)?x+SPmz-C_Dr_ldH@5K`rsm8Kc2$cr;51GI{u zbZL`9=XpysSzKz@&rjwD);zEC-?>TESykAz8~JRiY57zBRsW&hFKePEr;>9wsU*<=-&2_ZCwN#OpgwP`?9~mUXm_k^}X9bV+J=^#X=vbFC?z z`EbK;9i6?|{kAd)m~Hb}ybD}!T+ky1){CCB-v&kk;mv`Zk0k|lJ;2|o+p6XP<(p$G zvVb2OhO`j3&i#@i8I-JCFM7lqFw}Gl(U+nfZ4Z&poXbsth(q!7+J4xw<3Z&z*f07& zBLg0{0nt=J58Y1;v$>wFWQ*+K>4p_uIx$Chs`aDr7H3ssk|47nNT}Y>d0stQxW3gzF~~MI=w))nCWry6mBzr~fwm!sd{IK?8`_JwS;$m}Dn?1|7&fIXNkX-qxnx8yW zkzqpU|t!$4Qb&|W47;c*8>astWkx}_YSZ11+IoU&~t z4aJ;$n~qmm0Nkg|DCS1GY*AZ*3D%{OY+j`V8!Sb7d8_*Wz$eHpT^Kwi>qYA*sAAj7 z`YdS2CQYRoit;fSw9r-;lFA>FSf3MHpcj&WJ;lNU;MM+-0#CAkr-*+uOV%<9AB?|N zSBhQSlxFG0M*86TU8ui{NJ&G?HcLhCks0E*yS0h~Akya`GmxHj^h&C;+?yRmm*X|H z3ZdO5H}fOH;6vAacZJbmDEgFE+F4^ZpmP4>#EJ}KJu(&;WY%Gw z$$7m>_O0maZMQk8f#Ukxz+$gQ7J@s%X@T|>=&<6N^dOIbryos+yQ#zhALvltyIrrL zsmb9zCA^;KBdr5GMWAq)@YUe;+f3#C&naDV4)U>zm%N0I!G9eI60D(;_AlcP<{cln zj8l{CyJIkFbbCuJ+8>D5?n39RnQP)ABBx6AJH*E7pky_C5BhO9PS!`l7O4l}_b98lcBe5q?SaXh_v&N;O9{=0ve`;6ssr4eU0r?+v`;bPvlp3)&T?OW~ z?i{0-m^`%;mL86-Zu+0t5U8pCDMZ(V8=n$1=kY2D&auuH&qZ6I{Rh99GN~H|2Mtzv zt^IM@vB|SK&a0+Jw=_A*Jp=2jlO)+|a*P{=dgs-uk^DQ>O`>)z1*$p-)|6Ad2UlAp zd0l;njeC<9b$IHgMfWx8Rd8T$)iv4oHGtu?nB}}(sSr%FzA1{w-a^E|`Asp@wR;ZM z_T>%s1ywFdc5d%A_D7#;oTDudyim16>AR-FkR_ev%vAacC)kV<&A@Y>?xOcl@-M|R z)Wh$_XOd_h4eMB&=nk?Pwl%|>@s{%!Gbdv+@E5B!`~ugPW9QKY?gjol-buX%QZDq- z9)OO6f6?!Azt{cCxW#=YB{6StKhkfqUV;nK<2cj6@USmH8mRLa$Nd5ReE5VCB@~@| zPc0BE*p1V8{G+v8x)yJiI5PUMF4_?DA$le)o4pcw80Nvz!k<=?xRKD~2X^G28tK{9 z6f4z)fh*Jyc|-Lt8d+K-x=wEw7gDPkUxbuYE-Qg3*aWd3;OpIA16@e(Jq_u375j8! z`7G0aJ0mCo20@jC%G3r5<+P)!c@#0jK|X0mEwfg9HS`vHqae+l4OnBTcLPYXTH{Y8 zlKmU5^^Ynqt;wj2rnFne2}rathJ)n&QAKh^*E7>{! zWH`yt)zJHve7JR)C4e%jzJ=gXbE-ngdudONS5s^mu*N3jBr9At$L$m+l<>K|rS!j{ z!4q`S!aY&FGsu3u1Ll-+R{MN@J>@}zj69k~s{D{#!T8%SA|!?RN}+M%v;Pz1-s&rD zIBj+OX4&z>y*(MEJ9|f&%;nSieDIePS{q18r%kGBN}fgEZ(;<0VVYIP-D25Y!i;On zcyr1Z9I4>Vr+9ZkJUeQ1#VOtfT0Y*&%cko|nLHiiN%Csmbyjr963CDJ$qj_=0>7@- zadQFV;c~7RsOZe+_5pRq-Q0)3A*>Qy0{kc|086-=lVZV3+}_|^-VSh$+X!em`1pzy z=Rach!E1mWe@y$oKsr9kumxzr?9d$UNVKRlg-b#XCz84Ek-vj>g9e!7s^rn2{>zo@ zUL|!Xi2YVx(3Z~el$Po~aU^01vI-a}yiyVm2n9CVtGG7&+@QtWXPDU41-y;qU0TIz zHXYx8hxO8MuH`q|TYE=a%eJU~!ecp$70$)UoP$zo!X1Dj(r;97BMI2$CK!)?x$up7 zqjBcGcGlur*XGNtlFC30%DP^W1dU>6>$tAu0+qd zE=J+e)WH-+`~JqpG{*A*jcNijxGRafhk3u*xKC<2M%(U);3|MI7xCUX3uHhoI_2(r2LWSazMN_4e94D+wca-<=$Rpi>w3B z9P7g#V5j>>V9wa6npzY_17%6bC!~@+%tSyIh78yOJ$1ed%OLb< z651e>^%{|nlE>96kVNr%=@j_3u!&U#^8{YGw(wg1`7ICO(Rix=UFZ#Z-Pr$yGopT{Fsy*}x zzE$(7+Xr^9G+8b~wI*xPEyzP(&*jj>=ESbztyXmS?c$}1EzZ+<)%=ME zv!UZV9XcB!o9?M*XP&sVM(D+x+c1&t4&JC@W`%-hjn`s!gO@cU{7Ae}(!);gc(KHo zp?@Ljftt=GysNtnCK1oAcY#0%cD1F^bYNM1SLSK3!15s`8RY7I`niL9?v8L|0<0vzsO%AzCxWrxg;u}m1ZOf$J0M-o=-F|O}?Y~F>JYGBR(GZ zZ#O6pVriS5q-NGj{aDFt_C|b-sEOTK{zVwh@k-YcKRI`zi}~F^#d;x5;|d%>Y$Mpa zi!J?zoM{>($wK_KKSU4U0nAB=!x80^1wPQXv~$E5=s?t2{30Y-zZmO;3LTSBHMDgg zUvf+`qT!a;stpD;maRL8^>RO%cDH7KUk*EUi2I4W3$bHb+)tTLg=JGSF1~q~kJ#f_n8Q ziKkYE)!i2gO;M_of@KD8*qMJzyQnN3A5e|lp}{(24ImiuxhvP(K1Xj|g z649ID>;4vesUwts2uYO$D&&WlfYM&vUSGIlB4)1+i5NoNW#89bM{-5^4xix~9O(Tl z8r8k2mLU+d)ho9W^Bec@4&rBP8cSzmJ!WMJgdWuAMeIN>t0u3jMJ7m69iG8k_?f)| zVdtLZHQxnm`>GU&`G-6Dc=mX4le|QRMb{Lj%tbRyt`QRvSaWn;5qwlO+2JNUi&)y0 zWIR~5*KDPCBu|n=YfhBMaxSZ2N^RjQ#YWnU#Cx()^p>y%;sIvv+F`IJn_@qX7!AB` zRU3Fr*hJQiWIhwi)lIDJoCV4p*4@H&au+t17$Eu0iP)qO9R{4%ZW3VJK>P80Pte$M zM86Sss^Dp^LkC2?Dg;VpuTyM>78I1r?0NrfH%cb+o@|;ae8hXW<~K3O`({4@=Rvm3 zS9OlU{^0`dV**0hpkxy{tYrBn{^tB9sTZD@@I~x^6@^v`=c3#-L&RuAW=Om7iN&uFYwahY_tD>t zJoSURIK7urUiFAbl82eY7}KQ743^v`@qEpjZQF(RO1BV@@RV*@V~3{-{p=^BJnT!u z7d5r5LD#CZX)5NQklm{NK<7%@D!1k?6EzxpFVOa=}kG zXw_DIcXjI(*E;{l50eosg|wfN=(^K6U80~$+jyxU(?AJ+#fMc!uUpt2iP(NJ@|MrA zoU5BW-16U0wUbl_eKU*6Z^(y@6iRrehc1qKVvAC3MJH_xmtSZ4dE`sT?6j4&f(O83 zi&xD@MxETYvXwavBAK{MDS5pion@QRrwwF1-Lh1*XgK8cR(6MT)+0d7=Z;%>Mlb<{ z%*N_dyrZ&0i;P#mJ5iC&TS1cPBY7h-=4;l0e`0Hu*1QFQTIpwAh{s}4FHg1d9kGe` z!}PGKmpCr9m_hz7@TD;s-(7Z97lvI)r>Hk!(_)t?Hlo`D{iG|A`qe*#pWq+1fAMSJ zt)>-~7v%kt2c}BtH_*udNj81@uY4=n`!Z9&zawfqH_$VpB@2iMY)6d@I#Hit_yw8sOci^vLOwV05Jm)n+N z)%ZQdn|4{*Saer2ND8DcsUKcL$zNDqQT{RUrdc#>`WOrebZ_6&>Tk>iuBbeR9c>MZ zjKD1g-e#iTM2nk*jE%I@bp+!~-l?i#S1VCuBC}#567)grExs1jTTZ#FKvoD`w7w|p z0rM3LTUj6rdD>VG+SB4|i@2ZjqAH8I|0OQ1NC)RcjMW8zNxmh@?_jU1SSsMHwwWV% z%KJxN(UOk8Lt+|Iu^-f~nlx;2?omqyn!UZzn1fshZ`W=`qI`Xni{Y!TBFPX;wuu#Z z!3*VoHPfZr;luST@e%66YM#hH*UgLy&TU^~KnZeqq6X#L_)b$KVpoQzrVT$}L>1yI zlQkXD?14k;PN`5zebpI7M9zNGIoZO5i~4io58-pwhlOX?zm_)=b*>U|IbLkjNi0X# z$()<4O+TQAb*{!G6u&Aronub2$zAQ90O&mx>%#7+ou%v7Uz3j!t#*}*o)L>|F7tO| zGo;rV_t(vbI%-c;DJkPBcbhKf%&Vx?|43M)tJbUvv#8n?Y3sXWS_$7(Ap!&jn>YL{ z?3h&DSl&7lDy%JUxLSUoGO@-#`+SA3nb`JSw?=<2jI0V$uUW5?t&@pdB_cQBm6c=p zOYsD3??6atD>I`9ExTECy!|A3W$KHjx8=InSGD)3Zoy+LYTBQ*O@=9qPfj0IYuUal zY9+S7Wena~N}tON?>5qzMQv>d7!y*@HJ)Rfh`m_T$J`zC$y~&`v9?|JinGw!MrjLJ ztmcSa!8k0kKZ@(a_};|@-WTP!RsiQy@rDNAd90>d!F36`Xo}}nu5Hvl1XnsoD^`QI zteB$hye@2XpB=V}Vd_jlqYA&ZfQU5Jxn2zaj18|sVM9=D#WpxZt3>Ww z&lUWEf1rsyH05jhm-aUK)55r>)6yq9__bHW|HYiKoDt0miZiqbHmnt>v-xGt_0q3c zjrA4*8+nfY)&0a!Ngr&Vs~b_cpvh4kvm?6JMNu20w>Zc~2YDH$iu2bJsv*Hy=Rs)! z-^CgeOhtQ zCPAb1Iidu6z*=z7wKS)MJ9wrH$~eC>oOEK_q%Nr3H$1c@h4R#IckKh(snw^=^B7m` zn>GKk-IjfqDuGk1X+s6HvJ(BC$FxHk&-z!>W4Ep73}q|{PivmdwDr4HV`AlbjI6lM zKI1S>eHb7wmr4YnA8YynKVV4-yn7GlLdO4k|8RD0o6<3n^CCRH@j9@@?`d@*@Y=)9 zxRYDw5U<(;idRe#*YRYm(fdauijtIFFuW(Drsov=SNyZKYfx?Y`i35;#P3Pf7HGRi zu%R1DbTB9{K;R0N=pM9(`E2he!M`Q`0~A7=0d)`ZGvbF@PvNoQ&h-sgk>AtGM6}T( zU4IIB>2O&&3fZ*cf1+$Yn3TnhYpuF4^A~@l&t9AVJOU?bi&%0_?~7|jP!CnDdX#BNs7+-N(xxvBsJnQ#Z3zd=2dY+k?D< z;mdxNe3p5I(-qRet^_phHozWk{r}#U{*8`3l3X@~#C8Rdx5AwjobtP{C!RnpgRYTg z(q}`Wq?e3KkZ9P=}UyOgN`x7`P*Gzu=kWK{ijZB*&8DhqUg z)LQYT*txt{=bmtfdQ-V^;{}G7WQ=Pv>jHnpMM3`CU9b0#D;(%$G`}j&Z{MRKm)bVo z<-H)yu9;fIEO#_HC&W{;wG%d$(a*~`uC^>15qIHtzT)uceL!K{UQP3+qA&eN)q6`i zI!^G`mKhq)72YN9t{U2Qnexk!xA8AJT~X`ui{&JUJ9Cshzu0<@o?Th;p>aRQuB=(@ z#2FxO<*fiBDN_nx0`IB!w*8OWM!y*N0+h2xxK!|VaSW%^nJ#qkZZ7jaV|_yhOTc)c zvSqt6EubCyAuGFZ9A}tCvuzq6ctZuF*~2X7_;s9NgE62N*vCUxJpvthloQ#ssp82y<7f|r`)b?h-2#%F z#1Im$oMX&kH!6P&i@-i_rLtSle*#u=z9E)X1}+AB9{Wc5M{C>nj@qsIP!mCuDF$Rq z=nNT`-N@ibHs{S|){ETY_Ol)kUpBOGqHx8k?Z5}*^3n6KfYn5AQh~Ya7h2678!2%MmjCG_G4@%vyP;|6R79=)UtuU@|T}VoMhGjqO=nUe;+>Swx9w z{wj{7`qx!4r_*vPL$aUH_Zx0*nay-lyZOsm*QE~5=Q;iS#>1UthkXs*y7DOlH!SDM zZ+DwTHI(D6wv00BzjdA2JLr*?<*~Jl^SU^HUluO6cJASn5{mul2&ZUE`yFISiN8q* z-!7XhOocm1C+QvV@P>KTNtj9H#m<1s>0&8y(@Y1z#FX+-Z=2MaXa`P z>?XXxw_qK05BLLY%Ur};1|Hko&r1TI`YL$)c(a{CpfFz8o`1L<0&0sFw}HU*Pr3Dc z5&nhSk1Ht_?gOkV!xgkauSEX=Imk!f1>kpNjMIExE%afx3g9V!Hhl(o3U6H-AeN-BFMXR;sH@HD5`A1vpP zADo58FXR!NQr+UTal=e+x2PO|DO<9B4tIm_u;VV!8T&mjg&onkwjr0D)bg)p20ObU z2-(OMROgc7*bhudDv4916GeUoCMnZ>{s-I=-*>F$UgMA4S;Kn0E1~`=>u0Znn$7y& z&V}pQvxm!l53`G^H9Nkse^dw}b(~gBh>sc&OM4vUTs8k%SFYHnu(vu|__4TIktn!d z3i43m4JowLo)}+ll~T>Or&>iM;IZ_ubsI1RbFcjm^fkxaDH5tEFRKa#Jn9Si4g#ay z1~vRD`jwK+_({ftVlRhnu0Ewk(_{`)zi@Dx?~T3wlm6nIl2x zipYf>2wQMFaR?br#D`hII(*;Sr*Jqn#(obx7g^Lw$1M8yCU5kh_Mq4w`J_%|cOe@U zcM6`vJ+keID_}qIKb!i7)2O~{>!AUDnSCc@K+{?V(3jOGD(L7O%Q+DT*;FB7y@B=m z`32taG_KdXqCn;^grGUIe%>c@3Kg5U&*_L=QJNh$Mw!LW+Ur6xWZsKy*ZxQ2N`N_ z=P!Y#Suzuvc?a}&LYsL)mB-qdJXEsL-oVrG?Q5QBW*0`Q->OCx`{T|E=hDAvW*NQg zb&g(gh11iy*{+6wRq+{Ef)r9DTg3X`XEj-h;M9p^W7r1%dI zoNXt{2I{u1AKsYyJE)Zi;+j1r_(5>JtsdI|eyL*1Z=r9Mn`HCRa)c@=Mcz=XMVFDn ztZZQn{3EV`xDM-rHuBS856?vG3v|`C9#ul+m0DT9WV<3o@<(h1i^XZeTjd*s7X*0b zPC*Re6*r&%9{+FSV_b>Vdpcno(T%p<$anap<(%}UW=P&FS*7|1x+#(=_LFhp2$?K% zEFqSpY*FxCMGhNr>@o4u;}_bFBesJG8~J3hm%3O+$$pAO70HmZ@VUO6bXSn5$;=?} zUn?WGEWnL2$BpZ;DA5OxTc{%;v^|VWN57g|BwY=QWHj;gngO0gm~Z(=+Cp41eoOzC zpR4^8+la4FJ`8+~-jfb^96$~U<7`jDd$51ZndRGO^Udz|&U$GJ98*MWCpTcU@ZH`aM zbVV}fKolUo0i^gRi9@+l+|CNRxc6)n{7K+N)eqx3WFCH0*9q@rPSrTWaRslGJE1?x zBzZV=Flw~q4y5#-D$0QJ-F6c9p-7uO_*Q7GYMsGJcpsmrZ4}&OY*9NCrwg1E`}qS& z&t)-qW28a+4Quo}Csd-9ZuNv6BDcAP?Sfg#3jHQ!AC{-Ns2EM}Q6Et+33EKirc6t(<`#M=?d4&bIm~%2)5U+@qaVdQ<>;t+HO-<3vcZ zMI9c2iKfe&{OpON;?Hg@Tp?Jo(i$zsHY;{$&o}#{F6z{JJ}pmisX8JrL>6p1ljtD6 zuMdj|64s~=`TiiXWX^6`_y!@g(gU@@J_?}5;({h1w)SfgTvk`rP_iSFZVoF8jUQ_` zO^ylGYV9fbx*BCJ?cpjPDUYeJS}ue*YQfBg1adLwXU+3+N?B+nLXl=#ndVZDY~82V z&=-ZKsedpm>oCPemfxz)k}}RBE7q{i=|)u7Phx)H6jisff=ka@f>>=C&Bi-y_pJ%K zT=tF7d8)gd+I8vjwE(m#Maz5Eu$`D&dlU+1pQ|b!ZY)}6p2-`^SZ3(u>Ea%0 zqj-XlDH1t6#?QS>3{1Ui|pcN zs!@R=#8w=FI$)4`w$1sTwd}V>y|r752q!<23!UG^*C1ezJwF z@=|mMACbL~^1O${xF~8BEN~?zSntH%qBroFRT*_=<{R^z>WE?wL!FtC=BTwcWNz_Q z9?&EN8)Ov47VjqUQpx63;Bf0oi1m4_0V@X%biFF@Cr7khE1H}mZaQ52JQ1ivO7BH& zsv1N38Q@Y8NeT08(q_?y9L_6(nAq|J@f3~}DCrtavXE_Buahk~`HhzHLy4KSfz-)S zYb<+daDcOM62r!Guf~b_%5k!MDf`Xx^P-X5rGQPx5Tl)RvcuRQ^6;Wxl(uD))jI=4DT|B)E1A2kw!GF$3)qobraBkw(qDM zKy4%072$|s!$Iu@WU1#ar9Is4NJ#SFuobt62IxP|{8mshuB@*yM|2?Tcde5!d;46= zb-~0)A7dGR?}i%92b}BKr%1(u9qYsc=nSg`#9a7a_QjTKDqR_?VXxvy*6|v)>`=mO z%Th^4EX2aXEhz1v(C`(=aTzw~@ z#Vk-xiMVR8mIZD|Q1251p3TF_w1bYO!YMb)1&duPe3iw!3d zWTp?=c@anSh!WYbO}%tDUDhXS7AYNHh&B-RRu%XsYy=tJQ?tsE>SnD{biQZk~p5OrzZ-WheXSvIKDgcPiO#S1p~A3-z9+pGqF= z=w?L5oNeCBoE7}4wvRQ*C)#|M?dF!HyUd~6r75()^JUjW!(c4(_<@bUh1|%VGN3k@ z)t(F(W9phl14n`{*HF1jeKwnVxh6MUyAO1+Ym{5S$IF9-3SJZG?#|ih?A(>zfe0x% zw#@~;A46@p1?L4Hs*Z#I_KB%zgr2+AX^ulj>>kOELc5mN3GPCJq}}~a!Y#S8x;6{E zk^@^ki5W3j^$+k*!QEBq*gKzi<1TEh+X3|})WLq9Yyy(H{GDJE+(gp%vE=EwlRL%I zlgWN9xsr)7$@SAk0l_VmdV$0z$?%o`!tI9I6_2+MkrtwtSGW@Akunn4`$@YdcWTEw z_44Gv=6#BTF^P3)vf$t<%M0;spRI-zA@256RZVQPFOodNXRgR53eh>Fl3rcKjof)1 z@#n3O5{ppN`I?fybHDF> zUi!Mgw|OV2qlm0|S)N*AhIUeCmYpx&M!Q))Z~HRF5S16Sn01d~>v{@EWc!^xP}omC zHdt7EsQhtLdT9rBocaJsOmpScmzUD>iZZErjJ|}hVSe|_ja23Zw#hYzdqvEE2%4D)b6Ly0fc76t z&RW?xv(Ga}UYlIa&AVM$E{!c*Rl#KaDsIs6a~sNnRD!sw@+q?H4KHakg}+@UFjMfw zM~#`J?q$97?AvW{Rd1e6qecQ1FlsQ?>Y}e^R?gSbc70~tQnFArYlEIzEh$@dpYe+y ze{?~{mp!j~K4z!)Z>gG}Th*B$zMlWQc{u)4R8%`Yr=-;0ba6`)d5$(^gFkhHOtR`A zqnk)Nh*1CJdUVNYzlVRkPw0ONKZ%*lktME75o=l*C8vnJihOYkz$u`{_#XxS$C&N> z52#>A4B3{SByl=n${+F-^COxSWr+x*hYX)>9fL~SpKW0tU^v8HVB0V|{ewA2*_qBV zZWpk9e;4TzyQ=+Vxh?yHi9#vlY!KQ}yEwyIIDITII;)Ps0(i0GS(CV9{07 zjv79^M^#KS#5G?j`KcSBFDs*|`8bF4UGa?)T3#(H&KNmNgub(RI=x8f?@MJ`_=QfV zI8)ILyBmuHwUe8km&~oatwTyxreaJ-TB^TO&Lm&gM5QNC_9?oe)wGk6x4tWxa|G|5 zTG$p$zUxcjwKhYOM{!=0KzpdxAiy{RrtK8)|^>s9EP`;Den+q2Tkwx5##TQ5$i0Ufl(J5F;q(Ay(7b6+yI`m6vC zvz;BD@~#4r-DZ{@^FfURtBqBzoXWOleH%{Nw6VcbEhmUGd&gMLch0_uLEsEfzU~P3 z9M|9BByS>U(-p#CBN0^>nKO{_@)~9X+zDP_1;Mc;ID0faD#ez42ig}ghjSTXtV;#H zLaq*-;8xzP&N1{k;+jf1eNZHm&64? zk2f{X6xm=AA`AYgSK_=F+z*z5?Bhxw7L$yBS|4vZQX-Skad7G3+&h@!tD5 zCS2k$e5XV%wy&hlu3T#Fp`JArN#r!Hp_uc49;6K}{LNUSnwzwM885pYW?^Z>fH%aM zMLct$4JUENw-J>5CTsIVs&$=Fe24l^RU5~hW;Ef2iFBQQTcVh8NsD) zFB<8P59Hv}+m@Dp=z4FGQ99d%;wb9Y##*+SHlv1CaGCy>*)MSkBSQCi(=BF)67inQ zjufADNCg(*uN%ZTkmIB0VJGuW3Zz(2p%Zfey<5!5k44ea>k0eO)#QZGa^xN5_nLC# zEd8ThA##PCQs0FNO5=1|bY|IGLV|RWsf^=DO8MtJ5c!)bNSF#gp?ie9gby)(uCam- zvcB0B!OsD|x^DO&BUqaclb93vJlKl4mwpg>!79tGf`-^G+mfIT&ghVQsFm~7>lSnl zcsx8c7aUn@g8qiAG@E$$pk;U*uM-+gyUinb4|8tv*t|3GCwP3`fsnDhM&3@ZM&5f~ zyIm2K%B!y7frkZe)e)dh;DRNB6e5gz7Tm!P&;AZ(<5BSwK^3+=m_k0Tj|_gf)l}W!N2&IyzD?V)-yb{ z7Rjl)0oS#TfhH}T;s;c#da|^@Vfp>IPuxk;kwM3}MWV@`zrl(8hjvBa z36x(I4tUg_RE`6ztM($ZfpO-I<+Yrj21(Xvz*=)Mjsif64?%^%d+7+z>s*82%J5VX z#;JVHIoLKuq2%;6dB8G`wDwZ@0uHNkNv4!jV@!*i2aM6kf|dY;ywbCY8z^E8Pc6rT z4HlVO_6u=~q%*IWdq(6MrllU?7qLP%pTXJepa3sS$%$XR7(E0KEB(;% z+&j7zLMw2A;G1AN7|K~mOaar1Z}6vsfb@BNwdfq>po>|skABbUEPod} zODxkeix2aZ>eABm@LHjIpfv62nUqOc@U21~KtUchCabCL4v0C($6*gxF8 zq9v*XUwz4MRYSw4T74FP!1>(uv)J-piA>4gF&j=7)=>p-0!3Jvd zj91RZMse-sp=blCNXkLovet-qB0cfXgddRAn{YuGe8Q)LZ-TeGFtG2?YwLP62Lc5h zioe9I03wSPwUnKd2!-6tdeISqdwi~NBLDFwpW*Yb@`3U5!?(2(ED9ZMeG>T}Tr04V zhpL@{DN>bEQnpomLSC6^EBqmax4sgDi!(!S^81CsKJmB}VdavI4q}h3pCIXoh1eq- zuEOI~N=F*jmOc=>Y4MCfVX8{G6(_pn6`=s%R#M|LAFCBMxa>fOok#0m$OyEI$d`rG zRB}Qj+RENio@k%RJtI+YPrqZU2jQe9LId#@dC$7{*lO{0mnh^J@zQ2G+=nfM0;{KF zCsRLL*5(csSXUqg%Tvzi4;M*eoHch!=WNs{Z;{Tdfn-CJHmA{IE&cBD>w;2tHgB+U zu;>?6Vft8N%-?TxFAGSa>#|9IHosEy%5QHhREVe#*HEMoW0I4#sDwpXv6e^!X7ao& z?vyOb`wEmAm%mPbf)<_pRXd8Fv012cVkkE{%A=T%)+9@k+0jmZ!Ys~{6%u|q*9=yg zcCt;BFyk!te|dy1pA(r(Qg?H9Zl0(30C)u6mpKBb*7%6yxMfb81x(O&#Z|l>`~!}u zpu>mCd-V5VLGD|vFC3V3TP1})NB7BZKzjpqQU^$}W`U>xDs)OATA&!Knb;@Dhs!mB zf;;6Ny7z*axlGMwVntHEvYNj%I!g8qUlN!j*?`%t886hMYn=-CpO65n5G(_Z=FT*9 z%FmNe=p1Clxs%mG$+@Hvid*6-QJ-Y)!cBqBVhO=tGfHp|KjFmUC!)WsNa!=f8`y7H ztkaV9+Dc7x&MnnjRdnKUg@b%&)S#3rT@mm`^smU^b$z(BbdD2*-@;)l6^bFh06^bw zu_GsFohll0v?_{TlE{-cYL-XAlFy0*0VhO-(j2cN#6!_MCm84Qk63l0o~VWTswF1t zdEw@UN4dUf>9ytgHCvZfUMyO&X-~zQk^{bFx*H^g`vFxIMPheQwuydY*$UzRDLM!D zI<~hBSHHHW?x_{qb{gAuvTYlKJu};i%{FOj8>wyEwoc72-`}vVnRTt_z2E!!rXYyK zD}tGhjA;WqSi5SxmpE}a1%JC4yu{R%?U*1wTGT8TaRTnt=SYU!$62PxGwpixw}8>2 zS%Z57GwHqkX~N0XH+r{<78Y#m{4Fj>6}34^)<)Mf`N;eNUe(Q)pLLHneNlGWPtXl_ zehSwti;`WSyDqsbkEt%{$&~LbDDGIQ$Vv5Xxvl(PbVS1+<<)?hD^lK9}F$HvDf$S>JRJE06kC_ZQs}@Y)iH+PQBr&=9Nr zSIr(|jG$p@sJWKr+jGk#u3~iN8yDu&T36`@QzVT)bP-WE>f$sv0zR1~YRvtj{wU_* z;H`;99tg^ov^N}~{_KgWcc=>JSYPXu@83Gg{3Ru^vCw!fYGv(e{rZ3>rpMYP?(g+6 z>NoTX1#1QX(4$t&^g*)Q&a<1$;48>%|^p zbT>6S9RRfk^JVOdJ=1zo@yO>+LoYDJ<+P;|tgv&{XF#iHFV`*w!)q3+T_>6)aEP5oXMs=Bwy$Z&h&3ZtDA4aka|ULi z$_$%cF7hWXr=u5X4ZYmF0m<~8SGNI~;TmV!pn7U|N&8lHkY-(d(oj+TVR?@pDw@*o zr(K*7%2BYkH{m_YJLmfhD>MO#h$+`P4AmQ;TkBsAP8 znzQ73ojzk~x2xrMTvQv?goWN}>^C_1W?Ii^@42or&Qx!+7iiX^XAYjDO~KvYn9j&1 z?(5BC$th;@K~6h8OMZxVh&6-KA{@_oU(hQS@IS^rm)VJ(dU37S{c62op4<;W}O3B zE7{)FOq(lZ8Iu^DvJh!4+fP1?w2?bJN6nuuIIQ>@b6WfinC^qf$zZ_{9XHJXtYHu_ z)s&8xlo0r|{toRC+#<Ph`zxEKIyV$aOUoF)i;dhRZsE5 zj7>YA)TwvYNvIU}{&T3mxYK9pH+eU<}oXPO!oI|?4?CwiZkd{O)D*jSOcg0uX6 zHGaU{V!{{n(bTI*nO)9;PO7r?*>ES|lg8ehaU8VPJNmYOVw8Aql{9GBI|9oGHojcW zt2(%LV)IYjy5+ak{}Kn5S_G3R*SiyNc8vViSJ}OsQ4NIXdj21?)w@>`ua$0vxa)A$ z%li2)L}K%7K{q8HJ0_Y-pUD3#?q}W{7RaV?j%54Gr}M8z?NH7Zhk1E}Jo%h0bJ;T( z@_{DKSr)Hp9#6!{NAC*e@_hNW!gGRIHId>KqM2De(&dtXs6zP*nZaue04YN@wKMjK zI7@%A2E~+ywH%S85HawQq{-Z00#8|Tb-E}_UY_|-!c@SKw`BK~M?CKRwLwTHgybTb!iY#~uX)`0lS z;hvY&O||!}d*~OebHQ)S@8$^BdrqpcqT&kgq#nwcCsb+MBaTX>>RL~$d=r|t79o{( zeD4`a>1cy3*JuZukAb#~?+x!+UTl2b?26Fg3@s>qjo_p)B0?*Eq?_TXlt*GK)|@BG z24cH&$ou=ASr$=WcZUNshFd$1sbcjtYs!~!OY3{n;|0-{wuo#o-B9Ssl-*FDT~kB2 zyEdllJlSQ%AG3v;K9H}xNXL2wjBl(_9gXEdoMX+)(;o2;)-^>;5RWs(dDh5`nnNpe zQax^L$M79VTwwerdq){PO!*w7U0}p02ARvt*vfuRPwEq3h`&E<12kD2><+>Ma`)v7 z@pQVn-B$dE*<-jZdCu;UKak$zHqonPuldcTn-#N#n^KFFIPsgXa^SIy>@I-TD*Xq; z1eXMFT5kzIh!*NEi${qgWw#`YBn32Bnk|)=j+8BvZB4nZuvPpo>|fC$>kPut)sd%K*Acwp7DD zW~DZTa=k6Snh>7BbV%II|7;8)?;kcpEGxPw&eF|D&XC4xfY4C606XGdpuCAZU9z6F zwzZ-W&#`MRQj@uw#{Y?~@&44A$x{R?tP_ipL>d#4^j>1tKMox)yQ{Tv&sGvK=Ot5_ zm-`kq>}Kb5Ct^D|+dC$T{CGhvT_isLO`~(+9^vEK{-g%UDD&8mJ2H|!*gai2QXSH_ zj2X3}t0A7XbKni;%~{ZQNZ8M9?kXXE<`=X+EvyihG}4k5i;dP(A^oy3hF|U}ip`oi zozLO!nhVxLu!8VNwHL<7r};PGm9$<08@|hg@~^6#I7mXP3g&MN+KG%6hq`=24$DJ3 zet;>oeU?iglko!H2lldl@csiIa{q@Pgu?hX`JvD>*wqq=N6t;#?=Gjw(Ic z-z#1CI`e>1DYy^qQJxjKaDM;+Vk+(iuv)SuuMLco&5qvzevsD&WkVO0KCX-4C&16P zbMg>Hj7chAJDh`>752(Z?p#H$@&In8G6o3G`=9a`us^;WxB}(}IfIYD&#qpuEi~A= zUfPDF)8wh>KQ-x!5y)U}mEtLq8TVBAMD-!?EjUNj;2I8zRqieO zB-tje!6bQUv?y0eF$13+F7wm}R2yaAw6Ak6%0Fn9$LW>R)zyIq01EocH358#sG9$Z z;~IyXsKhTDf)yVm#=0byQM%abQuRh=WBQ#_D)%y+j*C}R>MVi%%JUje*G!Owu54zB z_+3-=!D7eum5L(qk(Rs6FA`JEq+`tHgvi~YL&nG*5C_K3Jt8--xKV&ILc`mc1j*^ zJ*7E8n}%-E_%LF{JJf@$YT9hI7e`t47u&^Km2m+p75rE{6&o#P`JG2E$n2c1qKB0B zmKWH5ULLXrE9UPPT|r+7?Ws|yMTC@Pp^@Sb85ziLsXTfYa!x+qZyR!0@x*x~auc|1 zeuKP|@l;EZ9=VV30Fo=ePGKP974l*B=BCm){iy1I@@_O;wF4OR>r!0?F=tm~3M4T7 zQ01x+c(-bvs!8w!eyGxro8ir>>e7X9lPWTu4fm<+qr>4nstJCL@L%||bF!)izGrfS z=jm&QNwtr<&w>c(kj|0x0_xOymaw3DjZfNpXq`GN>M8Ubi}e%2nP`YJ9zKQG8DVIC z9S150|JFM5o50H!6Db?qYC2GS2i$FVn}&fe^mC#%K>phBVN=s4b&RtV&P9U_KfuDa z+29p0zGWeQ3OKiM2k|`ct^VI)8aUocNSg;{npQ=z!2$hCzal6|`;W5$dX3o_+JHm7 zYLEqN>$=VB0`%?6h&X`Qvaom(AZ*a5UIh+V-$sRk-lkN)Q1G(O=-di*VRx}*bzL<= zS$XXQ0+B_vtR^SdoHCcw-1E;He>3fqjvG2SiQ$p@P=1qll=g{uv4cUgUY>!zv96_- zO7~cD=xXLM^GN2}nk3^6_Pu|9atAyIC;QFnl9lom%*Q^x{ z>Jl`Wv8wDB)mYEXtTr0k$38Q-sK1%D{;JpOh8UT*R|#*SK$H8 z>V`VnDD|>BO~qxb)f$x3g>E)IO)#M&4LxCYNVTroyG->~Gt%*$svqr#VC~4xnL@J0 zq3toXS3RfY-wH7{y5VU~4!W@RKtc(^H!lktt-5ch^)689wG^lSsq(NQSztS*#+|*d zHGnXlaG=?q^r9r9@qg5-8Qi+VjJq-Gtt`%*AkaLX54yiFtP)4tt`+v2`%E^+i%@5cQ zSnZAPxMcjn`d7U7#kkt5g8KAJmd&E{m{OBf;ua(@kY$b@QMzIx;-i!NG=rI*t2<~-T`n178Kig7_@`b1@dN0BxY=(pdkWQzCWnqI8aL$4m*P;?-o4G2RNRePb1 z#TajOuXU@5F{fKZg*L_<6PWgoo@;1W>^Jv_jBzDKHcSgg(ZeGPvTApzh1wGf52~{wL;Y6YHR!{-D|7Y9aN5D z`S(V!EQIzh4QEm5n)Wr^gW1(BEBS_mKaCn8FZ@Vdju`Rtw@i|5bj2IaDQ4P!)$Rn0 z%&pyk(2p>^E7_AwIk(@e&MFOiayt7{ShF}u0(SM ze8~*!8X-S~?`mf$(o5F1tXG`QvNWDj<|at$E-BxJLzbJsGQV)+6_DXNq`M0x*{#&f zfE^eoJFcoS@X>9Vs{E4D<_1+nR&2v2)y#yD+Qaa#aGLoN{L3%O@Jcn_^{#HVYJuGw zHBaToV7I@}4&eT4rD(lM<}|I+h_Xi3pHTP2f44rtE`=wXM`QE+QVjMe$Mw(fOL?EY zGxh?R#c*x+Fz>@{YFT4CRD8AZy^)@Iw0^SwUi>kux2`&TmZ?hf$}d!}R$JX{GXX&;%fJ;v+_l`$fk(ulqjfL_e!mL$wqyuHX%N-~Wa>w*j>3+#Wy_L-M(frN{970e{i?{6yyLP4sjM_?X`IYH$GvB%>{9ZKj-B$RXy=w?3Mh!x04lX!5^D<3 z?VM+H1W($++6?F&?#@6J*ibrQ$rSKp&e(1~_$KL7y9JsSJ-Jy8r3Z=Y>Ck{zvn3Cn z;;c91!>H{!O+Wk|*WXXU6eTbFW?^yJ@4Lk4g{1p!O=wQk&!!gSL6Er4gc!WGm?0#| zd8d9UGS+UIX0GZaPO@}`!K37QZ;oD-{iJh+PL_1F^{_TQ>TTm`jc*XG_L|zmYmey` zw%GZ;emYuWm#AKWz__xdbFBjnT^gPXjfncM(Ow@EB(DwCVqPar zx#~C0pLM+$-HxNqMyGEtBWy2!G5D2SU0vGZN&SM~sXjX#j!qW*VMoxY_~E`n=B=D$ z;bg8n`nIG(Nb}|^CP*J`71S`uh07oUiMq4tJ~@Fg2U|n4VTt)anbSG9aJC$8enqyK zFBATZt`g6X-1knFPf>VnURjB72l~&}?BtJZt$6ZP-S6Zq=7+(O# zEE~>I;7F8Q@B&1=M@WfK#fG?&)!5;_)`}!7u?|sVa4CwzU>iTyEG7?yk|*C9v)g*_KNcKdE)5 znhY)TgZ^funzuq5u3%Hn z)PBjZVdk2Nk(oS4eW%w-aiqFujW9oL)uisZ#Zk+yTV|AfTOtJXRr|U}GLPU-wY61D zrnodYq@QFQs?|nLk}ET_CDHFn&g2T>QAq)ZaMQCY!mXN_X);Xdam z%6@l@f_aE)w&J<_oW-t`LLi(n4BdJWbL~o(Im8Z!r(v9*rG%G7l z(OVk9O;zGklLUMqAndsK1!(J`k*|T=2lmw<2)(6%P>!VNV#xE5snTZZ9n~pn596H5 zS|VcqQQ=Z{^Q%?CVW4=TYO04q_8WfDZ>-v5ywL2A+ibY54ItL(cT2h`Qk`jdwqwy& z6rW=~&;+C;^Z4rVVNs$i^sI+KMne=!n<~?qrZ%P4lr}_aiV10TLE`h|bn6Vtcp7T@ zSRBp#Za9O!Z>5RdNcl~MLI=%F)vkfj>+m?gyWvSmY!v#NllZtD3sMNg!tk7(_1Cw->8 zZdq7V%4lyGmmI;tELTGZ1^W$R51cem{ikOczpdO_?;to+ZHwL#&BYsqhs9FTJ(8Q` zEiJl`B-1hXC4N^Va|OYlfixlFHXCY}&F>~~mJx5(jpcb!AY>nZJ$-`UgfNb2CgzLY za^@H8kR0M2OH|7C3)_P?4>zxFakB>-75-iGnV;FStUK9zIM-C$xdNV%f0`dC2qLJ2 z{|a9h%of{=hZ3hsE2JxfVflUeaW_w372w*jfnFA@pqV`0QCLg@u}w`G#g=|`ES&_?ShpbNuA+sPSZm20-tJmTz8 zpUj)iFTG=V}dS7Q_)#&v5ID7Rx6jpsv9zfQ?}F=0p+w;mNo2`%n;MPnn?Bz z~)TIsUB>#O zM4E5*eBd*4SIl$pH&+ti1;+{-oL8z2%6#ivB~8RcO_mf-{!iv83#XYFX>xm}O~qG* zEqh;kEzV^SN*Ol~K=Sn9^7RRqe4 zg$bEo<*UV^G44u7X`25N;D)@``8{+9m|B~}-y#wWC#Y}4&Ej{W1(GE+rMO7CqFgT7 zD%+eXkVVNaEWRy&p&adhN_iD1a+w5v0FPSdbBBOu$SwX{ut4-)Km)s}BH>~1eA#Ak zDl|UhtaLP#wU{fr4|VwWD!xPixj2K-aG}M4W3Ne7z2G*ge~2dYeyQb@0f891Uiw!w z2Mfw55Whv+7TZZbBY*v2MFdjq5)SmMHk->?XDxurol|HQ2#dLAO!nlT{BpzcQo3-S z-Yxxsc#3v;^b@JK#>t;4Z^bMw>3|dR*mQt-uvr4vu}d1)3x+s1>y2bKPf+Vy@?`jo z&ZToiWkyzXr=&qY%D+TDU88gJT_Krf)cX6%*60?v5S4UnxAr~4E>|m2B&_New-O1!R}vs3k+ikQ7pbP% zrJP0d%xw`5kYn6o127sO9CT!%=VWo3@6dU|4#i67IhoGU!Bc1x@h9Lo#=62@7-bVv zDDX{Qbi|-4T^Q>Fs9s8}j%$#u3Lo_!0LQo}Zv{59j{NtqGCu|H=Ku;F$d*h<@K5(#Z(|E|G459uq%0n zavc~M{sveJ9`_-FcOZ&W6zl;{L1#(!pgof7Qa)PG93h*B7F4g4oj^Y4yU4qcwxnTB z4@nMRr97ni?vo2HP_1&Rfh?+01TR(?vn4K)I72g|MDj)7R6SL?L&wPLlJ#q&lH%oi zHUEYKitpGib!6+U)&?ksjHx0kW98VS2anlncMQbq?e5?iTC6a z^iAQhib`#RPn`0N8gOa=m!KpSOSrx5oj6F;+VYrA5SKL-R(VRC>w(;BQg>@#;(&}} zIubrjepCO<$3>~t{BjxqGck9i+;E_r&U>tXT6KoJO&^4JFMFf2lJr?8wfAWwr|tDY_V*V7R@C;{w;uzH2N{IF&seLFWQGm(puow2Ks zWwNN?4#Xh8;u($9Dw`d$kaZwKHV$!+b+fIiA950*Q*}%+yCg}~s2Iw)p<*f7u|+Bt z;2SJZ$$&qe$*Sex0|%|@Ep%F%40pnxSa;xBl@0zU%v0GH?}f8e6EfKFV)#>RAe;-o z3#P+r__Jpbd@TYhL0hWCGMcWI*0ijG+CzN=Yk5;(xMk2!SEw}88{5n#TdX{+M(b@ z&@7FYXAQI*GdcW%%aPaOfK%oLF%{q-#X5MN2C2baYJ>v4P{N;%_?3cyHkZv0;St+*Enim7U0D}|$5Ccl?~^81Jhm7pNAohxPV|Okk#QXhjNE7l=eGK5 zb;kua+=hDtC1ksQG>a9EoG+F?G!?nXd~KNd&op(h*5n>G=5ekk&(#0s+eQMq^+K~h zqNPd}xW#KCWe@EbYJcTXPNeBQ7bP_spYlhP8w@7|aBir+TQnhQnT{)785yBXmy-Os z8gF^H8$s=<47S^grGl|+jnPZOBR)4oORLMC>O*94IlVetxm{A4cCzB%h~Jv2%6a~k z>bZcQ8;C`NHTM5Q5vZQ^SicL*B9;yF4C~8i+85xv9B<77$R_c%`T7Q59;<2(lp_<#!|Mrz_Kel3rjV1CB~r@hPDVcGN@bYpNve^ zTywji+JSws-=Wf>-sHQT{$)!lpS6##d{WTf@(dT3_NJ+qxG#2Ig9DWoLa8+{Grdd9 z&$uaV-zhnfmLwgDitYo&v5Zw!Wn&*>0q%CVWO}iQMxvrG?B7|YN!S(c3 zn@R+&&K3H%l5`uhcDG^?sj1bK>Q!;MIfkB@zr8V#sY;8k`_8@^v&FiEmmX4VP87WK z?lrs+uW=sGt&t7dj?nZgH;~3O&u4G12y4vX=H}0?FXMepJyRPk*cwB!Ob}T^0*qHA zI`38b0a=IhZEd~cx-C(?30y!FHkOD2%Qw_76{qEO)b5wyQcEq{q>30PQ=e=@$W%kU zVwCq9olZ$|8K>z29@=il9zzv`_w_Fo%gUqcGL#W{p;obSN9zB~QowWZLn9B^5d2p! z01Lf0Xid=nT-?;hp?$W$u`pObK8j`@TfhfeP3p^7HHMEoo1`%KniGVQ(s%m(XUXC2p-g4 z!J@raYW_hRTxb}G+_9seA&3+HN$p(or82H%x#?RjYpNk!swIlIxc@SblTC3{=r1TtHbI(?z_+qxU8nfZ^O`#fgf3~-tyYmB&anv=p9!B` zpD8W$kFfqL`{A*`ct^3;akuUwAhBuE*g#%o$(@DLPk9+_A7p#eoLj==Ke$Sj~ciOTTnDfamk3x1NJsQ-3utg7RW-G}uG@ zuzR(Wpq2jdrXSExk4pVF80X}mT?`+zb-`|^W|wYl_r(;s&sv^g6{&Zd!qB&|N9voAzeZ2&N_{D zUf5NOLjB7>$!NiTdx&(~uvtz-jTahZtHH(~^fhqhqax4lfSTWBE*1@Odetm2lj4W_ z$?BzxNY5$`vtH8PWkm9t*=~{3MD6_DUgKmxBu`eEO5fDrJ2zBv2{?0L%{_7n;7Tl^ zWiq=cpN8?w=ZvEqe7c!)p1(9=nJ`Ek(39jBBGe$0;+3fnS@i6YeCQce;#$yL=X z$!dB5VNiOpY$kPqd~#X@^Q@vO{0Z-_@`mSKNhqja7M~*>p7xw7xDRr4M@k*Qc3Ds* z2|P@zz}*JFm8Ow9p~b1I87+`CyoLK3`s8^@jKQ4#%UO2X56z~$gW72A`rj-GVlR7jo^8JDw*+FA#^ND>K~dgiVH=pVn)dbA_E24~e2I z)+DB!skSj3E}2hE&`(dfOIxcg4tL;))H=^YB09Qc$>Frt_6>~(v#qU88vBB*CRF^e zbXxsQN@CTF+R)-&0@-XyQB!{!&V_wvKh?hS91@MdUM%rUu*AwSg{iMF1I2HdBOCsMV zj}k@E_RvO=wlIg76N)BqK6Ct&4hhJ7G~_>tuh_$#sK}6~bsHv6TzSAB2<&pD4BNT$ur^=%AG>7av43fhLeTMJNtou zONZKo>`Rr;nmuZA@a6R{bI()kt%LD5nC_;WUSs;iWKuU&wevPIPUMUirg6r^K9bDfGXs<5zG7FGZ-7Of*MN}lRGIc4%1ioD z*&jNdHI6xl`Ir-5d5L4;8MDQFp5Se)UZfX`0v)9vWl^p(lx@m_`f+#>53lYe#qu9X zn<$@zCG_v~Euw=Jw^=JB!CBk6m!$h*{}Bes2?4JpkCgtd9*P5?Pwm?37jhr00{>F} zNk_e<=P4wY-dOMjSHR*`BHwG5P$ls+|FSVt19vHAl`=RasV+|1r`LWp$RJ zO|%iO)z?!?NSAf&vR$+)ZCa*1%T41RGn40`o)lmdf#^fmD%o>nwfTElUBepH<;oxR z|B9yJGHZP)hlyJ)u4RE#oXI|8HM7XDaPbK)sGAue624P^cBRWe^r#sw1v;8lWfkAs zLWOlTWz7;wI^kl2w)8xup|&%F#8_(HwAjdbZP*`>Aw;#?Tm>>$Y@>0UU|W$2$`sx$ zNUhePIPVrj-8hKroF81(UuXrt+;q(;Tp^Vjr&jkcaAa0LvZ;==Op13^KS(GQ864@d7AiLu`Aitux={yy<4USU(rhJzA%LnN3 zGH3Q$CM^4l_hlcIpD5(~ZCc%3p5E(8$4RCzbvge?}IRID$wPQa>FJY=|9km)B zV4bEPgty~JtWbDU!6D8KcwNdu{&skK#23*?_>?bCwg7(OoTCI)BQSSjh>k9OMLwy0 z$C^jW(uUO>WIWc?6a=!@t98knc-yfp5yypZ(C5BXDGQzHOjCSCLQyULO0B0fkEFKz zWMWhsv!o`1e#Uq>e>-c3VMcN?_nD3op%unzhI}g|x78z^l?o#ogHFdCYw48SAsU^kKf?60WAt*`x@>=0X=0KvAz~jB;cd zNb6K?sLHFX9i9U@=h}e@N+fKBCH7f#>? zl7~cO-ly_p@gc#c>?~=j2#9CMK1gap|5fajReO4%Vp}Ntr??qP4rjSzU7&XI-Am573cH9LBhIi3c(kmO*v2jdFeI!B0 z&a2HT$>b(k>@xo2^NgQk_XzLmFNb(Z#MYxM$JVX^m{13j9SA& zl~qB7EVLFsIc)*Dgghqt0=kdx7dRXJz^)&*yygfB?TFZAsZg*NZm3#Fp9G)8C0DOk zjU{pmZm1F{%ThO~)buaWO{!aLQQ!n5jc@B7ggg>2use!&%ggvDfxVNppp<6sAVPrw`aw5ZNKSJfxoXTJckDChDnDZH6)sq++f*;gt* zDM9Y`d@-eZB|rBzNGjm17+b+EkLNeDPTF6s~kB@9$Eo|{Q!Iwn#Y|fnWzwwLFp8weT7o` zRk0*Vx0~N;01I%-Ol*9s1i5H=vcO}*kS-H zUu3rH&*RR-ll4YspMK5$7 zgbSIAw4D^2_}SW#bZeNqhRgQ#xut%^`|XmYHi~E2+N!hUrPLY?i^!~oHG!1TMRDqf zwEhf}8f2ElZB+luaS8no+s3!^xrxz5(JlxUBW%!sl`umY8k!F`0k%Hd;oIOWmj|jOXto_)wFjO|l7J)#tk?~nf-dH7f<{6= z)7X$bJU!M4%7y(x-JmwO#^*fr3GQ_r0~_GmcHJsZ)fD1Sz)gLxf&pw%ug~WLKh+*- zi@}AMGIl&zggyuz3+_WJe6~Q*$V=Bb&^v@_cMRUDdP3|_dYJxKF;#ien3KNsH)UTCCn;HvXDrJGGCda zsaRr!@g0K@2^uVHQowt?53kvCn)Zh9nd4{8aw*HkMZHY%v2vs7C#|8d(`3ikk(pq$ zVZBN?uK&pmiS*PR=PwC3t?d-~crMZ?Bv+mM)Jl23jb)e?BUer~+~kff9A$9fEzQ`j zPZA_0Wa#3AA0l39gT;FTR%^nf%RQac$?`rYJSJ6cuz7@@2iH}I^%KST0;LX;02wLT zT~dAgJI#4nbHt$fzIxnLaPM3ew>Xep($y!^$HT{i7 z2(-noRCfY@h6jL$Kxu#m{R55nOhL1tu{7U716-^h6A%?gqOce{To5jYt=NQ zFuoF7iu@Z9gx*m-3CKl5RVO`TkVe&Er&~yXYJ+VnGHKXp8K_RxrRF1QSM95GIX0;M zC%y(fr~VW{Kz^#H1oR>0Se7TCx`!@v`mNf8ytExstwDSXZ+B@69kWaw? z9{35-1C2XLJ;5*Pr_yLXcxx4l<*G4lCZUPxSsYp zF}waeGcW3P?F#nIV1Xr4Mx zM@@XyzS1_yBD}0>B1K20;dRAF=^Yfu6bfeo<4c%SaFgflaZLJCGN#Wh?_^nTLsrqv zDnIN&*=yV`(d+8Dqy#cZ0H~LXUQ!*In&iE#$y{pKe155LxyL!lOBt&tD~nGw)ivgQ zr?{c)VkzyAu(e_$lR&Djxx$%JG?w&|cRhI#BT;xV^f+&XbfU*K@i)cBE@>LZF0ww% z2DtxIT`ef(?GhB0rV0ea)GE0stk9S6Q8FjVOxrA*6{_M~R^)ix6*~ZDJGLbKk^Hpa zGH}upFq+#X>*UWbx-VxF*cB8-MgfSAQAQ=rpjH4ep^5BEAj9L4hye|?d&Iw0NzC(7 z*Q>~oEIU?J$crktri#a}C|j-y%Kue!LKT#_of4{w3Z2FJp(^lrEw?2%`Gz^(0 zC*$=8!GX-hx)a>``~}(z_^GA-n%ntUb+h_qqKF)aeGU1Km4N>8cr8pv{He z7@nx8I|}?xZ?WFzPR(6y8I4<7{KMp#Z(G%F$V~JifjUCSb>>=4wZ}WbT`Z%;ElS*J zZ|F%F(H03HX(`PN&ZZpgFbRe)`cpSL?^ES5OG4rp;x!{PWH&QN$ME2x~G9WW208P1?*}l_Q}0^New|?DxWkpkW3{^4g6oD^UzKjL*Hu znx=t^0@$x*!ZIoMIO9dt1^z(gMFLZ3%-%}P5S!v=ve?qqLDTq8731BMQVa*>L7)|i(;$je_=x4Vcs-&yIYUMUNz4;HFc(L zB04sUsHKV7`E{C2w8)Y(>d)mHt5Vd_SuVs0m?hSUJ_&skxQ<(f2D_~mcOz;`c=DuL z6Oxh9Xq_fHmHWjkr*1B$8n2f}R?arWX6_-()UA%WM@!ev4(#F_Qght4iv7^t=B0^> z))v))bkF8gQFhLjhI7=kqKvxivR4)MmRp%xe2R$@v!1$2{~{3JWNY)>_KI#`d(3-D zRk=hJk8+}LyKoo1uxttiVvVe#mEPrC$6v{C=0B&fqwkCTnKAy(vTHn*^L}7RQfho% z^Q|lZouAr3Z%e1KoT&BbT5b=sB3dHM=a%}9l-3BhIe$=g%1nmB ziVuXz;PRRR(se#aSV`?8)l;T3XeBxH73`R_A8a)*B-)AJEiCbSC7CEW>9SDKrD)e3 zEX`w_1$--K4*O4L)a>V+BPxg>?@Td{DivHwOJ!~n{fOGkbCbsS9TdHiA8?72?*Slf zY0-S4Nb$JLTeN}mtjbgTh`_){NT(OAB4e`j)E$gD^0ufd&V9u%zZJqafWZYX`vrw) zJn{>azvS17*8(E;ukw$;b$mxnIv7y+jd&AmNKL10g#H(`fPDzk`!xz@!i!v#vNCu` z9g_1^ohAESXjYG6N0m*+8gU=12C$ihB!UR-PPs$XqXCg`Sm%+8eg;7WB5_DI!XXc3R|G)-?5bKbU_Q!(95M1k?}x zl!-Qel3vRbH2ASxi<9eS*ZivRwcIIa#+8^hr9_ZV8R{YxOo5K)SHsWK#Jg;iPQYx@ z1x#!1A;~s2yYLU=Etgl8P`#R8Th)|5MR*qfCy6XsOlb{|lHFr6yw@r(^42>lp>GnU zia^DejS%zcJ1QIK_gD*X&Q)hQjl_LN;b)nc8)%Q@~84H^BVnjZa?QV>ue&9|C{?LY*367I(m1=|B-BT`~@6R zm_R*lGTk6JNc3i|pmtCq*~coU(2Kb*bAGZ01hW%9@;pVjFro0VFOcu%t*!d4;E}iD+mutvlgWw7zU%?IJrI>Je1^cA(3gAzxZWF8h58)^aanb>5(86WZsrOD;s# z%54g_)TMK-mcFt6CjP0KVo569i;p$ovWm#74Tkt}j4IuMP#iZ@JIb3Vid8RmIxC-x z8l^1Z*u4L-K8Q++JP8ZMr^`siSENN%8#Cf%?+J@yHYqkzhJw}uZOk^066i4RzC8(< zA!!$1=guu1VxHq&sm#Rt2zqKB7B3J9iJJ6n5&|_LrdS3s{erZL1Kb=B7MLhJWj_Sp zly!@AOg;`}G_f0q3|tU*Ev2|9j(>rkkv>HzdMccU-xuPZMGUJ+*i*FEZFPr;84TLBzA zl~;gcLKi7Vh+Xi!%43wBaBx1EejkoaxySa0OQPkxtuPw6OH=|6d9=&i;NK3nl^0ZD z+zr+3nkSSX{8x>oGL9UlewX*2)~F6lk+G&@>S%lJ3G`W@Mc9m%dGtw*$T5ds$|@v) z8(!sPUPV5JTV>i;ag{XNNY1lT_4->WK1^pFF6uw-2+j9Es^FWt*TX8EgC#r8QjS3W zvMwsl@hRbmWld9Gy4nW=n=LkR8n{vgkNR`gq>-vA}y=PRLSGu>K znaoU*NiP#m9LFUtaol_F6w|@<-b}BetM`T^1PBB|1r^jKKnR5BAbJO5gAFdY;NE+S zz2C>qIXUxx-~U?1&X@DSUh7&b`F8E!vo~<>=id9-M&PG>u>eo{Tc$BSCToGOSGYBN zSHMMIE+RODGX7zPe3@m&5ZiG+T`gNb9!ZM!yBE{supDZlFX`yeK zElHFoeHyYcS(DuDHIq`3LUgiCW2IRgkVD;L|K4^#YdGtRwU3ZLB7XR#0Zm2OEj)ug zjzLH7j9-zlEI1@FG1J;>b#h6Tr=vNg6CQS8bNWXJ%(kJ-RAl|yd+=xIfBbR`CBZ~3 znuA@6wM3y~KSF;U)DcfZ^E`Elm(fogZDIQ{j{ApGO&G&Aa)u{%&Dt6G-?1&fTt=S3 zxh}HBaB#;XXQFo#>w~t(-XiKf*CwEefevSqUJ~x@&rA^#gxhwc#}NY8wq+e4toh|3 zaxeb*q6Exbyd^Rf`k6d0a5P3vCwUCS`_k|Zw8ZDoZFSpVX3EZObJ7&#ooh9j3X;<= zcM-kBkVQ;%0|6gSCZ2LT=l6hk*YokA???;%RvbJ^attEv2_Pkff4=!ck|1hgl{4vN z{D~#uWUG|TKaG<+Gke0UaB)6nzYlSz16;vIsYAKZf1hIj6MK=?SScGEZk6*s*q zfcV$sZA-MosN?pmAyoh?+Tj zZT)nF(=}m%w@Vf;=^xG);Fje3HnxaUDc5!>Q2$8( zVACA5OXikU2QX!D!qRoPuaVal#N(4N2ZI!8GpPe!#Tg0di<}Q;4re4;x5F1@T6XP6 zVByO*K0`i0RIIW=6HvBGJ+RBsR~MAy%vfaLgOommwdcLGT;#`2=8WY?qqR$>4&}G= z8hkVQyN#oW6X;8;f>0Dp|55}d1Y5b_0&W2g9~cGuD~{z!PyGnj;}o5C1lMi-Lq;0T zxU(l~91^?aBTyztD-@-4ka(rOGZ%KI+zULBHE5*s_)6^Prsntk2 zoOEPoapo@4;*I(6Ux~S^b|Zf#ez{bDK0shC+<-km_|lib+~F4H_JmRBNwA;G_`tVi z-|6h&pq1NF=&G=z>o(ACMOl`MXb0kF7M-Bhrg+T@r5?(h^hu$;@ILPLFIt^H!On^1 zA8fO45A}Tbnr&ZEeWUEweM31OSGv5F5|zC0=gpKK)6UPkNxlnLdGpBQLH4dY$tOZH z4hqS2hpYFh$(hmLZmlFQj}xxFM!J&ZyL_BfpStB|0;w|7_NQo43)0DJjBxsJrAsF9 zrzj8GQ^c*YAMIUC+!TLes~d57(#YCY;;NJz%g++`W-R@=g_sH_{4`3eMfG@njr%q3 zb7u=qm$1xsJMLwY)1G4ddKhu*Kk;Fy=hh1F@{Ew>SMU$AZvA|h5Q@y7|104bW{zhF zx)T=Q{1b+ea?Pd+J0}gfXEhd`@vki{*i)H9Yw0*=xN7-*+!&I%cpg3-ojyN}FbBKS zqYGJ`iEt`J)n(yr4xmx+^xcz~&k#vlP?%yQX>B}q1Iqa8$JhzJu8SUrvJ#sC2!g?IF46}MS6?GOv+_DeN!rWWC1LKZ`|N0^JOWYTWld%9-H2)m# z1^z?#vry;Ze8)lfBjOxu3336Ub$1H#Cc$@$7pjafcWn$Bjeqj%FPOvlD~lOeEPi;w z$2cBd?{cExg=?9e1BdJ}wm&8RYu}%C?9QbG$~TIaod@%tdDS0u&%Nn~*@tIW28C?LGzi$9vE2jME`?{c054A`=AR)x&lJI?wwoV@KC<4V-L4PR$x$6i>8ps!Cn3*C}^ zGv)EZ0LtmiwexmTK0)qrf-}Dk8@0K{Ku5^;uFtNF&fSKh>*K`h`)JvTXIDm2lT&P$ zR#M{9+ZL+H#c=0&m82&qt>Y9uIC|K|gZ@?AqCFKfR018Ef$HRs*UKoaDfKG@$>-A< zOGn6avcebMAYqXEfBK5_75awbe#-5{9_wz(-DK{beUy@vq^+IgM`^+9)5zO1U@H%k zva{q%?-1`IrWP$Dve2LW6h?Hxe(2Cd8ci#(b|NoKKec;?{MXE%p<^t}EYx}@;zRho zmHxy;Byrg{gvaPPivkF37~xNH=tjcZ4o<`m5NoY26N?e|c5{i9Nby#0Vlc{g{c6HB z^oEr-1SV$Tvblr}*zXsS2|r+;{xn5cg{!fDjz?n^R>cH&?8)6;1QGVq*7bx0?9=s2 z2w&pXt@OnANKl$gUpMCztmtTGT&9~qE>-#zX{$cKq^M0DYVBw;l7cW`5 z?3d-gu2{Kh^_sQo)^FIjY4et?+qUo6xoh{Hz5Dhbu(GzXJ!og|;OOM+;_7zD-NVz% z+sD_>KOitDI3zSI{BT5MRCG*iTzo=eQZg(hH7z|OGYgJDqR<#D4o@JG$P_A#o(gy2ey%uB&foY-(<4ZL_p@ zbar+3^!D`+3=R#Cj2;;~dTe~+_=(A>lc!FfnLc~&{Dql|mo8tqdhPm+o40P?xqI*a zgNKhEKY9A>`EM^?f)D=km%sk?!w>%kW$=%WKKl6MPoNw={p_>Pp(wum>Z`AzG`{@~ z%H#VvP$ECfg))Icfl`5DfpUR@d6mrTXnxP;{|e`IHc&K9&aQ6m9$r4a{(-@v;So_W zaf!((>6r*LmO!FrGue3@ZgGh~B$k#bRBElhywYH-h6ee1jQ`gVe;?!PLB1L#G)!om z&_JP)LPLeddhrr8+ACL~@m{|Hjri8>+jpQr-@AYR0W|JMj~_pI@)R2T^WT1Z@#5wC z@dM@d4M1k=@IvAodROk0dP(I(o>IFNjVS$;J&K5`PE~TPMFnqcRuS476twQzGTK13 zgf?0!qEG1f%+rcu?xjD=dxzgMe4oSn9R71Hy`K;7=fnH?@c;gPdA}~+uZ#b8UD!Ch zkUE9lQ#htv(m0T&w9ecSjkls#9cJj##+%yp84WEuOlyOd)K#md^&6G6QJsu7A%|`v z_!lmXVLKq_pFI7NFV+JqyS|aWMG4 z);j5G)qdP`-5&Nt^8vv~hl9MmC9tyAoKRm;1-ED*2ZfH(SE?Zo@>HaedU#I0Ehdz(>ZNakrYcWL+89h#wu> zSWwsDsMgkp*2+z=CaDqCR%#%1@GHn&T*xC2@?h#H{WL9g@XrD?n}2uE@AiLU-Wq+k zbA8J6@l~j<(al^#yNgC%ci1d8r8bGG(XE0ilBKwk+`)l7*yWUNhMw9>)6@F?EI_+y z15oaB1cvRtPn*|=Umji^J9>5ru6|@|v8vr&Q`!(^;+xVMdDWPfVk4=ou!>^IGf+Bm zDk+`W71S$5pwEgNdJ+aui=gPvk>NCs8 z(vkf|#od1Lg0?t)UQ>oKw;ofQYbMpPYRL@@6Qzk>Lv5y3(^|;Y^wvKMs9d`N)c?Bo z%JBTXgO`4EH{V*6s5rBVR6J(G$r}g|vAW_F%=Qc|qZM6FYrz@FP53HO6VXU$Bvs=Y z$Tipos_D-Hj4L+W?Vh*s$ocPfG~NHvTYYO;BJbR09Q%X=i#{5}r4Ggm$bIP&LJzzQ z+l5k~J26UBCsu{%z^mcyL`_yZN&9Dc)-rGT#OW^JusM=;-4=$s=!rm`3&Ulejv=R>Orj-Erer6cNN2{M$YRA!AaY_SknEUo zG&_16oBL-0W!qN(vF$z}a`Sp7af`fNb|_;;?m?ZB1r&`+BIUgzn4wFEGPMgy^{xEu zmL@K(949;auDo~nJ-hcgywBl3*U6AwCr+&F5@(s(OY!xsB6>?xNp?qlA+x78 zH)o)lkvCFBEjm^~k{nkNq~q_(YX=GRd$ZKV^O?*!;*P>4{i52Hd{X6AIHm}Z_Ls$$ zcgfOg+NGHKRtcr0QAF>k<7M}n3YbGxZ1&NL?4lDYifBqokxaZRe>jMpJ)f63Mch$2 zrC-vxkWOhmIAfXs$$&CS*R6n6cPNl`t#V>>qm0&3C!+OL^Rh<_h3s)1r+7-j5S|ib zi%+~OplsU;AhFp8Bu<{s<&KB%svXlV>6}QX%iZ#i>3vHFwc(l`Z9-M2HnX-(i*0IB zliTa$)V^vdeMB$J880g;oZ{yTPZhCCPrNHY{@)Ic9?umHhwp0aQ!kf05Y8B!^TrKc z!eK+Os?QKp*=g}TJf17< z!td$qQm$0m;isz|*b}Bh{Lxx}`Cwh7uD>~@!cvc_H5>756;R!)R8xjUa@w&%3Ht%>|VJo?5fcgch-E6HQDG=e6-a^Jlb_w-qi*xZ>U3< z4UmJToYEsvlZT2Glrgq6`#4R)nWRaDC*Bnx-?{=wt@nX4JNMr-HevTGtdp;qtT5-B ztg}zGI~1Jg_bln}4wpAICmD>j@Oo_(-Xez_1kfHtfs#DRD5D)C$=DM_Sc+%soeAEkfE>gXN zc4>4k;^^dFM$5n~jUiodHjqw?*C<*p_(e)Mj|k#2$8apSwiWcDP(z53A*ykWD-zp%tqC+jF7X zpZTixFQ@eo^^9JeE~oEZ0jkX_KpEtq-{lOE&9DQ!7W?VoL+bxKHV|s)^`u%#9l4HVrq&Z`X$?42b|corY;E4~8PLNs8SNmZyOiV@jJt41`^ z-x*N8X2r|KrRy$?&0XDh<;VTCj~DwZZmdZzI=2hQI^oKsjfE7DhZ0H%{pqFHUbqz1 zgDOLGLthQ;!YML43CfHPk}AD}tWImEYTgx4vt;Rw{_htLUHo=c{i7dkRnL|M@NR8R zU|odnZ9n5d!cT@X(BlcY@UfJFjL{5k+6cTjWf;kW4WUbthp_ylLA)SwkSI(TAipyY zE&uxA$nNdM%iLkpJ5%KlZ&{(d286shEqtNW|I0`1CVzWZ21MTH;h%cKl=} zBkly88G9VbikU#?L{DJZQR8@aUyRG5CdpdYZF_ERLmQLR z)I#I7Hj{XkCW4@&5i99zKr6e=NPV~I9eD5Xdv5P@c%Q?6uAlew;eXkD5WV_2>E-}R z5BWWoxX0X-dc$X={?wDD5rt!dB*`ETuI=U$jGf%ZRXEC+bQpjp(&1JVVF*xlFRBl%tk>6{^Nd{`rszE(k)33$6J-<8HYz0CW2Ox3r zeNyHceOqxT^P6mlqavIjCp zpQlQvs5=^$^vk+K#A%%m`?xlQKdO$E4=B>~-DT+Nb_uz@MM!U}FJg6@@;L*QIlK`q zLpmlQmmL+5mBW0pYUpkG9|uQ!Q0CzCOywAPN9UAwrQ8*Nw$d|avLcW-RvslC(!n&n zT7;oPMKHHW$!#V(8LndMgk+*aNw} z_cOJ9#9h5(>Q#d??p*aD=2W#m_gMAe(vj*U#XvP&*P%z7>lB36%2H~#x`Z_#<#I*^ z9Klg8TXrm;r5Md;Du>^eKO7|Xc0gh0{akAoaj(KY<(kn6bH3I!`&69|XQCmDf3!JK z(pQ(EYcU{et2MY*t&H3)6EOw^{JasU4|yz)D?65xrx<1BDM#Lx|Br+6px1NV!Nd0r zcChOv2lPyX3-wH^SMF3tD0i$gQP|a(rme4r*H)BcS`{i{mqOrh*3 zohu*BE>w)XEkFi63o-O8q;_^dW$X2u-X{Ek(KhKuogMO0s}t#5j|bz_P&j+IH$l+W znxd^SXPGor=oYb_&{eFW_UFl2!webs2vsH>BMTIx6ux5QZ2__^kb~7$sJHkaP+NPx zsIUrqXtGYY)nuD>wbK!IVZ@U>c`TCNI}p!rXoqPk8nSB2YS7L6NfjU`1VfgDO|@ePGg?aivBc2djfJ$N0f53S|& zBXz=lgiid{fU?a$1IdA{K)K%rRPJ_rS+~>ge&?>ROGm6CCa0~^dQUk}%%eVBZBL|3 z(gxF)G$3jUA&2~GO3SNv{}kxGKcRxzg(=VLMwS;t@ZTCB-}Ez(?%xVDyRAU=cIT%p zTfMFg?(jQ#dT02+#l2aLlXls)4YY}x!bCx-`F3X%(|F!_t`k#S*<9blPa?7>BWn0G1E!%Ioy~^Kkb7PY9+-@BA zxHBtfG`J{xAYMf6Ntcm2kxE<#MuWECb;vfN9??oJ&uXDoX0&7*(wbRSY0Wur4bZGv z1gcl8yw~;fs);l6R(IT7e9-uGWsvN~mSpbv0~qF%JDqYYG>*rDv{ znqcm&U5Si~_6X9nHxWA(k&T>4U}qjp$xj>0C`=heaFa(+#figMUcxZGBz}mL(&t3988)<5;>m*&Uc zEKz}ztH5)wjg!V-gSrX~m8$Vd*jkp=U=j!5ypj!f~phEDaphI>WY z+X95!<^sO$YEXP=Kj3?~z7%=|KNR{W+z^ByXG)@Jr;1WI;{_<;NFG@}z-H-s8F_{- zT47BGnP+Y%2P*4babr#x{(sxfP{qX+@N`G{UP|Y7xe_0{piF&-GQmnhOxS2R@Q`#od(n!!L?M zDW`>T`4hY}!6+9aAK*}QJ-Inmovi%Yb{e) zq3vw|qOEg*0Lr1n<<+}?7a(;Dcr5dXy;bIubx9UPIwOwCJuXb9QWs_4+7DlKmVD1GH%y$0}|_W`l9GmyCi zJeD7dxvlWZxUBFePM3w}oRGxx#)KKt!4j;dmrFHta&l@dto+6nYEf$wLDBRTyor46E-F<0?AdhCdvHj(dUB!3iiF z{hq2_qV8%BrCrr|;m+#<7$-H6h2zR3(MVaAqF;>Hca>0US_@cBbvXqVV|Gbb1y$Os zC2RVmcul{MpzjtC$~)f%P`YI<5JJyF=&%=h@9qSY4t`HHPLX%@t|`|lJTVt4{phDF z!t*D}1tj$VkEH7VFs5^(uGNOtlYXx+au8Sshn&q$;DdTaD5+NeDI7d|H#f zFsEIaSJ*Ad5%dX}@_{0ndZ2)&>*dh&U2g*rzsdn}D7Awe4nlqRc0SL`?VBs8QNYp zL*M;2{Ex%IJO@-tyVsl|YOcuA8daDY zjg;6Z71AwyUT$|`QBhxBp?HABQ4cb5wS5e>zWZ(X!$EAj2PkYDfX>G2H-l~1qgwm; zJ5A8uSi2W$x;G4eq$4h;vjHZmGiGSYb*Snx1-?-rrCJI_IbCc)VK1XZ)K4u@4^RuW zeN>LF`)vT?&2xe1z#6D8XE#t;+kaOgQ(8y z#;8hqkt#(WN~Y_@lbKA1Y*^Ss5 znweBjsG&8ZjjUEgRe>ebAZSlFDBDvF0rnot? zM%tWSt!Q~0fDCew>{$b}+qZ(6&3hlUZMMEVvfbwR^e(r)%lji5FWP46Pq|RUNBue6 z!Dt~H%7M|2&{A5l6?o`LK(&7jvYt_!RmZN&Fc;LPnfVZsw*r)Hm_*G8I`OZ14_@~jq*$_b$!*XVBHK9S39a0> z0w~tb1?8)k{?_!%@{6O3mJH7<+1PS-l|#jojX{!|yAum$4k8(+Jt?H)VJzHO0tYpc zTAVeM#ZMnV2~+#ArLaDNB&nAyP3)n`;=37TvE6KWOjkbi1@+kjRIBC!)6xYu`sU6X zJ^#a^);m9Mt9-H2S@L9aaKWwp3E7vNvj}H>@t9K)RQQQ_X4-fP8+J4!KWPk6kZ=TD z7&nS5iX9;q$Ba;TQN#3-$RQR#Vu<}#fQlvGKeWvG?%4DfU$x!-_cFta#k-_nwM*gC z9YNW555^F#yQd&81;NwLM_^#n@r1WVMLt3Gs91iSYZ>C zoY0AEcE~vMt$11g{pZKVKK)1gtuMZ>`t64mGO%=aA=u!Q{o6i2!XxK! zVdwFGeq?<9)emK0-byZ5zLNpA*%5$^JMuSo|J28Rq45ubBckp_#Dw38jSIb%m=Jt3 zB{A@3dQ!lR%w+!?2$REqC)Ov0w@vGQ&L| zW*zo;h&b%=03G4}02^`W0Y36=07V2ta$^t| zIjQ97Tr_)%MJXDmF@;A+dD0O)S2={?YX(rIx_*STye~^p*_)v;^rTl*^`uoByVDws zmW;+(^WNe2tlsDFzc7b_|6Ui~?!T{#(8QZX(TIx$Ddg!q6niR%Tr^H+2#=8SWUto6 zAf^Ob7b1NhLR!)LYF%V%tDtpZ>`ALJcBVHNTQg?Q>-kUwtxc}mR#0-t8VEeyUkZIg z9twgIZk9yAFBK(_rVBE2rgHH`$5?dH5gNN}h*Y2+!1Hu{7-2;(Qd-pwR~Wmqv^8BB z22)phovAsi&Q$jnfMV$9!z+g(m#u*BY7O;@9eP>n75u2wKkk+=H1je)ns~M-l{Ljd zagVXdqEQC3Y>1k#=_eMI_hJQxZj_|D3!yZ1X6b7?GONukS!S~tUR!5G%pSml9Eu@_ zVrQra!r2Ol-Q0l0Bj~ZjH}>s$^wA0`yNM;$9axFE9jUIjz^fYT;nhu5i0Vci zvZhgmGBwN=Py*%f%Av$@3n+Cw0QEq)0J&?xQ-w#=U4?JzHF+@Rf-H)5x)hdwyaZk{ z#wAFHa@_nXti@2}zOuDJ} zM_kf}63=R5nN!NN!VxiA)Ll$cx8yMlb6#n z-8fqSA9@zA90Ycof%M>hsQs`VhR=OwLGWcd*sS3tT8)E3=`t-d1GNh{=az+o+_8T4WSOo0wc_DIru^iiyS+E~&a{w*28BJh&Np@4gSHpgjnk zz4wbsr_e{nLvgoie9|tOgVCpJ<47Zwsd-&WxCjbaW#mx|I;f{p!7gYNGx;roY?*~e z*S8l?D%&~Ks@8mJb<=G5-QmD8sF!pTbRWh(poZ%I@`GM4s~kcen%rWp*L%Y*GzVu* zHpbxxjIg{mO{S<;hE|meiIs}t?Ap?TyvCATUQ1z)#FEd_wC6A?+HLipordP>U`vP!elcvg~@QB(IrJTGEOsm03`wl@?5ip$%7LY?&=U`080e z4wC&FfO_vPVAx{=%=?`mwApxE>vQowKkn}{b|g5yvo8WuYl&lN8|LD-yQZX1M*$#p#FnxpmzJ-hn8JdSBI^w&zyEXICj>GRa-VcZ`!isX5WroXQ!-pjGaH|)N|fBxc-c1l72D(Ej|`bFC2|2U<@V; zh&@>{bO%%M#4ms7cJ`SYgLE3XW#T0VYu-MXHu+pOzv z?D5fGwTUjh?3lqh>w(Xn49+GVi^)firWC;kvjpk=m{M3TQJU04D~s=9Dq=hHlrfz} zs;G`qb!3NP)&S|+?|^#k0$^J4^PTP`i%y(gys-D`>dg)JHrwm(?(#3aV-?G};*>!@ z=Y=Dj45Oir$K|~0K}bE41@#}GixYKI!ntQA{{3y=m7kY3JXpCy|74SM>Em62oV&KM^s8=ZxC?$L^ zHkramoXE_H8%O2F9L42FjgdGJM`(qIk1)7lqq#+)BZbAmBPG1q0#wVt0p9c{Uy8xp1qI-j)pW3FI~E+U$^y;~Nx;J`8u)pI z{}${U{5&Ec;Au>d-;;!3pU1FJ@5gEXwf_JQ_jrgp?EV1rYVRS!?LH~e^*%Lfwloj? zKJXm^C10^%sD(=O@5$S_3#9J3*n3 z9pDCfz9*2N^J+F4H$x#)&*GUmr_lMFDMWG6iA-V1c$!3TEJYzYnye9z zB~?hq604<066$3~;@irG61vKIle%TI;l0D}Ila%}KXS-{<|GT6lZDWnI5F|Jb72`*nMm9WjYOL!GICB~^Ei{pqT-1x0e?JQB08F?5Rbt$(j!R~veCqv zveASF`DjAByg#W^-kCf*02^8tY{-G_xCU?!?EpN_gMjDj@sbxD@`xJ|cbk)tah08k zonhc<(-a!}B%WP(0$s=(NAQJ5GsWT~X>!?UidH_7T&WmNs#OjrHmmxR+EpE}c2#rA z>;Sp19p-~P2dGcWbqBN$VhaS`?l1WP!H;=iv3IyJ>DTg8urq8lbvm2OK1pI09>;O` z$56b|v8+<*Xu4cJoT^n0!K&0l$@Q9nWQ(RF#iD6SZPS|5X2)xX+&%LF2Xf#!Z->rd z*Z`5oAt3S%d?E;rxmyyMdX1Zip2^RmPO}K?leBE^1R;-q6jLM~MTp9VGs=`hsXEOd ztXeye+^p+LZPhiWwd!lrTl7^KE#t3ip=b|7-G2I50*K2&=mrtk z<_be*bA>)@cKqSMwO<7U4%?tJ5LQ6y3hje<`ahHUMc$W$B;OE4AujQfNoNZXtdneF z!32#V7$b0`BWS*|A1>4OWa!E}(rPMO)0zzCj3$F2tI?o^HyTukrda{(!E%nWX#7EHuCyCptg@g> z_00%nWqoF4l{vG)Seeye)FK*;3S@&(hH9*u4SzWB4z2>CgRlDTq59v^38>t>e^Yyf zJyb&sC^dc3$wjaAhsFjXcgrmj|mtuyg)^))5^e~q0z&^viNsc;XxZSak}R27nV#t@r1rb!|8O5nMzJS^YLp~wu--k6qN zSRtnfjS`~VBqCJQ^6_SKF~MBRCDzvz66>pH11NZv!|wTjZw=kaVYL}3t)bf6)(%uS z9(rhW^Sfd437ato$4=G6rVZ(niS6>t+*=)|E)S2=q^)<8MwL<~qAh3FM?tc^X?jNeXZESz5a&Wz8a`nF2;2m_XIW*!} zU36-1Wg?+jmCmk_AWL+7yiCreX+-(#ieh$=k;4?5av5qfi&0(2%r={u^g0uhUSBgC z{%{cPhtB=)+XyuKcY#W4n`bq4PInqyJTA9-`<-bI4IOEWO6jOhAk^tn*%fj)Pf?1M zmh#E!;v!Z>enFv;l`k~WbCqUFZdDzHU2CT1)YZ~hb*9+>3Risr3ZWcC`+f!TJsW^- z?@my4;J}l*gZ4LDTwE`9`*=)s2Zs!_M5MIT#^I|gVL2L2CQnj^mh!|zb-p0GoKXVZ zLQupv5x8v*(3Fu1$@Fs!~I23Jv,*uFXn5IVvYi@Vn}IvvN*R2Cn~N%38l4gf!>@YFxMiB z>r7~Fea&nDTqp-Fl!IjVFF?I>9Wd{F6bP}zAFPR2hJSzau^;82x{vNOR8y& z#;WTR8KRn0Zeb<7l&Qli$ZCofqhwXWQWnYbpUOlyLb)tS;t>uWLv_0_Wh6hRKf zyXFJgj%85)!5UD#W7E^-UE82@DBCZLyKOx_v75RzEl6^WL%#b*~czzT9| zGlk@8vgONO5KZK@O|S zR>zw;x)`&tJkqSHh%nbwL{>Lf#FWntz=Iq_+vfq*rp2IY%6mL-5D=`{bXQF>Cx~k=xdHd`amKJ+m}|D*@NK2x(MR9&TLs!2S*X!AykES zDAgeyHR=#cyE?4FqL~e#1af%Q8>C&o5Y(<&e5Y&m&(kM1&Kte3V@>Ck1N-VO+Pmq_ zxrCIS@k-#F49udPI84Bf$7N?8OUX?>f+&n1#`B^F>4J#x>tCs8l> z!ZBw^WGR|NJAIr-NJj%`YKPu$-jmZmq$MmxTNLPLiDi?qGpnc9~ z6Q{rWsO$Rtf14lux>ECa<1W#oU5@#Wt$nFb4+7?ncUe<(6#(jx2xQ=*)Y-a(Fa`vAAevz`N`j*b0FUcz|V{Fz?wA_ zuzd#_SX-q77l#Dk=@tq6JwsoF_y#?X^!I-j7wGdeDcI{tYKZ6K%ux47h_FMCFyU?w z@rPX>kRx0k&?21gvm%}D=S9ti&h~$NPD_q%`yD<=?R?EvC!>_HOr2Tuxg@G||NEy%R90SG&5fVQ^+c>4o@1pR^h zW&m;dCxE#9dqA*T3K*{I0o!{w$PKgy?8BZf8F9f+C@C@b@JQG#G%4#EoQb)d&LPgE z@F?e#Mf7utGUnNMRnBy*o_!{!D(`f(IsbH2bN;EwF3zdQAAQowRq5AwWrgZuzHkQe6hGAAbZ2|YRH9tjS+i6z3XA{p3Anfaudv|`$M zn22#UNyeIvSFuk+S394MG3K9&t}8eh)e6y5I2kosI1)2jFc3Rh_$B}envPJBlWwhKfgHhl_gShKoDnhu#PvLk?uffo`(|1j74xXc0kY{ zKOksN>=!mB^^59~-^^P;3vK1##RCgsxW5xf~ZD^!I(v4-J1<6q9f}KRM$X6M?-*AyLla zSgg|sZvJGtsOT6>!5>Yk5Dg`m#RKsjl8&SvNn>)4)RfXKtxWBf>eJo~pg|5a$RY2* zV!%7N8VK#T0kP8oAUWg&BtG8HOM^on2qNQd7A2%z&dWrfW8ldr$=S@K*nG|~yoA@6 zE){mCXvFO>qpU5txvT-!RaTwaC9g>9l55ht%9I&z=CuQT+Z>R;|7YlY(kf7Ta0_%6 z1iF9F&EaL4m**o{V9;$zc=Q!vEbLrSI$|mhLp+jAW%d(u3c4`dk~V~>v?)^|txGGH zn^Nl(#?%g_KD|S!%Ir{<=t6eQc zw5vqO4wV4ep?njs9kL+@?!HA(@Bd05v)%;tVL-k2PPR|9?yk3WzCM?AA)#m0v9ZUb zu#ABcIH8?`V>U9Wg(fPSUrFRjv{;c`iBhV{kOqwe(WDh2EgC-BqTylM)kT zP!6vgiuNvo`psY6xwjFzgJI`Ooul=`ibGB}3_hMSRl$KL%VVNO6iFFfq6|V)5t?br zBNbLKm;yDGBPk>D6{UEYT7cDSdDuE#5w=ZNh-=dp;4NwnzWt57c3?mbyuAy7c<--3 z0ljsNGbwYZZG!1X&Bbk+jghF*LT_9uRN`$mx zMKM{TE+lHS`9za0m)NRfliIX7B#Q<@{U!hd%7Fsx7zl!%5Lu+ zlZ(ye1~11mjlrIyH4%|r`uMa)c?!O&6wc7_um!RL3SW?$BPn8W75UjBbq-CXW6+Fx zI;|C=O-HA;Y3Njo`c1rcU~QcP1iKdi*{j-n?^;lCV9Vp0gS&1vIPafn^R}IA4fGf= zAC73Nj7_UmC*$<842E2YE)eoad~P8_lAF&_Fxb#z$&u?wtV%s0r&&*AwdzQWHVuhk zc_V-c<-mpsPnHG9_GZL->QxyxzGnF05`!`*&|+FL@yYwMz5x~c?>RG&)cso?o} zWmsOegi=Zr<&c8^y%eU)m&I!Y z@)(U$8KtRKMrk_~vGPtuy!6cgHstWChq4Sh6H~r%{>!=z3-5GoUU=c?-gzg^*evTm z>Aa))sHc-*I3TF3FD#zd8J(5WmOvmkr)HxY;CUH!xT54*8b8jICyK1$OTw!a(y*E; zS*WR98eZ8gi_pCpkOw&k)_(((>*s)~HFF=gte$&$c>SEoGuwX{x?sJ${jBpg(@75p z^|+tEa5N+)Z!j{A+82+(bf-` zUl?TW7rhCP4>^d}ehsux4}y95zi##}`)2CYuU`z#Z28G@Y2TXK3wC?7XI-31PkZ}u zrh+2r6Ni(r$Kv3bV=!FOXci@A1ebkyn3fYVoR=3c#OL@8DGGdsjRoE#?FHTgqlG?Q zBiuIu3Lu9vXb-}$?8}F33qGG7|M8=tnP0xOT;H_VbZz%W&1IVdqKl4h`4`*+spoy8 z&}T!E(x;;`63!$dqt0aD!cJp|L8qt`|C70N-$@?B`-GI~c|s3iW_g_GV|q+Xyb(~m zkOadaYjaRKdmJnI$aCV`bL0w(LaFU z$G>0g`uxMu$xr{l|A)QzifXERqkcEd-h1!8i;5s9z4wHckdR)0 zkU~O$5L)QH_ujjJD58ki3s|tec2H2TE7;p}*86^Ed{@Z-_FSCd_^HF2JzYCHWX?68 zm2FAC_iIP|F*XhWYa4HHaP<61Br?BIDbz0 z=R}6Zr*x+ING{84q>%l;xZ19UbzB^WHQyVrR0cC9WW(|~39w~F80_6F1O44XFxBRQ zwLT3Tj7dN=cL9o}Be1M-;9+YAe0v-4##wF%pus(>`%Cp>7Qt4livx>M!(Zs zjDBSj{udpcs#w!CRjjmcoN^Y-o)8bKW{1JHrT(C~mJbKEvcXuL0#R(e+% z%ltY?IS%HHSHPO-zOZ#Z4|XkMz`ivkFxcP(=3DH+cDoHY?z9BrE;Df3V*+#yBVg|} z1b0n+;A!fCP)irY`woEbzWorOtph=*02qddM1z2113qiUfppId@HJclAr|W)0=Eky z2?rp8Y6hWP9LNR4U%vkIui`N7CqX>_BQMSSy+^LkTTZdx8&-wvHM3U!iryIbl6E9$ zh}s@JL^&HWNa+rJ;dUpqkNPn5ANrHf+l<~Z`TsTipY;JLx);9aUicdq(!csB+&_t8`5(Pf#qT_Gq;I%I{;%2P0k4>~fiD@2!9(;T zA%nCNp@Ye(~ERJjn zQA~SK@Q6R<68cxaVD}M8wBUmb<@eg7FyJMpJZOkr8#2gjQoNwIhCQd941Z3& z81bBXE8;Qze#9;2qlhc4hmn{62jKVrY6#L>4AG|RAOU4DNsc;@=xPFSbUTQ2C;SQ# z(Z2=+xQ|F9gzvo*ectdh{9k$I2M)QHg$%N56wg^r;RB4L5d-v7QT?>;s9yS=s5{ID zQCC^_qc3po$DHHb8x!zfJr4YL&wvo!#Sm+<4w6w8^KVZog=h>(R9lGU5PpU8X1$zHz)P>Z;6aa4#dA(g_yDUZvY&Y@`WgLf%rkmV>^C0_PCV{$JF(4k zY(R$AApmKJ*uMypP!^MEfzAf8(S$4q1IQp+K`PDZSE4)ROO%j194ZsO4T$i4B~6sS z5M_n-dlg0Yc~r+d<}}4WV7DjSWnE0X!M>ezk$Wqt)8kh1G0&SRExem4hrGrH0+0sz z?wJs+vj|cR*Fd(}R>-wNvpG0@$Z@gwl|^y*lEx-~NZ_+yNBIg~goH|;2E+wE@<|K( zN0c9RlV2Wp-LpRNiu;k2%iL3`7rEEdIz4Zswefn=4te#YHwb#t>I65&1ms9VAkq-4 zy%5s%SEDnOP#42;4?3Sj7YdxrzU7haKV~yrU#EF82NHa|oA1Ko ztyNT)*&=AoZWf%$ZV+D0uJ*o~T`s9Q+1WAUE`1=5iEukS_PyF_n2>S1jAS!2Ej zoe84z@}Q&P(?+u8ooXhbyTp@oCPyqjmL>~4ln@$G9~~248J?U{5|W)+5Lld>Bd^WR z3}`J#4>(ttD(@;t3GB*G3hd5H3cQj#77&cqA$;cyNYj`Pg=pWqOm{8nVQl%o68au4>20+ILOEMIwjN>D^)d}MrabV5pQL`G(&qA)i#q^ck( z_)uX&$mzoPkjsT}AzcNrA>DcZi~lr4?3fN2$a@!|eea6>YoJbl)8{7R?Qf1)?e0JB zpmpyk!K}NH=5o54%RX8n@NUfWkymBN!;4eG;&Kz>Qqp77GLxe6a^oT@3ZlcCiXy{L z7Db@1D~$-hTo4i7l^+q_oi`Q`g4Q8w`*g@c-n)1o+V|F3^`}91{YZ<^mY2sZcRcOH z?YVW_#q?qe#rZ@%n{}wd3#F0bfRbEUcy4BBTzYDBN@7xSW=woeZg^~IL1=74QE+T~ zQBdrq!r++81tHO0`61EWd1C>gNJGrF>5#K$E|h96hMIjVem3o2^P$aP!;4OfO^?so z?!MOHWOAm}&FN?pi`h`)DJ(A+$?}W*!qW4CViU6>lcO^dGZd+rIYG(AsJT>E=$F)1 zXgHe6ZT~Jgb@XxG}DiTZNF;N9!Nuhah>GJIKY~QScJaJ}qfhhAxp)m78 zfp>aWz9h9f&nKljcPv1G)*)fbR4CXz8!C6Bz4twfKeg>$^78C~C4E|b*Jw%N9} z>vnqeT`so8=iSH|r;nYrDVv zhLcs!RT3fbGMyEEfy)m#Cy+```^ddc$rap_;gJk9l}0&{74LeYG?8$kG0COlWTNxQ z+lhqMTS>&jx01&KqLGID^%J0W{iI)QD<{6}TC8^G$qLoW&v#5e*}s43;io2Bs-M{G z%YWc#mU7qCG4d9TD(~UAORn*SURQmjoNjply*oU}tt&x6?8*vv?kbCP>}rg3=sp>V zzj7zi;oSXb$J6&?#sU(SszK>m+B$Z;zpJ{W-)mWc^>SC5&`XjTuizjE+yPg^mn|U9e{sOCbxgk6lnMG zWT4%nTXMVGeL?m;eZgY^8H-e)X1U7G2~YagDe+BmXudfCXfr8y&7n-WJ1 zG{Q$L^aDn4=H4UDcJ3o2C&mbaNFH%_Ba8@Xjw8Md+(j*W z;U3vIAE(w0Y^h3xSBcw%>oA;D_h{%ScA8%CHUE!LlDjs!qEW|aSn!%;%M+E+e!a- zp|jraN*BFfHDhw2O%-cBr;63yQo{;|rz)qzqKUDvVRk6&Ug`@vYrVi=3kyuu$zZMF z4ETL`AndmVimnwf^)0~N&{8s85YmO5x)TL*2@ zjm6OuDp*aoGM4{P1xtk)$}zBXLI`Y{;R8Dtc!K6~IviNz3Pu|pz+#IX*l)K2XLWNR z?J@!C9wT6B7=Zg;ec)@N>_KZk${ut;uB{CU9W993uL<${_d*&vh&W?RYR_R<{!I)^ z8dSz2VWzSi7ORP1&15cYo=E}q`OcuV*dBD3S%Jw)Gq7H547jxh;JjWBTsIs5%0?Yv zY}yB$&065OWiJS}Xnl>w%`_--5;|r<5^RsIU?-TJD ze}r(FKjLy(Fzj+$_}-;Y_>wRn>?ghuJ|Yi|$^SPrtVZjwa}w~;I`|qd1G)7E2y)m3 za*_`CGmSy)Wdi~~NAOe-e{D(>{RAAW)AlYt=RK3rOIo>twAtMY7q{*9v6Kip7s7fxGH`} zcq|?wK9f8pJs011dm-+j3`)iVcu0dM(jeBJ1AzuhL4k6yaFoS_5wszMY77BfYmkT> zK`3|q#fzeS=O(kiva;PjGm3a4v`WD+rC#)r+~WO#)Gm4Ndfw+fvB&2Xu~+(x^i2AY z^4#YJ^@X&H_S|ApD-qQCUNEG8Otl%kxqA>7Rfg4x#K$9Dv=Kj{}g zoc`S-f%Aov>G_FS$RDOxh(1#5#qZq?`@AEckiK)h==;|7uHSP~pWh=&zu!$X(AP~H z@IS}smyHGRkp?fM!B2BGgy}AU7?j1t+3bKgM=gjZ8A2Gt3IaVHKa+D2n^RE7|L< zdyeQ8yToURQRDZ5c1SirZ4Y=xxrnwm9t7T|KMm|+^aY(|_62vadqa+L#s&l{RY8C> z1Zm8I7@ftC{BI}4YAdASG$56r2Z>bk@6l}BCk3DQUhYqO?Hk4&^p58bcx8zDJPLdt zb1G#ISO?{I8Erwg=x0N2&~JryF?&N#vz{p0Igb@bxR1k{+{XrlNQ3wG$q>4G7Q|~W zf;7WbkY%|Uo#VV4GM)GTNF$q!Br0-x&UV?-a=`evW^SXG!1{ zZcWH#_94YZR!7)*R(JSm_M`A)+=me@?hhjldOnP(;f)Q5kOs-NNf3@cS0|wiBGYgs zI*(!_YnB?yGG)C<9P$6gEl1B)x`X=~X_Rf%<7Ze1a=2a+8 zdNf3|ySGIhb3Ye-)csy`ljr^DI^O;0DzE#|Wr7D$V*#QSsvzAm2_n^JLh3%0K^Uxn zeAD%4E@%6FVwZt6cb;j27uE$mL|A{LX+>0$1-is{|-H#ay@J1T^Hcvu7T4q2x>c!;gFM}fE zwZBU&wtgzL+x@20NoSy#Wc(Day}{B=XPR-^iD#W@12BH-@9>R@t+3y#)*)CG-PYeg`)k7pqNwV8XiLyHh@d0<^#{wkFRUrs<#S*t6->W$XN^}-NmG1ISbw+Dm zHCk+Z)?&Zy?m_1R-BlFp)5RR(u^c|DIn9S(n<$r-#fAkIM#d>}!qTGBL-OL1gDMge z0-KU!13OY;f_hS-gKi~72i;DL3c8ap7XN7oK^`X=X(&MNQ)T-W{Hoc%qEK8x+)7p`ZYL>1?<9-`_@H%Ateb%5lcu7xNoPTY=DhFq+Kb+`=q`PJ%w+k4 zcFWCI4?F0bIY_c>t75n`mUu8K^F>}oS-w8mX+iSTlD=ep8?exbG|fc&VPM$|AJ?o#tZM9 zG~aZo4X@qN>}t_cM|ZBRE)STDiJ3X%4Cswp&=pJF%bcosWH;@yaeyG$|ONr zOEN$0EaFy@Fy(flcjBFdu>fDBA!gNhGy^dSDt1i$b#VK%_ia0;4V>LO^?sN3yzcWR z>pMH`G+R(6Rda;mP}IbtWY&ASCsuolA}jp-LP~>!WJOV7l7ggYL0(QAFSk6wJ+~>5 zlXnVnC(%9oP699eZv0q)AJPzyym!Io2~fRd(zljPlV5dip4fLqecX*}T651|HeP$| zoQ=l8PAB8Cb}}xfl|fEErBeTzK)JXoJd|IN5aC{)70oIujb)S_jHi{I zjHj00jAIo46UWNG7dsXpTdD#{E7YKP<9MiFKYqAv&A8_m*QnmVvtF(H*528j*9=#; zbXo1LI`3eRf7;bHwS!KKInHH<9_91=4@YLMxRC;gCSL%7RR`uNdJu}+w=&!8r zvD{gF1*e;FnP3%np6aYP%cjas@i^j>VlUnanV8eA@TDJ*4RAY_9z<*_3UO(x4|O`$ z9_o1fdZ<(D6NO9DV}(oO-+}P?%8;`}8ETiSd_Fc;`N`EOSWoXP?0nxkwf0_(X-$vy zmX_Z)-oN#kAi=CCjM^Jo`Ch2#sd62gUasnhu)Km3Jy zf82$3nf=A<{`TkkW%v`%rJ8E@n@25D>yE<<2)R1XL#Xm7xV3I zHwbL*oDf>y?Gaet84}uDdFeeCkUCQds%B#Mj!ne6(K!rf?o7gtzM7{}|7!h|(wDmz zWDgx!lQ3wyBkYCEKG|~zL(u@y!hL{d$L!}iQu>7iV!t2BsXv5*?~kF|^`|kd2MSo0 z12r6r=dB#`=NC9;FM2r^eQ!7xy?+Ptr(zGA$6;L^V+E@A)`~_dbsH9|E0iK12{KKP0)D zeas=5d@OS_8g8T*4!2VbMy^oxM+Ol?f8|M)GS=OSIuNJTutV3!V^y!FDiwTPGCuv= z=2@}dG?s*Z*IVcJ!)&|YhqVUh2VRHz!$r^aC&kF=C(9J~lV@)G%iGfOm%p{yuTWd# z-?8?FzteE~fAaCVe<~gJ1NuSp=Y*5apR0&#f8|<}GS+ci6>GkzidEblkLCTIp_~FM zCPu^7Ss}=COF?(F7Z`71f#nW2u;1eX&YE~2Yuf_j0Gh$jL;VMR6Yw!K1UdQ=@Nkp; z5O0c#>So&LaPoanVW9;LmYQ&EOimtA#+ptkW98RWu&gI)SQ5-pj)c_{0%6+>G3;63 z0Xoa*V1P0Rvki`5gE9yQltB=8ngL~(F);TSfQN=I2=^kBuB8p~eOeHvtqE~D8j!Ys z59A)$jY^rjpjLM*nvW}CWtT84^Dc(PeVV8g2J@8tVZ}HBY?#7<9kVE~cfJc8Sd0Us ziVh_j zi}Ew*`qwcmx);MjV2Y9t%u@D%1uAq{Ii3g`C*xt~bZgL@Wd;Z48iLV$U9ecF1GbB_ z0Ka%IxGdQNq@}xnwrnS`mhS+M7280#Vk<~jZU*_PO`ur40isv0hvYS50o1js;JRZR z(DqFQ5B+%{uviWv+(r<%s)HvJMJ#-MV9HE^8g2#TL^~j6;=!fR37jijz_E@94$ZEB zKS~1JN%9~2i*CQ{Z%}^P^-;dry`+rTzoopxf1nIGe54FG4gZz@tAVaH6?l5{KxDog zyzMuFh^P);jD5iM(g&8GDbT{K!7afaTr(YjP~Z&Cb^|ix$>T{=$)ThqFe+6i09Y|;$SejFTuR9lw7cB=LyA2?5 z*$G10KJfI=2aePX7@^icjl%&s-4TfSF5pr|1m{}PAEzd_-wsD9zww>aU--+kAGo{p zZ}tQ95!@^KTZeb_7f$c#eJ&s94_!Vo{sz#I2J-fCz|oirq62fm7iCg@HXFd#X(vc1 z`+(2Y2M@6su!C%X9)kx;suPg%h(IhQ{c)*r`|aFB{pEO+_S4}M{U^SQ@g4tw`5E_u z`QG6*bI9o(^Qp^w=6%8k)-B=(_TKE2Ix!+qfT z*1d=H&f_xqo#%PCzXME^1<|&S1EKm92tfWKRBs7{o3BNA&^8Dq>;*YZ52Ws9AQapF zuF( zlPJLPgI5Ict$QNn6)TG|L@#2$pjNr}yES?~B_HGUkHENC%@odb9*hgKzSwV zq`eXyr@!=WW&9mrBMqF5sGqcLGAQ<-9OS?vNHAT6x;dL6-f`EjXp+vCFsAWGInVly zudl<9cPMdyA4`4ek;Z(?&f`8{mU-T#*Yj^tj|h7xouX@$tKQv|XX10TA#n$NNOF`p zC^^I$lr*yc4scK&<*{B3WdHhq)Wt~HzYtQ4S3s)uhTkdponI1(`#!|b3|@t~TRsnx z;QRani4Vk))Z6?dc8_P4#}#f7|1!HubdlL8KF2ubbB2CFdW!zQ_c-%~Zwu?W??Lu+ z-&*c--)ioQzw)03uXSn=xM>o^pk7Rh4w}V4&qkKzx^J1dZ6DKJG+rgU=?=tl%pQk} z?Cu2m6R-OzXkFr1&ILg#?+h> zN|=;*F))aB+AosZAxZRV6J>fI;TQNc^D6xgdNu~sd$h}I-Ma#-J)Q=Z@t(-7W}#V-`JYRTmcA*sSUpf~xA9?#^PcOu6vK;Y zT-(lgA)zhGmv%@I%xwsYLcacDn%H-6m2yZ$kY6C{PW})z7@f#(#FtaX@??FdQFkw`y@2Z zw>Ko#uP+!8^f%Ctd=>CR9w%nqc*sOKWzpX0Kg##beqWOCk~JuzWyiy!WZhwr0Z$YW z0Z&3B0(wIt0{Vjg26!S3vSq3ew{9F{Z=VDud!~M^(wy<8L1%XVA%l7UG@GvOuEVLH zt|02Q716Dla@?J((}mQMBwtQmTo6AqI#Qexk?0q%$dpHi6rriYT19B^(Xf!RpWrIcz}SHN*9%jQ$^(|tIZ$#SpcgfMYjY@A}svV`SWSip13$`P}ZGi1Ej)KKq;7Z5jXU#Ln?| zPHD`z+-|u1WUKYI!%a>)wRL3kl1ipSPN@eurBK9*&GYjN&khy^XGTi>(~@L9DcM1y zJF*>kIxHAVT*cY@sq_py#7(quQ5-^=d;$*Qq`^ zyGfe63zQ)ny)G)(stg}mp)zoC znesoES1EU0+%@&&S-mAKofeyGj^nk8T8YM)hiG;QjT}Nmy%#m8M#Ax{lzDlVE4;l* zW2M}Zbbn@Xk(^dk7epyOj<^;?DS8@6&wCok$bKgO8{mhoA2(kK3YIGWu3M)3rft5` zlS?zP>sOa6pS!YSa@(Z?3meXxZ74f!uaVv1VvuxOdcGrb%A-FXcm zd`^9gH@!C1hf-7EN2;ln5o?ag2(?#aE;R!(*YW`wxn#iqZ$RK&Wk^Q;zhr^Zm*zRx z{nL}No7X2}mu@amI&ov$#O7<-^DDbe*5+Tb-Ia3ANjLg5**v6^f%7}zK@c4mQaq3O zGTBFi-D#~+UgRSwLc)=JZ>PgG5{JWW68w>F#DK)1Y0$^1{_jB8EG5XCi9z*D?0y@{ zAI_l;!p%uo=lz9Bhwp73UvpP$PSGu+Rp~v}+heafXoq&W8u?wKTZ=Bb<2}y{2&{8b zH|p6SI_XRl+vRi$*YR||C+>7L&+hb5FWWO+hyk8$#~Z%gu{VOh0WmYseVB$lXqly^EA;dpD0Sexfxi^ReNw_y?Ao6!-9Z{O=HTMYm`s9yhsGtQ!Ix zwMXjY+7m={z8*!!Ur(XfUC*c4T(4nRU2kJp_H;9>dY;oQt_`y+FAcN*2Bc2Ko>Z!0 z*A9=v&UB8$j$N66H9ek!RXty-Quuu9f3G8V&3dq5c0-wrSy%(CjJ|{o$S|6d#SHU zIEo|X=D7h#Ln>TL3@LDC+zj#U%~0We~#08 z`_cYy+^)c|bB9#0R@6bLyR3#4-$P)iwPVq;K>+%Fy6@im~30Jd*=IDou5MHk)bx zJZZk~*L8EPU;TgOVgrU9J*te=o>j&QdsMNs{)t%p?*+=?f7Xu=K%UzhH0Qa4-V!>P ztRjK+Iw!zy!U18c4N!Ji088BzJa-#`XpcVl@70A+O&y5cw-3@#22p@Ah$@spG@}gS zB+4MVPzEtNZHF+dwgbZox-cx|o-!8wbE;A>EL4`lnsI#CI)x2;PzIrcG6=)PcragP z1GXzIz;TTUxUMq4VcFBfNirJm@eyqM&Ax@{5?SQ*9PZsU2sS;1p90guq`$Nn<@*iK4=M6N36i| zgf&>4vjOvKwqX9m7R+ASf!VO#FY_;UUoF4eeYE;v``YHG-7DMC`M(-mc8>?T_B7xa z%>#Gq<-l=T4-D#dpn9UX$5$I%6nfy8U%%r+b;1@b&)b2; zb$c-HL%g>CV?K=gZuu2AV*TCzt?du{7j{2z&;J6d*Qfw)ry3B|#{+ZUH1IH(2RzH= z;Nh?yIBwg4&eZ@ni4G7$^uamK7#uRp09RlEb`@4&+h7AWhi$?7ggscDw+G7`IIwtz zUb=7bKP^Y_pRK;)-`Re{57~XkKgIoU=)?VR91U<;rveT;)PTHmJa9Cpffvey1m??t zk6RBOr0u|BYXD881LQz`AViyhQ>r;Q>EdEBO-P8~Ng20ODE|Aa7Cw&ZcqTjdBownVMJMtP?GIFl5_CyT}zza5~^KZyEGABIUjQ!aymdah2<&; z#&3cE*InPG%zdAQeEp9+f3vsTFzZ*$c>6(GhU0TeflEKRg80<6f%Jsf>h_3mit>PP zje3XhjCzCcp4LVDL_b6N#5h6z#60RY!fd6C4v^NU0An5U-pKz4pe}|&YbHeMFMufX z6%b*+;hTc6V>pni`PSD%Z^+xnbbudh{nR}g_n4jHe4mj+yhAM^-=tJiualeUS4r)R zZqh~OWzs{|dGc#kCwZ9NM)}BTp?>5v(mrwy(nkl#NCO+?V&2GK1fecQ)ZQ5or#lbD z?@PbO*{&UqcG~(TjI8k@h;yLNPh|2?9AJHiABOMoh zBb-jkX>JFl$Nf0;sc&M9KG zv8uSO%qEW(M!RP-ql?$bc*?6|zV)hPzvY#2-tvmM?>vkC0#J~Ke?6!Fzy2TXaVGAb z0%ut17+(q!Tc7a{a6IV~=6XyNM?Jz%WggL2XdERCWzh?7_~ z!c1-@zlc}HtL7Jb9ugLKo)YDI-t^Apy%c46y%MH-y%whO-v|)=(Eu9qS3EGXrI9qxBrpxzqr9vSD*Npmms&hyF@mJ724joul86XG<%RdK5Dg*aLG(mPS~N|YdaEsXyQz(CjbMt(B{ zdEZ2o&t+|&@U2i|^4n7FX#*8{vmTV2EV))_zv+Ayac@To-QY;PhgD;gw?mD>-?cnA zgjytzX65-Odt~`$d!_l52$NAVlpt=C#ECEa#7dq?VkAT2XrGtfQ9iFk2;pd;tq&ED zAio#340#>&jOK0~_o-y}#Fv$OC->FvpLV;-Xz}F|+l{C4Tr}D;s0K~RT+5m`0lq9s zN-PWuqUMA|u+jq)Jdy)4`SJcmq8Ps#ais4NpK#yv(lEbXpD@262|D#jtnhm!`WwJO z_rVu=-UzhUn}(j#g3W3l%Xf@>QM+rxql0^=T(31;biTr7!-*p2JuNvD{kn9vMR~Fp zzA#Qg%#IGArbUFY5*2YCu_0;v$e?_YBCtvlEN}4%l%JK#10N!WB!TiFaiILAccA>0 zXf(hbUE3dd&Zx!6d#_gcS-es8UG)~#{>JTU{~X#qxw}Ds;pu9t^+(GbcQ+Q0^{R51 z=0)kAxSV8fLRx}9B{4RH850%l9v+e66%v*!k}Jw3{-MoM-_TQ1Y3NXR-u=`A=>Z@I3e3csti z)b&7V0mCde$K5_XL+Fy2>gyJr6vPZmh;&C&F_moR4k4>=p%~kkP4!1N`+BF z5>dpE*gO2Cw>bQjXf(hJ-G?C5cTYfj-g(QEK2@z!e$li->A~@pN>|%AU>4hS8daan5 z)+T18cOzbSvr=D)I7zRBoW#)qG4lQqvy~uy4)&{TF7~Qv7Iy#S6zuBh#Y$&RZ5`j% zv2XUlVDW1%Nd_Fb5 zTIiPFDkA4!Mhpnua$gInnXd)3j5nhKzR3H>puPW`nb=76H0+-vld$WjCt(-PFThTm z+oX2rjONU$PNQXo?be&q+Z;9Gj*#@i57Eu#jqY~R27!~XPU`Ae8%SkWM>6SENgTJz zTo2cZN}fx_5ijS;i->1D=km8aViBTnbU=>0f8q@6OW{=PUc*G}Y8%QQ&P~8hcFn<# zbgfsdyQDF_#*FFdMKPiYEGoP zH0Q7!n=07&rWOva`2yl8$G-6+7hn5<>rgW~pqPe1`V{P8#W?I*Gn#>DACJyKKpljh z8CZSKYL&9zkw(2-5HKT%GxJ<&q7?l_O=qgb8zK(jvjnQq-WIuJ7% zdz!C;_0+0i=Z~mi?dW8LL+FIcx_eWxvimEPbMI}Rn0!}fPSkCaP)LAHhYg9=Nthb>m7kIq?{ zJbGef^5CtN(Y^1shWCDs%EMd?>#9-4+FMX7p+g0$K&eC?novm}nxho|a;<9k(5}e= zLppQBLq>}|hb&hy2XPzR1_@gUgH(0LLGB*hpg_}h&{x}PFl4{^V2rNmP`bX+P?3Sb z%X&lom&c9tUR^~DpyQA~8|e*xGaQYpWf<0RPzh^lQ^Ly6DPuW3s1@;a5*G7uky7Z# z4QhVF>QjWn+Oyq<4HwdfEtZo;>{dICIIqWzxNWu_VQsbg#M@#1Nvv-2DPXtZr*IAZ z&xv~ve9qC@|D}AN_LnB@eP26uw7y-}(fm4ucrz-UwHVgif??&I7?$0ogvH-e#ln9~ z!{k2~D@%T^Q{(;GF^Tm{bB5b*y}2%bOc&z+STD5&hZX2_3e=9Etu+SDIs@?9pa(vi z_Cw%ibOOazO-R|M0eRbZL*DGoK)WlJ&3!ba;Oo*DvqP;UqG!4lu88mDr5dI zQ%Qi55e}?UrNS1}jM$A*37zS-U^v?X%;%bd?R-OUT!x1Fc17J2y8*FB10)FNmaGA9W+-C0t<{V@d=WYS- zd7D5se?5dPSPO{@(HQ%p)lj@>71S}oDo50R*J6MPB0*fRKFwM~dlM-z(uF(ObrUPJjR2K|RAuj8I{vCbLA3(e_0R1nB z-v)qw|84~OpG?5uz3J$H^+px2Q2#fb83)c96M&>U4cyG<0U5s(h;D1Z*?kk>eYS&L z=x(r1*b5d}`@pP72TZH>gULZ%Fg~IOMjiTKbin`&Zy=r-g5ev)XT&eVUq<5c-T`;TH1G5%=Fl{#gle30ka?J>gdl9dUe;bb&|3tsOnt;&oWOm_R!>q*`Vn+vtiTEWHcNoxyawpB&EV#>6I}f?z&UImI3(-`T&5n_6&n1ptuXp! z(_sA5`mpH_s}pA5tuC5j(_yfWUGI@ElhI*KHFp+;;*+qVby)to@S^qx;<{)!?f`uF+?F zsmUi?joGk$v-wB6V;1ji&sx5-y>9v1_L=3N?K{f>+i%vrwtsBypksHg;lS=PessVd zrDQHBF{B|pwu}Rj#uSj~%?642B6L8}D&V_r{LN+V_|6h)e4zzskGMtXeQ-@Qd`HMM zdE;DY_R6u+V#uMvY7l?K`Z>PSrXPRB<|)3{<}v=Q?LFLA`y2S*xGsl3_;Vs-g2ZmFBu_vFQ~D` z1LRb*r>?mcy@XQh$1b(D51bF#-E%r&f5-6>?xy2I{57Z7_->~!ju)JMJ9WDJb~;Y@ z?c7Qn9l)cMjIs(P0?3JqQ9=`dCh3B;(a9-B^L_?dE&CMUu=bsly!EAsyL-UPTf5I) zuK$P?VRDb2XmOj8X?=rSV0VpFfxAL%aJWopb-GA6<9vb8<9vqj!ljciLTD%cBph-5 zNo*qjBsP$L5=H}@klUgo7wU!ZMeZ+n#{_hO?bP3q`g1-LVQ{zb7@h zeJ9sZzLTq|-$@m;(E%5<1}u~Yh>#NvKzhQrjfWVG$=~7*%zPhbGJh!AX4%tl=XLjk zXghECdF<;Jiw!OaUNNNj#5v(N2#H` zrc}|sQc4+LDMie$lmg~Ax6uIC70SRx4p6cbxgV5}L~mC6ov?f2NV4{{SILHRo+Vi< zdJyZdwkM3d<8lyZ-&sF_!AXgq*)dUw%@KYy?vQ7aQ=@wpv7S>zs$o@ADw&69<;+fc zDYJ)O%p9Z_vOd#u*`I0I=y>!@?&tt{xiWYlC+>@MC|07~&yA|zQ+AGjpP@PVMW*hI z$LXf?ZzkHW>56vUekP2mbs~tTf7D-McF0F=bI>~+Un_`nuJlTCE%VHCEA}X-7H|(T z^0>#*j9)h^i`&o4a35i&d3<7|cz&iQdw!;k2HKEN1~24-Wypy}AU%oeRX%5IQ+u7W zXTsBb?J0M&4d-1+vt4yA!DU-V6iu^L;jZ5lBr>a$`P)?ahTzL2(Jn=zWY;`FHYJ;1 zLeKE3W2W+svXgli*h#!zcB0ouRy==%8OQ&`h~VVuyCi^<6@18H}du8Ud*yy*_q6 zbV&v!#k-K6D5_?~2@i8(glD-?!iStl(K~je_b@BMdxRP8{fRLez(DswgdAuva>21n zlzyeJRDPGgUb(+?i^{!n^$Ays^yZw+wOnyL!*NSXGI?)(980$%if39JCbrHC3BYFt zDx6bgv7|)5RBEg=j}hfl!48)+a}<(O+z`nfZivqtPOx;C9qcp0LNG@ISjdS>(C%|6 z+67Nor1U*&nbPax)k?jU>y&R+?HGTl?7-~KLi6RVIrz;7(_J;Hk{G(haULdlQ6lS% za6epfXs~m9a1<#zFqs-2ki!U(m9c~T8@U1g9quy!8}9zHS6rEFm@V@kX36|Vn4&LpXBc$@7&y=PgniEMKbhux`21wc73D&Q~vSw8X+ z=4gOBy0#y3;!$%jNSlj&ES!t=SI@)l99*o_)v$HksT%E>traFq8%pdpR^+?vD$J(n zWTmr>l2g1a;}RwIk?{dep)p~u@~Ak9ANo=XNq7-U6jsX-gtfVQg>@rdaQR`wY=L5! zB@7*5js|$5H3&d%Ja!fanX|CBr8BT64b!lm=7re#rp;>Y4O-I=)fg?VsjyjJT;imj zQ{bkZn#(kd%ks2{O!u}6N%eOOND3kPCd9aT$EVWxvH48Tm}-uDOe>cYa|zMU;l>QJ z-J?cW9+4x=(EvWWe$WgI5@ujubEjbst0rN$nkHjihv#9Z4sTR#ZQeVr;h^E7@>;94 zd6kYk(#l9$@x=`N$O3n>kX)fnK(;Slni=FGN{=M*Qj@9Nlw1ZYxst_5KFp>iUqC!X z46_)CBTQ!eC&p-i2&Dmv=@_J--T0!3*sa=$*p-%v*txdZ*zvY?D$T8Xrc|})FDPuZ zSe;pq-tQGuo0b4mn8Ck=3ycB{e)VLABV%qf&-rRVbWjW${FEX(owST1s&)X`(un zoTfUKKB797yr()9eWf_(j}FMDV87!gVh{3ABcW;>cCKk0cH)>ScI5Oltp3ajrSj7| zCggVN%ueYrSsHWPc714@(+*iHSyOzNsmnj)VZ?0~nKPUGttkgX?OhvU9b6hRoE_>* z2)O!2SG)RChzCU5x_7R&wLe_#D@O-HCSp%hm9QJds@R1(HSEM;RjdX1@4AbVvGU7H zl=3fa8JBiZYkKT?qlKYotyjxVJ8Thmy6*BiN!Q|>a6dqA7aF=9_cbLR3$b)M7Gr~N zOSiLYE5=#39dxj2>vXU@cF)1`=vxPi*6)rMEq|Ow<42S-b~hWtE?1~v9gQkj3-aGJ zXH>D0s}r!?o_Sbm&j!`l>l#x+uj$YAzhbe>yBoKT*G1gQzD!f6UE=N~T@>iJT#)KI zUI;d{KObXkb3Wb7@_ey{`T2vEX6HLCO)uQDG(G>;(&X%SYvVIuGa9|g7$a^_u^wUj%QO|G{& z+nsOocj0eIHSBH$Ygyfj*0#8ne!%orv99s$gL+1{JM|6k+|x6<^+wO&<`)C~8-I*O z;|5xTv#6PIr{LO)F<%!b*6Lrjpx$(trwH} z9alK_lh-)(GuPWa^W0?pOuW^iU%tbvKT_SeKY6!dfBqi*ff^0HfwsN6&$|%=dv*Iq zH1D4K4z(f(b(YalCDGch?v4{D?(Xg#>vTFU9k-6VySuv( zgCry&gg}BraCe76W|$df26uN4u)ocB@49Oy@Z(wC{MzSKod({gcGWqJT@jagNbPfB zQvOVylK)Jbmhs$-FX_3RP|S1I!tm$b(m~Gy<@{enDEYjIQ}KL}s_y*)jd?hqYy^ToISKoJb{F&c%$D$&3z2f2i&5n2cgg92j)CpV8@5?c>xPNg`B`o*a1RBZ6Q+32I3c5LYjm* z_)H;y-w4743?N!S58ZMKB|KAA7#O{=sX9WERjrf5e@k9^80$GY9 zs8H#kO|t|;ni-gL8G#L#J~(jefHSuixN~cO504rI@Tfo-k0QkI%0n`*EadP>Lm8hW zH1aKkZvKU^gkKz%{Sbvz?@VRzDAfShMs0BJ z(F5j?0Wg*u0b|A(95p7YDF-&j8DJ zKLJ<9ks#?SZmC|d9wvL z@3aKwK`UUMwgRU=t-y?}2)OFg@K9VD_@jde zF-8}IPAbY-7$SWoAv{bTLK9UWFjo`&D)hjo*$|zS33v>ff%}97xJ_Gv>jo=u-DV9g z`)t0soUr-g@+