Compare commits

...

808 Commits

Author SHA1 Message Date
Sergio De la torre 75258f1763 Merge branch 'dev' 2025-03-25 07:23:08 +01:00
Sergio De la torre 091b597f34 version 25.12 2025-03-24 16:30:26 +01:00
Sergio De la torre b26cf1b76f feat: refs#8213 reservas 2025-03-24 16:29:06 +01:00
Sergio De la torre d3679ae52c feat: refs#8678 ticketAdvance 2025-03-24 12:42:25 +01:00
Sergio De la torre 3ec49358ad feat: refs#6659 defaultComponents 2025-03-24 12:39:01 +01:00
Sergio De la torre 028d0b85aa feat: refs#6802 SalesPerson 2025-03-24 12:35:39 +01:00
Sergio De la torre e78dfdac0e feat: refs#6659 JetPackScreens 2025-03-24 12:35:28 +01:00
Sergio De la torre f499915ef4 feat: refs#6889 addSale 2025-03-24 12:34:48 +01:00
Sergio De la torre 3844855b19 feat: refs#6802 SalesPerson 2025-03-24 12:32:57 +01:00
Sergio De la torre 4ceb51b59e feat: refs#6659 WorkerMistakeScreen 2025-03-24 12:32:19 +01:00
Sergio De la torre 4524e3a887 feat: refs#6659 defaultComponents 2025-03-24 12:29:40 +01:00
Sergio De la torre ad370ba09a feat: refs#6659 DayOfSaleScreen 2025-03-24 12:29:25 +01:00
Sergio De la torre 889dcd1fe8 feat: refs#6659 LocationScreen 2025-03-24 12:28:56 +01:00
Sergio De la torre 097db01ac3 feat: refs#8678 ticketAdvance 2025-03-24 12:25:06 +01:00
Sergio De la torre 49d6e2801d feat: refs#8624 actionCleanShelving 2025-03-24 12:24:44 +01:00
Sergio De la torre 41993fdd07 feat: refs#7823 selectPrinterFreely 2025-03-24 12:19:50 +01:00
Sergio De la torre dd8894ff39 feat: refs#8268 itemShelving_addRefactor 2025-03-24 12:19:25 +01:00
Sergio De la torre 2f639cc1c0 feat: refs#7823 selectPrinterFreely 2025-03-24 12:18:06 +01:00
Sergio De la torre 983043382d feat: refs#7823 selectPrinterFreely 2025-03-24 11:58:12 +01:00
Sergio De la torre 5153bf62a2 feat: refs#6802 DeparmentbySalesPerson 2025-03-24 11:53:25 +01:00
Sergio De la torre 54a679f0ce feat: refs#6802 DeparmentbySalesPerson 2025-03-24 11:53:14 +01:00
Sergio De la torre 36f8a43f34 feat: refs#8676 advanceTicketInChecker 2025-03-21 07:28:16 +01:00
Sergio De la torre 6af6f92192 feat: refs#8276 orderLikeSalix 2025-03-21 07:26:52 +01:00
Sergio De la torre 2a0b251b14 feat: cau#297742 stateSTORED 2025-03-21 07:00:10 +01:00
Sergio De la torre bf5cbf37a8 feat: refs#6845 userInterface 2025-03-14 17:06:16 +01:00
Sergio De la torre aede2d4051 feat: refs#6659 jetPackCompose 2025-03-14 13:38:19 +01:00
Sergio De la torre 16b84ce2ec feat: refs#7823 selectPrinterFreely 2025-03-07 09:17:29 +01:00
Sergio De la torre 31c715c40d feat: refs#7207 errorTicketAdvance 2025-03-05 10:45:13 +01:00
Sergio De la torre c72c76bdb3 feat: refs#7207 errorTicketAdvance 2025-03-05 10:45:00 +01:00
Sergio De la torre ebf09db00d feat: refs#6869 ItemShelving_get 2025-02-28 12:05:09 +01:00
Sergio De la torre 44053fa039 feat: refs#8301 getItemsByReview 2025-02-28 12:01:39 +01:00
Sergio De la torre f9e19bb9ca feat: refs#6861 reservas 2025-02-28 09:18:06 +01:00
Sergio De la torre c3ea43e7e1 feat: refs#8020 deprecatedControlVehicle 2025-02-28 09:08:42 +01:00
Sergio De la torre 04380327ab feat: refs#8624 cleanAction 2025-02-28 09:06:23 +01:00
Sergio De la torre 8d1110d09e feat: refs#8624 cleaAction 2025-02-28 09:05:56 +01:00
Sergio De la torre 12e5241a10 feat: refs#8678 ticketAdvance 2025-02-28 09:05:02 +01:00
Sergio De la torre 612b2ac8f2 feat: refs#6861 reservas 2025-02-28 09:04:15 +01:00
Sergio De la torre ad42096eca feat: refs#6861 reservas 2025-02-28 09:02:05 +01:00
Sergio De la torre a7f476417e feat: refs#8639 scanSpeed 2025-02-28 08:53:17 +01:00
Sergio De la torre a6ad406623 feat: refs#8639 scanSpeed 2025-02-28 08:46:00 +01:00
Sergio De la torre fbd7a8d95c feat: refs#8639 scanSpeed 2025-02-28 08:41:35 +01:00
Sergio De la torre 009c221de3 feat: refs#8678 ticketAdvance 2025-02-28 08:28:04 +01:00
Sergio De la torre 1689d100d5 feat: refs#8182 CliclableZone 2025-02-24 07:29:33 +01:00
Sergio De la torre feedd08879 Merge branch 'dev' 2025-02-20 09:56:45 +01:00
Sergio De la torre 1ab7280d66 feat: refs#8213 sipCalls 2025-02-20 09:50:24 +01:00
Sergio De la torre 24ec314f34 feat: refs #5443 collectionFragmentChecker 2025-02-20 09:49:48 +01:00
Sergio De la torre c3a4366d7d feat: refs #6659 jetPackCompose 2025-02-20 09:48:33 +01:00
Sergio De la torre 6d4277cf91 feat: refs #6659 jetPackCompose 2025-02-20 09:48:14 +01:00
Sergio De la torre 54687e2e05 feat: refs #8212 showWarningUdate 2025-02-20 09:48:08 +01:00
Sergio De la torre e0b148ddfd feat: refs #6659 jetPackCompose 2025-02-20 09:47:18 +01:00
Sergio De la torre 0b42a3c61b feat: refs #7572 refactorUploadFront 2025-02-20 09:46:28 +01:00
Sergio De la torre d49d6cf0ba feat: refs #6659 jetPackCompose 2025-02-20 09:44:27 +01:00
Sergio De la torre df8dc7cc77 feat: refs #6659 jetPackCompose 2025-02-20 09:44:07 +01:00
Sergio De la torre 0c8df1c7a1 feat: refs#7412 notificationsQueue 2025-02-20 09:43:18 +01:00
Sergio De la torre 5d600359fa feat: refs #6659 jetPackCompose 2025-02-20 09:34:41 +01:00
Sergio De la torre f55bd3768f feat: refs #8300 crashlytics 2025-02-14 12:15:29 +01:00
Sergio De la torre 6233545418 feat: refs #7920 shelvingFkMerge 2025-02-14 12:15:06 +01:00
Sergio De la torre 2295497e62 feat: refs #7920 shelvingFkMerge 2025-02-14 11:58:41 +01:00
Sergio De la torre aae791f721 feat: refs #7572 refactorUploadFront 2025-02-14 11:57:36 +01:00
Sergio De la torre f96d809afe feat: refs #7572 refactorUploadFront 2025-02-14 11:57:29 +01:00
Sergio De la torre 6f155fbe36 feat: refs #8300 crashlytics 2025-02-07 16:57:14 +01:00
Sergio De la torre a97b823695 feat: refs #8300 crashlytics 2025-02-07 16:51:50 +01:00
Sergio De la torre 1943296492 feat: refs#8300 crashlyticsReview 2025-02-07 16:39:56 +01:00
Sergio De la torre 568c3e687b feat: refs#8300 crashlyticsReview 2025-02-07 13:47:54 +01:00
Sergio De la torre ab262dc328 feat: refs#8300 deprecatedCode 2025-02-05 10:40:17 +01:00
Sergio De la torre ed6171da78 feat: refs#8300 deprecatedCode 2025-02-05 10:37:42 +01:00
Sergio De la torre b6115837ae feat: refs#8082 TicketPickupResponse 2025-02-04 11:57:45 +01:00
Sergio De la torre 103df4e31e feat: refs#7412 notificationQueue 2025-02-03 16:37:01 +01:00
Sergio De la torre 2d9870a930 feat: refs#7412 notificationQueue 2025-02-03 16:36:53 +01:00
Sergio De la torre 884d6abdd9 feat: refs#6413 refactorUbicador 2025-01-31 08:18:31 +01:00
Sergio De la torre 136d2de399 feat: refs#8213 newUI 2025-01-31 08:18:07 +01:00
Sergio De la torre 455f72c352 feat: refs#7920 shelvingFk 2025-01-31 07:43:39 +01:00
Sergio De la torre d9abe0ab08 feat: refs#7371 updateSaleIU 2025-01-31 07:42:22 +01:00
Sergio De la torre ff9849589e feat: refs#7371 updateSaleIU 2025-01-31 07:32:11 +01:00
Sergio De la torre 43b1d828e8 feat: refs#8455 setLinkSalix 2025-01-31 07:21:03 +01:00
Sergio De la torre 26151605fa feat: refs#8455 setLinkSalix 2025-01-31 07:20:19 +01:00
Sergio De la torre b03d1c48c5 feat: refs#8213 strings 2025-01-31 07:18:39 +01:00
Sergio De la torre ab064e52aa feat: refs#8682 refactorWebFragment 2025-01-27 16:49:10 +01:00
Sergio De la torre 0fe4c3c7d3 feat: refs#6413 refactorUbicador 2025-01-27 07:37:43 +01:00
Sergio De la torre a0ae1e37f1 feat: refs#8290 expeditionLost 2025-01-27 07:36:44 +01:00
Sergio De la torre 361ebddd2f feat: refs#8455 webSalixLog 2025-01-22 07:53:25 +01:00
Sergio De la torre 611e6d2993 feat: refs#6413 refactorUbicador 2025-01-17 10:55:31 +01:00
Sergio De la torre 18ebdfc92a feat: refs#6861 reservas 2025-01-13 16:41:55 +01:00
Sergio De la torre 0cdec41ca0 feat: refs#8385 webView 2025-01-13 16:41:39 +01:00
Sergio De la torre 0709fe3127 feat: refs#4488 packingMistake 2025-01-13 16:39:27 +01:00
Sergio De la torre 298e17210a feat: refs#6861 reservas 2025-01-13 16:38:45 +01:00
Sergio De la torre df764e0960 feat: refs#6413 refactorUbicador 2025-01-09 16:23:11 +01:00
Sergio De la torre 8e413e7f60 feat: refs#8301 deprecatedOlderItem 2025-01-02 13:55:53 +01:00
Sergio De la torre 083317beb2 Merge branch 'dev'
# Conflicts:
#	app/build.gradle
2024-12-29 08:28:23 +01:00
Sergio De la torre 180c7bba8e version 24.51 2024-12-12 17:09:29 +01:00
Sergio De la torre a4a9b1aa18 version 24.51 2024-12-12 17:09:14 +01:00
Sergio De la torre daaf954def feat: refs#8188 pickingOrder 2024-12-12 17:08:31 +01:00
Sergio De la torre f91a97e5e9 feat: refs#6869 itemShelvingModel 2024-12-12 17:07:14 +01:00
Sergio De la torre 07027e8a8c feat: refs#6845 userInterface 2024-12-12 17:03:54 +01:00
Sergio De la torre f94cee238e feat: refs #6861 reservas 2024-12-12 17:02:39 +01:00
Sergio De la torre e6fc241e92 feat: refs #7146 dated 2024-12-12 17:02:18 +01:00
Sergio De la torre 64f2b9582e feat: refs #6861 reservas 2024-12-12 17:01:46 +01:00
Sergio De la torre b0dea86050 feat: refs #8175 updateLibraries 2024-12-12 17:00:37 +01:00
Sergio De la torre 3109611794 feat: refs #6861 reservas 2024-12-12 16:59:58 +01:00
Sergio De la torre 86af06b3ce feat: refs #7146 dated 2024-12-12 16:59:23 +01:00
Sergio De la torre 19adf86f9f feat: refs #6845 userIterface 2024-12-12 16:55:08 +01:00
Sergio De la torre 8aa5a3b01a feat: refs #8175 updateLibraries 2024-12-12 16:54:35 +01:00
Sergio De la torre 241bd26b1f feat: refs #8175 updateLibraries 2024-12-12 16:54:26 +01:00
Sergio De la torre 88ef5230f9 feat: refs #8175 updateLibraries 2024-12-12 16:53:24 +01:00
Sergio De la torre 01aa6eaab6 feat: refs #8188 orderPicking 2024-12-12 16:52:15 +01:00
Sergio De la torre 9e23313c3b feat: refs #8188 orderPicking 2024-12-12 16:51:26 +01:00
Sergio De la torre b6ad9a9122 feat: refs #7920 itemShelvingGet 2024-12-10 07:58:34 +01:00
Sergio De la torre 25cec0a709 feat: refs #7920 itemShelvingGet 2024-12-10 07:58:10 +01:00
Sergio De la torre b4f811b7b8 feat: refs #7920 itemShelvingGet 2024-12-10 07:57:03 +01:00
Sergio De la torre 32edc951f2 feat: refs #7920 itemShelvingGet 2024-12-10 07:55:33 +01:00
Sergio De la torre 7e738a50d8 feat: refs #6934 inventary 2024-12-03 07:15:27 +01:00
Sergio De la torre 8b101d5625 feat: refs #6845 userIterface 2024-12-03 07:03:52 +01:00
Sergio De la torre 40dedad49f feat: refs #8175 updateLibraries 2024-12-02 18:16:35 +01:00
Sergio De la torre f16bb64b49 feat: refs #7920 itemShelvingGet 2024-12-02 18:15:53 +01:00
Sergio De la torre a1c01d1154 feat: refs #6845 userIterface 2024-12-02 18:15:38 +01:00
Sergio De la torre 969660ae77 feat: refs #8085 restaurantActivity 2024-12-02 18:14:28 +01:00
Sergio De la torre d4a7789101 feat: refs #7920 itemShelvingGet 2024-12-02 18:14:09 +01:00
Sergio De la torre 442820db4e feat: refs #6869 itemShelvingGet 2024-11-26 10:59:13 +01:00
Sergio De la torre 7bde4f2939 feat: refs #8175 updateLibraries 2024-11-26 10:59:06 +01:00
Sergio De la torre 7a2249b6ce feat: refs #6869 itemShelvingGet 2024-11-26 10:57:48 +01:00
Sergio De la torre 6993d2af58 feat: refs #7950 cmr 2024-11-26 10:57:35 +01:00
Sergio De la torre f8a87de356 feat: refs #7266 printItem 2024-11-26 10:57:07 +01:00
Sergio De la torre 7bfd17d1f7 feat: refs #6869 itemShelvingGet 2024-11-26 10:56:53 +01:00
Sergio De la torre 183b265ba9 feat: refs #7920 itemShelvingGet 2024-11-26 10:56:20 +01:00
Sergio De la torre 7f1ad2b049 feat: refs #7920 itemShelvingGet 2024-11-26 10:55:34 +01:00
Sergio De la torre 9306c6de4f feat: refs #7920 itemShelvingGet 2024-11-26 10:55:23 +01:00
Sergio De la torre 35fce7e656 feat: refs #7920 itemShelvingGet 2024-11-26 10:54:50 +01:00
Sergio De la torre 72ff345744 feat: refs #7922 scanOrder 2024-11-22 06:30:49 +01:00
Sergio De la torre 1996cce12f feat: refs #7922 scanOrder 2024-11-22 06:30:45 +01:00
Sergio De la torre de57f6b132 feat: refs #5443 collectionFragmentChecker 2024-11-22 06:27:50 +01:00
Sergio De la torre c45d9f4f09 feat: refs #7920 itemShelvingGet 2024-11-22 06:27:22 +01:00
Sergio De la torre d4ed3d3a92 feat: refs #8085 restaurantActivity 2024-11-20 10:06:25 +01:00
Sergio De la torre 84a2b8ca82 feat: refs #6869 itemShelvings 2024-11-20 08:16:40 +01:00
Sergio De la torre 41f9fb4a9a feat: refs #8099 addSalarySupplement 2024-11-20 08:10:34 +01:00
Sergio De la torre 7f0f69ae6f feat: refs #8150 moveExpedition 2024-11-20 08:10:16 +01:00
Sergio De la torre e72acd21f3 feat: refs #8175 refactorCode 2024-11-20 08:09:51 +01:00
Sergio De la torre a960ff43a7 feat: refs #8176 refactorSearchDialog 2024-11-20 08:08:52 +01:00
Sergio De la torre bd4ffa35bf feat: refs #8175 refactorCode 2024-11-20 08:08:17 +01:00
Sergio De la torre 2bfa6c8373 feat: refs #8022 kotlin versionCatalog 2024-11-20 08:04:35 +01:00
Sergio De la torre 622bb221ab feat: refs#6845 userInterface 2024-11-20 08:03:45 +01:00
Sergio De la torre f2eb4d4c11 feat: refs#8213 reservas 2024-11-20 08:01:29 +01:00
Sergio De la torre 2c32244617 feat: refs #8182 zoneClickable 2024-11-20 07:58:36 +01:00
Sergio De la torre 61e6aa2a5a feat: refs #8176 refactorSearchDialog 2024-11-20 07:55:47 +01:00
Sergio De la torre 7837a11254 feat: refs #8176 refactorSearchDialog 2024-11-14 12:17:30 +01:00
Sergio De la torre 59deb90428 feat: refs #8176 refactorSearchDialog 2024-11-14 12:17:26 +01:00
Sergio De la torre 83bc9d9de4 feat: refs #8082 ticketPickup 2024-11-13 08:08:20 +01:00
Sergio De la torre afc8abe090 feat: refs #8099 addSalarySupplement 2024-11-08 10:51:27 +01:00
Sergio De la torre 26e13bb7d0 feat: refs #8150 moveExpeditions 2024-11-08 10:51:11 +01:00
Sergio De la torre d0e5e5d748 feat: refs #8099 addSalarySupplement 2024-11-07 09:50:30 +01:00
Sergio De la torre 5f614e0d6d feat: refs #6845 userIterface 2024-11-06 07:18:03 +01:00
Sergio De la torre c82c591c71 feat: refs #8175 crashlyticsAndUpdate 2024-11-04 09:18:39 +01:00
Sergio De la torre 7c2e418e87 feat: refs #7266 printItem 2024-11-04 09:17:24 +01:00
Sergio De la torre 1f4663e68f feat: refs #8176 refactorSearchDialog 2024-11-04 09:15:35 +01:00
Sergio De la torre c2bdb0766f feat: refs #8176 refactorSearchDialog 2024-11-04 09:15:03 +01:00
Sergio De la torre 233399dcb3 feat: refs #8176 refactorSearchDialog 2024-11-04 09:13:59 +01:00
Sergio De la torre ca91beddf3 feat: refs #6861 reservas 2024-10-30 06:24:26 +01:00
Sergio De la torre cb328f13a3 feat: refs #5443 collectionFragmentChecker 2024-10-29 09:04:55 +01:00
Sergio De la torre 9d84ce3a0d feat: refs #8020 controlVehiculos 2024-10-29 09:01:29 +01:00
Sergio De la torre 071295c521 feat: refs #6861 reservas 2024-10-29 09:01:23 +01:00
Sergio De la torre ccf56fdebf feat: refs #8020 controlVehiculos 2024-10-29 08:59:33 +01:00
Sergio De la torre 8cecd276b0 feat: refs #6861 reservas 2024-10-29 08:58:33 +01:00
Sergio De la torre 8e0ffe8f49 feat: refs #7922 scanOrder 2024-10-29 08:57:25 +01:00
Sergio De la torre 3f88449718 version 24.40 2024-10-21 12:33:14 +02:00
Sergio De la torre bdbe219549 Merge branch 'dev_6078'
# Conflicts:
#	app/build.gradle
2024-10-21 12:18:12 +02:00
Sergio De la torre 9f3d147d4c version 24.40 2024-10-21 12:09:29 +02:00
Sergio De la torre 874a8347a5 feat: refs #6861 reservas 2024-10-21 12:09:07 +02:00
Sergio De la torre 2f7b8ccc38 feat: refs #6861 reservas 2024-10-21 12:08:46 +02:00
Sergio De la torre f86dc34a1d feat: refs #8085 restaurant 2024-10-21 12:07:43 +02:00
Sergio De la torre ab6940b7db feat: refs #6861 reservas 2024-10-21 12:06:47 +02:00
Sergio De la torre 937b06c198 feat: refs #5216 changeState 2024-10-16 13:45:53 +02:00
Sergio De la torre d7ca5c3e08 feat: refs #6861 reservas 2024-10-16 11:40:48 +02:00
Sergio De la torre 24ccf9ce2f feat: refs #7524 getSuppliers 2024-10-16 11:40:13 +02:00
Sergio De la torre abab532379 feat: refs #5443 refactor 2024-10-16 11:39:23 +02:00
Sergio De la torre 02306e8351 feat: refs #6861 reservas 2024-10-16 11:37:43 +02:00
Sergio De la torre 0c198b4101 feat: refs #8090 deleteEpxpedition 2024-10-16 11:34:52 +02:00
Sergio De la torre 7805b78cdf feat: refs #6868 handleUser 2024-10-16 11:34:45 +02:00
Sergio De la torre 2c0f2cc72d feat: boxPickingPrepared refs #7855 2024-10-16 11:33:38 +02:00
Sergio De la torre d077225e9e feat: refs #7956 getSimilar 2024-10-16 11:33:04 +02:00
Sergio De la torre 91f3da78cf feat: refs #8090 deleteEpxpedition 2024-10-16 11:30:53 +02:00
Sergio De la torre 2ee835bbb9 feat: refs #6868 handleUser 2024-10-16 11:29:16 +02:00
Sergio De la torre 0c1f054b7f feat: refs #6868 handleUser 2024-10-16 11:24:59 +02:00
Sergio De la torre aa04349845 feat: refs #8085 restaurant 2024-10-08 08:20:48 +02:00
Sergio De la torre c4bbffc98f feat: boxPicking refs #7855 2024-10-02 10:55:21 +02:00
Sergio De la torre e6cf5ef2fb feat reservas refs #6861 2024-09-24 10:31:04 +02:00
Sergio De la torre 28ad29c686 feat: boxPickingPrepared refs #7855 2024-09-24 10:30:27 +02:00
Sergio De la torre 45e26bbd49 feat: vehicleControl refs #7986 2024-09-24 10:30:13 +02:00
Sergio De la torre eb729acc59 feat: boxPickingPrepared refs #7855 2024-09-24 10:27:10 +02:00
Sergio De la torre 50beca0cf3 feat: boxPickingPrepared refs #7855 2024-09-24 10:27:05 +02:00
Sergio De la torre 9ce0349f41 feat: boxPickingPrepared refs #7855 2024-09-24 10:25:52 +02:00
Sergio De la torre 3f8292c261 feat: boxPickingPrepared refs #7855 2024-09-24 10:25:26 +02:00
Sergio De la torre fceab8c182 feat: boxPickingPrepared refs #7855 2024-09-24 10:24:42 +02:00
Sergio De la torre 657deb8541 feat: version 23.38 scrollUbicator 2024-09-19 13:22:09 +02:00
Sergio De la torre e77aae4826 feat: refs #7763 rename 2024-09-19 13:00:35 +02:00
Sergio De la torre 746972d226 feat: #refs 6861 reservas 2024-09-19 13:00:09 +02:00
Sergio De la torre 2c42f3b54b feat: refs #7827 responseItem 2024-09-19 12:59:18 +02:00
Sergio De la torre f79292d4e2 feat: refs #7763 rename 2024-09-18 13:18:07 +02:00
Sergio De la torre c42061a8d1 feat: refs #7763 rename 2024-09-18 13:17:49 +02:00
Sergio De la torre 03d814d5ed feat: refs #6078 workerActivity 2024-09-18 13:17:33 +02:00
Sergio De la torre 7ee7e8336a feat: refs #7827 responseItem 2024-09-18 13:17:09 +02:00
Sergio De la torre 3f8d3737f6 feat: refs #6769 refactor Item_getBalance 2024-09-18 13:09:30 +02:00
Sergio De la torre 2246c21986 feat: refs #7926 parkingSaleGroup 2024-09-18 13:06:46 +02:00
Sergio De la torre 3e25daa75c feat: refs #7763 rename 2024-09-18 11:00:42 +02:00
Sergio De la torre b9072ecb7f feat: refs #7763 rename 2024-09-18 10:38:14 +02:00
Sergio De la torre 251cdd32ee feat: refs #7763 rename 2024-09-18 10:37:51 +02:00
Sergio De la torre 98ecb8e365 feat: loginApp refs #6868 2024-09-13 11:54:04 +02:00
Sergio De la torre 75a621094c feat: multipleShelvingsAdd refs #7805 2024-09-13 11:41:45 +02:00
Sergio De la torre 81758cf340 feat: refactorResponse refs #7827 2024-09-10 07:19:28 +02:00
Sergio De la torre 5b8c089734 feat: refactorResponse Paletizado refs #7827 2024-09-10 07:18:42 +02:00
Sergio De la torre e18125420b feat: refactorResponse PasillerosItem refs #7827 2024-09-10 07:14:54 +02:00
Sergio De la torre 8052477b7f feat: boxPickingPrepared refs #7855 2024-09-04 13:21:42 +02:00
Sergio De la torre 48a88985ad feat: boxPickingPrepared refs #7855 2024-09-04 12:20:13 +02:00
Sergio De la torre f569c45f80 feat: regularizar Parking #7817 2024-09-02 07:50:39 +02:00
Sergio De la torre f3882c7f9a feat: refactorResponse packaging refs #7827 2024-08-14 13:05:54 +02:00
Sergio De la torre 6dc39d6611 feat: refactorResponse Delivery, Inventary,historical refs #7827 2024-08-14 12:04:46 +02:00
Sergio De la torre bcecf2ed6c feat: refactorResponse WebFragment && sipExtension refs #7827 2024-08-14 08:50:07 +02:00
Sergio De la torre d2e875c812 feat: refactorResponse WebFragment && sipExtension refs #7827 2024-08-14 08:49:26 +02:00
Sergio De la torre c20b7b1b5e feat: refactorResponse Claim refs #7827 2024-08-14 07:19:47 +02:00
Sergio De la torre da3bff7f17 feat issues refs #7636 2024-08-14 07:16:21 +02:00
Sergio De la torre e47c6da01e feat issues refs #7636 2024-08-14 06:59:05 +02:00
Sergio De la torre bb44fbd56a feat refactorResponse login #refs 7827 2024-08-13 06:57:35 +02:00
Sergio De la torre c3eaea124e feat refactorResponse login #refs 7827 2024-08-12 13:40:48 +02:00
Sergio De la torre 48e2a10102 feat reservas #refs 6861 2024-08-12 12:38:48 +02:00
Sergio De la torre 671a732816 feat issues refs #7636 2024-08-12 12:32:39 +02:00
Sergio De la torre 838caaa516 feat issues refs #7636 2024-08-12 12:32:29 +02:00
Sergio De la torre 3512e61875 feat issues refs #7636 2024-08-12 12:32:09 +02:00
Sergio De la torre e2f4a0f43a feat workerActivity refs #6078 2024-08-09 12:14:29 +02:00
Sergio De la torre c23dfa8a5f version24.32 2024-08-09 08:10:44 +02:00
Sergio De la torre aefc872465 feat reservas refs #6861 2024-08-08 17:32:15 +02:00
Sergio De la torre 56fe4c3486 feat issues refs #7636 2024-08-08 17:32:04 +02:00
Sergio De la torre 6331fee2e1 feat reservas refs #6861 2024-08-08 17:31:43 +02:00
Sergio De la torre 60bdd285bf feat reservas refs #6861 2024-08-07 11:53:21 +02:00
Sergio De la torre cf5d2e622c feat boxPickingCheck refs #7751 2024-08-07 11:51:47 +02:00
Sergio De la torre 48392b5480 feat issues refs #7636 2024-08-07 11:50:37 +02:00
Sergio De la torre 1bd592db0f feat issues refs #7636 2024-08-07 11:50:26 +02:00
Sergio De la torre a2aae3bd73 feat boxPickingCheck refs #7751 2024-08-07 11:47:59 +02:00
Sergio De la torre eabb1db02a feat boxPickingCheck refs #7751 2024-08-07 11:46:53 +02:00
Sergio De la torre a9feca596a feat issues refs #7636 2024-07-31 12:15:58 +02:00
Sergio De la torre 3203e35698 feat multipleUbicator refs #7805 2024-07-31 12:15:51 +02:00
Sergio De la torre ec6b61b414 feat itemShelvingLog refs #7168 2024-07-31 12:12:18 +02:00
Sergio De la torre c87707a0ca feat webSalix in webView refs #7636 2024-07-31 12:08:31 +02:00
Sergio De la torre d2cd21f2eb feat issues refs #7636 2024-07-31 12:07:20 +02:00
Sergio De la torre f5bc472f53 feat issues refs #7636 2024-07-24 13:32:52 +02:00
Sergio De la torre 1410eec595 feat issues refs #7636 2024-07-24 13:32:32 +02:00
Sergio De la torre cdc5ebcd57 feat 2factor refs #7775 2024-07-24 13:29:32 +02:00
Sergio De la torre 3cc2717a90 feat itemGetBalance refs #6769 2024-07-23 13:48:06 +02:00
Sergio De la torre 75c5d9ffd7 version 24.30 2024-07-23 08:48:35 +02:00
Sergio De la torre 03b3ac7a81 feat reservas refs #6861 2024-07-23 08:48:13 +02:00
Sergio De la torre 401d062115 feat claimObservation refs #7541 2024-07-23 08:47:23 +02:00
Sergio De la torre 3ed094444b feat issues refs #7636 2024-07-23 08:45:21 +02:00
Sergio De la torre c35b763376 feat issues refs #7636 2024-07-23 08:44:49 +02:00
Sergio De la torre 5e778d2ba6 feat claimObservation refs #7541 2024-07-23 08:41:33 +02:00
Sergio De la torre 9ccc8e83b3 feat issues refs #7636 2024-07-23 08:40:48 +02:00
Sergio De la torre 6c3952d10d feat reservas #refs 6861 2024-07-19 16:29:26 +02:00
Sergio De la torre b9da8267eb feat issues refs #7636 2024-07-19 16:26:27 +02:00
Sergio De la torre 9c84f25c0c feat getAddress #refs 7622 2024-07-19 16:26:16 +02:00
Sergio De la torre 962ba75bfa feat reservas #refs 6861 2024-07-19 16:25:49 +02:00
Sergio De la torre 0ece5eb7a4 feat Rename refs #7763 2024-07-19 16:23:50 +02:00
Sergio De la torre 31739faa0a feat barCode in ItemShelvingLog refs #7739 2024-07-19 16:23:23 +02:00
Sergio De la torre 52c9cbf859 feat Rename refs #7763 2024-07-19 16:22:11 +02:00
Sergio De la torre fc98bd5162 feat Rename refs #7763 2024-07-19 16:21:36 +02:00
Sergio De la torre 62c14fea4d feat issues refs #7636 2024-07-19 16:21:10 +02:00
Sergio De la torre ed87bcb914 feat boxPickingCheck refs #7751 2024-07-19 16:18:25 +02:00
Sergio De la torre e2d2fd8d33 feat isF11Allowed refs #6435 2024-07-16 07:18:37 +02:00
Sergio De la torre 89a4cff1ed feat Ticketobservation refs #7541 2024-07-10 10:59:10 +02:00
Sergio De la torre 3e37ca1c3d feat version24.28 2024-07-10 07:37:05 +02:00
Sergio De la torre 06f5100936 feat inventory #refs 7023 2024-07-10 07:36:16 +02:00
Sergio De la torre 432a58f2e7 feat issues refs #7636 2024-07-10 07:36:05 +02:00
Sergio De la torre bac377d47f feat reservas #refs 6861 2024-07-10 07:35:56 +02:00
Sergio De la torre 7ba19ba370 feat roadMap #refs 7195 2024-07-10 07:35:21 +02:00
Sergio De la torre 43a2eecf3f feat inventory #refs 7023 2024-07-10 07:34:50 +02:00
Sergio De la torre 7e82b75228 feat inventory #refs 7023 2024-07-10 07:34:19 +02:00
Sergio De la torre 67bf5a9a1c feat itemShelvingLog #refs 7597 2024-07-10 07:32:52 +02:00
Sergio De la torre 67cd2b1fd2 feat issues refs #7636 2024-07-10 07:27:21 +02:00
Sergio De la torre dfd676613f feat issues refs #7636 2024-07-05 13:29:14 +02:00
Sergio De la torre 648c4243c1 feat reservas #refs 6861 2024-07-05 13:28:40 +02:00
Sergio De la torre 088bf86b2b feat boxPicking #refs 7357 2024-07-05 13:28:07 +02:00
Sergio De la torre 82a3e9e7ad feat roadMap #refs 7195 2024-07-05 13:26:35 +02:00
Sergio De la torre 7a16d32d26 feat roadMap #refs 7195 2024-07-05 13:26:06 +02:00
Sergio De la torre e8a169e274 feat itemToBarCode refs #7614 2024-07-05 13:25:19 +02:00
Sergio De la torre d1a3c5fde4 feat issues refs #7636 2024-07-04 07:34:09 +02:00
Sergio De la torre caf220442a feat itemToBarCode refs #7614 2024-07-04 07:33:39 +02:00
Sergio De la torre 566c90aed4 feat itemToBarCode refs #7614 2024-07-04 07:33:20 +02:00
Sergio De la torre a7c66ff0b2 feat issues refs #7636 2024-07-03 07:31:18 +02:00
Sergio De la torre 6f0310cb14 feat itemShelvingLog #refs 7597 2024-07-03 07:30:07 +02:00
Sergio De la torre 8275340f0e feat ticketQr #refs 6602 2024-07-02 12:20:11 +02:00
Sergio De la torre 1f81ac53cb feat roadMap #refs 7195 2024-07-02 12:19:22 +02:00
Sergio De la torre 8eb5866fad feat issues refs #7636 2024-07-01 11:48:47 +02:00
Sergio De la torre 916f20ea70 feat issues refs #7636 2024-07-01 11:48:41 +02:00
Sergio De la torre 56b8f97039 feat issues refs #7636 2024-06-28 10:16:19 +02:00
Sergio De la torre 8a070607c8 version 24.26 2024-06-27 16:35:38 +02:00
Sergio De la torre a26a1b2198 feat issues refs #6810 2024-06-27 16:23:49 +02:00
Sergio De la torre fb421bd6cb feat nameWorker refs #7597 2024-06-27 07:04:33 +02:00
Sergio De la torre f48aea9414 feat reservas refs #6810 2024-06-27 07:02:46 +02:00
Sergio De la torre eb787e04cc feat crashlytics refs #6810 2024-06-26 12:35:59 +02:00
Sergio De la torre a5d11b1613 feat parkingHasOlder refs #6964 2024-06-26 12:35:59 +02:00
Sergio De la torre c9255c9ba3 feat qr previa refs #6477 2024-06-26 12:35:57 +02:00
Sergio De la torre 2333e3b878 feat itemShelvingLog refs #7168 2024-06-26 07:03:49 +02:00
Sergio De la torre 10cf8ddbda feat packaging refs #4021 2024-06-26 07:01:01 +02:00
Sergio De la torre 08c3d2d4fb feat crashlytics refs #6810 2024-06-24 16:06:34 +02:00
Sergio De la torre 53b81e42be feat itemShelvingFilter refs #7023 2024-06-24 15:42:42 +02:00
Sergio De la torre d52bdbc546 feat packing refs #4021 2024-06-24 15:42:10 +02:00
Sergio De la torre 59b91ffc61 feat crashlytics refs #6810 2024-06-24 15:41:08 +02:00
Sergio De la torre 4416820122 feat printerEmergency refs #7023 2024-06-24 15:31:31 +02:00
Sergio De la torre 54b7907866 feat printerEmergency refs #7539 2024-06-21 11:43:55 +02:00
Sergio De la torre 687bd6fc4b feat boxPicking refs #7357 2024-06-20 16:55:24 +02:00
Sergio De la torre 4d1f22f529 feat onChecking refs #7371 2024-06-19 11:01:24 +02:00
Sergio De la torre 4640cffc30 feat qr previa refs $6477 2024-06-19 08:49:08 +02:00
Sergio De la torre 0e97150278 feat tasksRedmine 2024-06-19 07:03:19 +02:00
Sergio De la torre f4e97d1778 feat notes refs #6921 2024-06-18 12:49:48 +02:00
Sergio De la torre 8942218f7b feat helperPicker refs #6992 2024-06-18 12:48:11 +02:00
Sergio De la torre 03e6a9b81c clear data app 2024-06-18 12:47:12 +02:00
Sergio De la torre 217688b103 feat qr #refs 7520 2024-06-18 12:45:38 +02:00
Sergio De la torre 08ac21bbb7 feat #refs 6889 2024-06-18 12:45:13 +02:00
Sergio De la torre cf8d92ce25 feat loginApp #refs 6868 2024-06-18 12:44:52 +02:00
Sergio De la torre 5dfae7102b feat historical #refs 7168 2024-06-18 12:44:32 +02:00
Sergio De la torre 9c15e716cf feat embalajes #refs 4021 2024-06-18 12:44:08 +02:00
Sergio De la torre 3100311732 feat isScanned #refs 7276 2024-06-18 12:43:22 +02:00
Sergio De la torre 36dbab13a7 feat qr #refs 7520 2024-06-18 12:43:01 +02:00
Sergio De la torre d8f66b63c2 feat hasItemOlder #refs 6964 2024-06-18 12:42:46 +02:00
Sergio De la torre 87812e1b04 feat embalajes #refs 4021 2024-06-18 12:42:12 +02:00
Sergio De la torre bf20906042 feat parkingShelving #refs 6382 2024-06-18 12:41:44 +02:00
Sergio De la torre b796623e13 feat roadMap #refs 7296 2024-06-18 12:41:00 +02:00
Sergio De la torre ebb0e6bc31 feat historical #refs 7168 2024-06-18 12:36:37 +02:00
Sergio De la torre 78f225ffa9 feat isScanned #refs 7276 2024-06-18 12:35:07 +02:00
Sergio De la torre 5cac424387 feat roadMap #refs 7296 2024-06-18 12:34:47 +02:00
Sergio De la torre c4258e9056 feat isScanned #refs 7276 2024-06-18 12:34:33 +02:00
Sergio De la torre c34a52bde1 feat loginApp #refs 6868 2024-06-18 12:33:40 +02:00
Sergio De la torre 284d4509b1 feat qr #refs 7520 2024-06-18 12:31:40 +02:00
Sergio De la torre 3bed3d96b4 feat historical #refs 7168 2024-06-18 12:31:22 +02:00
Sergio De la torre 2695a96f39 feat embalajes #refs 4021 2024-06-18 12:31:05 +02:00
Sergio De la torre ed88d17566 feat roadMap #refs 7296 2024-06-18 12:30:39 +02:00
Sergio De la torre 95c02274d8 feat qr #refs 7520 2024-06-18 12:30:27 +02:00
Sergio De la torre cc8e8aa2b3 feat qr #refs 7520 2024-06-18 12:29:31 +02:00
Sergio De la torre 47210cc26e feat qr #refs 7520 2024-06-18 12:29:21 +02:00
Sergio De la torre d81c537e4f feat hasItemOlder #refs 6964 2024-06-18 12:28:26 +02:00
Sergio De la torre 88801796d5 feat historical #refs 7168 2024-06-18 12:27:17 +02:00
Sergio De la torre 76c496df89 feat inventoryParking #refs 6193 2024-06-18 12:23:54 +02:00
Sergio De la torre d44e145793 feat qr #refs 7520 2024-06-18 12:23:12 +02:00
Sergio De la torre 6a5817844e feat inventoryParking #refs 6193 2024-06-18 12:18:33 +02:00
Sergio De la torre 915aad5a32 feat onBack #refs 6530 2024-06-18 12:17:33 +02:00
Sergio De la torre fcf91a18d8 feat embalajes #refs 4021 2024-06-18 12:16:33 +02:00
Sergio De la torre f695dbdda3 feat ChangeCategory #refs 5670 2024-06-18 12:15:20 +02:00
Sergio De la torre e940e9ec26 feat qr #refs 7520 2024-06-18 12:14:04 +02:00
Sergio De la torre 413f9b767e feat embalajes #refs 4021 2024-06-18 12:07:44 +02:00
Sergio De la torre 050e7d1dab feat roadMap #refs 7296 2024-06-18 12:07:07 +02:00
Sergio De la torre ee7bbf69a0 feat embalajes #refs 4021 2024-06-18 12:05:00 +02:00
Sergio De la torre c405f1ede4 feat roadMaps #refs 7195 2024-06-04 14:01:07 +02:00
Sergio De la torre 1524ab3284 feat roadMaps #refs 7195 2024-06-04 14:00:40 +02:00
Sergio De la torre 305feb1ac2 feat changeCategory #refs 4979 2024-05-28 11:34:57 +02:00
Sergio De la torre a672292f03 feat reservas #refs 6861 2024-05-28 10:59:09 +02:00
Sergio De la torre 8d4fdbbae4 feat version 24.20 2024-05-28 10:58:58 +02:00
Sergio De la torre 00c7d41b38 feat changeCategory #refs 4979 2024-05-28 10:57:59 +02:00
Sergio De la torre fad073842b feat roadMap #refs 7195 2024-05-28 10:57:40 +02:00
Sergio De la torre cd31a524cf feat bugs 2024-05-28 10:57:33 +02:00
Sergio De la torre 3d878d50c6 feat roadMap #refs 7195 2024-05-28 10:57:21 +02:00
Sergio De la torre d996f06fd4 feat reservas #refs 6861 2024-05-28 10:56:14 +02:00
Sergio De la torre e478176c4a feat bugs 2024-05-28 10:56:03 +02:00
Sergio De la torre 9a9e96c86c feat lilium 2024-05-28 10:54:02 +02:00
Sergio De la torre ea1384b7c4 feat roadMap #refs 7195 2024-05-28 10:53:17 +02:00
Sergio De la torre a2451bf825 feat reservas #refs 6861 2024-05-28 10:52:24 +02:00
Sergio De la torre 59fe13f151 feat reservas #refs 6861 2024-05-28 10:51:11 +02:00
Sergio De la torre 83635cfa2e feat notesDelivery #refs 6921 2024-05-28 10:49:13 +02:00
Sergio De la torre fcb351c7d8 feat refactor Ubicador #refs 6413 2024-05-28 10:48:37 +02:00
Sergio De la torre aa00a6343f feat ticketQr #refs 6602 2024-05-28 10:46:12 +02:00
Sergio De la torre d20f300a43 feat notesDelivery #refs 6921 2024-05-28 10:40:09 +02:00
Sergio De la torre 6e2a57cdb8 feat changeCategory #refs 4979 2024-05-28 10:37:08 +02:00
Sergio De la torre 387905e89c refs #6530 feat:refactorOnBackPressed 2024-05-22 17:12:33 +02:00
Sergio De la torre 51d5bcf6ae refs #3520 feat:refactorSilex→Salix 2024-05-07 12:20:38 +02:00
Sergio De la torre 643d2dd994 refs #7278 feat:newUI SummaryFragment 2024-04-26 07:48:31 +02:00
Sergio De la torre 9fb6716498 version 23.18Beta (23.16 general) 2024-04-23 08:06:21 +02:00
Sergio De la torre 5f78920db5 refs #6530 feat:onBack 2024-04-23 08:05:45 +02:00
Sergio De la torre 57ee6f3570 refs #6861 feat:reservas previa 2024-04-23 08:05:19 +02:00
Sergio De la torre 4636968674 refs #6964 feat:stopWarnings&checking 2024-04-23 08:04:40 +02:00
Sergio De la torre cacd7d3fbb refs #6861 feat:reservas previa 2024-04-23 08:03:33 +02:00
Sergio De la torre 7ccd79affb refs #3520 feat:silex→salix 2024-04-23 08:02:54 +02:00
Sergio De la torre afc9488f76 refs #6861 feat:reservas previa 2024-04-23 08:01:59 +02:00
Sergio De la torre 14915266d4 refs #3520 feat:silex→salix 2024-04-23 07:59:54 +02:00
Sergio De la torre 00a2266a4d refs #3520 feat:silex→salix 2024-04-19 10:51:54 +02:00
Sergio De la torre d031bab5b4 refs #3520 feat:silex→salix 2024-04-19 10:48:16 +02:00
Sergio De la torre e3f1164353 refs #3520 feat:silex→salix 2024-04-19 10:48:05 +02:00
Sergio De la torre eab544feef refs #7009 feat:verifyCollection 2024-04-19 10:33:57 +02:00
Sergio De la torre 30ca458048 refs #3520 feat:silex→salix 2024-04-19 10:03:15 +02:00
Sergio De la torre cfe1f93c68 refs #7042 feat:hasItemOlder 2024-04-19 10:02:46 +02:00
Sergio De la torre a00bbce4aa refs #6964 feat:hasItemOlder 2024-04-19 10:02:04 +02:00
Sergio De la torre 01ca48a51c refs #3520 feat:silex→salix 2024-04-19 09:56:42 +02:00
Sergio De la torre e5446589e8 refs #3520 feat:silex→salix 2024-04-19 09:55:08 +02:00
Sergio De la torre 11ff4fddd7 refs #3520 feat:silex→salix 2024-04-19 09:52:07 +02:00
Sergio De la torre 940db0ae30 refs #3520 feat:silex→salix 2024-04-19 09:51:53 +02:00
Sergio De la torre f86ae72cdb refs #7161 feat:changeItemTrash 2024-04-19 09:51:12 +02:00
Sergio De la torre 91d1f520c4 refs #6921 feat:dropOffNote 2024-04-19 09:50:15 +02:00
Sergio De la torre e5f5c60e87 refs #6921 feat:dropOffNote 2024-04-19 09:50:03 +02:00
Sergio De la torre daba43e915 refs #7042 feat:scanForSign 2024-04-19 09:48:48 +02:00
Sergio De la torre 92136fe797 refs #3520 feat:silex→salix 2024-04-19 09:44:56 +02:00
Sergio De la torre 99ec7c7fc3 refs #3520 feat:silex→salix 2024-04-19 09:44:07 +02:00
Sergio De la torre 9e2d2f167e refs #6921 feat:dropOffNotes 2024-04-19 09:43:08 +02:00
Sergio De la torre 5f39620f69 refs #3520 feat:silex→salix 2024-04-19 08:57:03 +02:00
Sergio De la torre 0044fcfaa9 refs #3520 feat:silex→salix 2024-04-19 08:53:41 +02:00
Sergio De la torre 0ae481ee4a refs #6921 feat:deliveryNotes 2024-04-15 08:56:31 +02:00
Sergio De la torre f8fe66c090 refs #6276 feat:silex to salix 2024-04-15 08:54:19 +02:00
Sergio De la torre 80097b2d4b refs #6921 feat: strings 2024-04-15 08:52:55 +02:00
Sergio De la torre 50836956f8 refs #6672 feat: orderItem 2024-04-15 08:51:41 +02:00
Sergio De la torre 314a1d6f16 refs #4677 feat: addLinkUbicator 2024-04-15 08:48:33 +02:00
Sergio De la torre 92160fc101 refs #4677 fix: errorRoutes 2024-04-15 08:47:26 +02:00
Sergio De la torre 3afc37d0e1 refs #7007 feat: precontrol quantity 2024-04-10 14:05:36 +02:00
Sergio De la torre ac121ee176 refs #6574 feat:modify screen 2024-04-10 07:55:14 +02:00
Sergio De la torre 3b7b0291db refs #6574 feat:modify screen 2024-04-10 07:54:09 +02:00
Sergio De la torre 3cae4565da Merge remote-tracking branch 'warehouse/dev' into dev 2024-04-04 13:04:43 +02:00
Sergio De la torre 65c90ec860 refs #6982 feat:pickerHelper 2024-04-04 13:02:28 +02:00
Sergio De la torre a6644a1cf2 refs #6276 feat:silex →salix 2024-04-04 12:18:33 +02:00
Sergio De la torre 42258687d5 refs #6276 feat:silex →salix 2024-04-04 12:17:06 +02:00
Sergio De la torre e2a91d7596 version 24.14Beta 2024-04-04 11:58:12 +02:00
Sergio De la torre 1260fcaa20 refs #6982 feat:pickerHelper 2024-04-04 11:57:30 +02:00
Sergio De la torre 2be1c44f83 refs #6574 feat:ui 2024-04-04 11:56:13 +02:00
Sergio De la torre 40baca19b5 refs #4677 feat:tickets 2024-04-04 11:54:02 +02:00
Sergio De la torre 64ebe19a42 refs #6276 feat:silex →salix 2024-04-04 11:51:55 +02:00
Sergio De la torre 91de8dd3e9 refs #6073 feat:menus 2024-03-28 08:56:07 +01:00
Sergio De la torre 8c5fe29da4 refs #6952 feat:pickerHelper 2024-03-28 08:54:48 +01:00
Sergio De la torre b91712ea9e refs #6574 feat:ui 2024-03-28 08:54:35 +01:00
Sergio De la torre ea305d5812 refs #6073 feat:menus 2024-03-28 08:53:02 +01:00
Sergio De la torre 84c1f0905e refs #6952 feat:pickerHelper 2024-03-28 08:51:27 +01:00
Sergio De la torre 9fb40e3090 refs #6073 feat:menus 2024-03-28 08:49:52 +01:00
Sergio De la torre b9e6947f21 refs #6276 feat:silex →salix 2024-03-27 15:49:09 +01:00
Sergio De la torre 02fe790204 refs #6276 feat:silex →salix 2024-03-27 15:47:37 +01:00
Sergio De la torre 2c6e6bdfa9 refs #6276 feat:crashlytics 2024-03-27 15:46:55 +01:00
Sergio De la torre 1f53fe4643 refs #6810 feat:crashlytics 2024-03-22 13:20:12 +01:00
Sergio De la torre 7ae8244cd2 refs #6964 feat:hasItemOlder 2024-03-22 13:19:55 +01:00
Sergio De la torre 4ce7dc9a01 refs #6810 feat:crashlytics 2024-03-22 13:01:58 +01:00
Sergio De la torre f5fda9ae7e refs #6810 feat:crashlytics 2024-03-22 12:36:53 +01:00
Sergio De la torre cedd84dc9b refs #6964 feat:hasItemOlder 2024-03-22 12:05:03 +01:00
Sergio De la torre aff6620ece refs #6964 feat:hasItemOlder 2024-03-22 12:04:53 +01:00
Sergio De la torre 4a5b09fc56 refs #6810 feat:crashlytics 2024-03-22 12:02:53 +01:00
Sergio De la torre 388081d10e refs #6413 feat:ubicador 2024-03-21 08:00:57 +01:00
Sergio De la torre abf1dfd37b refs #6810 feat:crashlytics 2024-03-21 07:57:45 +01:00
Sergio De la torre 343d9434e1 refs #6276 feat:silex →salix 2024-03-14 07:13:28 +01:00
Sergio De la torre 3eb1861ea5 refs #6873 feat:historico 2024-03-14 07:12:21 +01:00
Sergio De la torre 38d940fde4 refs #6276 feat:silex →salix 2024-03-14 07:10:36 +01:00
Sergio De la torre 817ac7750b refs #6658 feat:tests 2024-03-12 12:27:25 +01:00
Sergio De la torre 281f33047a refs #4683 feat:webFragment 2024-03-12 11:27:07 +01:00
Sergio De la torre 982713f4a2 refs #6193 feat:url 2024-03-12 11:24:42 +01:00
Sergio De la torre 66ee03032f refs #6193 feat:url 2024-03-12 11:24:28 +01:00
Sergio De la torre 317aae6286 refs #4021 feat:packaging 2024-03-12 07:32:12 +01:00
Sergio De la torre 669b05826e Merge branch '4021-gestion_embalajes' into dev-embalajes
# Conflicts:
#	.idea/deploymentTargetDropDown.xml
#	.idea/workspace.xml
#	app/build.gradle
#	app/src/main/java/es/verdnatura/domain/SalixService.kt
#	app/src/main/java/es/verdnatura/presentation/base/BaseFragment.kt
#	app/src/main/java/es/verdnatura/presentation/common/UIExtensions.kt
#	app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/ObservFragment.kt
#	app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/PackagingCountFragment.kt
#	app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/PackagingSummaryFragment.kt
#	app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/PackagingViewModel/SupplierViewModel.kt
#	app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/SupplierFragment.kt
#	app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroViewModel.kt
#	app/src/main/res/layout/fragment_packaging.xml
#	app/src/main/res/layout/fragment_packaging_obs.xml
#	app/src/main/res/layout/fragment_packaging_summary.xml
#	app/src/main/res/layout/item_image_row.xml
#	app/src/main/res/layout/item_itemsupplier_row.xml
#	app/src/main/res/values-es/strings.xml
#	app/src/main/res/values-fr/strings.xml
#	app/src/main/res/values-pt/strings.xml
#	app/src/main/res/values/strings.xml
2024-03-06 14:16:36 +01:00
Sergio De la torre 86bcb7e3dd varios 2024-03-06 13:48:24 +01:00
Sergio De la torre 754d4c41c3 refs #5890 feat:itemShelvingSale 2024-03-06 13:33:59 +01:00
Sergio De la torre f163ac5b11 refs #6078 feat:activityWorker 2024-03-06 13:28:40 +01:00
Sergio De la torre bfcf7916b4 refs #6607 feat:checking_boxes 2024-03-06 13:27:33 +01:00
Sergio De la torre 8dd4a6dacf version 24.8Beta 2024-03-06 12:49:55 +01:00
Sergio De la torre 47a768004b refs #6964 feat:hasOlderItem 2024-03-06 12:49:02 +01:00
Sergio De la torre e67b6fbf12 refs #6964 refactor:settings 2024-03-06 12:46:50 +01:00
Sergio De la torre 220c8e8062 refs #6560 refactor:settings 2024-03-06 12:43:30 +01:00
Sergio De la torre 0f4ed51427 refs #6560 refactor:settings 2024-03-06 10:51:08 +01:00
Sergio De la torre 24fd2152bb refs #6284 feat:update and review xml 2024-03-01 10:37:53 +01:00
Sergio De la torre 27267c08a6 refs #6284 feat:update and review xml 2024-03-01 10:37:04 +01:00
Sergio De la torre f5def21b26 refs #6284 feat:update and review xml 2024-02-29 09:23:31 +01:00
Sergio De la torre 5213ca1672 modify gitIgnore 2024-02-29 09:19:16 +01:00
Sergio De la torre 2082f7a9bc modify gitIgnore 2024-02-29 09:17:31 +01:00
Sergio De la torre a9447b7af8 refs #6284 feat:update && deprecated 2024-02-29 09:09:14 +01:00
Sergio De la torre ff00e0a5ef refs #6284 feat:update && deprecated 2024-02-29 08:46:54 +01:00
Sergio De la torre 6c2855a7a4 refs #5890 feat:itemShelvingSale 2024-02-28 09:41:39 +01:00
Sergio De la torre ce33e2cb15 refs #6188 feat:UI changes 2024-02-28 09:40:14 +01:00
Sergio De la torre 1dc6f3fd80 refs #6295 feat:serialNumber 2024-02-28 09:39:49 +01:00
Sergio De la torre f36ff5233e refs #6413 feat:refactor Ubicador 2024-02-28 09:39:10 +01:00
Sergio De la torre c9624beb7f refs #6295 feat:serialNumber 2024-02-28 09:37:38 +01:00
Sergio De la torre 2c476e0bf2 refs #6284 refactor:deprecated 2024-02-28 09:35:52 +01:00
Sergio De la torre 51160cd1d3 refs #6284 refactor:deprecated 2024-02-28 09:33:56 +01:00
Sergio De la torre 37751d99dd refs #6786 feat:inventary parking 2024-02-27 12:07:03 +01:00
Sergio De la torre e85061f348 refs #6411 feat:update libraries 2024-02-27 12:02:52 +01:00
Sergio De la torre e85939e211 refs #6411 feat:update libraries 2024-02-27 12:00:33 +01:00
Sergio De la torre 7571e7f6ea refs #6078 feat:workerActivity 2024-02-27 10:45:17 +01:00
Sergio De la torre 5a7afb66b6 version 24.8beta 2024-02-27 09:48:47 +01:00
Sergio De la torre 9818b0babe refs #6531 feat:last tickets 2024-02-27 09:46:34 +01:00
Sergio De la torre 3afe9de1c9 refs #6413 feat:refactor Ubicador 2024-02-27 09:44:48 +01:00
Sergio De la torre cb80d58006 refs #6284 feat:update and review xml 2024-02-27 09:44:17 +01:00
Sergio De la torre 1bfb376e19 refs #6531 feat:last tickets 2024-02-27 09:41:47 +01:00
Sergio De la torre 256f449630 refs #6531 feat:last tickets 2024-02-27 09:40:45 +01:00
Sergio De la torre 9bf43e6dd0 refs #6413 feat:refactor ubicador 2024-02-27 09:39:01 +01:00
Sergio De la torre f8a17deded refs #6531 feat:last tickets 2024-02-27 09:37:36 +01:00
Sergio De la torre 93ad15685f refs #6188 feat:UI changes 2024-02-21 12:46:58 +01:00
Sergio De la torre 131dd2421b refs #6188 feat:UI changes 2024-02-21 12:45:37 +01:00
Sergio De la torre 9cda22a4d9 refs #6004 feat:preferences by dataStore 2024-02-20 09:45:43 +01:00
Sergio De la torre efd8ea47f5 refs #6413 feat:refactor Ubicador 2024-02-20 09:40:03 +01:00
Sergio De la torre b3cd417673 refs #6413 feat:refactor Ubicador 2024-02-20 09:39:34 +01:00
Sergio De la torre 985a63b9c6 refs #6411 feat:update libraries 2024-02-20 09:35:16 +01:00
Sergio De la torre 3b245cb901 refs #6227 feat:modify options 2024-02-19 11:52:09 +01:00
Sergio De la torre c4ed1168ea refs #5618 feat:modify strings 2024-02-19 08:34:07 +01:00
Sergio De la torre e0c9fc7c60 refs #6873 feat:modify filter 2024-02-19 08:25:12 +01:00
Sergio De la torre d9031969b0 refs #5802 collectionSetState 2024-02-09 11:42:22 +01:00
Sergio De la torre 7e0cdda6aa error interface 2024-02-09 11:41:54 +01:00
Sergio De la torre 97b9a31f8e refs #5802 collectionSetState 2024-02-09 11:41:34 +01:00
Sergio De la torre c5eb824d2f refs #6411 2024-02-09 11:38:38 +01:00
Sergio De la torre e0b1d73f3f refs #6651feat:itemShelving_get 2024-02-09 11:13:20 +01:00
Sergio De la torre a9814013cb refs #6440: errorNaturPhotos 2024-02-09 11:03:29 +01:00
Sergio De la torre 18dd98cf7d refs #6531feat:showLastTickets 2024-02-09 09:36:56 +01:00
Sergio De la torre 605b702742 refs #6078feat:activityWorker 2024-02-09 08:12:39 +01:00
Sergio De la torre 6e05933728 refs #6651feat:itemShelving_get 2024-02-09 08:11:33 +01:00
Sergio De la torre bd6fda1130 refs #6559feat:refactor get_sectors 2024-02-09 08:08:24 +01:00
Sergio De la torre 0445ac0442 refs #6531feat:show last Tickets 2024-02-08 13:44:27 +01:00
Sergio De la torre b759d8a3dd refs #5890 feat:itemShelving 2024-02-07 11:57:43 +01:00
Sergio De la torre 24d1ccdd9b refs #6458 feat:showDialogChecker 2024-02-07 11:56:09 +01:00
Sergio De la torre 4240c5ab51 refs #6411 feat:update libraries 2024-02-07 11:53:58 +01:00
Sergio De la torre 1feb2b2db2 refs #6107 feat: refactor fields 2024-02-05 15:51:21 +01:00
Sergio De la torre 3b35907547 refs #6108 feat: add language 2024-02-05 08:31:01 +01:00
Sergio De la torre 54bff16431 refs #6786 inventaryParking 2024-02-02 08:32:17 +01:00
Sergio De la torre 9589279fa2 refs #6458 ticketCheckingOrChecked 2024-02-01 08:41:07 +01:00
Sergio De la torre 0583403b20 refs #5802 setState 2024-01-31 09:02:50 +01:00
Sergio De la torre 61abe5bb2f refs #6004 add:saveData 2024-01-31 09:02:26 +01:00
Sergio De la torre e32a1ef17e refs #6186 packingShelve 2024-01-31 09:00:47 +01:00
Sergio De la torre 94a2b35193 refs #6186 packingShelve 2024-01-31 08:59:36 +01:00
Sergio De la torre 879f957348 refs #5802 setState 2024-01-30 16:34:24 +01:00
Sergio De la torre b6c116aee9 version 24.4Beta 2024-01-30 10:06:14 +01:00
Sergio De la torre 787c6b1b79 refs #6004 feature:dataStoreByPreference 2024-01-30 09:50:15 +01:00
Sergio De la torre d0d4889a16 refs #6004 feature:dataStoreByPreference 2024-01-26 11:30:04 +01:00
Sergio De la torre 51b8f5921e version 24.2beta(250) 2024-01-16 07:13:46 +01:00
Sergio De la torre 56882dcfc9 refs #5890 feat: itemShelvingReserva 2024-01-16 07:13:10 +01:00
Sergio De la torre 990f5b1f7e refs #5890 feat: itemShelvingReserva 2024-01-16 07:09:50 +01:00
Sergio De la torre b33511a3ed refs #5135 feat: refactor animation. 2024-01-16 07:07:31 +01:00
Sergio De la torre d787d8e861 refs #5135 feat: refactor animation. HotFix phones cambiar a String(varchar en bbdd) 2024-01-12 09:44:32 +01:00
Sergio De la torre a5953a22f5 refs #5135 feat: refactor animation 2024-01-10 09:39:33 +01:00
Sergio De la torre 11fc8ce52e refs #6275 fix: filter getTickets y driver 2024-01-10 09:37:44 +01:00
Sergio De la torre 6a8d702fcf version 24.2Beta 2024-01-09 09:23:09 +01:00
Sergio De la torre b788e29663 refs #6276: prepare Salixback 2024-01-09 08:52:34 +01:00
Sergio De la torre 89cbca08c9 refs #6275 feat: back to Salix (delivery) 2024-01-09 08:51:49 +01:00
Sergio De la torre 5910b8dabd refs #5135 feat: refactor animation 2024-01-09 08:50:35 +01:00
Sergio De la torre c264406f0e refs #6275 feat: back to Salix 2024-01-09 08:47:16 +01:00
Sergio De la torre ec6d1fd4af refs #6276: prepare Salixback 2024-01-03 15:47:09 +01:00
Sergio De la torre c1d281348b refs #5135: refactor animation 2024-01-03 15:46:21 +01:00
Sergio De la torre f950dd0bd7 refs #5135: refactor animation 2024-01-03 14:23:19 +01:00
Sergio De la torre e29ba01e51 refs #6276: prepare Salixback 2024-01-03 14:16:31 +01:00
Sergio De la torre d6255b03be refs #6276: prepare Salixback 2024-01-03 14:13:43 +01:00
Sergio De la torre fe98c3f9fb refs #5135 2023-12-14 16:50:30 +01:00
Sergio De la torre 5fa4e29c51 versiones uploaded 2023-12-12 13:32:17 +01:00
Sergio De la torre 67b9460fbd refs #6460 fix:calls 2023-12-12 13:17:28 +01:00
Sergio De la torre 3b8f06a3ba refs #6460 fix:date 2023-12-11 16:44:20 +01:00
Sergio De la torre b13d6388f5 refs #6460 fix:date 2023-12-07 09:05:08 +01:00
Sergio De la torre dc3fe4c228 refs #6004 add:saveData 2023-12-07 09:04:46 +01:00
Sergio De la torre 642ed4c283 refs #6028 silex→salix 2023-12-05 12:34:21 +01:00
Sergio De la torre e1f3eafcaf refs #6460 silex→salix 2023-12-05 10:01:32 +01:00
Sergio De la torre 20539a1c09 refs #6275 modify call 2023-12-05 09:57:16 +01:00
Sergio De la torre c24d5b56d8 version 23.48Beta 2023-12-01 13:02:50 +01:00
Sergio De la torre bb18351550 refs #6460 2023-12-01 13:02:33 +01:00
Sergio De la torre 60e2e1e2e7 version Beta 23.46 v237 2023-11-16 16:45:57 +01:00
Sergio De la torre fcb3f12f90 refs #5200 actionDialog 2023-11-16 16:45:15 +01:00
Sergio De la torre ff3a9c72e8 refs #5890 2023-11-16 16:44:23 +01:00
Sergio De la torre 4a6d0a2d73 version 23.46Beta 2023-11-16 10:08:54 +01:00
Sergio De la torre cc39ba274c refs #5870 operator 2023-11-16 10:08:08 +01:00
Sergio De la torre d6afd16fa2 refs #5652 add Address 2023-11-16 10:06:35 +01:00
Sergio De la torre e07016c87c refs #5228 review QrPallet 2023-11-16 10:06:08 +01:00
Sergio De la torre 8df86a326b refs #5200 duplicate code 2023-11-16 10:04:54 +01:00
Sergio De la torre 97d981fe89 refs #5652 setItemVisible 2023-11-16 10:01:53 +01:00
Sergio De la torre aeabd7b353 refs #6440 codebar number 2023-11-13 16:45:47 +01:00
Sergio De la torre fb2dd94da7 refs #2346 call Model Operator 2023-11-13 12:50:46 +01:00
Sergio De la torre 6661a3dfdc refs #5313 fix:crashlytics errors 2023-11-09 15:56:59 +01:00
Sergio De la torre 19761526c1 refs #5713 feat:add reset button 2023-11-09 15:51:34 +01:00
Sergio De la torre 0c0c6f540f refs #5713 feat:add reset button 2023-11-09 15:50:55 +01:00
Sergio De la torre c9d7978519 refs #5870 feat:operatorSalix 2023-11-09 15:49:21 +01:00
Sergio De la torre 1e734703b2 version 23.42Beta 2023-11-06 16:50:27 +01:00
Sergio De la torre 9ee06e52b0 refs #6390 2023-11-06 16:48:31 +01:00
Sergio De la torre f8272a4df2 refs #5612 2023-11-06 16:45:24 +01:00
Sergio De la torre c30d44d801 refs #6073 new menus 2023-11-02 11:50:00 +01:00
Sergio De la torre 98d0791202 refs #5867 show icon 2023-11-02 11:49:21 +01:00
Sergio De la torre f802a1e7a1 refs #5675 fix parking 2023-10-31 16:37:31 +01:00
Sergio De la torre 1f1b901047 refs #6073 reordenar menus 2023-10-31 10:55:22 +01:00
Sergio De la torre 622d2eeae3 refs #5313 fix errors 2023-10-31 10:41:37 +01:00
Sergio De la torre e4f5cc6786 Refactor formato campos refs #6061 2023-10-30 07:45:36 +01:00
Sergio De la torre 610efcd747 Refactor formato campos refs #5134 2023-10-26 09:38:23 +02:00
Sergio De la torre d6cd3b4621 version 23.40.1-hotFix Ubicador 2023-10-19 08:05:22 +02:00
Sergio De la torre e475ef63f9 version 23.40.1-hotFix OrderPrevia 2023-10-18 11:09:38 +02:00
Sergio De la torre 973f13bc8a refs #5890 2023-10-17 10:53:03 +02:00
Sergio De la torre 3a83af4818 varios 2023-10-17 10:48:47 +02:00
Sergio De la torre 8e24c7d1ba refs #5867 sendPDF 2023-10-17 10:28:33 +02:00
Sergio De la torre e501e6dc9b refs #4677 texts 2023-10-16 09:53:31 +02:00
Sergio De la torre f6bfb3c8ec refs #5867 sendDriverRoute 2023-10-16 09:25:36 +02:00
Sergio De la torre 15669ba5a9 strings 2023-10-11 09:26:18 +02:00
Sergio De la torre 718e418d30 refs #5652 2023-10-11 09:25:24 +02:00
Sergio De la torre 76d6daf34b version 23.40Beta 2023-10-10 10:08:02 +02:00
Sergio De la torre aaae380f07 refs #4815 ajustesSerial 2023-10-10 10:07:45 +02:00
Sergio De la torre 6f94d7322f refs #5890 newSacador 2023-10-10 10:07:18 +02:00
Sergio De la torre 56437162ca refs #6061 silex→salix 2023-10-10 10:05:43 +02:00
Sergio De la torre e89d58afee refs #4815 serial 2023-10-10 10:02:43 +02:00
Sergio De la torre 9947d32036 refs #6183 2023-10-10 10:00:03 +02:00
Sergio De la torre ecbea7fa6c refs #5890 2023-10-10 09:59:18 +02:00
Sergio De la torre bef565c064 version 23.38Beta 2023-09-19 10:49:02 +02:00
Sergio De la torre 2ddbd2d903 refs #4677 add scan manual 2023-09-19 08:42:50 +02:00
Sergio De la torre 88dd90a2bb refs varios 2023-09-19 08:41:33 +02:00
Sergio De la torre 05304b96d0 refs #5134 silex→salix 2023-09-19 08:39:47 +02:00
Sergio De la torre 4b6fa1dfae refs #5224 serialNumber 2023-09-19 08:31:10 +02:00
Sergio De la torre 7785b483ec refs #4815 interacción 2023-09-19 07:28:09 +02:00
Sergio De la torre 400aa04046 refs #5652 Botones dinámicos 2023-09-19 07:20:32 +02:00
Sergio De la torre d93e34e13b refs #4677 Modificar pantalla delivery en picking 2023-09-19 07:19:48 +02:00
Sergio De la torre 8618425413 refs #5134 Refactor silex→salix 2023-09-19 07:16:22 +02:00
Sergio De la torre eed96ea4eb refs #5764 modify dayOfSale 2023-09-15 11:10:10 +02:00
Sergio De la torre cfe7a23ccd refs #5998 modify imageError 2023-08-31 12:13:11 +02:00
Sergio De la torre c90429e557 version 23.32 fix url 2023-08-08 10:05:19 +02:00
Sergio De la torre 0267427113 refs #4677 delivery→picking 2023-08-08 10:04:21 +02:00
Sergio De la torre 5523041678 refs #5996 cmrAdd 2023-08-08 10:01:34 +02:00
Sergio De la torre 00030ae266 refs #5652 add dynamic buttons for mermas 2023-08-03 09:38:56 +02:00
Sergio De la torre 8f978b2c5c version 23.30Beta 2023-07-27 16:19:16 +02:00
Sergio De la torre 33529a052a test ubicador 2023-07-27 16:18:48 +02:00
Sergio De la torre 0c65053b4f refs #4677 delivery→picking 2023-07-27 16:18:34 +02:00
Sergio De la torre c014dbfd2d refs #5891 inventoryParking 2023-07-27 13:07:34 +02:00
Sergio De la torre e4fc2cdc6e version 23.28 general y beta 2023-07-20 11:54:05 +02:00
Sergio De la torre a8071581a0 refs ##5613 login 2023-07-20 11:53:45 +02:00
Sergio De la torre 1771608eff refs #4676 delivery->picking 2023-07-20 11:52:33 +02:00
Sergio De la torre a068ed3f6c refs #4676 delivery->picking 2023-07-18 07:10:13 +02:00
Sergio De la torre 12dcab0543 versionBeta 23.28 renovarToken 2023-07-12 13:59:42 +02:00
Sergio De la torre fd862edbef refs #5613 userId 2023-07-12 13:52:40 +02:00
Sergio De la torre 7d318e0e07 refs #5613 tokenCreated 2023-07-12 12:40:48 +02:00
Sergio De la torre 9818b545c2 refs #5613 2023-07-12 12:40:16 +02:00
Sergio De la torre 66b9250a35 refs #5734 sector in precontrol 2023-07-12 07:53:06 +02:00
Sergio De la torre 27423f3211 refs #5998 change adapter 2023-07-12 07:48:18 +02:00
Sergio De la torre 6e6234a0b6 refs #5734 precontrol muestra lineas del sector 2023-07-07 11:36:35 +02:00
Sergio De la torre 0d600e0d16 refs #5972 modify_ubicator 2023-07-06 08:03:04 +02:00
Sergio De la torre ea63ddc24d Modificado customDialog para modificar inputText dinámicamente 2023-07-05 13:12:57 +02:00
Sergio De la torre ad4910948d refs #5891 2023-07-05 13:11:50 +02:00
Sergio De la torre dccbb41ab1 vresion 23.26 2023-07-03 14:01:47 +02:00
Sergio De la torre 75dc8e5656 refs #5891 2023-07-03 07:09:38 +02:00
Sergio De la torre d3869ba122 version 23.26Beta-210 2023-06-30 08:22:17 +02:00
Sergio De la torre e8c6e713c2 refs #5891 inventory 2023-06-30 07:57:02 +02:00
Sergio De la torre 56dd0d9626 refs #5613 renew token 2023-06-30 07:55:47 +02:00
Sergio De la torre 362217114a refs #5613 renew token 2023-06-30 07:39:57 +02:00
Sergio De la torre 37f98c8f80 version 23.26 refs #4678 2023-06-27 16:45:23 +02:00
Sergio De la torre 6aa041a872 version 23.26Beta_5339 2023-06-26 10:40:20 +02:00
Sergio De la torre 607f946e0a version 23.24.1Beta 2023-06-21 12:57:08 +02:00
Sergio De la torre 6f3689651a refs #5613 2023-06-21 12:54:13 +02:00
Sergio De la torre b4530e2cf2 version 23.24.1Beta 2023-06-20 16:40:14 +02:00
Sergio De la torre 13ee40af94 refs #5613 user, password not saved 2023-06-20 16:38:55 +02:00
Sergio De la torre b78e60873e version 23.24Beta-205 2023-06-20 08:07:18 +02:00
Sergio De la torre 485dd17f88 refs #4678 2023-06-19 13:55:42 +02:00
Sergio De la torre 5bdf4ab290 refs #5339 2023-06-19 13:47:34 +02:00
Sergio De la torre 39135845da Actualizaciones 2023-06-16 16:34:56 +02:00
Sergio De la torre 4a8b243ae1 Error codigo barras largo 2023-06-16 16:34:41 +02:00
Sergio De la torre 1b52f820ca version 23.24Beta 2023-06-16 08:02:01 +02:00
Sergio De la torre 2cce35ccaf Desactivar avanzar ticket y version beta precontrol 2023-06-15 08:17:09 +02:00
Sergio De la torre c23ae39ae1 refs #5651 notifications 2023-06-15 07:50:59 +02:00
Sergio De la torre c1842a4bc6 refs #5651 advancedTicket 2023-06-14 13:50:46 +02:00
Sergio De la torre 863957812b PreControl quitar agrupaciones. 2023-06-14 07:59:21 +02:00
Sergio De la torre ea510de356 refs #5513 Añadida imagen original 2023-06-12 10:22:08 +02:00
Sergio De la torre 86c51e4e99 refs #4021 Cambiado quantity a printedStickers 2023-06-12 08:38:32 +02:00
Sergio De la torre bdec030f66 refs #5322 NaturePhotos 2023-06-09 14:07:11 +02:00
Sergio De la torre 258c4d134b refs #4021 falta fotos, correo y modificación del back 2023-06-08 13:09:59 +02:00
Sergio De la torre 4c59d4cb10 Merge branch '4021_embalajes' into 4021-gestion_embalajes
# Conflicts:
#	.idea/workspace.xml
#	app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/PackagingCountFragment.kt
#	app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/PackagingViewModel/SupplierViewModel.kt
#	app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/SupplierFragment.kt
#	app/src/main/java/es/verdnatura/presentation/view/feature/packaging/model/EntrySalix.kt
#	app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroViewModel.kt
#	app/src/main/res/values-es/strings.xml
#	app/src/main/res/values/strings.xml
2023-06-06 10:46:56 +02:00
Sergio De la torre fd04b7b52f version 23.22.1 2023-06-06 09:55:07 +02:00
Sergio De la torre e3e7a3375a version 23.22 2023-06-06 08:56:01 +02:00
Sergio De la torre f48f112773 refs #5332 app obtener imagen 2023-06-06 08:54:13 +02:00
Sergio De la torre f13e6e14da refs #5332 2023-06-06 08:53:46 +02:00
Sergio De la torre 29094f4d90 refs #5713 2023-06-06 08:52:32 +02:00
Sergio De la torre 05e1abae63 refs #5713 2023-06-06 08:52:17 +02:00
Sergio De la torre a8df499138 refs #4678 2023-06-06 08:50:56 +02:00
Sergio De la torre 491008a4a3 refs #5513 2023-06-06 08:50:14 +02:00
Sergio De la torre 0031abf841 Translation 2023-06-06 08:49:14 +02:00
Sergio De la torre cf28002926 refs #5322 NaturePhotos 2023-06-06 08:48:55 +02:00
Sergio De la torre f292de3db0 strings 2023-06-05 07:42:07 +02:00
Sergio De la torre e2f8e1e0a5 Merge branch 'testBeta' of https://gitea.verdnatura.es/verdnatura/vn-warehouse into testBeta
 Conflicts:
	app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/PackagingViewModel/SupplierViewModel.kt
	app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroViewModel.kt
2023-06-02 14:56:41 +02:00
Sergio De la torre 7633d0ce69 refs #5322 NaturePhotos 2023-06-02 14:50:58 +02:00
Sergio De la torre 307a53849b refs #5322 NaturePhotos 2023-06-02 14:50:25 +02:00
Alexandre Riera de65d14a33 refs #5513 addFromBuy endpoint 2023-06-02 14:07:56 +02:00
Sergio De la torre 6db09cd73a refs #5322 Nature 2023-06-02 12:54:09 +02:00
Sergio De la torre 65d1b4a7fd refs #5764 Añadir onclick pantalla Día de venta 2023-06-02 07:16:41 +02:00
Sergio De la torre a265550138 Modificado IntvsLong 2023-06-01 16:27:38 +02:00
Alexandre Riera 2b112b51e6 refs #5509 upload entry photo endpoint 2023-06-01 14:42:20 +02:00
Sergio De la torre 98ba481976 version alfa 2023-05-31 16:03:41 +02:00
Sergio De la torre 4304da8316 refs #4678 preparar fallo conexión 2023-05-31 16:02:32 +02:00
Sergio De la torre 22faafd907 refs lentitud al leer codigos y fallo al volver atrás 2023-05-31 16:01:54 +02:00
Sergio De la torre b1fd26327a refs #5618 traducción 2023-05-31 16:01:06 +02:00
Sergio De la torre 6ab21a1b03 refs #5513 testBack 2023-05-31 16:00:09 +02:00
Sergio De la torre 44b8713915 refs #4678 2023-05-31 15:57:59 +02:00
Sergio De la torre 491a4f8762 refs #4940 2023-05-29 12:20:57 +02:00
Sergio De la torre fae0d8a444 refs #5618 traducciones 2023-05-25 09:53:58 +02:00
Sergio De la torre d49c5db49e refs #5675 fallo parking 2023-05-25 09:20:32 +02:00
Sergio De la torre 5454d00ca4 refs #4678 Carga/descarga 2023-05-25 09:19:26 +02:00
Sergio De la torre a76692dff6 refs #4678 Carga/descarga 2023-05-25 09:18:48 +02:00
Sergio De la torre 6c9e85c574 refs #5071 summaryFragment 2023-05-25 09:18:05 +02:00
Sergio De la torre c7807adb4c refs #5618 traducciones 2023-05-25 08:44:45 +02:00
Sergio De la torre 5cb66d89d1 refs #4902 retrocompatibilidad etd-eta 2023-05-17 08:28:15 +02:00
Sergio De la torre 1583304c80 version 23.18.3Beta solucionado fallo ubicador. Añadido bbdd 2023-05-12 12:38:59 +02:00
Sergio De la torre 0bf19d0da0 version 23.18.2Beta - Solucionado doble pitido, fusionada pantalla sacador, filtro a ubicador, quitado baldas. 2023-05-11 11:52:19 +02:00
Sergio De la torre a63cbb8f08 refs #5442 2023-05-04 08:50:05 +02:00
Sergio De la torre 8fc79a4d5d refs #5430 2023-05-03 13:48:31 +02:00
Sergio De la torre ee8527f6a3 refs #4815 2023-05-03 11:44:42 +02:00
Sergio De la torre c5ef139004 refs #5335 2023-05-03 11:43:22 +02:00
Sergio De la torre 5d4acebccd refs #4815 2023-05-02 16:20:37 +02:00
Sergio De la torre 078713348e varios version despues Campaña 2023-05-02 16:17:49 +02:00
Sergio De la torre e000ca66bc refs #4979 2023-04-27 08:09:24 +02:00
Sergio De la torre 76f8fdc8b8 refs #5004 2023-04-27 08:07:16 +02:00
Sergio De la torre 528a4bbda0 version 23.14.1 2023-04-21 08:02:30 +02:00
Sergio De la torre 53a230db30 refs #5004 2023-04-21 07:10:07 +02:00
Sergio De la torre 47b1fce0b9 refs Precontrol activado 2023-04-20 08:04:36 +02:00
Sergio De la torre 705efcf1d3 refs varios 2023-04-20 07:16:02 +02:00
Sergio De la torre 6b507bf7ae refs precontrol 2023-04-14 07:07:33 +02:00
Sergio De la torre d4403cecc0 refs #4021 2023-04-12 14:10:13 +02:00
Sergio De la torre a63446f86b refs #4021 2023-04-12 13:33:04 +02:00
Sergio De la torre c89f7f6113 Strings y serialNumber 2023-04-12 11:42:25 +02:00
Sergio De la torre 89dca1575e refs #4830 2023-04-12 11:39:57 +02:00
Sergio De la torre 88efda26d7 version Controlador Automatico 2023-04-11 10:52:20 +02:00
Sergio De la torre 6fb4b69ab6 refs #4765 Refactor 2023-04-11 10:16:49 +02:00
Sergio De la torre 6be191c945 Add ic_delivery 2023-04-06 09:05:25 +02:00
Sergio De la torre 59b06bea01 Pantalla embalajes 2023-03-30 07:24:16 +02:00
Sergio De la torre 2efa03454b version 23.10.1 Modificar controlador orden 2023-03-28 16:08:45 +02:00
Sergio De la torre 2cfc560649 version 23.10 General 2023-03-28 08:27:17 +02:00
Sergio De la torre f8efe73da7 refs #4940 packingHolland 2023-03-28 08:26:39 +02:00
Sergio De la torre 4c63845dca refs #4731 print 2023-03-27 13:37:57 +02:00
Sergio De la torre 6c58e8012f refs #4731 print 2023-03-27 10:20:59 +02:00
Sergio De la torre 0996a390ec refs #4021 2023-03-24 16:19:21 +01:00
Sergio De la torre c50e803993 refs #4021 2023-03-24 16:18:37 +01:00
Sergio De la torre c43e4f7ccf refs #4923 PRECHECKER abierta agrupación 2023-03-23 16:19:56 +01:00
Sergio De la torre 7b1508eed0 EntrySalix 2023-03-23 13:48:30 +01:00
Sergio De la torre db8ce4725f Merge branch 'testBeta_embalajes_pantallas' into 4021_embalajes
# Conflicts:
#	.idea/workspace.xml
#	app/src/main/res/values-es/strings.xml
#	app/src/main/res/values/strings.xml
2023-03-23 11:44:38 +01:00
Sergio De la torre 25ca797140 Version 23.10Beta 2023-03-23 09:10:47 +01:00
Sergio De la torre 19bfd3b24b refs #4414 marcar_lineas_QR_previa 2023-03-23 08:51:38 +01:00
Sergio De la torre b62f27a1f5 refs #4414 marcar_lineas_QR_previa 2023-03-22 13:32:26 +01:00
Sergio De la torre a59c313a41 refs #4274 local 2023-03-22 11:53:37 +01:00
Sergio De la torre d1d7ffa42c refs #4923 previas 2023-03-22 10:39:48 +01:00
Sergio De la torre 2525560fe9 refs #4755 añadirTickets 2023-03-21 10:02:11 +01:00
Sergio De la torre 8a0700e3ce refs #4755 añadirTickets 2023-03-21 09:59:49 +01:00
Sergio De la torre aba3f87040 refs #4755 añadirTickets 2023-03-21 09:58:58 +01:00
Sergio De la torre 89a1a9624d refs #5117 autoconsumo 2023-03-21 07:07:08 +01:00
Sergio De la torre fd80d694cc refs #4755 mostrar tickets 2023-03-20 10:38:04 +01:00
Sergio De la torre fd2f0d430e refs #4683 Autoconsumo 2023-03-17 11:52:39 +01:00
Sergio De la torre 5d3ff618e2 refs #5117 Autoconsumo 2023-03-17 11:51:25 +01:00
Sergio De la torre 6af2512780 refs #5117 Autoconsumo 2023-03-17 11:51:06 +01:00
Sergio De la torre a1009d2790 Beta 23.10.Quitar checkFullyControlled 2023-03-13 16:12:24 +01:00
Sergio De la torre c606eb6d71 Version 23.8Beta Input número pero acepta text 2023-03-07 12:48:02 +01:00
Sergio De la torre 0deda2f72e Version 23.8Beta Añadido try catch para que no se cierre al leer texto en pantalla Controlador 2023-03-07 11:25:36 +01:00
Sergio De la torre d92ff2ca32 Version 23.8Beta Modificado para app reparto para que abre versión si es beta o no 2023-03-07 09:29:39 +01:00
Sergio De la torre 5fd74760c9 Merge branch 'testBeta_4679_reparto' into testBeta
# Conflicts:
#	.idea/workspace.xml
#	app/build.gradle
2023-03-06 13:37:51 +01:00
Sergio De la torre 6c354182b8 Version 23.8Beta Modificado para app reparto 2023-03-06 13:35:06 +01:00
Sergio De la torre 7b625e77cf Version 23.4Beta 2023-03-03 11:16:07 +01:00
Sergio De la torre 02604def33 Version 23.4Beta refs #4679 2023-03-03 10:31:56 +01:00
Sergio De la torre cc0029420f Version 23.6Beta 2023-02-27 10:04:09 +01:00
Sergio De la torre d2410bd92c HotFix Ubicador 2023-02-27 09:33:46 +01:00
Sergio De la torre a781fe31c7 refs #4679 2023-02-27 08:41:36 +01:00
Sergio De la torre a47568156f Añadido QR a pantalla Ubicador->Añadir ítem (rayo y símbolo +) 2023-02-24 10:58:52 +01:00
Sergio De la torre 83cd10e83d refs #4679 menus reparto 2023-02-23 08:36:57 +01:00
Sergio De la torre f1abfc2fe3 refs #5054. Crashlytics. versionApp: 23.4 2023-02-21 16:00:50 +01:00
Sergio De la torre 41828a374b Modificar pantallas embalajes 2023-02-17 13:41:00 +01:00
Sergio De la torre 19eaf275cd Formateado código 2023-02-17 07:15:53 +01:00
Sergio De la torre 8abea66221 Activado impresion labelCount 2023-02-16 16:50:24 +01:00
Sergio De la torre d386374c90 Version 23.4Beta Buscar item, isScanned preparado, grouping y volver atrás solucionado, qr, ubicador orden reverso cuando se añade item 2023-02-15 12:10:54 +01:00
Sergio De la torre 0436cb50bf Version 23.3Beta Cambiado a Instant la fecha del JSON y puesto nombre more 2023-02-07 09:21:27 +01:00
Sergio De la torre af0f32ae31 Version 23.3Beta Solucionada llamada Número de paquetes en balda al hacer ENTER 2023-02-03 12:00:43 +01:00
Sergio De la torre 3215d047ff Version 23.3Beta QR 2023-02-03 11:04:16 +01:00
Sergio De la torre caa3116f5c Version 23.3Beta Añadido error si falla el ubicador y solucionado al leer artículos. Modificado saleMistakeAdd para que solo envíe dos parámetros. 2023-02-01 12:33:20 +01:00
Sergio De la torre 09ba6b3e89 Version 23.2 Modificado actualizar pantalla al transferir en Ubicador. Subida version 2023-01-27 10:58:52 +01:00
Sergio De la torre 6e4c2524b7 Version 23.2 Modificado orden ubicador y revisión anterior falta activar icono 2023-01-25 16:21:20 +01:00
Sergio De la torre 720b943f60 Version 23.2 Solucionado historico items 2023-01-24 10:59:43 +01:00
Sergio De la torre 2737b93895 Version 23.2-Quitado log del buyFk y modificado mensaje 2023-01-24 07:52:03 +01:00
Sergio De la torre 4e4dbaba15 Version 23.2-Fallo item_card 2023-01-23 16:04:31 +01:00
Sergio De la torre b9cbc99dd1 Version 23.2-Fallos precontrol-Directo Ubicador desde histórico-Inventario no se cierra-Botón solo Agregar 2023-01-19 16:24:43 +01:00
Sergio De la torre 88ecc0209e Version 23.2 Cambiado collection_assign a String. 2023-01-13 10:12:53 +01:00
Sergio De la torre d28ee67bc2 Version 23.2Beta en scaleFusion, solucionado doble impresión y Revisar en Controladores 2023-01-11 09:04:52 +01:00
Sergio De la torre 7dfc775299 Version 23.2Beta en scaleFusion 2023-01-09 12:36:51 +01:00
Sergio De la torre e52d7cb7e8 Version 9.8Beta. Borrados UserCase y uso de SilexCallBack 2022-12-20 07:17:46 +01:00
Sergio De la torre 2469e2e368 Version 9.7Beta. INVISIBLE switchButton Ubicador 2022-12-16 06:35:31 +01:00
Sergio De la torre 042979a8fe Version 9.8Beta_4897 2022-12-15 09:02:18 +01:00
Sergio De la torre 6b7b0c907a Version 9.6Beta.Modificadas llamadas y fallo en checkItemScan 2022-12-14 12:59:03 +01:00
Sergio De la torre a23c8d9caf Version 9.6Beta. TEST7 2022-12-13 16:09:01 +01:00
Sergio De la torre e006efb01a Version 9.6Beta. TEST6-13122022. Dos revisiones de ubicador. 2022-12-13 08:18:17 +01:00
Sergio De la torre 47667d1cd8 Version 9.6Beta. TEST6-final: Modificando llamadas a SilexCallback (AjustesFragment) 2022-12-09 10:59:58 +01:00
Sergio De la torre 70ba354321 Version 9.6Beta. TEST5: imprimir ok, ubicador ok, no se cierra app sacador 2022-12-02 10:56:49 +01:00
Sergio De la torre 8ae723ea62 Version 9.6Beta en test: paletizadores 2022-11-29 12:22:59 +01:00
Sergio De la torre 16f9072c5f Version 9.6Beta en test: paletizadores 2022-11-29 10:51:27 +01:00
Sergio De la torre 78a07415ea Version 9.6Beta en test : ubicador, quality, posicion, buscar item, reclamaciones... 2022-11-28 11:31:02 +01:00
Sergio De la torre b8d0f76adf Version 9.6Beta en test 2022-11-24 08:41:10 +01:00
Sergio De la torre 3b8b5e5535 Version 9.6Beta Cambiadas llamadas y campos( collectionFk). Borrado Presacador 2022-11-23 07:55:01 +01:00
Sergio De la torre d4b101d9bb Version 9.6Beta Añadido a BaseFragment(context). Quitado código repetido de las llamadas 2022-11-22 09:25:20 +01:00
Sergio De la torre 827fd35d78 Version 9.6Beta Interteptors, quitando userCase y arreglado click sobre carita. Cambiado .gitignore 2022-11-18 10:28:06 +01:00
Sergio De la torre 96b4960358 Version 9.5Beta añadido inteceptor y modificado código worker_getId. Subida como 9.4.2Beta 2022-11-11 09:53:47 +01:00
Sergio De la torre e0ffa0f0ec Version 9.3 Modificadas llamas #4696. Añadido posibilidad de revisar items. Añadido color rojo Salix. Borrados comentarios 2022-11-07 12:10:04 +01:00
Sergio De la torre 480cee44bd Modificado control ubicación 2022-11-04 07:00:12 +01:00
Sergio De la torre 239641eb10 CollectionFragment modificar y borrar comentarios 2022-11-03 09:46:14 +01:00
Sergio De la torre 8f5a3788d6 Modificado .gitignore 2022-11-02 11:45:31 +01:00
Sergio De la torre e4750fc92a Version 9.4Beta Cmr, Control ubicación, volver atrás de Controlador, botón llamadas, volver pantalla anterior parking, 2022-11-02 11:37:55 +01:00
Sergio De la torre d371048d3b Version 9.2 Error encajado y en ver Ticket aparece ver la colección 2022-10-20 16:43:13 +02:00
Sergio De la torre 16def8477c Version 9.2.1 en producción. Borrada Voz y Ajustes impresora 2022-10-11 08:33:56 +02:00
Sergio De la torre 841974a026 Version 9.2.1 en producción. Borrada Voz y Ajustes impresora 2022-10-11 08:33:30 +02:00
Sergio De la torre 840abbcd2b Version 9.2.1 en producción 2022-10-07 08:14:48 +02:00
Sergio De la torre da26cb6d08 Merge branch 'Tarea3420-quantity_y_originalQuantity' into testWithout3420
# Conflicts:
#	.idea/misc.xml
2022-10-07 06:54:06 +02:00
Sergio De la torre 6f7abca1b1 Version 9.2.1 añadido error encajado y modificado marcaje 2022-10-07 06:50:44 +02:00
Sergio De la torre ef32ed1461 Version 9.2.1 Modificado fragment a fragment_general 2022-10-06 08:42:55 +02:00
Sergio De la torre 733489514a Version 9.2.1 Modificado fragment 2022-10-06 08:23:57 +02:00
Sergio De la torre ddb4ab09c4 Version 9.2.1 Refactor Inicio, pintar a través del rgb, modificado diseño,se añade shelvingLog y muestra colección a través de ticket 2022-10-06 07:01:04 +02:00
Sergio De la torre 0c87ae654b Version 9.2.1 Refactor Inicio 2022-10-03 11:50:14 +02:00
Sergio De la torre aa27073b22 Version 9 Arreglado vuelta atrás controlador 2022-09-29 07:45:59 +02:00
Sergio De la torre 13ca9e5c47 Version 9.2Beta-Controlador sin animacion y vuelve al sitio 2022-09-27 13:04:15 +02:00
Sergio De la torre f058f239ab Version 9.1Beta-Quantity_y_originalQuantity_view_to_Integer.toString 2022-09-23 16:33:23 +02:00
Sergio De la torre efb565d32c Version 9.1Beta-Compilada versión y formateado Ajustes 2022-09-23 12:48:05 +02:00
Sergio De la torre 2cf223ff8b Version 9.1Beta-CMR quitado, rgb quitado 2022-09-22 14:48:01 +02:00
Sergio De la torre 7b43fdd7e4 Version 9.1Beta- Modificar original y originalQuantity 2022-09-22 14:24:05 +02:00
Sergio De la torre 6a876e010f Version 9.1Beta- Filtro inventario 2022-09-22 10:27:26 +02:00
Sergio De la torre b77ef2d470 Version 9.1Beta- Rgb,trasaccion marcar lineas, new collection,shelvingLog, y ajustes 2022-09-21 16:25:14 +02:00
Sergio De la torre 3bc1d9d757 Version 9.1Beta- Rgb,trasaccion marcar lineas, new collection,shelvingLog, y ajustes 2022-09-21 16:24:39 +02:00
Sergio De la torre c54191f12b Version 9Beta-Borrados comentarios 2022-09-13 08:21:56 +02:00
Sergio De la torre 1edbba1eba Version 9Beta, dos opciones a Paletizadores y carros de operator 2022-09-09 06:58:21 +02:00
Sergio De la torre 6841dd28be Version 8.8Beta precio coste artículo, modificar tallos, mensajes error para items sin buyFk y ticket eliminado o viejo 2022-07-28 12:44:01 +02:00
Sergio De la torre e41a12e7a9 Version 8.7 Reubicación, sector = SACADOR V, controlador no puede hacer parking si no están revisados todos los tickets, 2022-07-04 12:21:36 +02:00
Sergio De la torre bafe1f8c03 Version 8.6.1Beta tareas #3601 refactor ivnentario.Tarea #3959(warnings deprecated,typedate,neverused) 2022-06-27 11:41:25 +02:00
Sergio De la torre 35253779e6 Version 8.6.1Beta, añadido ticketColor más grande, quitados colores items y permutado quantity por cel2. Quitados warnings 2022-06-23 07:07:41 +02:00
Sergio De la torre edfa831a84 Version 8.5.2Beta, quitado color del item, quitado back de revisor y control de previa solo sus líneas 2022-06-16 10:54:11 +02:00
Sergio De la torre 588b5d2a07 Version 8.5.1Beta acceso a control vehiculo ok 2022-06-09 15:37:06 +02:00
Sergio De la torre f3ab292c32 Version 8.5.1Beta, strings, muestra previa y comentar smarttads 2022-06-09 13:01:23 +02:00
Sergio De la torre d1e834989f Version 8.5Beta, strings, body =null y muestra coger vehículo 2022-06-08 08:41:18 +02:00
Sergio De la torre 3b1f7c96c5 Version 8.4.1Beta=8.4 Master,sin envio rockets de sacador/controlador y quitar strings. 2022-06-02 06:50:29 +02:00
Sergio De la torre da7121aa50 Version 8.4.1Beta,Tarea #3958 2022-05-27 17:03:10 +02:00
Sergio De la torre 575bfd06be Version 8.4.1Beta, strings y return finish 2022-05-27 11:34:06 +02:00
Sergio De la torre 43350c66d6 Version 8.4.1Beta, return "finish", strings y quitado test rocket 2022-05-26 17:02:28 +02:00
Sergio De la torre 03f825ad3e Version 8.4Beta, return "finish" y apptesters 2022-05-24 15:54:53 +02:00
Sergio De la torre 6db39eb1da Version 8.3 Diseño grafico, llamadas a Salix y return "Finish" 2022-05-17 13:52:25 +02:00
Sergio De la torre 0595654d86 Version 8.2 obligatorio sector para imprimir, Desmarcar sacador ok. Cambiado texto DiadeVenta.Añadido icono Parking previa. Actualiza datos en Previa. Nuevo diseño INVISIBLE 2022-05-04 08:50:29 +02:00
797 changed files with 85430 additions and 28839 deletions

8
.gitignore vendored
View File

@ -1,4 +1,7 @@
*.iml
*.apk
*.ap_
*.aab
.gradle
/local.properties
/.idea/caches
@ -7,8 +10,13 @@
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
/.idea/inspectionProfiles/Project_Default.xml
/app/.idea/workspace.xml
.DS_Store
/build
/app/release
/app/beta
/captures
.externalNativeBuild
.cxx
*.jar

View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AppInsightsSettings">
<option name="selectedTabId" value="Firebase Crashlytics" />
<option name="tabSettings">
<map>
<entry key="Android Vitals">
<value>
<InsightsFilterSettings>
<option name="connection">
<ConnectionSetting>
<option name="appId" value="com.verdnatura.verdnaturaventas" />
</ConnectionSetting>
</option>
<option name="failureTypes">
<list>
<option value="FATAL" />
</list>
</option>
<option name="signal" value="SIGNAL_UNSPECIFIED" />
<option name="timeIntervalDays" value="ONE_DAY" />
<option name="visibilityType" value="ALL" />
</InsightsFilterSettings>
</value>
</entry>
<entry key="Firebase Crashlytics">
<value>
<InsightsFilterSettings>
<option name="connection">
<ConnectionSetting>
<option name="appId" value="es.verdnatura.sfusion" />
<option name="mobileSdkAppId" value="1:975691769093:android:83eff0dadf5ca9d3e3c36c" />
<option name="projectId" value="picking-2b9a0" />
<option name="projectNumber" value="975691769093" />
</ConnectionSetting>
</option>
<option name="signal" value="SIGNAL_UNSPECIFIED" />
<option name="timeIntervalDays" value="SIXTY_DAYS" />
<option name="versions">
<list>
<VersionSetting>
<option name="buildVersion" value="324" />
<option name="displayName" value="24.32 (324)" />
<option name="displayVersion" value="24.32" />
</VersionSetting>
</list>
</option>
<option name="visibilityType" value="ALL" />
</InsightsFilterSettings>
</value>
</entry>
</map>
</option>
</component>
</project>

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="WizardSettings">
<option name="children">
<map>
<entry key="imageWizard">
<value>
<PersistentState />
</value>
</entry>
<entry key="vectorWizard">
<value>
<PersistentState>
<option name="children">
<map>
<entry key="vectorAssetStep">
<value>
<PersistentState>
<option name="values">
<map>
<entry key="assetSourceType" value="FILE" />
<entry key="outputName" value="ic_troncales" />
<entry key="sourceFile" value="C:\Users\sergiodt\Downloads\ic_troncales.svg" />
</map>
</option>
</PersistentState>
</value>
</entry>
</map>
</option>
</PersistentState>
</value>
</entry>
</map>
</option>
</component>
</project>

View File

@ -117,6 +117,9 @@
</codeStyleSettings>
<codeStyleSettings language="kotlin">
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
<option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="1" />
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
<option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="1" />
</codeStyleSettings>
</code_scheme>
</component>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="11" />
<bytecodeTargetLevel target="21" />
</component>
</project>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetDropDown">
<value>
<entry key="app">
<State />
</entry>
</value>
</component>
</project>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2024-07-24T04:57:28.186915600Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="PhysicalDevice" identifier="serial=21114523025303" />
</handle>
</Target>
</DropdownSelection>
<DialogSelection />
</SelectionState>
</selectionStates>
</component>
</project>

View File

@ -4,17 +4,17 @@
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="GRADLE" />
<option name="disableWrapperSourceDistributionNotification" value="true" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleHome" value="$PROJECT_DIR$/../../../../gradle/gradle-7.5" />
<option name="gradleJvm" value="jbr-17" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
<option name="resolveExternalAnnotations" value="false" />
</GradleProjectSettings>
</option>
</component>

View File

@ -1,10 +1,13 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="DeprecatedCallableAddReplaceWith" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="RedundantSamConstructor" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
<option name="processCode" value="true" />
<option name="processLiterals" value="true" />
<option name="processComments" value="true" />
</inspection_tool>
<inspection_tool class="UnusedSymbol" enabled="false" level="WARNING" enabled_by_default="false" />
</profile>
</component>

6
.idea/kotlinc.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KotlinJpsPluginSettings">
<option name="version" value="2.0.20" />
</component>
</project>

10
.idea/migrations.xml Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>

View File

@ -3,14 +3,18 @@
<component name="DesignSurface">
<option name="filePathToZoomLevelMap">
<map>
<entry key="..\:/Users/sergiodt/.gradle/caches/transforms-3/e9164bf73e63cfbbe0209ceba1baaefb/transformed/jetified-android-image-picker-3.0.0-beta5/res/layout/ef_fragment_image_picker.xml" value="0.13508771929824562" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable-v24/background_gradient.xml" value="0.1" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable-v24/background_round_corner.xml" value="0.2205" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable-v24/ic_collection.xml" value="0.1705" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable-v24/ic_history_orang.xml" value="0.22037037037037038" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable-v24/ic_history_orange_24dp.xml" value="0.16666666666666666" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable-v24/ic_launcher_foreground.xml" value="0.13541666666666666" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable-v24/selector_bottombar_text.xml" value="0.13541666666666666" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/alpha_b_circle_outline.xml" value="0.2359375" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/alpha_f_circle_outline.xml" value="0.1" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/background_and_round.xml" value="0.2185" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/background_and_round_collection_fragment.xml" value="0.269" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/background_item_color.xml" value="0.1" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/background_oval_checked.xml" value="0.2359375" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/background_oval_unchecked.xml" value="0.30052083333333335" />
@ -18,6 +22,7 @@
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/background_round_corner.xml" value="0.2205" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/background_round_square.xml" value="0.2205" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/background_roundl.xml" value="0.232" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/background_test.xml" value="0.269" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/barcode.xml" value="0.2359375" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/barcode_scan.xml" value="0.1" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/border.xml" value="0.27447916666666666" />
@ -40,10 +45,12 @@
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/car.xml" value="0.30052083333333335" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/car_control.xml" value="0.22407407407407406" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/car_info.xml" value="0.2916666666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/check.xml" value="0.1305" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/circleshape.xml" value="0.11979166666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/component_progress.xml" value="0.11979166666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/crane.xml" value="0.23802083333333332" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/custom_ripple.xml" value="0.2175" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/custom_ripple_nomenuinit.xml" value="0.213" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/day_of_sale.xml" value="0.184375" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/delete.xml" value="0.19166666666666668" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/drawable_white_circle.xml" value="0.1775" />
@ -60,9 +67,12 @@
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_barcode_ui_selected.xml" value="0.212" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_baseline_star_24.xml" value="0.1775" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_build_black_24dp.xml" value="0.22708333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_chevron_left.xml" value="0.215" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_chevron_right_black_24dp.xml" value="0.1775" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_claim_ui.xml" value="0.186" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_claims.xml" value="0.2425" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_cmr.xml" value="0.267" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_collectionTicket.xml" value="0.1905" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_controller_ui.xml" value="0.212" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_controller_ui_selected.xml" value="0.212" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_corridor_ui.xml" value="0.186" />
@ -81,6 +91,7 @@
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_init_selected.xml" value="0.26" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_init_ui.xml" value="0.212" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_init_ui_selected.xml" value="0.212" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_item.xml" value="0.1" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_launcher_background.xml" value="0.24010416666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_local_florist_black_24dp.xml" value="0.15052083333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_local_florist_black_24dp_selected.xml" value="0.21041666666666667" />
@ -88,10 +99,15 @@
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_local_parking_orange_24dp.xml" value="0.21041666666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_local_shipping_black_24dp.xml" value="0.11979166666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_local_shipping_black_24dp_selected.xml" value="0.11979166666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_logo.xml" value="0.266" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_logo_salix.xml" value="0.266" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_loyalty_black_24dp.xml" value="0.21041666666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_mode_edit_black_24dp.xml" value="0.15052083333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_more_vert_black_24dp.xml" value="0.26" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_move_to_inbox_black_24dp.xml" value="0.15052083333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_packaging.xml" value="0.258" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_packing_mistake.xml" value="0.1315" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_pallet_scan_expedition.xml" value="0.1005" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_pallet_ui.xml" value="0.212" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_parking_ui.xml" value="0.212" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_parking_ui_selected.xml" value="0.212" />
@ -99,6 +115,7 @@
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_playlist_add_black_24dp.xml" value="0.15052083333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_print_black_24dp.xml" value="0.15052083333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_qr_ui.xml" value="0.212" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_reubication.xml" value="0.138" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_send_black_24dp.xml" value="0.134375" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_setting_ui.xml" value="0.26" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_setting_ui_selected.xml" value="0.26" />
@ -110,7 +127,9 @@
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_start_ok.xml" value="0.15052083333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_streetview_black_24dp.xml" value="0.15052083333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_swap_horiz_black_24dp.xml" value="0.11979166666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_ticket.xml" value="0.1705" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_transaction.xml" value="0.22708333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_ubicator_check.xml" value="0.2295" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_verified_user_black_24dp.xml" value="0.1" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_verified_user_black_24dp_selected.xml" value="0.1" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_visibility.xml" value="0.1775" />
@ -118,8 +137,11 @@
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_visibility_black_24dp_white.xml" value="0.2546875" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_visibility_white_24dp.xml" value="0.2546875" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_vn_logo_negativo_app_warehouse.xml" value="0.18" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/ic_worker.xml" value="0.265" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/init_icon.xml" value="0.2635" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/init_selected_icon.xml" value="0.2635" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/lift.xml" value="0.1925" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/list_divider_items.xml" value="0.1985" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/movie_plus_outline.xml" value="0.134375" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/pallet_shipping.xml" value="0.1" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/pallet_shipping_black.xml" value="0.1" />
@ -129,6 +151,7 @@
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/qrcode_scan.xml" value="0.17395833333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/rectangle.xml" value="0.31979166666666664" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/revision_icon.xml" value="0.1" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/round.xml" value="0.1915" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/round_av_timer_24.xml" value="0.15052083333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/round_outline.xml" value="0.11979166666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable/settings_icon.xml" value="0.2635" />
@ -140,13 +163,16 @@
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/activity_login.xml" value="0.1" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/activity_main.xml" value="0.17916666666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/buyers_fragment.xml" value="0.18333333333333332" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/component_custom_dialog.xml" value="0.1490036231884058" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/component_custom_dialog.xml" value="0.3333333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/component_custom_edit_dialog.xml" value="0.3333333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/component_custom_hour.xml" value="0.1793478260869565" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/component_custom_edit_dialog_three_values.xml" value="0.2" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/component_custom_edit_dialog_two_values.xml" value="0.2203125" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/component_custom_hour.xml" value="0.3333333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/component_custom_list_dialog.xml" value="0.3333333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/component_custom_three_dialog.xml" value="0.12817028985507245" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/component_custom_two_dialog.xml" value="0.1793478260869565" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_ajustes.xml" value="0.3333333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/component_custom_three_dialog.xml" value="0.3333333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/component_custom_two_dialog.xml" value="0.3333333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/component_custom_ubicador_dialog.xml" value="0.2453125" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_ajustes.xml" value="0.24166666666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_automatic_add_item.xml" value="0.20625" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_buffer.xml" value="0.1408514492753623" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_buffer_load.xml" value="0.20923913043478262" />
@ -154,7 +180,7 @@
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_buscar_item.xml" value="0.21014492753623187" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_buscar_item_all.xml" value="0.3333333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_collection.xml" value="0.3333333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_controlador.xml" value="0.20153985507246377" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_controlador.xml" value="0.22" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_expedition_pallet.xml" value="0.1793478260869565" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_expedition_pallet_detail.xml" value="0.15579710144927536" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_expedition_scan.xml" value="0.21666666666666667" />
@ -162,38 +188,47 @@
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_expeditionscan_sorter.xml" value="0.196875" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_expeditionstate.xml" value="0.1" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_faltas.xml" value="0.1793478260869565" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_general_black.xml" value="0.20878623188405798" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_general_black.xml" value="0.264" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_historico.xml" value="0.1734375" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_historicovehiculo.xml" value="0.23052536231884058" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_inventary.xml" value="0.11271529888551166" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_inventary.xml" value="0.264" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_inventary_old.xml" value="0.22604166666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_item_card.xml" value="0.16666666666666666" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_itemdayofsale_card.xml" value="0.1693840579710145" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_item_card.xml" value="0.22" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_itemdayofsale_card.xml" value="0.22" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_itemexpeditionstate_card.xml" value="0.22" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_itemproposal.xml" value="0.22" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_itemshelvingdayofsale.xml" value="0.3333333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_itemshelvinglog.xml" value="0.3333333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_itemshelvinglog.xml" value="0.28169014084507044" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_login.xml" value="0.22" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_packaging.xml" value="0.1956140350877193" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_packaging_count.xml" value="0.23229166666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_packaging_obs.xml" value="0.1" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_packaging_summary.xml" value="0.2" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_packaging_supplier.xml" value="0.2515625" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_paletizador_menu.xml" value="0.13829787234042554" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_parking.xml" value="0.5" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_parking.xml" value="0.16666666666666666" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_pasillero.xml" value="0.21" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_pre_sacador.xml" value="0.16666666666666666" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_pre_sacador.xml" value="0.29809358752166376" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_qr.xml" value="0.19882246376811594" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_reubication_collection.xml" value="0.22083333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_sacador.xml" value="0.12952898550724637" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_sacador_associatesmarttag.xml" value="0.22" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_shelving_parking.xml" value="0.1793478260869565" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_shelvinglog.xml" value="0.3333333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_smarttag_register.xml" value="0.3118811881188119" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_testing_print.xml" value="0.12462006079027356" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_transferencia.xml" value="0.10666666666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_ubicador.xml" value="0.22" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_vehiclecontrol.xml" value="0.1546875" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_vehiclecontrol.xml" value="0.3333333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_vehiclecontrol_user.xml" value="0.23052536231884058" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_web.xml" value="0.2463768115942029" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/fragment_workermistake.xml" value="0.2265625" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_ajustes_row.xml" value="0.10009057971014493" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/ic_packing_mistake.xml" value="0.1" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_ajustes_row.xml" value="0.16666666666666666" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_article_row.xml" value="0.3333333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_article_row_fragment.xml" value="0.3333333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_article_row_presacador.xml" value="0.4466666666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_article_row_fragment.xml" value="0.3275862068965517" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_article_row_presacador.xml" value="0.4" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_article_row_reubication_fragment.xml" value="0.36614583333333334" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_barcode_row.xml" value="0.15579710144927536" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_buyer_row.xml" value="0.1793478260869565" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_card_row.xml" value="0.2269021739130435" />
@ -206,15 +241,19 @@
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_expeditiontruck_row.xml" value="0.1793478260869565" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_faltas_row.xml" value="0.1793478260869565" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_general_row.xml" value="0.13360507246376813" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_general_row_image.xml" value="0.2131578947368421" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_historico_row.xml" value="0.15353260869565216" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_historicovehiculo_row.xml" value="0.18795289855072464" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_inventary_row.xml" value="0.22604166666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_image_row.xml" value="0.1" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_inventary_row.xml" value="0.15163934426229508" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_itemshelvingdayofsale_row.xml" value="0.18206521739130435" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_itemsupplier_row.xml" value="0.1" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_location_all_row.xml" value="0.12259371833839919" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_location_row.xml" value="0.16875" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_main_menu.xml" value="0.15070921985815602" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_main_menu.xml" value="0.3333333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_pasilleros_main_menu.xml" value="0.33" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_placement_row.xml" value="0.1793478260869565" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_placement_reubication_row.xml" value="0.27447916666666666" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_placement_row.xml" value="0.3333333333333333" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_proposal_row.xml" value="0.22604166666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_reposicion.xml" value="0.1" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_shelvingdayofsale_row.xml" value="0.2375" />
@ -223,22 +262,78 @@
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_smarttag_row.xml" value="0.20153985507246377" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_toolbar_row.xml" value="0.15307971014492755" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_ubication_row.xml" value="0.11822916666666666" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_work_forms_row.xml" value="0.1" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_worker_image.xml" value="0.23177083333333334" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/item_workermistake_row.xml" value="0.4466666666666667" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/qauality_fragment.xml" value="0.15353260869565216" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/reposicion_fragment.xml" value="0.15353260869565216" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/shelvinglog_row.xml" value="0.18385416666666668" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/testing_print.xml" value="0.1802536231884058" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/toolbar.xml" value="0.15353260869565216" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/toolbarUI.xml" value="0.29846014492753625" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/toolbar_fragment.xml" value="0.18" />
<entry key="..\:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout/toolbar_fragment.xml" value="0.22" />
</map>
</option>
</component>
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<component name="NullableNotNullManager">
<option name="myDefaultNullable" value="androidx.annotation.Nullable" />
<option name="myDefaultNotNull" value="androidx.annotation.NonNull" />
<option name="myNullables">
<value>
<list size="16">
<item index="0" class="java.lang.String" itemvalue="com.android.annotations.Nullable" />
<item index="1" class="java.lang.String" itemvalue="org.jspecify.nullness.Nullable" />
<item index="2" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
<item index="3" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
<item index="4" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
<item index="5" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
<item index="6" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.Nullable" />
<item index="7" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
<item index="8" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
<item index="9" class="java.lang.String" itemvalue="jakarta.annotation.Nullable" />
<item index="10" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
<item index="11" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
<item index="12" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
<item index="13" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
<item index="14" class="java.lang.String" itemvalue="android.annotation.Nullable" />
<item index="15" class="java.lang.String" itemvalue="org.jspecify.annotations.Nullable" />
</list>
</value>
</option>
<option name="myNotNulls">
<value>
<list size="15">
<item index="0" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
<item index="1" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
<item index="2" class="java.lang.String" itemvalue="jakarta.annotation.Nonnull" />
<item index="3" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
<item index="4" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
<item index="5" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
<item index="6" class="java.lang.String" itemvalue="org.jspecify.nullness.NonNull" />
<item index="7" class="java.lang.String" itemvalue="com.android.annotations.NonNull" />
<item index="8" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
<item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
<item index="10" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
<item index="11" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
<item index="12" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.NonNull" />
<item index="13" class="java.lang.String" itemvalue="android.annotation.NonNull" />
<item index="14" class="java.lang.String" itemvalue="org.jspecify.annotations.NonNull" />
</list>
</value>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
<component name="VisualizationToolProject">
<option name="state">
<ProjectState>
<option name="scale" value="0.2298076923076923" />
</ProjectState>
</option>
</component>
</project>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$/../.." />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

43
.idea/navEditor.xml Normal file
View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="navEditor-manualLayoutAlgorithm2">
<option name="myPositions">
<map>
<entry key="nav_graph.xml">
<value>
<LayoutPositions>
<option name="myPositions">
<map>
<entry key="ajustesFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="-226" />
<option name="y" value="103" />
</Point>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="showTicketFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="-512" />
<option name="y" value="86" />
</Point>
</option>
</LayoutPositions>
</value>
</entry>
</map>
</option>
</LayoutPositions>
</value>
</entry>
</map>
</option>
</component>
</project>

263
.idea/other.xml Normal file
View File

@ -0,0 +1,263 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="direct_access_persist.xml">
<option name="deviceSelectionList">
<list>
<PersistentDeviceSelectionData>
<option name="api" value="27" />
<option name="brand" value="DOCOMO" />
<option name="codename" value="F01L" />
<option name="id" value="F01L" />
<option name="manufacturer" value="FUJITSU" />
<option name="name" value="F-01L" />
<option name="screenDensity" value="360" />
<option name="screenX" value="720" />
<option name="screenY" value="1280" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="28" />
<option name="brand" value="DOCOMO" />
<option name="codename" value="SH-01L" />
<option name="id" value="SH-01L" />
<option name="manufacturer" value="SHARP" />
<option name="name" value="AQUOS sense2 SH-01L" />
<option name="screenDensity" value="480" />
<option name="screenX" value="1080" />
<option name="screenY" value="2160" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="31" />
<option name="brand" value="samsung" />
<option name="codename" value="a51" />
<option name="id" value="a51" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy A51" />
<option name="screenDensity" value="420" />
<option name="screenX" value="1080" />
<option name="screenY" value="2400" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="google" />
<option name="codename" value="akita" />
<option name="id" value="akita" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel 8a" />
<option name="screenDensity" value="420" />
<option name="screenX" value="1080" />
<option name="screenY" value="2400" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="33" />
<option name="brand" value="samsung" />
<option name="codename" value="b0q" />
<option name="id" value="b0q" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy S22 Ultra" />
<option name="screenDensity" value="600" />
<option name="screenX" value="1440" />
<option name="screenY" value="3088" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="32" />
<option name="brand" value="google" />
<option name="codename" value="bluejay" />
<option name="id" value="bluejay" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel 6a" />
<option name="screenDensity" value="420" />
<option name="screenX" value="1080" />
<option name="screenY" value="2400" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="29" />
<option name="brand" value="samsung" />
<option name="codename" value="crownqlteue" />
<option name="id" value="crownqlteue" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy Note9" />
<option name="screenDensity" value="420" />
<option name="screenX" value="2220" />
<option name="screenY" value="1080" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="samsung" />
<option name="codename" value="dm3q" />
<option name="id" value="dm3q" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy S23 Ultra" />
<option name="screenDensity" value="600" />
<option name="screenX" value="1440" />
<option name="screenY" value="3088" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="33" />
<option name="brand" value="google" />
<option name="codename" value="felix" />
<option name="id" value="felix" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel Fold" />
<option name="screenDensity" value="420" />
<option name="screenX" value="2208" />
<option name="screenY" value="1840" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="33" />
<option name="brand" value="google" />
<option name="codename" value="felix_camera" />
<option name="id" value="felix_camera" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel Fold (Camera-enabled)" />
<option name="screenDensity" value="420" />
<option name="screenX" value="2208" />
<option name="screenY" value="1840" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="33" />
<option name="brand" value="samsung" />
<option name="codename" value="gts8uwifi" />
<option name="id" value="gts8uwifi" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy Tab S8 Ultra" />
<option name="screenDensity" value="320" />
<option name="screenX" value="1848" />
<option name="screenY" value="2960" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="google" />
<option name="codename" value="husky" />
<option name="id" value="husky" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel 8 Pro" />
<option name="screenDensity" value="390" />
<option name="screenX" value="1008" />
<option name="screenY" value="2244" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="30" />
<option name="brand" value="motorola" />
<option name="codename" value="java" />
<option name="id" value="java" />
<option name="manufacturer" value="Motorola" />
<option name="name" value="G20" />
<option name="screenDensity" value="280" />
<option name="screenX" value="720" />
<option name="screenY" value="1600" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="33" />
<option name="brand" value="google" />
<option name="codename" value="lynx" />
<option name="id" value="lynx" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel 7a" />
<option name="screenDensity" value="420" />
<option name="screenX" value="1080" />
<option name="screenY" value="2400" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="31" />
<option name="brand" value="google" />
<option name="codename" value="oriole" />
<option name="id" value="oriole" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel 6" />
<option name="screenDensity" value="420" />
<option name="screenX" value="1080" />
<option name="screenY" value="2400" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="33" />
<option name="brand" value="google" />
<option name="codename" value="panther" />
<option name="id" value="panther" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel 7" />
<option name="screenDensity" value="420" />
<option name="screenX" value="1080" />
<option name="screenY" value="2400" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="31" />
<option name="brand" value="samsung" />
<option name="codename" value="q2q" />
<option name="id" value="q2q" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy Z Fold3" />
<option name="screenDensity" value="420" />
<option name="screenX" value="1768" />
<option name="screenY" value="2208" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="samsung" />
<option name="codename" value="q5q" />
<option name="id" value="q5q" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy Z Fold5" />
<option name="screenDensity" value="420" />
<option name="screenX" value="1812" />
<option name="screenY" value="2176" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="30" />
<option name="brand" value="google" />
<option name="codename" value="r11" />
<option name="id" value="r11" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel Watch" />
<option name="screenDensity" value="320" />
<option name="screenX" value="384" />
<option name="screenY" value="384" />
<option name="type" value="WEAR_OS" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="30" />
<option name="brand" value="google" />
<option name="codename" value="redfin" />
<option name="id" value="redfin" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel 5" />
<option name="screenDensity" value="440" />
<option name="screenX" value="1080" />
<option name="screenY" value="2340" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="google" />
<option name="codename" value="shiba" />
<option name="id" value="shiba" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel 8" />
<option name="screenDensity" value="420" />
<option name="screenX" value="1080" />
<option name="screenY" value="2400" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="33" />
<option name="brand" value="google" />
<option name="codename" value="tangorpro" />
<option name="id" value="tangorpro" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel Tablet" />
<option name="screenDensity" value="320" />
<option name="screenX" value="1600" />
<option name="screenY" value="2560" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="29" />
<option name="brand" value="samsung" />
<option name="codename" value="x1q" />
<option name="id" value="x1q" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy S20" />
<option name="screenDensity" value="480" />
<option name="screenX" value="1440" />
<option name="screenY" value="3200" />
</PersistentDeviceSelectionData>
</list>
</option>
</component>
</project>

6
.idea/studiobot.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="StudioBotProjectSettings">
<option name="shareContext" value="OptedOut" />
</component>
</project>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
<mapping directory="" vcs="Git" />
</component>
</project>

1518
.idea/workspace.xml Normal file

File diff suppressed because it is too large Load Diff

31
CHANGELOG.md Normal file
View File

@ -0,0 +1,31 @@
# Version XX.XX - XXXX-XX-XX
### Added 🆕
- feat: refs #5443 collectionFragmentChecker by:Sergio De la torre
- feat: refs#6845 userInterface by:Sergio De la torre
- feat: refs #6845 userIterface by:Sergio De la torre
- feat: refs #6861 reservas by:Sergio De la torre
- feat: refs #6869 itemShelvings (warehouse/dev_6078, warehouse/dev, dev_6078) by:Sergio De la
torre
- feat: refs #7266 printItem by:Sergio De la torre
- feat: refs #7922 scanOrder by:Sergio De la torre
- feat: refs #8020 controlVehiculos by:Sergio De la torre
- feat: refs #8022 kotlin versionCatalog by:Sergio De la torre
- feat: refs #8082 ticketPickup by:Sergio De la torre
- feat: refs #8099 addSalarySupplement by:Sergio De la torre
- feat: refs #8150 moveExpedition by:Sergio De la torre
- feat: refs #8150 moveExpeditions by:Sergio De la torre
- feat: refs #8175 crashlyticsAndUpdate by:Sergio De la torre
- feat: refs #8175 refactorCode by:Sergio De la torre
- feat: refs #8176 refactorSearchDialog by:Sergio De la torre
- feat: refs #8182 zoneClickable by:Sergio De la torre
- feat: refs#8213 reservas by:Sergio De la torre
### Changed 📦
- feat: refs #8175 refactorCode by:Sergio De la torre
- feat: refs #8176 refactorSearchDialog by:Sergio De la torre
### Fixed 🛠️

View File

@ -0,0 +1,20 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "es.verdnatura.alpha",
"variantName": "alphaRelease",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 200,
"versionName": "23.22.1Beta",
"outputFile": "app-alpha-release.apk"
}
],
"elementType": "File"
}

View File

@ -0,0 +1,20 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "es.verdnatura.beta",
"variantName": "beta",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 144,
"versionName": "9.6Beta",
"outputFile": "app-beta.apk"
}
],
"elementType": "File"
}

View File

@ -0,0 +1,37 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "es.verdnatura.sfusion",
"variantName": "betaRelease",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 314,
"versionName": "24.28Beta",
"outputFile": "app-beta-release.apk"
}
],
"elementType": "File",
"baselineProfiles": [
{
"minApi": 28,
"maxApi": 30,
"baselineProfiles": [
"baselineProfiles/1/app-beta-release.dm"
]
},
{
"minApi": 31,
"maxApi": 2147483647,
"baselineProfiles": [
"baselineProfiles/0/app-beta-release.dm"
]
}
],
"minSdkVersionForDexing": 26
}

View File

@ -0,0 +1,20 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "es.verdnatura.betatesting",
"variantName": "betatestingRelease",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 187,
"versionName": "23.20Beta",
"outputFile": "app-betatesting-release.apk"
}
],
"elementType": "File"
}

View File

@ -1,116 +1,148 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
//apply plugin: 'kotlin-android-extensions'//deprecated:sergio
apply plugin: 'kotlin-kapt'
apply plugin: 'com.google.gms.google-services'
//apply plugin: 'com.google.firebase.crashlytics'
apply plugin: 'com.google.firebase.crashlytics'
apply plugin: 'com.google.devtools.ksp'
android {
compileSdkVersion 30
// buildToolsVersion "29.0.3"
namespace = "es.verdnatura"
compileSdk 34
defaultConfig {
applicationId "es.verdnatura"
minSdkVersion 21
targetSdkVersion 30
versionCode 112
versionName "8.2" //versionCode 112 : desmarcar, previa update quantity dels carros, afegir P, etc.., impressores
//versionName "8.1" //versionCode 111 de proves . Instal.lat a Ismael y Juan
//versionName "8.1" //VERSION CODE 110, SOLO A V SE LE DESPLAZA LAS LINEAS EN PANTALLA CONTROLADOR
//versionName "8" //VERSION CODE 109, obligado seleccionar impresora, controlador sube el recyclerViewer, controlador ordenado por picked, mensaje error a collectioNew
minSdkVersion 26
targetSdkVersion 33 // se deja con target si no Play Protect la bloquea
versionCode 330
versionName = "24.38"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
/*debuggable false
shrinkResources true
minifyEnabled true*/
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
//package de la app general = "package_name": "es.verdnatura"
//package de la app beta = "package_name": "es.verdnatura.sfusion"
applicationVariants.all { variant ->
variant.outputs.all { output ->
def flavorName = variant.productFlavors[0].name
def apkName
if (flavorName == "beta") {
apkName = "vn-pickingBeta.apk"
} else if (flavorName == "general") {
apkName = "vn-picking.apk"
} else {
apkName = "vn-picking.apk"
}
output.outputFileName = apkName
}
}
}
flavorDimensions += "version"
productFlavors {
create("beta") {
applicationIdSuffix = ".sfusion"
}
create("general") {
//versionNameSuffix = "General"
}
}
buildFeatures {
viewBinding = true
}
/*kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures {
compose = true
}
kotlin {
jvmToolchain(8)
}
composeOptions {
kotlinCompilerExtensionVersion = "1.4.3"
}
*/
dataBinding {
enabled = true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.google.firebase:firebase-crashlytics-ktx:19.0.3'
implementation 'com.google.firebase:firebase-analytics-ktx:22.0.2'
implementation 'com.google.android.gms:play-services-location:21.3.0'
implementation 'androidx.navigation:navigation-fragment-ktx:2.7.7'
implementation 'androidx.navigation:navigation-ui-ktx:2.7.7'
implementation 'androidx.core:core-ktx:1.13.1'
kapt "androidx.room:room-compiler:2.6.1"
implementation 'androidx.room:room-ktx:2.6.1'
debugImplementation fileTree(dir: 'libs/debug', include: ['*.jar'])
releaseImplementation fileTree(dir: 'libs/release', include: ['*.jar'])
//navigation
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'
implementation("androidx.drawerlayout:drawerlayout:1.1.1")
//canvas
implementation 'com.simplify:ink:1.0.0'
// Kotlin and Android
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'androidx.core:core-ktx:1.13.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.google.android.material:material:1.0.0'
implementation 'com.squareup.retrofit2:retrofit:2.0.2'
//tests
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
implementation 'com.google.android.material:material:1.12.0'
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
implementation "com.airbnb.android:lottie:$lottieVersion"
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0'
//preferences
implementation 'androidx.preference:preference-ktx:1.1.1'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
//Fragments
implementation("androidx.fragment:fragment-ktx:1.3.6")
implementation("androidx.fragment:fragment-ktx:1.8.2")
// Architecture components
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle"
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.8.4"
implementation "androidx.legacy:legacy-support-v4:1.0.0"
//Koin new resolve
//kotlin implementation in mavencentral--> jcenter deprecated
implementation "io.insert-koin:koin-core:$koin"
implementation "io.insert-koin:koin-android:$koin"
implementation "io.insert-koin:koin-androidx-scope:$koin"
implementation "io.insert-koin:koin-androidx-viewmodel:$koin"
// Koin for DI
//implementation "org.koin:koin-core:$koin"
//implementation "org.koin:koin-android:$koin"
//implementation "org.koin:koin-androidx-scope:$koin"
//implementation "org.koin:koin-androidx-viewmodel:$koin"
// Image libraries
implementation "io.coil-kt:coil:$coil"
implementation "com.github.bumptech.glide:glide:$glide"
implementation "com.github.bumptech.glide:okhttp3-integration:$glide"
kapt "com.github.bumptech.glide:compiler:$glide"
//kapt "com.github.bumptech.glide:compiler:$glide"
ksp("com.github.bumptech.glide:ksp:$glide")
// Add the Firebase Crashlytics SDK.
implementation 'com.google.firebase:firebase-analytics:17.5.0'
//implementation 'com.google.firebase:firebase-crashlytics:17.2.1'
implementation 'com.google.firebase:firebase-analytics:22.0.2'
//search
implementation 'com.github.mirrajabi:search-dialog:1.1'
@ -118,5 +150,20 @@ dependencies {
//logs
implementation 'com.jakewharton.timber:timber:4.7.1'
//pickerImage
implementation 'com.github.esafirm:android-image-picker:3.0.0-beta5'
//preferences
implementation("androidx.datastore:datastore-preferences:1.1.1")
implementation 'androidx.datastore:datastore-core:1.1.1'
// Compose
/* implementation(platform("androidx.compose:compose-bom:2024.02.01"))
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.material:material")
implementation("androidx.compose.runtime:runtime")
implementation("androidx.activity:activity-compose:1.8.2")
implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.ui:ui-tooling-preview")*/
}

178
app/build.gradle.kts Normal file
View File

@ -0,0 +1,178 @@
plugins {
id("com.android.application")
id("kotlin-android")
id("kotlin-kapt")
id("com.google.gms.google-services")
id("com.google.firebase.crashlytics")
id("com.google.devtools.ksp")
id("org.jetbrains.kotlin.plugin.compose")
}
android {
namespace = "es.verdnatura"
compileSdk = 35
defaultConfig {
applicationId = "es.verdnatura"
minSdk = 26
targetSdk = 33 // se deja con target si no Play Protect la bloquea
versionCode = 405
versionName = "25.12" // REvisor para reservas
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
getByName("release") {
//debuggable = false
//shrinkResources = true
//minifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
)
}
getByName("debug") {
isMinifyEnabled = false
}
}
//package de la app general = "package_name": "es.verdnatura"
//package de la app beta = "package_name": "es.verdnatura.sfusion"
applicationVariants.all { variant ->
variant.outputs.all { output ->
val flavorName = variant.productFlavors[0].name
val buildTypeName = variant.buildType.name
val apkName = when (flavorName) {
"beta" -> "vn-pickingBeta-${buildTypeName}.apk"
else -> "vn-picking-${buildTypeName}.apk"
}
output.outputFile.renameTo(File(output.outputFile.parentFile, apkName))
true
}
}
flavorDimensions += "version"
productFlavors {
create("beta") {
applicationIdSuffix = ".sfusion"
}
create("general") {}
}
kapt {
correctErrorTypes = true
useBuildCache = true
kotlinOptions {
languageVersion = "1.9"
}
}
buildFeatures {
viewBinding = true
//compose = true
/*kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.4.3"
}
*/
dataBinding = true
compose = true
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
/* composeOptions {
kotlinCompilerExtensionVersion = "1.5.15"
}*/
/* kotlin {
jvmToolchain(17)
}
kotlinOptions {
jvmTarget = "17"
}*/
dependencies {
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
implementation(libs.firebase.crashlytics.ktx)
implementation(libs.firebase.analytics.ktx)
implementation(libs.play.services.location)
implementation(libs.navigation.fragment.ktx)
implementation(libs.androidx.navigation.ui.ktx)
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.recyclerview)
implementation(libs.androidx.room.ktx)
//kapt(libs.androidx.room.compiler)
ksp(libs.androidx.room.compiler)
implementation(libs.androidx.room.runtime)
implementation(libs.ink)
implementation(libs.kotlin.stdlib.jdk7)
implementation(libs.androidx.appcompat)
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.constraintlayout)
implementation(libs.androidx.legacy.support.v4)
implementation(libs.androidx.lifecycle.extensions)
implementation(libs.material)
implementation(libs.retrofit)
implementation(libs.converter.gson)
implementation(libs.converter.scalars)
implementation(libs.lottie)
implementation(libs.androidx.swiperefreshlayout)
implementation(libs.androidx.fragment.ktx)
implementation(libs.androidx.lifecycle.viewmodel.ktx)
implementation(libs.androidx.lifecycle.livedata.ktx)
implementation(libs.androidx.legacy.support.v4)
implementation(libs.koin.core)
implementation(libs.koin.android)
implementation(libs.koin.androidx.scope)
implementation(libs.koin.androidx.viewmodel)
implementation(libs.glide)
implementation(libs.okhttp3.integration)
ksp(libs.glide.ksp)
implementation(libs.firebase.analytics)
implementation(libs.android.image.picker)
implementation(libs.androidx.datastore.preferences)
implementation(libs.androidx.datastore.core)
implementation(libs.zxing.android.embedded) { isTransitive = false }
implementation(libs.core)
//implementation(libs.koin.androidx.compose)
// Compose
val composeBom = platform("androidx.compose:compose-bom:2024.10.01")
implementation(composeBom)
androidTestImplementation(composeBom)
// Choose one of the following:
// Material Design 3
implementation(libs.androidx.material3)
implementation(libs.androidx.ui)
// Android Studio Preview support
implementation(libs.androidx.ui.tooling.preview)
debugImplementation(libs.androidx.ui.tooling)
// UI Tests
androidTestImplementation(libs.androidx.ui.test.junit4)
debugImplementation(libs.androidx.ui.test.manifest)
// custom design system based on Foundation)
//implementation(libs.androidx.material.icons.core)
// Optional - Add full set of material icons
implementation(libs.androidx.material.icons.extended)
// Optional - Add window size utils
implementation(libs.androidx.adaptive)
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.lifecycle.viewmodel.compose)
implementation(libs.lottie.compose)
testImplementation(libs.junit)
}
}

View File

@ -0,0 +1,20 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "es.verdnatura",
"variantName": "debug",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 144,
"versionName": "9.6Beta",
"outputFile": "app-debug.apk"
}
],
"elementType": "File"
}

View File

@ -1,34 +1,91 @@
{
"project_info": {
"project_number": "519813071137",
"firebase_url": "https://gestoralmacen-bfa2a.firebaseio.com",
"project_id": "gestoralmacen-bfa2a",
"storage_bucket": "gestoralmacen-bfa2a.appspot.com"
"project_number": "975691769093",
"project_id": "picking-2b9a0",
"storage_bucket": "picking-2b9a0.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:519813071137:android:3de54686c580a6f79dfe60",
"mobilesdk_app_id": "1:975691769093:android:83eff0dadf5ca9d3e3c36c",
"android_client_info": {
"package_name": "es.verdnatura"
}
},
"oauth_client": [
{
"client_id": "519813071137-5099s9mme9juufnrkm88ajt5n7cmluqh.apps.googleusercontent.com",
"client_id": "975691769093-j2u5241eac30n2saa1mvbguq670tsvd0.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyA74wQCwDCpCjWs49lCX5m2SsdqcYb_J8s"
"current_key": "AIzaSyC3skTw7I7BbOuSS4jOBa373zV5e8wCMDM"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "519813071137-5099s9mme9juufnrkm88ajt5n7cmluqh.apps.googleusercontent.com",
"client_id": "975691769093-j2u5241eac30n2saa1mvbguq670tsvd0.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:975691769093:android:83eff0dadf5ca9d3e3c36c",
"android_client_info": {
"package_name": "es.verdnatura.sfusion"
}
},
"oauth_client": [
{
"client_id": "975691769093-j2u5241eac30n2saa1mvbguq670tsvd0.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyC3skTw7I7BbOuSS4jOBa373zV5e8wCMDM"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "975691769093-j2u5241eac30n2saa1mvbguq670tsvd0.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:975691769093:android:83eff0dadf5ca9d3e3c36c",
"android_client_info": {
"package_name": "es.verdnatura.alpha"
}
},
"oauth_client": [
{
"client_id": "975691769093-j2u5241eac30n2saa1mvbguq670tsvd0.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyC3skTw7I7BbOuSS4jOBa373zV5e8wCMDM"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "975691769093-j2u5241eac30n2saa1mvbguq670tsvd0.apps.googleusercontent.com",
"client_type": 3
}
]

View File

@ -1,6 +1,6 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
# proguardFiles setting in build.gradle.kts.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
@ -19,3 +19,6 @@
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
# Optimize options
#-keep class es.verdnatura.** { *; }

View File

@ -4,15 +4,15 @@
"type": "APK",
"kind": "Directory"
},
"applicationId": "es.verdnatura",
"applicationId": "es.verdnatura.sfusion",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 112,
"versionName": "8.2",
"versionCode": 161,
"versionName": "23.3Beta",
"outputFile": "app-release.apk"
}
],

Binary file not shown.

View File

@ -1,51 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="es.verdnatura">
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-feature
android:name="android.hardware.telephony"
android:required="false" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.PREVENT_POWER_KEY" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!--
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="com.zebra.provider.READ"/>-->
<uses-permission android:name="android.permission.LAUNCH_APPS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--<queries>
<provider android:authorities="oem_info" />
</queries>-->
<application
android:name=".MobileApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
<activity
android:name=".presentation.view.feature.articulo.fragment.ImageViewActivity"
android:configChanges="orientation"
android:screenOrientation="portrait" />
<application
android:name=".MobileApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
<activity android:name=".presentation.view.feature.imageview.activity.ImageViewActivity" android:configChanges="orientation"
android:screenOrientation="portrait"/>
<activity
android:name=".presentation.view.feature.main.activity.MainActivity"
android:windowSoftInputMode="stateHidden|adjustResize"
android:configChanges="orientation"
android:screenOrientation="portrait"/>
<activity
android:name=".presentation.view.feature.login.activity.LoginActivity"
android:configChanges="orientation"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<activity
android:name=".presentation.composable.ImageViewActivityComposable"
android:configChanges="orientation"
android:exported="false"
android:screenOrientation="portrait" />
<activity
android:name=".presentation.view.feature.restaurant.RestaurantActivity"
android:configChanges="orientation"
android:screenOrientation="portrait" />
<activity
android:name=".presentation.view.feature.main.activity.MainActivity"
android:configChanges="orientation"
android:exported="true"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity
android:name=".presentation.view.feature.delivery.activity.SignedActivity"
android:configChanges="orientation"
android:exported="true"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity
android:name=".presentation.view.feature.login.activity.LoginActivity"
android:configChanges="orientation"
android:exported="true"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
</activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@ -1,20 +1,186 @@
package es.verdnatura
import android.app.Activity
import android.app.Application
import android.graphics.Color
import android.media.MediaPlayer
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.widget.Toast
import es.verdnatura.dataStore.DataStoreLocal
import es.verdnatura.di.viewModelModule
import es.verdnatura.domain.ConstAndValues
import es.verdnatura.domain.RestClient
import es.verdnatura.domain.SalixService
import es.verdnatura.domain.toast
import es.verdnatura.presentation.common.InteceptorListener
import es.verdnatura.presentation.common.LoginListener
import es.verdnatura.presentation.common.MainActivityListener
import es.verdnatura.presentation.common.SignListener
import es.verdnatura.presentation.view.component.CustomDialogMainActivity
import es.verdnatura.presentation.view.feature.login.activity.LoginActivity
import kotlinx.coroutines.runBlocking
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.loadKoinModules
import org.koin.core.context.startKoin
import java.io.File
class MobileApplication : Application(), InteceptorListener {
private lateinit var interceptoreListener: InteceptorListener
private var mainActivityListener: MainActivityListener? = null
private var loginListener: LoginListener? = null
private var signListener: SignListener? = null
private var isActivityLoginRunning = false
fun setMainListener(listener: MainActivityListener) {
mainActivityListener = listener
}
fun setLoginListener(listener: LoginListener) {
loginListener = listener
}
fun setSignListener(listener: SignListener) {
signListener = listener
}
lateinit var salix: SalixService
var userId: Int? = null
var userName: String? = null
var renewPeriod: Long = 0
var renewInterval: Long = 0
var userPassword: String? = null
var hasNetwork: Boolean = true
var serialNumber: String? = ""
var versionName: String = ""
var androidId: String = ""
var mperror: MediaPlayer? = null
var mpok: MediaPlayer? = null
var dataStoreApp = DataStoreLocal(this)
private lateinit var customDialog: CustomDialogMainActivity
private val handler = Handler(Looper.getMainLooper())
class MobileApplication: Application() {
override fun onCreate() {
super.onCreate()
startKoin { androidContext(this@MobileApplication)
mperror = MediaPlayer.create((this), R.raw.error)
mpok = MediaPlayer.create((this), R.raw.ok)
startKoin {
androidContext(this@MobileApplication)
val moduleList = listOf(viewModelModule)
loadKoinModules(moduleList)
}
runBlocking {
dataStoreApp.editDataStoreKey(
ConstAndValues.BASEURLSALIX, ConstAndValues.BASE_URL_SALIX
)
}
val restClient = RestClient(this, this)
salix = restClient.salixClient
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
}
override fun onActivityStarted(activity: Activity) {
}
override fun onActivityResumed(activity: Activity) {
isActivityLoginRunning = activity.javaClass == LoginActivity::class.java
}
override fun onActivityPaused(activity: Activity) {
if (activity.javaClass == LoginActivity::class.java) {
isActivityLoginRunning = false
}
}
override fun onActivityStopped(activity: Activity) {
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
}
override fun onActivityDestroyed(activity: Activity) {
isActivityLoginRunning = false
}
})
}
fun messageToast(isError: Boolean, message: String, isToasted: Boolean = false) {
when (isError) {
false -> mpok
true -> mperror
}?.start()
if (isToasted) message.toast(
this, color = if (isError) {
Color.RED
} else {
Color.BLUE
},
duration = if (isError) Toast.LENGTH_LONG else Toast.LENGTH_SHORT
)
}
fun isLoginRunning(): Boolean {
return isActivityLoginRunning
}
override fun onInterceptionResult(visibility: Int) {
if (mainActivityListener != null) {
handler.post {
(this.mainActivityListener)?.onApplicationEventAnimation(visibility)
}
}
if (loginListener != null) {
handler.post {
(this.loginListener)?.onApplicationEventAnimation(visibility)
}
}
if (signListener != null) {
handler.post {
(this.signListener)?.onApplicationEventAnimation(visibility)
}
}
}
fun getLanguage(): String {
val settings = this.resources.configuration
return settings.locales.get(0).language
}
fun clearApplicationData() {
try {
val cacheDir = this.cacheDir
val appDir = File(cacheDir.parent ?: return)
if (appDir.exists()) {
val children = appDir.list() ?: return
for (child in children) {
if (child != "lib") {
deleteDir(File(appDir, child))
}
}
}
} catch (e: Exception) {
e.printStackTrace()
}
}
private fun deleteDir(dir: File): Boolean {
if (dir.isDirectory) {
val children = dir.list() ?: return false
for (child in children) {
val success = deleteDir(File(dir, child))
if (!success) {
return false
}
}
}
return dir.delete()
}
}

View File

@ -0,0 +1,439 @@
package es.verdnatura.dataStore
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.intPreferencesKey
import androidx.datastore.preferences.core.longPreferencesKey
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStore
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import es.verdnatura.MobileApplication
import es.verdnatura.R
import es.verdnatura.domain.ConstAndValues.BASEURLLILIUM
import es.verdnatura.domain.ConstAndValues.BASEURLSALIX
import es.verdnatura.domain.ConstAndValues.BASE_URL_LILIUM
import es.verdnatura.domain.ConstAndValues.BASE_URL_SALIX
import es.verdnatura.domain.ConstAndValues.COMPANYFK
import es.verdnatura.domain.ConstAndValues.ENTRYID
import es.verdnatura.domain.ConstAndValues.ENTRYNUMBERIMAGES
import es.verdnatura.domain.ConstAndValues.ENTRYOBSERVATIONORIGINAL
import es.verdnatura.domain.ConstAndValues.ENTRYOBSERVATIONS
import es.verdnatura.domain.ConstAndValues.ITEMPACKING
import es.verdnatura.domain.ConstAndValues.NUMBEROFWAGONS
import es.verdnatura.domain.ConstAndValues.PRINTERFK
import es.verdnatura.domain.ConstAndValues.PRINTERFKDEFAULT
import es.verdnatura.domain.ConstAndValues.PRINTERNAME
import es.verdnatura.domain.ConstAndValues.RESERVATIONMODE
import es.verdnatura.domain.ConstAndValues.SECTORDESCRIP
import es.verdnatura.domain.ConstAndValues.SECTORFK
import es.verdnatura.domain.ConstAndValues.SECTORFKDEFAULT
import es.verdnatura.domain.ConstAndValues.SECTORISONRESERVATIONMODE
import es.verdnatura.domain.ConstAndValues.SUPPLIERID
import es.verdnatura.domain.ConstAndValues.SUPPLIERNAME
import es.verdnatura.domain.ConstAndValues.TRAINNAME
import es.verdnatura.domain.ConstAndValues.WAREHOUSEFK
import es.verdnatura.domain.ConstAndValues.WAREHOUSEFKDEFAULT
import es.verdnatura.domain.ConstAndValues.WORKFORMSELECTED
import es.verdnatura.presentation.view.feature.login.model.OperatorSalix
import es.verdnatura.presentation.view.feature.login.model.WorkForms
import es.verdnatura.presentation.view.feature.login.model.WorkerData
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.runBlocking
import org.json.JSONObject
import java.util.Calendar
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
val Context.dataStoreWork: DataStore<Preferences> by preferencesDataStore(name = "workForm")
class DataStoreLocal(var mobileApplication: MobileApplication) {
val IMAGES_KEY = stringPreferencesKey("images_key")
suspend fun saveDataOperator(operator: OperatorSalix) {
editDataStoreKey(
SECTORFK, if (operator.sector != null) {
operator.sector.id
} else {
SECTORFKDEFAULT
}
)
editDataStoreKey(
WAREHOUSEFK, if (operator.sector != null) {
operator.sector.warehouseFk
} else {
WAREHOUSEFKDEFAULT
}
)
editDataStoreKey(
SECTORDESCRIP, if (operator.sector != null) {
operator.sector.description
} else {
mobileApplication.getString(R.string.Sinsector)
}
)
editDataStoreKey(
PRINTERFK, if (operator.printer != null) {
operator.printer.id
} else {
PRINTERFKDEFAULT
}
)
editDataStoreKey(
PRINTERNAME, if (operator.printer != null) {
operator.printer.name
} else {
mobileApplication.getString(R.string.printerWithout)
}
)
editDataStoreKey(
TRAINNAME, if (operator.train != null) {
operator.train.name
} else {
""
}
)
editDataStoreKey(
NUMBEROFWAGONS, operator.numberOfWagons
)
editDataStoreKey(
ITEMPACKING,
if (operator.itemPackingTypeFk != null) operator.itemPackingTypeFk.toString() else ""
)
editDataStoreKey(
RESERVATIONMODE, operator.isOnReservationMode
)
}
//Tarea 6868
suspend fun saveWorkerData(operator: WorkerData) {
editDataStoreKey(
SECTORFK, if (operator.sector != null) {
operator.sector.id
} else {
SECTORFKDEFAULT
}
)
if (operator.sector?.isOnReservationMode != null) {
editDataStoreKey(
SECTORISONRESERVATIONMODE,
operator.sector.isOnReservationMode
)
} else {
mobileApplication.dataStore.edit { preferences ->
preferences.remove(stringPreferencesKey(SECTORISONRESERVATIONMODE))
}
}
editDataStoreKey(
WAREHOUSEFK, if (operator.sector != null) {
operator.sector.warehouseFk
} else {
WAREHOUSEFKDEFAULT
}
)
editDataStoreKey(
SECTORDESCRIP, if (operator.sector != null) {
operator.sector.description
} else {
mobileApplication.getString(R.string.Sinsector)
}
)
editDataStoreKey(
PRINTERFK, if (operator.printer != null) {
operator.printer.id
} else {
PRINTERFKDEFAULT
}
)
editDataStoreKey(
PRINTERNAME, if (operator.printer != null) {
operator.printer.name
} else {
mobileApplication.getString(R.string.printerWithout)
}
)
editDataStoreKey(
TRAINNAME, if (operator.train != null) {
operator.train.name
} else {
""
}
)
editDataStoreKey(
NUMBEROFWAGONS, operator.numberOfWagons
)
editDataStoreKey(
RESERVATIONMODE, operator.isOnReservationMode
)
editDataStoreKey(
ITEMPACKING,
operator.itemPackingTypeFk
)
}
suspend fun isPreferenceExists(key: String): Boolean {
val preferencesKey = booleanPreferencesKey(key)
val preferences = mobileApplication.dataStore.data.first()
return preferences.contains(preferencesKey)
}
inline fun <reified T> readDataStoreKey(key: String): T {
return when (T::class) {
Int::class ->
runBlocking {
mobileApplication.dataStore.data
.map { preferences -> preferences[intPreferencesKey(key)] ?: -1 }
.first() as T
}
String::class -> runBlocking {
mobileApplication.dataStore.data
.map { preferences ->
preferences[stringPreferencesKey(key)] ?: if (key == BASEURLSALIX) {
BASE_URL_SALIX
} else {
""
}
}
.first() as T
}
Boolean::class -> runBlocking {
mobileApplication.dataStore.data
.map { preferences -> preferences[booleanPreferencesKey(key)] ?: false }
.first() as T
}
Long::class -> runBlocking {
mobileApplication.dataStore.data
.map { preferences -> preferences[longPreferencesKey(key)] ?: 0 }
.first() as T
}
else -> "ERROR" as T
}
}
suspend fun editDataStoreKey(key: String, value: Any) {
mobileApplication.dataStore.edit { preferences ->
when (value) {
is Int -> preferences[intPreferencesKey(key)] = value
is String -> preferences[stringPreferencesKey(key)] = value
is Boolean -> preferences[booleanPreferencesKey(key)] = value
is Long -> preferences[longPreferencesKey(key)] = value
}
}
}
suspend fun saveImages(images: MutableList<com.esafirm.imagepicker.model.Image>?) {
val gson = Gson()
val imagesJson = gson.toJson(images)
mobileApplication.dataStore.edit { preferences ->
preferences[IMAGES_KEY] = imagesJson
}
}
fun getImages(): Flow<List<com.esafirm.imagepicker.model.Image>> {
val gson = Gson()
return mobileApplication.dataStore.data.map { preferences ->
val imagesJson = preferences[IMAGES_KEY]
?: return@map emptyList<com.esafirm.imagepicker.model.Image>()
val type = object : TypeToken<List<com.esafirm.imagepicker.model.Image>>() {}.type
gson.fromJson(imagesJson, type)
}
}
suspend fun deleteEntryPackaging() {
mobileApplication.dataStoreApp.editDataStoreKey(ENTRYID, -1)
mobileApplication.dataStoreApp.editDataStoreKey(SUPPLIERID, -1)
mobileApplication.dataStoreApp.editDataStoreKey(SUPPLIERNAME, "")
mobileApplication.dataStoreApp.editDataStoreKey(ENTRYOBSERVATIONORIGINAL, "")
mobileApplication.dataStoreApp.editDataStoreKey(ENTRYOBSERVATIONS, "")
mobileApplication.dataStoreApp.editDataStoreKey(ENTRYNUMBERIMAGES, 0)
mobileApplication.dataStoreApp.editDataStoreKey(COMPANYFK, -1)
}
suspend fun deleteImages() {
mobileApplication.dataStore.edit { preferences ->
preferences.remove(IMAGES_KEY)
}
}
suspend fun deleteWorkForm(nameWorkForm: Preferences.Key<String>) {
if (nameWorkForm.name == "all") {
mobileApplication.dataStoreWork.edit {
it.clear()
}
} else {
mobileApplication.dataStoreWork.edit { preferences ->
preferences.remove(nameWorkForm)
}
mobileApplication.dataStoreApp.editDataStoreKey(
WORKFORMSELECTED, "Producción"
)
saveWorkForm(
WorkForms(
"Producción",
"https://salix.verdnatura.es"
)
)
}
}
suspend fun getWorkForm(): List<WorkForms> {
val listForms: ArrayList<WorkForms> = ArrayList()
val preferences = mobileApplication.dataStoreWork.data.first()
preferences.asMap().forEach { entry ->
val key = entry.key
val value = entry.value
val json2 = JSONObject(value.toString())
listForms.add(
WorkForms(
key.name,
json2.get("urlSalix").toString(),
json2.get("isShowDelete").toString().toBoolean(),
json2.get("created") as Long
)
)
}
if (listForms.isEmpty() || listForms.size == 1) {
createWorksDefault()
}
//createWorksDefault()
return listForms.sortedBy { it.created }
}
private suspend fun createWorksDefault() {
saveWorkForm(
WorkForms(
"Producción",
"https://salix.verdnatura.es"
)
)
saveWorkForm(
WorkForms(
"Test",
urlSalix = "https://test-salix.verdnatura.es"
)
)
saveWorkForm(
WorkForms(
"Dev",
urlSalix = "https://dev-salix.verdnatura.es"
)
)
saveWorkForm(
WorkForms(
"Aula formación",
urlSalix = "http://pc525.samba.verdnatura.es:3000"
)
)
val working_in_test = false
if (working_in_test) {
saveWorkForm(
WorkForms(
"TestHome",
urlSalix = "https://test-salix.verdnatura.es"
)
)
saveWorkForm(
WorkForms(
"TestLOCAL",
urlSalix = "http://10.1.4.42:3000"
)
)
saveWorkForm(
WorkForms(
"TestLOCALHOME",
urlSalix = "http://192.168.1.139:3000"
)
)
saveWorkForm(
WorkForms(
"DEV SALIX",
urlSalix = "https://dev-salix.verdnatura.es"
)
)
} else {
//deleteWorkForm("all")
}
saveWorkForm(
WorkForms(
mobileApplication.getString(R.string.addWorkForm),
"",
isShowDelete = false,
created = Calendar.getInstance().timeInMillis + Calendar.getInstance().timeInMillis
)
)
}
suspend fun saveWorkForm(workForm: WorkForms) {
val gson = Gson()
val json = gson.toJson(workForm)
mobileApplication.dataStoreWork.edit { preferences ->
preferences[stringPreferencesKey(workForm.name)] = json
}
runBlocking {
mobileApplication.dataStoreApp.editDataStoreKey(
BASEURLSALIX,
workForm.urlSalix
)
}
}
fun getServerSalix(): String {
var url =
readDataStoreKey<String>(BASEURLSALIX)
if (url.isBlank()) {
url = BASE_URL_SALIX
}
return url
}
fun getServerLilium(): String {
var url =
readDataStoreKey<String>(BASEURLLILIUM)
if (url.isBlank()) {
url = BASE_URL_LILIUM
}
return url
}
}

View File

@ -0,0 +1,210 @@
package es.verdnatura.db
import android.content.Context
import androidx.room.Dao
import androidx.room.Database
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.ProvidedTypeConverter
import androidx.room.Query
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverter
import androidx.room.TypeConverters
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import es.verdnatura.presentation.view.feature.delivery.model.ClientTicketSalix
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoLoadUnload
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoPending
import es.verdnatura.presentation.view.feature.delivery.model.MyLocation
import es.verdnatura.presentation.view.feature.delivery.model.RouteInfo
import es.verdnatura.presentation.view.feature.delivery.model.RouteLoaded
import es.verdnatura.presentation.view.feature.delivery.model.SignedTickets
import es.verdnatura.presentation.view.feature.delivery.model.Ticket
import java.util.Date
// Clase que representa la base de datos
@Database(
entities = [ExpeditionInfoLoadUnload::class, ExpeditionInfoPending::class, SignedTickets::class, RouteInfo::class, ClientTicketSalix::class, RouteLoaded::class],
version = 1,
exportSchema = false
)
@TypeConverters(MapTypeConverter::class)
abstract class DeliveryDatabase : RoomDatabase() {
abstract fun expedicionDao(): ExpedicionDao
abstract fun signedTicketDao(): SignedTicketDao
abstract fun routesDao(): RoutesDao
abstract fun clienTicketDao(): ClientTicketDao
companion object {
@Volatile
private var INSTANCE: DeliveryDatabase? = null
fun getInstance(context: Context): DeliveryDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext, DeliveryDatabase::class.java, "expedition_database"
).fallbackToDestructiveMigration(true)
.addTypeConverter(MapTypeConverter())
.fallbackToDestructiveMigration(true)
.build()
INSTANCE = instance
instance
}
}
}
}
// Interfaz que define los métodos de acceso a datos para Expedicion
@Dao
interface ExpedicionDao {
@Query("SELECT * FROM expedition e WHERE e.routeFk = :parametro1")
suspend fun getAll(parametro1: Int): MutableList<ExpeditionInfoLoadUnload>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(expedition: MutableList<ExpeditionInfoLoadUnload>)
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertPending(expeditionPending: MutableList<ExpeditionInfoPending>)
@Query("SELECT * FROM expeditionPending ep WHERE ep.routeFk=:routeFk")
suspend fun getAllPending(routeFk: Int): MutableList<ExpeditionInfoLoadUnload>
@Query("SELECT * FROM expeditionPending")
suspend fun getAllPendingExpeditions(): MutableList<ExpeditionInfoPending>
@Delete
fun delete(expedition: ExpeditionInfoLoadUnload)
@Query("DELETE FROM expeditionPending WHERE code = :codeState")
suspend fun getDeleteByState(codeState: String)
@Query("DELETE FROM expeditionPending")
suspend fun getDeleteAllState()
}
@Dao
interface SignedTicketDao {
@Query("SELECT * FROM signedPending ")
suspend fun getAll(): List<SignedTickets>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(signedTicketPending: SignedTickets)
@Query("DELETE FROM signedPending WHERE fileName = :nameFile")
fun deleteByNameFile(nameFile: String)
}
@Dao
interface RoutesDao {
@Query("SELECT * FROM routes ")
suspend fun getAll(): List<RouteInfo>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(routes: List<RouteInfo>)
@Query("DELETE FROM routes ")
suspend fun delete()
@Query("DELETE FROM routes WHERE id = :routeId")
suspend fun deleteByNameFile(routeId: String)
@Query("SELECT * FROM routesLoaded ")
suspend fun getAllLoaded(): List<RouteLoaded>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertLoaded(routeLoaded: RouteLoaded)
@Query("DELETE FROM routes WHERE dated != :today")
suspend fun deleteLoaded(today: String)
}
@Dao
interface ClientTicketDao {
@Query("SELECT * FROM clientTickets ")
suspend fun getAll(): List<ClientTicketSalix>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(routes: List<ClientTicketSalix>)
@Query("DELETE FROM clientTickets ")
suspend fun delete()
@Query("DELETE FROM clientTickets WHERE id = :ticketId")
suspend fun deleteById(ticketId: Int)
}
@ProvidedTypeConverter
class MapTypeConverter {
private val gson = Gson()
@TypeConverter
fun fromMap(map: Map<String, String>): String {
return gson.toJson(map)
}
@TypeConverter
fun toMap(json: String): Map<String, String> {
val type = object : TypeToken<Map<String, String>>() {}.type
return gson.fromJson(json, type)
}
@TypeConverter
fun fromDate(date: Date): Long {
return date.time
}
@TypeConverter
fun toDate(timestamp: Long): Date {
return Date(timestamp)
}
@TypeConverter
fun fromMyLocation(location: MyLocation?): String? {
return gson.toJson(location)
}
@TypeConverter
fun toMyLocation(json: String?): MyLocation? {
val type = object : TypeToken<MyLocation>() {}.type
return gson.fromJson(json, type)
}
@TypeConverter
fun fromPhones(phones: List<String>): String {
return gson.toJson(phones)
}
@TypeConverter
fun toPhones(json: String): List<String> {
val type = object : TypeToken<List<String>>() {}.type
return gson.fromJson(json, type)
}
@TypeConverter
fun fromTickets(tickets: MutableList<Ticket>): String? {
return gson.toJson(tickets)
}
@TypeConverter
fun toTickets(json: String?): MutableList<Ticket> {
val type = object : TypeToken<MutableList<Ticket>>() {}.type
return gson.fromJson(json, type)
}
@TypeConverter
fun fromNullableMap(map: MutableMap<String?, String?>): String {
return gson.toJson(map)
}
@TypeConverter
fun toNullableMap(json: String): MutableMap<String?, String?> {
val type = object : TypeToken<MutableMap<String?, String?>>() {}.type
return gson.fromJson(json, type)
}
}

View File

@ -2,44 +2,52 @@ package es.verdnatura.di
import es.verdnatura.presentation.view.feature.ajustes.fragment.AjustesViewModel
import es.verdnatura.presentation.view.feature.articulo.fragment.ItemCardViewModel
import es.verdnatura.presentation.view.feature.boxPicking.BoxPickingViewModel
import es.verdnatura.presentation.view.feature.buffer.fragment.BufferFragmentViewModel
import es.verdnatura.presentation.view.feature.buscaritem.fragment.BuscarItemComposeViewModel
import es.verdnatura.presentation.view.feature.buscaritem.fragment.BuscarItemViewModel
import es.verdnatura.presentation.view.feature.calidad.fragment.BuyersViewModel
import es.verdnatura.presentation.view.feature.calidad.fragment.QaualityViewModel
import es.verdnatura.presentation.view.feature.claim.fragment.ClaimViewModel
import es.verdnatura.presentation.view.feature.category.ChangeCategoryViewModel
import es.verdnatura.presentation.view.feature.claim.fragment.ubication.ClaimViewModel
import es.verdnatura.presentation.view.feature.collection.fragment.CollectionCheckerViewModel
import es.verdnatura.presentation.view.feature.collection.fragment.CollectionViewModel
import es.verdnatura.presentation.view.feature.controlador.fragment.ControladorViewModel
import es.verdnatura.presentation.view.feature.collection.fragment.CollectionViewModelCheckerPreviosNew
import es.verdnatura.presentation.view.feature.controlvehiculo.fragment.ControlVehiculoViewModel
import es.verdnatura.presentation.view.feature.delivery.viewmodels.DeliveryViewModel
import es.verdnatura.presentation.view.feature.diadeventa.fragment.DayOfSaleViewModel
import es.verdnatura.presentation.view.feature.faltas.fragment.FaltasViewModel
import es.verdnatura.presentation.view.feature.diadeventa.fragment.DayOfSaleViewModelCompose
import es.verdnatura.presentation.view.feature.historicoarticulo.fragment.HistoricoArticuloViewModel
import es.verdnatura.presentation.view.feature.historicoshelving.fragment.itemShelvingLogViewModel
import es.verdnatura.presentation.view.feature.historicoshelvinglog.fragment.shelvingLogViewModel
import es.verdnatura.presentation.view.feature.historicovehiculo.fragment.HistoricoVehiculoViewModel
import es.verdnatura.presentation.view.feature.historicoshelvinglog.fragment.ShelvingLogViewModel
import es.verdnatura.presentation.view.feature.inventario.fragment.InventaryViewModel
import es.verdnatura.presentation.view.feature.login.fragment.LoginViewModel
import es.verdnatura.presentation.view.feature.paletizador.fragment.*
import es.verdnatura.presentation.view.feature.packaging.fragment.SupplierViewModel
import es.verdnatura.presentation.view.feature.packingHolland.fragment.PackingHollandViewModel
import es.verdnatura.presentation.view.feature.paletizador.fragment.CmrExpeditionPalletViewModel
import es.verdnatura.presentation.view.feature.paletizador.fragment.ExpeditionPalletDetailViewModel
import es.verdnatura.presentation.view.feature.paletizador.fragment.ExpeditionScanSorterViewModel
import es.verdnatura.presentation.view.feature.paletizador.fragment.ExpeditionScanSorterViewModelCompose
import es.verdnatura.presentation.view.feature.paletizador.fragment.ExpeditionScanViewModel
import es.verdnatura.presentation.view.feature.paletizador.fragment.ExpeditionStateViewModel
import es.verdnatura.presentation.view.feature.paletizador.fragment.ExpeditionTruckListViewModel
import es.verdnatura.presentation.view.feature.paletizador.fragment.PalletScanViewModel
import es.verdnatura.presentation.view.feature.parking.fragment.ParkingViewModel
import es.verdnatura.presentation.view.feature.pasillero.fragment.PasilleroViewModel
import es.verdnatura.presentation.view.feature.precontrol.ShowTicketViewModel
import es.verdnatura.presentation.view.feature.presacador.fragment.PreSacadorViewModel
import es.verdnatura.presentation.view.feature.qr.QrFragmentViewModel
import es.verdnatura.presentation.view.feature.reposicion.fragment.ReposicionViewModel
import es.verdnatura.presentation.view.feature.roadmap.fragment.RoadMapListViewModel
import es.verdnatura.presentation.view.feature.sacador.fragment.SacadorViewModel
import es.verdnatura.presentation.view.feature.shelvingparking.fragment.ShelvingParkingViewModel
import es.verdnatura.presentation.view.feature.smarttag.sacador.fragment.SmartTagsViewModel
import es.verdnatura.presentation.view.feature.ubicador.fragment.AutomaticAddItemViewModel
import es.verdnatura.presentation.view.feature.sacador.fragment.showticket.ShowTicketViewModel
import es.verdnatura.presentation.view.feature.ticket.fragment.TicketViewModel
import es.verdnatura.presentation.view.feature.ubicador.fragment.UbicadorViewModel
import es.verdnatura.presentation.view.feature.workermistake.fragment.WorkermistakeViewModel
import es.verdnatura.presentation.view.feature.workermistake.fragment.WorkerMistakeViewModel
import org.koin.android.ext.koin.androidApplication
import org.koin.android.ext.koin.androidContext
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module
val viewModelModule = module {
viewModel{
WorkermistakeViewModel(androidContext())
viewModel {
WorkerMistakeViewModel(androidApplication())
}
// Login
@ -49,12 +57,15 @@ val viewModelModule = module {
// Pasilleros
viewModel {
PasilleroViewModel()
PasilleroViewModel(androidContext())
}
//Pasilleros Dia de venta
viewModel {
DayOfSaleViewModel(androidContext())
}
viewModel {
DayOfSaleViewModelCompose(androidApplication())
}
// Pasilleros / Item Card
viewModel {
@ -71,6 +82,10 @@ val viewModelModule = module {
BuscarItemViewModel(androidContext())
}
viewModel {
BuscarItemComposeViewModel(androidApplication())
}
// Pasilleros / Buscar Item 2
viewModel {
@ -81,26 +96,12 @@ val viewModelModule = module {
viewModel {
InventaryViewModel(androidContext())
}
// Pasilleros / Faltas
viewModel {
FaltasViewModel(androidContext())
}
// ShelvingParking
viewModel {
ShelvingParkingViewModel(androidContext())
}
// Ubicador
viewModel {
UbicadorViewModel(androidContext())
}
// Ubicador // Automatic
viewModel {
AutomaticAddItemViewModel(androidContext())
}
// Ajustes
viewModel {
AjustesViewModel(androidContext())
@ -112,6 +113,15 @@ val viewModelModule = module {
ExpeditionScanSorterViewModel(androidContext())
}
viewModel {
ExpeditionScanSorterViewModelCompose(androidApplication())
}
viewModel {
CmrExpeditionPalletViewModel(androidContext())
}
viewModel {
BufferFragmentViewModel(androidContext())
}
@ -124,10 +134,6 @@ val viewModelModule = module {
ExpeditionTruckListViewModel(androidContext())
}
viewModel {
ExpeditionPalletViewModel(androidContext())
}
viewModel {
ExpeditionPalletDetailViewModel(androidContext())
}
@ -147,9 +153,11 @@ val viewModelModule = module {
viewModel {
CollectionViewModel(androidContext())
}
viewModel {
ControladorViewModel(androidContext())
CollectionViewModelCheckerPreviosNew(androidContext())
}
viewModel {
CollectionCheckerViewModel(androidContext())
}
viewModel {
@ -160,36 +168,41 @@ val viewModelModule = module {
PreSacadorViewModel(androidContext())
}
viewModel {
ReposicionViewModel(androidContext())
}
viewModel {
BuyersViewModel(androidContext())
}
viewModel {
QaualityViewModel(androidContext())
}
viewModel {
ControlVehiculoViewModel(androidContext())
}
viewModel {
HistoricoVehiculoViewModel(androidContext())
}
viewModel {
SmartTagsViewModel(androidContext())
}
viewModel {
itemShelvingLogViewModel(androidContext())
}
viewModel {
shelvingLogViewModel(androidContext())
ShelvingLogViewModel(androidContext())
}
viewModel {
ClaimViewModel(androidContext())
}
viewModel {
PalletScanViewModel(androidContext())
}
viewModel {
SupplierViewModel(androidContext())
}
viewModel {
DeliveryViewModel(androidContext())
}
viewModel {
PackingHollandViewModel(androidContext())
}
viewModel {
TicketViewModel(androidContext())
}
viewModel {
RoadMapListViewModel(androidContext())
}
viewModel {
ChangeCategoryViewModel(androidContext())
}
viewModel {
BoxPickingViewModel(androidContext())
}
}

View File

@ -1,17 +0,0 @@
package es.verdnatura.domain
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
class ApiNodeJsUtils {
companion object {
//const val BASE_URL:String = "http://192.168.1.108:8000/"
const val BASE_URL:String = "https://smart-tag.verdnatura.es"
//const val BASE_URL:String = "http://192.168.1.154:7777"
fun getApiService():NodeJsService{
val nodeJsRetrofit = Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(
GsonConverterFactory.create()).build()
return nodeJsRetrofit.create(NodeJsService::class.java)
}
}
}

View File

@ -1,18 +1,75 @@
package es.verdnatura.domain
import android.content.Context
import com.google.gson.GsonBuilder
import es.verdnatura.MobileApplication
import es.verdnatura.domain.ConstAndValues.BASEURLSALIX
import es.verdnatura.domain.ConstAndValues.BASE_URL_SALIX
import es.verdnatura.presentation.common.InteceptorListener
import kotlinx.coroutines.runBlocking
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit
class ApiSalixUtils {
companion object {
//const val BASE_URL:String = "http://192.168.1.155:9009/"
// const val BASE_URL: String = "https://test-salix.verdnatura.es/api/"
const val BASE_URL: String = "https://salix.verdnatura.es/api/"
fun getApiService(): SalixService {
val salixRetrofit = Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(
GsonConverterFactory.create()
).build()
fun getApiService(context: Context, myObserver: InteceptorListener?): SalixService {
var salixClient =
OkHttpClient.Builder().addInterceptor(SalixInterceptor(context, myObserver))
.connectTimeout(10, TimeUnit.SECONDS).writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(40, TimeUnit.SECONDS).build()
val salixRetrofit =
Retrofit.Builder().client(salixClient).baseUrl(getBaseUrlLocal(context = context))
.addConverterFactory(
GsonConverterFactory.create(GsonBuilder().serializeNulls().create())
).build()
return salixRetrofit.create(SalixService::class.java)
}
private fun getBaseUrlLocal(context: Context): String {
var myWorkFormSelected =
(context as MobileApplication).dataStoreApp.readDataStoreKey(ConstAndValues.WORKFORMSELECTED) as String
if (myWorkFormSelected != "Producción" && myWorkFormSelected.isNotBlank()) {
runBlocking {
var list = (context).dataStoreApp.getWorkForm()
for (l in list) {
if (l.name == myWorkFormSelected) {
context.dataStoreApp.editDataStoreKey(BASEURLSALIX, l.urlSalix)
}
}
}
} else {
runBlocking {
context.dataStoreApp.editDataStoreKey(
BASEURLSALIX,
BASE_URL_SALIX
)
}
}
var url =
(context).dataStoreApp.readDataStoreKey<String>(BASEURLSALIX)
if (url.isNullOrEmpty()) {
runBlocking {
(context).dataStoreApp.editDataStoreKey(
BASEURLSALIX, BASE_URL_SALIX
)
}
} else {
if (!url.contains("http")) {
url = "https://$url"
}
}
return if (url.isNullOrEmpty()) "$BASE_URL_SALIX/api/" else "$url/api/"
}
}
}

View File

@ -1,67 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import android.content.SharedPreferences
//import android.preference.PreferenceManager
import androidx.preference.PreferenceManager
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit
class ApiUtils {
companion object {
//const val BASE_URL:String = "http://192.168.1.54:8009/"
const val BASE_URL:String = "https://10.1.3.102/"
//const val BASE_URL: String = "https://app.verdnatura.es/"
fun getApiService(context: Context): VerdnaturaService {
val retrofit = Retrofit.Builder()
.baseUrl(getBaseUrlLocal(context))
.addConverterFactory(GsonConverterFactory.create())
.client(getRequestHeader()!!)
.build()
return retrofit.create(VerdnaturaService::class.java)
}
fun getBaseUrlLocal(context: Context): String {
var url = this.getDefaults("base_url", context)
if (url.isNullOrEmpty()) {
setDefaults("base_url", BASE_URL, context)
} else {
if (!url.contains("http")) {
url = "https://" + url
}
}
return if (url.isNullOrEmpty()) BASE_URL else url
}
fun getRequestHeader(): OkHttpClient? {
return OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(40, TimeUnit.SECONDS)
.build()
}
fun setDefaults(key: String?, value: String?, context: Context?) {
val preferences: SharedPreferences =
PreferenceManager.getDefaultSharedPreferences(context)
val editor = preferences.edit()
editor.putString(key, value)
//editor.commit()
editor.apply()
}
fun getDefaults(key: String?, context: Context?): String? {
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
return preferences.getString(key, null)
}
}
}

View File

@ -6,15 +6,75 @@ object ConstAndValues {
const val OK = "OK"
const val PREPARED = "PREPARED"
const val ON_PREPARATION = "ON_PREPARATION"
//const val CHECKED = "CHECKED"
const val PRESACADOR = "PRESACADOR" //PREITEMPICKER
const val PREITEMPICKER = "PREITEMPICKER"
const val PREITEMPICKERTEST = "PREITEMPICKERTEST"
const val SERIALNUMBER = "SERIALNUMBER"
const val ON_CHECKING = "ON_CHECKING"
const val PRECHECKER = "PRECHECKER"
const val MAINACTIVITY = "MAIN"
const val VERTICKET = "SHOWTICKET"
const val SECTORFKDEFAULT=37
const val WAREHOUSEFKDEFAULT=1
const val SECTORFKDEFAULT = -1
const val PRINTERFKDEFAULT = -1
const val WAREHOUSEFKDEFAULT = 60
const val SECTORFK = "sectorFk"
const val SECTORISONRESERVATIONMODE = "sectorIsOnReservationMode"
const val TAG = "VERDNATURA::"
const val USERFK = "userFk"
const val USER = "user"
const val PASSWORD = "password"
const val TOKEN = "token"
const val TOKENMULTIMEDIA = "tokenMultimedia"
const val TTL = "ttl"
const val TOKENCREATED = "tokenCreated"
const val SECTORDESCRIP = "sectordescrip"
const val HOLDPOSITION = "holdPosition"
const val NUMBEROFWAGONS = "operatorNumberOfWagons"
const val PRINTERNAME = "printername"
const val PRINTERFK = "printerFk"
const val WAREHOUSEFK = "warehouseFk"
const val REMEMBER = "recordar"
const val ANDROID_ID = "ANDROID_ID"
const val DEVICENAME = "devicename"
const val TRAINNAME = "trainName"
const val TRAINFK = "trainFk"
const val WORKFORMSELECTED = "workFormSelected"
const val SUPPLIERID = "SUPPLIERID"
const val SUPPLIERNAME = "SUPPLIERNAME"
const val ENTRYID = "ENTRYID"
const val COMPANYFK = "COMPANYFK"
const val ENTRYOBSERVATIONORIGINAL = "ENTRYOBSERVATIONORIGINAL"
const val ITEMPACKING = "itemPackingType"
const val ITEMPACKINGFK = "itemPackingTypeFk"
const val ITEMPACKINGTYPEFILTER = "itemPackingTypeFilter"
const val BUYER = "buyernickname"
const val BUYERID = "buyerid"
const val WAGON = "wagon"
const val TAGSTYPE = "tagstype"
const val WAREHOUSEFK_DEFAULT = 60
const val DATENOVEHICLE = "DATENOVEHICLE"
const val DEPARTMENTMISTAKE = "DEPARTMENTMISTAKE"
const val DEPARTMENTMISTAKEID = "DEPARTMENTMISTAKEID"
const val ENTRYOBSERVATIONS = "ENTRYOBSERVATIONS"
const val ENTRYNUMBERIMAGES = "ENTRYNUMBERIMAGES"
const val ENTRYTYPE = "ENTRYTYPE"
const val BASEURLSALIX = "base_urlSalix"
const val BASEURLLILIUM = "base_urlLilium"
const val BASE_URL_LILIUM = "https://lilium.verdnatura.es"
const val BASE_URL_SALIX = "https://salix.verdnatura.es"
const val ENTRY = "ENTRY"
const val RENEWINTERVAL = "renewInterval"
const val RENEWPERIOD = "renewPeriod"
const val MENUBYDEFAULTSELECTED = "MENUBYDEFAULTSELECTED"
const val INVENTORYPARKINGTO = "INVENTORYPARKINGTO"
const val INVENTORYPARKINGFROM = "INVENTORYPARKINGFROM"
const val LIMITRECORDSSHELVINGLOG = 50
const val RESERVATIONMODE = "operatorReservationMode"
const val MODELWORKERTYPEACTIVITY = "APP"
const val FLINGTHRESHOLDVELOCITY = 2000f
const val FLINGTHRESHOLDVERTICAL = 500f
const val SCANNER_THRESHOLD_SPEED: Int = 60
const val HUMAN_CHARACTERS_SECOND: Int = 100
}

View File

@ -1,12 +1,121 @@
package es.verdnatura.domain
import android.app.Activity
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.GradientDrawable
import android.text.Html
import android.view.Gravity
import android.view.ViewGroup
import android.widget.EditText
import android.widget.FrameLayout
import android.widget.TextView
import android.widget.Toast
import es.verdnatura.R
import java.text.SimpleDateFormat
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.util.Date
import java.util.Locale
fun Any.toast(context: Context?, duration: Int = Toast.LENGTH_SHORT): Toast {
return Toast.makeText(context, this.toString(), duration).apply { show() }
fun List<Any?>.formatWithQuotes(): String {
return "[" + joinToString(", ") {
when {
it is String && (it.trim().startsWith("{") && it.trim()
.endsWith("}")) -> "\"$it\""
it is String -> "\"$it\""
else -> it.toString()
}
} + "]"
}
fun Any.toast(
context: Context?,
duration: Int = Toast.LENGTH_SHORT,
color: Int = Color.WHITE
): Toast {
val toast = Toast.makeText(
context,
Html.fromHtml("<font color='$color' ><b>$this</b></font>", 0),
duration
)
toast.show()
return toast.apply { show() }
}
fun Context.showToastCenterWithBackground(textToShow: String) {
(this as? Activity)?.window?.decorView?.let { rootView ->
TextView(this).apply {
text = textToShow
setTextColor(getColor(R.color.verdnatura_orange_salix))
textSize = 22f
gravity = Gravity.CENTER
setPadding(32, 16, 32, 16)
background = GradientDrawable().apply {
setColor(Color.BLACK)
cornerRadius = 16f
alpha = 220
}
layoutParams = FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
).apply { gravity = Gravity.CENTER }
alpha = 0f
(rootView as ViewGroup).addView(this)
animate().alpha(1f).setDuration(300).withEndAction {
animate().alpha(0f).setStartDelay(1000).setDuration(300)
.withEndAction { (rootView).removeView(this) }
.start()
}.start()
}
}
}
fun <T : Any> T?.notNull(f: (it: T) -> Unit) {
if (this != null) f(this)
}
fun EditText.toInt(): Int {
return this.text.toString().toInt()
}
fun String.isParking(): Boolean {
val regex = Regex("^[^ ]+-[^ ]+$")
return this.length > 4 && regex.matches(this)
}
fun String.isShelving(): Boolean {
val regex = Regex("\\S{0,4}")
return regex.matches(this)
}
fun EditText.toLong(): Long {
return this.text.toString().toLong()
}
fun toDateString(date: Date): String {
val format = SimpleDateFormat("dd-MM-yyyy", Locale.getDefault())
return format.format(date)
}
fun String?.isoToString(returnOnlyDate: Boolean = false): String {
return if (!this.isNullOrEmpty() && this.contains("T")) {
val utcZonedDateTime = ZonedDateTime.parse(this, DateTimeFormatter.ISO_OFFSET_DATE_TIME)
val myDate = utcZonedDateTime.withZoneSameInstant(ZonedDateTime.now().zone)
.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
if (returnOnlyDate) {
(myDate.format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm"))).replace("T", " ")
.substring(0, 10)
} else {
(myDate.format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm"))).replace("T", " ")
}
} else if (!this.isNullOrEmpty() && !this.contains("T")) {
this
} else {
""
}
}

View File

@ -1,35 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.ajustes.model.Printers
import es.verdnatura.presentation.view.feature.ajustes.model.SectorItemVO
import retrofit2.Call
class GetAjustesUserCase(context: Context) : RestClient(context) {
fun getSectors(usuario: String, password: String): Call<List<SectorItemVO>> {
return restClient!!.getSectors("json", "1", usuario, password, "application/json")
}
fun getSectorsSalix(token:String): Call<List<SectorItemVO>> {
return salixClient!!.getSectorsSalix(content_type = "application/json", authorization = token)
}
fun worker_updateSector(usuario: String, password: String,sectorFk:String): Call<Unit> {
val params: ArrayList<String> = ArrayList()
params.add(sectorFk)
return restClient!!.worker_updateSector("json", "1", usuario, password, "application/json",params)
}
fun worker_updatePrinter(usuario: String, password: String,labelerFk:String): Call<Unit> {
val params: ArrayList<String> = ArrayList()
params.add(labelerFk)
return restClient!!.worker_updatePrinter("json", "1", usuario, password, "application/json",params)
}
fun printer_get(usuario: String, password: String): Call<List<Printers>> {
return restClient!!.printer_get("json", "1", usuario, password, "application/json")
}
}

View File

@ -1,26 +0,0 @@
package es.verdnatura.domain
import android.content.Context
//import es.verdnatura.presentation.view.feature.buscaritemall.model.ItemLocationAll
import retrofit2.Call
class GetBuscarItemAllUserCase(context: Context) : RestClient(context) {
/* fun searchItemsUbicadorAll(
usuario: String,
password: String,
itemFk: String
): Call<List<ItemLocationAll>> {
val params: ArrayList<String> = ArrayList()
params.add(itemFk)
return restClient!!.searchItemsUbicadorAll(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}*/
}

View File

@ -1,26 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.buscaritem.model.ItemLocationVO
import retrofit2.Call
class GetBuscarItemUserCase(context: Context) : RestClient(context) {
fun searchItemsUbicador(
usuario: String,
password: String,
itemFk: String
): Call<List<ItemLocationVO>> {
val params: ArrayList<String> = ArrayList()
params.add(itemFk)
return restClient!!.searchItemsUbicador(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
}

View File

@ -1,61 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.diadeventa.model.ItemShelvingSaleDate
import retrofit2.Call
class GetDayOfSaleUSerCase(context: Context) : RestClient(context) {
/*fun itemShelving_updateSpam(usuario: String, password: String,vShelvingFK:String): Call<Boolean> {
val params: ArrayList<String> = ArrayList()
params.add(vShelvingFK)
return restClient!!.itemShelving_updateSpam("json", "1", usuario, password, "application/json",params=params)
}*/
/* fun itemShelving_getSaleDateOld(
usuario: String,
password: String,
expeditionFk: String
): Call<JsonObject> {
val params: ArrayList<String> = ArrayList()
params.add(expeditionFk)
return restClient!!.itemShelving_getSaleDate(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}*/
fun itemShelving_getSaleDate(
usuario: String,
password: String,
vShelvingFk: String
): Call<List<ItemShelvingSaleDate>> {
val params: ArrayList<String> = ArrayList()
params.add(vShelvingFk)
return restClient!!.itemShelving_getSaleDate(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun shelvingPark(
usuario: String,
password: String,
shelving: String,
parking: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(shelving)
params.add(parking)
return restClient!!.shelvingPark("json", "1", usuario, password, "application/json", params)
}
}

View File

@ -1,87 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.calidad.model.BuyerVO
import es.verdnatura.presentation.view.feature.faltas.model.ItemFaltasVO
import es.verdnatura.presentation.view.feature.inventario.model.ItemInventaryVO
import retrofit2.Call
class GetInventaryUserCase(context: Context) : RestClient(context) {
/* fun itemShelvingRadar(
usuario: String,
password: String,
sectorFk: String
): Call<List<ItemInventaryVO>> {
val params: ArrayList<String> = ArrayList()
params.add(sectorFk)
return restClient!!.itemShelvingRadar(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}*/
fun itemShelvingRadarFilterBuyer(
usuario: String,
password: String,
buyerFk: String,
warehouseFk: String
): Call<List<ItemInventaryVO>> {
val params: ArrayList<String> = ArrayList()
params.add(buyerFk)
params.add(warehouseFk)
return restClient!!.itemShelvingRadarFilterBuyer(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
fun faultsReview(
usuario: String,
password: String,
warehouseFk: String
): Call<List<ItemFaltasVO>> {
val params: ArrayList<String> = ArrayList()
params.add(warehouseFk)
return restClient!!.faultsReview(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
fun faultsReview_isChecked(
usuario: String,
password: String,
itemFk: String,
warehouseFk: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(itemFk)
params.add(warehouseFk)
return restClient!!.faultsReview_isChecked(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
fun itemShelvingBuyerGet(usuario: String, password: String): Call<List<BuyerVO>> {
return restClient!!.itemShelvingBuyerGet("json", "1", usuario, password, "application/json")
}
}

View File

@ -1,316 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.common.itemBarCodeSalix
import es.verdnatura.presentation.common.itemPackingTypeSalix
import es.verdnatura.presentation.view.feature.articulo.model.ItemCardVO
import es.verdnatura.presentation.view.feature.articulo.model.ItemPackingType
import es.verdnatura.presentation.view.feature.articulo.model.ItemProposal
import es.verdnatura.presentation.view.feature.historicoarticulo.model.ItemHistoricoVO
import retrofit2.Call
import java.security.AuthProvider
class GetItemCardUserCase(context: Context) : RestClient(context) {
fun getItemCard(
usuario: String,
password: String,
itemFk: String,
warehouseFk: String
): Call<ItemCardVO> {
val params: ArrayList<String> = ArrayList()
params.add(itemFk)
params.add(warehouseFk)
return restClient!!.getItemCard(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
fun item_getSimilar(
usuario: String,
password: String,
itemFk: String,
warehouseFk: String,
vshipped: String,
vIsShowedByType: String
): Call<List<ItemProposal>> {
val params: ArrayList<String> = ArrayList()
params.add(itemFk)
params.add(warehouseFk)
params.add(vshipped)
params.add(vIsShowedByType)
return restClient!!.item_getSimilar(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
fun getItemPackingType(usuario: String, password: String): Call<List<ItemPackingType>> {
val params: ArrayList<String> = ArrayList()
return restClient!!.getItemPackingType(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
fun getItemPackingTypeSalix(token:String): Call<List<ItemPackingType>> {
return salixClient!!.get_ItemPackingType(
content_type = "application/json",
authorization = token
)
}
fun itemStockUpdate(
usuario: String,
password: String,
itemFk: String,
warehouseFk: String,
newVisible: String,
isTrash: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(itemFk)
params.add(warehouseFk)
params.add(newVisible)
params.add(isTrash)
//sergio: se modifica por CAU a itemTrash// Faltas también accede a itemStockUpdate ( falta comprobar porque no aparece nada más)
//return restClient!!.itemStockUpdate("json","1",usuario,password,"application/json",params = params)
return restClient!!.itemTrash(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
fun itemTrash(
usuario: String,
password: String,
itemFk: String,
warehouseFk: String,
newVisible: String,
isTrash: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(itemFk)
params.add(warehouseFk)
params.add(newVisible)
params.add(isTrash)
return restClient!!.itemTrash(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
fun itemPlacementSave(
usuario: String,
password: String,
itemFk: String,
warehouseFk: String,
value: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(itemFk)
params.add(warehouseFk)
params.add(value)
return restClient!!.itemPlacementSave(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
fun updateGrouping(
usuario: String,
password: String,
itemFk: String,
value: String,
warehouseFk: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(itemFk)
params.add(value)
params.add(warehouseFk)
return restClient!!.updateGrouping(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
fun updatePacking(
usuario: String,
password: String,
itemFk: String,
value: String,
warehouseFk: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(itemFk)
params.add(value)
params.add(warehouseFk)
return restClient!!.updatePacking(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
fun updatePackingType(
usuario: String,
password: String,
itemFk: String,
ItemPackingType: String
): Call<Boolean> {
val params: ArrayList<String> = ArrayList()
params.add(itemFk)
params.add(ItemPackingType)
return restClient!!.updatePackingType(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
fun updatePackingTypeSalix(
token:String,
itemFk: String,
ItemPackingType: String
): Call<Any> {
val params=itemPackingTypeSalix(ItemPackingType)
return salixClient!!.update_ItemPackingType(
content_type ="application/json",
authorization = token,
itemFk = itemFk,
params = params
)
}
fun itemSaveMin(
usuario: String,
password: String,
itemFk: String,
value: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(itemFk)
params.add(value)
return restClient!!.itemSaveMin(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
fun item_saveReference(
usuario: String,
password: String,
itemFk: String,
value: String
): Call<Unit> {
val params: ArrayList<String> = ArrayList()
params.add(itemFk)
params.add(value)
return restClient!!.item_saveReference(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
fun barcodes_edit(
usuario: String,
password: String,
itemFk: String,
value: String,
delete: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(value)
params.add(itemFk)
params.add(delete)
return restClient!!.barcodes_edit(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
fun barcodes_editSalix(
token:String,
itemFk: String,
value: String,
): Call<Any> {
return salixClient!!.barcodes_edit(
content_type = "application/json",
authorization=token,
itemBarCodeSalix(itemFk,value)
)
}
fun itemDiary(
usuario: String,
password: String,
itemFk: String,
warehouseFk: String
): Call<List<ItemHistoricoVO>> {
val params: ArrayList<String> = ArrayList()
params.add(itemFk)
params.add(warehouseFk)
return restClient!!.itemDiary(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
}

View File

@ -1,126 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.ajustes.model.Printers
import es.verdnatura.presentation.view.feature.ajustes.model.SectorItemVO
import es.verdnatura.presentation.view.feature.login.model.*
import retrofit2.Call
class GetLoginUserCase(context: Context) : RestClient(context)
{
fun device_checkLogin(
usuario: String,
password: String,
android_id: String
): Call<LoginDevice>
{
val params: ArrayList<String> = ArrayList()
params.add(usuario)
params.add(android_id)
return restClient!!.device_checkLogin(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun worker_getId(usuario: String, password: String): Call<String>
{
val params: ArrayList<String> = ArrayList()
return restClient!!.worker_getId("json", "1", usuario, password, "application/json", params)
}
fun deviceLog_add(
usuario: String,
password: String,
app: String,
versionApp: String,
android_id: String
): Call<Void>
{
val params: ArrayList<String> = ArrayList()
params.add(app)
params.add(versionApp)
params.add(android_id)
return restClient!!.deviceLog_add(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun salixLogin(usuario: String, password: String): Call<LoginSalixVO>
{
return salixClient!!.login("application/json", LoginSalixVO(usuario, password))
}
//NODEJS TEST
/*fun nodeJsTest(
smarttag: String,
wagon: String,
shelving: String
): Call<NodeJsService.SmartTagNode>
{
//https://smart-tag.verdnatura.es/bindShelving/A0A3B8224DBF&ABC&1
return nodejsClient!!.bindShelving("application/json", "A0A3B8224DBF", "AAA", "1")
// return nodejsClient!!.bindShelving("application/json", NodeJsService.SmartTagNode(smarttag, wagon, shelving),"A0A3B8224DBF","ABC","2")
}*/
// SALIX SERGIO MENSAJE : PARA NO ENVIAR MENSAJES A COMERCIALES PONGO QUE LAS MODIFICACIONES SE ENVIAN AL CANAL CREADO.
// SE CAMBIA VARIABLE A TRUE/FALSE
fun sendChekingPresence(token:String,workerId:Int,message:String) : Call<Boolean>{
var working_in_test=false // Enviar a grupo test Android o a los usuarios
if (!working_in_test) {
return salixClient!!.sendChekingPresence(
content_type = "application/json",
authorization = token,
params = SalixMessageVO(workerId = workerId, message = message)
)
}else{
return salixClient!!.sendGroup(
content_type = "application/json",
authorization = token,
params = SalixGrupo(to = "#android-test", message = message))
}
}
/*fun sendChekingPresence(token: String, workerId: Int, message: String): Call<Boolean>
{
return salixClient!!.sendGroup(
content_type = "application/json",
authorization = token,
params = SalixGrupo(to = "#android-test", message = message)
)
}*/
fun checkVersion(usuario: String, password: String, nameApp: String): Call<versionApp>
{
val params: ArrayList<String> = ArrayList()
params.add(nameApp)
return restClient!!.getVersion("json", "1", usuario, password, "application/json", params)
}
fun worker_getSector(usuario: String, password: String): Call<SectorItemVO> {
return restClient!!.worker_getSector("json", "1", usuario, password, "application/json")
}
fun worker_getPrinter(usuario: String, password: String): Call<List<Printers>> {
return restClient!!.worker_getPrinter("json", "1", usuario, password, "application/json")
}
}

View File

@ -1,299 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import com.google.gson.JsonObject
import es.verdnatura.presentation.view.feature.paletizador.model.*
import retrofit2.Call
class GetPaletizadoresUserCase(context: Context) : RestClient(context) {
//buffer
fun buffer_setTypeByName(
usuario: String,
password: String,
vBufferFk: String,
vType: String
): Call<Boolean> {
val params: ArrayList<String> = ArrayList()
params.add(vBufferFk)
params.add(vType)
return restClient!!.buffer_setTypeByName(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
//expeditionScan opciones paletizadores
fun expedition_scan(usuario: String, password: String, vExpeditionId: String): Call<Void> {
val params: ArrayList<String> = ArrayList()
params.add(vExpeditionId)
return restClient!!.expedition_scan(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
//expedition
fun expedition_getState(
usuario: String,
password: String,
expeditionFk: String
): Call<itemExpedetionState> {
val params: ArrayList<String> = ArrayList()
params.add(expeditionFk)
return restClient!!.expedition_getState(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
fun expedition_getStateJSON(
usuario: String,
password: String,
expeditionFk: String
): Call<JsonObject> {
val params: ArrayList<String> = ArrayList()
params.add(expeditionFk)
return restClient!!.expedition_getStateJSON(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
fun expeditionTruckList(usuario: String, password: String): Call<List<ItemExpeditionTruckVO>> {
// val params: ArrayList<String> = ArrayList()
return restClient!!.expeditionTruckList("json", "1", usuario, password, "application/json")
}
fun expeditionTruckAdd(
usuario: String,
password: String,
vHour: String,
vDescription: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(vHour)
params.add(vDescription)
// //////Log.i("VERDNATURA:"," La hora es $vHour y descrip $vDescription")
return restClient!!.expeditionTruckAdd(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun expeditionPallet_List(
usuario: String,
password: String,
vTruckFk: String
): Call<List<ItemPalletVO>> {
val params: ArrayList<String> = ArrayList()
params.add(vTruckFk)
return restClient!!.expeditionPallet_List(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun expeditionScanAdd(
usuario: String,
password: String,
vPalletFk: String,
vTruckFk: String
): Call<List<ItemScanVO>> {
val params: ArrayList<String> = ArrayList()
params.add(vPalletFk)
params.add(vTruckFk)
return restClient!!.expeditionScanAdd(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun expeditionScanPut(
usuario: String,
password: String,
vPalletFk: String,
vExpeditionFk: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(vPalletFk)
params.add(vExpeditionFk)
return restClient!!.expeditionScanPut(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun checkRouteExpeditionScanPut(
usuario: String,
password: String,
vPalletFk: String,
vExpeditionFk: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(vPalletFk)
params.add(vExpeditionFk)
return restClient!!.checkRouteExpeditionScanPut(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun expeditionPalletView(
usuario: String,
password: String,
vPalletFk: String
): Call<List<ItemPalletViewVO>> {
val params: ArrayList<String> = ArrayList()
params.add(vPalletFk)
return restClient!!.expeditionPalletView(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun expeditionPalletDel(usuario: String, password: String, vPalletFk: String): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(vPalletFk)
return restClient!!.expeditionPalletDel(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun expeditionScanList(
usuario: String,
password: String,
vPalletFk: String
): Call<List<ItemExpeditionScanVO>> {
val params: ArrayList<String> = ArrayList()
params.add(vPalletFk)
return restClient!!.expeditionScanList(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun expeditionScanDel(usuario: String, password: String, vScanFk: String): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(vScanFk)
return restClient!!.expeditionScanDel(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun expeditionPalletPrintSet(
usuario: String,
password: String,
vPalletFk: String,
vSectorFk: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(vPalletFk)
params.add(vSectorFk)
return restClient!!.expeditionPalletPrintSet(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun expeditionState_addByPallet(
usuario: String,
password: String,
vPalletFk: String,
vStateCode:String
): Call<Unit> {
val params: ArrayList<String> = ArrayList()
params.add(vPalletFk)
params.add(vStateCode)
return restClient!!.expeditionState_addByPallet(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun expeditionLoading_add(
usuario: String,
password: String,
vExpeditionFk: String,
vBufferFk: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(vExpeditionFk)
params.add(vBufferFk)
return restClient!!.expeditionLoading_add(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
}

View File

@ -1,49 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.sacador.model.CollectionVO
import retrofit2.Call
class GetPreControladorUserCase(context: Context) : RestClient(context) {
fun collectionTicketGet(
usuario: String,
password: String,
collectionFk: String,
sectorFk: String,
print: String,
type: String
): Call<CollectionVO> {
val params: ArrayList<String> = ArrayList()
params.add(collectionFk)
params.add(sectorFk)
params.add(print)
params.add(type)
return restClient!!.collection_getTickets(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun ticket_get(
usuario: String,
password: String,
vParamFk: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(vParamFk)
return restClient!!.ticket_get(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
}

View File

@ -1,172 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.presacador.model.PreSacadorItemVO
import es.verdnatura.presentation.view.feature.sacador.model.CollectionVO
import retrofit2.Call
class GetPreSacadorUseCase(context: Context) : RestClient(context) {
fun ticketToPrePrepare(
usuario: String,
password: String,
ticketFk: String,
sectorFk: String
): Call<List<PreSacadorItemVO>> {
val params: ArrayList<String> = ArrayList()
params.add(ticketFk)
params.add(sectorFk)
return restClient!!.ticketToPrePrepare(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun itemPlacementSupplyGetOrder(
usuario: String,
password: String,
sectorFk: String
): Call<List<PreSacadorItemVO>> {
val params: ArrayList<String> = ArrayList()
params.add(sectorFk)
return restClient!!.itemPlacementSupplyGetOrder(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun itemPlacementSupplyCloseOrder(
usuario: String,
password: String,
id: String,
quantity: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(id)
params.add(quantity)
return restClient!!.itemPlacementSupplyCloseOrder(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun sectorCollection_new(
usuario: String,
password: String,
sectorFk: String
): Call<Unit> {
val params: ArrayList<String> = ArrayList()
params.add(sectorFk)
return restClient!!.sectorCollection_new(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun sectorCollectionSaleGroup_add(
usuario: String,
password: String,
vSaleGroupFk: String,
vSectorCollectionFk:String
): Call<Unit> {
val params: ArrayList<String> = ArrayList()
params.add(vSaleGroupFk)
params.add(vSectorCollectionFk)
return restClient!!.sectorCollectionSaleGroup_add(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun saleTracking_addPrevOK(
usuario: String,
password: String,
vSectorCollectionFk:String
): Call<Unit> {
val params: ArrayList<String> = ArrayList()
params.add(vSectorCollectionFk)
return restClient!!.saleTracking_addPrevOK(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun saleTracking_updateIsChecked(
usuario: String,
password: String,
vSaleFk:String,
vIsChecked:String
): Call<Unit> {
val params: ArrayList<String> = ArrayList()
params.add(vSaleFk)
params.add(vIsChecked)
return restClient!!.saleTracking_updateIsChecked(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun sectorCollection_get(usuario: String, password: String): Call<List<CollectionVO>> {
return restClient!!.sectorCollection_get("json", "1", usuario, password, "application/json")
}
fun sectorCollection_getSale(
usuario: String,
password: String,
sectorCollectionFK: String,
vSectorFk:String
): Call<List<PreSacadorItemVO>> {
val params: ArrayList<String> = ArrayList()
params.add(sectorCollectionFK)
params.add(vSectorFk)
return restClient!!.sectorCollection_getSale(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
}

View File

@ -1,26 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import retrofit2.Call
class GetQrReaderUserCase(context: Context) : RestClient(context) {
fun qr_getCall(
usuario: String,
password: String,
call: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(call)
return restClient!!.qr_getCall(
"json",
"1",
usuario,
password,
"application/json",
params = params
)
}
}

View File

@ -1,49 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.calidad.model.BuyerVO
import es.verdnatura.presentation.view.feature.calidad.model.ItemBuyerVO
import retrofit2.Call
class GetQualityUserCase(context: Context) : RestClient(context) {
fun itemShelvingBuyerGet(usuario: String, password: String): Call<List<BuyerVO>> {
return restClient!!.itemShelvingBuyerGet("json", "1", usuario, password, "application/json")
}
fun itemShelvingBuyerTask(
usuario: String,
password: String,
userFk: String
): Call<List<ItemBuyerVO>> {
val params: ArrayList<String> = ArrayList()
params.add(userFk)
return restClient!!.itemShelvingBuyerTask(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun itemShelvingStarsUpdate(
usuario: String,
password: String,
vId: String,
vStars: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(vId)
params.add(vStars)
return restClient!!.itemShelvingStarsUpdate(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
}

View File

@ -1,526 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import com.google.gson.JsonObject
import es.verdnatura.presentation.view.feature.collection.SalixSaleQuantity
import es.verdnatura.presentation.view.feature.login.model.workerId
import es.verdnatura.presentation.view.feature.sacador.model.CollectionVO
import es.verdnatura.presentation.view.feature.sacador.model.MistakeTypeVO
import es.verdnatura.presentation.view.feature.sacador.model.PlacementSupplyVO
import org.json.JSONObject
import retrofit2.Call
class GetSacadorControladorUserCase(context: Context) : RestClient(context) {
//sergio: se quita para ir colocando collection_getTickets
/* fun collectionTicketGet(usuario:String,password:String,collectionFk:String,sectorFk:String,print:String,type:String) : Call<CollectionVO> {
val params:ArrayList<String> = ArrayList()
params.add(collectionFk)
params.add(sectorFk)
params.add(print)
params.add(type)
return restClient!!.collectionTicketGet("json","1",usuario,password,"application/json",params)
}*/
//sergio: se cambia llamada a collection_getTickets
fun collectionTicketGet(
usuario: String,
password: String,
collectionFk: String,
sectorFk: String,
print: String,
type: String
): Call<CollectionVO> {
val params: ArrayList<String> = ArrayList()
params.add(collectionFk)
params.add(sectorFk)
params.add(print)
params.add(type)
return restClient!!.collection_getTickets(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun sip_getExtensionSalix(
token:String,
WorkerId: String
): Call<Any> {
val params: ArrayList<String> = ArrayList()
params.add(WorkerId)
return salixClient!!.sip_getExtension(
content_type = "application/json",
authorization = token,
idWorker=WorkerId
)
}
fun sip_getExtension(
usuario: String,
password: String,
WorkerId: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(WorkerId)
return restClient!!.sip_getExtension(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun ticket_checkFullyControlled(
usuario: String,
password: String,
collectionFk: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(collectionFk)
return restClient!!.ticket_checkFullyControlled(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun collectionNew(
usuario: String,
password: String,
sectorFk: String,
carros: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(sectorFk)
params.add(carros)
return restClient!!.collectionNew(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun collectionNew(
usuario: String,
password: String,
sectorFk: String,
carros: String,
tagtype: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(sectorFk)
params.add(carros)
params.add(tagtype)
return restClient!!.collectionNew(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun collectionGet(usuario: String, password: String): Call<List<CollectionVO>> {
// val params:ArrayList<String> = ArrayList()
return restClient!!.collectionGet("json", "1", usuario, password, "application/json")
}
fun collectionGetSalix(token:String): Call<List<CollectionVO>> {
// val params:ArrayList<String> = ArrayList()
return salixClient!!.getCollectionSalix(content_type = "application/json", authorization = token)
}
fun saleTrackingReplace(
usuario: String,
password: String,
saleFk: String,
vOriginalQuantity: String,
vStateFk: String,
vIsChecked: String,
vBuyFk: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(saleFk)
params.add(vOriginalQuantity)
params.add(vStateFk)
params.add(vIsChecked)
params.add(vBuyFk)
return restClient!!.saleTrackingReplace(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun itemPlacementSupplyAiming(
usuario: String,
password: String,
shelvingFk: String,
quantity: String,
itemFk: String
): Call<List<PlacementSupplyVO>> {
val params: ArrayList<String> = ArrayList()
params.add(shelvingFk)
params.add(quantity)
params.add(itemFk)
return restClient!!.itemPlacementSupplyAiming(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun itemShelvingSaleSupplyAdd(
usuario: String,
password: String,
itemShelvingFk: String,
saleFk: String,
quantity: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(itemShelvingFk)
params.add(saleFk)
params.add(quantity)
return restClient!!.itemShelvingSaleSupplyAdd(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun itemShelvingPlacementSupplyAdd(
usuario: String,
password: String,
itemShelvingFk: String,
itemPlacementSupplyFk: String,
quantity: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(itemShelvingFk)
params.add(itemPlacementSupplyFk)
params.add(quantity)
return restClient!!.itemShelvingPlacementSupplyAdd(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun collectionStickerPrint(
usuario: String,
password: String,
collectionFk: String,
sectorFk: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(collectionFk)
params.add(sectorFk)
return restClient!!.collectionStickerPrint(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun ticketCollection_setUsedShelves(
usuario: String,
password: String,
ticketFk: String,
usedShelves: String
): Call<Void> {
val params: ArrayList<String> = ArrayList()
params.add(ticketFk)
params.add(usedShelves)
return restClient!!.ticketCollection_setUsedShelves(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun item_updatePackingShelve(
usuario: String,
password: String,
vSelf : String,
vPacking : String
): Call<Void> {
val params: ArrayList<String> = ArrayList()
params.add(vSelf)
params.add(vPacking)
return restClient!!.item_updatePackingShelve(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun saleTracking_add(
usuario: String,
password: String,
saleGroupFk: String
): Call<Void> {
val params: ArrayList<String> = ArrayList()
params.add(saleGroupFk)
return restClient!!.saleTracking_add(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
/* fun itemGetAvailable(
usuario: String,
password: String,
itemFk: String,
warehouseFk: String
): Call<ItemVO> {
val params: ArrayList<String> = ArrayList()
params.add(itemFk)
params.add(warehouseFk)
return restClient!!.itemGetAvailable(
"json",
"1",
usuario,
password,
"application/json",
params
)
}*/
fun collectionAddItem(
usuario: String,
password: String,
itemFk: String,
quantityFk: String,
ticketFk: String,
warehouseFk: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(itemFk)
params.add(quantityFk)
params.add(ticketFk)
params.add(warehouseFk)
return restClient!!.collectionAddItem(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun saleMove(
usuario: String,
password: String,
saleFk: String,
quantity: String,
originalQuantity: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(saleFk)
params.add(quantity)
params.add(originalQuantity)
return restClient!!.saleMove("json", "1", usuario, password, "application/json", params)
}
fun collectionMissingTrash(
usuario: String,
password: String,
saleFk: String,
quantity: String,
type: String,
warehouseFk: String,
originalQuantity: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(saleFk)
params.add(quantity)
params.add(type)
params.add(warehouseFk)
params.add(originalQuantity)
return restClient!!.collectionMissingTrash(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun saleTrackingDel(usuario: String, password: String, saleFk: String): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(saleFk)
return restClient!!.saleTrackingDel(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun itemShelving_updateFromSale(usuario: String, password: String, saleFk: String,visible:String): Call<Unit> {
val params: ArrayList<String> = ArrayList()
params.add(saleFk)
params.add(visible)
return restClient!!.itemShelving_updateFromSale(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun ticket_setState(
usuario: String,
password: String,
ticketFk: String,
state: String
): Call<Unit> {
val params: ArrayList<String> = ArrayList()
params.add(ticketFk)
params.add(state)
return restClient!!.ticket_setState(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun getIdFromCode(usuario: String, password: String, code: String): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(code)
return restClient!!.getIdFromCode(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun getIdFromCodeSalix(token: String, barCodeValue: String): Call<String> {
return salixClient!!.barcodes_toitem(
"application/json",
authorization = token,
barCodeValue=barCodeValue
)
}
fun collectionIncreaseQuantity(
usuario: String,
password: String,
saleFk: String,
quantity: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(saleFk)
params.add(quantity)
return restClient!!.collectionIncreaseQuantity(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun collectionIncreaseQuantitySalix(
token: String,
saleFk: String,
quantity: String
): Call<Any> {
return salixClient!!.collectionIncreaseQuantitySalix(
"json",
"1",
token,
"application/json",
SalixSaleQuantity(saleId = saleFk.toInt(), quantity = quantity.toInt())
)
}
fun saleMistakeAdd(
usuario: String,
password: String,
vSaleFk: String,
vUserFk: String,
vTypeFk: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(vSaleFk)
params.add(vUserFk)
params.add(vTypeFk)
return restClient!!.saleMistakeAdd(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun mistakeType(usuario: String, password: String): Call<List<MistakeTypeVO>> {
// val params:ArrayList<String> = ArrayList()
return restClient!!.mistakeType("json", "1", usuario, password, "application/json")
}
}

View File

@ -1,30 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.shelvingparking.model.ItemShelvingParkingVO
import retrofit2.Call
class GetShelvingParkingUserCase(context: Context) : RestClient(context) {
fun shelvingParking_get(
usuario: String,
password: String,
vShelvingFk: String,
vWarehouseFk: String,
vDayRange: String
): Call<List<ItemShelvingParkingVO>> {
val params: ArrayList<String> = ArrayList()
params.add(vShelvingFk)
params.add(vWarehouseFk)
params.add(vDayRange)
return restClient!!.shelvingParking_get(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
}

View File

@ -1,54 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.smarttag.sacador.model.SmartTagRegister
import retrofit2.Call
class GetSmarttagsUserCase(context: Context) : RestClient(context) {
fun workerShelving_add(usuario: String, password: String, shelvingFk: String): Call<Void> {
val params: ArrayList<String> = ArrayList()
params.add(shelvingFk)
return restClient!!.workerShelving_add(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun workerShelving_delete(usuario: String, password: String, vBarcode: String): Call<Void> {
val params: ArrayList<String> = ArrayList()
params.add(vBarcode)
return restClient!!.workerShelving_delete(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun smartTagRegister(
smarttag: String,
shelving: String,
level: String
): Call<SmartTagRegister>
{
//https://smart-tag.verdnatura.es/bindShelving/A0A3B8224DBF&ABC&1
return nodejsClient!!.bindShelving("application/json", smarttag, shelving, level)
// return nodejsClient!!.bindShelving("application/json", NodeJsService.SmartTagNode(smarttag, wagon, shelving),"A0A3B8224DBF","ABC","2")
}
fun smartTagInsertTicket(
smarttag: String,
): Call<SmartTagRegister>
{
return nodejsClient!!.insertTicket("application/json", smarttag)
}
}

View File

@ -1,216 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicadorVO
import retrofit2.Call
class GetUbicadorUserCase(context: Context) : RestClient(context) {
fun itemShelvingList(
usuario: String,
password: String,
vShelvingFk: String
): Call<List<ItemUbicadorVO>> {
val params: ArrayList<String> = ArrayList()
params.add(vShelvingFk)
return restClient!!.itemShelvingList(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun itemShelvingMake(
usuario: String,
password: String,
shelving: String,
item: String,
quantity: String,
packing: String,
warehouse: String,
grouping:String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(shelving)
params.add(item)
params.add(quantity)
params.add(packing)
params.add(warehouse)
params.add(grouping)
return restClient!!.itemShelvingMake(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun itemShelvingMakeEdit(
usuario: String,
password: String,
shelving: String,
item: String,
deep: String,
quantity: String,
packing: String,
warehouse: String,
level: String,
itemShelvingFk: String,
grouping:String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(shelving)
params.add(item)
params.add(deep)
params.add(quantity)
params.add(packing)
params.add(warehouse)
params.add(level)
params.add(itemShelvingFk)
params.add(grouping)
return restClient!!.itemShelvingMakeEdit(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun itemShelvingMake_multi(
usuario: String,
password: String,
shelving: String,
items: List<String>,
warehouse: String
): Call<String> {
val params: ArrayList<Any> = ArrayList()
params.add(shelving)
params.add(items)
params.add(warehouse)
return restClient!!.itemShelvingMake_multi(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun shelvingPriorityUpdate(
usuario: String,
password: String,
priority: String,
shelving: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(priority)
params.add(shelving)
return restClient!!.shelvingPriorityUpdate(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun shelvingPark(
usuario: String,
password: String,
shelving: String,
parking: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(shelving)
params.add(parking)
return restClient!!.shelvingPark("json", "1", usuario, password, "application/json", params)
}
fun saleParking_add(
usuario: String,
password: String,
sales:List<String>,
parking: String
): Call<String> {
val params: ArrayList<Any> = ArrayList()
params.add(sales)
params.add(parking)
return restClient!!.saleParking_add("json", "1", usuario, password, "application/json", params)
}
fun shelvingChange(
usuario: String,
password: String,
origen: String,
destino: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(origen)
params.add(destino)
return restClient!!.shelvingChange(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun clearShelvingList(usuario: String, password: String, shelvingFk: String): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(shelvingFk)
return restClient!!.clearShelvingList(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun itemShelvingTransfer(
usuario: String,
password: String,
itemFk: String,
shelvingFk: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(itemFk)
params.add(shelvingFk)
return restClient!!.itemShelvingTransfer(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun itemShelvingDelete(usuario: String, password: String, itemFk: String): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(itemFk)
return restClient!!.itemShelvingDelete(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
}

View File

@ -1,124 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.historicovehiculo.model.ItemHistoricoVehiculo
import retrofit2.Call
class GetVehicleControlTimeUserCase(context: Context) : RestClient(context) {
fun machineWorker_add(
usuario: String,
password: String,
plateNumber: String
): Call<Boolean> {
val params: ArrayList<String> = ArrayList()
params.add(plateNumber)
return restClient!!.machineWorker_add(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun machineWorker_update(
usuario: String,
password: String,
plateNumber: String
): Call<Boolean> {
val params: ArrayList<String> = ArrayList()
params.add(plateNumber)
return restClient!!.machineWorker_update(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun workerMachinery_isRegistered(
usuario: String,
password: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
return restClient!!.workerMachinery_isRegistered(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun machine_getWorkerPlate(usuario: String, password: String): Call<String> {
val params: ArrayList<String> = ArrayList()
return restClient!!.machine_getWorkerPlate(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun deviceProductionUser_getWorker(
usuario: String,
password: String,
userFk: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(userFk)
return restClient!!.deviceProductionUser_getWorker(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun deviceProduction_getnameDevice(
usuario: String,
password: String,
android_id: String
): Call<String> {
val params: ArrayList<String> = ArrayList()
params.add(android_id)
return restClient!!.deviceProduction_getnameDevice(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun machineWorker_getHistorical(
usuario: String,
password: String,
PlateNumber: String
): Call<List<ItemHistoricoVehiculo>> {
val params: ArrayList<String> = ArrayList()
params.add(PlateNumber)
return restClient!!.machineWorker_getHistorical(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
}

View File

@ -1,63 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.sacador.model.CollectionVO
import es.verdnatura.presentation.view.feature.sacador.model.MistakeTypeVO
import es.verdnatura.presentation.view.feature.workermistake.model.DepartmentMistake
import es.verdnatura.presentation.view.feature.workermistake.model.MistakeWorkerType
import es.verdnatura.presentation.view.feature.workermistake.model.WorkerFromMistake
import retrofit2.Call
class GetWokerMistakeUSerCase(context: Context) : RestClient(context) {
fun collectionGet(usuario: String, password: String): Call<List<CollectionVO>> {
// val params:ArrayList<String> = ArrayList()
return restClient!!.collectionGet("json", "1", usuario, password, "application/json")
}
fun collectionGetSalix(token:String): Call<List<CollectionVO>> {
// val params:ArrayList<String> = ArrayList()
return salixClient!!.getCollectionSalix(content_type = "application/json",token)
}
fun workerMistake_Add(
usuario: String,
password: String,
vUserFk: String,
vTypeFk: String
): Call<Unit> {
val params: ArrayList<String> = ArrayList()
params.add(vUserFk)
params.add(vTypeFk)
return restClient!!.workerMistake_Add(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun workerMistakeType_get(usuario: String, password: String): Call<List<MistakeWorkerType>> {
return restClient!!.workerMistakeType_get("json", "1", usuario, password, "application/json")
}
fun department_getHasMistake(usuario: String, password: String): Call<List<DepartmentMistake>> {
return restClient!!.department_getHasMistake("json", "1", usuario, password, "application/json")
}
fun department_getHasMistakeSalix(token:String): Call<List<DepartmentMistake>> {
return salixClient!!.department_getHasMistake(content_type = "application/json", authorization = token)
}
fun worker_getFromHasMistake(usuario: String, password: String, department:String): Call<List<WorkerFromMistake>> {
val params: ArrayList<String> = ArrayList()
params.add(department)
return restClient!!.worker_getFromHasMistake("json", "1", usuario, password, "application/json",params)
}
}

View File

@ -1,45 +0,0 @@
package es.verdnatura.domain
import es.verdnatura.presentation.view.feature.smarttag.sacador.model.SmartTagRegister
import retrofit2.Call
import retrofit2.http.*
interface NodeJsService {
/* @POST("/bindShelving")
fun bindShelving(@Header("Content-Type") content_type: String,
@Body params: SmartTagNode):
Call<SmartTagNode>*/
//NODEJS TEST
@GET("/bindShelving/{smarttag}&{shelvingFK}&{height}")
fun bindShelving(
@Header("Content-Type") content_type: String,
@Path("smarttag") id: String,
@Path("shelvingFK") id2: String,
@Path("height") id3: String
):
Call<SmartTagRegister>
@GET("/insertTicket/{collectionFk}")
fun insertTicket(
@Header("Content-Type") content_type: String,
@Path("collectionFk") id: String
):
Call<SmartTagRegister>
class SmartTagNode(
var message: String = "",
var smarttag: String = "",
var wagon: String = "",
var shelving: String = "",
var isError: Boolean = false,
var errorMessage: String = ""
)
}

View File

@ -1,16 +1,12 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.common.InteceptorListener
open class RestClient(context: Context) {
var restClient: VerdnaturaService? = null
var salixClient: SalixService? = null
var nodejsClient: NodeJsService? = null
open class RestClient(context: Context, myObserver: InteceptorListener? = null) {
var salixClient: SalixService
init {
restClient = ApiUtils.getApiService(context)
salixClient = ApiSalixUtils.getApiService()
nodejsClient = ApiNodeJsUtils.getApiService()
salixClient = ApiSalixUtils.getApiService(context, myObserver)
}
}

View File

@ -0,0 +1,118 @@
package es.verdnatura.domain
import android.content.Context
import android.content.Intent
import com.google.gson.Gson
import com.google.gson.JsonObject
import es.verdnatura.MobileApplication
import es.verdnatura.R
import es.verdnatura.presentation.view.feature.login.activity.LoginActivity
import org.json.JSONObject
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import kotlin.system.exitProcess
abstract class SalixCallback<T>(val context: Context) : Callback<T> {
override fun onResponse(call: Call<T>, response: Response<T>) {
if (response.isSuccessful) {
onSuccess(response)
} else {
try {
val errorBodyString = response.errorBody()?.string()
if (response.code() == 555) {
var message = JSONObject(response.message()).getString("Message")
onError(Error(message))
} else if (response.code() == 401) {
if (!(context as MobileApplication).isLoginRunning()) {
val intent = Intent(context, LoginActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(intent)
exitProcess(0)
} else {
onError(Error(response.message().toString()))
}
} else {
onError(Error(errorSalixMessage(response, errorBodyString)))
}
} catch (t: Throwable) {
defaultErrorHandler(t)
}
}
}
override fun onFailure(call: Call<T>, t: Throwable) {
try {
onError(t)
} catch (t: Throwable) {
defaultErrorHandler(t)
}
}
fun defaultErrorHandler(t: Throwable) {
//println("ErrorSalixx${t.message}")
// (nameofFunction((this)) + t.message).toast(context)
(context as MobileApplication).messageToast(
true,
(nameofFunction((this)) + t.message),
isToasted = true
)
}
open fun onSuccess(response: Response<T>) {
// (nameofFunction((this)) + context.getString(R.string.operationSuccessful)).toast(context)
(context as MobileApplication).messageToast(
isError = false,
message = context.getString(R.string.operationSuccessful)
)
}
open fun onError(t: Throwable) {
throw t
}
private fun errorSalixMessage(response: Response<T>, errorBody: String?): String {
var myErrorCodeBody = errorBody?.let { errorBodyString
->
JSONObject(errorBodyString).getJSONObject("error").optString("code")
}
myErrorCodeBody += errorBody?.let { errorBodyString
->
JSONObject(errorBodyString).getJSONObject("error").optString("message")
}
return try {
val messageResponse = response.errorBody()!!.string()
val jsonObject = Gson().fromJson(messageResponse, JsonObject::class.java)
var messageJson = jsonObject?.getAsJsonObject("error")?.get("message")?.asString
var messageJsonCode = jsonObject?.getAsJsonObject("error")?.get("code")?.asString ?: ""
messageJson ?: "${response.message()}.$myErrorCodeBody.$messageJsonCode"
} catch (ex: Exception) {
response.message() + ".$myErrorCodeBody."
}
}
}
fun nameofFunction(function: Any): String {
return try {
function.javaClass.enclosingMethod!!.name + "->"
} catch (e: Exception) {
"ActivityMain->"
}
}
fun getMessageFromAllResponse(callFunction: String, responseMessage: String): String {
var messageFromError: String = try {
val answerError = JSONObject(responseMessage)
answerError.get("Message").toString()
} catch (e: Exception) {
responseMessage
}
return "$messageFromError.\r${"Callback: $callFunction."}"
}

View File

@ -0,0 +1,39 @@
package es.verdnatura.domain
import android.content.Context
import android.view.View
import es.verdnatura.MobileApplication
import es.verdnatura.domain.ConstAndValues.TOKEN
import es.verdnatura.presentation.common.InteceptorListener
import okhttp3.Interceptor
import okhttp3.Response
import java.io.IOException
class SalixInterceptor(private val context: Context, private val listener: InteceptorListener?) :
Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
var request = chain.request()
//sergio: condición para que añada o no headers según se vaya quitando de las llamadas
//no quitar condición hasta que estén quitados
if (request.headers().toString().isEmpty()) {
val newRequest =
request.newBuilder().addHeader("Content-Type", "application/json").addHeader(
"Authorization",
(context as MobileApplication).dataStoreApp.readDataStoreKey<String>(TOKEN)
).addHeader("Accept-Language", context.getLanguage()).build()
request = newRequest
}
if (request.url().toString().contains("renew")) {
return chain.proceed(request)
} else {
listener!!.onInterceptionResult(View.VISIBLE)
val response = chain.proceed(request)
listener.onInterceptionResult(View.INVISIBLE)
return response
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,18 +0,0 @@
package es.verdnatura.domain
import es.verdnatura.presentation.view.feature.login.model.SalixMessageVO
import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.Header
import retrofit2.http.POST
interface SalixServiceMessages {
@POST("chats/sendCheckingPresence")
fun sendChekingPresence(
@Header("Content-Type") content_type: String,
@Header("Authorization") authorization: String,
@Body params: SalixMessageVO
):
Call<Boolean>
}

File diff suppressed because it is too large Load Diff

View File

@ -1,47 +0,0 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.historicoshelving.model.ItemShelvingLog
import es.verdnatura.presentation.view.feature.historicoshelvinglog.model.ShelvingLog
import retrofit2.Call
class itemShelvingLogUSerCase(context: Context) : RestClient(context) {
fun itemShelvingLog_get(
usuario: String,
password: String,
vShelvingFk: String
): Call<List<ItemShelvingLog>> {
val params: ArrayList<String> = ArrayList()
params.add(vShelvingFk)
return restClient!!.itemShelvingLog_get(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
fun shelvingLog_get(
usuario: String,
password: String,
vShelvingFk: String
): Call<List<ShelvingLog>> {
val params: ArrayList<String> = ArrayList()
params.add(vShelvingFk)
return restClient!!.shelvingLog_get(
"json",
"1",
usuario,
password,
"application/json",
params
)
}
}

View File

@ -0,0 +1,6 @@
package es.verdnatura.domain.model
data class Filter(
val fields: Map<String, Boolean>,
val where: Map<String, Map<String, String>>
)

View File

@ -0,0 +1,43 @@
package es.verdnatura.domain.userCases
import es.verdnatura.domain.SalixService
import es.verdnatura.presentation.view.feature.packaging.model.NotificationQueue
import es.verdnatura.presentation.view.feature.pasillero.model.WorkerActionSalix
import retrofit2.Call
class GetItemFromBarcodeUseCase(private val salixService: SalixService) {
fun execute(barcode: String): Call<Int?> {
return salixService.barcodesToItem(barcode)
}
}
class GetItemPrintItemUseCase(private val salixService: SalixService) {
fun execute(params: Any?): Call<Unit> {
return salixService.printItem(params)
}
fun executeBuyUltimate(params: Any): Call<Long> {
return salixService.buyGetLastWithoutInventory(params)
}
}
class NotiticationUseCase(private val salixService: SalixService) {
fun executeSendNotification(notificationQueue: NotificationQueue): Call<Void> {
return salixService.notificationQueues(notificationQueue)
}
}
class WorkerActivityUseCase(private val salixService: SalixService) {
fun addWorkerActivity(workerActionSalix: WorkerActionSalix): Call<Any> {
return salixService.workerActivityAdd(workerActionSalix)
}
}
class OperatorUseCase(private val salixService: SalixService) {
fun updateOperator(workerFk: Number, update: HashMap<String, Number>): Call<Unit> {
return salixService.updateOperator(
id = workerFk,
params = update
)
}
}

View File

@ -1,24 +1,59 @@
package es.verdnatura.presentation.base
import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.os.Bundle
import android.os.Looper
import android.view.View
import android.view.inputmethod.InputMethodManager
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationCallback
import com.google.android.gms.location.LocationResult
import com.google.android.gms.location.Priority
import es.verdnatura.MobileApplication
import es.verdnatura.domain.toast
interface LocationUpdateCallback {
fun onLocationReceived(location: LocationResult)
}
abstract class BaseActivity<T : ViewDataBinding> : AppCompatActivity() {
protected lateinit var mobileApplication: MobileApplication
private val locationCallback = object : LocationCallback() {
override fun onLocationResult(location: LocationResult) {
locationUpdateCallback?.onLocationReceived(location)
}
}
var locationUpdateCallback: LocationUpdateCallback? = null
protected lateinit var binding: T
private lateinit var fusedLocationClient: FusedLocationProviderClient
private val locationRequest =
com.google.android.gms.location.LocationRequest.Builder(
Priority.PRIORITY_LOW_POWER,
10000L
).apply {
setMinUpdateIntervalMillis(5000L)
}.build()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(getLayoutId())
initDataBinding()
try {
initDataBinding()
} catch (ex: Exception) {
ex.message!!.toast(context = this)
}
mobileApplication = application as MobileApplication
init()
}
@ -27,17 +62,61 @@ abstract class BaseActivity<T : ViewDataBinding> : AppCompatActivity() {
open fun addBindingVariables() {}
abstract fun init()
private fun initDataBinding() {
binding = DataBindingUtil.setContentView(this, getLayoutId())
binding.lifecycleOwner = this
addBindingVariables()
}
fun hideKeyboard(view: View){
fun hideKeyboard(view: View) {
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(view.windowToken, 0)
}
fun checkLocationPermission(): Boolean {
return ContextCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED
}
}
fun requestLocationUpdates(
fusedLocationClient: FusedLocationProviderClient
) {
if (ActivityCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_FINE_LOCATION
) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_COARSE_LOCATION
) != PackageManager.PERMISSION_GRANTED
) {
return
}
fusedLocationClient.requestLocationUpdates(
locationRequest,
locationCallback,
Looper.getMainLooper()
)
}
override fun onDestroy() {
if (::fusedLocationClient.isInitialized) {
fusedLocationClient.removeLocationUpdates(locationCallback)
}
locationUpdateCallback = null
super.onDestroy()
}
fun stopLocationUpdates() {
locationCallback?.let {
fusedLocationClient.removeLocationUpdates(it)
}
}
}

View File

@ -1,112 +1,43 @@
package es.verdnatura.presentation.base
import android.Manifest
import android.app.AlarmManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.media.AudioManager
import android.os.Build
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import android.os.Bundle
import android.speech.RecognitionListener
import android.speech.RecognizerIntent
import android.speech.SpeechRecognizer
import android.speech.tts.TextToSpeech
import android.speech.tts.UtteranceProgressListener
import android.util.Log
import android.provider.Settings
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.LayoutRes
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment
import androidx.preference.PreferenceManager
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import androidx.room.Room
import es.verdnatura.MobileApplication
import es.verdnatura.R
import es.verdnatura.domain.ConstAndValues
import es.verdnatura.domain.ConstAndValues.SECTORFKDEFAULT
import es.verdnatura.domain.toast
import es.verdnatura.presentation.common.mediaCurrentVolume
import es.verdnatura.databinding.ToolbarFragmentBinding
import es.verdnatura.db.DeliveryDatabase
import es.verdnatura.db.MapTypeConverter
import es.verdnatura.presentation.view.feature.main.activity.MainActivity
import org.koin.androidx.viewmodel.ext.android.viewModel
import timber.log.Timber
import java.util.*
import kotlin.reflect.KClass
abstract class BaseFragment<T : ViewDataBinding, V : BaseViewModel>(viewModelClass: KClass<V>) :
Fragment(), TextToSpeech.OnInitListener, RecognitionListener {
protected val TAG = "VERDNATURA"
protected val TD = "VERDNATURA:"
protected val PREFS_USER = "es.verdnatura.user.prefs"
protected val USERFK = "userFk"
protected val USER = "user"
protected val PASSWORD = "password"
protected val TOKEN = "token"
protected val SECTORDESCRIP = "sectordescrip"
protected val SECTORFK = "sectorFk"
protected val PRINTERNAME= "printername"
protected val PRINTERFK = "printerFk"
protected val WAREHOUSEFK = "warehouseFk"
protected val RECORDAR = "recordar"
protected val ANDROID_ID = "ANDROID_ID"
protected val DEVICENAME = "devicename"
protected val VOZ = "voz"
//nuevo campo número carros ajustes y campos para guardar el buyerid y buyernickname
protected val BUYER = "buyernickname"
protected val BUYERID = "buyerid"
protected val WAGON = "wagon"
protected val TAGSTYPE = "tagstype"
protected val WAREHOUSEFK_DEFAULT = 60
protected val DATENOVEHICLE="DATENOVEHICLE"
protected val DEPARTMENTMISTAKE="DEPARTMENTMISTAKE"
protected val DEPARTMENTMISTAKEID="DEPARTMENTMISTAKEID"
abstract class BaseFragment<T : ViewDataBinding, V : BaseViewModel>(
viewModelClass: KClass<V>
) : Fragment() {
protected lateinit var mobileApplication: MobileApplication
protected val viewModel: V by viewModel(viewModelClass)
protected lateinit var binding: T
private var isOnReadyForSpeech = false
protected lateinit var ma: MainActivity
private var textToSpeech: TextToSpeech? = null
private var mAudioManager: AudioManager? = null
protected var mSpeechRecognizer: SpeechRecognizer? = null
private var mSpeechRecognizerIntent: Intent? = null
protected val NEW_COLLECTION = 0
protected val LISTO = 1
protected val CANCEL = 2
protected val VOLVER = 3
protected val REPITE = 4
protected val OTRO = 5
protected val FALTA = 6
protected val ERROR = -1
val allowedStrings =
Arrays.asList(
"cero", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete",
"ocho", "nueve", "diez", "once", "doce", "trece", "catorce",
"quince", "dieziseis", "diezisiete", "dieziocho", "diezinueve", "veinte",
"treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa",
"cien", "mil"
)
override fun onAttach(context: Context) {
super.onAttach(context)
if ((requireActivity().componentName).toString().contains("MainActivity")){
if ((requireActivity().componentName).toString().contains("MainActivity")) {
ma=activity as MainActivity
ma = activity as MainActivity
}
mobileApplication = requireActivity().application as MobileApplication
}
override fun onCreateView(
@ -115,35 +46,14 @@ abstract class BaseFragment<T : ViewDataBinding, V : BaseViewModel>(viewModelCla
savedInstanceState: Bundle?
): View? = inflater.inflate(getLayoutId(), container, false)
/*sergio:deprecated. Se inicializa con onViewCreated
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
initDataBinding()
getBundleArguments()
observeViewModel()
runSound()
// requestRecordAudioPermission()
requestRecordAudioPermissionNew()
init()
}*/
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initDataBinding()
getBundleArguments()
observeViewModel()
init()
override fun onViewCreated(view: View, savedInstanceState: Bundle?)
{
super.onViewCreated(view,savedInstanceState)
initDataBinding()
getBundleArguments()
observeViewModel()
runSound()
//requestRecordAudioPermission()
//requestRecordAudioPermissionNew()
//sergio: para llamadas con SIP
//requestCallPhonePermissionNew()
init()
}
}
@LayoutRes
abstract fun getLayoutId(): Int
@ -152,50 +62,6 @@ override fun onViewCreated(view: View, savedInstanceState: Bundle?)
open fun getBundleArguments() {}
open fun addBindingVariables() {}
open fun setSpeak() {
//VOZ
textToSpeech = TextToSpeech(requireContext(), this)
mAudioManager = requireActivity().getSystemService(Context.AUDIO_SERVICE) as AudioManager
}
open fun restartapp(f: Fragment) {
val mStartActivity = Intent(context, f::class.java)
val mPendingIntentId = 123456
val mPendingIntent = PendingIntent.getActivity(
context,
mPendingIntentId,
mStartActivity,
PendingIntent.FLAG_CANCEL_CURRENT
)
val mgr = requireContext().getSystemService(Context.ALARM_SERVICE) as AlarmManager
mgr[AlarmManager.RTC, System.currentTimeMillis() + 100] = mPendingIntent
System.exit(0)
}
open fun initialize() {
//ESCUCHA
try {
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(requireContext())
mSpeechRecognizerIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
mSpeechRecognizerIntent!!.putExtra(
RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
)
mSpeechRecognizerIntent!!.putExtra(
RecognizerIntent.EXTRA_LANGUAGE,
Locale.getDefault()
)
mSpeechRecognizerIntent!!.putExtra(RecognizerIntent.EXTRA_PREFER_OFFLINE, false)
mSpeechRecognizer?.setRecognitionListener(this)
isOnReadyForSpeech = false
startListening()
} catch (e: Exception) {
cancelSpeech()
}
}
private fun initDataBinding() {
binding = DataBindingUtil.bind<T>(requireView())!!
binding.lifecycleOwner = viewLifecycleOwner
@ -204,542 +70,111 @@ override fun onViewCreated(view: View, savedInstanceState: Bundle?)
addBindingVariables()
}
fun textScanned_filterDouble(textScanned: String):String{
fun textScannedFilterDouble(textScanned: String): String {
if (textScanned.length>13) {
var size = textScanned.length
if (textScanned.substring((size / 2), size) == textScanned.substring(0, size / 2)
) {
if (textScanned.length > 13) {
val size = textScanned.length
if (textScanned.substring((size / 2), size) == textScanned.substring(0, size / 2)
) {
return textScanned.substring(0, size / 2)
}
}
return textScanned
return textScanned
}
fun getTooltip(image: Int):String {
fun getTooltip(image: Int): String {
return when (image) {
//itemCard
R.drawable.ic_autorenew_black_24dp -> "Recarga datos del elemento escaneado/seleccionado"
R.drawable.ic_history_black_24dp -> "Ver Histórico del ítem"
R.drawable.ic_autorenew_black_24dp -> {
getString(R.string.reloadItemData)
}
R.drawable.ic_history_black_24dp -> getString(R.string.showHistoricalItem)
//presacador
R.drawable.ic_local_parking_black_24dp->"Permite aparcar ticket/carro"
R.drawable.ic_local_parking_black_24dp -> getString(R.string.allowParking)
//collection
R.drawable.ic_print_black_24dp->"Imprime ticket"
R.drawable.ic_playlist_add_black_24dp->"Añade ítem"
R.drawable.face_man_outline->"Visualiza la foto del sacador"
R.drawable.phone_call->"Realiza llamada al sacador"
R.drawable.car->"Permite coger vehículo"
R.drawable.car_off->"Permite dejar el vehículo"
R.drawable.ic_print_black_24dp -> getString(R.string.printTicket)
R.drawable.ic_playlist_add_black_24dp -> getString(R.string.addItem)
R.drawable.ic_worker -> getString(R.string.showFacePicker)
R.drawable.car -> getString(R.string.allowSelectVehicle)
R.drawable.car_off -> getString(R.string.allowTakeoffVehicle)
//REPETIDO:R.drawable.ic_history_black_24dp->"Realiza llamada al sacador"
//sacador
R.drawable.ic_add_black_24dp->"Genera colección para sacar"
R.drawable.ic_add_black_24dp -> getString(R.string.newCollection)
//REPETIDO: R.drawable.car->"Permite coger vehículo"
//ubicador:
//REPETIDO: R.drawable.ic_add_black_24dp->"Genera colección para sacar"
//REPETIDO: ic_autorenew_black_24dp
//historico articulo
R.drawable.ic_transaction->"Ver filtro "
R.drawable.alpha_f_circle_outline->"Ver movimientos de Faltas"
R.drawable.alpha_b_circle_outline->"Ver movimientos de Basura"
R.drawable.filter_outline->"Filtra por tipo de flor"
R.drawable.previous_delete->"Quita de pantalla lo que ya está sacado ( misma función que escanear 2.000.000)"
else -> {""}
}
}
override fun onInit(status: Int) {
if (status == TextToSpeech.SUCCESS) {
val spanish = Locale("es", "ES")
textToSpeech!!.language = spanish
textToSpeech!!.setOnUtteranceProgressListener(object : UtteranceProgressListener() {
override fun onDone(utteranceId: String?) {
Log.i("SPEEAK", "on done")
requireActivity().runOnUiThread(Runnable {
if (mSpeechRecognizer != null) {
mSpeechRecognizer!!.destroy()
mSpeechRecognizer = null
}
initialize()
})
}
override fun onError(utteranceId: String?) {
"Error to speak".toast(requireContext())
}
override fun onStart(utteranceId: String?) {
Log.i("SPEEAK", "on start")
runSound()
}
})
} else {
"La voz no se ha podido iniciar".toast(requireContext())
}
}
private fun runSound() {
// Get the maximum media/music volume
//sergio: se quita por no utilizar
// val maxVolume = mAudioManager?.mediaMaxVolume
// mAudioManager?.setMediaVolume(maxVolume!!)
}
private fun muteSound() {
if (mAudioManager?.mediaCurrentVolume != 0) {
// mAudioManager?.setMediaVolume(0)
}
}
fun speak(frase: String) {
textToSpeech!!.speak(frase, TextToSpeech.QUEUE_FLUSH, null, "frase")
}
open fun startListening() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
muteSound()
}
mSpeechRecognizer!!.startListening(mSpeechRecognizerIntent)
}
override fun onReadyForSpeech(params: Bundle?) {
isOnReadyForSpeech = true
Log.i("Speech", "onReadyForSpeech")
}
override fun onBeginningOfSpeech() {
Log.i("Speech", "onBeginningOfSpeech")
}
override fun onRmsChanged(rmsdB: Float) {}
override fun onBufferReceived(buffer: ByteArray?) {
Log.i("Speech", "onBufferReceived")
}
override fun onEndOfSpeech() {
Log.i("Speech", "onEndOfSpeech")
}
override fun onError(error: Int) {
if (!isOnReadyForSpeech && error == SpeechRecognizer.ERROR_NO_MATCH) {
("Problemas con la velocidad de internet. No se puede usar la voz").toast(requireContext())
return
} else {
Log.i("Speech", "onError " + error)
if (mSpeechRecognizer != null) mSpeechRecognizer!!.destroy()
mSpeechRecognizer = null
initialize()
}
}
override fun onResults(results: Bundle) {}
override fun onPartialResults(partialResults: Bundle?) {
Log.i("Speech", "onPartialResults")
}
override fun onEvent(eventType: Int, params: Bundle?) {
Log.i("Speech", "onEvent")
}
open fun checkText(text: String): Int {
//check for nuevo
val nuevo = getMatch(text, "nuevo")
//check for listo
val listo = getMatch(text, "listo")
//check for cancelar
val cancelar = getMatch(text, "cancelar")
//check for volver
val volver = getMatch(text, "volver")
//check for repite
val repite = getMatch(text, "repite")
//check for siguiente
val otro = getMatch(text, "otro")
//check for FALTA
val falta = getMatch(text, "falta")
val words = IntArray(7)
words[0] = nuevo
words[1] = listo
words[2] = cancelar
words[3] = volver
words[4] = repite
words[5] = otro
words[6] = falta
return getMax(words)
}
private fun getMax(a: IntArray): Int {
var max = a[0]
var pos = 0
for (i in a.indices) {
if (a[i] > max) {
max = a[i]
pos = i
}
}
return if (max < 80) {
-1
} else pos
}
private fun getMatch(a: String, b: String): Int {
var count = 0
val cha = a.toCharArray()
val chb = b.toCharArray()
for (i in cha) {
for (x in chb) {
if (x == i) {
count += 1
break
}
}
}
val numChar = a.length
if (numChar != 0)
return count * 100 / numChar
else
return 100
}
/* private fun requestReadPhoneStatePermission(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val requiredPermission: String = Manifest.permission.READ_PHONE_STATE
val res = context!!.checkCallingOrSelfPermission(requiredPermission)
if (res == PackageManager.PERMISSION_DENIED) {
requestPermissions(arrayOf(requiredPermission), 102)
}
}
}*/
/*sergio:deprecated
private fun requestRecordAudioPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val requiredPermission: String = Manifest.permission.RECORD_AUDIO
val res = requireContext().checkCallingOrSelfPermission(requiredPermission)
// If the user previously denied this permission then show a message explaining why
// this permission is needed
if (res == PackageManager.PERMISSION_DENIED) {
requestPermissions(arrayOf(requiredPermission), 101)
}
}
}*/
private fun requestCallPhonePermission(){
val permissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
)
{ isGranted ->
if (isGranted) {
Timber.i("permisos ok")
}
else {
Timber.i("Denegados permisos")
}
}
permissionLauncher.launch(Manifest.permission.CALL_PHONE)
}
private fun requestRecordAudioPermissionNew() {
val permissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
)
{ isGranted ->
if (isGranted) {
Timber.i("permisos ok")
}
else {
Timber.i("Denegados permisos")
}
}
permissionLauncher.launch(Manifest.permission.RECORD_AUDIO)
}
private fun requestCallPhonePermissionNew() {
val permissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
)
{ isGranted ->
if (isGranted) {
Timber.i("permisos ok")
}
else {
Timber.i("Denegados permisos")
}
}
permissionLauncher.launch(Manifest.permission.CALL_PHONE)
}
fun cancelSpeech() {
if (mSpeechRecognizer != null) {
mSpeechRecognizer!!.destroy()
mSpeechRecognizer = null
}
}
private fun getDefaults(key: String?, context: Context?): String? {
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
return preferences.getString(key, null)
}
fun getData(name:String):String{
val prefs: SharedPreferences = requireActivity().getSharedPreferences(PREFS_USER, 0)
return when (name){
TOKEN->prefs.getString(name, "").toString()
ANDROID_ID->prefs.getString(name, "0").toString()
USERFK->prefs.getString(USERFK, "").toString() //el id
USER->prefs.getString(USER, "").toString()
PASSWORD -> prefs.getString(PASSWORD, "").toString()
SECTORFK->prefs.getInt(name, SECTORFKDEFAULT).toString()
WAREHOUSEFK->prefs.getInt(name, ConstAndValues.WAREHOUSEFKDEFAULT).toString()
VOZ->prefs.getString(name, "NO").toString()
WAGON->prefs.getInt(name, 2).toString()
TAGSTYPE-> prefs.getString(name, "Stickers").toString()
SECTORDESCRIP->prefs.getString(name,getString(R.string.Sinsector)).toString()
BUYER->prefs.getString(name,"").toString()
BUYERID->prefs.getString(name,"").toString()
DATENOVEHICLE->prefs.getString(name,"0").toString()
DEPARTMENTMISTAKE->prefs.getString(name,"").toString()
DEPARTMENTMISTAKEID->prefs.getString(name,"").toString()
PRINTERFK->prefs.getInt(name,0).toString()
PRINTERNAME->prefs.getString(name,"Sin impresora").toString()
"base_url"->{
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
preferences.getString("base_url","").toString()
}
else -> {""}
}
}
fun removeSector(){
val prefs: SharedPreferences = requireActivity().getSharedPreferences(PREFS_USER, 0)
val editor = prefs.edit()
editor.remove(SECTORFK).commit()
editor.remove(SECTORDESCRIP).commit()
editor.remove(WAREHOUSEFK).commit()
}
fun setDefaults(key: String?, value: String?, context: Context?) {
val preferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
val editor = preferences.edit()
editor.putString(key, value)
editor.commit()
}
fun saveData(name:String,value:String){
val prefs: SharedPreferences = requireActivity().getSharedPreferences(PREFS_USER, 0)
val editor = prefs.edit()
// Log.d("VERDNATURA::","El name es "+name+":"+ "y el valor "+value)
when (name) {
ANDROID_ID -> editor.putString(name, value)
"base_url" -> {
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
val editorPref = preferences.edit()
editorPref.putString("base_url", value)
editorPref.commit()
}
R.drawable.ic_transaction -> getString(R.string.showFilter)
R.drawable.alpha_f_circle_outline -> getString(R.string.showFaults)
R.drawable.alpha_b_circle_outline -> getString(R.string.showTrash)
R.drawable.filter_outline -> getString(R.string.filterFlower)
R.drawable.ic_mode_edit_black_24dp -> getString(R.string.allowChangeShelving)
R.drawable.ic_delete_forever_black_24dp -> getString(R.string.deleteAllitems)
R.drawable.ic_flash_auto_black_24dp -> getString(R.string.allowAutomaticAddItem)
R.drawable.ic_logo_salix -> getString(R.string.accessSalix)
R.drawable.ic_eye_ui -> getString(R.string.icViewCollection)
R.drawable.ic_collection -> getString(R.string.icViewCollection)
R.drawable.ic_ubicator_check -> getString(R.string.checkerUbication)
R.drawable.ic_delivery_truck -> getString(R.string.loadRoute)
R.drawable.ic_confirm -> getString(R.string.confirmDescription)
R.drawable.camion -> getString(R.string.openLoadingConsignee)
R.drawable.exit -> getString(R.string.exitScreen)
R.drawable.ic_image_upload -> getString(R.string.messageUpload)
R.drawable.expedition_find -> getString(R.string.showLogExpedition)
R.drawable.ic_info_refresh -> getString(R.string.udpateRoutes)
R.drawable.ic_info_delivery -> getString(R.string.info)
R.drawable.ic_filter_inventory -> getString(R.string.filterNoReview)
R.drawable.ic_remove_checks -> getString(R.string.resetReviewItems)
R.drawable.ic_eye_inventory -> getString(R.string.inventoryShowParking)
R.drawable.ic_sort -> getString(R.string.sortRouteSalix)
R.drawable.ic_sign_ticket -> getString(R.string.signed)
R.drawable.ic_send -> getString(R.string.sendDriverRoute)
R.drawable.ic_add_multiple -> getString(R.string.addItemMultipleShelvings)
R.drawable.ic_clean_shelving -> getString(R.string.activityOrganize)
R.drawable.ic_booking -> getString(R.string.bookingNewSalesCollection)
else -> {
editor.putString(name, value)
}
}
editor.commit()
}
fun saveDataInt(name:String,value:Int){
val prefs: SharedPreferences = requireActivity().getSharedPreferences(PREFS_USER, 0)
val editor = prefs.edit()
when (name){
name-> editor.putInt(name, value)
ANDROID_ID->editor.putInt(name, value)
}
editor.apply()
}
fun saveBuyer(buyernickname: String) {
val prefs: SharedPreferences = requireActivity().getSharedPreferences(PREFS_USER, 0)
val editor = prefs.edit()
editor.putString(BUYER, buyernickname)
editor.apply()
}
fun saveBuyerId(buyerid: String) {
val prefs: SharedPreferences = requireActivity().getSharedPreferences(PREFS_USER, 0)
val editor = prefs.edit()
editor.putString(BUYERID, buyerid)
editor.apply()
}
fun getIMEI(): String {
val prefs: SharedPreferences = requireActivity().getSharedPreferences(PREFS_USER, 0)
val imei = prefs.getString("IMEI", "0")
return imei.toString()
}
fun getMessageFromJSON(json: String): String {
val gson = Gson()
var message = ""
// val mapType = object : TypeToken<Map<String, Any>>() {}.type
var tutorialMap: Map<String, Any> =
gson.fromJson(json, object : TypeToken<Map<String, Any>>() {}.type)
tutorialMap.forEach {
if (it.key.equals("Message")) {
message = it.value.toString()
""
}
}
return message
}
fun getListFromJSON(json: String): List<String> {
val gson = Gson()
var list = mutableListOf<String>()
fun hideBackButton(tool: ToolbarFragmentBinding) {
tool.backButton.visibility = View.INVISIBLE
}
// val mapType = object : TypeToken<Map<String, Any>>() {}.type
var tutorialMap: Map<String, Any> =
gson.fromJson(json, object : TypeToken<Map<String, Any>>() {}.type)
tutorialMap.forEach {
list.add(it.key +":"+ it.value)
fun getInfoVersionNameApp(): String {
val manager: PackageManager = requireContext().packageManager
val info: PackageInfo = manager.getPackageInfo(requireContext().packageName, 0)
mobileApplication.versionName = info.versionName.toString()
return mobileApplication.versionName
}
fun getDevicePDA(): Int? {
return try {
Settings.Global.getString(
mobileApplication.contentResolver, Settings.Global.DEVICE_NAME
).toInt()
} catch (ex: Exception) {
null
}
return list
}
}
/*open fun wordToNumber(input: String?): Int {
var input = input
var isValidInput = true
var result = 0
var finalResult = 0
if (input != null && input.length > 0) {
input = input.replace("-".toRegex(), " ")
input = input.toLowerCase().replace(" and".toRegex(), " ")
val splittedParts =
input.trim { it <= ' ' }.split("\\s+".toRegex()).toTypedArray()
for (str in splittedParts) {
if (!es.verdnatura.warehouse.UTILS.Utils.allowedStrings.contains(str)) {
isValidInput = false
return -1
}
}
if (isValidInput) {
for (str in splittedParts) {
if (str.equals("cero", ignoreCase = true)) {
result += 0
} else if (str.equals("uno", ignoreCase = true)) {
result += 1
} else if (str.equals("dos", ignoreCase = true)) {
result += 2
} else if (str.equals("tres", ignoreCase = true)) {
result += 3
} else if (str.equals("cuatro", ignoreCase = true)) {
result += 4
} else if (str.equals("cinco", ignoreCase = true)) {
result += 5
} else if (str.equals("seis", ignoreCase = true)) {
result += 6
} else if (str.equals("siete", ignoreCase = true)) {
result += 7
} else if (str.equals("ocho", ignoreCase = true)) {
result += 8
} else if (str.equals("nueve", ignoreCase = true)) {
result += 9
} else if (str.equals("diez", ignoreCase = true)) {
result += 10
} else if (str.equals("once", ignoreCase = true)) {
result += 11
} else if (str.equals("doce", ignoreCase = true)) {
result += 12
} else if (str.equals("trece", ignoreCase = true)) {
result += 13
} else if (str.equals("catorce", ignoreCase = true)) {
result += 14
} else if (str.equals("quince", ignoreCase = true)) {
result += 15
} else if (str.equals("dieziseis", ignoreCase = true)) {
result += 16
} else if (str.equals("diezisiete", ignoreCase = true)) {
result += 17
} else if (str.equals("dieziocho", ignoreCase = true)) {
result += 18
} else if (str.equals("diezinueve", ignoreCase = true)) {
result += 19
} else if (str.equals("veinte", ignoreCase = true)) {
result += 20
} else if (str.equals("treinta", ignoreCase = true)) {
result += 30
} else if (str.equals("cuarenta", ignoreCase = true)) {
result += 40
} else if (str.equals("cincuenta", ignoreCase = true)) {
result += 50
} else if (str.equals("sesenta", ignoreCase = true)) {
result += 60
} else if (str.equals("setenta", ignoreCase = true)) {
result += 70
} else if (str.equals("ochenta", ignoreCase = true)) {
result += 80
} else if (str.equals("noventa", ignoreCase = true)) {
result += 90
} else if (str.equals("cien", ignoreCase = true)) {
result *= 100
} else if (str.equals("mil", ignoreCase = true)) {
result *= 1000
finalResult += result
result = 0
}
}
finalResult += result
return finalResult
}
}
return finalResult
}*/
fun database(myContext: Context): DeliveryDatabase {
return Room.databaseBuilder(
myContext,
DeliveryDatabase::class.java, "expediciones.db"
).addTypeConverter(MapTypeConverter())
.build()
}

View File

@ -1,45 +1,19 @@
package es.verdnatura.presentation.base
import android.content.Context
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.ViewModel
import org.json.JSONObject
import es.verdnatura.MobileApplication
import es.verdnatura.domain.SalixService
abstract class BaseViewModel : ViewModel(), LifecycleObserver
abstract class BaseViewModel : ViewModel, LifecycleObserver {
lateinit var app: MobileApplication
lateinit var salix: SalixService
fun nameofFunction(function: Any): String
{
// return Thread.currentThread().stackTrace[1].methodName
return function.javaClass.enclosingMethod!!.name
constructor() : super()
constructor(context: Context) : super() {
app = context as MobileApplication
salix = app.salix
}
}
fun getMessageFromAllResponse(callFunction: String, ResponseMessage: String): String
{
var messageFromError: String
var returnMessage: String
try
{
val answerError = JSONObject(ResponseMessage)
messageFromError = answerError.get("Message").toString()
} catch (e: Exception)
{
messageFromError = ResponseMessage
}
//sergio:para personalizar los mensajes de respuesta según la llamada.
when (callFunction)
{
"collection_getTickets" -> returnMessage ="No hay tickets para sacar. Llamada $callFunction."
else ->
{
returnMessage = "Llamada $callFunction."
}
}
//}
return "$messageFromError.\r$returnMessage"
}

View File

@ -0,0 +1,13 @@
package es.verdnatura.presentation.base
import android.app.Application
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.ViewModel
import es.verdnatura.MobileApplication
import es.verdnatura.domain.SalixService
abstract class BaseViewModelCompose(application: Application) : ViewModel(), LifecycleObserver {
protected val app: MobileApplication = application as MobileApplication
protected val salix: SalixService = app.salix
}

View File

@ -7,42 +7,57 @@ import androidx.recyclerview.widget.RecyclerView
import es.verdnatura.databinding.ItemGeneralRowBinding
class GeneralAdapter(
private val items: List<GeneralItem>,
private val OnGeneralItemRowClickListener: OnGeneralItemRowClickListener,
// private var showDelete: Boolean = false
): RecyclerView.Adapter<GeneralAdapter.ItemHolder> () {
private var items: List<GeneralItem>,
private val onDeleteItemRowClickListener: OnGeneralItemRowClickListener? = null,
private var showDelete: Boolean = false,
private val onRowClickListener: OnGeneralRowClickListener? = null
) : RecyclerView.Adapter<GeneralAdapter.ItemHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder {
return ItemHolder(
ItemGeneralRowBinding.inflate(LayoutInflater.from(parent.context), parent, false)
)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder {
return ItemHolder(
ItemGeneralRowBinding.inflate(LayoutInflater.from(parent.context),parent,false)
)
}
override fun getItemCount() = items.size
override fun getItemCount() =items.size
override fun onBindViewHolder(holder: ItemHolder, position: Int) {
holder.bind(items[position])
override fun onBindViewHolder(holder: ItemHolder, position: Int) {
holder.bind(items[position])
}
holder.binding.root.setOnClickListener {
OnGeneralItemRowClickListener.OnGeneralItemRowClickListener(items[position])
inner class ItemHolder(
val binding: ItemGeneralRowBinding
) : RecyclerView.ViewHolder(binding.root) {
//private val res = binding.root.context.resources
fun bind(item: GeneralItem) {
binding.apply {
this.item = item
if (showDelete) itemImage.visibility = View.VISIBLE
else itemImage.visibility = View.GONE
itemCode.visibility = View.GONE
}
binding.itemImage.setOnClickListener {
onDeleteItemRowClickListener?.onGeneralItemRowClickListener(item)
}
binding.itemCode.setOnClickListener {
onRowClickListener?.onRowClickListener(item)
}
binding.itemTitle.setOnClickListener {
onRowClickListener?.onRowClickListener(item)
}
}
inner class ItemHolder(
val binding: ItemGeneralRowBinding
) : RecyclerView.ViewHolder(binding.root){
//private val res = binding.root.context.resources
fun bind(item: GeneralItem) {
binding.apply {
this.item = item
/*if (showDelete) itemImage.visibility = View.VISIBLE
else itemImage.visibility = View.GONE*/
itemCode.visibility=View.GONE
}
}
}
}
fun updateItems(list: List<GeneralItem>) {
items = list
notifyDataSetChanged()
}
fun setShowDelete(hasVisibility: Boolean) {
showDelete = hasVisibility
notifyDataSetChanged()
}
}

View File

@ -0,0 +1,13 @@
package es.verdnatura.presentation.common
import android.graphics.Rect
import android.view.View
import androidx.recyclerview.widget.RecyclerView
class ItemDescorationCustomized(private val verticalSpaceHeight: Int) : RecyclerView.ItemDecoration() {
override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
outRect.bottom = verticalSpaceHeight
}
}

View File

@ -0,0 +1,44 @@
package es.verdnatura.presentation.common
import android.content.Context
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkRequest
import es.verdnatura.MobileApplication
import es.verdnatura.R
import es.verdnatura.presentation.view.feature.main.activity.MainActivity
class NetworkUtilsApp(context: Context, applicationContext: MobileApplication) {
private val connectivityManager: ConnectivityManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
private val networkCallback: ConnectivityManager.NetworkCallback =
object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
applicationContext.hasNetwork = true
}
override fun onLost(network: Network) {
applicationContext.hasNetwork = false
(context as MainActivity).messageWithSound(
context.getString(R.string.sin_internet),
true,
false
)
}
}
fun registerNetworkCallback() {
val networkRequest = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build()
connectivityManager.registerNetworkCallback(networkRequest, networkCallback)
}
fun unregisterNetworkCallback() {
connectivityManager.unregisterNetworkCallback(networkCallback)
}
}

View File

@ -0,0 +1,102 @@
package es.verdnatura.presentation.common
import android.app.AlertDialog
import android.content.Context
import android.text.InputType
import android.view.View
import android.view.inputmethod.EditorInfo
import es.verdnatura.R
import es.verdnatura.domain.toast
import es.verdnatura.presentation.view.component.CustomDialogInput
import es.verdnatura.presentation.view.component.CustomDialogList
class PrinterDialogManager(private val context: Context) {
fun showPrintDialog(
item: Long,
itemName: String,
onPrintClick: (Long, String, Int?, Int) -> Unit,
onPrintChange: (String) -> Unit
) {
val customDialogList = CustomDialogList(context)
customDialogList.getEditText().setRawInputType(InputType.TYPE_CLASS_NUMBER)
customDialogList.getEditTextThree().setRawInputType(InputType.TYPE_CLASS_NUMBER)
customDialogList.setTitle(context.getString(R.string.itemName, item, itemName))
.setOkButton(context.getString(R.string.printQr)) {
handlePrintClick(item, customDialogList, onPrintClick, "qr")
customDialogList.dismiss()
}.setOkTwoButton(context.getString(R.string.printBarcode)) {
handlePrintClick(item, customDialogList, onPrintClick, "barcode")
customDialogList.dismiss()
//Tarea 7823
}.setOkThreeButton(context.getString(R.string.changePrinter)) {
readQrPrinter(onPrintChange)
}.setKoButton(context.getString(R.string.cancel)) {
customDialogList.dismiss()
}.setHintValueThree(context.getString(R.string.labelNumber))
.setHintValue(context.getString(R.string.optionalPacking)).setTextThree(View.VISIBLE)
.show()
customDialogList.getFocusThree()
}
private fun readQrPrinter(onPrintChange: (String) -> Unit) {
val customDialogInput = CustomDialogInput(context)
customDialogInput.setTitle(context.getString(R.string.changePrinter))
.setDescription(context.getString(R.string.scanQrPrinter))
.setOkButton(context.getString(R.string.save)) {
onPrintChange(customDialogInput.getValue())
customDialogInput.dismiss()
}.setKoButton(context.getString(R.string.cancel)) {
customDialogInput.dismiss()
}.setValue("").show()
customDialogInput.getEditText().requestFocus()
customDialogInput.getEditText().setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0) {
onPrintChange(customDialogInput.getValue())
println("printerrr ${customDialogInput.getValue()}")
customDialogInput.dismiss()
return@setOnEditorActionListener true
}
false
}
}
private fun handlePrintClick(
item: Long,
customDialogList: CustomDialogList,
onPrintClick: (Long, String, Int?, Int) -> Unit,
labelType: String
) {
try {
onPrintClick(
item,
labelType,
if (customDialogList.getValue().isEmpty()) null else customDialogList.getValue()
.toInt(),
if (customDialogList.getValueOptional()
.isEmpty()
) 1 else customDialogList.getValueOptional().toInt()
)
customDialogList.dismiss()
} catch (ex: Exception) {
context.getString(R.string.errorInput).toast(context)
}
}
}
class LabelDialogHelper(private val context: Context) {
fun showLabelDialog(
onItemSelected: (Int) -> Unit,
) {
val builder = AlertDialog.Builder(context)
builder.setTitle(context.getString(R.string.selectLabeltoPrint))
val labelCount = Array(10) { (it + 1).toString() }
builder.setItems(labelCount) { _, which ->
onItemSelected(which + 1)
}
builder.create().show()
}
}

View File

@ -3,25 +3,50 @@ package es.verdnatura.presentation.common
class ResponseItemVO(
var response: String = "",
var isError: Boolean = false,
var errorMessage: String = ""
)
var errorMessage: String = "",
var codeError: Int = 0,
var routine: String = "",
var data: Any? = null
)
data class ResponseSign(
val fileToSign: String = "",
val isError: Boolean = false,
val message: String = ""
)
class ResponseHasOlder(
var shelvingFkIn: String,
var parking: String? = null,
var shelvingFkOut: String? = null,
var itemFk: Int? = null,
var action: Action,
var hasOlder: Boolean = false
)
class ResponseItemExistsItemShelvingSale(
var exists: Boolean,
var position: Int,
var quantity: Int
)
class ResponseItemNumber(
var response: Int? = null,
var isError: Boolean = false,
var errorMessage: String = "",
var codeError: Int = 0
)
class ResponseItemMachineControl(
var response: String = "",
var isError: Boolean = false,
var errorMessage: String = "",
var type: String
)
class DataMessageSalix(
var ticket: String = "",
var item: String = "",
var quantity: String = "",
var personSale: String = ""
)
)
class GeneralItem(
var code:String? = "",
var text:String? = ""
)
var code: String? = "",
var text: String? = ""
)
enum class Action {
PARKINEAR, TRANSFERIR
}

View File

@ -1,10 +1,118 @@
package es.verdnatura.presentation.common
class itemPackingTypeSalix(
var itemPackingTypeFk: String = ""
class ItemBarCodeSalix(
var itemFk: Int,
var code: String
)
class itemBarCodeSalix(
var itemFk: String = "",
var code:String=""
data class SaleTrackingReplaceSalix(
var saleFk: Int,
var originalQuantity: Int,
var code: String,
var isChecked: Boolean,
var buyFk: Long,
var isScanned: Boolean,
)
data class SaleTrackingSalix(
var saleFk: Int,
var originalQuantity: Int,
var code: String,
var isChecked: Boolean,
var buyFk: Long,
var isScanned: Boolean?,
var quantity: Int,
var itemShelvingFk: Int
)
data class PackingSiteSalix(
val ticketFk: Number,
val workerFk: Number
)
data class ItemShelvingSaleSalix(
var id: Int,
var quantity: Int,
var isItemShelvingSaleEmpty: Boolean?
)
data class ItemShelving(
var id: Int,
var itemFk: Int,
var shelvingFk: String,
var position: Int,
var quantity: Int,
var visible: Int? = null,
var available: Int? = null
)
data class ItemShelvingSalix(
var visible: Int,
var packing: Int?,
var grouping: Int?,
var available: Int?
)
data class ItemDiscardSalixShortage(
var itemFk: Int,
var warehouseFk: Int,
var quantity: Int,
var addressFk: Int?
)
data class BackSalixCall(
var schema: String = "vn",
var params: ArrayList<Any?>
)
data class CollectionItemSalix(
var barcode: String,
var quantity: Int,
var ticketFk: Int,
var warehouseFk: Int
)
//Tarea 6889
data class ItemAddSale(
var barcode: String,
var quantity: Int,
)
data class TicketState(
val ticketFk: Int = 0,
val code: String = "",
val user: UserSalix = UserSalix()
) {
data class UserSalix(
val id: Int = 0,
val username: String = ""
)
}
data class ExpeditionPrintOut(
val expeditionFk: Long,
val itemFk: Int,
val isChecked: Boolean
)
data class TicketPickupResponse(
val id: Int,
val agencyMode: AgencyMode?
)
data class AgencyMode(
val id: Int,
val deliveryMethodFk: Int,
val deliveryMethod: DeliveryMethod?
)
data class DeliveryMethod(
val id: Int,
val code: String?
)

View File

@ -1,58 +1,61 @@
package es.verdnatura.presentation.common
import android.graphics.drawable.Drawable
import android.os.Build
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.ImageView
import androidx.annotation.RequiresApi
import androidx.recyclerview.widget.RecyclerView
import es.verdnatura.R
import es.verdnatura.databinding.ItemToolbarRowBinding
class ToolBarAdapterTooltip (
class ToolBarAdapterTooltip(
private val items: List<ImageView>,
private val onOptionsSelectedListener: OnOptionsSelectedListener
) : RecyclerView.Adapter<ToolBarAdapterTooltip.ItemHolder>() {
private var items: List<ImageView>,
private val onOptionsSelectedListener: OnOptionsSelectedListener
) : RecyclerView.Adapter<ToolBarAdapterTooltip.ItemHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder {
return ItemHolder(
ItemToolbarRowBinding.inflate(LayoutInflater.from(parent.context), parent, false)
)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder {
return ItemHolder(
ItemToolbarRowBinding.inflate(LayoutInflater.from(parent.context), parent, false)
)
}
override fun getItemCount() = items.size
override fun getItemCount() = items.size
@RequiresApi(Build.VERSION_CODES.O)
override fun onBindViewHolder(holder: ItemHolder, position: Int) {
holder.bind(items[position])
@RequiresApi(Build.VERSION_CODES.O)
override fun onBindViewHolder(holder: ItemHolder, position: Int) {
holder.bind(items[position])
}
}
fun setItemsList(itemsNewList: List<ImageView>) {
items = itemsNewList
notifyDataSetChanged()
}
inner class ItemHolder(
val binding: ItemToolbarRowBinding
) : RecyclerView.ViewHolder(binding.root) {
private val res = binding.root.context.resources
inner class ItemHolder(
val binding: ItemToolbarRowBinding
) : RecyclerView.ViewHolder(binding.root) {
private val res = binding.root.context.resources
fun bind(item: ImageView) {
binding.apply {
imagebuttonIcon.setImageDrawable(item.drawable)
imagebuttonIcon.setOnClickListener {
onOptionsSelectedListener.onOptionsItemSelected(item.drawable)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
imagebuttonIcon.tooltipText=item.tooltipText
}
fun bind(item: ImageView) {
binding.apply {
imagebuttonIcon.setImageDrawable(item.drawable)
imagebuttonIcon.setOnClickListener {
onOptionsSelectedListener.onOptionsItemSelected(item.drawable)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
imagebuttonIcon.tooltipText = item.tooltipText
}
}
}
}
}

View File

@ -1,21 +1,37 @@
package es.verdnatura.presentation.common
import android.graphics.drawable.Drawable
import android.view.View
import es.verdnatura.presentation.view.feature.ajustes.model.AjustesItemVO
import es.verdnatura.presentation.view.feature.articulo.model.BarcodeVO
import es.verdnatura.presentation.view.feature.articulo.model.ItemCardRowVO
import es.verdnatura.presentation.view.feature.articulo.model.ItemProposal
import es.verdnatura.presentation.view.feature.buscaritem.model.ItemLocationVO
import es.verdnatura.presentation.view.feature.faltas.model.ItemFaltasVO
import es.verdnatura.presentation.view.feature.claim.fragment.reubication.model.Reubication
import es.verdnatura.presentation.view.feature.delivery.model.ClientTicketSalix
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoSummary
import es.verdnatura.presentation.view.feature.delivery.model.RouteComplement
import es.verdnatura.presentation.view.feature.delivery.model.RouteInfo
import es.verdnatura.presentation.view.feature.delivery.model.Ticket
import es.verdnatura.presentation.view.feature.historicoarticulo.model.ItemHistoricoVO
import es.verdnatura.presentation.view.feature.inventario.model.ItemInventaryVO
import es.verdnatura.presentation.view.feature.inventario.model.ItemInventoryParking
import es.verdnatura.presentation.view.feature.login.model.WorkForms
import es.verdnatura.presentation.view.feature.packaging.model.ItemSupplier
import es.verdnatura.presentation.view.feature.paletizador.model.ItemExpeditionScanVO
import es.verdnatura.presentation.view.feature.paletizador.model.ItemExpeditionStateRow
import es.verdnatura.presentation.view.feature.paletizador.model.ItemExpeditionTruckVO
import es.verdnatura.presentation.view.feature.paletizador.model.ItemPalletVO
import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
import es.verdnatura.presentation.view.feature.roadmap.model.RoadMapTruck
import es.verdnatura.presentation.view.feature.roadmap.model.RoadStopMapTruck
import es.verdnatura.presentation.view.feature.roadmap.model.StopMapTruckPallet
import es.verdnatura.presentation.view.feature.roadmap.model.TruckAction
import es.verdnatura.presentation.view.feature.sacador.model.CollectionTicket
import es.verdnatura.presentation.view.feature.sacador.model.CollectionVO
import es.verdnatura.presentation.view.feature.sacador.model.Sale
import es.verdnatura.presentation.view.feature.sacador.model.SaleVO
import es.verdnatura.presentation.view.feature.smarttag.model.SmartTag
import es.verdnatura.presentation.view.feature.ubicador.model.ItemShelving
import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicador
import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicadorVO
import es.verdnatura.presentation.view.feature.workermistake.model.WorkerFromMistake
@ -23,28 +39,58 @@ interface OnOptionsSelectedListener {
fun onOptionsItemSelected(item: Drawable)
}
interface OnPasillerosItemClickListener {
fun onPasillerosItemClickListener(item: PasillerosItemVO,entryPoint:String)
fun onPasillerosItemClickListener(
item: PasillerosItemVO,
entryPoint: String,
param: Any? = null
)
}
interface onMistakeWorkerClickListener {
interface OnMistakeWorkerClickListener {
fun onMistakeWorkerClickListener(item: WorkerFromMistake)
}
interface OnSalarySupplementClickListener {
fun onSalarySupplementClickListener(item: RouteComplement)
}
interface hideBottomNavigation{
fun hideBottomNavigation(entryPoint:String)
interface HideBottomNavigation {
fun hideBottomNavigation(entryPoint: String)
}
interface OnAjustesItemClickListener {
fun onAjustesItemClickListener(item: AjustesItemVO)
}
interface OnItemCardRowClickListener {
fun onItemCardRowClickListener(item: ItemCardRowVO)
}
interface OnItemImageLoadRowClickListener {
fun onItemImageLoadRowClickListener(item: ExpeditionInfoSummary)
}
interface OnItemImageRouteRowClickListener {
fun onItemImageRouteRowClickListener(item: RouteInfo, action: String)
}
interface OnItemButtonTicketRowClickListener {
fun onItemButtonTicketRowClickListener(item: ClientTicketSalix, action: String)
}
interface OnItemButtonRoadMapStopRowClickListener {
fun onItemButtonRoadMapStopRowClickListener(item: ClientTicketSalix, action: String)
}
interface OnItemButtonCMRRowClickListener {
fun onItemButtonCMRRowClickListener(item: Ticket)
}
interface OnAddressRowClickListener {
fun onAddressRowClickListener(item: ExpeditionInfoSummary)
}
/*interface OnItemExpeditionStateRowClickListener {
fun OnItemExpeditionStateRowClickListener(item: ItemExpeditionStateRow)
}*/
@ -54,89 +100,234 @@ interface OnBarcodeRowClickListener {
}
interface OnSmartTagRowClickListener {
fun OnSmartTagRowClickListener(item: SmartTag)
fun onSmartTagRowClickListener(item: SmartTag)
}
interface OnGeneralItemRowClickListener {
fun OnGeneralItemRowClickListener(item: GeneralItem)
fun onGeneralItemRowClickListener(item: GeneralItem)
}
interface OnLocationRowClickListener {
fun onLocationRowClickListener(item: ItemLocationVO)
interface OnGeneralRowClickListener {
fun onRowClickListener(item: GeneralItem)
}
interface OnImageTrashClickListener {
fun onImageTrashClickListener(item: Any)
}
interface OnEditSubQuantityListener {
fun onEditSubQuantityListener(item: Any, text: String)
}
interface AdapterCallback {
fun getPosition(): Int
}
interface OnItemClickListener {
fun onItemClickListener(item: ItemSupplier)
}
interface OnImageUpdateClickListener {
fun onImageUpdateClickListener(item: Any)
}
interface OnWorkFormsItemRowClickListener {
fun onWorkFormsItemRowClickListener(item: WorkForms)
}
interface OnTrashItemRowClickListener {
fun onTrashItemRowClickListener(item: WorkForms)
}
interface OnInvetoryNichoClickListener {
fun onInvetoryNichoClickListener(item: ItemInventaryVO)
}
interface OnItemProposalClickListener{
interface OnItemProposalClickListener {
fun onItemProposalClickListener(item: ItemProposal)
}
interface OnFaltasNichoClickListener {
fun onFaltasNichoClickListener(item: ItemFaltasVO)
}
interface OnFaltasReviewClickListener {
fun onFaltasReviewClickListener(item: ItemFaltasVO)
}
interface OnAutomaticItemClickListener {
fun onAutomaticItemClickListener(position: Int)
}
interface OnClientHistoricItemClickListener {
fun onClientHistoricItemClickListener(item: ItemHistoricoVO)
}
interface OnOutQuantityHistoricItemClickListener {
fun onOutQuantityHistoricItemClickListener(item: ItemHistoricoVO)
}
interface OnVisibleClickListener {
fun onVisibleClickListener(item: ItemUbicadorVO)
}
interface OnVisibleClickListenerNew {
fun onVisibleClickListener(item: ItemUbicador)
}
interface OnVisibleClickListener6869 {
fun onVisibleClickListener(item: ItemShelving)
}
interface OnVisibleInventoryClickListener {
fun onVisibleInventoryClickListener(item: ItemInventoryParking)
}
interface OnMoreClickListener {
fun onMoreClickListener(item: ItemUbicadorVO)
}
interface OnMoreClickListenerNew {
fun onMoreClickListener(item: ItemUbicador)
}
interface OnMoreClickListener6869 {
fun onMoreClickListener(item: ItemShelving)
}
interface OnTruckClickListener {
fun onTruckClickListener(item: ItemExpeditionTruckVO,entryPoint: String)
fun onTruckClickListener(item: ItemExpeditionTruckVO, entryPoint: String)
}
interface OnRoadMapClickListener {
fun onRoadMapClickListener(item: RoadMapTruck, entryPoint: String)
}
interface OnStopMapClickListener {
fun onStopMapClickListener(
item: RoadStopMapTruck,
entryPoint: String,
action: TruckAction,
view: View? = null
)
}
interface OnStopMapLoadClickListener {
fun onStopMapClickListener(item: RoadStopMapTruck, entryPoint: String)
}
interface OnStopMapUnloadClickListener {
fun onStopMapClickListener(item: RoadStopMapTruck, entryPoint: String)
}
interface OnPrintClickListener {
fun onPrintClickListener(item: StopMapTruckPallet, entryPoint: String)
}
interface OnPalletClickListener {
fun onPalletClickListener(itemTruck: ItemExpeditionTruckVO,itemPallet: ItemPalletVO)
fun onPalletClickListener(itemTruck: ItemExpeditionTruckVO, itemPallet: ItemPalletVO)
}
interface OnComprobarPalletViewClickListener {
fun onComprobarPalletViewClickListener(itemTruck: ItemExpeditionTruckVO,itemPallet: ItemPalletVO)
fun onComprobarPalletViewClickListener(
itemTruck: ItemExpeditionTruckVO,
itemPallet: ItemPalletVO
)
}
interface OnScanLongClickListener {
fun onScanLongClickListener(ItemExpeditionScanVO: ItemExpeditionScanVO)
fun onScanLongClickListener(itemExpeditionScanVO: ItemExpeditionScanVO)
}
interface OnCollectionSelectedListener {
fun onCollectionSelected(collection: CollectionVO,type:String)
fun onCollectionSelected(collection: CollectionVO, type: String)
}
interface OnCollectionTicketSelectedListener {
fun onCollectionSelected(
collection: CollectionTicket,
type: String,
hasPicking: Boolean = false,
hasToAdd: Boolean = false
)
}
interface OnQuantityClickListener {
fun onQuantityClick(sale: SaleVO)
}
interface onPackingClickListener {
fun onPackingClick(sale:SaleVO)
interface OnQuantityClickSaleListener {
fun onQuantityClick(sale: Sale)
}
interface OnPackingClickListener {
fun onPackingClick(sale: SaleVO)
}
interface OnPackingClickSaleListener {
fun onPackingClick(sale: Sale)
}
interface OnSaleClickListener {
fun onSaleClick(sale: SaleVO)
}
interface OnSaleClickSaleListener {
fun onSaleClick(sale: Sale)
}
interface OnReubicationClickListener {
fun onReubicationClick(reubication: Reubication)
}
interface OnMistakeClickListener {
fun onMistakeClickListener(sale:SaleVO)
fun onMistakeClickListener(sale: SaleVO)
}
interface OnTicketClickListener {
fun onTicketClickListener(sale: SaleVO)
}
interface OnTicketColorListener {
fun onTicketColorListener(sale: SaleVO)
}
interface OnTicketClickSaleListener {
fun onTicketClickListener(sale: Sale)
}
interface OnSaleReserveClickListener {
fun onSaleReserveListener(sale: Sale)
}
interface OnAddItemClickListener {
fun onAddItemClickListener(sale: Sale)
}
interface OnBuyerSelectedListener {
fun onBuyerSelected(userFk:String)
fun onBuyerSelected(userFk: String)
}
interface OnStarSelectedListener {
fun onStarSelected(vId:String, vStars:String)
fun onStarSelected(vId: String, vStars: String)
}
interface onVehicleSelected{
interface OnVehicleSelected {
fun onVehicleClick(userFk: String)
}
interface OnClickDynamic {
fun onClickDynamic(addressFK: Int)
}
interface InteceptorListener {
fun onInterceptionResult(visibility: Int)
}
interface MainActivityListener {
fun onApplicationEventAnimation(visibility: Int)
}
interface LoginListener {
fun onApplicationEventAnimation(visibility: Int)
}
interface SignListener {
fun onApplicationEventAnimation(visibility: Int)
}
interface OnBackPressedListener {
fun onBackPressedHandled(): Boolean
}

View File

@ -3,18 +3,20 @@ package es.verdnatura.presentation.common
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.media.AudioManager
import android.os.Build
import android.os.Bundle
import android.text.InputType
import android.util.Log
import android.os.Handler
import android.os.Looper
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
import android.view.inputmethod.InputMethodManager
import android.widget.ImageView
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentManager
@ -23,14 +25,19 @@ import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition
import es.verdnatura.BuildConfig
import java.util.*
import java.text.DecimalFormat
import java.text.ParseException
import java.text.SimpleDateFormat
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime
import java.time.format.DateTimeFormatter
import java.util.Calendar
import java.util.Locale
inline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> FragmentTransaction) =
beginTransaction().func().commit()
fun <T> Context.openActivity(it: Class<T>, extras: Bundle.() -> Unit = {}) {
val intent = Intent(this, it)
intent.putExtras(Bundle().apply(extras))
@ -69,23 +76,26 @@ fun View.setDimensions(width: Int, height: Int) {
layoutParams?.height = height
this.layoutParams = layoutParams
}
fun View.setMargins(left: Int, top: Int, right: Int, bottom: Int) {
val mlp = this.layoutParams as ViewGroup.MarginLayoutParams
mlp.setMargins(left, top, right, bottom)
}
fun ImageView.loadUrl(url: String) {
Glide.with(context)
.asBitmap()
.load(url)
.into(object : CustomTarget<Bitmap>() {
fun ImageView.loadUrl(url: String?) {
if (!url.isNullOrEmpty()) {
Glide.with(context)
.asBitmap()
.load(url)
.into(object : CustomTarget<Bitmap>() {
override fun onLoadCleared(placeholder: Drawable?) {}
override fun onLoadCleared(placeholder: Drawable?) {}
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
setImageBitmap(resource)
}
})
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
setImageBitmap(resource)
}
})
}
}
inline val <reified T> T.TAG: String
@ -121,12 +131,13 @@ fun Calendar.convertToDateString(): String {
11 -> dayOfMonth = "Dic"
}
return dayOfWeek + " " + day + " " + dayOfMonth
return "$dayOfWeek $day $dayOfMonth"
}
fun RecyclerView.addViewObserver(function: () -> Unit) {
val view = this
view.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
view.viewTreeObserver.addOnGlobalLayoutListener(object :
ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
view.viewTreeObserver.removeOnGlobalLayoutListener(this)
function.invoke()
@ -141,29 +152,34 @@ fun Fragment.hideKeyboard() {
fun Activity.hideKeyboard() {
hideKeyboard(currentFocus ?: View(this))
}
fun Activity.showKeyboardIn() {
showKeyboardIn(currentFocus ?: View(this))
}
fun Context.hideKeyboard(view: View) {
val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
Handler(Looper.getMainLooper()).postDelayed({
val inputMethodManager =
getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
}, 100L)
}
fun Context.showKeyboard(){
fun Context.showKeyboard() {
val imm = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager?
imm!!.toggleSoftInput(InputType.TYPE_CLASS_NUMBER, 0)
imm!!.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
}
fun Context.showKeyboardIn(view:View){
fun Context.showKeyboardIn(view: View) {
val imm = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager?
imm!!.showSoftInput(view, 0)
}
// Extension function to change media volume programmatically
fun AudioManager.setMediaVolume(volumeIndex:Int) {
fun AudioManager.setMediaVolume(volumeIndex: Int) {
// Set media volume level
this.setStreamVolume(
AudioManager.STREAM_MUSIC, // Stream type
@ -173,9 +189,59 @@ fun AudioManager.setMediaVolume(volumeIndex:Int) {
}
// Extension property to get media maximum volume index
val AudioManager.mediaMaxVolume:Int
val AudioManager.mediaMaxVolume: Int
get() = this.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
// Extension property to get media/music current volume index
val AudioManager.mediaCurrentVolume:Int
val AudioManager.mediaCurrentVolume: Int
get() = this.getStreamVolume(AudioManager.STREAM_MUSIC)
fun getHourDay(date: String): String? {
return try {
val format = SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault())
val cal = Calendar.getInstance()
cal.time = format.parse(date)!!
val f = DecimalFormat("00")
"" + f.format(cal[Calendar.HOUR_OF_DAY]) + ":" + f.format(cal[Calendar.MINUTE])
} catch (e: ParseException) {
e.printStackTrace()
"00:00"
}
}
fun addDateToTime(time: String): String {
val currentTime = Calendar.getInstance()
val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
val currentDate = dateFormat.format(currentTime.time)
return "$currentDate $time"
}
fun PackageManager.getPackageInfoCompat(packageName: String, flags: Int = 0): PackageInfo =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(flags.toLong()))
} else {
getPackageInfo(packageName, flags)
}
fun convertToDateString(date: String?): String? {
if (date.isNullOrEmpty()) {
return date
}
val formatoEntrada =
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.getDefault()) // Formato de entrada
val formatoSalida = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) // Formato de salida
val dateToConvert = formatoEntrada.parse(date) // Convertir fecha de String a objeto Date
return formatoSalida.format(dateToConvert!!) // Convertir fecha a String con formato deseado
}
fun getDayBounds(dateString: String): Pair<LocalDateTime, LocalDateTime> {
val formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy")
val date = LocalDate.parse(dateString, formatter)
val startOfDay = date.atTime(LocalTime.MIN)
val endOfDay = date.atTime(LocalTime.MAX)
return Pair(startOfDay, endOfDay)
}

View File

@ -0,0 +1,48 @@
package es.verdnatura.presentation.common
import android.content.Context
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import es.verdnatura.R
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Locale
class FunctionUtils {
fun getMessageFromJSON(json: String): String {
val gson = Gson()
var message = ""
val tutorialMap: Map<String, Any> =
gson.fromJson(json, object : TypeToken<Map<String, Any>>() {}.type)
tutorialMap.forEach {
if (it.key == "Message") {
message = it.value.toString()
}
}
return message
}
fun getListFromJSON(json: String): List<String> {
val gson = Gson()
val list = mutableListOf<String>()
// val mapType = object : TypeToken<Map<String, Any>>() {}.type
val tutorialMap: Map<String, Any> =
gson.fromJson(json, object : TypeToken<Map<String, Any>>() {}.type)
tutorialMap.forEach {
list.add(it.key + ":" + it.value)
}
return list
}
private fun getCurdate(date: String, context: Context): String {
val c = Calendar.getInstance()
val df =
SimpleDateFormat(context.getString(R.string.dateCompleteFormat), Locale.getDefault())
val df2 = SimpleDateFormat(context.getString(R.string.timeFormat), Locale.getDefault())
c.time = df.parse(date)!!
return df2.format(c.time)
}
}

View File

@ -0,0 +1,75 @@
package es.verdnatura.presentation.common
import android.os.Build
import androidx.annotation.RequiresApi
import org.json.JSONObject
import java.time.format.DateTimeFormatter
data class ItemScanned(var scanned: JSONObject) {
var table: String = scanned.get("table").toString()
var id: Int = scanned.get("id").toString().toInt()
var company: String = scanned.get("company").toString()
var more: String = if (scanned.has("more")) scanned.get("more").toString() else ""
var user: Int = scanned.get("user").toString().toInt()
@RequiresApi(Build.VERSION_CODES.O)
var created = DateTimeFormatter.ISO_INSTANT.parse(scanned.get("created").toString())
}
fun itemScanIsQr(value: String): Boolean {
return try {
ItemScanned(JSONObject(value))
true
} catch (ex: Exception) {
false
}
}
fun itemScanValue(value: String, table: Array<String>, field: String): Any {
val item: ItemScanned
return try {
try {
item = ItemScanned(JSONObject(value))
} catch (ex: Exception) {
return value
}
if (item.company == "vnl" && item.table in table) {
when (item.table) {
"ticket" -> {
return item.id
}
"saleGroup" -> {
return item.id
}
"buy" -> {
when (field) {
"id" -> return item.id
"more" -> return item.more
}
}
"expeditionPallet" -> {
return item.id
}
"printer" -> {
return item.id
}
}
}
throw Exception("QR no válido")
} catch (ex: Exception) {
throw ex
}
}

View File

@ -0,0 +1,264 @@
package es.verdnatura.presentation.composable
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.PlainTooltip
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.material3.TextFieldDefaults
import androidx.compose.material3.TooltipBox
import androidx.compose.material3.TooltipDefaults
import androidx.compose.material3.rememberTooltipState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Alignment.Companion.CenterVertically
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import es.verdnatura.R
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun CustomToolbar(
title: String,
subtitle: String? = null,
showBackButton: Boolean = true,
showSwitch: Boolean = false,
iconList: List<IconToolBar> = emptyList(),
onBackClick: () -> Unit = {},
onSwitchChange: (Boolean) -> Unit = {},
) {
Column(
modifier = Modifier
.fillMaxWidth()
.background(Color.Black)
) {
Row(
modifier = Modifier
.fillMaxWidth()
.height(56.dp),
verticalAlignment = CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween
) {
if (showBackButton) {
IconButton(
onClick = { onBackClick() },
modifier = Modifier.padding(start = 0.dp),
) {
Icon(
painter = painterResource(id = R.drawable.ic_chevron_left),
contentDescription = "Back",
tint = Color.White
)
}
}
Text(
modifier = Modifier.weight(1f),
text = title,
color = Color.White,
fontSize = dimensionResource(id = R.dimen.title).value.sp,
fontWeight = FontWeight.Bold,
)
if (!subtitle.isNullOrEmpty()) {
Text(
modifier = Modifier.weight(1f),
text = subtitle,
color = Color.White.copy(alpha = 0.7f),
fontSize = dimensionResource(id = R.dimen.subtitle).value.sp
)
}
if (iconList.isNotEmpty()) {
LazyRow(
horizontalArrangement = Arrangement.End, // Esto asegura que los iconos estén a la derecha
) {
items(iconList) { iconToolBar ->
TooltipBox(
positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
tooltip = {
PlainTooltip {
Text(iconToolBar.toolTip)
}
},
state = rememberTooltipState()
) {
IconButton(
onClick = { iconToolBar.onClickIcon() },
) {
Icon(
painter = painterResource(id = iconToolBar.idRes),
contentDescription = iconToolBar.toolTip,
tint = Color.White
)
}
}
}
}
}
}
if (showSwitch) {
var switchState by remember { mutableStateOf(false) }
Switch(
checked = switchState,
onCheckedChange = {
switchState = it
onSwitchChange(it)
}
)
}
}
HorizontalDivider(
thickness = 1.dp,
color = colorResource(id = R.color.verdnatura_brown_grey)
)
}
data class IconToolBar(
val idRes: Int,
val toolTip: String = "",
val tint: Color = Color.White,
val onClickIcon: () -> Unit,
)
@Composable
fun ScanLineTextSearch(
value: String,
onValueChange: (String) -> Unit,
onImeAction: () -> Unit,
modifier: Modifier = Modifier.wrapContentSize(),
) {
val keyboardController = LocalSoftwareKeyboardController.current
Box(
modifier = Modifier.fillMaxWidth(),
contentAlignment = Alignment.Center
) {
TextField(
value = value,
onValueChange = onValueChange,
textStyle = TextStyle(
color = Color.White,
textAlign = TextAlign.Center
),
placeholder = {
Box(
modifier = Modifier.fillMaxWidth(),
contentAlignment = Alignment.Center
) {
Text(
text = stringResource(id = R.string.Escaneaetiqueta),
textAlign = TextAlign.Center,
color = Color.White,
modifier = Modifier.fillMaxWidth()
)
}
},
singleLine = true,
keyboardActions = KeyboardActions(
onDone = {
onImeAction()
keyboardController?.hide()
}
),
keyboardOptions = KeyboardOptions.Default.copy(
imeAction = ImeAction.Done
),
colors = TextFieldDefaults.colors(
focusedContainerColor = Color.DarkGray, // Fondo cuando está enfocado
unfocusedContainerColor = Color.DarkGray, // Fondo cuando NO está enfocado
cursorColor = Color.White, // Color del cursor
focusedTextColor = Color.White, // Color del texto cuando está enfocado
unfocusedTextColor = Color.White, // Color del texto cuando NO está enfocado
focusedPlaceholderColor = Color.Black, // Color del placeholder cuando está enfocado
unfocusedPlaceholderColor = Color.Black // Color del placeholder cuando NO está enfocado
),
modifier = modifier
.fillMaxWidth(fraction = 0.67f)
.border(2.dp, Color.White, RoundedCornerShape(8.dp))
.height(52.dp)
/* .onFocusEvent {
if (it.isFocused) {
keyboardController?.hide()
}
}*/
)
}
}
@Preview
@Composable
fun PreviewToolbar() {
CustomToolbar(
title = "Mi Toolbar",
subtitle = "10/20",
showBackButton = true,
showSwitch = true,
iconList = listOf(
IconToolBar(
R.drawable.ic_parking_ui, "", tint = Color.Blue,
onClickIcon = { }
)
),
onBackClick = { /* Acción de volver atrás */ },
onSwitchChange = { /* Acción del switch */ }
)
}
@Preview
@Composable
fun PreviewScanLineTextSearch() {
ScanLineTextSearch(
value = stringResource(R.string.scanLabel),
onValueChange = {},
onImeAction = {})
}

View File

@ -0,0 +1,17 @@
package es.verdnatura.presentation.composable
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import es.verdnatura.R
class ImageViewActivityComposable : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val imageUrl = intent.getStringExtra(getString(R.string.url)) ?: ""
val title = intent.getStringExtra(getString(R.string.title)) ?: ""
ImageViewScreen(imageUrl = imageUrl, titleToolBar = title, onBackClick = { finish() })
}
}
}

View File

@ -0,0 +1,59 @@
package es.verdnatura.presentation.composable
import android.widget.ImageView
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.bumptech.glide.Glide
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ImageViewScreen(imageUrl: String, titleToolBar:String ="",onBackClick: () -> Unit ) {
CustomToolbar(
title = titleToolBar,
subtitle = "",
showBackButton = true,
showSwitch = false,
iconList = listOf(),
onBackClick = onBackClick ,
onSwitchChange = { }
)
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Top
) {
Spacer(modifier = Modifier.height(16.dp))
GlideImage(imageUrl = imageUrl)
}
}
@Composable
fun GlideImage(imageUrl: String) {
androidx.compose.ui.viewinterop.AndroidView(
factory = { context ->
ImageView(context).apply {
Glide.with(context)
.load(imageUrl)
.into(this)
}
},
modifier = Modifier.fillMaxSize()
)
}
@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
ImageViewScreen(imageUrl = "https://example.com/image.jpg", "titleToolbar") {}
}

View File

@ -0,0 +1,38 @@
package es.verdnatura.presentation.composable
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.dimensionResource
import com.airbnb.lottie.compose.LottieAnimation
import com.airbnb.lottie.compose.LottieCompositionSpec
import com.airbnb.lottie.compose.LottieConstants
import com.airbnb.lottie.compose.rememberLottieComposition
import es.verdnatura.R
@Composable
fun LottieLoadingAnimation(isVisible: Boolean = true) {
AnimatedVisibility(
visible = isVisible,
enter = fadeIn(),
exit = fadeOut()
) {
val composition by rememberLottieComposition(
spec = LottieCompositionSpec.RawRes(R.raw.orange_loading)
)
LottieAnimation(
composition = composition,
iterations = LottieConstants.IterateForever,
speed = 2f,
modifier = Modifier
.wrapContentWidth()
.height(dimensionResource(id = R.dimen.verdnatura_logo_large_height))
)
}
}

View File

@ -0,0 +1,72 @@
package es.verdnatura.presentation.composable.ui
import androidx.compose.ui.graphics.Color
object VerdnaturaColors {
val OrangeSalix = Color(0xFFEC8916)
val BlackCustomDialog = Color(0xFF1A1A1A)
val BlackTextInput = Color(0xFF666666)
val White = Color(0xFFFFFFFF)
// Colores principales
val ColorPrimary = Color(0xFFF7931E)
val ColorPrimaryDark = Color(0xFF8B4200)
// Negros
/* val Black = Color(0xFF000000)
val Black1 = Color(0xFF1D1D1D)
val Black2 = Color(0xFF171717)
val Black3 = Color(0xFF292929)
val Black4 = Color(0xFF242424)
val Black5 = Color(0xFF323232)
val Black6 = Color(0xFF333333)
val Black7 = Color(0xFF282828)
val Black8 = Color(0xFF1A1A1A)
val BlackCustomDialog = Color(0xFF464446)
val Black8Alpha6 = Color(0x991A1A1A) // Con transparencia
// Grises
val WarmGrey = Color(0xFF707070)
val BrownGrey = Color(0xFF8F8F8F)
val BrownGreyLight = Color(0xFFB8ADAD)
// Colores vivos
val Red = Color(0xFFE74C3C)
val WarmBrown = Color(0xFF8B4200)
val PumpkinOrange = Color(0xFFF7931E)
val PumpkinLight = Color(0xFFF77956)
val PinkSalix = Color(0xFFFF99CC)
val SunflowerYellow = Color(0xFFFFD400)
val DarkSkyBlue = Color(0xFF4AB4E6)
val DarkGreenVerdnatura = Color(0xFFA3D131)
val DarkMint = Color(0xFF50BE87)
val DarkMintLight = Color(0xFF80BE87)
val DarkMintLightPrecontrolled = Color(0xFFB8DABA)
val LightTeal = Color(0xFFB8ECD6)
val White = Color(0xFFFFFFFF)
val RedSalix = Color(0xFFFB5252)
val OrangeSalix = Color(0xFFEC8916)
// Fondos
val BackgroundItemPicker = Color(0xFF4D4D4D)
val BackgroundSubtitleSettings = Color(0xFF1A1A1A)
val BackgroundItemsMenus = Color(0xFF333333)
// Colores SALIX
val SalixSuccessLight = Color(0xFFA3D131)
val ColorHeader = Color(0xFF3D3D3D)
val ColorMenuHeader = Color(0xFF3D3D3D)
val ColorBg = Color(0xFF222222)
val ColorBgDark = Color(0xFF222222)
val ColorActive = Color(0xFF666666)
val ColorActiveFont = Color(0xFFFFFFFF)
val ColorBgPanel = Color(0xFF3C3B3B)
val ColorMain = ColorPrimary
val ColorMarginal = Color(0xFF222222)
val ColorSuccess = Color(0xFFA3D131)
val ColorNotice = Color(0xFF32B1CE)
val ColorAlert = Color(0xFFFA3939)
val ColorPink = Color(0xFFFF99CC)
val ColorYellow = Color(0xFFFFFF00)*/
}

View File

@ -0,0 +1,168 @@
package es.verdnatura.presentation.composable.ui
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.material3.TextFieldDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@Composable
fun DefaultButtonCustomDialog(
text: String,
onClick: () -> Unit = {},
enabled: Boolean = true,
leadingIcon: @Composable (() -> Unit)? = null
) {
Button(
modifier = Modifier.fillMaxWidth(),
onClick = onClick,
enabled = enabled,
contentPadding = PaddingValues(
start = if (leadingIcon == null) 16.dp else 8.dp,
end = 16.dp
),
shape = MaterialTheme.shapes.small,
colors = ButtonDefaults.buttonColors(
containerColor = VerdnaturaColors.ColorPrimary,
contentColor = VerdnaturaColors.White
)
) {
if (leadingIcon != null) {
leadingIcon()
}
Text(
text = text.uppercase(),
fontSize = 14.sp,
fontWeight = FontWeight.Bold,
textAlign = TextAlign.Center,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
}
}
@Composable
fun TitleTextCustomDialog(
title: String,
) {
Text(
text = title,
style = MaterialTheme.typography.titleLarge.copy(
fontWeight = FontWeight.Bold
),
color = VerdnaturaColors.White,
textAlign = TextAlign.Center,
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 8.dp)
)
}
@Composable
fun DescriptionTextCustomDialog(
description: String,
) {
Text(
text = description,
color = VerdnaturaColors.White,
style = MaterialTheme.typography.bodyLarge,
modifier = Modifier.padding(bottom = 8.dp)
)
}
@Composable
fun ScanTextCustomDialog(
value: TextFieldValue,
onValueChange: (TextFieldValue) -> Unit,
hint: String,
onEnterPressed: (String) -> Unit = {},
focusRequester: FocusRequester
) {
val keyboardController = LocalSoftwareKeyboardController.current
TextField(
value = value,
onValueChange = onValueChange,
label = {
Text(
text = hint,
textAlign = TextAlign.Center,
color = Color.White,
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
)
},
modifier = Modifier
.fillMaxWidth()
.focusRequester(focusRequester)
.border(1.dp, Color.White, shape = MaterialTheme.shapes.small)
.background(Color.Transparent)
.height(VerdnaturaDimens.minHeight),
textStyle = CustomTextStyle,
keyboardOptions =
KeyboardOptions.Default.copy(
imeAction = ImeAction.Done,
keyboardType = KeyboardType.Number
),
singleLine = true,
keyboardActions = KeyboardActions(
onDone = {
onEnterPressed(value.text)
onValueChange(TextFieldValue(""))
keyboardController?.hide()
}
),
colors = TextFieldDefaults.colors(
focusedContainerColor = Color.Transparent,
unfocusedContainerColor = Color.Transparent,
focusedTextColor = VerdnaturaColors.White,
unfocusedTextColor = VerdnaturaColors.White
)
)
LaunchedEffect(Unit) {
focusRequester.requestFocus()
}
}
@Preview(showBackground = true)
@Composable
fun PreviewCustomTextField() {
val sampleText = remember { mutableStateOf(TextFieldValue("Texto de ejemplo")) }
val focusRequester = remember { FocusRequester() }
ScanTextCustomDialog(
value = sampleText.value,
onValueChange = { sampleText.value = it },
hint = "Escribe algo...",
onEnterPressed = { text -> println("Texto ingresado: $text") },
focusRequester = focusRequester
)
}

View File

@ -0,0 +1,23 @@
package es.verdnatura.presentation.composable.ui
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
object VerdnaturaDimens {
/* val h1 = 96.sp
val h2 = 60.sp
val h3 = 48.sp
val h4 = 34.sp
val h5 = 24.sp
val h6 = 20.sp
val h7 = 18.sp
val h9 = 14.sp*/
// Text sizes
val fontSizeCustomDialogs = 16.sp
// Height Scan Text
val minHeight = 48.dp
}

View File

@ -0,0 +1,10 @@
package es.verdnatura.presentation.composable.ui
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.style.TextAlign
val CustomTextStyle = TextStyle(
color = VerdnaturaColors.White,
fontSize = VerdnaturaDimens.fontSizeCustomDialogs,
textAlign = TextAlign.Center
)

View File

@ -0,0 +1,505 @@
package es.verdnatura.presentation.testing
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.pdf.PdfRenderer
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Parcel
import android.os.ParcelFileDescriptor
import android.os.ResultReceiver
import android.view.inputmethod.EditorInfo
import android.widget.Toast
import androidx.lifecycle.Observer
import es.verdnatura.R
import es.verdnatura.databinding.FragmentTestingPrintBinding
import es.verdnatura.domain.ConstAndValues.TOKEN
import es.verdnatura.domain.toast
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.feature.qr.QrFragmentViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.io.File
import java.io.IOException
import java.io.UnsupportedEncodingException
@Suppress("UNUSED_ANONYMOUS_PARAMETER")
class TestPrint(
var entryPoint: String = ""
) : BaseFragment<FragmentTestingPrintBinding, QrFragmentViewModel>(QrFragmentViewModel::class) {
private var goBack: Boolean = false
override fun getLayoutId(): Int = R.layout.fragment_testing_print
private lateinit var customDialog: CustomDialog
private var itemscaned = ""
companion object {
fun newInstance(entryPoint: String) = TestPrint(entryPoint)
}
override fun init() {
customDialog = CustomDialog(requireContext())
setToolbar()
setEvents()
val i = Intent()
i.setClassName(
"verdnatura.es.repartoverdnatura", "verdnatura.es.repartoverdnatura.MainActivity"
)
i.putExtra(TOKEN, mobileApplication.dataStoreApp.readDataStoreKey<String>(TOKEN))
startActivity(i)
super.init()
}
private fun setToolbar() {
binding.mainToolbar.toolbarTitle.text = entryPoint
}
override fun onPause() {
goBack = true
super.onPause()
}
private fun setEvents() {
binding.mainToolbar.backButton.setOnClickListener {
ma.onMyBackPressed()
}
binding.buttonPrintTemplate.setOnClickListener {
printTemplate()
}
binding.buttonPrintAll.setOnClickListener {
printAllData()
}
binding.buttonPrintZpl.setOnClickListener {
printZPL()
}
binding.buttonPrintStatus.setOnClickListener {
printStatus()
}
binding.buttonPrintDisconnect.setOnClickListener {
printDisconnect()
}
binding.buttonImgToPdf.setOnClickListener {
convertImg()
}
binding.scanInput.requestFocus()
binding.scanInput.setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0) {
goBack = false
if (!binding.scanInput.text.isNullOrEmpty()) {
itemscaned = binding.scanInput.text.toString()
}
}
binding.scanInput.setText("")
ma.hideKeyboard(binding.scanInput)
return@setOnEditorActionListener true
}
// false
}
@Throws(IOException::class)
fun getFileFromAssets(context: Context, fileName: String): File =
File(context.cacheDir, fileName).also {
if (!it.exists()) {
it.outputStream().use { cache ->
context.assets.open(fileName).use { inputStream ->
inputStream.copyTo(cache)
}
}
}
}
private fun convertImg() {
val path: Uri = Uri.parse("file://android_asset/raw/test.pdf")
//val newPath: String = path.toString()
val filePath = getFileFromAssets(requireContext(), "test.pdf").absolutePath
val input = ParcelFileDescriptor.open(File(filePath), ParcelFileDescriptor.MODE_READ_ONLY)
val renderer = PdfRenderer(input)
val page = renderer.openPage(0)
val bitmap = Bitmap.createBitmap(
200, (200.toFloat() / page.width * page.height).toInt(), Bitmap.Config.ARGB_8888
)
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY)
page.close()
renderer.close()
// do something with the bitmap, like putting it on an ImageView
binding.imageView.setImageBitmap(bitmap)
page.close()
renderer.close()
}
suspend fun renderSinglePage(filePath: String, width: Int) = withContext(Dispatchers.IO) {
PdfRenderer(
ParcelFileDescriptor.open(
File(filePath), ParcelFileDescriptor.MODE_READ_ONLY
)
).use { renderer ->
renderer.openPage(0).renderAndClose(width)
}
}
fun PdfRenderer.Page.renderAndClose(width: Int) = use {
val bitmap = createBitmap(width)
render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY)
bitmap
}
private fun PdfRenderer.Page.createBitmap(bitmapWidth: Int): Bitmap {
val bitmap = Bitmap.createBitmap(
bitmapWidth, (bitmapWidth.toFloat() / width * height).toInt(), Bitmap.Config.ARGB_8888
)
val canvas = Canvas(bitmap)
canvas.drawColor(Color.WHITE)
canvas.drawBitmap(bitmap, 0f, 0f, null)
return bitmap
}
private fun printZPL() {
var variableData = HashMap<String, String>()
variableData.put("%PRODUCT_NAME%", "Apples")
variableData.put("%MSRP%", "$1.00")
variableData.put("%PCT%", "50")
variableData.put("%FINAL%", "$0.50")
variableData.put("%UPC_CODE%", "12345678")
val passthroughData = """
CT~~CD,~CC^~CT~
^XA~TA000~JSN^LT0^MNW^MTD^PON^PMN^LH0,0^JMA^PR4,4~SD10^JUS^LRN^CI0^XZ
^XA
^MMT
^PW591
^LL0203
^LS0
^FT171,82^A0N,27,26^FH\^FDBananas^FS
^FT222,107^A0N,17,16^FH\^FD$0.99^FS
^FT424,163^A0N,23,24^FB82,1,0,R^FH\^FD10^FS
^FT314,167^A0N,28,28^FH\^FD$0.89^FS
^FT367,107^A0N,17,16^FH\^FD8424245^FS
^FT471,138^A0N,14,14^FH\^FDYou saved:^FS
^FO451,119^GB103,54,2^FS
^FT171,20^A0N,17,16^FH\^FDPrintConnect Template Print Example^FS
^FT171,167^A0N,28,28^FH\^FDFinal Price:^FS
^FT171,51^A0N,17,16^FH\^FDProduct:^FS
^FT171,107^A0N,17,16^FH\^FDMSRP:^FS
^FT508,163^A0N,23,24^FH\^FD%^FS
^FT328,107^A0N,17,16^FH\^FDUPC:^FS
^FO171,119^GB259,0,2^FS
^PQ1,0,1,Y^XZ
""".trimIndent()
var passthroughDataBytes: ByteArray? = null
try {
// Convert template ZPL string to a UTF-8 encoded byte array, which will be sent as an extra with the intent
//templateBytes = templateData.getBytes("UTF-8");
passthroughDataBytes = passthroughData.toByteArray()
} catch (e: UnsupportedEncodingException) {
// Handle exception
}
val intent = Intent()
intent.component = ComponentName(
"com.zebra.printconnect", "com.zebra.printconnect.print.PassthroughService"
)
intent.putExtra(
"com.zebra.printconnect.PrintService.PASSTHROUGH_DATA", passthroughDataBytes
)
intent.putExtra(
"com.zebra.printconnect.PrintService.RESULT_RECEIVER",
buildIPCSafeReceiver(object : ResultReceiver(null) {
override fun onReceiveResult(resultCode: Int, resultData: Bundle?) {
super.onReceiveResult(resultCode, resultData)
if (resultCode == 0) {
// Result code 0 indicates success
} else {
// Handle unsuccessful print
// Error message (null on successful print)
val errorMessage =
resultData?.getString("com.zebra.printconnect.PrintService.ERROR_MESSAGE")
Toast.makeText(context, errorMessage, Toast.LENGTH_LONG).show()
}
}
})
)
requireContext().startService(intent)
}
private fun printAllData() {
var variableData = HashMap<String, String>()
variableData.put("%PRODUCT_NAME%", "Apples")
variableData.put("%MSRP%", "$1.00")
variableData.put("%PCT%", "50")
variableData.put("%FINAL%", "$0.50")
variableData.put("%UPC_CODE%", "12345678")
val templateData = """
CT~~CD,~CC^~CT~
^XA~TA000~JSN^LT0^MNW^MTD^PON^PMN^LH0,0^JMA^PR4,4~SD10^JUS^LRN^CI0^XZ
^XA
^MMT
^PW591
^LL0203
^LS0
^FT171,82^A0N,27,26^FH\^FD%PRODUCT_NAME%^FS
^FT222,107^A0N,17,16^FH\^FD%MSRP%^FS
^FT424,163^A0N,23,24^FB82,1,0,R^FH\^FD%PCT%^FS
^FT314,167^A0N,28,28^FH\^FD%FINAL%^FS
^FT367,107^A0N,17,16^FH\^FD%UPC_CODE%^FS
^FT471,138^A0N,14,14^FH\^FDYou saved:^FS
^FO451,119^GB103,54,2^FS
^FT171,20^A0N,17,16^FH\^FDPrintConnect Template Print Example^FS
^FT171,167^A0N,28,28^FH\^FDFinal Price:^FS
^FT171,51^A0N,17,16^FH\^FDProduct:^FS
^FT171,107^A0N,17,16^FH\^FDMSRP:^FS
^FT508,163^A0N,23,24^FH\^FD%^FS
^FT328,107^A0N,17,16^FH\^FDUPC:^FS
^FO171,119^GB259,0,2^FS
^PQ1,0,1,Y^XZ
""".trimIndent()
var templateBytes: ByteArray? = null
try {
// Convert template ZPL string to a UTF-8 encoded byte array, which will be sent as an extra with the intent
//templateBytes = templateData.getBytes("UTF-8");
templateBytes = templateData.toByteArray()
} catch (ex: UnsupportedEncodingException) {
// Handle exception
ex.toast(requireContext())
}
val intent = Intent()
intent.component = ComponentName(
"com.zebra.printconnect", "com.zebra.printconnect.print.TemplatePrintWithContentService"
)
intent.putExtra(
"com.zebra.printconnect.PrintService.TEMPLATE_DATA", templateBytes
)
intent.putExtra("com.zebra.printconnect.PrintService.VARIABLE_DATA", variableData)
intent.putExtra(
"com.zebra.printconnect.PrintService.RESULT_RECEIVER",
buildIPCSafeReceiver(object : ResultReceiver(null) {
override fun onReceiveResult(resultCode: Int, resultData: Bundle?) {
super.onReceiveResult(resultCode, resultData)
if (resultCode == 0) {
// Result code 0 indicates success
} else {
// Handle unsuccessful print
// Error message (null on successful print)
val errorMessage =
resultData?.getString("com.zebra.printconnect.PrintService.ERROR_MESSAGE")
Toast.makeText(context, errorMessage, Toast.LENGTH_LONG).show()
}
}
})
)
requireContext().startService(intent)
}
private fun printTemplate() {
// Define a hash map of variable data
// Strings used for keys will be replaced by their corresponding values in your template file's ZPL
var variableData = HashMap<String, String>()
variableData.put("%PRODUCT_NAME%", "Bananas")
variableData.put("%MSRP%", "$1.00")
variableData.put("%PCT%", "50")
variableData.put("%FINAL%", "$0.50")
variableData.put("%UPC_CODE%", "12345678")
val intent = Intent()
intent.component = ComponentName(
"com.zebra.printconnect", "com.zebra.printconnect.print.TemplatePrintService"
)
intent.putExtra(
"com.zebra.printconnect.PrintService.TEMPLATE_FILE_NAME", "PriceTagTemplate.zpl"
)
intent.putExtra("com.zebra.printconnect.PrintService.VARIABLE_DATA", variableData)
intent.putExtra(
"com.zebra.printconnect.PrintService.RESULT_RECEIVER",
buildIPCSafeReceiver(object : ResultReceiver(null) {
override fun onReceiveResult(resultCode: Int, resultData: Bundle?) {
super.onReceiveResult(resultCode, resultData)
if (resultCode == 0) {
// Result code 0 indicates success
} else {
// Handle unsuccessful print
// Error message (null on successful print)
val errorMessage =
resultData?.getString("com.zebra.printconnect.PrintService.ERROR_MESSAGE")
Toast.makeText(context, errorMessage, Toast.LENGTH_LONG).show()
}
}
})
)
requireContext().startService(intent)
}
private fun printStatus() {
val intent = Intent()
intent.component = ComponentName(
"com.zebra.printconnect", "com.zebra.printconnect.print.GetPrinterStatusService"
)
intent.putExtra(
"com.zebra.printconnect.PrintService.RESULT_RECEIVER",
buildIPCSafeReceiver(object : ResultReceiver(null) {
override fun onReceiveResult(resultCode: Int, resultData: Bundle?) {
super.onReceiveResult(resultCode, resultData)
if (resultCode == 0) {
// Result code 0 indicates success
val printerStatusMap: java.util.HashMap<out Any, out Any>? =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
resultData!!.getSerializable(
"PrinterStatusMap", HashMap::class.java
)
} else {
@Suppress("DEPRECATED")
resultData!!.getSerializable("PrinterStatusMap") as? HashMap<String, String>
}
Toast.makeText(context, printerStatusMap.toString(), Toast.LENGTH_LONG)
.show()
} else {
// Handle unsuccessful print
// Error message (null on successful print)
val errorMessage =
resultData?.getString("com.zebra.printconnect.PrintService.ERROR_MESSAGE")
Toast.makeText(context, errorMessage, Toast.LENGTH_LONG).show()
}
}
})
)
requireContext().startService(intent)
}
private fun printDisconnect() {
val intent = Intent()
intent.component = ComponentName(
"com.zebra.printconnect", "com.zebra.printconnect.print.UnselectPrinterService"
)
intent.putExtra(
"com.zebra.printconnect.PrintService.RESULT_RECEIVER",
buildIPCSafeReceiver(object : ResultReceiver(null) {
override fun onReceiveResult(resultCode: Int, resultData: Bundle?) {
super.onReceiveResult(resultCode, resultData)
if (resultCode == 0) {
// Result code 0 indicates success
val printerStatusMap =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
resultData!!.getSerializable(
"PrinterStatusMap", HashMap::class.java
)
} else {
@Suppress("DEPRECATED")
resultData!!.getSerializable("PrinterStatusMap") as? HashMap<String, String>
}
Toast.makeText(context, printerStatusMap.toString(), Toast.LENGTH_LONG)
.show()
} else {
// Handle unsuccessful print
// Error message (null on successful print)
val errorMessage =
resultData?.getString("com.zebra.printconnect.PrintService.ERROR_MESSAGE")
Toast.makeText(context, errorMessage, Toast.LENGTH_LONG).show()
}
}
})
)
requireContext().startService(intent)
}
private fun buildIPCSafeReceiver(resultReceiver: ResultReceiver): ResultReceiver? {
val parcel = Parcel.obtain()
resultReceiver.writeToParcel(parcel, 0)
parcel.setDataPosition(0)
val receiverForSending = ResultReceiver.CREATOR.createFromParcel(parcel)
parcel.recycle()
return receiverForSending
}
override fun observeViewModel() {
with(viewModel) {
qrresponse.observe(viewLifecycleOwner, Observer {
if (it.isError) {
ma.messageWithSound(it.errorMessage + " " + itemscaned, true, false)
} else {
customDialog.setTitle(getString(R.string.info)).setDescription(
getString(R.string.operation) + itemscaned + "." + getString(
R.string.answer
) + it.response
).setOkButton(getString(R.string.accept)) {
customDialog.dismiss()
binding.mainToolbar.backButton.performClick()
}.show()
}
})
}
}
}

View File

@ -0,0 +1,95 @@
package es.verdnatura.presentation.view.commom
import android.content.Context
import android.graphics.Color
import android.text.Spannable
import android.text.SpannableString
import android.text.style.ForegroundColorSpan
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.appcompat.widget.SearchView
import androidx.recyclerview.widget.RecyclerView
import es.verdnatura.domain.toast
class SearchableAdapter(
private var listElements: MutableList<NameWithId>,
private var context: Context,
private val listColorElements: List<Int> = listOf(),
private val onItemClick: (NameWithId) -> Unit
) : RecyclerView.Adapter<SearchableAdapter.NameViewHolder>() {
private var listElementsFiltered = listElements.toMutableList()
private var currentQuery: String = ""
private lateinit var searchView: SearchView
inner class NameViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val nameText: TextView = itemView.findViewById(android.R.id.text1)
fun bind(nameWithId: NameWithId, query: String) {
val spannableString = SpannableString(nameWithId.name)
try {
if (query.isNotEmpty()) {
val startIndex = nameWithId.name.indexOf(query, ignoreCase = true)
if (startIndex >= 0) {
val endIndex = startIndex + query.length
spannableString.setSpan(
ForegroundColorSpan(Color.RED),
startIndex,
endIndex,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
}
}
nameText.text = spannableString
itemView.setOnClickListener {
onItemClick(nameWithId)
}
} catch (ex: Exception) {
ex.message?.toast(context)
}
if (listColorElements.isNotEmpty()) {
if (nameWithId.id in listColorElements) {
nameText.setTextColor(Color.BLACK)
} else {
nameText.setTextColor(Color.GRAY)
}
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NameViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(android.R.layout.simple_list_item_1, parent, false)
return NameViewHolder(view)
}
override fun onBindViewHolder(holder: NameViewHolder, position: Int) {
val nameWithId = listElementsFiltered[position]
holder.bind(nameWithId, currentQuery)
}
fun filter(query: String) {
currentQuery = query
listElementsFiltered = if (query.isEmpty()) {
listElements.toMutableList()
} else {
listElements.filter { it.name.contains(query, ignoreCase = true) }
.toMutableList()
}
notifyDataSetChanged()
}
override fun getItemCount(): Int = listElementsFiltered.size
fun updateList(newList: MutableList<NameWithId>) {
listElements = newList
filter("")
}
}
data class NameWithId(
val id: Number,
val name: String
)

View File

@ -0,0 +1,80 @@
package es.verdnatura.presentation.view.commom
import android.content.Context
import android.graphics.Color
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.LinearLayout
import androidx.appcompat.widget.SearchView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import es.verdnatura.R
class SearchableRecyclerView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {
val searchView: SearchView
private val recyclerView: RecyclerView
lateinit var adapter: SearchableAdapter
private var allItems: MutableList<NameWithId> = mutableListOf()
init {
LayoutInflater.from(context).inflate(R.layout.component_searchable_dialog, this, true)
searchView = findViewById(R.id.search_view)
recyclerView = findViewById(R.id.recycler_viewer)
recyclerView.layoutManager = LinearLayoutManager(context)
recyclerView.setBackgroundColor(Color.WHITE)
searchView.setBackgroundColor(Color.WHITE)
searchView.setOnCloseListener {
visibility = View.GONE
true
}
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
return false
}
override fun onQueryTextChange(newText: String?): Boolean {
if (::adapter.isInitialized) adapter.filter(newText ?: "")
return true
}
})
}
fun setAdapter(adapter: SearchableAdapter, items: MutableList<NameWithId>) {
this.adapter = adapter
this.allItems = items
recyclerView.adapter = adapter
adapter.notifyDataSetChanged()
}
fun setOnCloseListener(listener: () -> Boolean) {
searchView.setOnCloseListener { listener() }
}
fun setVisibility() {
searchView.visibility = View.VISIBLE
recyclerView.visibility = View.VISIBLE
}
fun setSearchHint(searchHint: String): SearchableRecyclerView {
searchView.queryHint = searchHint
searchView.setIconifiedByDefault(true)
searchView.isIconified = false
searchView.post {
searchView.requestFocus()
}
return this
}
fun setSearchHintWithoutFocus(searchHint: String): SearchableRecyclerView {
searchView.queryHint = searchHint
return this
}
}

View File

@ -0,0 +1,174 @@
package es.verdnatura.presentation.view.commom.webview
import android.annotation.SuppressLint
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.VelocityTracker
import android.view.View
import android.view.ViewGroup
import android.webkit.WebChromeClient
import android.webkit.WebResourceRequest
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.ImageView
import androidx.activity.OnBackPressedCallback
import androidx.activity.OnBackPressedDispatcher
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import es.verdnatura.R
import es.verdnatura.databinding.FragmentWebBinding
import es.verdnatura.domain.ConstAndValues.FLINGTHRESHOLDVELOCITY
import es.verdnatura.domain.ConstAndValues.FLINGTHRESHOLDVERTICAL
import es.verdnatura.presentation.common.OnBackPressedListener
import es.verdnatura.presentation.common.OnOptionsSelectedListener
import es.verdnatura.presentation.common.ToolBarAdapterTooltip
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.feature.main.activity.MainActivity
import org.json.JSONObject
import kotlin.math.abs
class WebFragment(
var entryPoint: String = ""
) : Fragment(), OnBackPressedListener {
fun getLayoutId(): Int = R.layout.fragment_web
private lateinit var customDialog: CustomDialog
private lateinit var backDispatcher: OnBackPressedDispatcher
private lateinit var binding: FragmentWebBinding
private var velocityTracker: VelocityTracker? = null
companion object {
fun newInstance(entryPoint: String) = WebFragment(entryPoint)
}
fun init() {
customDialog = CustomDialog(requireContext())
setToolbar()
setWeb()
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_web, container, false)
binding.lifecycleOwner = this
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner,
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (!onBackPressedHandled()) {
isEnabled = false
requireActivity().onBackPressedDispatcher
}
}
})
init()
}
@SuppressLint("ClickableViewAccessibility", "javaScriptEnabled")
private fun setWeb() {
binding.webView.apply {
webChromeClient = WebChromeClient()
settings.apply {
javaScriptEnabled = true
domStorageEnabled = true
loadWithOverviewMode = true
useWideViewPort = true
builtInZoomControls = true
displayZoomControls = false
setSupportZoom(true)
allowFileAccess = true
}
setOnTouchListener { _, event ->
when (event.actionMasked) {
MotionEvent.ACTION_DOWN -> {
velocityTracker?.clear()
velocityTracker = velocityTracker ?: VelocityTracker.obtain()
velocityTracker?.addMovement(event)
}
MotionEvent.ACTION_MOVE -> {
velocityTracker?.addMovement(event)
}
MotionEvent.ACTION_UP -> {
velocityTracker?.let { tracker ->
tracker.computeCurrentVelocity(1000) // velocidad en píxeles por segundo
val velocityX = tracker.xVelocity
val velocityY = abs(tracker.yVelocity)
if (velocityX > FLINGTHRESHOLDVELOCITY &&
velocityY < FLINGTHRESHOLDVERTICAL
) {
binding.webView.goBack()
return@setOnTouchListener true
}
}
}
MotionEvent.ACTION_CANCEL -> {
velocityTracker?.recycle()
velocityTracker = null
}
}
false
}
webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(
view: WebView?,
request: WebResourceRequest?
): Boolean {
request?.url?.toString()?.let { loadUrl(it) }
return true
}
}
}
val dataScanned = JSONObject(entryPoint)
binding.webView.loadUrl(dataScanned.get("web").toString())
}
private fun setToolbar() {
binding.mainToolbar.toolbarTitle.text = buildString {
append(getString(R.string.item))
append(JSONObject(entryPoint).get("entryPoint").toString())
}
val listIcons: ArrayList<ImageView> = ArrayList()
binding.mainToolbar.toolbarIcons.adapter =
ToolBarAdapterTooltip(listIcons, object : OnOptionsSelectedListener {
override fun onOptionsItemSelected(item: Drawable) {
}
})
binding.mainToolbar.toolbarIcons.layoutManager =
LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
}
override fun onBackPressedHandled(): Boolean {
if (binding.webView.canGoBack()) {
binding.webView.goBack()
} else {
(context as MainActivity).onMyBackPressed()
}
return true
}
override fun onDestroy() {
super.onDestroy()
velocityTracker?.recycle()
velocityTracker = null
}
}

View File

@ -0,0 +1,180 @@
package es.verdnatura.presentation.view.commom.webview
import android.os.Bundle
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.VelocityTracker
import android.view.View
import android.view.ViewGroup
import android.webkit.WebResourceRequest
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.activity.OnBackPressedCallback
import androidx.activity.OnBackPressedDispatcher
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.ComposeView
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import es.verdnatura.presentation.common.OnBackPressedListener
import es.verdnatura.presentation.view.commom.webview.data.WebViewEvent
import es.verdnatura.presentation.view.commom.webview.data.WebViewScreen
import org.json.JSONObject
import kotlin.math.abs
class WebFragmentCompose(
var entryPoint: String = ""
) : Fragment(), OnBackPressedListener {
private val viewModel: WebViewViewModel by viewModels()
private var velocityTracker: VelocityTracker? = null
private lateinit var backDispatcher: OnBackPressedDispatcher
private var webView: WebView? = null
companion object {
private const val FLING_THRESHOLD_VELOCITY = 2000
private const val FLING_THRESHOLD_VERTICAL = 1000
fun newInstance(entryPoint: String) = WebFragmentCompose(entryPoint)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return ComposeView(requireContext()).apply {
setContent {
val state by viewModel.state.collectAsStateWithLifecycle()
// Recolectar acciones del ViewModel
LaunchedEffect(Unit) {
viewModel.webViewActions.collect { event ->
when (event) {
is WebViewEvent.OnBackGesture -> {
webView?.goBack()
}
// Manejar otros eventos si es necesario
is WebViewEvent.LoadUrl -> println("")
is WebViewEvent.OnPageFinished -> println("")
is WebViewEvent.OnUrlLoading -> println("")
is WebViewEvent.ToggleToolbar -> println("")
is WebViewEvent.UpdateTitle -> println("")
else -> {}
}
}
}
WebViewScreen(
state = state,
onWebViewCreated = { webView ->
this@WebFragmentCompose.webView = webView
setupWebView(webView)
},
)
}
}
}
private fun setupWebView(webView: WebView) {
webView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(
view: WebView?,
request: WebResourceRequest?
): Boolean {
request?.url?.toString()?.let {
viewModel.processEvent(WebViewEvent.OnUrlLoading(it))
}
return true
}
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
viewModel.processEvent(WebViewEvent.OnPageFinished(url ?: ""))
viewModel.processEvent(WebViewEvent.UpdateTitle(webView.title ?: ""))
}
}
webView.setOnTouchListener { _, event ->
handleTouchEvent(event)
}
// Cargar URL inicial si existe
// if (state.value.initialUrl.isNotEmpty()) {
// }
}
private fun handleTouchEvent(event: MotionEvent): Boolean {
when (event.actionMasked) {
MotionEvent.ACTION_DOWN -> {
velocityTracker?.clear()
velocityTracker = velocityTracker ?: VelocityTracker.obtain()
velocityTracker?.addMovement(event)
}
MotionEvent.ACTION_MOVE -> {
velocityTracker?.addMovement(event)
}
MotionEvent.ACTION_UP -> {
velocityTracker?.let { tracker ->
tracker.computeCurrentVelocity(1000)
val velocityX = tracker.xVelocity
val velocityY = abs(tracker.yVelocity)
if (velocityX > FLING_THRESHOLD_VELOCITY &&
velocityY < FLING_THRESHOLD_VERTICAL &&
webView?.canGoBack() == true
) {
viewModel.processEvent(WebViewEvent.OnBackGesture)
return true
}
}
}
MotionEvent.ACTION_CANCEL -> {
velocityTracker?.recycle()
velocityTracker = null
}
}
return false
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner,
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (!onBackPressedHandled()) {
isEnabled = false
requireActivity().onBackPressedDispatcher
}
}
})
val dataScanned = JSONObject(entryPoint)
viewModel.setInitialUrl(dataScanned.get("web").toString())
}
override fun onDestroy() {
super.onDestroy()
velocityTracker?.recycle()
velocityTracker = null
webView = null
}
override fun onBackPressedHandled(): Boolean {
viewModel.processEvent(WebViewEvent.OnBackGesture)
/* if (webView!!.canGoBack()) {
webView!!.goBack()
} else {
(context as MainActivity).onMyBackPressed()
}*/
return true
}
}

View File

@ -0,0 +1,64 @@
package es.verdnatura.presentation.view.commom.webview
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import es.verdnatura.presentation.view.commom.webview.data.WebViewEvent
import es.verdnatura.presentation.view.commom.webview.data.WebViewState
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
class WebViewViewModel : ViewModel() {
private val _state = MutableStateFlow(WebViewState())
val state = _state.asStateFlow()
private val _webViewActions = Channel<WebViewEvent>()
val webViewActions = _webViewActions.receiveAsFlow()
fun processEvent(event: WebViewEvent) {
when (event) {
is WebViewEvent.LoadUrl -> {
_state.update { it.copy(url = event.url, isLoading = true) }
viewModelScope.launch {
_webViewActions.send(event)
}
}
is WebViewEvent.UpdateTitle -> {
_state.update { it.copy(title = event.title) }
}
is WebViewEvent.OnPageFinished -> {
_state.update { it.copy(isLoading = false) }
}
is WebViewEvent.ToggleToolbar -> {
_state.update { it.copy(showToolbar = event.show) }
}
is WebViewEvent.OnBackGesture -> {
viewModelScope.launch {
_webViewActions.send(event)
}
}
is WebViewEvent.OnUrlLoading -> {
processEvent(WebViewEvent.LoadUrl(event.url))
}
}
}
fun setInitialUrl(webURL: String) {
try {
println("webURL $webURL")
_state.update { it.copy(initialUrl = webURL) }
processEvent(WebViewEvent.LoadUrl("https://salix.verdnatura.es"))
} catch (e: Exception) {
// Manejar error
}
}
}

Some files were not shown because too many files have changed in this diff Show More