Compare commits

..

74 Commits
master ... dev

Author SHA1 Message Date
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
134 changed files with 9939 additions and 2075 deletions

View File

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

View File

@ -4,7 +4,7 @@
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="GRADLE" />
<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" />

View File

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

View File

@ -280,7 +280,7 @@
<option name="myDefaultNotNull" value="androidx.annotation.NonNull" />
<option name="myNullables">
<value>
<list size="15">
<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" />
@ -296,12 +296,13 @@
<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="14">
<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" />
@ -316,11 +317,12 @@
<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_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<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">

View File

@ -40,6 +40,16 @@
</config>
</shared>
<layouts>
<layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_click.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/drawable/ic_logout.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/activity_login.xml">
<config>
<theme>@style/AppTheme</theme>
@ -50,11 +60,21 @@
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/activity_restaurant_view.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/activity_sign.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/component_custom_dialog.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/component_custom_edit_dialog.xml">
<config>
<theme>@style/AppTheme</theme>
@ -75,11 +95,21 @@
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/component_custom_hour.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/component_custom_list_dialog.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/component_custom_three_dialog.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/component_custom_two_dialog.xml">
<config>
<theme>@style/AppTheme</theme>
@ -90,6 +120,16 @@
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/component_searchable_dialog.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/component_searchable_dialog_alert.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_ajustes.xml">
<config>
<theme>@style/AppTheme</theme>
@ -125,6 +165,11 @@
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_expedition_loadunload_delivery.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_expedition_log_delivery.xml">
<config>
<theme>@style/AppTheme</theme>
@ -155,6 +200,11 @@
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_inventary.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_item_card.xml">
<config>
<theme>@style/AppTheme</theme>
@ -170,6 +220,11 @@
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_packaging.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_packaging_count.xml">
<config>
<theme>@style/AppTheme</theme>
@ -195,11 +250,21 @@
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_route_config.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_sacador.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_salary_complement.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_stopmap_truck_list.xml">
<config>
<theme>@style/AppTheme</theme>
@ -220,6 +285,16 @@
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/fragment_workermistake.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/item_ajustes_row.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/item_article_row_fragment.xml">
<config>
<theme>@style/AppTheme</theme>
@ -230,6 +305,11 @@
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/item_expedition_loadunload_row.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/item_expedition_summary_row.xml">
<config>
<state>Landscape</state>
@ -286,6 +366,11 @@
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/item_placement_row.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/item_roadmap_truck_row.xml">
<config>
<theme>@style/AppTheme</theme>
@ -296,6 +381,11 @@
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/item_salary_complement_row.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/item_shelvinglog_row.xml">
<config>
<theme>@style/AppTheme</theme>
@ -321,16 +411,46 @@
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/item_ubication_row_6869.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/item_ubication_row_new.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/item_workermistake_row.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/sale_row_fragment.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/searchable_dialog.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/layout/toolbar_fragment.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$PROJECT_DIR$/app/src/main/res/navigation/nav_graph.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
<layout url="file://$USER_HOME$/AppData/Local/Android/Sdk/platforms/android-35/data/res/layout/simple_list_item_1.xml">
<config>
<theme>@style/AppTheme</theme>
</config>
</layout>
</layouts>
</component>
<component name="AndroidLogFilters">
@ -373,103 +493,12 @@
</select>
</component>
<component name="ChangeListManager">
<list default="true" id="fa688d1c-dbee-4864-9e33-4d84ef9afca8" name="Default Changelist" comment="feat: refactorResponse PasillerosItem refs #7827">
<change beforePath="$PROJECT_DIR$/.idea/appInsightsSettings.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/appInsightsSettings.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/build.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/app/build.gradle" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/di/viewModelModule.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/di/viewModelModule.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/domain/SalixService.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/domain/SalixService.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/common/GeneralAdapter.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/common/GeneralAdapter.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/common/UICallbacks.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/common/UICallbacks.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/common/UtilFunctions.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/common/UtilFunctions.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/adapter/ItemProposalAdapter.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/adapter/ItemProposalAdapter.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardViewModel.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/buffer/fragment/BufferLoadFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/buffer/fragment/BufferLoadFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/buffer/fragment/adapter/BufferAdapter.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/buffer/fragment/adapter/BufferAdapter.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/buscaritem/adapter/LocationAdapter.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/buscaritem/adapter/LocationAdapter.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/category/ChangeCategoryFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/category/ChangeCategoryFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/category/ChangeCategoryViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/category/ChangeCategoryViewModel.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/claim/fragment/reubication/adapter/ReubicatorAdapter.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/claim/fragment/reubication/adapter/ReubicatorAdapter.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/claim/fragment/reubication/adapter/ReubicatorPlacementAdapter.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/claim/fragment/reubication/adapter/ReubicatorPlacementAdapter.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/claim/fragment/ubication/ClaimUbicationFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/claim/fragment/ubication/ClaimUbicationFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/adapter/PlacementAdapter.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/adapter/PlacementAdapter.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/adapter/SaleAdapter.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/adapter/SaleAdapter.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/adapter/SaleAdapterNew.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/adapter/SaleAdapterNew.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPicker.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPicker.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPickerNew.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPickerNew.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPickerPreviousNew.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPickerPreviousNew.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPreChecker.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPreChecker.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPreCheckerNew.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPreCheckerNew.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionViewModel.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/controlvehiculo/fragment/ControlVehiculoFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/controlvehiculo/fragment/ControlVehiculoFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/controlvehiculo/fragment/ControlVehiculoViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/controlvehiculo/fragment/ControlVehiculoViewModel.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/activity/SignedActivity.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/activity/SignedActivity.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/RoutesFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/RoutesFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/SummaryFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/SummaryFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/TicketsFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/TicketsFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/viewmodels/DeliveryViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/viewmodels/DeliveryViewModel.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/diadeventa/adapter/DayOfSaleAdapter.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/diadeventa/adapter/DayOfSaleAdapter.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/historicoarticulo/fragment/HistoricoArticuloFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/historicoarticulo/fragment/HistoricoArticuloFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/historicoshelving/adapter/ItemShelvingLogAdapter.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/historicoshelving/adapter/ItemShelvingLogAdapter.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/historicoshelvinglog/fragment/shelvingLogFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/historicoshelvinglog/fragment/shelvingLogFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/adapter/InventoryAdapter.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/adapter/InventoryAdapter.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/adapter/InventoryParkingAdapter.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/adapter/InventoryParkingAdapter.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/InventaryFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/InventaryFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/InventaryViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/InventaryViewModel.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/login/adapter/WorkFormAdapter.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/login/adapter/WorkFormAdapter.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/login/fragment/LoginFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/login/fragment/LoginFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/login/fragment/LoginViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/login/fragment/LoginViewModel.kt" afterDir="false" />
<list default="true" id="fa688d1c-dbee-4864-9e33-4d84ef9afca8" name="Default Changelist" comment="feat: refs#6845 userInterface">
<change afterPath="$PROJECT_DIR$/CHANGELOG.md" afterDir="false" />
<change afterPath="$PROJECT_DIR$/changeLog.sh" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/app/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/main/activity/MainActivity.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/main/activity/MainActivity.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/packaging/adapter/ItemSupplierAdapter.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/packaging/adapter/ItemSupplierAdapter.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/packaging/adapter/ListImageAdapter.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/packaging/adapter/ListImageAdapter.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/ObservFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/ObservFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/PackagingCountFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/PackagingCountFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/SupplierFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/SupplierFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionPalletDetailFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionPalletDetailFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionPalletDetailViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionPalletDetailViewModel.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionPalletFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionPalletFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionPalletViewModel.kt" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionPreparedStateFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionPreparedStateFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionScanFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionScanFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionScanSorterFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionScanSorterFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionScanSorterViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionScanSorterViewModel.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionScanViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionScanViewModel.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionTruckListFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionTruckListFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionTruckListViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionTruckListViewModel.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/model/ItemExpeditionTruckVO.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/model/ItemExpeditionTruckVO.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/model/ItemPalletVO.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/model/ItemPalletVO.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/model/ItemScanVO.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/model/ItemScanVO.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/parking/fragment/ParkingFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/parking/fragment/ParkingFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/parking/fragment/ParkingViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/parking/fragment/ParkingViewModel.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/photos/fragment/PhotosFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/photos/fragment/PhotosFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/precontrol/PreControladorFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/precontrol/PreControladorFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/precontrol/PreControladorViewModel.kt" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/presacador/adapter/PreSacadorAdapter.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/presacador/adapter/PreSacadorAdapter.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/presacador/fragment/EndSacadorFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/presacador/fragment/EndSacadorFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/presacador/fragment/PreSacadorViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/presacador/fragment/PreSacadorViewModel.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/presacador/fragment/SectorCollectionReserveFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/presacador/fragment/SectorCollectionReserveFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/qr/QrFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/qr/QrFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/roadmap/fragment/StopMapListFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/roadmap/fragment/StopMapListFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/sacador/fragment/SacadorViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/sacador/fragment/SacadorViewModel.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/sacador/fragment/showticket/ShowTicketFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/sacador/fragment/showticket/ShowTicketFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/sacador/model/TicketItemVO.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/sacador/model/TicketItemVO.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/adapter/UbicadorAdapter.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/adapter/UbicadorAdapter.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/adapter/UbicadorAdapterNew.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/adapter/UbicadorAdapterNew.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/AutomaticAddItemFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/AutomaticAddItemFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/AutomaticAddItemViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/AutomaticAddItemViewModel.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/UbicadorFragmentNew.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/UbicadorFragmentNew.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/UbicadorViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/UbicadorViewModel.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/workermistake/fragment/PackingMistakeFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/workermistake/fragment/PackingMistakeFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/workermistake/fragment/WorkermistakeFragment.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/workermistake/fragment/WorkermistakeFragment.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/workermistake/model/mistakeWorkerType.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/workermistake/model/mistakeWorkerType.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/res/values-es/strings.xml" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/res/values-es/strings.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/res/values-fr/strings.xml" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/res/values-fr/strings.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/res/values-pt/strings.xml" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/res/values-pt/strings.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/res/values/strings.xml" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/res/values/strings.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/model/ItemUbicadorVO.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/model/ItemUbicadorVO.kt" afterDir="false" />
</list>
<list id="7b98f93d-6980-4bf1-8e61-c7afd10e56f2" name="Change_category" comment="Change_category" />
<option name="SHOW_DIALOG" value="false" />
@ -484,7 +513,7 @@
<component name="CodeInsightWorkspaceSettings">
<option name="optimizeImportsOnTheFly" value="true" />
</component>
<component name="ExecutionTargetManager" SELECTED_TARGET="device_and_snapshot_combo_box_target[21114523025303]" />
<component name="ExecutionTargetManager" SELECTED_TARGET="device_and_snapshot_combo_box_target[DeviceId(pluginId=LocalEmulator, isTemplate=false, identifier=path=C:\Users\sergiodt\.android\avd\Pixel_7a_API_30.avd)]" />
<component name="ExportToHTMLSettings">
<option name="OPEN_IN_BROWSER" value="true" />
<option name="OUTPUT_DIRECTORY" value="C:\Program Files\Android\Android Studio\inspections" />
@ -574,7 +603,7 @@
</option>
<option name="RECENT_BRANCH_BY_REPOSITORY">
<map>
<entry key="$PROJECT_DIR$" value="dev" />
<entry key="$PROJECT_DIR$" value="dev_6078" />
</map>
</option>
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
@ -635,63 +664,60 @@
<option name="showLibraryContents" value="true" />
<option name="showMembers" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"Android App.app.executor": "Run",
"ApkExportedModule": "Gestor_Almacén.app",
"DEBUGGABLE_DEVICE": "zebra_technologies-tc21-21114523025303",
"DEBUGGABLE_PROCESS": "es.verdnatura.sfusion",
"DEBUGGER_ID": "Auto",
"ExportApk.ApkPathForGestor_Almacén.app": "C:\\Users\\sergiodt\\AndroidStudioProjects\\vn-warehouseManager\\app",
"Gradle.vn-warehouseManager [clean].executor": "Run",
"Gradle.vn-warehouseManager.executor": "Run",
"KotlinFunctionFindUsagesOptions.isSearchForTextOccurrences": "true",
"PROJECT_TRUSTED_KEY": "true",
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"RunOnceActivity.cidr.known.project.marker": "true",
"RunOnceActivity.readMode.enableVisualFormatting": "true",
"SHARE_PROJECT_CONFIGURATION_FILES": "true",
"SHOW_ALL_PROCESSES": "false",
"ScreenRecorder.SavePath": "C:\\Users\\sergiodt",
"android-custom-viewC:/Users/sergiodt/.gradle/caches/modules-2/files-2.1/androidx.recyclerview/recyclerview/1.2.1/f0f93e67af3f7417bdd560d5142f6dec4fe629c3/recyclerview-1.2.1-sources.jar!/androidx/recyclerview/widget/RecyclerView.java_SELECTED": "RecyclerView",
"android-custom-viewC:/Users/sergiodt/AppData/Local/Android/Sdk/sources/android-29/android/widget/TextView.java_SELECTED": "TextView",
"android-custom-viewC:/Users/sergiodt/AppData/Local/Android/Sdk/sources/android-33/android/view/View.java_SELECTED": "View",
"android-custom-viewC:/Users/sergiodt/AppData/Local/Android/Sdk/sources/android-34/android/view/View.java_SELECTED": "View",
"android-custom-viewC:/Users/sergiodt/AppData/Local/Android/Sdk/sources/android-34/android/widget/CompoundButton.java_SELECTED": "CompoundButton",
"android-custom-viewC:/Users/sergiodt/AppData/Local/Android/Sdk/sources/android-34/android/widget/TextView.java_SELECTED": "TextView",
"cf.first.check.clang-format": "false",
"cidr.known.project.marker": "true",
"com.developerphil.adbidea.selecteddevices": "G65TY9DQN7X4BIE6",
"com.google.services.firebase.aqiPopupShown": "true",
"git-widget-placeholder": "dev__6078",
"ignore.virus.scanning.warn.message": "true",
"kotlin-language-version-configured": "true",
"last_directory_selection": "C:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable",
"last_opened_file_path": "C:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout",
"project.structure.last.edited": "Modules",
"project.structure.proportion": "0.17",
"project.structure.side.proportion": "0.2",
"rearrange.code.on.save": "true",
"run.code.analysis.last.selected.profile": "pProject Default",
"settings.editor.selected.configurable": "actions.on.save"
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;Android App.app.executor&quot;: &quot;Run&quot;,
&quot;ApkExportedModule&quot;: &quot;Gestor_Almacén.app&quot;,
&quot;DEBUGGABLE_DEVICE&quot;: &quot;zebra_technologies-tc21-21114523025303&quot;,
&quot;DEBUGGABLE_PROCESS&quot;: &quot;es.verdnatura.sfusion&quot;,
&quot;DEBUGGER_ID&quot;: &quot;Auto&quot;,
&quot;ExportApk.ApkPathForGestor_Almacén.app&quot;: &quot;C:\\Users\\sergiodt\\AndroidStudioProjects\\vn-warehouseManager\\app&quot;,
&quot;Gradle.vn-warehouseManager [clean].executor&quot;: &quot;Run&quot;,
&quot;Gradle.vn-warehouseManager.executor&quot;: &quot;Run&quot;,
&quot;KotlinFunctionFindUsagesOptions.isSearchForTextOccurrences&quot;: &quot;true&quot;,
&quot;PROJECT_TRUSTED_KEY&quot;: &quot;true&quot;,
&quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.cidr.known.project.marker&quot;: &quot;true&quot;,
&quot;RunOnceActivity.readMode.enableVisualFormatting&quot;: &quot;true&quot;,
&quot;SHARE_PROJECT_CONFIGURATION_FILES&quot;: &quot;true&quot;,
&quot;SHOW_ALL_PROCESSES&quot;: &quot;false&quot;,
&quot;ScreenRecorder.SavePath&quot;: &quot;C:\\Users\\sergiodt&quot;,
&quot;android-custom-viewC:/Users/sergiodt/.gradle/caches/modules-2/files-2.1/androidx.recyclerview/recyclerview/1.2.1/f0f93e67af3f7417bdd560d5142f6dec4fe629c3/recyclerview-1.2.1-sources.jar!/androidx/recyclerview/widget/RecyclerView.java_SELECTED&quot;: &quot;RecyclerView&quot;,
&quot;android-custom-viewC:/Users/sergiodt/AppData/Local/Android/Sdk/sources/android-29/android/widget/TextView.java_SELECTED&quot;: &quot;TextView&quot;,
&quot;android-custom-viewC:/Users/sergiodt/AppData/Local/Android/Sdk/sources/android-33/android/view/View.java_SELECTED&quot;: &quot;View&quot;,
&quot;android-custom-viewC:/Users/sergiodt/AppData/Local/Android/Sdk/sources/android-34/android/view/View.java_SELECTED&quot;: &quot;View&quot;,
&quot;android-custom-viewC:/Users/sergiodt/AppData/Local/Android/Sdk/sources/android-34/android/widget/CompoundButton.java_SELECTED&quot;: &quot;CompoundButton&quot;,
&quot;android-custom-viewC:/Users/sergiodt/AppData/Local/Android/Sdk/sources/android-34/android/widget/TextView.java_SELECTED&quot;: &quot;TextView&quot;,
&quot;cf.first.check.clang-format&quot;: &quot;false&quot;,
&quot;cidr.known.project.marker&quot;: &quot;true&quot;,
&quot;com.developerphil.adbidea.selecteddevices&quot;: &quot;G65TY9DQN7X4BIE6&quot;,
&quot;com.google.services.firebase.aqiPopupShown&quot;: &quot;true&quot;,
&quot;git-widget-placeholder&quot;: &quot;dev&quot;,
&quot;ignore.virus.scanning.warn.message&quot;: &quot;true&quot;,
&quot;kotlin-language-version-configured&quot;: &quot;true&quot;,
&quot;last_directory_selection&quot;: &quot;C:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable&quot;,
&quot;last_opened_file_path&quot;: &quot;C:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/layout&quot;,
&quot;project.structure.last.edited&quot;: &quot;Modules&quot;,
&quot;project.structure.proportion&quot;: &quot;0.17&quot;,
&quot;project.structure.side.proportion&quot;: &quot;0.2&quot;,
&quot;rearrange.code.on.save&quot;: &quot;true&quot;,
&quot;run.code.analysis.last.selected.profile&quot;: &quot;pProject Default&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;preferences.pluginManager&quot;
},
"keyToStringList": {
"ExportApk.BuildVariants": [
"betaRelease"
&quot;keyToStringList&quot;: {
&quot;ExportApk.BuildVariants&quot;: [
&quot;generalRelease&quot;
],
"com.android.tools.idea.sqlite.queryhistory": [
"select * from expedition where routeFk=182933;",
"select * from expedition;",
"select * from expeditionPending;",
"select * from expedition where id = 7753995;\n\n",
"\nselect * from expedition where id = 7753995;"
],
"kotlin-gradle-user-dirs": [
"C:\\Users\\sergiodt\\.gradle"
&quot;com.android.tools.idea.sqlite.queryhistory&quot;: [
&quot;select * from expedition where routeFk=182933;&quot;,
&quot;select * from expedition;&quot;,
&quot;select * from expeditionPending;&quot;,
&quot;select * from expedition where id = 7753995;\n\n&quot;,
&quot;\nselect * from expedition where id = 7753995;&quot;
]
}
}]]></component>
}</component>
<component name="PsdUISettings">
<option name="MODULE_TAB" value="Properties" />
<option name="LAST_EDITED_SIGNING_CONFIG" value="debug" />
@ -700,17 +726,17 @@
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="C:\Users\sergiodt\AndroidStudioProjects\vn-warehouseManager\app\src\main\res\layout" />
<recent name="C:\Users\sergiodt\AndroidStudioProjects\vn-warehouseManager\app" />
<recent name="C:\Users\sergiodt\AndroidStudioProjects\vn-warehouseManager\app\src\main\res\drawable" />
<recent name="C:\Users\sergiodt\AndroidStudioProjects\vn-warehouseManager\app\src\main\java\es\verdnatura\domain" />
<recent name="C:\Users\sergiodt\AndroidStudioProjects\vn-warehouseManager\app\src\main\res\xml" />
<recent name="C:\Users\sergiodt\AndroidStudioProjects\vn-warehouseManager\app\src\main\res\raw" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="C:\Users\sergiodt\AndroidStudioProjects\vn-warehouseManager\gradle" />
<recent name="C:\Users\sergiodt\AndroidStudioProjects\vn-warehouseManager\app\src\main\res\drawable" />
<recent name="C:\Users\sergiodt\AndroidStudioProjects\vn-warehouseManager\app\src\main\java\es\verdnatura\domain\userCases" />
<recent name="C:\Users\sergiodt\AndroidStudioProjects\vn-warehouseManager\app\src\main\res\drawable-v24" />
<recent name="C:\Users\sergiodt\AndroidStudioProjects\vn-warehouseManager\app\src\main\res\raw" />
<recent name="C:\Users\sergiodt\AndroidStudioProjects\vn-warehouseManager\app\src\main\res\assets" />
</key>
<key name="MoveKotlinTopLevelDeclarationsDialog.RECENTS_KEY">
<recent name="es.verdnatura.presentation.view.feature.claim.fragment.ubication" />
@ -720,11 +746,11 @@
<recent name="es.verdnatura.presentation.view.feature.historicoshelving.fragment" />
</key>
<key name="CopyKotlinDeclarationDialog.RECENTS_KEY">
<recent name="es.verdnatura.presentation.view.feature.paletizador.fragment" />
<recent name="es.verdnatura.presentation.view.feature.parking.fragment" />
<recent name="es.verdnatura.presentation.view.feature.collection.fragment" />
<recent name="es.verdnatura.domain" />
<recent name="es.verdnatura.presentation.view.feature.truck.adapter" />
<recent name="es.verdnatura.presentation.view.feature.ubicador.adapter" />
<recent name="es.verdnatura.presentation.view.feature.ubicador.fragment" />
<recent name="es.verdnatura.presentation.view.feature.delivery.adapters" />
<recent name="es.verdnatura.presentation.view.feature.delivery.fragments" />
<recent name="es.verdnatura.domain.userCases" />
</key>
<key name="CopyClassDialog.RECENTS_KEY">
<recent name="es.verdnatura.presentation.view.feature.delivery.activity" />
@ -756,9 +782,10 @@
<option name="DYNAMIC_FEATURES_DISABLED_LIST" value="" />
<option name="ACTIVITY_EXTRA_FLAGS" value="" />
<option name="MODE" value="default_activity" />
<option name="RESTORE_ENABLED" value="false" />
<option name="RESTORE_FILE" value="" />
<option name="CLEAR_LOGCAT" value="false" />
<option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
<option name="INSPECTION_WITHOUT_ACTIVITY_RESTART" value="false" />
<option name="TARGET_SELECTION_MODE" value="DEVICE_AND_SNAPSHOT_COMBO_BOX" />
<option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
<option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
@ -867,12 +894,22 @@
</configuration>
<recent_temporary>
<list>
<item itemvalue="Gradle.vn-warehouseManager [clean]" />
<item itemvalue="Gradle.vn-warehouseManager" />
<item itemvalue="Gradle.vn-warehouseManager [clean]" />
<item itemvalue="Gradle.vn-warehouseManager" />
<item itemvalue="Gradle.vn-warehouseManager [clean]" />
</list>
</recent_temporary>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="StandaloneScriptsStorage">
<option name="files">
<set>
<option value="$PROJECT_DIR$/build.gradle.kts" />
</set>
</option>
</component>
<component name="SvnConfiguration">
<configuration>C:\Users\sergiodt\AppData\Roaming\Subversion</configuration>
</component>
@ -1228,7 +1265,7 @@
<option name="project" value="LOCAL" />
<updated>1709725795643</updated>
</task>
<option name="localTasksCounter" value="338" />
<option name="localTasksCounter" value="373" />
<servers />
</component>
<component name="Vcs.Log.History.Properties">
@ -1306,7 +1343,6 @@
<entry key="MAIN">
<value>
<State>
<option name="BEK_SORT_TYPE" value="1" />
<option name="COLUMN_ID_WIDTH">
<map>
<entry key="Table.Default.Author.ColumnIdWidth" value="115" />
@ -1322,8 +1358,21 @@
</list>
</value>
</entry>
<entry key="text">
<value>
<list>
<option value="itemShelving" />
</list>
</value>
</entry>
</map>
</option>
<option name="GRAPH_OPTIONS">
<list>
<option value="Base" />
<option value="Standard" />
</list>
</option>
</State>
</value>
</entry>
@ -1356,24 +1405,6 @@
</component>
<component name="VcsManagerConfiguration">
<option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
<MESSAGE value="feat refactor Ubicador #refs 6413" />
<MESSAGE value="feat notesDelivery #refs 6921" />
<MESSAGE value="feat lilium" />
<MESSAGE value="feat bugs" />
<MESSAGE value="feat ticketQr #refs 6602" />
<MESSAGE value="feat itemToBarCode refs #7614" />
<MESSAGE value="feat boxPicking #refs 7357" />
<MESSAGE value="feat itemShelvingLog #refs 7597" />
<MESSAGE value="feat roadMap #refs 7195" />
<MESSAGE value="feat inventory #refs 7023" />
<MESSAGE value="feat version24.28" />
<MESSAGE value="feat Ticketobservation refs #7541" />
<MESSAGE value="feat isF11Allowed refs #6435" />
<MESSAGE value="feat boxPickingCheck refs #7751" />
<MESSAGE value="feat barCode in ItemShelvingLog refs #7739" />
<MESSAGE value="feat Rename refs #7763" />
<MESSAGE value="feat reservas #refs 6861" />
<MESSAGE value="feat issues refs #7636" />
<MESSAGE value="feat getAddress #refs 7622" />
<MESSAGE value="feat claimObservation refs #7541" />
<MESSAGE value="feat reservas refs #6861" />
@ -1381,32 +1412,50 @@
<MESSAGE value="feat itemGetBalance refs #6769" />
<MESSAGE value="feat: boxPickingPrepared refs #7855" />
<MESSAGE value="feat: refactorResponse PasillerosItem refs #7827" />
<option name="LAST_COMMIT_MESSAGE" value="feat: refactorResponse PasillerosItem refs #7827" />
<MESSAGE value="version 24.40" />
<MESSAGE value="feat: refs #8020 controlVehiculos" />
<MESSAGE value="feat: refs #6861 reservas" />
<MESSAGE value="feat: refs #8175 crashlyticsAndUpdate" />
<MESSAGE value="feat: refs #7266 printItem" />
<MESSAGE value="feat: refs #6845 userIterface" />
<MESSAGE value="feat: refs #8150 moveExpeditions" />
<MESSAGE value="feat: refs #8099 addSalarySupplement" />
<MESSAGE value="feat: refs #8082 ticketPickup" />
<MESSAGE value="feat: refs #8176 refactorSearchDialog" />
<MESSAGE value="feat: refs #8182 zoneClickable" />
<MESSAGE value="feat: refs#8213 reservas" />
<MESSAGE value="feat: refs #8022 kotlin versionCatalog" />
<MESSAGE value="feat: refs #8085 restaurantActivity" />
<MESSAGE value="feat: refs #5443 collectionFragmentChecker" />
<MESSAGE value="feat: refs #7922 scanOrder" />
<MESSAGE value="feat: refs #7920 itemShelvingGet" />
<MESSAGE value="feat: refs#6845 userInterface" />
<option name="LAST_COMMIT_MESSAGE" value="feat: refs#6845 userInterface" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<breakpoints>
<line-breakpoint enabled="true" type="kotlin-function">
<url>file://$PROJECT_DIR$/app/src/main/java/es/verdnatura/domain/SalixCallback.kt</url>
<line>72</line>
<properties class="es.verdnatura.domain.SalixCallback" method="onError">
<line>76</line>
<properties class="es.verdnatura.domain.SalixCallback" method="errorSalixMessage">
<option name="WATCH_EXIT" value="false" />
</properties>
<option name="timeStamp" value="11" />
</line-breakpoint>
<line-breakpoint enabled="true" type="kotlin-line">
<url>file://$PROJECT_DIR$/app/src/main/java/es/verdnatura/domain/SalixCallback.kt</url>
<line>82</line>
<line>86</line>
<option name="timeStamp" value="12" />
</line-breakpoint>
<line-breakpoint enabled="true" type="kotlin-line">
<url>file://$PROJECT_DIR$/app/src/main/java/es/verdnatura/domain/SalixCallback.kt</url>
<line>81</line>
<line>85</line>
<option name="timeStamp" value="13" />
</line-breakpoint>
<line-breakpoint enabled="true" type="kotlin-line">
<url>file://$PROJECT_DIR$/app/src/main/java/es/verdnatura/domain/SalixCallback.kt</url>
<line>83</line>
<line>87</line>
<option name="timeStamp" value="14" />
</line-breakpoint>
</breakpoints>

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

@ -1,169 +0,0 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics'
apply plugin: 'com.google.devtools.ksp'
android {
namespace = "es.verdnatura"
compileSdk 34
defaultConfig {
applicationId "es.verdnatura"
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 {
/*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_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'])
//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.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'
//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.1.0'
//Fragments
implementation("androidx.fragment:fragment-ktx:1.8.2")
// Architecture components
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
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"
// 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"
ksp("com.github.bumptech.glide:ksp:$glide")
// Add the Firebase Crashlytics SDK.
implementation 'com.google.firebase:firebase-analytics:22.0.2'
//search
implementation 'com.github.mirrajabi:search-dialog:1.1'
//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")*/
}

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

@ -0,0 +1,147 @@
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")
}
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 = 374
versionName = "24.51"
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") {}
}
buildFeatures {
viewBinding = true
//compose = true
/*kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.4.3"
}
*/
dataBinding = 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)
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)
// Compose
//implementation(libs.androidx.compose.bom)
/* 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") */
}
}

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

View File

@ -44,7 +44,6 @@ class MobileApplication : Application(), InteceptorListener {
signListener = listener
}
// lateinit var silex: VerdnaturaService
lateinit var salix: SalixService
var userId: Int? = null
var userName: String? = null

View File

@ -124,7 +124,7 @@ class DataStoreLocal(var mobileApplication: MobileApplication) {
SECTORFKDEFAULT
}
)
if (operator.sector?.isOnReservationMode != null) {
editDataStoreKey(
SECTORISONRESERVATIONMODE,
@ -178,7 +178,10 @@ class DataStoreLocal(var mobileApplication: MobileApplication) {
editDataStoreKey(
RESERVATIONMODE, operator.isOnReservationMode
)
editDataStoreKey(
ITEMPACKING,
operator.itemPackingTypeFk
)
}
suspend fun isPreferenceExists(key: String): Boolean {

View File

@ -1,7 +1,16 @@
package es.verdnatura.db
import android.content.Context
import androidx.room.*
import androidx.room.Dao
import androidx.room.Database
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
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
@ -68,6 +77,9 @@ interface ExpedicionDao {
@Query("DELETE FROM expeditionPending WHERE code = :codeState")
suspend fun getDeleteByState(codeState: String)
@Query("DELETE FROM expeditionPending")
suspend fun getDeleteAllState()
}
@Dao
@ -101,8 +113,8 @@ interface RoutesDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertLoaded(routeLoaded: RouteLoaded)
@Query("DELETE FROM routes WHERE created != :today")
@Query("DELETE FROM routes WHERE dated != :today")
suspend fun deleteLoaded(today: String)
}

View File

@ -24,6 +24,7 @@ object ConstAndValues {
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"
@ -44,6 +45,7 @@ object ConstAndValues {
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"

View File

@ -2,11 +2,16 @@ package es.verdnatura.domain
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.GradientDrawable
import android.os.Build
import android.text.Html
import android.view.Gravity
import android.view.LayoutInflater
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.annotation.RequiresApi
import es.verdnatura.R
import java.text.SimpleDateFormat
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
@ -14,7 +19,15 @@ import java.util.Date
import java.util.Locale
fun List<Any?>.formatWithQuotes(): String {
return "[" + joinToString(", ") { if (it is String) "\"$it\"" else it.toString() } + "]"
return "[" + joinToString(", ") {
when {
it is String && (it.trim().startsWith("{") && it.trim()
.endsWith("}")) -> "\"$it\""
it is String -> "\"$it\""
else -> it.toString()
}
} + "]"
}
@RequiresApi(Build.VERSION_CODES.N)
@ -33,6 +46,28 @@ fun Any.toast(
return toast.apply { show() }
}
fun Context.showToastCenterWithBackground(textToShow: String) {
val inflater = LayoutInflater.from(this)
val layout = inflater.inflate(R.layout.ticket_toast_layout, null)
val text = layout.findViewById<TextView>(R.id.toast_text)
text.text = "$textToShow"
text.setTextColor(this.getColor(R.color.verdnatura_orange_salix))
text.textSize = 18f
val background = GradientDrawable().apply {
setColor(Color.parseColor("#000000"))
cornerRadius = 16f
}
layout.background = background
Toast(this).apply {
duration = Toast.LENGTH_LONG
view = layout
setGravity(Gravity.CENTER, 0, 0)
show()
}
}
fun <T : Any> T?.notNull(f: (it: T) -> Unit) {
if (this != null) f(this)
}
@ -45,6 +80,7 @@ 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)

View File

@ -5,6 +5,7 @@ import es.verdnatura.presentation.common.ExpeditionPrintOut
import es.verdnatura.presentation.common.ItemBarCodeSalix
import es.verdnatura.presentation.common.ItemShelving
import es.verdnatura.presentation.common.PackingSiteSalix
import es.verdnatura.presentation.common.PickupResponse
import es.verdnatura.presentation.common.SaleTrackingSalix
import es.verdnatura.presentation.common.TicketState
import es.verdnatura.presentation.view.feature.ajustes.model.Printers
@ -16,6 +17,7 @@ import es.verdnatura.presentation.view.feature.articulo.model.ItemDetails
import es.verdnatura.presentation.view.feature.articulo.model.ItemPackingType
import es.verdnatura.presentation.view.feature.articulo.model.ItemProposal
import es.verdnatura.presentation.view.feature.buscaritem.model.ItemLocationVO
import es.verdnatura.presentation.view.feature.calidad.model.Buyer
import es.verdnatura.presentation.view.feature.calidad.model.BuyerVO
import es.verdnatura.presentation.view.feature.claim.fragment.reubication.model.Reubication
import es.verdnatura.presentation.view.feature.collection.SalixSaleQuantity
@ -25,6 +27,10 @@ import es.verdnatura.presentation.view.feature.delivery.model.DeliveryInfo
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoLoadUnload
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoLog
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoSummary
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionWithTicket
import es.verdnatura.presentation.view.feature.delivery.model.RouteAction
import es.verdnatura.presentation.view.feature.delivery.model.RouteComplement
import es.verdnatura.presentation.view.feature.delivery.model.RouteComplementAdd
import es.verdnatura.presentation.view.feature.delivery.model.RouteDelivery
import es.verdnatura.presentation.view.feature.delivery.model.RouteInfo
import es.verdnatura.presentation.view.feature.delivery.model.TicketObservation
@ -39,6 +45,7 @@ import es.verdnatura.presentation.view.feature.login.model.AccessConfigSalix
import es.verdnatura.presentation.view.feature.login.model.DataUserSalix
import es.verdnatura.presentation.view.feature.login.model.LoginDevice
import es.verdnatura.presentation.view.feature.login.model.LoginSalixVO
import es.verdnatura.presentation.view.feature.login.model.MultimediaTokenResponse
import es.verdnatura.presentation.view.feature.login.model.NameWorker
import es.verdnatura.presentation.view.feature.login.model.OperatorAdd
import es.verdnatura.presentation.view.feature.login.model.OperatorSalix
@ -69,7 +76,7 @@ import es.verdnatura.presentation.view.feature.sacador.model.TicketStateSalix
import es.verdnatura.presentation.view.feature.ubicador.model.ItemBuy
import es.verdnatura.presentation.view.feature.ubicador.model.ItemShelvingNewer
import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicador
import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicadorVO
import es.verdnatura.presentation.view.feature.ubicador.model.ShelvingItem
import es.verdnatura.presentation.view.feature.workermistake.model.DepartmentMistake
import es.verdnatura.presentation.view.feature.workermistake.model.ExpeditionMistakeSalix
import es.verdnatura.presentation.view.feature.workermistake.model.MistakeType
@ -140,11 +147,21 @@ interface SalixService {
@Query("filter") filter: String
): Call<List<AddressLoses>>
@POST("Applications/buy_getLastWithoutInventory/execute-func")
fun buyGetLastWithoutInventory(
@Query("params") params: Any, @Query("schema") schema: String = "vn"
): Call<Long>
@GET("Buyers")
fun getBuyers(
@Query("filter") filter: String
): Call<List<BuyerVO>>
@GET("itemTypes")
fun getBuyersByItemPackingType(
@Query("filter") filter: String
): Call<List<Buyer>>
@GET("Tickets/myLastModified")
fun myLastModified(
@Query("filter") filter: String
@ -181,10 +198,22 @@ interface SalixService {
fun getRoutes(
): Call<MutableList<RouteInfo>>
@GET("Workers/findOne")
@POST("Expeditions/moveExpeditions")
fun moveExpeditions(
@Query("clientId") clientId: Number,
@Query("warehouseId") warehouseId: Number,
@Query("addressId") addressId: Number,
@Query("agencyModeId") agencyModeId: Number,
@Query("routeId") routeId: Number,
@Query("expeditionIds") expeditionIds: ArrayList<Number>,
@Query("landed") landed: String
): Call<Any>
@GET("Workers/Summary")
fun getNameWorker(
@Query("filter") filter: String
): Call<NameWorker>
): Call<List<NameWorker>>
@POST("Applications/{routine}/execute-proc")
fun executeProc(
@ -440,6 +469,12 @@ interface SalixService {
@Query("barcode") barcode: Number, @Query("warehouseFk") warehouseFk: Int
): Call<ItemCardVO>
@POST("Applications/report_print/execute-proc")
fun printItem(
@Query("params") params: Any? = null,
@Query("schema") schema: String = "vn"
): Call<Unit>
@POST("Applications/itemPlacementSupplyAiming/execute-proc")
fun itemPlacementSupplyAiming(
@Query("params") params: Any? = null, @Query("schema") schema: String = "vn"
@ -500,6 +535,20 @@ interface SalixService {
@Query("shelvingFk") shelvingFkIn: Any, @Query("parking") parking: Any? = null
): Call<List<ItemShelvingNewer>>
@GET("ItemShelvings/getListItemNewer")
fun getListItemNewerNew(
@Query("shelvingFk") shelvingFkIn: Any,
@Query("parking") parking: Any? = null,
@Query("itemFk") itemFk: Any? = null
): Call<List<ItemShelvingNewer>>
@GET("ItemShelvings/getItemsByReviewOrder")
fun getItemsByReviewOrder(
@Query("shelving") shelvingFkIn: Any,
@Query("parking") parking: Any? = null,
@Query("itemFk") itemFk: Any? = null
): Call<List<ItemShelvingNewer>>
@POST("Applications/sectorCollectionSaleGroup_add/execute-proc")
fun sectorCollectionSaleGroupAdd(
@Query("params") params: Any? = null, @Query("schema") schema: String = "vn"
@ -515,10 +564,10 @@ interface SalixService {
@Query("params") params: Any? = null, @Query("schema") schema: String = "vn"
): Call<Any>
@POST("Applications/machine_getWorkerPlate/execute-proc")
fun machineGetWorkerPlate(
@Query("params") params: Any? = null, @Query("schema") schema: String = "vn"
): Call<List<JsonObject>>
/* @POST("Applications/machine_getWorkerPlate/execute-proc")
fun machineGetWorkerPlate(
@Query("params") params: Any? = null, @Query("schema") schema: String = "vn"
): Call<List<JsonObject>>*/
@POST("Applications/sectorCollection_get/execute-proc")
fun sectorCollectionGet(
@ -540,9 +589,34 @@ interface SalixService {
@Query("params") params: Any, @Query("schema") schema: String = "vn"
): Call<List<WorkerFromMistake>>
@GET("RouteActions")
fun getRouteAction(
@Query("filter") filter: Any = """{"fields": {"id": true,"name": true,"price":true},"order": "name"}"""
): Call<List<RouteAction>>
@GET("Expeditions")
fun getDataFromExpedition(
@Query("filter") filter: Any,
): Call<List<ExpeditionWithTicket>>
@POST("RouteComplements")
fun addRouteComplements(
@Body params: RouteComplementAdd
): Call<Any>
@GET("RouteComplements")
fun getRouteComplements(
@Query("filter") filter: Any
): Call<List<RouteComplement>>
@DELETE("RouteComplements/{id}")
fun routeComplementDelete(
@Path("id") id: Number
): Call<Any>
@POST("Applications/sectorCollection_new/execute-proc")
fun sectorCollectionNew(
@Query("params") params: Any, @Query("schema") schema: String = "vn"
@Query("params") filter: Any, @Query("schema") schema: String = "vn"
): Call<Any>
@POST("Applications/ticketStateToday_setState/execute-proc")
@ -560,6 +634,11 @@ interface SalixService {
@Query("filter") filter: Any, @Query("schema") schema: String = "vn"
): Call<List<TicketState>>
@GET("Tickets")
fun ticketIsPickup(
@Query("filter") filter: Any, @Query("schema") schema: String = "vn"
): Call<List<PickupResponse>>
@POST("Applications/workerMachinery_isRegistered/execute-func")
fun workerMachineryIsRegistered(
@Query("params") params: Any, @Query("schema") schema: String = "vn"
@ -643,18 +722,27 @@ interface SalixService {
@Query("params") params: Any,
): Call<List<ItemLocationVO>>
@POST("Applications/itemShelving_get/execute-proc")
fun itemShelvingList(
@Query("schema") schema: String = "vn",
@Query("params") params: Any,
): Call<List<ItemUbicadorVO>>
@POST("Applications/itemShelving_get/execute-proc")
fun itemShelvingListNew(
@Query("schema") schema: String = "vn",
@Query("params") params: Any,
): Call<List<ItemUbicador>>
@GET("Shelvings/findOne")
fun shelvingGet(
@Query("filter") filter: Any,
): Call<ShelvingItem>
@GET("ImageConfigs/findOne")
fun getImageConfig(
@Query("filter") filter: String = """{"fields":["url"]}"""
): Call<JsonObject>
@GET("Shelvings/findOne")
fun shelvingGetFromCode(
@Query("filter") filter: Any,
): Call<ItemUbicador>
@POST("Applications/expedition_scan/execute-proc")
fun expeditionScan(
@Query("schema") schema: String = "srt",
@ -936,6 +1024,10 @@ interface SalixService {
fun getAccessTokenConfigs(
): Call<List<AccessConfigSalix>>
@GET("VnUsers/ShareToken")
fun getMultimediaToken(
): Call<MultimediaTokenResponse>
@POST("vnusers/renewToken")
fun renewToken(
): Call<RenewToken>
@ -1031,6 +1123,11 @@ interface SalixService {
@Query("filter") filter: String
): Call<Any>
@GET("States/findOne")
fun getStateId(
@Query("filter") filter: String
): Call<JsonObject>
@POST("WorkerMistakes")
fun workerMistakesAdd(
@Body workerMistake: WorkerMistakeSalix

View File

@ -1,12 +1,20 @@
package es.verdnatura.domain.userCases
import es.verdnatura.domain.SalixService
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)
}
}

View File

@ -18,7 +18,7 @@ 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 timber.log.Timber.d
import es.verdnatura.domain.toast
interface LocationUpdateCallback {
fun onLocationReceived(location: LocationResult)
@ -36,7 +36,7 @@ abstract class BaseActivity<T : ViewDataBinding> : AppCompatActivity() {
var locationUpdateCallback: LocationUpdateCallback? = null
protected lateinit var binding: T
private lateinit var fusedLocationClient:FusedLocationProviderClient
private lateinit var fusedLocationClient: FusedLocationProviderClient
private val locationRequest =
com.google.android.gms.location.LocationRequest.Builder(
Priority.PRIORITY_LOW_POWER,
@ -50,8 +50,8 @@ abstract class BaseActivity<T : ViewDataBinding> : AppCompatActivity() {
setContentView(getLayoutId())
try {
initDataBinding()
}catch (ex:Exception){
d(ex.message.toString())
} catch (ex: Exception) {
ex.message!!.toast(context = this)
}
mobileApplication = application as MobileApplication
init()
@ -62,7 +62,6 @@ abstract class BaseActivity<T : ViewDataBinding> : AppCompatActivity() {
open fun addBindingVariables() {}
abstract fun init()
private fun initDataBinding() {
binding = DataBindingUtil.setContentView(this, getLayoutId())
binding.lifecycleOwner = this

View File

@ -69,10 +69,10 @@ abstract class BaseFragment<T : ViewDataBinding, V : BaseViewModel>(
addBindingVariables()
}
fun textScanned_filterDouble(textScanned: String): String {
fun textScannedFilterDouble(textScanned: String): String {
if (textScanned.length > 13) {
var size = textScanned.length
val size = textScanned.length
if (textScanned.substring((size / 2), size) == textScanned.substring(0, size / 2)
) {
return textScanned.substring(0, size / 2)
@ -149,8 +149,8 @@ abstract class BaseFragment<T : ViewDataBinding, V : BaseViewModel>(
fun getInfoVersionNameApp(): String {
val manager: PackageManager = requireContext().packageManager
val info: PackageInfo = manager.getPackageInfo(requireContext().packageName, 0)
mobileApplication.versionName = info.versionName
return info.versionName
mobileApplication.versionName = info.versionName.toString()
return mobileApplication.versionName
}
fun getDevicePDA(): Int? {

View File

@ -7,9 +7,10 @@ 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
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 {
@ -23,10 +24,6 @@ class GeneralAdapter(
override fun onBindViewHolder(holder: ItemHolder, position: Int) {
holder.bind(items[position])
holder.binding.root.setOnClickListener {
OnGeneralItemRowClickListener.onGeneralItemRowClickListener(items[position])
}
}
inner class ItemHolder(
@ -36,11 +33,31 @@ class GeneralAdapter(
fun bind(item: GeneralItem) {
binding.apply {
this.item = item
/*if (showDelete) itemImage.visibility = View.VISIBLE
else itemImage.visibility = View.GONE*/
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)
}
}
}
fun updateItems(list: List<GeneralItem>) {
items = list
notifyDataSetChanged()
}
fun setShowDelete(hasVisibility: Boolean) {
showDelete = hasVisibility
notifyDataSetChanged()
}
}

View File

@ -0,0 +1,71 @@
package es.verdnatura.presentation.common
import android.app.AlertDialog
import android.content.Context
import android.text.InputType
import android.view.View
import es.verdnatura.R
import es.verdnatura.domain.toast
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
) {
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()
}.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 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

@ -96,4 +96,26 @@ data class ExpeditionPrintOut(
val expeditionFk: Long,
val itemFk: Int,
val isChecked: Boolean
)
data class PickupResponse(
val routeFk: Int,
val route: Route?
)
data class Route(
val id: Int,
val agencyModeFk: 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

@ -10,6 +10,7 @@ import es.verdnatura.presentation.view.feature.buscaritem.model.ItemLocationVO
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
@ -30,6 +31,7 @@ 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
@ -50,6 +52,10 @@ interface OnMistakeWorkerClickListener {
fun onMistakeWorkerClickListener(item: WorkerFromMistake)
}
interface OnSalarySupplementClickListener {
fun onSalarySupplementClickListener(item: RouteComplement)
}
interface HideBottomNavigation {
fun hideBottomNavigation(entryPoint: String)
}
@ -102,6 +108,10 @@ interface OnGeneralItemRowClickListener {
fun onGeneralItemRowClickListener(item: GeneralItem)
}
interface OnGeneralRowClickListener {
fun onRowClickListener(item: GeneralItem)
}
interface OnImageTrashClickListener {
fun onImageTrashClickListener(item: Any)
}
@ -158,6 +168,10 @@ interface OnVisibleClickListenerNew {
fun onVisibleClickListener(item: ItemUbicador)
}
interface OnVisibleClickListener6869 {
fun onVisibleClickListener(item: ItemShelving)
}
interface OnVisibleInventoryClickListener {
fun onVisibleInventoryClickListener(item: ItemInventoryParking)
}
@ -170,6 +184,10 @@ interface OnMoreClickListenerNew {
fun onMoreClickListener(item: ItemUbicador)
}
interface OnMoreClickListener6869 {
fun onMoreClickListener(item: ItemShelving)
}
interface OnTruckClickListener {
fun onTruckClickListener(item: ItemExpeditionTruckVO, entryPoint: String)
}
@ -263,6 +281,10 @@ interface OnTicketClickListener {
fun onTicketClickListener(sale: SaleVO)
}
interface OnTicketColorListener {
fun onTicketColorListener(sale: SaleVO)
}
interface OnTicketClickSaleListener {
fun onTicketClickListener(sale: Sale)
}
@ -271,6 +293,10 @@ interface OnSaleReserveClickListener {
fun onSaleReserveListener(sale: Sale)
}
interface OnAddItemClickListener {
fun onAddItemClickListener(sale: Sale)
}
interface OnBuyerSelectedListener {
fun onBuyerSelected(userFk: String)
}

View File

@ -10,6 +10,8 @@ import android.graphics.drawable.Drawable
import android.media.AudioManager
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.text.InputType
import android.view.View
import android.view.ViewGroup
@ -27,6 +29,10 @@ import com.bumptech.glide.request.transition.Transition
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
@ -153,8 +159,12 @@ fun Activity.showKeyboardIn() {
}
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() {
@ -213,7 +223,7 @@ fun PackageManager.getPackageInfoCompat(packageName: String, flags: Int = 0): Pa
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(flags.toLong()))
} else {
getPackageInfo(packageName, flags)
getPackageInfo(packageName, flags)
}
fun convertToDateString(date: String?): String? {
@ -221,8 +231,18 @@ 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 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,87 @@
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 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)
}
}
}
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

@ -8,49 +8,43 @@ import com.google.android.material.textfield.TextInputEditText
import es.verdnatura.R
import es.verdnatura.databinding.ComponentCustomListDialogBinding
//import kotlinx.android.synthetic.main.component_custom_list_dialog.*
class CustomDialogList(context: Context) : Dialog(context, R.style.DialogTheme) {
private var binding: ComponentCustomListDialogBinding =
ComponentCustomListDialogBinding.inflate(layoutInflater)
init {
setContentView(binding.root)
getEditText().requestFocus()
//setContentView(R.layout.component_custom_list_dialog)
}
fun getRecyclerView(): RecyclerView {
return binding.itemRecyclerview
//return item_recyclerview
}
fun getEditText(): TextInputEditText {
return binding.customDialogValue
//return custom_dialog_value
}
fun getEditTextTwo(): TextInputEditText {
return binding.customDialogValueTwo
//return custom_dialog_value_two
}
fun getEditTextThree(): TextInputEditText {
return binding.customDialogValueThree
}
fun getValue(): String {
return binding.customDialogValue.text.toString()
//return custom_dialog_value.text.toString()
}
fun getValueOptional(): String {
return binding.customDialogValueThree.text.toString()
}
fun setValue(value: String): CustomDialogList {
binding.customDialogValue.setText(value)
binding.textinputlayoutUsername.visibility = View.VISIBLE
/*custom_dialog_value.setText(value)
textinputlayout_username.visibility = View.VISIBLE*/
return this
}
@ -61,96 +55,97 @@ class CustomDialogList(context: Context) : Dialog(context, R.style.DialogTheme)
fun getValueTwo(): String {
return binding.customDialogValueTwo.text.toString()
//return custom_dialog_value_two.text.toString()
}
fun setValueTwo(value: String): CustomDialogList {
binding.customDialogValueTwo.setText(value)
binding.textinputlayoutTwo.visibility = View.VISIBLE
/* custom_dialog_value_two.setText(value)
textinputlayout_two.visibility = View.VISIBLE*/
return this
}
fun setTitle(title: String): CustomDialogList {
binding.customDialogTitle.visibility = View.VISIBLE
binding.customDialogTitle.text = title
/* custom_dialog_title.visibility = View.VISIBLE
custom_dialog_title.text = title*/
return this
}
fun setDescription(title: String): CustomDialogList {
binding.customDialogDescription.visibility = View.VISIBLE
binding.customDialogDescription.text = title
/*custom_dialog_description.visibility = View.VISIBLE
custom_dialog_description.text = title*/
return this
}
fun setOkButton(text: String, onButtonClicked: () -> Unit): CustomDialogList {
binding.customDialogButtonOk.visibility = View.VISIBLE
binding.customDialogButtonOk.text = text
/*custom_dialog_button_ok.visibility = View.VISIBLE
custom_dialog_button_ok.text = text
custom_dialog_button_ok.setOnClickListener { onButtonClicked() }*/
binding.customDialogButtonOk.setOnClickListener { onButtonClicked() }
return this
}
fun setKoButton(text: String, onButtonClicked: () -> Unit): CustomDialogList {
fun setOkTwoButton(text: String, onButtonClicked: () -> Unit): CustomDialogList {
binding.customDialogButtonOkTwo.visibility = View.VISIBLE
binding.customDialogButtonOkTwo.text = text
binding.customDialogButtonOkTwo.setOnClickListener { onButtonClicked() }
return this
}
fun setKoButton(text: String, onButtonClicked: () -> Unit): CustomDialogList {
binding.customDialogButtonKo.visibility = View.VISIBLE
binding.customDialogButtonKo.text = text
/*custom_dialog_button_ko.visibility = View.VISIBLE
custom_dialog_button_ko.text = text*/
binding.customDialogButtonKo.setOnClickListener {
onButtonClicked()
dismiss()
}
return this
}
fun setHintValue(text: String): CustomDialogList {
binding.customDialogValue.hint = text
// custom_dialog_value.hint = text
return this
}
fun setHintValueTwo(text: String): CustomDialogList {
binding.customDialogValueTwo.hint = text
//custom_dialog_value_two.hint = text
return this
}
fun setTextTwoGone(): CustomDialogList {
binding.textinputlayoutTwo.visibility = View.GONE
//textinputlayout_two.visibility = View.GONE
fun setHintValueThree(text: String): CustomDialogList {
binding.customDialogValueThree.hint = text
return this
}
fun setTextTwoVisibility(visibility: Int): CustomDialogList {
binding.textinputlayoutTwo.visibility = visibility
return this
}
fun setTextThree(visibility: Int): CustomDialogList {
binding.textinputlayoutThree.visibility = visibility
return this
}
fun hideDialog(): CustomDialogList {
binding.customDialogValue.visibility = View.GONE
//custom_dialog_value.visibility = View.GONE
return this
}
fun showDialog(): CustomDialogList {
binding.customDialogValue.visibility = View.VISIBLE
return this
}
fun hideDescription(): CustomDialogList {
binding.customDialogDescription.visibility = View.GONE
return this
}
fun hideTextInput(visibility:Int = View.INVISIBLE): CustomDialogList {
fun hideTextInput(visibility: Int = View.INVISIBLE): CustomDialogList {
binding.textinputlayoutUsername.visibility = visibility
return this
}
fun getFocusThree() {
binding.customDialogValueThree.requestFocus()
}
}

View File

@ -7,10 +7,10 @@ import com.google.android.material.textfield.TextInputEditText
import es.verdnatura.R
import es.verdnatura.databinding.ComponentCustomThreeDialogBinding
class CustomDialogThreeButtons(context: Context) : Dialog(context, R.style.DialogTheme) {
class CustomDialogThreeButtons (context: Context) : Dialog(context, R.style.DialogTheme) {
private var binding: ComponentCustomThreeDialogBinding = ComponentCustomThreeDialogBinding.inflate(layoutInflater)
private var binding: ComponentCustomThreeDialogBinding =
ComponentCustomThreeDialogBinding.inflate(layoutInflater)
init {
@ -18,53 +18,52 @@ class CustomDialogThreeButtons (context: Context) : Dialog(context, R.style.Dial
//setContentView(R.layout.component_custom_three_dialog)
}
fun setTitle(title: String): CustomDialogThreeButtons {
binding.customDialogTitle.visibility= View.VISIBLE
binding.customDialogTitle.text=title
/* custom_dialog_title.visibility = View.VISIBLE
custom_dialog_title.text = title*/
binding.customDialogTitle.visibility = View.VISIBLE
binding.customDialogTitle.text = title
/* custom_dialog_title.visibility = View.VISIBLE
custom_dialog_title.text = title*/
return this
}
fun setDescription(description: String): CustomDialogThreeButtons {
binding.customDialogDescription.visibility= View.VISIBLE
binding.customDialogDescription.text=description
binding.customDialogDescription.visibility = View.VISIBLE
binding.customDialogDescription.text = description
/* custom_dialog_description.visibility = View.VISIBLE
custom_dialog_description.text = description*/
/* custom_dialog_description.visibility = View.VISIBLE
custom_dialog_description.text = description*/
return this
}
fun setOkButton(text: String, onButtonClicked: () -> Unit): CustomDialogThreeButtons {
binding.customDialogButtonOk.visibility = View.VISIBLE
binding.customDialogButtonOk.text =text
binding.customDialogButtonOk.text = text
binding.customDialogButtonOk.setOnClickListener { onButtonClicked() }
/* custom_dialog_button_ok.visibility = View.VISIBLE
custom_dialog_button_ok.text = text
custom_dialog_button_ok.setOnClickListener { onButtonClicked() }*/
/* custom_dialog_button_ok.visibility = View.VISIBLE
custom_dialog_button_ok.text = text
custom_dialog_button_ok.setOnClickListener { onButtonClicked() }*/
return this
}
fun getValue() : String {
fun getValue(): String {
return binding.customDialogValue.text.toString()
//return custom_dialog_value.text.toString()
}
fun getEditText() : TextInputEditText {
fun getEditText(): TextInputEditText {
return binding.customDialogValue
//return custom_dialog_value
}
fun setValue(value : String): CustomDialogThreeButtons{
fun setValue(value: String): CustomDialogThreeButtons {
binding.customDialogValue.setText(value)
binding.textinputlayout.visibility = View.VISIBLE
/* custom_dialog_value.setText(value)
textinputlayout.visibility = View.VISIBLE*/
/* custom_dialog_value.setText(value)
textinputlayout.visibility = View.VISIBLE*/
return this
}
@ -117,10 +116,15 @@ class CustomDialogThreeButtons (context: Context) : Dialog(context, R.style.Dial
return this
}
fun setCustomDialogValue(visibility:Int){
binding.customDialogValue.visibility=visibility
fun setCustomDialogValue(visibility: Int) {
binding.customDialogValue.visibility = visibility
}
fun setFocusDialogValue(){
fun setFocusDialogValue() {
binding.customDialogValue.requestFocus()
}
fun setHintDialogValue(text: String) {
binding.customDialogValue.hint = text
}
}

View File

@ -32,6 +32,8 @@ import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.OnAjustesItemClickListener
import es.verdnatura.presentation.common.OnOptionsSelectedListener
import es.verdnatura.presentation.common.ToolBarAdapterTooltip
import es.verdnatura.presentation.view.commom.NameWithId
import es.verdnatura.presentation.view.commom.SearchableAdapter
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.feature.ajustes.adapter.SettingsAdapter
import es.verdnatura.presentation.view.feature.ajustes.model.AjustesItemVO
@ -75,51 +77,97 @@ class AjustesFragment :
binding.mainToolbar.toolbarTitle.text = getString(R.string.settings)
hideBackButton(binding.mainToolbar)
getUserData()
binding.userText.text = mobileApplication.userName
binding.itemVersion.text = requireActivity().packageManager.getPackageInfo(
requireActivity().packageName, 0
).versionName!!
binding.androididText.text =
mobileApplication.dataStoreApp.readDataStoreKey<String>(ANDROID_ID)
binding.serialNumber.text = mobileApplication.serialNumber
pasilleroViewModel = PasilleroViewModel(mobileApplication)
setToolBar()
super.init()
}
private fun setSearchable(listNames: MutableList<NameWithId>) {
val adapter =
SearchableAdapter(
listElements = listNames,
context = requireContext()
) { elementSelected ->
sectorListVO.forEach {
if (it.id == elementSelected.id) {
runBlocking {
mobileApplication.dataStoreApp.editDataStoreKey(
PRINTERNAME, getString(R.string.noprinter)
)
mobileApplication.dataStoreApp.editDataStoreKey(PRINTERFK, -1)
mobileApplication.dataStoreApp.editDataStoreKey(
SECTORDESCRIP, it.description
)
mobileApplication.dataStoreApp.editDataStoreKey(
SECTORFK, it.id
)
it.warehouseFk?.let { it1 ->
mobileApplication.dataStoreApp.editDataStoreKey(
WAREHOUSEFK, it1
)
}
}
viewModel.settingsItem[0].sectorFk = it.id
viewModel.settingsItem[0].selected = it.description
viewModel.workerUpdateOperatorSalix(
"sector", mobileApplication.userId!!, it.id, null
)
settingsAdapter!!.notifyItemChanged(0)
return@forEach
}
}
binding.searchableRecyclerView.visibility = View.GONE
}
binding.searchableRecyclerView.setAdapter(adapter, listNames)
binding.searchableRecyclerView.visibility = View.VISIBLE
binding.searchableRecyclerView.setSearchHint(getString(R.string.sectorSearch))
ma.hideKeyboard(binding.searchableRecyclerView)
}
private fun setToolBar() {
val listIcons: ArrayList<ImageView> = ArrayList()
val iconInfo = ImageView(context)
iconInfo.setImageResource(R.drawable.ic_info_delivery)
val iconLogout = ImageView(context)
iconLogout.setImageResource(R.drawable.ic_logout)
listIcons.add(iconInfo)
listIcons.add(iconLogout)
binding.mainToolbar.toolbarIcons.adapter =
ToolBarAdapterTooltip(listIcons, object : OnOptionsSelectedListener {
override fun onOptionsItemSelected(item: Drawable) {
customDialog.setTitle(getString(R.string.info))
.setDescription(
getString(R.string.version) + ":\t" +
requireActivity().packageManager.getPackageInfo(
requireActivity().packageName, 0
).versionName!! + "(${getVersionCode()})" + "\n" +
getString(R.string.user) + ":\t" +
mobileApplication.userName + "\n" +
getString(R.string.androidid) + ":\t" +
mobileApplication.dataStoreApp.readDataStoreKey<String>(
ANDROID_ID
) + "\n" +
if (!mobileApplication.serialNumber.isNullOrBlank()) {
getString(R.string.serialNumber) + "\t" +
mobileApplication.serialNumber
} else ""
when (item) {
iconInfo.drawable -> {
customDialog.setTitle(getString(R.string.info))
.setDescription(
getString(R.string.version) + ":\t" +
requireActivity().packageManager.getPackageInfo(
requireActivity().packageName, 0
).versionName!! + "(${getVersionCode()})" + "\n" +
getString(R.string.user) + ":\t" +
mobileApplication.userName + "\n" +
getString(R.string.androidid) + ":\t" +
mobileApplication.dataStoreApp.readDataStoreKey<String>(
ANDROID_ID
) + "\n" +
if (!mobileApplication.serialNumber.isNullOrBlank()) {
getString(R.string.serialNumber) + "\t" +
mobileApplication.serialNumber
} else ""
)
.setOkButton(getString(R.string.Close)) {
customDialog.dismiss()
}.show()
)
.setOkButton(getString(R.string.Close)) {
customDialog.dismiss()
}.show()
}
iconLogout.drawable -> {
ma.onMyBackPressed()
}
}
}
})
binding.mainToolbar.toolbarIcons.layoutManager =
@ -177,6 +225,23 @@ class AjustesFragment :
CodeWorkerAction.STOP
)
getString(R.string.holdpositionAuto) -> {
runBlocking {
mobileApplication.dataStoreApp.editDataStoreKey(
HOLDPOSITION,
viewModel.settingsItem[5].selected != getString(R.string.yes)
)
}
viewModel.settingsItem[5].holdPosition =
!viewModel.settingsItem[5].holdPosition
viewModel.settingsItem[5].selected =
if (viewModel.settingsItem[5].holdPosition) getString(R.string.yes) else getString(
R.string.no
)
settingsAdapter!!.notifyItemChanged(5)
}
else -> {}
}
@ -206,11 +271,13 @@ class AjustesFragment :
}
// modificar
listSectores.sort()
val array = arrayOfNulls<String>(listSectores.size)
sectorListVO = it.list
showDialogForAll(
listSectores.toArray(array), getString(R.string.selectSector)
)
setSearchable(sectorListVO.map {
NameWithId(
id = it.id,
name = it.description
)
} as MutableList<NameWithId>)
} else {
customDialog.setTitle(getString(R.string.sectors))
@ -297,16 +364,6 @@ class AjustesFragment :
private fun getUserData() {
loginViewModel = LoginViewModel(requireActivity().applicationContext)
/* try {
loginViewModel.operatorGetData(mobileApplication.userId!!)
} catch (_: Exception) {
ma.messageWithSound(
message = getString(R.string.errorGetData), isError = true, isPlayed = true
)
}
loginViewModel.workerOperator.observe(this@AjustesFragment) { iti ->
runBlocking { mobileApplication.dataStoreApp.saveDataOperator(iti) }
}*/
handleUserCall()
loginViewModel.handleUserResponse.observe(this@AjustesFragment) { iti ->
runBlocking { mobileApplication.dataStoreApp.saveWorkerData(iti) }

View File

@ -100,14 +100,17 @@ class AjustesViewModel(val context: Context) : BaseViewModel(context) {
action = false
)
)
/*Tarea 5443
_settingsItem.add(
AjustesItemVO(
"Bajar línea al revisar",
holdPosition = holdPosition,
action = true
)
)*/
//Tarea 5443
_settingsItem.add(
AjustesItemVO(
context.getString(R.string.holdpositionAuto),
holdPosition = holdPosition,
selected = if (holdPosition) context.getString(R.string.yes) else context.getString(
R.string.no
),
action = true
)
)
_settingsItem.add(
AjustesItemVO(
@ -124,11 +127,11 @@ class AjustesViewModel(val context: Context) : BaseViewModel(context) {
context.getString(R.string.runActivityStop), action = true
)
)
_settingsItem.add(
AjustesItemVO(
context.getString(R.string.closeSession), action = true
)
)
/* _settingsItem.add(
AjustesItemVO(
context.getString(R.string.closeSession), action = true
)
)*/
}

View File

@ -3,6 +3,7 @@ package es.verdnatura.presentation.view.feature.articulo.fragment
import android.content.Intent
import android.graphics.drawable.Drawable
import android.text.InputType
import android.view.MotionEvent
import android.view.View
import android.view.View.GONE
import android.view.inputmethod.EditorInfo
@ -11,6 +12,8 @@ import androidx.recyclerview.widget.LinearLayoutManager
import com.google.gson.Gson
import es.verdnatura.R
import es.verdnatura.databinding.FragmentItemCardBinding
import es.verdnatura.domain.ConstAndValues.PRINTERFK
import es.verdnatura.domain.ConstAndValues.TOKENMULTIMEDIA
import es.verdnatura.domain.ConstAndValues.WAREHOUSEFK
import es.verdnatura.domain.notNull
import es.verdnatura.domain.toast
@ -19,7 +22,9 @@ import es.verdnatura.presentation.common.OnBarcodeRowClickListener
import es.verdnatura.presentation.common.OnClickDynamic
import es.verdnatura.presentation.common.OnItemCardRowClickListener
import es.verdnatura.presentation.common.OnOptionsSelectedListener
import es.verdnatura.presentation.common.PrinterDialogManager
import es.verdnatura.presentation.common.ToolBarAdapterTooltip
import es.verdnatura.presentation.common.hideKeyboard
import es.verdnatura.presentation.common.itemScanValue
import es.verdnatura.presentation.common.loadUrl
import es.verdnatura.presentation.view.component.CustomDialogDynamicButtons
@ -34,6 +39,7 @@ import es.verdnatura.presentation.view.feature.articulo.model.ItemCardRowVO
import es.verdnatura.presentation.view.feature.articulo.model.ItemCardVO
import es.verdnatura.presentation.view.feature.articulo.model.ItemPackingType
import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
import org.json.JSONObject
class ItemCardFragment(
var itemFk: String = ""
@ -53,6 +59,8 @@ class ItemCardFragment(
private var quantityToDiscard = 0
private var itemInfoG: ItemCardVO? = null
private var positionToReturnY = 0
private var originalScan: Long? = null
private var buyToPrint: Long? = null
companion object {
fun newInstance(entryPoint: String) = ItemCardFragment(entryPoint)
@ -95,16 +103,20 @@ class ItemCardFragment(
iconHistory.setImageResource(R.drawable.ic_history_black_24dp)
val iconSalix = ImageView(context)
iconSalix.setImageResource(R.drawable.ic_logo_salix)
val iconPrint = ImageView(context)
iconPrint.setImageResource(R.drawable.ic_print_black_24dp)
iconReload.tooltipText = getTooltip(R.drawable.ic_autorenew_black_24dp)
iconHistory.tooltipText = getTooltip(R.drawable.ic_history_black_24dp)
iconSalix.tooltipText = getTooltip(R.drawable.ic_logo_salix)
// Tarea 7266
iconPrint.tooltipText = getTooltip(R.drawable.ic_print_black_24dp)
listIcons.add(iconSalix)
listIcons.add(iconReload)
listIcons.add(iconHistory)
listIcons.add(iconPrint)
binding.mainToolbar.toolbarIcons.adapter =
ToolBarAdapterTooltip(listIcons, object : OnOptionsSelectedListener {
@ -112,6 +124,25 @@ class ItemCardFragment(
override fun onOptionsItemSelected(item: Drawable) {
when (item) {
iconPrint.drawable -> {
if (buyToPrint != null) {
val printerDialogManager = PrinterDialogManager(requireContext())
printerDialogManager.showPrintDialog(
buyToPrint ?: itemInfoG!!.id.toLong(),
itemInfoG?.longName ?: ""
) { id, labelType, copies, packing ->
printItem(id, labelType, copies, packing)
}
} else ma.messageWithSound(
getString(R.string.errorPrintBuy),
isError = true,
isPlayed = true
)
}
iconReload.drawable -> {
getItemCard(itemInfoG!!.id.toString())
}
@ -152,20 +183,77 @@ class ItemCardFragment(
LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
}
private fun setEvents() {
private fun printItem(id: Long, labelType: String, packing: Int?, copies: Int?) {
try {
viewModel.printItem(
reportName = "LabelBuy",
printerFk = mobileApplication.dataStoreApp.readDataStoreKey<Int>(
PRINTERFK
),
userFk = mobileApplication.userId!!,
priority = "normal",
params = JSONObject().apply {
put("copies", copies)
put("id", id)
put("labelType", labelType)
put("packing", packing)
}.toString().replace("\"", "\\\"")
)
} catch (ex: Exception) {
ma.messageWithSound(message = ex.message.toString(), isError = true, isPlayed = true)
}
customDialogList.dismiss()
hideKeyboard()
}
private fun openWebViewer(param: String) {
//variableWeb = if (itemScan is Number) "var-itemFk=$param" else "var-shelvingCode=$param"
ma.onPasillerosItemClickListener(
PasillerosItemVO(
title = R.string.titleWebViewer,
),
Gson().toJson(
mutableMapOf(
"entryPoint" to param,
"web" to "https://grafana.verdnatura.es/d/ce4b8ymvex4owa?var-itemFk=$param&var-vnToken=${
mobileApplication.dataStoreApp.readDataStoreKey<String>(
TOKENMULTIMEDIA
)
}"
)
), param = ""
)
}
private fun setEvents() {
binding.editItemFk.setOnTouchListener { v, event ->
if (event.action == MotionEvent.ACTION_UP) {
val drawableRight = binding.editItemFk.compoundDrawables[2]
if (drawableRight != null && event.x >= v.width - drawableRight.bounds.width()) {
openWebViewer(itemInfoG?.id?.toString() ?: "")
return@setOnTouchListener true
}
}
false
}
binding.editItemFk.requestFocus()
binding.editItemFk.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {
if (binding.editItemFk.text.toString().isNotEmpty()) try {
getItemCard(
itemScanValue(
if (binding.editItemFk.text.toString().isNotEmpty())
try {
originalScan = itemScanValue(
binding.editItemFk.text.toString(), arrayOf("buy"), "more"
).toString()
)
} catch (ex: Exception) {
ma.messageWithSound(ex.message.toString(), isError = true, isPlayed = true)
}
).toString().toLong()
getItemCard(
originalScan!!.toString()
)
} catch (ex: Exception) {
ma.messageWithSound(ex.message.toString(), isError = true, isPlayed = true)
}
binding.editItemFk.setText("")
ma.hideKeyboard(binding.editItemFk)
@ -196,7 +284,6 @@ class ItemCardFragment(
warehouseFk = mobileApplication.dataStoreApp.readDataStoreKey(WAREHOUSEFK) as Int
itemFk = itemValueFk
viewModel.getItemCard(itemFk.toLong(), warehouseFk!!)
}
@ -210,6 +297,17 @@ class ItemCardFragment(
binding.itemcardLayout.visibility = View.VISIBLE
setItemCard(it)
binding.mainToolbar.toolbarIcons.visibility = View.VISIBLE
// Tarea 7266
if (originalScan == null || it.id == originalScan!!.toInt()) {
viewModel.buyGetLastWithoutInventory(
itemFk = it.id,
warehouseFk = mobileApplication.dataStoreApp.readDataStoreKey(
WAREHOUSEFK
)
)
} else {
buyToPrint = originalScan!!.toLong()
}
} else {
binding.itemcardLayout.visibility = GONE
binding.mainToolbar.toolbarTitle.text = getString(R.string.itemCard)
@ -237,6 +335,11 @@ class ItemCardFragment(
}
}
loadBuyUltimateResponse.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled().notNull {
buyToPrint = it
}
}
}
}

View File

@ -7,6 +7,7 @@ import androidx.lifecycle.map
import es.verdnatura.domain.SalixCallback
import es.verdnatura.domain.formatWithQuotes
import es.verdnatura.domain.userCases.GetItemFromBarcodeUseCase
import es.verdnatura.domain.userCases.GetItemPrintItemUseCase
import es.verdnatura.presentation.base.BaseViewModel
import es.verdnatura.presentation.common.Event
import es.verdnatura.presentation.common.ItemBarCodeSalix
@ -25,6 +26,7 @@ import java.io.File
class ItemCardViewModel(var context: Context) : BaseViewModel(context) {
private val getItemFromBarcodeUseCase = GetItemFromBarcodeUseCase(salix)
private val printItemUseCase = GetItemPrintItemUseCase(salix)
private val _itemCard by lazy { MutableLiveData<ItemCardVO>() }
val itemCard: LiveData<ItemCardVO>
@ -48,6 +50,10 @@ class ItemCardViewModel(var context: Context) : BaseViewModel(context) {
val loadAddressLosesList: LiveData<Event<AddressLosesList>> =
_addressLosesList.map { Event(it) }
private val _buyUltimateResponse by lazy { MutableLiveData<Long>() }
val buyUltimateResponse: LiveData<Long> = _buyUltimateResponse
val loadBuyUltimateResponse: LiveData<Event<Long>> = _buyUltimateResponse.map { Event(it) }
fun getItemCard(
itemFk: Number,
warehouseFk: Int,
@ -63,6 +69,28 @@ class ItemCardViewModel(var context: Context) : BaseViewModel(context) {
})
}
fun printItem(
reportName: String,
printerFk: Int,
userFk: Int,
params: Any,
priority: String
) {
printItemUseCase.execute(
params = arrayListOf(
reportName,
printerFk,
userFk,
params,
priority
).formatWithQuotes()
)
.enqueue(object : SalixCallback<Unit>(context) {
})
}
fun itemGetSimilar(
itemFk: Int,
warehouseFk: Int,
@ -210,4 +238,20 @@ class ItemCardViewModel(var context: Context) : BaseViewModel(context) {
}
})
}
fun buyGetLastWithoutInventory(
itemFk: Int, warehouseFk: Int,
) {
salix.buyGetLastWithoutInventory(
params = arrayListOf(
itemFk,
warehouseFk
).formatWithQuotes()
)
.enqueue(object : SalixCallback<Long>(context) {
override fun onSuccess(response: Response<Long>) {
_buyUltimateResponse.value = response.body()
}
})
}
}

View File

@ -10,7 +10,7 @@ class ItemCardVO(
var size: Int? = null,
var stems: String? = null,
var itemCost: String? = null,
var category:String? = null,
var category: String? = null,
var producer: String? = null,
var origin: String? = null,
var reserva: Int? = null,
@ -46,13 +46,20 @@ class ItemCardRowVO(
class BarcodeVO(
var code: String?
)
data class ItemDetails(
var itemFk: Int? = null,
var vShelvingFK: String = "",
var itemCost: Double = 0.0,
var visible: Int = 0,
)
data class ItemPrint(
val id: Int,
val labelType: String,
val packing: Int? = null,
val copies: Int? = 1
)

View File

@ -45,7 +45,7 @@ class BuscarItemFragment(
if (binding.editItemFk.text.toString().isNotEmpty()) try {
getLocations(
itemScanValue(
binding.editItemFk.text.toString(), arrayOf("buy"), "more"
binding.editItemFk.text.toString(), arrayOf("buy"), "more"
)
)
} catch (ex: Exception) {

View File

@ -27,3 +27,21 @@ class ItemBuyerVO(
class ItemBuyerListVO(
var list: List<ItemBuyerVO> = listOf()
)
data class BuyerList(
var list: List<Buyer> = listOf()
)
data class Buyer(
val itemPackingTypeFk: String,
val worker: Worker
)
data class Worker(
val user: User
)
data class User(
val id: Int,
val nickname: String
)

View File

@ -6,6 +6,8 @@ import android.graphics.Color
import android.graphics.drawable.Drawable
import android.view.LayoutInflater
import android.view.View
import android.view.View.GONE
import android.view.View.VISIBLE
import android.view.ViewGroup
import androidx.core.content.ContextCompat.getColor
import androidx.core.graphics.drawable.DrawableCompat
@ -13,6 +15,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import es.verdnatura.R
import es.verdnatura.databinding.ItemArticleRowFragmentBinding
import es.verdnatura.domain.ConstAndValues.CONTROLADOR
import es.verdnatura.domain.ConstAndValues.SACADOR
import es.verdnatura.presentation.common.OnMistakeClickListener
import es.verdnatura.presentation.common.OnPackingClickListener
@ -20,11 +23,12 @@ import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.common.OnQuantityClickListener
import es.verdnatura.presentation.common.OnSaleClickListener
import es.verdnatura.presentation.common.OnTicketClickListener
import es.verdnatura.presentation.common.OnTicketColorListener
import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
import es.verdnatura.presentation.view.feature.sacador.model.SaleVO
class SaleAdapter(
private val items: List<SaleVO>,
private var items: MutableList<SaleVO>,
private val onPasillerosItemClickListener: OnPasillerosItemClickListener,
private val onQuantityClick: OnQuantityClickListener,
private val onSaleClickListener: OnSaleClickListener,
@ -33,8 +37,9 @@ class SaleAdapter(
private var onTicketClick: OnTicketClickListener? = null,
private var SaleAdapter: SaleAdapter? = null,
private var type: String? = null,
private var onTicketColorClickListener: OnTicketColorListener? = null
) : RecyclerView.Adapter<SaleAdapter.AjustesItemHolder>() {
) : RecyclerView.Adapter<SaleAdapter.AjustesItemHolder>() {
var context: Context? = null
var position: Int = 0
@ -396,8 +401,32 @@ class SaleAdapter(
} else {
View.GONE
}*/
println("sale ${sale.parkingCode} : ${sale.isAdvanced}")
//ASIGNAMOS VALOR A LA VSITA
ticketFk.setTextColor(
getColor(
context!!,
if (sale.isAdvanced != null && sale.isAdvanced == 1) {
R.color.verdnatura_red_salix
} else {
R.color.verdnatura_black
}
)
)
parkingCode.visibility = if (sale.parkingCode == null) GONE else VISIBLE
itemTicketColor.setOnClickListener {
onTicketColorClickListener?.onTicketColorListener(sale)
}
if (type == SACADOR || type == CONTROLADOR) {
itemTicketColor.tooltipText = context!!.getString(R.string.filterLevelColor)
}
/* ticketFk.paintFlags = ticketFk.paintFlags or Paint.UNDERLINE_TEXT_FLAG
itemArticleItemFk.paintFlags =
itemArticleItemFk.paintFlags or Paint.UNDERLINE_TEXT_FLAG*/
this.sale = sale
}
@ -468,4 +497,14 @@ class SaleAdapter(
// itemTicketColor.setBackgroundResource((R.drawable.rectangle))
}
fun updateSales(newSales: List<SaleVO>) {
items = newSales.toMutableList()
notifyDataSetChanged() // Notifica al adaptador que los datos han cambiado
}
fun orderSales(newSales: List<SaleVO>) {
notifyDataSetChanged() // Notifica al adaptador que los datos han cambiado
}
}

View File

@ -7,7 +7,6 @@ import android.graphics.drawable.Drawable
import android.view.LayoutInflater
import android.view.View
import android.view.View.GONE
import android.view.View.INVISIBLE
import android.view.View.VISIBLE
import android.view.ViewGroup
import androidx.core.content.ContextCompat.getColor
@ -20,6 +19,7 @@ import es.verdnatura.domain.ConstAndValues.PREITEMPICKERTEST
import es.verdnatura.domain.ConstAndValues.PREPARED
import es.verdnatura.domain.ConstAndValues.SACADOR
import es.verdnatura.domain.toast
import es.verdnatura.presentation.common.OnAddItemClickListener
import es.verdnatura.presentation.common.OnMistakeClickListener
import es.verdnatura.presentation.common.OnPackingClickSaleListener
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
@ -38,6 +38,7 @@ class SaleAdapterNew(
private var onTicketClick: OnTicketClickSaleListener? = null,
private var saleAdapter: SaleAdapterNew? = null,
private var onReserveSaleClick: OnSaleReserveClickListener? = null,
private var onAddItemClickListener: OnAddItemClickListener? = null,
private var type: String? = null,
) : RecyclerView.Adapter<SaleAdapterNew.AjustesItemHolder>() {
@ -70,7 +71,6 @@ class SaleAdapterNew(
) : RecyclerView.ViewHolder(binding.root) {
fun bind(sale: Sale) {
binding.apply {
// if (sale.reservedQuantity == null) sale.reservedQuantity = 0
val childLayoutManager =
LinearLayoutManager(context!!, RecyclerView.HORIZONTAL, false)
@ -148,12 +148,15 @@ class SaleAdapterNew(
layoutError.visibility = VISIBLE
txtError.text =
binding.root.context.getString(R.string.originalQuantity) + sale.originalQuantity
binding.addItem.visibility = VISIBLE
} else {
layoutError.visibility = GONE
binding.addItem.visibility = GONE
}
binding.deleteReserve.visibility = if (sale.isAdded == 1) VISIBLE else INVISIBLE
binding.deleteReserve.visibility = if (sale.isAdded == 1) VISIBLE else GONE
if (sale.isAdded == 1) {
layoutError.visibility = VISIBLE
@ -183,16 +186,7 @@ class SaleAdapterNew(
View.GONE
}
if (sale.isParent) {/* itemArticleItemFk.visibility = View.INVISIBLE
itemPackingText.visibility = View.INVISIBLE
itemPackingItemFk.visibility = View.INVISIBLE
itemArticleCel1.visibility = View.INVISIBLE
itemArticleCel2.visibility = View.INVISIBLE
itemArticleCel3.visibility = View.INVISIBLE
itemArticleQuantity.visibility = View.INVISIBLE
txtdeNew.visibility = View.INVISIBLE
itemArticleQuantityPicked.visibility = View.INVISIBLE
itemArticleQuantityLine3.visibility = View.VISIBLE*/
if (sale.isParent) {
packingTopicker.visibility = View.INVISIBLE
quantityReserved.visibility = View.INVISIBLE
itemArticleItemFkNew.visibility = View.INVISIBLE
@ -200,16 +194,7 @@ class SaleAdapterNew(
imageErrorMessage.visibility = View.INVISIBLE
ivArrow.visibility = View.VISIBLE
} else {/*itemArticleItemFk.visibility = View.VISIBLE
itemPackingText.visibility = View.VISIBLE
itemPackingItemFk.visibility = View.VISIBLE
itemArticleCel1.visibility = View.VISIBLE
itemArticleCel2.visibility = View.VISIBLE
itemArticleCel3.visibility = View.VISIBLE
itemArticleQuantity.visibility = View.VISIBLE
txtdeNew.visibility = View.VISIBLE
itemArticleQuantityPicked.visibility = View.VISIBLE
itemArticleQuantityLine3.visibility = View.VISIBLE*/
} else {
imageErrorMessage.visibility = View.GONE
if (type != SACADOR && type != PREITEMPICKERTEST) {
@ -326,9 +311,22 @@ class SaleAdapterNew(
if (sale.isPicked == 1) {
if (type == PREPARED) {
contentLayout.setBackgroundColor(
getColor(
context!!, R.color.verdnatura_orange_salix
)
if (sale.saleGroupFk == null) {
getColor(
context!!, R.color.verdnatura_orange_salix
)
} else {
if (sale.stateCode != null && sale.stateCode == "PREPARED") {
getColor(
context!!, R.color.verdnatura_orange_salix
)
} else {
getColor(
context!!, R.color.verdnatura_dark_sky_blue
)
}
}
)
} else {
contentLayout.setBackgroundColor(
@ -347,9 +345,12 @@ class SaleAdapterNew(
}
binding.itemParkingCode.text =
// if (type == PREITEMPICKERTEST) sale.parkingCodePrevia else sale.parkingCode
sale.parkingCodePrevia
// if (type == PREPARED) sale.parkingCodePrevia else sale.parkingCode
sale.parkingCode ?: sale.parkingCodePrevia
binding.addItem.setOnClickListener {
onAddItemClickListener!!.onAddItemClickListener(sale)
}
println("parkingCodePrevia ${sale.parkingCodePrevia}")
println("parkingCode ${sale.parkingCode}")

View File

@ -0,0 +1,362 @@
package es.verdnatura.presentation.view.feature.collection.fragment
import android.content.Context
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.map
import com.google.gson.JsonObject
import es.verdnatura.MobileApplication
import es.verdnatura.domain.SalixCallback
import es.verdnatura.domain.formatWithQuotes
import es.verdnatura.domain.toast
import es.verdnatura.domain.userCases.GetItemFromBarcodeUseCase
import es.verdnatura.presentation.base.BaseViewModel
import es.verdnatura.presentation.base.getMessageFromAllResponse
import es.verdnatura.presentation.base.nameofFunction
import es.verdnatura.presentation.common.Event
import es.verdnatura.presentation.common.PickupResponse
import es.verdnatura.presentation.common.SaleTrackingReplaceSalix
import es.verdnatura.presentation.common.TicketState
import es.verdnatura.presentation.view.feature.collection.SalixSaleQuantity
import es.verdnatura.presentation.view.feature.collection.mapper.map
import es.verdnatura.presentation.view.feature.sacador.model.CollectionVO
import es.verdnatura.presentation.view.feature.sacador.model.MistakeTypeListVO
import es.verdnatura.presentation.view.feature.sacador.model.MistakeTypeVO
import es.verdnatura.presentation.view.feature.workermistake.model.SaleMistakeSalix
import retrofit2.Response
class CollectionCheckerViewModel(val context: Context) : BaseViewModel(context) {
private val getItemFromBarcodeUseCase = GetItemFromBarcodeUseCase(salix)
//var isPaused: Boolean = false
private val _isPaused = MutableLiveData<Boolean>()
val isPaused: LiveData<Boolean> get() = _isPaused
private val _collectionTicketList by lazy { MutableLiveData<CollectionVO>() }
val collectionTicketList: LiveData<CollectionVO> = _collectionTicketList
val loadTicketList: LiveData<Event<CollectionVO>> = _collectionTicketList.map { Event(it) }
private val _responseSaleReplace by lazy { MutableLiveData<Boolean>() }
val responseSaleReplace: LiveData<Boolean> = _responseSaleReplace
val loadSaleReplace: LiveData<Event<Boolean>> = _responseSaleReplace.map { Event(it) }
private val _responseCollectionAddItem by lazy { MutableLiveData<Boolean>() }
val responseCollectionAddItem: LiveData<Boolean> = _responseCollectionAddItem
val loadResponseAddItem: LiveData<Event<Boolean>> = _responseCollectionAddItem.map { Event(it) }
private val _responsePrint by lazy { MutableLiveData<Boolean>() }
val responsePrint: LiveData<Boolean> = _responsePrint
val loadPrint: LiveData<Event<Boolean>> = _responsePrint.map { Event(it) }
private val _responseTicketState by lazy { MutableLiveData<TicketState>() }
val responseTicketState: LiveData<TicketState> = _responseTicketState
val loadTicketState: LiveData<Event<TicketState>> = _responseTicketState.map { Event(it) }
private val _responseTicketSetState by lazy { MutableLiveData<TicketState>() }
val responseTicketSetState: LiveData<TicketState> = _responseTicketSetState
val loadTicketSetState: LiveData<Event<TicketState>> = _responseTicketSetState.map { Event(it) }
private val _responseTicketIsPickup by lazy { MutableLiveData<Boolean>() }
val responseTicketIsPickup: LiveData<Boolean> = _responseTicketIsPickup
val loadTicketIsPickup: LiveData<Event<Boolean>> = _responseTicketIsPickup.map { Event(it) }
private val _responseTicketClosure by lazy { MutableLiveData<String>() }
val responseTicketClosure: LiveData<String> = _responseTicketClosure
val loadTicketClousure: LiveData<Event<String>> = _responseTicketClosure.map { Event(it) }
private val _responseCollectionUnchecked by lazy { MutableLiveData<String>() }
val responseCollectionUnchecked: LiveData<String> = _responseCollectionUnchecked
val loadCollectionUnchecked: LiveData<Event<String>> =
_responseCollectionUnchecked.map { Event(it) }
private val _responseNew by lazy { MutableLiveData<Boolean>() }
val responseNew: LiveData<Boolean> = _responseNew
val loadAddNew: LiveData<Event<Boolean>> = _responseNew.map { Event(it) }
private val _responseIncQuantity by lazy { MutableLiveData<Number>() }
val responseIncQuantity: LiveData<Number> = _responseIncQuantity
val loadIncQuantity: LiveData<Event<Number>> = _responseIncQuantity.map { Event(it) }
private val _responseParking by lazy { MutableLiveData<Boolean>() }
val responseParking: LiveData<Boolean> = _responseParking
val loadParking: LiveData<Event<Boolean>> = _responseParking.map { Event(it) }
private val _mistakeList by lazy { MutableLiveData<MistakeTypeListVO>() }
val mistakeList: LiveData<MistakeTypeListVO> = _mistakeList
val loadMistakes: LiveData<Event<MistakeTypeListVO>> = _mistakeList.map { Event(it) }
fun getSales(
collectionFk: Number, print: String, source: String
) {
salix.getSalesFromTicketOrCollection(
collectionOrTicketFk = collectionFk, print = print != "0", source = source
).enqueue(object : SalixCallback<CollectionVO>(context) {
override fun onError(t: Throwable) {
_collectionTicketList.value = CollectionVO(
0,
isError = true,
errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!)
)
}
override fun onSuccess(response: Response<CollectionVO>) {
try {
_collectionTicketList.value = response.body()?.let { it.map(context) }
} catch (ex: Exception) {
ex.toast(context)
}
}
})
}
fun collectionGetId(
ticketFk: Int, print: String, type: String
) {
salix.getCollectionId(
filter = """{"where":{"ticketFk":$ticketFk},"fields":"collectionFk"}"""
).enqueue(object : SalixCallback<List<JsonObject>>(context) {
override fun onError(t: Throwable) {
_collectionTicketList.value = CollectionVO(
0,
isError = true,
errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!)
)
}
override fun onSuccess(response: Response<List<JsonObject>>) {
if (response.body()!!.isNotEmpty()) {
getSales(
response.body()!![0].entrySet().first().value.toString().toInt(),
print,
type
)
} else {
_collectionTicketList.value = CollectionVO(
0, isError = false
)
}
}
})
}
fun saleTrackingUpdate(
saleFk: Int,
originalQuantity: Int,
code: String,
isChecked: String,
buyFk: Long,
isScanned: Boolean?
) {
salix.saleTrackingUpdate(
SaleTrackingReplaceSalix(
saleFk, originalQuantity, code, isChecked != "0", buyFk, isScanned!!
)
).enqueue(object : SalixCallback<Any>(context) {
override fun onSuccess(response: Response<Any>) {
_responseSaleReplace.value = true
}
override fun onError(t: Throwable) {
_responseSaleReplace.value = false
super.onError(t)
}
})
}
fun collectionStickerPrint(
collectionFk: Int, labelCount: Int?
) {
salix.collectionStickerPrint(
arrayListOf(
collectionFk, labelCount
)
).enqueue(object : SalixCallback<Any>(context) {
override fun onSuccess(response: Response<Any>) {
_responsePrint.value = true
}
})
}
fun collectionAddItem(
itemFk: Int, quantity: Int, ticketFk: Int
) {
salix.addSale(
id = ticketFk, barcode = itemFk.toString(), quantity = quantity
).enqueue(object : SalixCallback<Any>(context) {
override fun onError(t: Throwable) {
_responseNew.value = false
}
override fun onSuccess(response: Response<Any>) {
_responseNew.value = true
}
})
}
fun setParking(
ticketFk: Int, parking: String
) {
salix.setParking(arrayListOf(ticketFk, parking).formatWithQuotes())
.enqueue(object : SalixCallback<Any>(context) {
override fun onSuccess(response: Response<Any>) {
_responseParking.value = true
super.onSuccess(response)
}
})
}
fun ticketStateTodaySetState(
ticketFk: Int, state: String
) {
salix.ticketStateTodaySetState(arrayListOf(ticketFk, state).formatWithQuotes())
.enqueue(object : SalixCallback<Unit>(context) {
override fun onSuccess(response: Response<Unit>) {
_responseTicketSetState.value = TicketState(code = state, ticketFk = ticketFk)
super.onSuccess(response)
}
})
}
fun collectionIncreaseQuantitySalix(
saleFk: Int, quantity: String
) {
salix.collectionIncreaseQuantitySalix(
SalixSaleQuantity(saleId = saleFk, quantity = quantity.toInt())
).enqueue(object : SalixCallback<Any>(context) {
override fun onSuccess(response: Response<Any>) {
super.onSuccess(response)
_responseIncQuantity.value = saleFk
}
})
}
fun saleMistakeAdd(
saleFk: Int, typeFk: Int
) {
salix.saleMistakeAdd(
SaleMistakeSalix(
userFk = (context as MobileApplication).userId!!, saleFk = saleFk, typeFk = typeFk
)
).enqueue(object : SalixCallback<Any>(context) {
})
}
fun mistakeType() {
salix.getMistakeTypes().enqueue(object : SalixCallback<List<MistakeTypeVO>>(context) {
override fun onSuccess(response: Response<List<MistakeTypeVO>>) {
if (response.body() != null) {
_mistakeList.value = response.body()?.let { MistakeTypeListVO(it) }
} else {
val listError: ArrayList<MistakeTypeVO> = ArrayList()
listError.add(MistakeTypeVO(0, ""))
_mistakeList.value = MistakeTypeListVO(listError)
}
}
})
}
fun ticketIsOutClosureZone(
ticketFk: Int
) {
salix.ticketIsOutClosureZone(
arrayListOf(ticketFk)
).enqueue(object : SalixCallback<Any?>(context) {
override fun onSuccess(response: Response<Any?>) {
_responseTicketClosure.value = response.body()?.toString() ?: "false"
}
})
}
fun ticketState(
ticketFk: Int
) {
salix.ticketState(
"""{"where": {"ticketFk": "$ticketFk"},"include":[{"relation":"user","scope":{"fields":["username"]}}]}"""
).enqueue(object : SalixCallback<List<TicketState>>(context) {
override fun onSuccess(response: Response<List<TicketState>>) {
_responseTicketState.value = if (response.body()!!.isEmpty()) {
TicketState()
} else {
response.body()!![0]
}
}
})
}
fun ticketIsPickup(
ticketFk: Number
) {
salix.ticketIsPickup(
"""{
"where": {
"id": $ticketFk
},
"fields": ["id", "routeFk"],
"include": [
{
"relation": "route",
"scope": {
"fields": ["id", "agencyModeFk"],
"include": {
"relation": "agencyMode",
"scope": {
"fields": ["id", "deliveryMethodFk","code"],
"where": {"code": "REC_ALG"},
"include": {
"relation": "deliveryMethod",
"scope": {
"fields": ["id", "code"]
}
}
}
}
}
}
]
}""".trim()
).enqueue(object : SalixCallback<List<PickupResponse>>(context) {
override fun onSuccess(response: Response<List<PickupResponse>>) {
_responseTicketIsPickup.value =
response.body()
?.firstOrNull()?.route?.agencyMode?.deliveryMethod?.code == "PICKUP"
}
})
}
fun hasUncheckedTicket(
collectionFk: Int
) {
salix.hasUncheckedTicket(collectionFk).enqueue(object : SalixCallback<String>(context) {
override fun onSuccess(response: Response<String>) {
_responseCollectionUnchecked.value = response.body()!!.toString()
}
})
}
fun setPausedState(paused: Boolean) {
_isPaused.value = paused
}
}

View File

@ -1,6 +1,5 @@
package es.verdnatura.presentation.view.feature.collection.fragment
import android.app.AlertDialog
import android.content.Context
import android.graphics.drawable.Drawable
import android.media.MediaPlayer
@ -37,6 +36,7 @@ import es.verdnatura.domain.notNull
import es.verdnatura.domain.toast
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.ItemScanned
import es.verdnatura.presentation.common.LabelDialogHelper
import es.verdnatura.presentation.common.OnBarcodeRowClickListener
import es.verdnatura.presentation.common.OnMistakeClickListener
import es.verdnatura.presentation.common.OnOptionsSelectedListener
@ -410,7 +410,7 @@ class CollectionFragment(
if (!binding.scanInput.text.toString().isNullOrEmpty()) {
binding.mainToolbar.toolbarIcons.visibility = VISIBLE
//sergio:para ver si ha marcado dos veces el mismo ticket
binding.scanInput.setText(textScanned_filterDouble(binding.scanInput.text!!.toString()))
binding.scanInput.setText(textScannedFilterDouble(binding.scanInput.text!!.toString()))
//de momento solo está el qr de artículo
isScanned =
@ -969,7 +969,7 @@ class CollectionFragment(
myGroupList
},*/
saleAdapter = SaleAdapter(
myGroupList,
myGroupList as MutableList,
pasillerosItemClickListener!!,
object : OnQuantityClickListener {
@ -2035,7 +2035,7 @@ class CollectionFragment(
"" + totalMark + "/" + total
if (totalMark == sales.size) {
getString(R.string.Coleccióncompleta).toast(this.context, Toast.LENGTH_SHORT)
getString(R.string.completCollection).toast(this.context, Toast.LENGTH_SHORT)
saleAdapter!!.notifyDataSetChanged()
if (canChangeState) changeTicketState()
@ -2276,20 +2276,20 @@ class CollectionFragment(
}
}
if (isTicket) {
val builder = AlertDialog.Builder(context)
builder.setTitle(getString(R.string.selectLabeltoPrint))
val labelCount = arrayOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "10")
builder.setItems(labelCount) { dialog, which ->
viewModel.collectionStickerPrint(
collectionFk = collection.collectionFk, labelCount = (which + 1)
)
(getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey<String>(
PRINTERNAME
)).toast(requireContext())
val labelDialogHelper = LabelDialogHelper(requireContext())
labelDialogHelper.showLabelDialog(
onItemSelected = { labelCount ->
viewModel.collectionStickerPrint(
collectionFk = collection.collectionFk,
labelCount = labelCount
)
(getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey<String>(
PRINTERNAME
)).toast(requireContext())
}
)
}
val dialog = builder.create()
dialog.show()
} else {
viewModel.collectionStickerPrint(
collectionFk = collection.collectionFk, null

View File

@ -0,0 +1,870 @@
package es.verdnatura.presentation.view.feature.collection.fragment
import android.content.Context
import android.graphics.drawable.Drawable
import android.media.MediaPlayer
import android.os.Bundle
import android.text.InputType
import android.view.KeyEvent
import android.view.View
import android.view.WindowManager
import android.view.inputmethod.EditorInfo
import android.widget.EditText
import android.widget.ImageView
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.gson.Gson
import es.verdnatura.R
import es.verdnatura.databinding.FragmentCollectionNewBinding
import es.verdnatura.domain.ConstAndValues.BASEURLSALIX
import es.verdnatura.domain.ConstAndValues.SECTORFK
import es.verdnatura.domain.notNull
import es.verdnatura.domain.showToastCenterWithBackground
import es.verdnatura.domain.toast
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.ItemScanned
import es.verdnatura.presentation.common.OnBarcodeRowClickListener
import es.verdnatura.presentation.common.OnMistakeClickListener
import es.verdnatura.presentation.common.OnOptionsSelectedListener
import es.verdnatura.presentation.common.OnPackingClickSaleListener
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.common.OnSaleClickSaleListener
import es.verdnatura.presentation.common.OnTicketClickSaleListener
import es.verdnatura.presentation.common.ToolBarAdapterTooltip
import es.verdnatura.presentation.common.hideKeyboard
import es.verdnatura.presentation.common.itemScanIsQr
import es.verdnatura.presentation.common.itemScanValue
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.component.CustomDialogInput
import es.verdnatura.presentation.view.component.CustomDialogList
import es.verdnatura.presentation.view.component.CustomDialogThreeButtons
import es.verdnatura.presentation.view.feature.articulo.adapter.BarcodeAdapter
import es.verdnatura.presentation.view.feature.articulo.model.BarcodeVO
import es.verdnatura.presentation.view.feature.collection.ItemVO
import es.verdnatura.presentation.view.feature.collection.adapter.SaleAdapterNew
import es.verdnatura.presentation.view.feature.collection.mapper.map
import es.verdnatura.presentation.view.feature.main.activity.MainActivity
import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
import es.verdnatura.presentation.view.feature.sacador.model.CollectionTicket
import es.verdnatura.presentation.view.feature.sacador.model.Sale
import es.verdnatura.presentation.view.feature.sacador.model.SaleVO
import kotlinx.coroutines.runBlocking
import org.json.JSONObject
@Suppress("UNUSED_ANONYMOUS_PARAMETER")
class CollectionFragmentCheckerPreviousNew(
) : BaseFragment<FragmentCollectionNewBinding, CollectionViewModelCheckerPreviosNew>(
CollectionViewModelCheckerPreviosNew::class
) {
private var sales: List<Sale> = listOf()
private var saleAdapter: SaleAdapterNew? = null
private var lm: LinearLayoutManager? = null
private var storedPosition: Int = 0
private var pasillerosItemClickListener: OnPasillerosItemClickListener? = null
private lateinit var customDialogList: CustomDialogList
private var placementSupplyAdapter: BarcodeAdapter? = null
private var listPlacementSupply: ArrayList<BarcodeVO> = ArrayList()
private lateinit var customDialogInput: CustomDialogInput
private lateinit var customDialogThreeButtons: CustomDialogThreeButtons
private lateinit var customDialogThreeButtonsQuantity: CustomDialogThreeButtons
private var ticketSelected: Int = 0
private lateinit var customDialog: CustomDialog
var mperror: MediaPlayer? = null
var mpok: MediaPlayer? = null
private var storedBackPosition: Int = 0
private var tickets: ArrayList<String> = ArrayList()
private var lastScanned: Int = 0
private var positionUnmarked = -1
private var isScanned: Boolean? = null
private var positionConfirm = 0
private var quantityConfirm = 0
private lateinit var myGroupList: List<Sale>
private var quantityReserveToCheckItemScan = 0
private lateinit var collection: CollectionTicket
companion object {
fun newInstance(
) = CollectionFragmentCheckerPreviousNew()
}
override fun onAttach(context: Context) {
if (context is OnPasillerosItemClickListener) pasillerosItemClickListener = context
super.onAttach(context)
}
override fun getLayoutId(): Int = R.layout.fragment_collection_new
override fun onCreate(savedInstanceState: Bundle?) {
mperror = MediaPlayer.create((activity as MainActivity), R.raw.error)
mpok = MediaPlayer.create((activity as MainActivity), R.raw.ok)
super.onCreate(savedInstanceState)
}
override fun onResume() {
super.onResume()
scanRequest()
}
override fun init() {
customDialogList = CustomDialogList(requireContext())
customDialogInput = CustomDialogInput(requireContext())
customDialog = CustomDialog(requireContext())
customDialogThreeButtons = CustomDialogThreeButtons(requireContext())
customDialogThreeButtonsQuantity = CustomDialogThreeButtons(requireContext())
ma.hideBottomNavigation(View.GONE)
setEvents()
setToolBar()
if (::collection.isInitialized) {
viewModel.getCollectionTickets(
collection.collectionFk, print = false
)
}
super.init()
}
private fun setToolBar() {
binding.mainToolbar.toolbarSubtitle.visibility = View.VISIBLE
binding.mainToolbar.toolbarIcons.visibility = View.VISIBLE
binding.mainToolbar.backButton.visibility = View.VISIBLE
binding.mainToolbar.toolbarTitle.text = getString(R.string.preControlNew)
val listIcons: ArrayList<ImageView> = ArrayList()
val iconAdd = ImageView(context)
iconAdd.setImageResource(R.drawable.ic_playlist_add_black_24dp)
val iconParking = ImageView(context)
iconParking.setImageResource(R.drawable.ic_local_parking_black_24dp)
val iconUpdate = ImageView(context)
iconUpdate.setImageResource(R.drawable.ic_autorenew_black_24dp)
iconAdd.tooltipText = getTooltip(R.drawable.ic_playlist_add_black_24dp)
iconParking.tooltipText = getTooltip(R.drawable.ic_local_parking_black_24dp)
iconUpdate.tooltipText = getTooltip(R.drawable.ic_autorenew_black_24dp)
listIcons.add(iconAdd)
listIcons.add(iconParking)
listIcons.add(iconUpdate)
binding.mainToolbar.toolbarIcons.adapter =
ToolBarAdapterTooltip(listIcons, object : OnOptionsSelectedListener {
override fun onOptionsItemSelected(item: Drawable) {
when (item) {
iconAdd.drawable -> addItem()
iconUpdate.drawable -> updateScreen()
iconParking.drawable -> pasillerosItemClickListener?.onPasillerosItemClickListener(
PasillerosItemVO(
title = R.string.Parking
), ""
)
}
}
})
binding.mainToolbar.toolbarIcons.layoutManager =
LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
}
private fun updateScreen() {
viewModel.getCollectionTickets(
collection.collectionFk, print = false
)
}
private fun scanRequest() {
binding.scanInput.requestFocus()
hideKeyboards()
}
private fun setEvents() {
binding.mainToolbar.backButton.setOnClickListener {
ma.onMyBackPressed()
}
//ESCANER =========
binding.scanInput.requestFocus()
binding.scanInput.setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {//ID=0 ACTION_NEXT ID=5 ACTION_UNESPECEFIED)
if (binding.scanInput.text.toString().isNotEmpty()) {
binding.scanInput.setText(textScannedFilterDouble(binding.scanInput.text!!.toString()))
isScanned =
event != null && event.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER
if (itemScanIsQr(binding.scanInput.text.toString())) {
val myQr = ItemScanned(JSONObject(binding.scanInput.text.toString()))
when (myQr.table) {
"saleGroup" -> {
binding.scanInput.setText(myQr.id.toString())
}
"buy" -> binding.scanInput.setText(myQr.more)
}
} else {
ma.hideKeyboard(binding.scanInput)
if (::collection.isInitialized) {
findSale(binding.scanInput.text.toString())
} else {
viewModel.getCollectionTickets(
collectionFk = binding.scanInput.text.toString().toLong(), false
)
}
}
}
binding.scanInput.setText("")
hideKeyboards()
return@setOnEditorActionListener true
}
true
}
hideKeyboards()
//LISTA =========
binding.collectionSwipe.setOnRefreshListener {
binding.collectionSwipe.isRefreshing = false
updateScreen()
binding.collectionSwipe.isRefreshing = false
}
}
private fun hideKeyboards() {
try {
requireActivity().hideKeyboard()
} catch (e: Exception) {
println(e.message)
}
}
override fun observeViewModel() {
with(viewModel) {
loadCollectionTicketSalix.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled().notNull {
if (!it.isError) {
if (it.tickets.isNotEmpty()) {
collection = it
createCollectionList()
} else {
binding.mainToolbar.toolbarSubtitle.text = "0/0"
}
} else {
customDialog.setTitle(getString(R.string.error))
.setDescription(it.errorMessage)
.setOkButton(getString(R.string.accept)) {
customDialog.dismiss()
if (activity != null) ma.onMyBackPressed()
}.show()
}
}
}
loadExistsResponse.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled().notNull {
if (it.exists) {
markLine(it.position, it.quantity, true)
} else {
getString(R.string.updateSalesReserve).toast(
requireContext()
)
viewModel.getCollectionTickets(collection.collectionFk, false)
}
}
}
loadResponseAddItem.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled().notNull {
updateScreen()
}
}
loadPicked.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled().notNull {
myGroupList[positionConfirm].isPicked = 1
saleAdapter!!.notifyItemChanged(positionConfirm)
lm!!.scrollToPositionWithOffset(positionConfirm, 0)
//lm!!.scrollToPositionWithOffset(storedBackPosition + 1, 0)
setTotalLines()
}
}
loadUnpicked.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled().notNull {
myGroupList[positionUnmarked].isPicked = 0
myGroupList[positionUnmarked].reservedQuantity = quantityConfirm
saleAdapter!!.notifyItemChanged(positionUnmarked)
lm!!.scrollToPositionWithOffset(positionUnmarked, 0)
}
}
responseCode.observe(viewLifecycleOwner) {
if (it == null) {
showErrorMessage(text = getString(R.string.codeNotExist))
if (mperror != null) mperror?.start()
} else {
if (checkItemScan(it.toString(), positionConfirm)) {
scanRequest()
customDialogList.dismiss()
mpok?.start()
markLine(positionConfirm, quantityReserveToCheckItemScan, false)
} else {
customDialogList.setValueTwo("")
showErrorMessage(text = getString(R.string.lineNotExist))
if (mperror != null) mperror?.start()
}
}
}
}
}
private fun createCollectionList() {
binding.mainToolbar.toolbarTitle.text = collection.collectionFk.toString()
collection.map(requireContext())
val salesList: ArrayList<Sale> = ArrayList()
tickets = ArrayList()
var observations = ""
collection.tickets.forEach { ticket ->
if (observations.isNotEmpty()) observations = observations + " " + ticket.observations
ticket.sales.forEach { sale ->
salesList.add(sale)
}
}
myGroupList =
salesList.sortedWith(compareBy<Sale> { it.pickingOrderPrevia }.thenBy { it.itemFk })
saleAdapter = SaleAdapterNew(myGroupList, pasillerosItemClickListener!!,
object : OnSaleClickSaleListener {
override fun onSaleClick(sale: Sale) {
val position =
myGroupList.indexOfFirst { it.itemShelvingSaleFk == sale.itemShelvingSaleFk }
if (position > -1) {
if (sale.isPicked == 1) {
unMarkLine(position, myGroupList[position])
} else {
showScanner(position, sale)
}
}
}
}, object : OnMistakeClickListener {
override fun onMistakeClickListener(sale: SaleVO) {
}
}, object : OnPackingClickSaleListener {
override fun onPackingClick(sale: Sale) {
if (!sale.code.isNullOrEmpty()) ma.onPasillerosItemClickListener(
PasillerosItemVO(
title = R.string.titleUbicator,
), entryPoint = sale.code
)
}
}, object : OnTicketClickSaleListener {
override fun onTicketClickListener(sale: Sale) {
val entryPoint = Gson().toJson(
mutableMapOf(
"entryPoint" to sale.ticketFk, "web" to "${
mobileApplication.dataStoreApp.readDataStoreKey<String>(
BASEURLSALIX
)
}/#!/ticket/${sale.ticketFk}/sale"
)
)
ma.onPasillerosItemClickListener(
PasillerosItemVO(
title = R.string.titleWebViewer,
), entryPoint = entryPoint
)
}
}, type = "PRESACADOR"
)
lm = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
binding.fragmentSacadorCollections.adapter = saleAdapter
binding.fragmentSacadorCollections.layoutManager = lm
setTotalLines()
setListPosition()
setScrollListener(lm!!)
printObservations(observations)
}
private fun setScrollListener(lm: LinearLayoutManager) {
binding.fragmentSacadorCollections.clearOnScrollListeners()
binding.fragmentSacadorCollections.addOnScrollListener(object :
RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
// storedBackPosition = lm.findFirstVisibleItemPosition()
storedPosition = lm.findFirstVisibleItemPosition()
super.onScrolled(recyclerView, dx, dy)
}
})
}
private fun printObservations(observations: String) {
if (observations.trim().isNotEmpty()) {
customDialog.setTitle(getString(R.string.observations)).setDescription(observations)
.setOkButton(getString(R.string.accept)) {
customDialog.hide()
customDialog.dismiss()
}.show()
}
}
private fun findSale(txtscan: String) {
/*
for (tickets in collection.tickets) {
//0-Salegroup
for (sale in tickets.sales){
if (sale == "0") {
//1- Por itemFk
if (txtscan == saleVO.itemFk.toString()) {
if (mpok != null) mpok!!.start()
isOk = true
markLine(index, type)
break
}
//2- Por barcode
if (saleVO.barcodes.isNotEmpty())
saleVO.barcodes.forEach { barcode ->
if (txtscan == barcode) {
if (mpok != null) mpok!!.start()
isOk = true
markLine(index, type)
isBreak = true
}
}
if (isBreak) break
}
index += 1
}
*/
}
private fun findSale(txtscan: String, position: Int, sale: Sale) {
storedPosition = position
if (sale.code!!.uppercase() == txtscan.uppercase()) {
mpok!!.start()
printShelvingResult(position)
} else {
mperror!!.start()
}
}
private fun markLine(position: Int, quantity: Int, isItemShelvingSaleEmpty: Boolean?) {
isScanned = null
positionConfirm = position
quantityConfirm = quantity
runBlocking {
val sectorFk = mobileApplication.dataStoreApp.readDataStoreKey<Int>(SECTORFK)
viewModel.itemShelvingSaleSetQuantity(
myGroupList[position].itemShelvingSaleFk,
quantity,
isItemShelvingSaleEmpty = isItemShelvingSaleEmpty,
sectorFk = if (sectorFk == -1) null else sectorFk,
shelvingFk = myGroupList[position].code!!
)
}
// storedBackPosition = position
}
private fun setListPosition() {
//if (storedPosition == 0 && storedBackPosition == 0) { // se inicia lista, se busca porqué item vamos.
if (storedPosition == 0) {
for (indice in myGroupList.indices) {
if (myGroupList[indice].isPicked == 0) {
//storedPosition = indice
lm!!.scrollToPositionWithOffset(indice - 1, 0)
break
}
}
} else {
// lm!!.scrollToPositionWithOffset(storedBackPosition, 0)
lm!!.scrollToPositionWithOffset(storedPosition, 0)
}
}
private fun unMarkLine(position: Int, sale: Sale) {
customDialog.setTitle(getString(R.string.unmarkLine)).setDescription(
getString(R.string.goUnmark) + sale.itemFk + getString(
R.string.sure
)
).setOkButton(getString(R.string.unmark)) {
if (!sale.isParent && sale.reservedQuantity == 0 && sale.originalQuantity != sale.saleQuantity) {
getString(R.string.unmarkError).toast(requireContext())
} else {
//storedBackPosition = position
//storedPosition = position
// setListPosition()
viewModel.itemShelvingSaleUnpicked(myGroupList[position].itemShelvingSaleFk)
sale.isPicked = 0
positionUnmarked = position
setTotalLines()
scanRequest()
}
customDialog.dismiss()
}.setKoButton(getString(R.string.cancel)) {
scanRequest()
customDialog.dismiss()
}.show()
}
private fun printShelvingResult(pos: Int) {
storedPosition = pos
customDialogList.getEditTextTwo().inputType = InputType.TYPE_CLASS_TEXT
customDialogList.getEditTextTwo().setRawInputType(InputType.TYPE_CLASS_NUMBER)
customDialogList.getEditText().setRawInputType(InputType.TYPE_CLASS_NUMBER)
customDialogList.getEditTextTwo().requestFocus()
val shelving = myGroupList[pos].code
val item = myGroupList[pos].itemFk
val longName = myGroupList[pos].longName
val totalReserved = myGroupList[pos].reservedQuantity
try {
customDialogList.setTitle("$shelving($item) $totalReserved de $longName").setOkButton(
getString(
R.string.take
)
) {
customDialogTakeAction(pos, totalReserved, false)
}.setKoButton(getString(R.string.close)) {
requireActivity().hideKeyboard(customDialogList.getEditTextTwo())
customDialogList.dismiss()
scanRequest()
}.setHintValue(getString(R.string.quantitySelect)).setValue(totalReserved.toString())
.setHintValueTwo(getString(R.string.scanItem)).setValueTwo("").show()
customDialogList.getEditTextTwo().setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {
customDialogTakeAction(
pos,
totalReserved,
event != null && event.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER
)
return@setOnEditorActionListener true
}
false
}
} catch (e: Exception) {
ma.messageWithSound(e.message.toString(), isError = true, true)
}
}
private fun customDialogTakeAction(
position: Int, totalReserved: Int, isItemScanned: Boolean?
) {
isScanned = isItemScanned
if (customDialogList.getValueTwo().isNotEmpty()) {
customDialogList.setValueTwo(
itemScanValue(
customDialogList.getValueTwo(), arrayOf("buy"), "more"
).toString()
)
val quantityToReserve = customDialogList.getValue().toInt()
if (quantityToReserve < totalReserved) {
if (customDialogList.getValueTwo() in myGroupList[position].Barcodes || customDialogList.getValueTwo() == myGroupList[position].itemFk.toString()) {
customDialogList.dismiss()
showQuestionUbicationEmpty(position, quantityToReserve)
} else {
ma.messageWithSound(
message = getString(R.string.errorItem),
isError = true,
isPlayed = true,
isToasted = false
)
}
}
if (quantityToReserve > totalReserved) {
ma.hideKeyboard(customDialogList.getEditTextTwo())
getString(R.string.quantityHigh).toast(requireContext())
}
if (quantityToReserve == totalReserved) {
try {
if (checkItemScan(customDialogList.getValueTwo(), position)) {
markLine(position, quantityToReserve, false)
mpok?.start()
ma.hideKeyboard(customDialogList.getEditTextTwo())
customDialogList.dismiss()
requireContext().showToastCenterWithBackground(myGroupList[position].ticketFk.toString())
scanRequest()
} else {
quantityReserveToCheckItemScan = quantityToReserve
viewModel.getIdFromCodeSalix(
code = customDialogList.getValueTwo(),
)
customDialogList.dismiss()
}
} catch (ex: Exception) {
getString(R.string.errorInput).toast(requireContext())
}
}
} else {
getString(R.string.scanItemValidate).toast(requireContext())
}
}
private fun checkItemScan(valueToCheck: String, position: Int): Boolean {
println("CheckItemScan $valueToCheck")
val saleToCheck = myGroupList[position]
println("CheckItemScan saleTocheck$saleToCheck")
println("CheckItemScan saleTocheck Item ${saleToCheck.itemFk}")
println("CheckItemScan saleTocheck ItemBarcodes ${saleToCheck.Barcodes}")
if (saleToCheck.itemFk.toString() == valueToCheck) return true
else {
saleToCheck.Barcodes.forEach { barcode ->
if (barcode == valueToCheck) return true
}
}
return false
}
private fun showQuestionUbicationEmpty(position: Int, quantity: Int = 0) {
customDialogThreeButtonsQuantity.setTitle(
getString(
R.string.changeQuantity, quantity, myGroupList[position].itemFk
)
).setDescription(getString(R.string.questionItemShelving, myGroupList[position].itemFk))
.setValue("").setCustomDialogValue(View.GONE)
customDialogThreeButtonsQuantity.setOkButtonAdd(text = getString(R.string.yes)) {
scanRequest()
customDialogThreeButtonsQuantity.dismiss()
getString(R.string.errorQuantityShelving).toast(requireContext())
customDialogThreeButtonsQuantity.dismiss()
showQuestionUbicationEmpty(position, quantity)
}.setOkButtonTwo(getString(R.string.no)) {
scanRequest()
customDialogThreeButtonsQuantity.dismiss()
if (quantity == 0) {
viewModel.itemShelvingSaleExists(
myGroupList[position].itemShelvingSaleFk, position, quantity
)
} else {
markLine(position, quantity, true)
}
}.setKoButton(getString(R.string.cancel)) {
scanRequest()
customDialogThreeButtonsQuantity.dismiss()
}.show()
customDialogThreeButtons.setFocusDialogValue()
}
private fun addItem() {
listPlacementSupply = ArrayList()
collection.tickets.forEach {
listPlacementSupply.add(BarcodeVO(code = it.ticketFk.toString()))
}
if (listPlacementSupply.size == 1) {
ticketSelected = listPlacementSupply[0].code!!.toInt()
}
customDialogList.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
customDialogList.getEditTextTwo().inputType = InputType.TYPE_CLASS_NUMBER
customDialogList.getEditText().setRawInputType(InputType.TYPE_CLASS_NUMBER)
customDialogList.setTitle(getString(R.string.Agregarartículoparaticket) + " " + ticketSelected)
.setOkButton(getString(R.string.Agregar)) {
customDialogAddItem()
}.setKoButton(getString(R.string.close)) {
scanRequest()
customDialogList.dismiss()
}.setHintValue(getString(R.string.Artículo)).setValue("")
.setHintValueTwo(getString(R.string.Cantidad)).setValueTwo("").show()
customDialogList.getEditText().requestFocus()
requireActivity().hideKeyboard()
customDialogList.getEditText().setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {
if (customDialogList.getValue().isNotEmpty()) {
try {
customDialogList.setValue(
itemScanValue(
customDialogList.getValue(), arrayOf("buy"), "more"
).toString()
)
} catch (e: Exception) {
ma.messageWithSound(e.message.toString(), isError = true, true)
}
customDialogList.getEditTextTwo().requestFocus()
}
return@setOnEditorActionListener true
}
false
}
customDialogList.getEditTextTwo().setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {
customDialogAddItem()
return@setOnEditorActionListener true
}
false
}
placementSupplyAdapter =
BarcodeAdapter(listPlacementSupply, object : OnBarcodeRowClickListener {
override fun onBarcodeRowClickListener(item: BarcodeVO) {
customDialogInput.setTitle(getString(R.string.ArtículoparaTicket) + " " + item.code!!)
ticketSelected = item.code!!.toInt()
customDialogList.setTitle(getString(R.string.Agregarartículoparaticket) + " " + ticketSelected)
}
}, showDelete = false)
customDialogList.getRecyclerView().adapter = placementSupplyAdapter
customDialogList.getRecyclerView().layoutManager =
LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
}
private fun customDialogAddItem() {
if (customDialogList.getValueTwo().isNotEmpty()) {
if (ticketSelected == 0) {
getString(R.string.Seleccionaunticketdelaista).toast(requireContext())
} else if (customDialogList.getValue().isEmpty() || customDialogList.getValueTwo()
.isEmpty()
) {
getString(R.string.Todosloscampossonobligatorios).toast(requireContext())
} else {
val saleGroupSelected =
collection.tickets.find { it.ticketFk == ticketSelected }?.sales?.get(0)?.saleGroupFk
?: 0
runBlocking {
viewModel.collectionAddWithReservation(
customDialogList.getValue().toInt(),
customDialogList.getValueTwo().toInt(),
ticketSelected,
saleGroupFk = saleGroupSelected,
sectorFk = mobileApplication.dataStoreApp.readDataStoreKey<Int>(SECTORFK)
)
}
customDialogList.dismiss()
hideKeyboards()
scanRequest()
}
} else {
getString(R.string.scanItem).toast(requireContext())
}
}
private fun toastDisponibility(item: ItemVO) {
if (item.available.isEmpty()) {
item.available = "0"
}
customDialog.setTitle(getString(R.string.itemPoints) + item.id)
.setDescription(getString(R.string.available) + ":" + item.available)
.setOkButton(getString(R.string.accept)) {
scanRequest()
customDialog.dismiss()
}.show()
}
private fun setTotalLines() {
val totalMark = myGroupList.count { it.isPicked == 1 }
binding.mainToolbar.toolbarTitle.text =
if (collection.collectionFk != 0) collection.collectionFk.toString() else ""
binding.mainToolbar.toolbarSubtitle.text =
getString(R.string.totalsPicker, totalMark, myGroupList.size)
if (totalMark == myGroupList.size) {
getString(R.string.completCollection).toast(this.context, Toast.LENGTH_SHORT)
viewModel.saleTrackingAddPrevOK(collection.collectionFk)
}
}
private fun showScanner(index: Int, sale: Sale) {
customDialogInput.getEditText().inputType = InputType.TYPE_CLASS_TEXT
customDialogInput.setTitle("" + sale.itemFk)
.setDescription(getString(R.string.scanWagonForItem))
.setOkButton(getString(R.string.accept)) {
findSaleAction(index, sale)
}.setKoButton(getString(R.string.cancel)) {
closeCustomDialog(binding.scanInput, customDialogInput)
}.setValue("").show()
customDialogInput.getEditText().setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0) {
findSaleAction(index, sale)
return@setOnEditorActionListener false
}
false
}
customDialogInput.getEditText().requestFocus()
}
private fun findSaleAction(index: Int, sale: Sale) {
if (customDialogInput.getValue().isNotEmpty()) {
findSale(customDialogInput.getValue(), index, sale)
}
closeCustomDialog(binding.scanInput, customDialogInput)
}
private fun closeCustomDialog(scanInput: EditText, customDialogInput: CustomDialogInput) {
requireContext().hideKeyboard(customDialogInput.getEditText())
scanInput.requestFocus()
customDialogInput.dismiss()
scanInput.requestFocus()
}
private fun showErrorMessage(title: String = getString(R.string.errorMarkLine), text: String) {
customDialog.setTitle(title).setDescription(text).setKoButton(getString(R.string.close)) {
customDialog.dismiss()
}.show()
}
}

View File

@ -1,6 +1,5 @@
package es.verdnatura.presentation.view.feature.collection.fragment
import android.app.AlertDialog
import android.content.Context
import android.graphics.drawable.Drawable
import android.media.MediaPlayer
@ -38,6 +37,7 @@ import es.verdnatura.domain.notNull
import es.verdnatura.domain.toast
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.ItemScanned
import es.verdnatura.presentation.common.LabelDialogHelper
import es.verdnatura.presentation.common.OnBarcodeRowClickListener
import es.verdnatura.presentation.common.OnMistakeClickListener
import es.verdnatura.presentation.common.OnOptionsSelectedListener
@ -46,6 +46,7 @@ import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.common.OnQuantityClickListener
import es.verdnatura.presentation.common.OnSaleClickListener
import es.verdnatura.presentation.common.OnTicketClickListener
import es.verdnatura.presentation.common.OnTicketColorListener
import es.verdnatura.presentation.common.ToolBarAdapterTooltip
import es.verdnatura.presentation.common.hideKeyboard
import es.verdnatura.presentation.common.itemScanIsQr
@ -126,11 +127,14 @@ class CollectionFragmentPicker(
private var recylerViewState: Parcelable? = null
private var isScanned: Boolean? = null
private var myPosition: Int = 0
private var changePosition = false
private lateinit var myGroupList: List<SaleVO>
private var canChangeState = true
private var isVerifiedCollection = false
private var hasFilterByLevel = false
companion object {
fun newInstance(collection: CollectionVO, type: String) =
CollectionFragmentPicker(collection, type)
@ -293,7 +297,6 @@ class CollectionFragmentPicker(
SACADOR -> {
//jose antonio
myPosition = myGroupList.indexOfFirst { it.saleGroupFk == saleGroupScanned }
println("previa $saleGroupScanned posicion $myPosition")
viewModel.saleTrackingAddPreparedSaleGroup(
saleGroupScanned.toInt()
)
@ -377,7 +380,7 @@ class CollectionFragmentPicker(
if (!binding.scanInput.text.toString().isNullOrEmpty()) {
//sergio:para ver si ha marcado dos veces el mismo ticket
binding.scanInput.setText(textScanned_filterDouble(binding.scanInput.text!!.toString()))
binding.scanInput.setText(textScannedFilterDouble(binding.scanInput.text!!.toString()))
//de momento solo está el qr de artículo
isScanned =
@ -841,7 +844,7 @@ class CollectionFragmentPicker(
} else {
// pintar línea
saleAdapter!!.notifyDataSetChanged()
myPosition = storedPosition
myPosition = storedBackPosition
ReviewQuantityForRefreshingAndSorting(
sales[storedPosition].quantity!!.toInt(),
@ -926,7 +929,7 @@ class CollectionFragmentPicker(
}
saleAdapter = SaleAdapter(
myGroupList,
myGroupList as MutableList,
pasillerosItemClickListener!!,
object : OnQuantityClickListener {
@ -1001,17 +1004,25 @@ class CollectionFragmentPicker(
}
}
},
type = type
type = type,
onTicketColorClickListener = object : OnTicketColorListener {
override fun onTicketColorListener(sale: SaleVO) {
hasFilterByLevel = !hasFilterByLevel
if (hasFilterByLevel) {
saleAdapter!!.updateSales(myGroupList.filter { it.level == sale.level } as MutableList)
myGroupList = myGroupList.filter { it.level == sale.level }
} else {
createCollectionList()
}
}
}
)
lm = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
binding.fragmentSacadorCollections.adapter = saleAdapter
binding.fragmentSacadorCollections.layoutManager = lm
setTotalLines()
//Tarea #4628
@ -1111,6 +1122,7 @@ class CollectionFragmentPicker(
RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
storedBackPosition = lm.findFirstVisibleItemPosition()
myPosition = lm.findFirstVisibleItemPosition()
super.onScrolled(recyclerView, dx, dy)
}
})
@ -1368,7 +1380,7 @@ class CollectionFragmentPicker(
}
//nuevo
var mySale = sales[position].saleFk
val mySale = sales[position].saleFk
for (indice in myGroupList.indices) {
if (!myGroupList[indice].isParent && myGroupList[indice].saleFk == mySale) {
@ -1533,11 +1545,11 @@ class CollectionFragmentPicker(
if (!myGroupList[indice].isParent && myGroupList[indice].saleFk == mySale) {
storedBackPosition = indice
myPosition = storedBackPosition
}
}
storedBackPosition = position
myPosition = position
setListPosition(position, false)
if (type != PRECHECKER) {
@ -2075,7 +2087,7 @@ class CollectionFragmentPicker(
"" + totalMark + "/" + total
if (totalMark == sales.size) {
getString(R.string.Coleccióncompleta).toast(this.context, Toast.LENGTH_SHORT)
getString(R.string.completCollection).toast(this.context, Toast.LENGTH_SHORT)
saleAdapter!!.notifyDataSetChanged()
if (!goBack) ticketCollection_setUsedShelves()
@ -2341,20 +2353,19 @@ class CollectionFragmentPicker(
}
}
if (isTicket) {
val builder = AlertDialog.Builder(context)
builder.setTitle(getString(R.string.selectLabeltoPrint))
val labelCount = arrayOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "10")
builder.setItems(labelCount) { dialog, which ->
viewModel.collectionStickerPrint(
collectionFk = collection.collectionFk, labelCount = (which + 1)
)
(getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey<String>(
PRINTERNAME
)).toast(requireContext())
val labelDialogHelper = LabelDialogHelper(requireContext())
labelDialogHelper.showLabelDialog(
onItemSelected = { labelCount ->
viewModel.collectionStickerPrint(
collectionFk = collection.collectionFk,
labelCount = labelCount
)
}
val dialog = builder.create()
dialog.show()
(getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey<String>(
PRINTERNAME
)).toast(requireContext())
}
)
} else {
viewModel.collectionStickerPrint(
collectionFk = collection.collectionFk, null

View File

@ -1,6 +1,5 @@
package es.verdnatura.presentation.view.feature.collection.fragment
import android.app.AlertDialog
import android.content.Context
import android.graphics.drawable.Drawable
import android.media.MediaPlayer
@ -27,6 +26,7 @@ import es.verdnatura.domain.notNull
import es.verdnatura.domain.toast
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.ItemScanned
import es.verdnatura.presentation.common.LabelDialogHelper
import es.verdnatura.presentation.common.OnBarcodeRowClickListener
import es.verdnatura.presentation.common.OnMistakeClickListener
import es.verdnatura.presentation.common.OnOptionsSelectedListener
@ -259,7 +259,7 @@ class CollectionFragmentPickerNew(
binding.scanInput.setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {//ID=0 ACTION_NEXT ID=5 ACTION_UNESPECEFIED)
if (binding.scanInput.text.toString().isNotEmpty()) {
binding.scanInput.setText(textScanned_filterDouble(binding.scanInput.text!!.toString()))
binding.scanInput.setText(textScannedFilterDouble(binding.scanInput.text!!.toString()))
isScanned =
event != null && event.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER
if (itemScanIsQr(binding.scanInput.text.toString())) {
@ -405,29 +405,6 @@ class CollectionFragmentPickerNew(
}
responseConfirmReservedItemShelvingSale.observe(viewLifecycleOwner) {
myGroupList[positionConfirm].isPicked = 1
saleAdapter!!.notifyDataSetChanged()
lm!!.scrollToPositionWithOffset(storedPosition, 0)
/* viewModel.collectionTicketGetSalix(
collection.collectionFk, print = false
)*/
}
/*
responseItemShelvingSale.observe(viewLifecycleOwner) {
myGroupList[positionConfirm].isPicked = 1
myGroupList[positionConfirm].reservedQuantity = quantityConfirm
viewModel.collectionTicketGetSalix(
collection.collectionFk, print = false
)
lm!!.scrollToPositionWithOffset(positionConfirm, 0)
ma.messageWithSound(
getString(R.string.operationSuccess), it.isError, !it.isError, isToasted = false
)
}*/
loadUnpicked.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled().notNull {
@ -439,6 +416,18 @@ class CollectionFragmentPickerNew(
}
}
loadPicked.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled().notNull {
if (it) {
myGroupList[positionConfirm].isPicked = 1
saleAdapter!!.notifyItemChanged(positionConfirm)
lm!!.scrollToPositionWithOffset(positionConfirm, 0)
setTotalLines()
} else {
updateScreen()
}
}
}
responseItemShelvingSaleGroup.observe(viewLifecycleOwner) {
viewModel.collectionTicketGetSalix(
@ -658,7 +647,10 @@ class CollectionFragmentPickerNew(
isMarking = true
viewModel.itemShelvingSaleSetQuantity(
myGroupList[position].itemShelvingSaleFk, quantity, isItemShelvingSaleEmpty
myGroupList[position].itemShelvingSaleFk,
quantity,
isItemShelvingSaleEmpty,
shelvingFk = myGroupList[position].code!!
)
val mySale = sales[position].itemShelvingSaleFk
@ -869,22 +861,7 @@ class CollectionFragmentPickerNew(
}.setOkButtonTwo(getString(R.string.no)) {
scanRequest()
customDialogThreeButtonsQuantity.dismiss()
viewModel.itemShelvingSaleExists(
myGroupList[position].itemShelvingSaleFk,
myGroupList[position].itemShelvingFk,
position,
quantity
)
/* if (quantity == 0) {
viewModel.itemShelvingSaleExists(
myGroupList[position].itemShelvingSaleFk,
myGroupList[position].itemShelvingFk,
position,
quantity
)
} else {
markLine(position, quantity, true)
}*/
markLine(position, quantity, true)
}.setKoButton(getString(R.string.cancel)) {
scanRequest()
customDialogThreeButtonsQuantity.dismiss()
@ -1045,7 +1022,7 @@ class CollectionFragmentPickerNew(
getString(R.string.totalsPicker, totalMark, total)
if (totalMark == sales.size) {
getString(R.string.Coleccióncompleta).toast(this.context, Toast.LENGTH_SHORT)
getString(R.string.completCollection).toast(this.context, Toast.LENGTH_SHORT)
saleAdapter!!.notifyDataSetChanged()
changeTicketState()
@ -1108,20 +1085,19 @@ class CollectionFragmentPickerNew(
}
}
if (isTicket) {
val builder = AlertDialog.Builder(context)
builder.setTitle(getString(R.string.selectLabeltoPrint))
val labelCount = arrayOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "10")
builder.setItems(labelCount) { dialog, which ->
viewModel.collectionStickerPrint(
collectionFk = collection.collectionFk, labelCount = (which + 1)
)
(getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey<String>(
PRINTERNAME
)).toast(requireContext())
val labelDialogHelper = LabelDialogHelper(requireContext())
labelDialogHelper.showLabelDialog(
onItemSelected = { labelCount ->
viewModel.collectionStickerPrint(
collectionFk = collection.collectionFk,
labelCount = labelCount
)
}
val dialog = builder.create()
dialog.show()
(getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey<String>(
PRINTERNAME
)).toast(requireContext())
}
)
} else {
viewModel.collectionStickerPrint(
collectionFk = collection.collectionFk, null

View File

@ -1,42 +1,41 @@
package es.verdnatura.presentation.view.feature.collection.fragment
import android.app.AlertDialog
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.graphics.drawable.GradientDrawable
import android.media.MediaPlayer
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.text.InputType
import android.view.Gravity
import android.util.Log.d
import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.View
import android.view.View.VISIBLE
import android.view.WindowManager
import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.gson.Gson
import es.verdnatura.R
import es.verdnatura.databinding.FragmentCollectionNewBinding
import es.verdnatura.domain.ConstAndValues
import es.verdnatura.domain.ConstAndValues.BASEURLSALIX
import es.verdnatura.domain.ConstAndValues.PREITEMPICKERTEST
import es.verdnatura.domain.ConstAndValues.PREPARED
import es.verdnatura.domain.ConstAndValues.PRESACADOR
import es.verdnatura.domain.ConstAndValues.PRINTERNAME
import es.verdnatura.domain.ConstAndValues.SACADOR
import es.verdnatura.domain.ConstAndValues.SECTORFK
import es.verdnatura.domain.notNull
import es.verdnatura.domain.showToastCenterWithBackground
import es.verdnatura.domain.toast
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.ItemScanned
import es.verdnatura.presentation.common.LabelDialogHelper
import es.verdnatura.presentation.common.OnAddItemClickListener
import es.verdnatura.presentation.common.OnBarcodeRowClickListener
import es.verdnatura.presentation.common.OnMistakeClickListener
import es.verdnatura.presentation.common.OnOptionsSelectedListener
@ -73,6 +72,8 @@ import org.json.JSONObject
2- AL AÑADIR ITEM A A LA COLECCIÓN , EL SACADOR SALEGROUPFK Y SECTORFK SON NULOS.
3-VERIFICAR COLECCIÓN
4-IMPRIMIR
5-EL SACADOR PUEDE MARCAR PREVIA, EL PRESACADOR NO.
6-EL PRE marca los estados del saleGroup con OK PREVIOUS (26) y el SACADOR con PREPARED (14)
variables:
isVerifiedCollection
@ -109,6 +110,7 @@ class CollectionFragmentPickerPreviousNew(
private lateinit var myGroupList: List<Sale>
private var quantityReserveToCheckItemScan = 0
private var isVerifiedCollection = false
private var stateCodeId: Number? = null
companion object {
fun newInstance(
@ -141,12 +143,12 @@ class CollectionFragmentPickerPreviousNew(
customDialogThreeButtons = CustomDialogThreeButtons(requireContext())
customDialogThreeButtonsQuantity = CustomDialogThreeButtons(requireContext())
ma.hideBottomNavigation(View.GONE)
println("type $type")
setEvents()
setToolBar()
viewModel.collectionTicketGetSalix(
collection.collectionFk, print = false
)
viewModel.getStateId(if (type == PREITEMPICKERTEST) "OK PREVIOUS" else "PREPARED")
super.init()
}
@ -223,7 +225,7 @@ class CollectionFragmentPickerPreviousNew(
binding.scanInput.setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {//ID=0 ACTION_NEXT ID=5 ACTION_UNESPECEFIED)
if (binding.scanInput.text.toString().isNotEmpty()) {
binding.scanInput.setText(textScanned_filterDouble(binding.scanInput.text!!.toString()))
binding.scanInput.setText(textScannedFilterDouble(binding.scanInput.text!!.toString()))
isScanned =
event != null && event.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER
if (itemScanIsQr(binding.scanInput.text.toString())) {
@ -328,12 +330,15 @@ class CollectionFragmentPickerPreviousNew(
loadPicked.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled().notNull {
myGroupList[positionConfirm].isPicked = 1
saleAdapter!!.notifyItemChanged(positionConfirm)
lm!!.scrollToPositionWithOffset(positionConfirm, 0)
//lm!!.scrollToPositionWithOffset(storedBackPosition + 1, 0)
setTotalLines()
if (it) {
myGroupList[positionConfirm].isPicked = 1
saleAdapter!!.notifyItemChanged(positionConfirm)
lm!!.scrollToPositionWithOffset(positionConfirm, 0)
//lm!!.scrollToPositionWithOffset(storedBackPosition + 1, 0)
setTotalLines()
} else {
updateScreen()
}
}
}
@ -347,25 +352,40 @@ class CollectionFragmentPickerPreviousNew(
}
}
loadResponseStateId.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled().notNull {
stateCodeId = it
}
}
loadResponseReserveAddPrevOK.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled().notNull {
}
}
loadSetStateResponse.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled().notNull {
// updateScreen()
}
}
responseCode.observe(viewLifecycleOwner) {
loadResponseCode.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled().notNull {
if (it == null) {
showErrorMessage(text = getString(R.string.codeNotExist))
if (mperror != null) mperror?.start()
} else {
if (checkItemScan(it.toString(), positionConfirm)) {
scanRequest()
customDialogList.dismiss()
mpok?.start()
markLine(positionConfirm, quantityReserveToCheckItemScan, false)
} else {
customDialogList.setValueTwo("")
showErrorMessage(text = getString(R.string.lineNotExist))
if (it == null) {
showErrorMessage(text = getString(R.string.codeNotExist))
if (mperror != null) mperror?.start()
} else {
if (checkItemScan(it.toString(), positionConfirm)) {
scanRequest()
customDialogList.dismiss()
mpok?.start()
markLine(positionConfirm, quantityReserveToCheckItemScan, false)
} else {
customDialogList.setValueTwo("")
showErrorMessage(text = getString(R.string.lineNotExist))
if (mperror != null) mperror?.start()
}
}
}
}
}
@ -402,7 +422,7 @@ class CollectionFragmentPickerPreviousNew(
when (type) {
PREITEMPICKERTEST -> {
myGroupList =
salesList.sortedWith(compareBy<Sale> { it.pickingOrderPrevia }.thenBy { it.itemFk })
salesList.sortedWith(compareBy<Sale> { it.pickingOrder }.thenBy { it.itemFk })
}
SACADOR -> {
@ -464,6 +484,12 @@ class CollectionFragmentPickerPreviousNew(
showDeleteItemShelving(sale)
}
}, onAddItemClickListener = object : OnAddItemClickListener {
override fun onAddItemClickListener(sale: Sale) {
customDialogAddItemFromSale(sale)
}
}, type = type
)
@ -483,21 +509,20 @@ class CollectionFragmentPickerPreviousNew(
}
private fun showDeleteItemShelving(sale: Sale) {
customDialog.setTitle(getString(R.string.deleteSale))
.setDescription(
getString(R.string.deleteSaleDescrip) + getString(
R.string.sure
)
).setOkButton(getString(R.string.delete)) {
customDialog.setTitle(getString(R.string.deleteSale)).setDescription(
getString(R.string.deleteSaleDescrip) + getString(
R.string.sure
)
).setOkButton(getString(R.string.delete)) {
viewModel.itemShelvingSaleDeleteIsAdded(sale.itemShelvingSaleFk)
scanRequest()
customDialog.dismiss()
viewModel.itemShelvingSaleDeleteIsAdded(sale.itemShelvingSaleFk)
scanRequest()
customDialog.dismiss()
}.setKoButton(getString(R.string.cancel)) {
scanRequest()
customDialog.dismiss()
}.show()
}.setKoButton(getString(R.string.cancel)) {
scanRequest()
customDialog.dismiss()
}.show()
}
@ -528,29 +553,79 @@ class CollectionFragmentPickerPreviousNew(
var isFoundSale = false
//Se busca la matricula en las lineas
for (indice in myGroupList.indices) {
//como cuando es presacador no hay parent no entrará
try {
if (myGroupList[indice].isParent && myGroupList[indice].saleGroupFk == txtscan.toInt() || (type == PREPARED && myGroupList[indice].saleGroupFk == txtscan.toInt())) {
isFoundSale = true
storedPosition = indice
viewModel.itemShelvingSaleSetSaleGroup(txtscan.toInt())
setStateSaleGroup(txtscan.toInt())
myGroupList[indice].stateCode =
if (myGroupList[indice].stateCode == "PREPARED") {
"OK PREVIOUS"
} else {
"PREPARED"
}
saleAdapter!!.notifyDataSetChanged()
break
}
} catch (ex: Exception) {
d("Verdnatura", "not find")
}
if (myGroupList[indice].isPicked != 1 && myGroupList[indice].code != null && myGroupList[indice].code!!.uppercase() == txtscan.uppercase()) {
mpok!!.start()
isFoundSale = true
printShelvingResult(indice)
break
}
}
if (!isFoundSale) mperror!!.start()
if (!isFoundSale) mperror!!.start() else mpok!!.start()
}
private fun markPrevia(saleGroupScanned: String): Boolean {
try {
for (indice in sales.indices) {
if (sales[indice].saleGroupFk != null && sales[indice].saleGroupFk == saleGroupScanned.toInt()) {
viewModel.itemShelvingSaleSetSaleGroup(saleGroupScanned.toInt())
setStateSaleGroup(saleGroupScanned.toInt())
storedPosition = indice
mpok!!.start()
return true
}
}
} catch (ex: Exception) {
return false
}
return false
}
private fun findSale(txtscan: String, position: Int, sale: Sale) {
storedPosition = position
if (sale.code!!.uppercase() == txtscan.uppercase()) {
mpok!!.start()
printShelvingResult(position)
} else {
mperror!!.start()
}
val isOk = markPrevia(txtscan)
if (isOk) {
//Se ha escanado un ticket y se ha marcado la previa
ma.messageWithSound(
getString(R.string.previousCollected),
isPlayed = false,
isError = false,
isToasted = true
)
} else {
if (sale.code!!.uppercase() == txtscan.uppercase()) {
mpok!!.start()
printShelvingResult(position)
} else {
mperror!!.start()
}
}
}
private fun markLine(position: Int, quantity: Int, isItemShelvingSaleEmpty: Boolean?) {
@ -565,7 +640,8 @@ class CollectionFragmentPickerPreviousNew(
myGroupList[position].itemShelvingSaleFk,
quantity,
isItemShelvingSaleEmpty = isItemShelvingSaleEmpty,
sectorFk = if (sectorFk == -1) null else sectorFk
sectorFk = if (sectorFk == -1) null else sectorFk,
shelvingFk = myGroupList[position].code!!
)
}
// storedBackPosition = position
@ -708,8 +784,7 @@ class CollectionFragmentPickerPreviousNew(
mpok?.start()
ma.hideKeyboard(customDialogList.getEditTextTwo())
customDialogList.dismiss()
showTicket(myGroupList[position].ticketFk)
requireContext().showToastCenterWithBackground(myGroupList[position].ticketFk.toString())
scanRequest()
} else {
@ -731,24 +806,6 @@ class CollectionFragmentPickerPreviousNew(
}
}
private fun showTicket(ticketFk: Int) {
val inflater = LayoutInflater.from(requireContext())
val layout = inflater.inflate(R.layout.ticket_toast_layout, null)
val text = layout.findViewById<TextView>(R.id.toast_text)
text.text = "$ticketFk"
text.setTextColor(requireContext().getColor(R.color.verdnatura_orange_salix))
text.textSize = 18f
val background = GradientDrawable()
background.setColor(Color.parseColor("#000000"))
background.cornerRadius = 16f
layout.background = background
val toast = Toast(requireContext())
toast.duration = Toast.LENGTH_LONG
toast.view = layout
toast.setGravity(Gravity.CENTER, 0, 0)
toast.show()
}
private fun checkItemScan(valueToCheck: String, position: Int): Boolean {
println("CheckItemScan $valueToCheck")
val saleToCheck = myGroupList[position]
@ -780,14 +837,13 @@ class CollectionFragmentPickerPreviousNew(
showQuestionUbicationEmpty(position, quantity)
}.setOkButtonTwo(getString(R.string.no)) {
scanRequest()
customDialogThreeButtonsQuantity.dismiss()
viewModel.itemShelvingSaleExists(
myGroupList[position].itemShelvingSaleFk,
myGroupList[position].itemShelvingFk,
position,
quantity
)
/* if (quantity == 0) {
customDialogThreeButtonsQuantity.dismiss()/* viewModel.itemShelvingSaleExists(
myGroupList[position].itemShelvingSaleFk,
myGroupList[position].itemShelvingFk,
position,
quantity
)*/
markLine(position, quantity, true)/* if (quantity == 0) {
/* viewModel.itemShelvingGet(
myGroupList[position].itemShelvingFk,
@ -896,8 +952,7 @@ class CollectionFragmentPickerPreviousNew(
ticketSelected,
saleGroupFk = if (type == PREPARED) null else collection.tickets.find { it.ticketFk == ticketSelected }?.sales?.get(
0
)?.saleGroupFk
?: 0,
)?.saleGroupFk ?: 0,
sectorFk = if (type == PREPARED) null else mobileApplication.dataStoreApp.readDataStoreKey<Int>(
SECTORFK
)
@ -914,6 +969,44 @@ class CollectionFragmentPickerPreviousNew(
}
private fun customDialogAddItemFromSale(sale: Sale) {
customDialogThreeButtonsQuantity.setTitle(
"${getString(R.string.ticket)}${sale.ticketFk}"
).setDescription(
getString(
R.string.addItemQuantity, sale.itemFk
)
)
customDialogThreeButtonsQuantity.setCustomDialogValue(VISIBLE)
customDialogThreeButtonsQuantity.setOkButtonAdd(text = getString(R.string.add)) {
ticketSelected = sale.ticketFk
if (customDialogThreeButtonsQuantity.getValue().isNotEmpty()) {
viewModel.collectionAddWithReservation(
sale.itemFk,
customDialogThreeButtonsQuantity.getValue().toInt(),
ticketSelected = sale.ticketFk,
saleGroupFk = if (type == PREPARED) null else collection.tickets.find { it.ticketFk == ticketSelected }?.sales?.get(
0
)?.saleGroupFk ?: 0,
sectorFk = if (type == PREPARED) null else mobileApplication.dataStoreApp.readDataStoreKey<Int>(
SECTORFK
)
)
customDialogThreeButtonsQuantity.setValue("")
customDialogThreeButtonsQuantity.dismiss()
hideKeyboardFragment()
} else {
getString(R.string.indicateQuantity).toast(requireContext())
}
}.setKoButton(getString(R.string.cancel)) {
scanRequest()
customDialogThreeButtonsQuantity.dismiss()
}.show()
customDialogThreeButtonsQuantity.getEditText().requestFocus()
}
private fun hideKeyboardFragment() {
Handler(Looper.getMainLooper()).postDelayed({
val inputMethodManager =
@ -936,15 +1029,13 @@ class CollectionFragmentPickerPreviousNew(
}
private fun setTotalLines() {
println("total Mark ${myGroupList.count { it.isPicked == 1 }}")
println("total size ${myGroupList.size}")
val totalMark = myGroupList.count { it.isPicked == 1 }
binding.mainToolbar.toolbarTitle.text =
if (collection.collectionFk != 0) collection.collectionFk.toString() else ""
binding.mainToolbar.toolbarSubtitle.text =
getString(R.string.totalsPicker, totalMark, myGroupList.size)
if (totalMark == myGroupList.size) {
getString(R.string.Coleccióncompleta).toast(this.context, Toast.LENGTH_SHORT)
getString(R.string.completCollection).toast(this.context, Toast.LENGTH_SHORT)
when (type) {
PREPARED -> {
tickets.forEach {
@ -952,17 +1043,34 @@ class CollectionFragmentPickerPreviousNew(
ticketFk = it.toInt(), state = "PREPARED"
)
}
//setStateSaleGroup()
}
PREITEMPICKERTEST -> {
//viewModel.saleTrackingAddPrevOK(collection.collectionFk)
viewModel.saleTrackingSectorCollectionAddPrevOK(collection.collectionFk)
viewModel.saleTrackingAddPrevOK(collection.collectionFk)
//viewModel.saleTrackingSectorCollectionAddPrevOK(collection.collectionFk)
val distinctSaleGroups = mutableSetOf<Int>()
myGroupList.forEach { sale ->
sale.saleGroupFk?.let {
distinctSaleGroups.add(it)
} ?: run {
println("No hay salegroup")
}
}
if (distinctSaleGroups.isNotEmpty())
distinctSaleGroups.forEach { saleGroup ->
setStateSaleGroup(saleGroup)
}
}
}
}
}
private fun setStateSaleGroup(saleGroup: Number) {
viewModel.saleGroupUpdateState(saleGroup, stateCodeId!!)
}
private fun showScanner(index: Int, sale: Sale) {
customDialogInput.getEditText().inputType = InputType.TYPE_CLASS_TEXT
customDialogInput.setTitle("" + sale.itemFk)
@ -1090,10 +1198,9 @@ class CollectionFragmentPickerPreviousNew(
).toString()
)
val foundTicketInCollection =
collection.tickets.find {
it.ticketFk == customDialogList.getValue().toInt()
}
val foundTicketInCollection = collection.tickets.find {
it.ticketFk == customDialogList.getValue().toInt()
}
if (foundTicketInCollection != null) {
isVerifiedCollection = true
ma.hideKeyboard(customDialogList.getEditText())
@ -1149,20 +1256,15 @@ class CollectionFragmentPickerPreviousNew(
}
}
if (isTicket) {
val builder = AlertDialog.Builder(context)
builder.setTitle(getString(R.string.selectLabeltoPrint))
val labelCount = arrayOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "10")
builder.setItems(labelCount) { dialog, which ->
val labelDialogHelper = LabelDialogHelper(requireContext())
labelDialogHelper.showLabelDialog(onItemSelected = { labelCount ->
viewModel.collectionStickerPrint(
collectionFk = collection.collectionFk, labelCount = (which + 1)
collectionFk = collection.collectionFk, labelCount = labelCount
)
(getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey<String>(
ConstAndValues.PRINTERNAME
PRINTERNAME
)).toast(requireContext())
}
val dialog = builder.create()
dialog.show()
})
} else {
viewModel.collectionStickerPrint(
collectionFk = collection.collectionFk, null

View File

@ -1,6 +1,5 @@
package es.verdnatura.presentation.view.feature.collection.fragment
import android.app.AlertDialog
import android.content.Context
import android.graphics.drawable.Drawable
import android.media.MediaPlayer
@ -38,6 +37,7 @@ import es.verdnatura.domain.toLong
import es.verdnatura.domain.toast
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.ItemScanned
import es.verdnatura.presentation.common.LabelDialogHelper
import es.verdnatura.presentation.common.OnBarcodeRowClickListener
import es.verdnatura.presentation.common.OnMistakeClickListener
import es.verdnatura.presentation.common.OnOptionsSelectedListener
@ -161,7 +161,7 @@ class CollectionFragmentPreChecker(
collection.collectionFk,
mobileApplication.dataStoreApp.readDataStoreKey(SECTORFK),
print = "0",
type
"PREVIOUS_CONTROL"
)
}
super.onCreate(savedInstanceState)
@ -205,8 +205,8 @@ class CollectionFragmentPreChecker(
val listIcons: ArrayList<ImageView> = ArrayList()
val iconPrint = ImageView(context)
iconPrint.setImageResource(R.drawable.ic_print_black_24dp)
val iconAdd = ImageView(context)
iconAdd.setImageResource(R.drawable.ic_playlist_add_black_24dp)
// val iconAdd = ImageView(context)
// iconAdd.setImageResource(R.drawable.ic_playlist_add_black_24dp)
val iconViewCollection = ImageView(context)
iconViewCollection.setImageResource(R.drawable.ic_collection)
val iconWorker = ImageView(context)
@ -220,7 +220,7 @@ class CollectionFragmentPreChecker(
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
iconPrint.tooltipText = getTooltip(R.drawable.ic_print_black_24dp)
iconAdd.tooltipText = getTooltip(R.drawable.ic_playlist_add_black_24dp)
// iconAdd.tooltipText = getTooltip(R.drawable.ic_playlist_add_black_24dp)
iconViewCollection.tooltipText = getTooltip(R.drawable.ic_collection)
iconPhone.tooltipText = getTooltip(R.drawable.phone_call)
iconParking.tooltipText = getTooltip(R.drawable.ic_local_parking_black_24dp)
@ -237,7 +237,7 @@ class CollectionFragmentPreChecker(
listIcons.add(iconWorker)
}
listIcons.add(iconAdd)
// listIcons.add(iconAdd)
if (type == SACADOR) {
listIcons.add(iconUpdate)
@ -255,7 +255,7 @@ class CollectionFragmentPreChecker(
when (item) {
iconPrint.drawable -> print()
iconAdd.drawable -> addItem()
// iconAdd.drawable -> addItem()
iconWorker.drawable -> showUser()
iconUpdate.drawable -> updateScreen()
iconParking.drawable -> pasillerosItemClickListener?.onPasillerosItemClickListener(
@ -362,7 +362,7 @@ class CollectionFragmentPreChecker(
if (!binding.scanInput.text.toString().isNullOrEmpty()) {
//sergio:para ver si ha marcado dos veces el mismo ticket
binding.scanInput.setText(textScanned_filterDouble(binding.scanInput.text!!.toString()))
binding.scanInput.setText(textScannedFilterDouble(binding.scanInput.text!!.toString()))
//de momento solo está el qr de artículo
isScanned =
@ -383,7 +383,7 @@ class CollectionFragmentPreChecker(
viewModel.getSales(
binding.scanInput.text.toString().toInt(),
print = "0",
source = type
source = "PREVIOUS_CONTROL"
)
//findSale(binding.scanInput.text.toString())
@ -399,10 +399,10 @@ class CollectionFragmentPreChecker(
it.sales.forEach { at ->
if (at.saleGroupFk != saleGroup) {
viewModel.setParking(
ticketFk = at.saleGroupFk.toInt(),
ticketFk = at.saleGroupFk!!.toInt(),
parking = myQr.more
)
saleGroup = at.saleGroupFk
saleGroup = at.saleGroupFk!!
}
}
@ -419,7 +419,7 @@ class CollectionFragmentPreChecker(
viewModel.getSales(
binding.scanInput.toLong(),
print = "0",
source = type
source = "PREVIOUS_CONTROL"
)
} catch (ex: Exception) {
ma.messageWithSound(
@ -964,15 +964,16 @@ class CollectionFragmentPreChecker(
val isOnReservationMode = mobileApplication.dataStoreApp.readDataStoreKey<Boolean>(
ConstAndValues.RESERVATIONMODE
)
//lolass
if (isOnReservationMode) {
) || (mobileApplication.dataStoreApp.readDataStoreKey<Boolean?>(
ConstAndValues.SECTORISONRESERVATIONMODE
) == true)
sales = salesList.filter {
sales = if (isOnReservationMode) {
salesList.filter {
it.sectorFk == mobileApplication.dataStoreApp.readDataStoreKey<Int>(SECTORFK)
}.sortedWith(compareBy({ it.saleOrder }))
} else {
sales = salesList.filter {
salesList.filter {
it.sectorFk == mobileApplication.dataStoreApp.readDataStoreKey<Int>(SECTORFK)
}.sortedWith(compareBy({ it.picked }))
}
@ -983,7 +984,7 @@ class CollectionFragmentPreChecker(
saleAdapter =
SaleAdapter(
sales,
sales as MutableList,
pasillerosItemClickListener!!,
object : OnQuantityClickListener {
@ -1742,7 +1743,7 @@ class CollectionFragmentPreChecker(
collection.collectionFk,
mobileApplication.dataStoreApp.readDataStoreKey(SECTORFK),
print = "0",
type
type = "PREVIOUS_CONTROL"
)
} else {
@ -2014,7 +2015,7 @@ class CollectionFragmentPreChecker(
"" + totalMark + "/" + total
if (totalMark == sales.size) {
getString(R.string.Coleccióncompleta).toast(this.context, Toast.LENGTH_SHORT)
getString(R.string.completCollection).toast(this.context, Toast.LENGTH_SHORT)
saleAdapter!!.notifyDataSetChanged()
if (!goBack)
@ -2266,21 +2267,19 @@ class CollectionFragmentPreChecker(
}
}
if (isTicket) {
val builder = AlertDialog.Builder(context)
builder.setTitle(getString(R.string.selectLabeltoPrint))
val labelCount = arrayOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "10")
builder.setItems(labelCount) { dialog, which ->
viewModel.collectionStickerPrint(
collectionFk = collection.collectionFk,
labelCount = (which + 1)
)
(getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey<String>(
PRINTERNAME
)).toast(requireContext())
val labelDialogHelper = LabelDialogHelper(requireContext())
labelDialogHelper.showLabelDialog(
onItemSelected = { labelCount ->
viewModel.collectionStickerPrint(
collectionFk = collection.collectionFk,
labelCount = labelCount
)
}
val dialog = builder.create()
dialog.show()
(getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey<String>(
PRINTERNAME
)).toast(requireContext())
}
)
} else {
viewModel.collectionStickerPrint(
collectionFk = collection.collectionFk,

View File

@ -180,14 +180,18 @@ class CollectionViewModel(val context: Context) : BaseViewModel(context) {
val loadAddNew: LiveData<Event<ResponseItemVO>> = _responseNew.map { Event(it) }
private val _responseCode by lazy { MutableLiveData<Int?>() }
val responseCode: LiveData<Int?>
get() = _responseCode
val responseCode: LiveData<Int?> = _responseCode
val loadResponseCode: LiveData<Event<Int?>> = _responseCode.map { Event(it) }
private val _responseIncQuantity by lazy { MutableLiveData<ResponseItemVO>() }
val responseIncQuantity: LiveData<ResponseItemVO>
get() = _responseIncQuantity
val loadIncQuantity: LiveData<Event<ResponseItemVO>> = _responseIncQuantity.map { Event(it) }
private val _responseStateId by lazy { MutableLiveData<Number>() }
val responseStateId: LiveData<Number> = _responseStateId
val loadResponseStateId: LiveData<Event<Number>> = _responseStateId.map { Event(it) }
private val _mistakeList by lazy { MutableLiveData<MistakeTypeListVO>() }
val mistakeList: LiveData<MistakeTypeListVO>
get() = _mistakeList
@ -211,6 +215,16 @@ class CollectionViewModel(val context: Context) : BaseViewModel(context) {
val responseSaleAddPrevOK: LiveData<ResponseItemVO>
get() = _responseSaleAddPrevOK
private val _responseSaleReserveAddPrevOK by lazy { MutableLiveData<Boolean>() }
val responseSaleReserveAddPrevOK: LiveData<Boolean> = _responseSaleReserveAddPrevOK
val loadResponseReserveAddPrevOK: LiveData<Event<Boolean>> =
_responseSaleReserveAddPrevOK.map { Event(it) }
private val _setStateResponse by lazy { MutableLiveData<Boolean>() }
val setStateResponse: LiveData<Boolean> = _setStateResponse
val loadSetStateResponse: LiveData<Event<Boolean>> =
_setStateResponse.map { Event(it) }
fun getSales(
collectionFk: Number, print: String, source: String
@ -431,10 +445,18 @@ class CollectionViewModel(val context: Context) : BaseViewModel(context) {
itemShelvingSaleFk: Int,
quantity: Int,
isItemShelvingSaleEmpty: Boolean?,
sectorFk: Int? = null
sectorFk: Int? = null,
shelvingFk: String
) {
salix.itemShelvingSaleSetquantitySalix(
params = arrayListOf(itemShelvingSaleFk, quantity, isItemShelvingSaleEmpty, sectorFk)
params = arrayListOf(
itemShelvingSaleFk,
quantity,
isItemShelvingSaleEmpty,
sectorFk,
shelvingFk
).formatWithQuotes()
).enqueue(object : SalixCallback<Any>(context) {
override fun onSuccess(response: Response<Any>) {
@ -444,6 +466,12 @@ class CollectionViewModel(val context: Context) : BaseViewModel(context) {
_responseCollectionAddItem.value = true
}
override fun onError(t: Throwable) {
_responseConfirmReservedItemShelvingSale.value = false
super.onError(t)
}
})
}
@ -477,6 +505,35 @@ class CollectionViewModel(val context: Context) : BaseViewModel(context) {
})
}
fun getStateId(stateCode: String) {
salix.getStateId(
filter = """{"where":{"code":"$stateCode"}, "fields":["id"]}""".trimMargin()
).enqueue(object : SalixCallback<JsonObject>(context) {
override fun onSuccess(response: Response<JsonObject>) {
_responseStateId.value =
response.body()?.get("id").toString().toInt()
}
})
}
fun setStateSaleGroup(
saleGroups: List<Number>, stateCode: Int
) {
salix.collectionAddWithReservation(
params = arrayListOf(
saleGroups, stateCode
)
).enqueue(object : SalixCallback<Any>(context) {
override fun onSuccess(response: Response<Any>) {
// _responseCollectionAddItem.value = true
}
})
}
fun itemPlacementSupplyAiming(
shelvingFk: String, quantity: Int, itemFk: Int
) {
@ -612,7 +669,7 @@ class CollectionViewModel(val context: Context) : BaseViewModel(context) {
}
fun itemShelvingSaleSetSaleGroup(
saleGroupFk: Int
saleGroupFk: Int,
) {
salix.itemShelvingSaleSetSaleGroup(
arrayListOf(
@ -628,6 +685,7 @@ class CollectionViewModel(val context: Context) : BaseViewModel(context) {
override fun onSuccess(response: Response<Unit>) {
_responseItemShelvingSaleGroup.value = ResponseItemVO(isError = false)
}
})
}
@ -753,6 +811,16 @@ class CollectionViewModel(val context: Context) : BaseViewModel(context) {
})
}
fun saleGroupUpdateState(saleGroup: Number, codeState: Number) {
salix.saleGroupUpdate(
id = saleGroup, hashMapOf("stateFk" to codeState)
).enqueue(object : SalixCallback<Any>(context) {
override fun onSuccess(response: Response<Any>) {
_setStateResponse.value = true
}
})
}
fun collectionIncreaseQuantitySalix(
saleFk: Int, quantity: String
) {
@ -783,7 +851,9 @@ class CollectionViewModel(val context: Context) : BaseViewModel(context) {
salix.saleMistakeAdd(
SaleMistakeSalix(
userFk = (context as MobileApplication).userId!!, saleFk = saleFk, typeFk = typeFk
userFk = (context as MobileApplication).userId!!,
saleFk = saleFk,
typeFk = typeFk
)
).enqueue(object : SalixCallback<Any>(context) {
override fun onError(t: Throwable) {
@ -974,22 +1044,11 @@ class CollectionViewModel(val context: Context) : BaseViewModel(context) {
) {
salix.saleTrackingSectorCollectionAddPrevOK(arrayListOf(sectorCollectionFk))
.enqueue(object : SalixCallback<Any>(context) {
override fun onError(t: Throwable) {
_responseSaleAddPrevOK.value = ResponseItemVO(
isError = true, errorMessage = getMessageFromAllResponse(
nameofFunction(this), t.message!!
)
)
}
override fun onSuccess(response: Response<Any>) {
_responseSaleAddPrevOK.value = ResponseItemVO(
isError = false, errorMessage = "" + getMessageFromAllResponse(
nameofFunction(this), response.message()
)
)
_responseSaleReserveAddPrevOK.value = true
}
})
}

View File

@ -0,0 +1,922 @@
package es.verdnatura.presentation.view.feature.collection.fragment
import android.content.Context
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.map
import com.google.gson.JsonObject
import es.verdnatura.MobileApplication
import es.verdnatura.domain.SalixCallback
import es.verdnatura.domain.formatWithQuotes
import es.verdnatura.domain.toast
import es.verdnatura.domain.userCases.GetItemFromBarcodeUseCase
import es.verdnatura.presentation.base.BaseViewModel
import es.verdnatura.presentation.base.getMessageFromAllResponse
import es.verdnatura.presentation.base.nameofFunction
import es.verdnatura.presentation.common.Event
import es.verdnatura.presentation.common.ResponseItemExistsItemShelvingSale
import es.verdnatura.presentation.common.ResponseItemVO
import es.verdnatura.presentation.common.SaleTrackingReplaceSalix
import es.verdnatura.presentation.common.SaleTrackingSalix
import es.verdnatura.presentation.common.TicketState
import es.verdnatura.presentation.view.feature.collection.ItemVO
import es.verdnatura.presentation.view.feature.collection.SalixSaleQuantity
import es.verdnatura.presentation.view.feature.collection.mapper.map
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.MistakeTypeListVO
import es.verdnatura.presentation.view.feature.sacador.model.MistakeTypeVO
import es.verdnatura.presentation.view.feature.sacador.model.PlacementSupplyListVO
import es.verdnatura.presentation.view.feature.sacador.model.PlacementSupplyVO
import es.verdnatura.presentation.view.feature.workermistake.model.SaleMistakeSalix
import es.verdnatura.presentation.view.feature.workermistake.model.SaleTrackingDelSalix
import retrofit2.Response
class CollectionViewModelCheckerPreviosNew(val context: Context) : BaseViewModel(context) {
private val getItemFromBarcodeUseCase = GetItemFromBarcodeUseCase(salix)
private val contextApp = context
private val _responseState by lazy { MutableLiveData<ResponseItemVO>() }
val responseState: LiveData<ResponseItemVO>
get() = _responseState
private val _collectionTicketList by lazy { MutableLiveData<CollectionVO>() }
val collectionTicketList: LiveData<CollectionVO>
get() = _collectionTicketList
private val _responseExistsItemShelvingSale by lazy { MutableLiveData<ResponseItemExistsItemShelvingSale>() }
val responseExistsItemShelvingSale: LiveData<ResponseItemExistsItemShelvingSale>
get() = _responseExistsItemShelvingSale
val loadExistsResponse: LiveData<Event<ResponseItemExistsItemShelvingSale>> =
_responseExistsItemShelvingSale.map { Event(it) }
private val _collectionTicketSalix by lazy { MutableLiveData<CollectionTicket>() }
val collectionTicketSalix: LiveData<CollectionTicket>
get() = _collectionTicketSalix
private val _getSalesResponse by lazy { MutableLiveData<CollectionVO>() }
val getSalesResponse: LiveData<CollectionVO>
get() = _getSalesResponse
val loadCollectionTicketSalix: LiveData<Event<CollectionTicket>> =
_collectionTicketSalix.map { Event(it) }
private val _placementSuppleyList by lazy { MutableLiveData<PlacementSupplyListVO>() }
val placementSuppleyList: LiveData<PlacementSupplyListVO>
get() = _placementSuppleyList
private val _response by lazy { MutableLiveData<ResponseItemVO>() }
val response: LiveData<ResponseItemVO>
get() = _response
private val _responseSaleMistakeAdd by lazy { MutableLiveData<ResponseItemVO>() }
val responseSaleMistakeAdd: LiveData<ResponseItemVO>
get() = _responseSaleMistakeAdd
val loadSaleMistakeAdd: LiveData<Event<ResponseItemVO>> =
_responseSaleMistakeAdd.map { Event(it) }
private val _responseItemShelvingSaleSupplyAdd by lazy { MutableLiveData<ResponseItemVO>() }
val responseItemShelvingSaleSupplyAdd: LiveData<ResponseItemVO>
get() = _responseItemShelvingSaleSupplyAdd
private val _responseSaleReplace by lazy { MutableLiveData<ResponseItemVO>() }
val responseSaleReplace: LiveData<ResponseItemVO>
get() = _responseSaleReplace
private val _responseSaleTracking_mark by lazy { MutableLiveData<ResponseItemVO>() }
val responseSaleTracking_mark: LiveData<ResponseItemVO>
get() = _responseSaleTracking_mark
private val _responseConfirmReservedItemShelvingSale by lazy { MutableLiveData<Boolean>() }
val responseConfirmReservedItemShelvingSale: LiveData<Boolean>
get() = _responseConfirmReservedItemShelvingSale
val loadPicked: LiveData<Event<Boolean>> =
_responseConfirmReservedItemShelvingSale.map { Event(it) }
private val _responseItemShelvingSale by lazy { MutableLiveData<ResponseItemVO>() }
val responseItemShelvingSale: LiveData<ResponseItemVO>
get() = _responseItemShelvingSale
private val _responseItemShelvingSaleUnPicked by lazy { MutableLiveData<Boolean>() }
val responseItemShelvingSaleUnPicked: LiveData<Boolean>
get() = _responseItemShelvingSaleUnPicked
val loadUnpicked: LiveData<Event<Boolean>> = _responseItemShelvingSaleUnPicked.map { Event(it) }
private val _responseCollectionAddItem by lazy { MutableLiveData<Boolean>() }
val responseCollectionAddItem: LiveData<Boolean>
get() = _responseCollectionAddItem
private val _responseParking by lazy { MutableLiveData<ResponseItemVO>() }
val responseParking: LiveData<ResponseItemVO>
get() = _responseParking
val loadParking: LiveData<Event<ResponseItemVO>> = _responseParking.map { Event(it) }
private val _responsePrint by lazy { MutableLiveData<ResponseItemVO>() }
val responsePrint: LiveData<ResponseItemVO>
get() = _responsePrint
private val _responseDel by lazy { MutableLiveData<ResponseItemVO>() }
val responseDel: LiveData<ResponseItemVO>
get() = _responseDel
private val _responseItemShelvingUpdate by lazy { MutableLiveData<ResponseItemVO>() }
val responseItemShelvingUpdate: LiveData<ResponseItemVO>
get() = _responseItemShelvingUpdate
private val _responseTicketState by lazy { MutableLiveData<TicketState>() }
val responseTicketState: LiveData<TicketState> = _responseTicketState
val loadTicketState: LiveData<Event<TicketState>> = _responseTicketState.map { Event(it) }
private val _responseUsedShelves by lazy { MutableLiveData<ResponseItemVO>() }
val responseUsedShelves: LiveData<ResponseItemVO>
get() = _responseUsedShelves
private val _responseSaleGroup by lazy { MutableLiveData<ResponseItemVO>() }
val responseSaleGroup: LiveData<ResponseItemVO>
get() = _responseSaleGroup
val loadResponseSaleGroup: LiveData<Event<ResponseItemVO>> =
_responseSaleGroup.map { Event(it) }
private val _responseItemShelvingSaleGroup by lazy { MutableLiveData<ResponseItemVO>() }
val responseItemShelvingSaleGroup: LiveData<ResponseItemVO>
get() = _responseItemShelvingSaleGroup
private val _responseTicketClosure by lazy { MutableLiveData<ResponseItemVO>() }
val responseTicketClosure: LiveData<ResponseItemVO>
get() = _responseTicketClosure
val loadTicketClousure: LiveData<Event<ResponseItemVO>> =
_responseTicketClosure.map { Event(it) }
private val _responseCollectionUnchecked by lazy { MutableLiveData<ResponseItemVO>() }
val responseCollectionUnchecked: LiveData<ResponseItemVO>
get() = _responseCollectionUnchecked
private val _responseSplit by lazy { MutableLiveData<ResponseItemVO>() }
val responseSplit: LiveData<ResponseItemVO>
get() = _responseSplit
private val _responseNew by lazy { MutableLiveData<ResponseItemVO>() }
val responseNew: LiveData<ResponseItemVO>
get() = _responseNew
val loadAddNew: LiveData<Event<ResponseItemVO>> = _responseNew.map { Event(it) }
private val _responseCode by lazy { MutableLiveData<Int?>() }
val responseCode: LiveData<Int?>
get() = _responseCode
private val _responseIncQuantity by lazy { MutableLiveData<ResponseItemVO>() }
val responseIncQuantity: LiveData<ResponseItemVO>
get() = _responseIncQuantity
val loadIncQuantity: LiveData<Event<ResponseItemVO>> = _responseIncQuantity.map { Event(it) }
private val _mistakeList by lazy { MutableLiveData<MistakeTypeListVO>() }
val mistakeList: LiveData<MistakeTypeListVO>
get() = _mistakeList
private val _item by lazy { MutableLiveData<ItemVO>() }
val item: LiveData<ItemVO>
get() = _item
val loadResponseDel: LiveData<Event<ResponseItemVO>> = _responseDel.map { Event(it) }
val loadResponseAddItem: LiveData<Event<Boolean>> =
_responseCollectionAddItem.map { Event(it) }
val loadResponseSaleTrackingMark: LiveData<Event<ResponseItemVO>> =
_responseSaleTracking_mark.map { Event(it) }
val loadResponseItemShelvingUpdate: LiveData<Event<ResponseItemVO>> =
_responseItemShelvingUpdate.map { Event(it) }
private val _responseSaleAddPrevOK by lazy { MutableLiveData<ResponseItemVO>() }
val responseSaleAddPrevOK: LiveData<ResponseItemVO>
get() = _responseSaleAddPrevOK
fun getSales(
collectionFk: Number, print: String, source: String
) {
salix.getSalesFromTicketOrCollection(
collectionOrTicketFk = collectionFk, print = print != "0", source = source
).enqueue(object : SalixCallback<CollectionVO>(context) {
override fun onError(t: Throwable) {
_collectionTicketList.value = CollectionVO(
0,
isError = true,
errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!)
)
}
override fun onSuccess(response: Response<CollectionVO>) {
try {
_collectionTicketList.value = response.body()?.let { it.map(contextApp) }
} catch (
ex: Exception
) {
ex.toast(context)
}
}
})
}
fun collectionTicketGet(
collectionFk: Int, sectorFk: Int, print: String, type: String
) {
getSales(collectionFk, print, type)
}
fun getCollectionTickets(
collectionFk: Number,
print: Boolean,
) {
salix.getCollectionTickets(
collectionFk, hashMapOf("print" to print)
).enqueue(object : SalixCallback<CollectionTicket>(context) {
override fun onError(t: Throwable) {
_collectionTicketSalix.value = CollectionTicket(
0,
isError = true,
errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!)
)
}
override fun onSuccess(response: Response<CollectionTicket>) {
if (response.body() != null) {
_collectionTicketSalix.value = response.body()?.let { it.map(contextApp) }
} else {
_collectionTicketSalix.value = CollectionTicket(
0, isError = true, errorMessage = getMessageFromAllResponse(
nameofFunction(this), response.message()
)
)
}
}
})
}
fun collectionGetId(
ticketFk: Int, sectorFk: Int, print: String, type: String
) {
salix.getCollectionId(
filter = """{"where":{"ticketFk":$ticketFk},"fields":"collectionFk"}"""
).enqueue(object : SalixCallback<List<JsonObject>>(context) {
override fun onError(t: Throwable) {
_collectionTicketList.value = CollectionVO(
0,
isError = true,
errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!)
)
}
override fun onSuccess(response: Response<List<JsonObject>>) {
if (response.body()!!.isNotEmpty()) {
collectionTicketGet(
response.body()!![0].entrySet().first().value.toString().toInt(),
sectorFk,
print,
type
)
} else {
_collectionTicketList.value = CollectionVO(
0, isError = false
)
}
}
})
}
fun itemShelvingSaleExists(
itemShelvingSaleFk: Number, position: Int, quantity: Int
) {
salix.itemShelvingSaleExists(
itemShelvingSaleFk
).enqueue(object : SalixCallback<JsonObject>(context) {
override fun onSuccess(response: Response<JsonObject>) {
_responseExistsItemShelvingSale.value = ResponseItemExistsItemShelvingSale(
response.body()!!.entrySet().first().value.asBoolean, position, quantity
)
}
})
}
fun saleTrackingReplace(
saleFk: Int,
originalQuantity: Int,
code: String,
isChecked: String,
buyFk: Long,
isScanned: Boolean?
) {
salix.saleTrackingUpdate(
SaleTrackingReplaceSalix(
saleFk, originalQuantity, code, isChecked != "0", buyFk, isScanned!!
)
).enqueue(object : SalixCallback<Any>(context) {
override fun onError(t: Throwable) {
_responseSaleReplace.value = ResponseItemVO(
isError = true,
errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!)
)
}
override fun onSuccess(response: Response<Any>) {
_responseSaleReplace.value = ResponseItemVO(isError = false, response = "")
}
})
}
fun saleTracking_mark(
saleFk: Int,
originalQuantity: Int,
code: String,
isChecked: String,
buyFk: Long,
itemShelvingFk: Int,
quantity: Int,
isScanned: Boolean?
) {
salix.saleTrackingMark(
SaleTrackingSalix(
saleFk = saleFk,
originalQuantity = originalQuantity,
code = code,
isChecked = isChecked != "0",
buyFk = buyFk,
itemShelvingFk = itemShelvingFk,
quantity = quantity,
isScanned = isScanned!!
)
).enqueue(object : SalixCallback<Any>(context) {
override fun onError(t: Throwable) {
_responseSaleTracking_mark.value = ResponseItemVO(
isError = true,
errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!)
)
}
override fun onSuccess(response: Response<Any>) {
if (!response.isSuccessful) {
_responseSaleTracking_mark.value = ResponseItemVO(
isError = true, errorMessage = getMessageFromAllResponse(
nameofFunction(this), response.message()
)
)
} else {
_responseSaleTracking_mark.value =
ResponseItemVO(isError = false, response = "")
}
}
})
}
fun itemShelvingSaleSetQuantity(
itemShelvingSaleFk: Int,
quantity: Int,
isItemShelvingSaleEmpty: Boolean?,
sectorFk: Int? = null,
shelvingFk: String
) {
salix.itemShelvingSaleSetquantitySalix(
params = arrayListOf(
itemShelvingSaleFk,
quantity,
isItemShelvingSaleEmpty,
sectorFk,
shelvingFk
)
).enqueue(object : SalixCallback<Any>(context) {
override fun onSuccess(response: Response<Any>) {
_responseConfirmReservedItemShelvingSale.value = true
if (isItemShelvingSaleEmpty == true)
_responseCollectionAddItem.value = true
}
})
}
fun collectionAddWithReservation(
item: Int, quantity: Int, ticketSelected: Int, saleGroupFk: Int?, sectorFk: Int?
) {
salix.collectionAddWithReservation(
params = arrayListOf(
item, quantity, ticketSelected, saleGroupFk, if (sectorFk == -1) null else sectorFk
)
).enqueue(object : SalixCallback<Any>(context) {
override fun onSuccess(response: Response<Any>) {
_responseCollectionAddItem.value = true
}
})
}
fun itemPlacementSupplyAiming(
shelvingFk: String, quantity: Int, itemFk: Int
) {
salix.itemPlacementSupplyAiming(
arrayListOf(
shelvingFk, quantity, itemFk
).formatWithQuotes()
).enqueue(object : SalixCallback<List<PlacementSupplyVO>>(context) {
override fun onSuccess(response: Response<List<PlacementSupplyVO>>) {
if (response.body() != null) {
_placementSuppleyList.value = response.body()?.let { PlacementSupplyListVO(it) }
} else {
val listError: ArrayList<PlacementSupplyVO> = ArrayList()
listError.add(
PlacementSupplyVO(
itemShelvingFk = 0,
isError = true,
errorMessage = getMessageFromAllResponse(
nameofFunction(this), response.message()
)
)
)
_placementSuppleyList.value = PlacementSupplyListVO(listError)
}
}
override fun onError(t: Throwable) {
val listError: ArrayList<PlacementSupplyVO> = ArrayList()
listError.add(
PlacementSupplyVO(
itemShelvingFk = 0,
isError = true,
errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!)
)
)
_placementSuppleyList.value = PlacementSupplyListVO(listError)
}
})
}
fun collectionStickerPrint(
collectionFk: Int, labelCount: Int?
) {
salix.collectionStickerPrint(
arrayListOf(
collectionFk, labelCount
)
).enqueue(object : SalixCallback<Any>(context) {
override fun onSuccess(response: Response<Any>) {
_responsePrint.value =
ResponseItemVO(isError = false, response = response.message())
}
override fun onError(t: Throwable) {
_responsePrint.value = ResponseItemVO(
isError = true,
errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!)
)
}
})
}
fun ticketCollection_setUsedShelves(
ticketFk: Int, usedShelves: Int
) {
salix.ticketCollectionUpdate(
"""where={"ticketFk":$ticketFk}""", hashMapOf("usedShelves" to usedShelves)
).enqueue(object : SalixCallback<Unit>(context) {
override fun onError(t: Throwable) {
_responseUsedShelves.value = ResponseItemVO(
isError = true,
errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!)
)
}
override fun onSuccess(response: Response<Unit>) {
_responseUsedShelves.value = ResponseItemVO(isError = false)
}
})
}
fun itemShelvingSaleUnpicked(
itemShelvingSaleFk: Int
) {
salix.itemShelvingSaleUnpicked(
arrayListOf(
itemShelvingSaleFk
)
).enqueue(object : SalixCallback<Unit>(context) {
override fun onSuccess(response: Response<Unit>) {
_responseItemShelvingSaleUnPicked.value = true
super.onSuccess(response)
}
})
}
fun saleTrackingAddPreparedSaleGroup(
saleGroupFk: Int
) {
salix.saleTrackingAddPreparedSaleGroup(
arrayListOf(
saleGroupFk
)
).enqueue(object : SalixCallback<Unit>(context) {
override fun onError(t: Throwable) {
_responseSaleGroup.value = ResponseItemVO(
isError = true,
errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!)
)
}
override fun onSuccess(response: Response<Unit>) {
//Tarea 7926
updateParkingFromSaleGroup(saleGroupFk)
_responseSaleGroup.value = ResponseItemVO(isError = false)
}
})
}
fun updateParkingFromSaleGroup(
saleGroupFk: Number
) {
salix.saleGroupUpdate(
id = saleGroupFk, params = hashMapOf("parkingFk" to null)
).enqueue(object : SalixCallback<Any>(context) {
override fun onSuccess(response: Response<Any>) {
}
})
}
fun itemShelvingSaleSetSaleGroup(
saleGroupFk: Int
) {
salix.itemShelvingSaleSetSaleGroup(
arrayListOf(
saleGroupFk
)
).enqueue(object : SalixCallback<Unit>(context) {
override fun onError(t: Throwable) {
_responseItemShelvingSaleGroup.value = ResponseItemVO(
isError = true,
errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!)
)
}
override fun onSuccess(response: Response<Unit>) {
_responseItemShelvingSaleGroup.value = ResponseItemVO(isError = false)
}
})
}
fun collectionAddItem(
itemFk: Int, quantity: Int, ticketFk: Int
) {
//Tarea 6889
salix.addSale(
id = ticketFk, barcode = itemFk.toString(), quantity = quantity
)/* salix.addSaleByCode(
CollectionItemSalix(
itemFk.toString(),
quantityFk,
ticketFk,
warehouseFk
)
)*/
.enqueue(object : SalixCallback<Any>(context) {
override fun onError(t: Throwable) {
_responseNew.value = ResponseItemVO(
isError = true,
errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!)
)
}
override fun onSuccess(response: Response<Any>) {
_responseNew.value =
ResponseItemVO(isError = false, response = response.message()!!)
}
})
}
fun saleTrackingDel(saleFk: Int) {
salix.saleTrackingDel(
SaleTrackingDelSalix(
saleFk = saleFk, stateCodes = listOf("CHECKED", "OK", "PREPARED")
)
).enqueue(object : SalixCallback<Any>(context) {
override fun onError(t: Throwable) {
_responseDel.value = ResponseItemVO(
isError = true,
errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!)
)
}
override fun onSuccess(response: Response<Any>) {
_responseDel.value =
ResponseItemVO(isError = false, response = response.message())
}
})
}
fun itemShelvingUpdateFromSale(
saleFk: Int
) {
salix.itemShelvingUpdateFromSale(hashMapOf("saleFk" to saleFk))
// silex.itemShelving_updateFromSale(saleFk)
.enqueue(object : SalixCallback<Any>(context) {
override fun onError(t: Throwable) {
_responseItemShelvingUpdate.value = ResponseItemVO(
isError = true,
errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!)
)
}
override fun onSuccess(response: Response<Any>) {
_responseItemShelvingUpdate.value =
ResponseItemVO(isError = false, response = response.message()!!)
}
})
}
fun setParking(
ticketFk: Int, parking: String
) {
salix.setParking(arrayListOf(ticketFk, parking).formatWithQuotes())
.enqueue(object : SalixCallback<Any>(context) {
override fun onSuccess(response: Response<Any>) {
_responseParking.value =
ResponseItemVO(isError = false, response = response.message())
}
override fun onError(t: Throwable) {
_responseParking.value = ResponseItemVO(
isError = true,
errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!)
)
}
})
}
fun ticketStateTodaySetState(
ticketFk: Int, state: String
) {
salix.ticketStateTodaySetState(arrayListOf(ticketFk, state).formatWithQuotes())
.enqueue(object : SalixCallback<Unit>(context) {
override fun onSuccess(response: Response<Unit>) {
_response.value = ResponseItemVO(isError = false, response = "")
}
override fun onError(t: Throwable) {
_response.value = ResponseItemVO(
isError = true,
errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!)
)
}
})
}
fun getIdFromCodeSalix(code: String) {
getItemFromBarcodeUseCase.execute(code).enqueue(object : SalixCallback<Int?>(context) {
override fun onSuccess(response: Response<Int?>) {
_responseCode.value = response.body()
}
})
}
fun collectionIncreaseQuantitySalix(
saleFk: Int, quantity: String
) {
salix.collectionIncreaseQuantitySalix(
SalixSaleQuantity(saleId = saleFk, quantity = quantity.toInt())
).enqueue(object : SalixCallback<Any>(context) {
override fun onError(t: Throwable) {
_responseIncQuantity.value = ResponseItemVO(
isError = true, errorMessage = getMessageFromAllResponse(
nameofFunction(this), t.message!!
)
)
}
override fun onSuccess(response: Response<Any>) {
super.onSuccess(response)
_responseIncQuantity.value = ResponseItemVO(
isError = false, response = response.message().toString()
)
}
})
}
fun saleMistakeAdd(
saleFk: Int, typeFk: Int
) {
salix.saleMistakeAdd(
SaleMistakeSalix(
userFk = (context as MobileApplication).userId!!, saleFk = saleFk, typeFk = typeFk
)
).enqueue(object : SalixCallback<Any>(context) {
override fun onError(t: Throwable) {
_responseSaleMistakeAdd.value = ResponseItemVO(
isError = true, errorMessage = getMessageFromAllResponse(
nameofFunction(this), t.message!!
)
)
}
override fun onSuccess(response: Response<Any>) {
super.onSuccess(response)
_responseSaleMistakeAdd.value =
ResponseItemVO(isError = false, response = response.message())
}
})
}
fun mistakeType() {
salix.getMistakeTypes().enqueue(object : SalixCallback<List<MistakeTypeVO>>(context) {
override fun onSuccess(response: Response<List<MistakeTypeVO>>) {
if (response.body() != null) {
_mistakeList.value = response.body()?.let { MistakeTypeListVO(it) }
} else {
val listError: ArrayList<MistakeTypeVO> = ArrayList()
listError.add(MistakeTypeVO(0, ""))
_mistakeList.value = MistakeTypeListVO(listError)
}
}
override fun onError(t: Throwable) {
val listError: ArrayList<MistakeTypeVO> = ArrayList()
listError.add(MistakeTypeVO(0, ""))
_mistakeList.value = MistakeTypeListVO(listError)
}
})
}
fun ticketIsOutClosureZone(
ticketFk: Int
) {
salix.ticketIsOutClosureZone(
arrayListOf(ticketFk)
).enqueue(object : SalixCallback<Any?>(context) {
override fun onSuccess(response: Response<Any?>) {
_responseTicketClosure.value = ResponseItemVO(
isError = false,
response = response.body()?.toString() ?: "false",
errorMessage = ""
)
}
override fun onError(t: Throwable) {
_responseTicketClosure.value = ResponseItemVO(
isError = true, errorMessage = getMessageFromAllResponse(
nameofFunction(this), t.message!!
)
)
}
})
}
fun ticketState(
ticketFk: Int
) {
salix.ticketState(
"""{"where": {"ticketFk": "$ticketFk"},"include":[{"relation":"user","scope":{"fields":["username"]}}]}"""
).enqueue(object : SalixCallback<List<TicketState>>(context) {
override fun onSuccess(response: Response<List<TicketState>>) {
_responseTicketState.value = if (response.body()!!.isEmpty()) {
TicketState()
} else {
response.body()!![0]
}
}
})
}
fun callBackSalix(function: String, params: ArrayList<Any>) {
salix.executeFunc(
routine = function, params = params
).enqueue(object : SalixCallback<Any>(context) {
override fun onError(t: Throwable) {
_responseTicketClosure.value = ResponseItemVO(
isError = true, errorMessage = getMessageFromAllResponse(
nameofFunction(this), t.message!!
)
)
}
override fun onSuccess(response: Response<Any>) {
_responseTicketClosure.value = ResponseItemVO(
isError = false, response = response.body()!!.toString(), errorMessage = ""
)
}
})
}
fun hasUncheckedTicket(
collectionFk: Int
) {
salix.hasUncheckedTicket(collectionFk)
//silex.collection_getUncheckedTicket(collectionFk)
.enqueue(object : SalixCallback<String>(context) {
override fun onError(t: Throwable) {
_responseCollectionUnchecked.value = ResponseItemVO(
isError = true, errorMessage = getMessageFromAllResponse(
nameofFunction(this), t.message!!
)
)
}
override fun onSuccess(response: Response<String>) {
if (response.body() != null) {
_responseCollectionUnchecked.value = ResponseItemVO(
isError = false, response = response.body()!!, errorMessage = ""
)
} else {
_responseCollectionUnchecked.value = ResponseItemVO(
isError = true,
response = response.body()!!.toString(),
errorMessage = getMessageFromAllResponse(
nameofFunction(this), response.message()
)
)
}
}
})
}
fun collection_setState(
collectionFk: Int, state: String
) {
salix.collectionSetState(
params = arrayListOf(
collectionFk, state
).formatWithQuotes()
).enqueue(object : SalixCallback<Any?>(context) {
override fun onError(t: Throwable) {
_responseState.value = ResponseItemVO(
isError = true, errorMessage = getMessageFromAllResponse(
nameofFunction(this), t.message!!
)
)
super.onError(t)
}
override fun onSuccess(response: Response<Any?>) {
_responseState.value = ResponseItemVO(isError = false, response = "")
super.onSuccess(response)
}
})
}
fun saleTrackingAddPrevOK(
sectorCollectionFk: Int
) {
salix.saleTrackingAddPrevOK(arrayListOf(sectorCollectionFk))
.enqueue(object : SalixCallback<Any>(context) {
override fun onError(t: Throwable) {
_responseSaleAddPrevOK.value = ResponseItemVO(
isError = true, errorMessage = getMessageFromAllResponse(
nameofFunction(this), t.message!!
)
)
}
override fun onSuccess(response: Response<Any>) {
_responseSaleAddPrevOK.value = ResponseItemVO(
isError = false, errorMessage = "" + getMessageFromAllResponse(
nameofFunction(this), response.message()
)
)
}
})
}
}

View File

@ -1,6 +1,5 @@
package es.verdnatura.presentation.view.feature.collection.fragment
import android.app.AlertDialog
import android.content.Context
import android.graphics.drawable.Drawable
import android.os.Bundle
@ -8,7 +7,6 @@ import android.view.View.VISIBLE
import android.view.inputmethod.EditorInfo
import android.widget.ImageView
import android.widget.Toast
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import es.verdnatura.R
import es.verdnatura.databinding.FragmentCollectionBinding
@ -17,6 +15,7 @@ import es.verdnatura.domain.ConstAndValues.SECTORFK
import es.verdnatura.domain.ConstAndValues.VERTICKET
import es.verdnatura.domain.toast
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.LabelDialogHelper
import es.verdnatura.presentation.common.OnMistakeClickListener
import es.verdnatura.presentation.common.OnOptionsSelectedListener
import es.verdnatura.presentation.common.OnPackingClickListener
@ -138,16 +137,20 @@ class CollectionShowTicketFragment(
}
}
if (isTicket) {
val builder = AlertDialog.Builder(context)
builder.setTitle(getString(R.string.selectLabeltoPrint))
val labelCount = arrayOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "10")
builder.setItems(labelCount) { dialog, which ->
viewModel.collectionStickerPrint(
collectionFk = collection.collectionFk, labelCount = (which + 1)
)
}
val dialog = builder.create()
dialog.show()
val labelDialogHelper = LabelDialogHelper(requireContext())
labelDialogHelper.showLabelDialog(
onItemSelected = { labelCount ->
viewModel.collectionStickerPrint(
collectionFk = collection.collectionFk,
labelCount = labelCount
)
(getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey<String>(
PRINTERNAME
)).toast(requireContext())
}
)
} else {
viewModel.collectionStickerPrint(
@ -166,22 +169,18 @@ class CollectionShowTicketFragment(
binding.scanInput.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {//ID=0 ACTION_NEXT ID=5 ACTION_UNESPECEFIED)
if (!binding.scanInput.text.toString().isNullOrEmpty()) {
if (binding.scanInput.text.toString().isNotEmpty()) {
buttonPushedGetCollection = false
try {
viewModel.getSales(
collectionFk = itemScanValue(
binding.scanInput.text.toString(), arrayOf("ticket","saleGroup"), "id"
binding.scanInput.text.toString(),
arrayOf("ticket", "saleGroup"),
"id"
).toString().toInt(),
print = "0",
source = type
)
println("qrTest2")
/* viewModel.getSales(
binding.scanInput.text.toString().toInt(), print = "0", type
)*/
} catch (ex: Exception) {
getString(R.string.scanLabelTicket).toast(requireContext())
}
@ -213,13 +212,14 @@ class CollectionShowTicketFragment(
try {
requireActivity().hideKeyboard()
} catch (e: Exception) {
e.message!!.toast(requireContext())
}
}
override fun observeViewModel() {
with(viewModel) {
collectionTicketList.observe(viewLifecycleOwner, Observer {
collectionTicketList.observe(viewLifecycleOwner) {
if (!it.isError) {
if (it.tickets.isNotEmpty()) {
@ -232,18 +232,18 @@ class CollectionShowTicketFragment(
}
} else {
ma.messageWithSound(it.errorMessage, it.isError, false)
ma.messageWithSound(it.errorMessage, isError = true, false)
if (activity != null) ma.onMyBackPressed()
}
})
}
responsePrint.observe(viewLifecycleOwner, Observer {
responsePrint.observe(viewLifecycleOwner) {
if (it.isError) {
ma.messageWithSound(
it.errorMessage, it.isError, true
it.errorMessage, isError = true, true
)
} else {
(getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey<String>(
@ -251,7 +251,7 @@ class CollectionShowTicketFragment(
)).toast(requireContext())
}
})
}
}
}
@ -277,27 +277,30 @@ class CollectionShowTicketFragment(
}
}
sales = salesList.sortedWith(compareBy({ it.saleOrder }))
/*salesList.sortedWith(compareBy<SaleVO> { it.isPrepared == "0" }
.thenBy { it.isControlled == "0" }*/
sales = salesList.sortedWith(compareBy { it.saleOrder })
saleAdapter =
SaleAdapter(sales, pasillerosItemClickListener!!, object : OnQuantityClickListener {
SaleAdapter(
sales as MutableList,
pasillerosItemClickListener!!,
object : OnQuantityClickListener {
override fun onQuantityClick(sale: SaleVO) {
}
}, object : OnSaleClickListener {
override fun onSaleClick(sale: SaleVO) {
}
override fun onQuantityClick(sale: SaleVO) {
}
},
object : OnSaleClickListener {
override fun onSaleClick(sale: SaleVO) {
}
}, object : OnMistakeClickListener {
override fun onMistakeClickListener(sale: SaleVO) {
}
}, object : OnPackingClickListener {
override fun onPackingClick(sale: SaleVO) {
}
},
object : OnMistakeClickListener {
override fun onMistakeClickListener(sale: SaleVO) {
}
},
object : OnPackingClickListener {
override fun onPackingClick(sale: SaleVO) {
}
})
})
lm = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
binding.fragmentSacadorCollections.adapter = saleAdapter
@ -310,8 +313,13 @@ class CollectionShowTicketFragment(
private fun setPosition() {
val firstIndex =
sales.indexOfFirst { it.isPreviousPrepared == "0" && (it.isPrepared == "0" || it.isControlled == "0") }
lm!!.scrollToPositionWithOffset(firstIndex, 0)
sales.indexOfFirst { it.isPreviousPrepared == "0" && it.isPrepared == "0" && it.isControlled == "0" }
val resultIndex = if (firstIndex != -1) {
firstIndex
} else {
sales.indexOfFirst { it.isPreviousPrepared == "0" && it.isPrepared == "0" }
}
lm!!.scrollToPositionWithOffset(resultIndex, 0)
}
private fun printObservations(observations: String) {
@ -331,9 +339,10 @@ class CollectionShowTicketFragment(
if (it.isControlled == "1") totalMark += 1
}
binding.mainToolbar.toolbarTitle.text = collection.collectionFk.toString()
binding.mainToolbar.toolbarSubtitle.text = "" + totalMark + "/" + sales.size
binding.mainToolbar.toolbarSubtitle.text =
getString(R.string.totalsPicker, totalMark, sales.size)
if (totalMark == sales.size) {
getString(R.string.Coleccióncompleta).toast(this.context, Toast.LENGTH_SHORT)
getString(R.string.completCollection).toast(this.context, Toast.LENGTH_SHORT)
}
}

View File

@ -15,6 +15,8 @@ fun CollectionVO.map(context: Context): CollectionVO {
this.tickets.forEach { ticket ->
// if (ticket.sales.size>0){
ticket.sales.forEach {
it.parkingCode = ticket.parkingCode
it.isAdvanced = ticket.isAdvanced
it.ticketFk = ticket.ticketFk
it.level = ticket.level
it.rgb = ticket.rgb

View File

@ -55,7 +55,7 @@ class ControladorFragment :
goBack = false
if (!binding.scanInput.text.isNullOrEmpty()) {
binding.scanInput.setText(textScanned_filterDouble(binding.scanInput.text!!.toString()))
binding.scanInput.setText(textScannedFilterDouble(binding.scanInput.text!!.toString()))
try {
binding.scanInput.setText(
itemScanValue(

View File

@ -52,7 +52,7 @@ class ControlVehiculoUsuarioFragment(
if (userFk == vUserFK) {
val androidId: String = mobileApplication.dataStoreApp.readDataStoreKey(ANDROID_ID)
viewModel.machineGetWorkerPlate(mobileApplication.userId!!)
// viewModel.machineGetWorkerPlate(mobileApplication.userId!!)
viewModel.deviceProductionGetnameDevice(
androidId
)
@ -64,7 +64,8 @@ class ControlVehiculoUsuarioFragment(
binding.userInformation.visibility = INVISIBLE
binding.nameVehiclecontrol.visibility = INVISIBLE
binding.userImage.setOnClickListener { binding.mainToolbar.backButton.performClick() }
viewModel.machineGetWorkerPlate(mobileApplication.userId!!)
// viewModel.machineGetWorkerPlate(mobileApplication.userId!!)
binding.nameVehiclecontrol.visibility = VISIBLE
viewModel.getNameWorker(userFk)
}

View File

@ -108,35 +108,15 @@ class ControlVehiculoViewModel(val context: Context) : BaseViewModel(context) {
})
}
fun machineGetWorkerPlate(userId: Int) {
salix.machineGetWorkerPlate(
arrayListOf(userId)
).enqueue(object : SalixCallback<List<JsonObject>>(context) {
override fun onSuccess(response: Response<List<JsonObject>>) {
_responseMachine.value =
ResponseItemMachineControl(
response = if (response.body()!!.isEmpty()) {
""
} else {
response.body()!![0].entrySet().first().value.toString()
.replace("\"", "")
},
type = "getWorkerPlate"
)
}
})
}
fun getNameWorker(
workerId: Int
) {
salix.getNameWorker(
"""{"fields": ["firstName","lastName"],"where": {"id":$workerId}}"""
).enqueue(object : SalixCallback<NameWorker>(context) {
"""{"limit":1, "where":{"id":$workerId},"skip":0,"fields":["firstName","lastName"]}"""
).enqueue(object : SalixCallback<List<NameWorker>>(context) {
override fun onSuccess(response: Response<NameWorker>) {
_responseGetName.value = response.body()
override fun onSuccess(response: Response<List<NameWorker>>) {
_responseGetName.value = response.body()?.get(0)
}
})

View File

@ -1,6 +1,7 @@
package es.verdnatura.presentation.view.feature.delivery.adapters
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat.getColor
import androidx.recyclerview.widget.RecyclerView
@ -57,8 +58,14 @@ class ExpeditionLoadUnloadAdapter(
)
}
}
binding.scanOrderTxt.visibility =
if (item.scanOrder == null) View.GONE else View.VISIBLE
binding.scanOrderLabel.visibility =
if (item.scanOrder == null) View.GONE else View.VISIBLE
this.item = item
}

View File

@ -31,9 +31,14 @@ class RouteAdapter(
var prevCreated = ""
for (route in list) {
if (route.created.toString() != prevCreated) {
//tarea 7146
/* if (route.created.toString() != prevCreated) {
route.header = true
prevCreated = route.created.toString()
}*/
if (route.dated.toString() != prevCreated) {
route.header = true
prevCreated = route.dated.toString()
}
}
return list
@ -90,7 +95,9 @@ class RouteAdapter(
if (item.header) {
headerRouteLayout.visibility = View.VISIBLE
headerRoute.text = toDateString(item.created)
//tarea7146
headerRoute.text = toDateString(item.dated)
// headerRoute.text = toDateString(item.created)
} else {
headerRouteLayout.visibility = View.GONE

View File

@ -0,0 +1,50 @@
package es.verdnatura.presentation.view.feature.delivery.adapters
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import es.verdnatura.databinding.ItemSalaryComplementRowBinding
import es.verdnatura.presentation.common.OnSalarySupplementClickListener
import es.verdnatura.presentation.view.feature.delivery.model.RouteComplement
class SalarySupplementAdapter(
private var items: List<RouteComplement>,
private val onSalarySupplementClickListener: OnSalarySupplementClickListener
) : RecyclerView.Adapter<SalarySupplementAdapter.ItemHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder {
return ItemHolder(
ItemSalaryComplementRowBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
}
override fun getItemCount() = items.size
override fun onBindViewHolder(holder: ItemHolder, position: Int) {
holder.bind(items[position])
}
fun updateData(list: List<RouteComplement>) {
items = list
notifyDataSetChanged()
}
inner class ItemHolder(
val binding: ItemSalaryComplementRowBinding
) : RecyclerView.ViewHolder(binding.root) {
private val res = binding.root.context.resources
fun bind(item: RouteComplement) {
binding.apply {
this.item = item
}
binding.imageDelete.setOnClickListener {
onSalarySupplementClickListener.onSalarySupplementClickListener(item)
}
}
}
}

View File

@ -24,12 +24,14 @@ 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.component.CustomDialogThreeButtons
import es.verdnatura.presentation.view.feature.delivery.activity.SignedActivity
import es.verdnatura.presentation.view.feature.delivery.adapters.ExpeditionLoadUnloadAdapter
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.ExpeditionSalix
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionSalixPosition
import es.verdnatura.presentation.view.feature.delivery.model.RouteLoaded
import es.verdnatura.presentation.view.feature.delivery.viewmodels.DeliveryViewModel
import kotlinx.coroutines.Dispatchers
@ -51,12 +53,11 @@ class LoadUnloadFragment(
private var adapter: ExpeditionLoadUnloadAdapter? = null
private var originalItem: Int = 0
private lateinit var myList: MutableList<ExpeditionInfoLoadUnload>
private var counterCalls = 0
private var counterResponse = 0
private var route = 0
private var addressFk = 0
private lateinit var db: DeliveryDatabase
private lateinit var backDispatcher: OnBackPressedDispatcher
private lateinit var customDialogConfirmExpedition: CustomDialogThreeButtons
companion object {
var scanned = false
@ -75,8 +76,7 @@ class LoadUnloadFragment(
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
requireActivity().onBackPressedDispatcher.addCallback(
viewLifecycleOwner,
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner,
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (!onBackPressedHandled()) {
@ -101,6 +101,7 @@ class LoadUnloadFragment(
setSwitchButon()
binding.scanInput.requestFocus()
viewModel.getExpeditionFromRoute(route)
customDialogConfirmExpedition = CustomDialogThreeButtons(requireContext())
super.init()
}
@ -178,25 +179,43 @@ class LoadUnloadFragment(
private fun setExpeditionsState(list: MutableList<ExpeditionInfoLoadUnload>, state: String) {
scanning(false)
val mlist = mutableListOf<ExpeditionSalix>()
/* val mlist = mutableListOf<ExpeditionSalix>()
for (l in list) {
mlist.add(
ExpeditionSalix(
expeditionFk = l.id,
stateCode = if (l.code != state && l.code != "FOUND" && l.code != "DELIVERED") {
if (state == "ON DELIVERY") "NOT SCANNED" else "LOST"
} else {
l.code
},
isScanned = l.isScanned
)
)
}*/
val mlistPosition = mutableListOf<ExpeditionSalixPosition>()
for (l in list) {
mlist.add(
ExpeditionSalix(
mlistPosition.add(
ExpeditionSalixPosition(
expeditionFk = l.id,
stateCode = if (l.code != state && l.code != "FOUND" && l.code != "DELIVERED") {
"LOST"
} else {
l.code
stateCode = if (l.code == "FOUND") (l.code) else {
if (state == "ON DELIVERY" && l.code != "ON DELIVERY" && l.code != "DELIVERED" && l.code != "LOST") {
"NOT SCANNED"
} else {
if (state == "DELIVERED" && l.code != "DELIVERED") "LOST" else l.code
}
},
isScanned = l.isScanned
isScanned = l.isScanned,
scanOrder = l.scanOrder
)
)
}
val expeditionBack = hashMapOf("expeditions" to mlist as List<ExpeditionSalix>)
val expeditionBackPosition =
hashMapOf("expeditions" to mlistPosition as List<ExpeditionSalixPosition>)
//val expeditionBack = hashMapOf("expeditions" to mlist as List<ExpeditionSalix>)
if (list.any { it.code == state }) {
if (list.filter { it.code == state }.size == list.size) {
viewModel.expeditionStateAddSalix(expeditionBack)
counterCalls = 1
viewModel.expeditionStateAddSalix(expeditionBackPosition)
} else {
val alertDialog = android.app.AlertDialog.Builder(requireContext()).create()
alertDialog.setTitle(getString(R.string.info))
@ -204,8 +223,7 @@ class LoadUnloadFragment(
alertDialog.setButton(
android.app.AlertDialog.BUTTON_NEUTRAL, getString(R.string.save)
) { _, _ ->
counterCalls = 1
viewModel.expeditionStateAddSalix(expeditionBack)
viewModel.expeditionStateAddSalix(expeditionBackPosition)
}
alertDialog.setButton(
android.app.AlertDialog.BUTTON_POSITIVE, getString(R.string.ordenar)
@ -261,6 +279,8 @@ class LoadUnloadFragment(
if (!binding.scanInput.text.isNullOrEmpty()) {
val isScanned =
event != null && event.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER
//Tarea 8152
// showconfirmExpedition(binding.scanInput.text.toString().toInt(), isScanned)
try {
markExpedition(
binding.scanInput.text.toString().toInt(),
@ -295,6 +315,70 @@ class LoadUnloadFragment(
binding.scanInput.requestFocus()
}
private fun showconfirmExpedition(expeditionFk: Int, isScanned: Boolean) {
try {
customDialogConfirmExpedition.setHintDialogValue("Indica expedición")
customDialogConfirmExpedition.setDescription("No está escanenado la caja. Escríbala de nuevo:")
.setValue("").setOkButtonAdd(getString(R.string.confirm)) {
try {
if (expeditionFk == customDialogConfirmExpedition.getValue().toInt()) {
takeActionConfirmed(isScanned)
binding.scanInput.requestFocus()
customDialogConfirmExpedition.dismiss()
} else {
}
} catch (ex: Exception) {
ma.messageWithSound(
message = getString(R.string.errorInputQuantity),
isPlayed = true,
isError = true,
isToasted = true
)
}
}.setKoButton(getString(R.string.cancel)) {
binding.scanInput.requestFocus()
binding.scanInput.setText("")
customDialogConfirmExpedition.dismiss()
}.show()
customDialogConfirmExpedition.setFocusDialogValue()
} catch (ex: Exception) {
ex.message!!.toast(requireContext())
}
}
private fun takeActionConfirmed(isScanned: Boolean) {
try {
markExpedition(
binding.scanInput.text.toString().toInt(),
if (!binding.mainToolbar.switchButton.isChecked) {
state
} else {
"FOUND"
},
isScanned = if (isScanned) 1 else 0
)
if (state != "DELIVERED") {
binding.mainToolbar.toolbarTitle.text =
if (!binding.mainToolbar.switchButton.isChecked) {
getString(R.string.loading)
} else {
getString(R.string.unloading)
}
}
} catch (ex: Exception) {
getString(R.string.errorExpedition).toast(context, Toast.LENGTH_SHORT)
}
binding.scanInput.setText("")
}
private fun markExpedition(expedNumber: Int, state: String, isScanned: Int) {
var found = false
@ -307,15 +391,14 @@ class LoadUnloadFragment(
found = true
exped.code = state
exped.isScanned = isScanned
if (state == "ON DELIVERY") exped.scanOrder =
myList.filter { it.code == state }.size
break
}
}
if (found) {
ma.messageWithSound(
message = "",
isError = false,
isPlayed = true,
isToasted = false
message = "", isError = false, isPlayed = true, isToasted = false
)
scanning(true)
} else {
@ -324,7 +407,6 @@ class LoadUnloadFragment(
}
if (binding.mainToolbar.switchButton.isChecked) {
counterCalls = 1
val pendingExpeditionSend = myList.map { l ->
ExpeditionSalix(
expeditionFk = l.id, stateCode = l.code, isScanned = l.isScanned
@ -353,20 +435,17 @@ class LoadUnloadFragment(
}
responseStateAdd.observe(viewLifecycleOwner) {
if (it) {
counterResponse += 1
if (counterResponse == counterCalls) {
if (!binding.mainToolbar.switchButton.isChecked) {
if (state == "DELIVERED") {
openSignActivity()
} else {
ma.onMyBackPressed()
}
if (!binding.mainToolbar.switchButton.isChecked) {
if (state == "DELIVERED") {
openSignActivity()
} else {
binding.mainToolbar.switchButton.isChecked = false
ma.onMyBackPressed()
}
counterResponse = 0
counterCalls = 0
} else {
binding.mainToolbar.switchButton.isChecked = false
}
} else {
openSignActivity()
}
@ -456,6 +535,7 @@ class LoadUnloadFragment(
it.routeFk == route
}
}
adapter = ExpeditionLoadUnloadAdapter(myList)
binding.expeditionloadunloadRecyclerview.adapter = adapter
binding.expeditionloadunloadRecyclerview.layoutManager =

View File

@ -175,7 +175,7 @@ class LogExpeditionFragment(
binding.routeLayout.visibility = View.VISIBLE
binding.mainToolbar.toolbarIcons.visibility = View.VISIBLE
binding.route.text = routeDelivery.ticket.routeFk.toString()
binding.agency.text = routeDelivery.ticket.route.agencyMode.agency.name ?: ""
binding.agency.text = routeDelivery.ticket.route?.agencyMode?.agency?.name ?: ""
binding.scanInput.setText("")
}

View File

@ -5,9 +5,11 @@ import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.view.View
import android.view.inputmethod.EditorInfo
import android.widget.ImageView
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.gson.Gson
import es.verdnatura.R
import es.verdnatura.databinding.FragmentRouteBinding
@ -17,14 +19,21 @@ import es.verdnatura.domain.toDateString
import es.verdnatura.domain.toast
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.base.database
import es.verdnatura.presentation.common.GeneralAdapter
import es.verdnatura.presentation.common.GeneralItem
import es.verdnatura.presentation.common.ItemDescorationCustomized
import es.verdnatura.presentation.common.OnGeneralItemRowClickListener
import es.verdnatura.presentation.common.OnGeneralRowClickListener
import es.verdnatura.presentation.common.OnItemImageRouteRowClickListener
import es.verdnatura.presentation.common.OnOptionsSelectedListener
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.common.ToolBarAdapterTooltip
import es.verdnatura.presentation.common.hideKeyboard
import es.verdnatura.presentation.common.itemScanValue
import es.verdnatura.presentation.view.component.CustomDialogList
import es.verdnatura.presentation.view.feature.delivery.adapters.RouteAdapter
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoLoadUnload
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionSalix
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionSalixPosition
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.viewmodels.DeliveryViewModel
@ -45,6 +54,34 @@ class RoutesFragment(
private lateinit var myListRoute: MutableList<RouteInfo>
private lateinit var db: DeliveryDatabase
private lateinit var myListRouteLoaded: List<RouteLoaded>
private val customDialogList: CustomDialogList by lazy {
CustomDialogList(requireContext())
}
private var listExpeditionScan: ArrayList<GeneralItem> = ArrayList()
private var listMyRoutes: ArrayList<GeneralItem> = ArrayList()
private val expeditionScanAdapter: GeneralAdapter? by lazy {
GeneralAdapter(listExpeditionScan, object : OnGeneralItemRowClickListener {
override fun onGeneralItemRowClickListener(item: GeneralItem) {
listExpeditionScan.remove(item)
expeditionScanAdapter?.notifyDataSetChanged()
}
}, onRowClickListener = object : OnGeneralRowClickListener {
override fun onRowClickListener(item: GeneralItem) {
getDataForMoveExpeditions(item.code!!)
}
}, showDelete = true
)
}
private val recyclerViewConfigured: RecyclerView by lazy {
customDialogList.getRecyclerView().apply {
layoutManager =
LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
adapter = expeditionScanAdapter
}
}
companion object {
fun newInstance(title: String) = RoutesFragment(title)
@ -78,30 +115,15 @@ class RoutesFragment(
}
val pendingExpedition = db.expedicionDao().getAllPendingExpeditions()
val pendingExpeditionSend = pendingExpedition.map { l ->
ExpeditionSalix(
expeditionFk = l.id, stateCode = l.code, l.isScanned
)
}
if (pendingExpedition.isNotEmpty()) {
val pendingExpeditionSend = pendingExpedition.map { l ->
ExpeditionSalixPosition(
expeditionFk = l.id, stateCode = l.code, l.isScanned, l.scanOrder
)
}
if (pendingExpeditionSend.any { it.stateCode == "DELIVERED" }) {
viewModel.expeditionStateAddSalix(
hashMapOf("expeditions" to pendingExpeditionSend.filter { it.stateCode == "DELIVERED" })
)
}
if (pendingExpeditionSend.any { it.stateCode == "ON DELIVERY" }) {
viewModel.expeditionStateAddSalix(
hashMapOf("expeditions" to pendingExpeditionSend.filter { it.stateCode == "ON DELIVERY" })
)
}
if (pendingExpeditionSend.any { it.stateCode == "LOST" }) {
viewModel.expeditionStateAddSalix(
hashMapOf("expeditions" to pendingExpeditionSend.filter { it.stateCode == "LOST" })
)
}
if (pendingExpeditionSend.any { it.stateCode == "FOUND" }) {
viewModel.expeditionStateAddSalix(
hashMapOf("expeditions" to pendingExpeditionSend.filter { it.stateCode == "FOUND" })
hashMapOf("expeditions" to pendingExpeditionSend)
)
}
@ -123,10 +145,10 @@ class RoutesFragment(
}
}
private fun deleteExpeditionsPending(codeState: String) {
private fun deleteExpeditionsPending() {
lifecycleScope.launch {
withContext(Dispatchers.IO) {
db.expedicionDao().getDeleteByState(codeState)
db.expedicionDao().getDeleteAllState()
}
}
@ -152,6 +174,13 @@ class RoutesFragment(
iconInfo.tooltipText = getTooltip(R.drawable.ic_info_delivery)
iconRefresh.tooltipText = getTooltip(R.drawable.ic_info_refresh)
iconSearch.tooltipText = getTooltip(R.drawable.expedition_find)
val iconMove = ImageView(context)
iconMove.setImageResource(R.drawable.ic_move_expedition)
iconMove.tooltipText = getString(R.string.moveExpedition)
//Tarea 8150
listIcons.add(iconMove)
listIcons.add(iconInfo)
listIcons.add(iconRefresh)
listIcons.add(iconSearch)
@ -179,6 +208,10 @@ class RoutesFragment(
getString(R.string.titleLog)
)
}
iconMove.drawable -> {
showExpeditionScan()
}
}
}
})
@ -188,6 +221,82 @@ class RoutesFragment(
binding.mainToolbar.toolbarIcons.visibility = View.VISIBLE
}
private fun showExpeditionScan() {
listExpeditionScan.clear()
listMyRoutes.clear()
expeditionScanAdapter!!.updateItems(listExpeditionScan)
expeditionScanAdapter!!.setShowDelete(true)
customDialogList.setTitle(getString(R.string.scanExpeditionForMove))
.setOkButton(getString(R.string.moveToRoute)) {
ma.hideKeyboard(customDialogList.getEditText())
customDialogList.dismiss()
showRoutes()
}.setKoButton(getString(R.string.cancel)) {
customDialogList.dismiss()
requireContext().hideKeyboard(binding.scanInput)
}.setValue("").showDialog().show()
customDialogList.getEditText().requestFocus()
ma.hideKeyboard(customDialogList.getEditText())
customDialogList.getEditText().setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {
if (customDialogList.getValue().isNotEmpty()) {
val expeditionScan = itemScanValue(
customDialogList.getValue(), arrayOf("expeditionPallet"), "id"
).toString()
listExpeditionScan.add(
GeneralItem(
expeditionScan, expeditionScan
)
)
expeditionScanAdapter?.notifyItemChanged(0)
}
customDialogList.setValue("")
ma.hideKeyboard(customDialogList.getEditText())
return@setOnEditorActionListener true
}
false
}
recyclerViewConfigured
requireContext().hideKeyboard(customDialogList.getEditText())
}
private fun showRoutes() {
listMyRoutes.clear()
expeditionScanAdapter!!.updateItems(
ArrayList(myListRoute.map { routeInfo ->
GeneralItem(
code = routeInfo.id.toString(), text = routeInfo.id.toString()
)
})
)
expeditionScanAdapter!!.setShowDelete(false)
customDialogList.setTitle(getString(R.string.selectRoute))
.setKoButton(getString(R.string.cancel)) {
customDialogList.dismiss()
requireContext().hideKeyboard(binding.scanInput)
}.setValue("").hideDialog().show()
requireContext().hideKeyboard(customDialogList.getEditText())
recyclerViewConfigured
}
private fun getDataForMoveExpeditions(routeId: String) {
val routeItem = myListRoute.find { it.id == routeId.toLong() }
for (expedition in listExpeditionScan) {
viewModel.getDataFromExpedition(
routeId = routeId.toLong(),
expeditionId = expedition.code!!.toLong(),
// landed = routeItem!!.created.toString()
landed = routeItem!!.dated.toString()
)
}
customDialogList.dismiss()
}
private fun setEvents() {
binding.mainToolbar.backButton.setOnClickListener {
ma.onMyBackPressed()
@ -204,7 +313,6 @@ class RoutesFragment(
}
override fun afterTextChanged(s: Editable?) {
}
})
@ -262,7 +370,7 @@ class RoutesFragment(
if (it) {
binding.mainToolbar.toolbarIcons.visibility = View.VISIBLE
deleteExpeditionsPending("")
deleteExpeditionsPending()
}
}
@ -302,8 +410,7 @@ class RoutesFragment(
"showTickets" -> {
ma.onPasillerosItemClickListener(
PasillerosItemVO(title = R.string.tickets),
Gson().toJson(item)
PasillerosItemVO(title = R.string.tickets), Gson().toJson(item)
)
}
}

View File

@ -0,0 +1,175 @@
package es.verdnatura.presentation.view.feature.delivery.fragments
import android.app.DatePickerDialog
import android.graphics.drawable.Drawable
import android.view.View
import android.widget.ImageView
import androidx.recyclerview.widget.LinearLayoutManager
import es.verdnatura.R
import es.verdnatura.databinding.FragmentSalaryComplementBinding
import es.verdnatura.domain.toDateString
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.OnOptionsSelectedListener
import es.verdnatura.presentation.common.OnSalarySupplementClickListener
import es.verdnatura.presentation.common.ToolBarAdapterTooltip
import es.verdnatura.presentation.view.commom.NameWithId
import es.verdnatura.presentation.view.commom.SearchableAdapter
import es.verdnatura.presentation.view.feature.delivery.adapters.SalarySupplementAdapter
import es.verdnatura.presentation.view.feature.delivery.model.RouteActionList
import es.verdnatura.presentation.view.feature.delivery.model.RouteComplement
import es.verdnatura.presentation.view.feature.delivery.model.RouteComplementAdd
import es.verdnatura.presentation.view.feature.delivery.viewmodels.DeliveryViewModel
import java.time.LocalDate
import java.time.format.DateTimeFormatter
import java.util.Calendar
import java.util.Date
class SalaryComplementFragment(
var entryPoint: String = ""
) : BaseFragment<FragmentSalaryComplementBinding, DeliveryViewModel>(
DeliveryViewModel::class
) {
private val adapterComplement: SalarySupplementAdapter by lazy {
SalarySupplementAdapter(emptyList(), object : OnSalarySupplementClickListener {
override fun onSalarySupplementClickListener(item: RouteComplement) {
viewModel.routeComplementDelete(
item.id,
binding.date.text.toString(),
mobileApplication.userId!!
)
}
})
}
private val layoutManager: LinearLayoutManager by lazy {
LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
}
private lateinit var routeActionComplementsList: RouteActionList
companion object {
fun newInstance(entryPoint: String) = SalaryComplementFragment(entryPoint)
}
override fun getLayoutId(): Int = R.layout.fragment_salary_complement
private fun showDatePicker() {
val currentDate = Calendar.getInstance()
val year = currentDate[Calendar.YEAR]
val month = currentDate[Calendar.MONTH]
val day = currentDate[Calendar.DAY_OF_MONTH]
DatePickerDialog(
requireContext(), { _, selectedYear, selectedMonth, selectedDay ->
binding.date.text =
getString(R.string.dateDay, selectedDay, selectedMonth + 1, selectedYear)
viewModel.getRouteComplements(
binding.date.text.toString(),
mobileApplication.userId!!
)
}, year, month, day
).apply {
setTitle(getString(R.string.selectDate))
show()
}
}
override fun init() {
viewModel.getRouteAction()
binding.date.text = toDateString(Date())
viewModel.getRouteComplements(binding.date.text.toString(), mobileApplication.userId!!)
ma.hideBottomNavigation(View.GONE)
setToolBar()
setEvents()
super.init()
}
private fun setToolBar() {
binding.mainToolbar.toolbarTitle.text = getString(R.string.supplementDelivery)
binding.mainToolbar.toolbarIcons.visibility = View.VISIBLE
val iconAdd = ImageView(context).apply {
setImageResource(R.drawable.ic_add_black_24dp)
tooltipText = getTooltip(R.drawable.ic_add_black_24dp)
}
binding.mainToolbar.toolbarIcons.adapter =
ToolBarAdapterTooltip(listOf(iconAdd), object : OnOptionsSelectedListener {
override fun onOptionsItemSelected(item: Drawable) {
when (item) {
iconAdd.drawable -> {
binding.salarySearchableRecyclerView.visibility = View.VISIBLE
}
}
}
})
binding.mainToolbar.toolbarIcons.layoutManager =
LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
}
private fun setEvents() {
binding.mainToolbar.backButton.setOnClickListener {
ma.onMyBackPressed()
}
binding.date.setOnClickListener {
showDatePicker()
}
}
private fun setSearchable(listElements: MutableList<NameWithId>) {
val searchableRecyclerView = binding.salarySearchableRecyclerView
val adapter =
SearchableAdapter(
listElements = listElements,
context = requireContext()
) { nameWithId ->
val foundItem = routeActionComplementsList.list.find { item ->
item.id == nameWithId.id
}
foundItem?.apply {
val dateFormatted = LocalDate.parse(
binding.date.text.toString(), DateTimeFormatter.ofPattern("dd-MM-yyyy")
).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
viewModel.addRouteComplements(
RouteComplementAdd(
workerFk = mobileApplication.userId!!,
routeActionFk = foundItem.id,
price = foundItem.price,
dated = dateFormatted,
)
)
}
searchableRecyclerView.visibility = View.GONE
}
searchableRecyclerView.setAdapter(adapter, listElements)
}
override fun observeViewModel() {
with(viewModel) {
routeActionList.observe(viewLifecycleOwner) { list ->
routeActionComplementsList = list
setSearchable(list.list.map { item ->
NameWithId(
id = item.id,
name = item.name
)
}.toMutableList())
}
routeComplementList.observe(viewLifecycleOwner) {
adapterComplement.updateData(it.list)
binding.salaryComplementRecyclerview.adapter = adapterComplement
binding.salaryComplementRecyclerview.layoutManager = layoutManager
}
}
}
}

View File

@ -22,7 +22,7 @@ import es.verdnatura.presentation.common.ToolBarAdapterTooltip
import es.verdnatura.presentation.view.feature.delivery.adapters.ExpeditionSummaryAdapter
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoLoadUnload
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoSummary
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionSalix
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionSalixPosition
import es.verdnatura.presentation.view.feature.delivery.viewmodels.DeliveryViewModel
import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
@ -39,8 +39,6 @@ class SummaryFragment(
private var originalItem: Int = 0
private lateinit var myList: MutableList<ExpeditionInfoLoadUnload>
private lateinit var myListSummary: List<ExpeditionInfoSummary>
private var counterCalls = 0
private var counterResponse = 0
private var positionOnScreen = 0
private var addressFkSelected = 0
private var routeSelected = 0
@ -151,19 +149,20 @@ class SummaryFragment(
list: MutableList<ExpeditionInfoLoadUnload>, state: String, address: Int
) {
val listExpedition = list.filter { it.addressFk == address }.map { l ->
ExpeditionSalix(
expeditionFk = l.id, stateCode = if (l.code == state && l.code != "DELIVERED") {
state
} else {
"FOUND"
},
isScanned = l.isScanned
ExpeditionSalixPosition(
expeditionFk = l.id, stateCode = if (l.code == "FOUND") (l.code) else {
if (state == "ON DELIVERY" && l.code != "ON DELIVERY" && l.code != "DELIVERED" && l.code != "LOST") {
"NOT SCANNED"
} else {
if (state == "DELIVERED" && l.code != "DELIVERED") "LOST" else l.code
}
}, isScanned = l.isScanned, scanOrder = l.scanOrder
)
}
if (list.filter { it.addressFk == address }
.filter { it.code == state }.size == list.filter { it.addressFk == address }.size) {
counterCalls = 1
viewModel.expeditionStateAddSalix(
hashMapOf("expeditions" to listExpedition.filter { it.stateCode == state })
)
@ -178,8 +177,7 @@ class SummaryFragment(
android.app.AlertDialog.BUTTON_POSITIVE, getString(R.string.save)
) { _, _ ->
counterCalls = 1
viewModel.expeditionStateAddSalix(hashMapOf("expeditions" to listExpedition.filter { it.stateCode == state }))
viewModel.expeditionStateAddSalix(hashMapOf("expeditions" to listExpedition))
}
alertDialog.setButton(
@ -235,15 +233,22 @@ class SummaryFragment(
found = true
exped.code = state
exped.isScanned = isScanned
println(
"scanOrder markExpedition${
myList.filter { it.addressFk == addressFkSelected }
.filter { it.code == state }.size
}"
)
exped.scanOrder = myList.filter { it.addressFk == addressFkSelected }
.filter { it.code == state }.size
break
}
}
if (found) {
ma.messageWithSound(
message = "",
isError = false,
isPlayed = true,
isToasted = false
message = "", isError = false, isPlayed = true, isToasted = false
)
} else {
ma.messageWithSound(message = "", isError = true, isPlayed = true, isToasted = null)
@ -279,13 +284,10 @@ class SummaryFragment(
}
responseStateAdd.observe(viewLifecycleOwner) {
if (it) {
counterResponse += 1
if (counterResponse == counterCalls) {
viewModel.routeGetExpeditionSummary(routeSelected)
counterResponse = 0
counterCalls = 0
checkNextAddress()
}
viewModel.routeGetExpeditionSummary(routeSelected)
checkNextAddress()
}
}
@ -340,7 +342,6 @@ class SummaryFragment(
}
if (addressFkSelected != item.addressFk && isScanning) {
setExpeditionsState(myList, state, addressFkSelected)
}
addressFkSelected = item.addressFk
isScanning = false

View File

@ -31,6 +31,7 @@ import es.verdnatura.presentation.common.GeneralAdapter
import es.verdnatura.presentation.common.GeneralItem
import es.verdnatura.presentation.common.ItemDescorationCustomized
import es.verdnatura.presentation.common.OnGeneralItemRowClickListener
import es.verdnatura.presentation.common.OnGeneralRowClickListener
import es.verdnatura.presentation.common.OnItemButtonCMRRowClickListener
import es.verdnatura.presentation.common.OnItemButtonTicketRowClickListener
import es.verdnatura.presentation.common.OnOptionsSelectedListener
@ -102,7 +103,6 @@ class TicketsFragment : BaseFragment<FragmentTicketsBinding, DeliveryViewModel>(
binding.mainToolbar.toolbarTitle.text = route.name
viewModel.getTickets(route.id)
db = database(requireContext().applicationContext)
println("tickets in ")
}
@ -429,15 +429,15 @@ class TicketsFragment : BaseFragment<FragmentTicketsBinding, DeliveryViewModel>(
override fun onItemButtonCMRRowClickListener(
item: Ticket
) {
ma.onPasillerosItemClickListener(
PasillerosItemVO(
title = R.string.titleWebViewer,
), entryPoint = Gson().toJson(
mutableMapOf(
"entryPoint" to route.id, "web" to "${
"entryPoint" to route.id,
"web" to "${
mobileApplication.dataStoreApp.getServerSalix()
}/api/Routes/${item.cmrFk}/cmr?access_token=${
}/api/Cmrs/${item.cmrFk}/print?access_token=${
mobileApplication.dataStoreApp.readDataStoreKey<String>(
TOKEN
)
@ -608,32 +608,33 @@ class TicketsFragment : BaseFragment<FragmentTicketsBinding, DeliveryViewModel>(
customDialogList.dismiss()
}.hideDialog().show()
val listPhonesAdapter = GeneralAdapter(phones, object : OnGeneralItemRowClickListener {
override fun onGeneralItemRowClickListener(item: GeneralItem) {
phones.forEach {
if (it.code == item.code) {
if (ContextCompat.checkSelfPermission(
requireContext(), Manifest.permission.CALL_PHONE
) == PackageManager.PERMISSION_GRANTED
) {
val callIntent = Intent(Intent.ACTION_CALL)
callIntent.data = Uri.parse("tel:${it.code}")
startActivity(callIntent)
return@forEach
val listPhonesAdapter =
GeneralAdapter(phones, onRowClickListener = object : OnGeneralRowClickListener {
override fun onRowClickListener(item: GeneralItem) {
phones.forEach {
if (it.code == item.code) {
if (ContextCompat.checkSelfPermission(
requireContext(), Manifest.permission.CALL_PHONE
) == PackageManager.PERMISSION_GRANTED
) {
val callIntent = Intent(Intent.ACTION_CALL)
callIntent.data = Uri.parse("tel:${it.code}")
startActivity(callIntent)
return@forEach
}
} else {
ActivityCompat.requestPermissions(
context as Activity,
arrayOf(Manifest.permission.CALL_PHONE),
REQUEST_CALL_PERMISSION
)
}
} else {
ActivityCompat.requestPermissions(
context as Activity,
arrayOf(Manifest.permission.CALL_PHONE),
REQUEST_CALL_PERMISSION
)
customDialogList.dismiss()
}
customDialogList.dismiss()
}
}
})
})
customDialogList.getRecyclerView().adapter = listPhonesAdapter
customDialogList.getRecyclerView().layoutManager =

View File

@ -5,6 +5,7 @@ import androidx.room.PrimaryKey
import androidx.room.TypeConverters
import com.google.gson.annotations.SerializedName
import es.verdnatura.db.MapTypeConverter
import es.verdnatura.domain.isoToString
import java.io.Serializable
class ClientTicketList(
@ -58,12 +59,13 @@ data class TicketObservation
(
var ticketFk: Long,
var description: String,
var observationType:ObservationType?=null
var observationType: ObservationType? = null
)
data class ObservationType(
var code:String?
var code: String?
)
@Entity(tableName = "signedPending")
data class SignedTickets(
@TypeConverters(MapTypeConverter::class) val queryMapList: MutableMap<String?, String?>,
@ -71,3 +73,48 @@ data class SignedTickets(
val fileName: String
)
data class RouteActionList(
var list: List<RouteAction> = listOf()
)
data class RouteAction(
val id: Number,
val price: Double,
val name: String,
)
data class RouteComplementList(
var list: List<RouteComplement> = listOf()
)
data class RouteComplement(
val id: Number,
val price: Number,
val workerFk: Number,
val routeAction: RouteAction
) {
var dated: String = ""
get() {
return field.isoToString(returnOnlyDate = true)
}
}
data class RouteComplementAdd(
val price: Number,
val workerFk: Number,
val routeActionFk: Number,
val dated: String,
)
data class ExpeditionWithTicket(
val id: Number,
val ticket: TicketExpedition,
)
data class TicketExpedition(
val clientFk: Number,
val warehouseFk: Number,
val addressFk: Number,
val agencyModeFk: Number
)

View File

@ -31,6 +31,17 @@ class ExpeditionSalix(
val isScanned: Int? = 0
)
data class ExpeditionsPosition(
val expeditions: List<ExpeditionSalixPosition> = listOf()
)
data class ExpeditionSalixPosition(
val expeditionFk: Number,
val stateCode: String? = null,
val isScanned: Int? = 0,
val scanOrder: Int? = null
)
class ExpeditionInfoList(
var list: List<ExpeditionInfoLog> = listOf()
)
@ -67,7 +78,7 @@ data class Agency(
class TicketSalix(
var id: Int,
var routeFk: Int?,
var route: RouteSalix,
var route: RouteSalix?,
)
@ -106,7 +117,8 @@ class ExpeditionInfoLoadUnload(
var code: String?,
var nickname: String,
var postalCode: String,
var isScanned: Int? = null
var isScanned: Int? = null,
var scanOrder: Int? = null
) : Serializable
@Entity(tableName = "expeditionPending")
@ -121,7 +133,8 @@ class ExpeditionInfoPending(
var code: String?,
var nickname: String,
var postalCode: String,
var isScanned: Int? = 0
var isScanned: Int? = 0,
var scanOrder: Int? = null
) : Serializable
@ -155,7 +168,7 @@ class RouteInfo(
@SerializedName(value = "driver", alternate = ["workerUserName"])
var driver: String?,
var hour: String?,
@TypeConverters(MapTypeConverter::class) var created: Date,
@TypeConverters(MapTypeConverter::class) var dated: Date,
var m3: Double,
@SerializedName(value = "numberPlate", alternate = ["vehiclePlateNumber"])
var numberPlate: String?,
@ -167,9 +180,10 @@ class RouteInfo(
var finished: String,
var header: Boolean = false,
//tarea 5867
var email: String? = null
var email: String? = null,
var agencyModeFk: Int
) : Serializable {
override fun toString(): String {
return "$driver$id$name$numberPlate$m3$created$hour$"
return "$driver$id$name$numberPlate$m3$$dated$hour$"
}
}

View File

@ -11,6 +11,7 @@ import es.verdnatura.presentation.base.BaseViewModel
import es.verdnatura.presentation.common.Event
import es.verdnatura.presentation.common.ExpeditionPrintOut
import es.verdnatura.presentation.common.ResponseSign
import es.verdnatura.presentation.common.getDayBounds
import es.verdnatura.presentation.view.feature.delivery.model.ClientTicketList
import es.verdnatura.presentation.view.feature.delivery.model.ClientTicketSalix
import es.verdnatura.presentation.view.feature.delivery.model.DeliveryInfo
@ -20,7 +21,13 @@ import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoLog
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoSummary
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionList
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionSummaryList
import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionWithTicket
import es.verdnatura.presentation.view.feature.delivery.model.FreeLanceDeliveryInfoList
import es.verdnatura.presentation.view.feature.delivery.model.RouteAction
import es.verdnatura.presentation.view.feature.delivery.model.RouteActionList
import es.verdnatura.presentation.view.feature.delivery.model.RouteComplement
import es.verdnatura.presentation.view.feature.delivery.model.RouteComplementAdd
import es.verdnatura.presentation.view.feature.delivery.model.RouteComplementList
import es.verdnatura.presentation.view.feature.delivery.model.RouteDelivery
import es.verdnatura.presentation.view.feature.delivery.model.RouteDeliveryList
import es.verdnatura.presentation.view.feature.delivery.model.RouteInfo
@ -35,6 +42,8 @@ import org.json.JSONObject
import retrofit2.Call
import retrofit2.Response
import java.io.File
import java.time.LocalDate
import java.time.format.DateTimeFormatter
class DeliveryViewModel(val context: Context) : BaseViewModel(context) {
@ -106,6 +115,143 @@ class DeliveryViewModel(val context: Context) : BaseViewModel(context) {
private val _responseStateList by lazy { MutableLiveData<Boolean>() }
val responseStateList: LiveData<Boolean> = _responseStateList
private val _routeActionList by lazy { MutableLiveData<RouteActionList>() }
val routeActionList: LiveData<RouteActionList> = _routeActionList
private val _routeComplementList by lazy { MutableLiveData<RouteComplementList>() }
val routeComplementList: LiveData<RouteComplementList> = _routeComplementList
private val _routeActionAdd by lazy { MutableLiveData<Boolean>() }
val routeActionAdd: LiveData<Boolean> = _routeActionAdd
fun getRouteAction() {
salix.getRouteAction()
.enqueue(object : SalixCallback<List<RouteAction>>(context) {
override fun onSuccess(response: Response<List<RouteAction>>) {
_routeActionList.value =
response.body()?.let { RouteActionList(it) }
}
})
}
fun getDataFromExpedition(expeditionId: Number, routeId: Number, landed: String) {
salix.getDataFromExpedition(
filter = """
|{
|"where":
|{"id":$expeditionId},
|"fields":["id","ticketFk"],
|"include":
|{
|"relation":"ticket",
|"scope":{
|"fields":["clientFk","addressFk","warehouseFk","agencyModeFk"]
| }
|}
|}""".trimMargin()
)
.enqueue(object : SalixCallback<List<ExpeditionWithTicket>>(context) {
override fun onSuccess(response: Response<List<ExpeditionWithTicket>>) {
val myTicketData = response.body()!![0]
moveExpeditions(
clientId = myTicketData.ticket.clientFk,
addressId = myTicketData.ticket.addressFk,
warehouseId = myTicketData.ticket.warehouseFk,
routeId = routeId,
agencyModeId = myTicketData.ticket.agencyModeFk,
expeditionsId = arrayListOf(expeditionId),
landed = landed
)
}
})
}
fun addRouteComplements(routeComplementAdd: RouteComplementAdd) {
salix.addRouteComplements(routeComplementAdd)
.enqueue(object : SalixCallback<Any>(context) {
override fun onSuccess(response: Response<Any>) {
getRouteComplements(
LocalDate.parse(
routeComplementAdd.dated,
DateTimeFormatter.ofPattern("yyyy-MM-dd")
)
.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")),
workerFk = routeComplementAdd.workerFk
)
}
})
}
fun moveExpeditions(
clientId: Number,
warehouseId: Number,
addressId: Number,
agencyModeId: Number,
routeId: Number,
expeditionsId: ArrayList<Number>,
landed: String
) {
salix.moveExpeditions(
clientId, warehouseId, addressId, agencyModeId, routeId, expeditionsId, landed
).enqueue(object : SalixCallback<Any>(context) {
override fun onSuccess(response: Response<Any>) {
}
})
}
fun getRouteComplements(date: String, workerFk: Number) {
val (startOfDay, endOfDay) = getDayBounds(date)
salix.getRouteComplements(
"""{
|"where": {
|"and": [
|{
|"dated": {
|"between": ["$startOfDay", "$endOfDay"]
|}
|},
|{
|"workerFK": "$workerFk"
|}
|]
|},
|"include": [
|{
|"relation": "routeAction",
|"scope": {
|"fields": {
|"routeActionFk": true,
|"name": true
|}
|}
|}
|]
|}""".trimMargin()
)
.enqueue(object : SalixCallback<List<RouteComplement>>(context) {
override fun onSuccess(response: Response<List<RouteComplement>>) {
_routeComplementList.value =
response.body()?.let { RouteComplementList(it) }
}
})
}
fun routeComplementDelete(id: Number, date: String, workerFk: Number) {
salix.routeComplementDelete(id)
.enqueue(object : SalixCallback<Any>(context) {
override fun onSuccess(response: Response<Any>) {
getRouteComplements(date, workerFk)
}
})
}
fun getTicketObservations(
listTickets: List<Long>

View File

@ -6,8 +6,10 @@ import androidx.recyclerview.widget.LinearLayoutManager
import com.google.gson.Gson
import es.verdnatura.R
import es.verdnatura.databinding.FragmentShelvinglogBinding
import es.verdnatura.domain.ConstAndValues.TOKENMULTIMEDIA
import es.verdnatura.domain.notNull
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.itemScanValue
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.feature.historicoshelvinglog.adapter.ShelvingLogAdapter
import es.verdnatura.presentation.view.feature.historicoshelvinglog.model.LogType
@ -23,6 +25,7 @@ class ShelvingLogFragment(
) {
private var adapter: ShelvingLogAdapter? = null
private var itemScan = ""
private var isitemFkScanned = false
companion object {
fun newInstance(entryPoint: String, logType: LogType) =
@ -43,17 +46,33 @@ class ShelvingLogFragment(
}
private fun setToolBar(title:String) {
private fun setToolBar(title: String) {
if (logType == LogType.SHELVING) {
binding.mainToolbar.toolbarTitle.text = title
when (logType) {
LogType.SHELVING -> {
binding.mainToolbar.toolbarTitle.text = title
}
} else {
binding.mainToolbar.toolbarTitle.text = title
binding.scanInput.setHint(getString(R.string.scanParkingTxt))
LogType.PREVIOUS -> {
binding.mainToolbar.toolbarTitle.text = title
binding.scanInput.setHint(getString(R.string.scanParkingTxt))
}
LogType.ITEMSHELVING -> {
binding.mainToolbar.toolbarTitle.text = title
binding.scanInput.setHint("Escanea carro o item")
}
}
/* if (logType == LogType.SHELVING) {
binding.mainToolbar.toolbarTitle.text = title
} else {
binding.mainToolbar.toolbarTitle.text = title
binding.scanInput.setHint(getString(R.string.scanParkingTxt))
}*/
}
private fun setEvents() {
@ -62,6 +81,11 @@ class ShelvingLogFragment(
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {
if (binding.scanInput.text.toString().isNotEmpty()) {
binding.scanInput.setText(
itemScanValue(
binding.scanInput.text.toString(), arrayOf("buy"), "id"
).toString()
)
when (logType) {
LogType.SHELVING -> {
viewModel.shelvings((binding.scanInput.text.toString()))
@ -69,6 +93,9 @@ class ShelvingLogFragment(
}
LogType.PREVIOUS -> viewModel.getParkingId((binding.scanInput.text.toString()))
LogType.ITEMSHELVING -> {
viewModel.shelvings((binding.scanInput.text.toString()))
}
}
itemScan = binding.scanInput.text.toString()
}
@ -95,11 +122,11 @@ class ShelvingLogFragment(
LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
setToolBar(getString(R.string.shelvingLog) + ":" + itemScan)
if (it.list.isEmpty()) {
customDialog.setTitle(getString(R.string.noResults))
.setDescription(getString(R.string.noDataLabelScanned))
.setOkButton(getString(R.string.close)) {
customDialog.dismiss()
}.show()
if (logType == LogType.SHELVING) {
showMessage()
} else {
viewModel.getIdFromCodeSalix(itemScan)
}
} else {
openWebViewer(it.list[0].id!!, "shelving")
}
@ -113,24 +140,65 @@ class ShelvingLogFragment(
}
}
loadResponseCode.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled().notNull {
setToolBar(getString(R.string.item) + itemScan)
if (it == -1) showMessage() else {
isitemFkScanned = true
openWebViewer(it, "")
}
}
}
}
}
override fun onPause() {
isitemFkScanned = false
super.onPause()
}
private fun showMessage() {
customDialog.setTitle(getString(R.string.noResults))
.setDescription(getString(R.string.noDataLabelScanned))
.setOkButton(getString(R.string.close)) {
customDialog.dismiss()
}.show()
}
private fun openWebViewer(param: Int, web: String) {
//variableWeb = if (itemScan is Number) "var-itemFk=$param" else "var-shelvingCode=$param"
ma.onPasillerosItemClickListener(
PasillerosItemVO(
title = R.string.titleWebViewer,
),
entryPoint = Gson().toJson(
mutableMapOf(
"entryPoint" to param,
"web" to "${mobileApplication.dataStoreApp.getServerLilium()}/#/$web/$param/log"
entryPoint = if (logType == LogType.ITEMSHELVING) {
Gson().toJson(
mutableMapOf(
"entryPoint" to param,
"web" to "https://grafana.verdnatura.es/d/ce4b8ymvex4owa?${
if (isitemFkScanned) "var-itemFk=$param&var-vnToken=${
mobileApplication.dataStoreApp.readDataStoreKey<String>(
TOKENMULTIMEDIA
)
}"
else "var-shelvingCode=$itemScan"
}"
)
)
)
} else {
Gson().toJson(
mutableMapOf(
"entryPoint" to param,
"web" to "${mobileApplication.dataStoreApp.getServerLilium()}/#/$web/$param/log"
)
)
}
)
}
}
}

View File

@ -6,6 +6,7 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.map
import com.google.gson.JsonObject
import es.verdnatura.domain.SalixCallback
import es.verdnatura.domain.userCases.GetItemFromBarcodeUseCase
import es.verdnatura.presentation.base.BaseViewModel
import es.verdnatura.presentation.common.Event
import es.verdnatura.presentation.view.feature.historicoshelvinglog.model.ShelvingLogSalix
@ -13,14 +14,18 @@ import es.verdnatura.presentation.view.feature.historicoshelvinglog.model.Shelvi
import retrofit2.Response
class ShelvingLogViewModel(val context: Context) : BaseViewModel(context) {
private val getItemFromBarcodeUseCase = GetItemFromBarcodeUseCase(salix)
private val _itemShelvingLogSalixList by lazy { MutableLiveData<ShelvingLogSalixList>() }
val loadShelvingLogSalixList: LiveData<Event<ShelvingLogSalixList>> =
_itemShelvingLogSalixList.map { Event(it) }
private val _responseParkingId by lazy { MutableLiveData<Int?>() }
val responseParkingId: LiveData<Int?> = _responseParkingId
val loadResponseParking: LiveData<Event<Int?>> =_responseParkingId.map { Event(it) }
val loadResponseParking: LiveData<Event<Int?>> = _responseParkingId.map { Event(it) }
private val _responseCode by lazy { MutableLiveData<Int?>() }
val responseCode: LiveData<Int?> = _responseCode
val loadResponseCode: LiveData<Event<Int?>> = _responseCode.map { Event(it) }
fun shelvings(vShelvingFK: String) {
salix.shelvingsGet("""{"where": {"code": "$vShelvingFK"}}""").enqueue(object :
@ -41,13 +46,26 @@ class ShelvingLogViewModel(val context: Context) : BaseViewModel(context) {
.enqueue(object :
SalixCallback<List<JsonObject>>(context) {
override fun onSuccess(response: Response<List<JsonObject>>) {
_responseParkingId.value = response.body()?.firstOrNull()?.entrySet()?.firstOrNull()?.value?.toString()?.toIntOrNull()
_responseParkingId.value =
response.body()?.firstOrNull()?.entrySet()?.firstOrNull()?.value?.toString()
?.toIntOrNull()
}
})
}
fun getIdFromCodeSalix(code: String) {
getItemFromBarcodeUseCase.execute(code)
.enqueue(object : SalixCallback<Int?>(context) {
override fun onSuccess(response: Response<Int?>) {
_responseCode.value = response.body() ?: -1
}
})
}
}

View File

@ -40,8 +40,10 @@ data class DeviceLogSalix(
val versionApp: String,
val serialNumber: String?
)
enum class LogType {
SHELVING,
PREVIOUS,
ITEMSHELVING
}

View File

@ -89,7 +89,7 @@ class InventoryParkingAdapter(
onPasillerosItemClickListener.onPasillerosItemClickListener(
PasillerosItemVO(
title =
R.string.itemSearch
R.string.itemSearch
), item.itemFk.toString()
)
}
@ -126,21 +126,19 @@ class InventoryParkingAdapter(
itemShelving.setOnClickListener {
onPasillerosItemClickListener.onPasillerosItemClickListener(
PasillerosItemVO(
title = R.string.titleUbicator)
, item.shelvingFk
title = R.string.titleUbicator
), item.shelvingFk
)
}
itemfkText.setOnClickListener {
onPasillerosItemClickListener.onPasillerosItemClickListener(
PasillerosItemVO(
title = R.string.itemSearch)
, item.itemFk.toString()
title = R.string.itemSearch
), item.itemFk.toString()
)
}
if (item.isChecked != null) {
println("item ${item.itemFk} checked ${item.isChecked} ")
when (item.isChecked!!.toInt()) {
in 1..Int.MAX_VALUE -> itemRowLayout.setBackgroundColor(

View File

@ -11,6 +11,7 @@ import es.verdnatura.R
import es.verdnatura.databinding.FragmentInventaryBinding
import es.verdnatura.domain.ConstAndValues.BUYER
import es.verdnatura.domain.ConstAndValues.BUYERID
import es.verdnatura.domain.ConstAndValues.ITEMPACKINGTYPEFILTER
import es.verdnatura.domain.ConstAndValues.WAREHOUSEFK
import es.verdnatura.domain.toast
import es.verdnatura.presentation.base.BaseFragment
@ -18,13 +19,14 @@ import es.verdnatura.presentation.common.OnInvetoryNichoClickListener
import es.verdnatura.presentation.common.OnOptionsSelectedListener
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.common.ToolBarAdapterTooltip
import es.verdnatura.presentation.view.commom.NameWithId
import es.verdnatura.presentation.view.commom.SearchableAdapter
import es.verdnatura.presentation.view.component.CustomDialogInput
import es.verdnatura.presentation.view.component.CustomDialogTwoButtons
import es.verdnatura.presentation.view.feature.calidad.model.BuyerVO
import es.verdnatura.presentation.view.feature.calidad.model.Buyer
import es.verdnatura.presentation.view.feature.inventario.adapter.InventoryAdapter
import es.verdnatura.presentation.view.feature.inventario.model.ItemInventaryVO
import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
import ir.mirrajabi.searchdialog.SimpleSearchDialogCompat
import kotlinx.coroutines.launch
@Suppress("UNUSED_ANONYMOUS_PARAMETER")
@ -39,10 +41,10 @@ class InventaryFragment :
private var pasillerosItemClickListener: OnPasillerosItemClickListener? = null
private var layoutManager: LinearLayoutManager? = null
private var firstVisiblePosition = 0
private var secondVisiblePosition = 1
private lateinit var itemClicked: ItemInventaryVO
private val items = ArrayList<SearchBuyerModel>()
private lateinit var buyerId: String
private var buyerId: Number = -1
private var filterItemType: String? = null
private var myListBuyers = listOf<Buyer>()
companion object {
fun newInstance() = InventaryFragment()
@ -57,41 +59,41 @@ class InventaryFragment :
override fun init() {
viewModel.itemShelvingBuyerGet()
// viewModel.itemShelvingBuyerGet()
viewModel.itemShelvingBuyerGetByItemPacking()
binding.filterBuyer.text = mobileApplication.dataStoreApp.readDataStoreKey<String>((BUYER))
buyerId = mobileApplication.dataStoreApp.readDataStoreKey((BUYERID))
if (buyerId.isNotBlank()) {
filterItemType =
mobileApplication.dataStoreApp.readDataStoreKey<String>((ITEMPACKINGTYPEFILTER))
binding.filterItemType.setText(filterItemType!!.firstOrNull()?.toString() ?: "").toString()
buyerId = mobileApplication.dataStoreApp.readDataStoreKey<Int>((BUYERID))
if (buyerId != -1) {
viewModel.getInventory(
buyerId.toInt(), mobileApplication.dataStoreApp.readDataStoreKey(WAREHOUSEFK)
buyerId, mobileApplication.dataStoreApp.readDataStoreKey(WAREHOUSEFK)
)
}
binding.filterBuyer.setOnClickListener {
SimpleSearchDialogCompat(
context,
getString(R.string.compradores),
getString(R.string.escribirparteNombre),
null,
items
) { baseSearchDialogCompat, nombre, position ->
val distinctPackingTypes = myListBuyers
binding.filterBuyer.text = (nombre.title)
buyerId = nombre.getBuyerId()
lifecycleScope.launch {
mobileApplication.dataStoreApp.editDataStoreKey(
BUYER, nombre.getBuyerNickname()
)
mobileApplication.dataStoreApp.editDataStoreKey(
BUYERID, nombre.getBuyerId()
.filter { filterItemType == getString(R.string.allText) || filterItemType == "" || it.itemPackingTypeFk == filterItemType }
.map {
NameWithId(
it.worker.user.id, it.worker.user.nickname
)
}
viewModel.getInventory(
nombre.getBuyerId().toInt(),
mobileApplication.dataStoreApp.readDataStoreKey(WAREHOUSEFK)
)
baseSearchDialogCompat.dismiss()
}.show()
.distinct()
.sortedBy { it.name }
setSearchable(distinctPackingTypes as MutableList<NameWithId>)
binding.searchableRecyclerView.visibility = View.VISIBLE
binding.searchableRecyclerView.setSearchHint(getString(R.string.BuyerSearch))
ma.hideKeyboard(binding.searchableRecyclerView)
}
binding.filterItemType.setOnClickListener {
binding.searchableRecyclerViewItemType.visibility = View.VISIBLE
binding.searchableRecyclerViewItemType.setSearchHint(getString(R.string.selectItemType))
}
customDialogInput = CustomDialogInput(requireContext())
customDialog = CustomDialogTwoButtons(requireContext())
binding.mainToolbar.toolbarTitle.text = getString(R.string.itemShelvingRadar)
@ -100,6 +102,59 @@ class InventaryFragment :
super.init()
}
private fun setSearchable(listNames: MutableList<NameWithId>) {
val adapter =
SearchableAdapter(
listElements = listNames,
context = requireContext()
) { elementSelected ->
lifecycleScope.launch {
mobileApplication.dataStoreApp.editDataStoreKey(
BUYER, elementSelected.name
)
mobileApplication.dataStoreApp.editDataStoreKey(
BUYERID, elementSelected.id
)
}
viewModel.getInventory(
elementSelected.id,
mobileApplication.dataStoreApp.readDataStoreKey(WAREHOUSEFK)
)
binding.filterBuyer.text = (elementSelected.name)
buyerId = elementSelected.id
binding.searchableRecyclerView.visibility = View.GONE
}
binding.searchableRecyclerView.setAdapter(adapter, listNames)
}
private fun setSearchableItemPacking(listNames: MutableList<NameWithId>) {
val adapter =
SearchableAdapter(
listElements = listNames,
context = requireContext()
) { elementSelected ->
lifecycleScope.launch {
mobileApplication.dataStoreApp.editDataStoreKey(
ITEMPACKINGTYPEFILTER, elementSelected.name
)
}
binding.filterItemType.text = elementSelected.name.firstOrNull()?.toString() ?: ""
filterItemType = elementSelected.name
binding.searchableRecyclerViewItemType.visibility = View.GONE
}
binding.searchableRecyclerViewItemType.setAdapter(adapter, listNames)
}
private fun setToolBar() {
ma.hideBottomNavigation(View.GONE)
val listIcons: ArrayList<ImageView> = ArrayList()
@ -114,9 +169,9 @@ class InventaryFragment :
if (item == iconReload.drawable) {
firstVisiblePosition = layoutManager?.findFirstVisibleItemPosition() ?: 0
if (buyerId.isNotBlank()) {
if (buyerId != -1) {
viewModel.getInventory(
buyerId.toInt(),
buyerId,
mobileApplication.dataStoreApp.readDataStoreKey(WAREHOUSEFK)
)
} else {
@ -157,7 +212,7 @@ class InventaryFragment :
setFilterItem()
}
adapter!!.notifyDataSetChanged()
adapter?.notifyDataSetChanged()
return@setOnKeyListener false
}
}
@ -178,10 +233,31 @@ class InventaryFragment :
override fun observeViewModel() {
with(viewModel) {
buyersList.observe(viewLifecycleOwner) {
createBuyerList(it.list)
buyersByItemPackingList.observe(viewLifecycleOwner) { list ->
myListBuyers = list.list
val distinctPackingTypes =
list?.list?.map {
NameWithId(
1, it.itemPackingTypeFk ?: getString(R.string.allText)
)
}
?.distinct()
?: emptyList()
setSearchableItemPacking(distinctPackingTypes as MutableList<NameWithId>)
}
buyersList.observe(viewLifecycleOwner) { item ->
setSearchable(item.list.map {
NameWithId(
it.userFk,
it.nickname
)
} as MutableList<NameWithId>)
}
inventaryList.observe(viewLifecycleOwner) { it ->
listInventory = ArrayList()
listInventoryAux = ArrayList()
@ -191,6 +267,8 @@ class InventaryFragment :
listInventoryAux.add(it)
}
}
adapter = InventoryAdapter(listInventory, object : OnInvetoryNichoClickListener {
override fun onInvetoryNichoClickListener(item: ItemInventaryVO) {
customDialog.setTitle(item.itemFk.toString() + "\n" + item.longName)
@ -265,13 +343,6 @@ class InventaryFragment :
}
private fun createBuyerList(list: List<BuyerVO>) {
items.clear()
if (list.isNotEmpty()) list.forEach { buyer ->
items.add(SearchBuyerModel(buyer.nickname, buyer.userFk))
}
}
}

View File

@ -44,7 +44,6 @@ import es.verdnatura.presentation.view.feature.inventario.model.ItemShelvingVisi
import es.verdnatura.presentation.view.feature.inventario.model.ItemShelvingVisibleZero
import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicadorVO
import kotlinx.coroutines.runBlocking
import timber.log.Timber.d
@Suppress("UNUSED_ANONYMOUS_PARAMETER")
class InventaryParkingFragment(
@ -77,13 +76,15 @@ class InventaryParkingFragment(
override fun getLayoutId(): Int = R.layout.fragment_inventory_parking
override fun onPause() {
try {
// try {
if (binding.inventoryParkingRecyclerview.layoutManager != null) {
val layoutManager =
binding.inventoryParkingRecyclerview.layoutManager as LinearLayoutManager
scrollPosition = layoutManager.findFirstVisibleItemPosition()
} catch (exception: Exception) {
d(exception)
}
/* } catch (ex: Exception) {
ex.message!! + "hola".toast(requireContext())
}*/
isBack = true
super.onPause()
@ -193,7 +194,7 @@ class InventaryParkingFragment(
)
} catch (ex: Exception) {
d(ex)
ex.message!!.toast(requireContext())
}
}
@ -475,10 +476,14 @@ class InventaryParkingFragment(
ex.message!!.toast(requireContext())
}
positionShelvingChecking = myListInventory.indexOfFirst { item ->
item.shelvingFk.uppercase() == binding.editMatricula.text.toString()
positionShelvingChecking = try {
myListInventory.indexOfFirst { item ->
item.shelvingFk.uppercase() == binding.editMatricula.text.toString()
}
} catch (ex: Exception) {
-1
}
if (positionShelvingChecking != -1) {
shelvingSaved =
myListInventory[positionShelvingChecking].shelvingFk.uppercase()
@ -611,7 +616,7 @@ class InventaryParkingFragment(
positionShelvingChecking = -1
} catch (ex: Exception) {
d(ex)
ex.message!!.toast(requireContext())
}
}
}

View File

@ -11,6 +11,8 @@ import es.verdnatura.domain.userCases.GetItemFromBarcodeUseCase
import es.verdnatura.presentation.base.BaseViewModel
import es.verdnatura.presentation.common.Event
import es.verdnatura.presentation.common.ItemDiscardSalixShortage
import es.verdnatura.presentation.view.feature.calidad.model.Buyer
import es.verdnatura.presentation.view.feature.calidad.model.BuyerList
import es.verdnatura.presentation.view.feature.calidad.model.BuyerListVO
import es.verdnatura.presentation.view.feature.calidad.model.BuyerVO
import es.verdnatura.presentation.view.feature.inventario.model.InventaryListVO
@ -46,6 +48,10 @@ class InventaryViewModel(val context: Context) : BaseViewModel(context) {
val buyersList: LiveData<BuyerListVO>
get() = _buyersList
private val _buyersByItemPackingList by lazy { MutableLiveData<BuyerList>() }
val buyersByItemPackingList: LiveData<BuyerList>
get() = _buyersByItemPackingList
private val _mistakeDepartmentList by lazy { MutableLiveData<DepartmentMistakeList>() }
val mistakeDepartmentList: LiveData<DepartmentMistakeList>
get() = _mistakeDepartmentList
@ -80,9 +86,23 @@ class InventaryViewModel(val context: Context) : BaseViewModel(context) {
})
}
fun itemShelvingBuyerGetByItemPacking() {
salix.getBuyersByItemPackingType(
"""{"fields":["itemPackingTypeFk","id","workerFk"],
|"include":{"relation":"worker","scope":{"fields":["id"],
|"include":{"relation":"user","scope":{"fields":["nickname"]}}}}}""".trimMargin()
)
.enqueue(object : SalixCallback<List<Buyer>>(context) {
override fun onSuccess(response: Response<List<Buyer>>) {
_buyersByItemPackingList.value = response.body()?.let { BuyerList(it) }
}
})
}
val loadInventaryList: LiveData<Event<InventaryListVO>> = _inventaryList.map { Event(it) }
fun getInventory(buyerFk: Int, warehouseFk: Int) {
fun getInventory(buyerFk: Number, warehouseFk: Int) {
salix.itemShelvingFilterBuyer(params = arrayListOf(buyerFk, warehouseFk))
.enqueue(object : SalixCallback<List<ItemInventaryVO>>(context) {
override fun onSuccess(response: Response<List<ItemInventaryVO>>) {
@ -146,7 +166,7 @@ class InventaryViewModel(val context: Context) : BaseViewModel(context) {
})
}
fun workerGetFromHasMistake(departmentFk: Int) {
fun workerGetFromHasMistake(departmentFk: Number) {
salix.workerGetFromHasMistake(arrayListOf(departmentFk))
.enqueue(object : SalixCallback<List<WorkerFromMistake>>(context) {
override fun onSuccess(response: Response<List<WorkerFromMistake>>) {

View File

@ -1,61 +0,0 @@
package es.verdnatura.presentation.view.feature.inventario.fragment
import ir.mirrajabi.searchdialog.core.Searchable
class SearchBuyerModel(private var nickname: String?, private var buyerId: Int?) : Searchable {
override fun getTitle(): String {
return nickname!!
}
fun getBuyerId(): String {
return buyerId.toString()
}
fun getBuyerNickname(): String {
return nickname!!
}
}
class SearchDepartmentModel(private var name: String?, private var departmentId: Int?) :
Searchable {
override fun getTitle(): String {
return name!!
}
fun getDepartmentId(): Int {
return departmentId!!
}
fun getDepartmentName(): String {
return name!!
}
}
class SearchSupplierModel(
private var name: String?,
private var id: String?,
private var observation: String?
) : Searchable {
fun getId(): String {
return id!!
}
fun getName(): String {
return name!!
}
override fun getTitle(): String {
return name!!
}
fun getObservation(): String {
return observation ?: ""
}
}

View File

@ -3,6 +3,7 @@ package es.verdnatura.presentation.view.feature.login.fragment
import android.annotation.SuppressLint
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import android.view.View.GONE
import android.view.View.VISIBLE
@ -21,6 +22,7 @@ import es.verdnatura.domain.ConstAndValues.RENEWINTERVAL
import es.verdnatura.domain.ConstAndValues.RENEWPERIOD
import es.verdnatura.domain.ConstAndValues.TOKEN
import es.verdnatura.domain.ConstAndValues.TOKENCREATED
import es.verdnatura.domain.ConstAndValues.TOKENMULTIMEDIA
import es.verdnatura.domain.ConstAndValues.TTL
import es.verdnatura.domain.ConstAndValues.USER
import es.verdnatura.domain.ConstAndValues.WORKFORMSELECTED
@ -41,7 +43,7 @@ import kotlinx.coroutines.runBlocking
import java.util.Date
import kotlin.system.exitProcess
class LoginFragment(private var imageUri: Uri?) :
class LoginFragment() :
BaseFragment<FragmentLoginBinding, LoginViewModel>(LoginViewModel::class) {
private lateinit var customDialogInput: CustomDialogInput
@ -50,9 +52,23 @@ class LoginFragment(private var imageUri: Uri?) :
private var workFormAdapter: WorkFormAdapter? = null
private lateinit var customDialogList: CustomDialogList
private lateinit var listForms: List<WorkForms>
private var imageUri: Uri? = null
companion object {
fun newInstance(imageUri: Uri?) = LoginFragment(imageUri)
private const val ARG_IMAGE_URI = "image_uri"
fun newInstance(imageUri: Uri?): LoginFragment {
return LoginFragment().apply {
arguments = Bundle().apply {
putParcelable(ARG_IMAGE_URI, imageUri)
}
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
imageUri = arguments?.getParcelable(ARG_IMAGE_URI)
}
override fun getLayoutId(): Int = R.layout.fragment_login
@ -469,6 +485,15 @@ class LoginFragment(private var imageUri: Uri?) :
}
}
multimediaTokenResponse.observe(viewLifecycleOwner) {
runBlocking {
mobileApplication.dataStoreApp.editDataStoreKey(
TOKENMULTIMEDIA,
it.multimediaToken.id
)
}
}
loginSalixItem.observe(viewLifecycleOwner) {
@ -499,6 +524,7 @@ class LoginFragment(private var imageUri: Uri?) :
app.userPassword = binding.edittextPassword.text.toString()
viewModel.getAccessTokenConfigs()
viewModel.getMultimedaToken()
}
}
loadAccessConfigSalixList.observe(viewLifecycleOwner) { event ->

View File

@ -23,6 +23,7 @@ import es.verdnatura.presentation.view.feature.login.model.AccessConfigSalixList
import es.verdnatura.presentation.view.feature.login.model.DataUserSalix
import es.verdnatura.presentation.view.feature.login.model.LoginDevice
import es.verdnatura.presentation.view.feature.login.model.LoginSalixVO
import es.verdnatura.presentation.view.feature.login.model.MultimediaTokenResponse
import es.verdnatura.presentation.view.feature.login.model.OperatorAdd
import es.verdnatura.presentation.view.feature.login.model.OperatorSalix
import es.verdnatura.presentation.view.feature.login.model.RenewToken
@ -58,13 +59,16 @@ class LoginViewModel(val context: Context) : BaseViewModel(context) {
get() = _workerOperator
private val _accessConfigSalixList by lazy { MutableLiveData<AccessConfigSalixList>() }
private val _renewTokenResponse by lazy { MutableLiveData<RenewToken>() }
val renewTokenResponse: LiveData<RenewToken>
get() = _renewTokenResponse
val loadAccessConfigSalixList: LiveData<Event<AccessConfigSalixList>> =
_accessConfigSalixList.map { Event(it) }
private val _multimediaTokenResponse by lazy { MutableLiveData<MultimediaTokenResponse>() }
val multimediaTokenResponse: LiveData<MultimediaTokenResponse>
get() = _multimediaTokenResponse
fun loginSalix(user: String, password: String) {
salix.login(LoginSalixVO(user, password))
.enqueue(object : SalixCallback<LoginSalixVO>(context) {
@ -285,6 +289,21 @@ class LoginViewModel(val context: Context) : BaseViewModel(context) {
})
}
fun getMultimedaToken(
) {
salix.getMultimediaToken()
.enqueue(object : SalixCallback<MultimediaTokenResponse>(context) {
override fun onSuccess(response: Response<MultimediaTokenResponse>) {
_multimediaTokenResponse.value = response.body()?.let {
it
}
}
})
}
fun renewToken(
) {
salix.renewToken().enqueue(object : SalixCallback<RenewToken>(context) {

View File

@ -18,8 +18,8 @@ data class WorkerData(
val labelerFk: Int,
val sectorFk: Int,
val sector: Sector?,
val printer: Printer,
val train: Train,
val printer: Printer?,
val train: Train?,
val id: Int,
val name: String,
val nickname: String,
@ -115,4 +115,12 @@ class LoginDevice(
data class NameWorker(
val firstName: String, val lastName: String
)
data class MultimediaTokenResponse(
val multimediaToken: MultimediaToken
)
data class MultimediaToken(
val id: String,
)

View File

@ -77,6 +77,7 @@ import es.verdnatura.presentation.view.feature.delivery.fragments.InfoFragment
import es.verdnatura.presentation.view.feature.delivery.fragments.LoadUnloadFragment
import es.verdnatura.presentation.view.feature.delivery.fragments.LogExpeditionFragment
import es.verdnatura.presentation.view.feature.delivery.fragments.RoutesFragment
import es.verdnatura.presentation.view.feature.delivery.fragments.SalaryComplementFragment
import es.verdnatura.presentation.view.feature.delivery.fragments.SummaryFragment
import es.verdnatura.presentation.view.feature.delivery.fragments.TicketsFragment
import es.verdnatura.presentation.view.feature.delivery.model.ClientTicketSalix
@ -134,7 +135,7 @@ import es.verdnatura.presentation.view.feature.sacador.model.CollectionTicket
import es.verdnatura.presentation.view.feature.sacador.model.CollectionVO
import es.verdnatura.presentation.view.feature.ticket.fragment.TicketAdvanceFragment
import es.verdnatura.presentation.view.feature.ubicador.fragment.AutomaticAddItemFragment
import es.verdnatura.presentation.view.feature.ubicador.fragment.UbicadorFragmentNew
import es.verdnatura.presentation.view.feature.ubicador.fragment.UbicadorFragment6869
import es.verdnatura.presentation.view.feature.workermistake.fragment.PackingMistakeFragment
import es.verdnatura.presentation.view.feature.workermistake.fragment.WorkermistakeFragment
import kotlinx.coroutines.DelicateCoroutinesApi
@ -142,7 +143,6 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import timber.log.Timber.d
import java.util.Date
import java.util.concurrent.Executors
import java.util.concurrent.ScheduledExecutorService
@ -543,24 +543,23 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnPasillerosItemClickL
getString(R.string.titleChecker) -> {
// Ya no se utiliza : addFragmentOnTop(ControladorFragment.newInstance())
// if (mobileApplication.userId == 19591) {
if (mobileApplication.userId == 19591) {
println("Revisando nueva")
addFragmentOnTop(
CollectionFragmentChecker.newInstance(
CollectionVO(collectionFk = 0),
type = CONTROLADOR
)
addFragmentOnTop(
CollectionFragmentChecker.newInstance(
CollectionVO(collectionFk = 0),
type = CONTROLADOR
)
} else {
println("Revisando vieja")
addFragmentOnTop(
CollectionFragment.newInstance(
CollectionVO(collectionFk = 0),
type = CONTROLADOR
)
)
}
)
/* } else {
println("Revisando vieja")
addFragmentOnTop(
CollectionFragment.newInstance(
CollectionVO(collectionFk = 0),
type = CONTROLADOR
)
)
}*/
/* addFragmentOnTop(
CollectionFragment.newInstance(
CollectionVO(collectionFk = 0),
@ -674,8 +673,13 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnPasillerosItemClickL
}
getString(R.string.titleUbicator) -> {
addFragmentOnTop(UbicadorFragmentNew.newInstance(entryPoint))
//addFragmentOnTop(UbicadorFragmentNew.newInstance(entryPoint))
addFragmentOnTop(UbicadorFragment6869.newInstance(entryPoint))
}
//Tarea 6869
/* getString(R.string.ubicatorNew) -> {
addFragmentOnTop(UbicadorFragment6869.newInstance(entryPoint))
}*/
//Tarea 7855
getString(R.string.scanPreparedExpedition) -> {
@ -755,7 +759,10 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnPasillerosItemClickL
getString(R.string.titleShelvingHistorical) -> {
addFragmentOnTop(ItemShelvingLogFragment.newInstance(itemTitle))
}
//Tarea 7920
getString(R.string.titleShelvingHistNew) -> {
addFragmentOnTop(ShelvingLogFragment.newInstance(itemTitle, LogType.ITEMSHELVING))
}
getString(R.string.titleLogShelving) -> {
@ -823,7 +830,8 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnPasillerosItemClickL
}
getString(R.string.selfConsumption) -> {
addFragmentOnTop(UbicadorFragmentNew.newInstance(entryPoint, true))
// addFragmentOnTop(UbicadorFragmentNew.newInstance(entryPoint, true))
addFragmentOnTop(UbicadorFragment6869.newInstance(entryPoint, true))
}
getString(R.string.titlePackingHolland) -> {
@ -944,6 +952,10 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnPasillerosItemClickL
addFragmentOnTop(PickerHelperFragment.newInstance(itemTitle))
}
getString(R.string.salarySupplementTitle) -> {
addFragmentOnTop(SalaryComplementFragment.newInstance(itemTitle))
}
"PREITEMPICKERTEST" -> {
addFragmentOnTop(
CollectionFragmentPickerPreviousNew.newInstance(
@ -986,7 +998,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnPasillerosItemClickL
}
} catch (ex: Exception) {
d("$ex")
ex.message!!.toast(this)
}
}
@ -1048,7 +1060,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnPasillerosItemClickL
) {
when (type) {
PREITEMPICKERTEST -> {
println("test presacador")
//addFragmentOnTop(EndSacadorFragment.newInstance(collection, type))
addFragmentOnTop(
SectorCollectionReserveFragment.newInstance(
@ -1217,7 +1228,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnPasillerosItemClickL
userFk = (application as MobileApplication).userId!!
)
} catch (ex: Exception) {
d(ex.message.toString())
ex.message!!.toast(this)
}
}

View File

@ -12,15 +12,13 @@ import es.verdnatura.domain.ConstAndValues.SUPPLIERID
import es.verdnatura.domain.ConstAndValues.SUPPLIERNAME
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.view.commom.NameWithId
import es.verdnatura.presentation.view.commom.SearchableAdapter
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.feature.inventario.fragment.SearchSupplierModel
import es.verdnatura.presentation.view.feature.packaging.model.EntrySalix
import es.verdnatura.presentation.view.feature.packaging.model.Supplier
import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
import ir.mirrajabi.searchdialog.SimpleSearchDialogCompat
import kotlinx.coroutines.runBlocking
@Suppress("UNUSED_ANONYMOUS_PARAMETER")
class SupplierFragment(
var entryPoint: String = ""
@ -31,8 +29,7 @@ class SupplierFragment(
private var pasillerosItemClickListener: OnPasillerosItemClickListener? = null
private var layoutManager: LinearLayoutManager? = null
private var onBack = false
private val suppliers = ArrayList<SearchSupplierModel>()
private val entries = ArrayList<SearchSupplierModel>()
private val entries = ArrayList<EntrySalix>()
private lateinit var customDialog: CustomDialog
companion object {
@ -59,27 +56,14 @@ class SupplierFragment(
override fun init() {
binding.filterSupplier.setOnClickListener {
SimpleSearchDialogCompat(
context,
getString(R.string.suppliers),
getString(R.string.escribirparteNombre),
null,
suppliers
) { baseSearchDialogCompat, nombre, position ->
binding.filterSupplier.text = (nombre.getName())
runBlocking {
mobileApplication.dataStoreApp.editDataStoreKey(
SUPPLIERNAME,
nombre.getName()
)
mobileApplication.dataStoreApp.editDataStoreKey(
SUPPLIERID,
nombre.getId().toInt()
)
}
viewModel.getEntriesFromSupplier(nombre.getId().toInt())
baseSearchDialogCompat.dismiss()
}.show()
binding.searchableSuplierRecyclerView.visibility = View.VISIBLE
binding.searchableSuplierRecyclerView.setSearchHint(getString(R.string.supplierSearch))
}
binding.filterEntry.setOnClickListener {
binding.searchableEntriesRecyclerView.visibility = View.VISIBLE
binding.searchableEntriesRecyclerView.setSearchHint(getString(R.string.entrySearch))
}
customDialog = CustomDialog(requireContext())
ma.hideBottomNavigation(View.GONE)
@ -89,6 +73,64 @@ class SupplierFragment(
super.init()
}
private fun setSearchable(listNames: MutableList<NameWithId>) {
val adapter =
SearchableAdapter(
listElements = listNames,
context = requireContext()
) { elementSelected ->
binding.filterSupplier.text = (elementSelected.name)
runBlocking {
mobileApplication.dataStoreApp.editDataStoreKey(
SUPPLIERNAME,
elementSelected.name
)
mobileApplication.dataStoreApp.editDataStoreKey(
SUPPLIERID,
elementSelected.id
)
}
viewModel.getEntriesFromSupplier(elementSelected.id)
binding.searchableSuplierRecyclerView.visibility = View.GONE
}
binding.searchableSuplierRecyclerView.setAdapter(adapter, listNames)
}
private fun setSearchableEntries(listNames: MutableList<NameWithId>) {
val adapter =
SearchableAdapter(
listElements = listNames,
context = requireContext()
) { elementSelected ->
binding.filterEntry.text = elementSelected.name
runBlocking {
mobileApplication.dataStoreApp.editDataStoreKey(
ENTRYID,
elementSelected.id
)
mobileApplication.dataStoreApp.editDataStoreKey(
ENTRYOBSERVATIONORIGINAL,
entries.find { it.id == elementSelected.id }?.observation ?: ""
)
mobileApplication.dataStoreApp.deleteImages()
}
ma.onPasillerosItemClickListener(
PasillerosItemVO(title = R.string.titlePackagingCount),
getString(R.string.titlePackagingCount)
)
binding.searchableEntriesRecyclerView.visibility = View.GONE
}
binding.searchableEntriesRecyclerView.setAdapter(adapter, listNames)
}
private fun setToolBar() {
binding.mainToolbar.toolbarTitle.text = entryPoint
}
@ -103,41 +145,18 @@ class SupplierFragment(
private fun setEntryDialog() {
binding.filterEntry.visibility = View.VISIBLE
binding.filterEntry.setOnClickListener {
SimpleSearchDialogCompat(
context,
getString(R.string.entry),
getString(R.string.escribirparteNombre),
null,
entries
) { baseSearchDialogCompat, nombre, position ->
binding.filterEntry.text = nombre.getName()
runBlocking {
mobileApplication.dataStoreApp.editDataStoreKey(
ENTRYID,
nombre.getId().toInt()
)
mobileApplication.dataStoreApp.editDataStoreKey(
ENTRYOBSERVATIONORIGINAL,
nombre.getObservation()
)
mobileApplication.dataStoreApp.deleteImages()
}
ma.onPasillerosItemClickListener(
PasillerosItemVO(title = R.string.titlePackagingCount),
getString(R.string.titlePackagingCount)
)
// }
baseSearchDialogCompat.dismiss()
}.show()
}
}
override fun observeViewModel() {
with(viewModel) {
supplierList.observe(viewLifecycleOwner) {
createSupplierList(it.list)
supplierList.observe(viewLifecycleOwner) { item ->
setSearchable(item.list.map {
NameWithId(
it.id!!,
it.name!!
)
} as MutableList<NameWithId>)
}
entryList.observe(viewLifecycleOwner) {
createEntryList(it.list)
@ -162,57 +181,20 @@ class SupplierFragment(
}
}
private fun createSupplierList(list: List<Supplier>) {
suppliers.clear()
if (list.isNotEmpty())
list.forEach { supplier ->
try {
suppliers.add(
SearchSupplierModel(
supplier.name,
supplier.id.toString(),
observation = ""
)
)
} catch (ex: Exception) {
ma.messageWithSound(
message = ex.message.toString(),
isError = true,
isPlayed = true
)
}
}
}
private fun createEntryList(list: List<EntrySalix>) {
list.sortedBy { it.travel?.landed }
entries.clear()
list.forEach { entry ->
if (!entry.isError) {
try {
entries.add(
SearchSupplierModel(
entry.id.toString() + "->" + (entry.travel?.landed),
id = entry.id.toString(),
observation = entry.observation
)
)
} catch (ex: Exception) {
ma.messageWithSound(
message = ex.message.toString(),
isError = true,
isPlayed = true
)
}
}
if (list.isNotEmpty() && !list[0].isError) {
setSearchableEntries(list.map { entry ->
NameWithId(
entry.id!!,
entry.id.toString() + "->" + (entry.travel?.landed)
)
} as MutableList<NameWithId>)
entries.addAll(list.sortedBy { it.travel?.landed })
}
binding.filterEntry.visibility = View.VISIBLE
setEntryDialog()
}
}

View File

@ -70,7 +70,7 @@ class SupplierViewModel(val context: Context) : BaseViewModel(context) {
})
}
fun getEntriesFromSupplier(supplier: Int) {
fun getEntriesFromSupplier(supplier: Number) {
val calendar = Calendar.getInstance()
calendar.add(Calendar.DAY_OF_YEAR, 0)

View File

@ -1,7 +1,6 @@
package es.verdnatura.presentation.view.feature.paletizador.adapter
import android.content.Context
import android.util.Log
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.content.ContextCompat
@ -12,47 +11,63 @@ import es.verdnatura.presentation.common.OnComprobarPalletViewClickListener
import es.verdnatura.presentation.common.OnPalletClickListener
import es.verdnatura.presentation.view.feature.paletizador.model.ItemExpeditionTruckVO
import es.verdnatura.presentation.view.feature.paletizador.model.ItemPalletVO
import timber.log.Timber.d
class ExpeditionPalletAdapter (
class ExpeditionPalletAdapter(
private val items: List<ItemPalletVO>,
private val onPalletClickListener: OnPalletClickListener,
private val onComprobarPalletViewClickListener: OnComprobarPalletViewClickListener,
private val itemExpeditionTruckVO: ItemExpeditionTruckVO
): RecyclerView.Adapter<ExpeditionPalletAdapter.ItemHolder> () {
) : RecyclerView.Adapter<ExpeditionPalletAdapter.ItemHolder>() {
private var context:Context? = null
private var context: Context? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder {
this.context = parent.context
return ItemHolder(
ItemExpeditionpalletRowBinding.inflate(LayoutInflater.from(parent.context),parent,false)
ItemExpeditionpalletRowBinding.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])
holder.binding.root.setOnClickListener {
onPalletClickListener.onPalletClickListener(itemExpeditionTruckVO,items[position])
onPalletClickListener.onPalletClickListener(itemExpeditionTruckVO, items[position])
}
holder.binding.root.setOnLongClickListener {
onComprobarPalletViewClickListener.onComprobarPalletViewClickListener(itemExpeditionTruckVO,items[position])
onComprobarPalletViewClickListener.onComprobarPalletViewClickListener(
itemExpeditionTruckVO,
items[position]
)
true
}
}
inner class ItemHolder(
val binding: ItemExpeditionpalletRowBinding
) : RecyclerView.ViewHolder(binding.root){
) : RecyclerView.ViewHolder(binding.root) {
private val res = binding.root.context.resources
fun bind(item: ItemPalletVO) {
binding.apply {
this.item = item
if (item.Rutas != 1){
expeditionPalletRutas.setTextColor(ContextCompat.getColor(context!!, R.color.verdnatura_red))
}else {
expeditionPalletRutas.setTextColor(ContextCompat.getColor(context!!, R.color.verdnatura_white))
if (item.Rutas != 1) {
expeditionPalletRutas.setTextColor(
ContextCompat.getColor(
context!!,
R.color.verdnatura_red
)
)
} else {
expeditionPalletRutas.setTextColor(
ContextCompat.getColor(
context!!,
R.color.verdnatura_white
)
)
}
}
}

View File

@ -90,7 +90,7 @@ class ExpeditionDeleteFragment(var title: String = "") :
if (binding.editMatricula.text.toString().isNotEmpty()) {
try {
val itemScaned = itemScanValue(
textScanned_filterDouble(binding.editMatricula.text.toString()),
textScannedFilterDouble(binding.editMatricula.text.toString()),
arrayOf("expedition"),
"id"
).toString().toLong()
@ -104,7 +104,7 @@ class ExpeditionDeleteFragment(var title: String = "") :
adapter!!.updateItems(listExpeditions.map { it.expeditionFk.toLong() } as ArrayList<Long>)
} else {
ma.messageWithSound(
message = "Caja ya escaneada",
message = getString(R.string.boxScanned),
isError = true,
isPlayed = true,
isToasted = true

View File

@ -44,7 +44,6 @@ class ExpeditionPalletDetailFragment(
override fun getLayoutId(): Int = R.layout.fragment_expedition_pallet_detail
override fun init() {
println("ExpeditionPalletDetail")
customDialog = CustomDialog(requireContext())
binding.expeditionPalletDetailPallet.text =
buildString {

View File

@ -59,7 +59,6 @@ class ExpeditionPalletFragment(
override fun getLayoutId(): Int = R.layout.fragment_expedition_pallet
override fun onCreate(savedInstanceState: Bundle?) {
println("ExpeditionPalletFragment")
mperror = MediaPlayer.create((activity as MainActivity), R.raw.error)
mpok = MediaPlayer.create((activity as MainActivity), R.raw.ok)
super.onCreate(savedInstanceState)
@ -214,8 +213,6 @@ class ExpeditionPalletFragment(
if (mperror != null) mperror!!.start()
}
}
customDialogList.setValue("")
ma.hideKeyboard(customDialogList.getEditText())

View File

@ -93,7 +93,7 @@ class ExpeditionPreparedStateFragment(var codeState: String = "PREPARED", var ti
if (binding.editMatricula.text.toString().isNotEmpty()) {
try {
val itemScaned = itemScanValue(
textScanned_filterDouble(binding.editMatricula.text.toString()),
textScannedFilterDouble(binding.editMatricula.text.toString()),
arrayOf("expedition"),
"id"
).toString().toLong()

View File

@ -71,7 +71,6 @@ class ExpeditionScanFragment(
}
override fun init() {
println("ExpeditionScanFragment")
customDialog = CustomDialog(requireContext())
customDialogList = CustomDialogList(requireContext())
customDialogTwoButtons = CustomDialogTwoButtons(requireContext())
@ -80,7 +79,11 @@ class ExpeditionScanFragment(
)
ma.hideBottomNavigation(View.GONE)
binding.mainToolbar.toolbarTitle.text =
getString(R.string.expeditionInfo, itemExpeditionTruckVO?.eta.orEmpty(), itemExpeditionTruckVO?.description.orEmpty())
getString(
R.string.expeditionInfo,
itemExpeditionTruckVO?.eta.orEmpty(),
itemExpeditionTruckVO?.description.orEmpty()
)
setToolBar()
setEvents()
viewModel.expeditionScanList(
@ -121,7 +124,6 @@ class ExpeditionScanFragment(
LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
}
override fun observeViewModel() {
with(viewModel) {
loadExpeditionScanList.observe(viewLifecycleOwner) { event ->

View File

@ -73,6 +73,15 @@ class PasilleroViewModel(context: Context) : BaseViewModel(context) {
)
)
/* if (userId == 19591)
_pasillerositem.add(
PasillerosItemVO(
R.drawable.ic_dashboard_black_24dp,
R.string.ubicatorNew,
R.string.titleUbicatorDescrip
)
)*/
//tarea 7855
_pasillerositem.add(
@ -513,6 +522,14 @@ class PasilleroViewModel(context: Context) : BaseViewModel(context) {
R.drawable.ic_packaging, R.string.titlePackingHolland, R.string.titleUbicatorDescrip
)
)
//tarea 8099
_pasillerositem.add(
PasillerosItemVO(
R.drawable.ic_salary_supplement,
R.string.salarySupplementTitle,
R.string.salarySupplementTitle
)
)
}
@ -520,10 +537,19 @@ class PasilleroViewModel(context: Context) : BaseViewModel(context) {
_pasillerositem.add(
PasillerosItemVO(
R.drawable.revision_icon,
R.string.titleShelvingHistorical,
R.string.titleShelvingHistDescrip
R.string.titleShelvingHistNew,
R.string.titleShelvingHistNew
)
)
/* _pasillerositem.add(
PasillerosItemVO(
R.drawable.revision_icon,
R.string.titleShelvingHistorical,
R.string.titleShelvingHistDescrip
)
)*/
_pasillerositem.add(
PasillerosItemVO(
R.drawable.ic_history_orange,

View File

@ -70,7 +70,7 @@ class PreControladorFragment :
"id"
).toString().toInt(),
print = false,
source = type
source = if (type == "PRECHECKER") "PREVIOUS_CONTROL" else type
)
} catch (ex: Exception) {
getString(R.string.errorInput)

View File

@ -60,19 +60,12 @@ class SectorCollectionReserveFragment(
}
override fun init() {
println("hasToAdd $hasToAdd")
customDialogList = CustomDialogList(requireContext())
ma.hideBottomNavigation(View.GONE)
binding.mainToolbar.toolbarTitle.text = title
setEvents()
setToolBar()
println("reserve collec $collectionFk")
println("reserve collec onBack$onBack")
if (!onBack) {
println("check parkings $collectionFk")
checkParkingsToPicker()
} else {
if (onBack) {

View File

@ -2,14 +2,12 @@ package es.verdnatura.presentation.view.feature.restaurant
import android.view.View
import android.widget.Button
import com.google.gson.Gson
import com.google.zxing.BarcodeFormat
import com.journeyapps.barcodescanner.BarcodeEncoder
import es.verdnatura.R
import es.verdnatura.databinding.ActivityRestaurantViewBinding
import es.verdnatura.domain.toast
import es.verdnatura.presentation.base.BaseActivity
import es.verdnatura.presentation.view.feature.restaurant.model.UserMenu
class RestaurantActivity : BaseActivity<ActivityRestaurantViewBinding>() {
@ -33,16 +31,27 @@ class RestaurantActivity : BaseActivity<ActivityRestaurantViewBinding>() {
binding.imageQr.visibility = View.VISIBLE
binding.txtOption.visibility = View.VISIBLE
binding.txtOption.text = (view as Button).text.toString()
val userMenu = UserMenu(
user = mobileApplication.userId!!,
menu_id = view.tag.toString().toInt(),
menu = view.text.toString(),
name = mobileApplication.userName!!
)
/* val userMenu = UserMenu(
user = mobileApplication.userId!!,
menu_id = view.tag.toString().toInt(),
menu = view.text.toString(),
name = mobileApplication.userName!!
)*/
val userMenuJson = StringBuilder()
.append("{")
.append("\"user\":").append(mobileApplication.userId).append(",") // Sin comillas
.append("\"menu_id\":").append(view.tag.toString().toInt()).append(",") // Sin comillas
.append("\"menu\":\"").append(view.text).append("\",") // Con comillas porque es texto
.append("\"name\":\"").append(mobileApplication.userName)
.append("\"") // Con comillas porque es texto
.append("}")
.toString()
try {
val barcodeEncoder = BarcodeEncoder()
val bitmap = barcodeEncoder.encodeBitmap(
Gson().toJson(userMenu),
userMenuJson,
BarcodeFormat.QR_CODE,
400,
400

View File

@ -1,8 +1,10 @@
package es.verdnatura.presentation.view.feature.restaurant.model
import com.google.gson.annotations.SerializedName
data class UserMenu(
val user: Int,
val menu_id: Int,
val menu: String,
val name: String
@SerializedName("user") val user: Int,
@SerializedName("menu_id") val menu_id: Int,
@SerializedName("menu") val menu: String,
@SerializedName("name") val name: String
)

View File

@ -138,15 +138,6 @@ class StopMapListFragment(
with(viewModel) {
loadStopMapTruckList.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled().notNull {
for (item in it.list) {
println("llista")
println("llista $item")
println("llista addressFk ${item.addressFk}")
println("llista id" + item.id)
println("llista address" + item.address)
println("llista client id" + item.address?.address?.client)
println("llista mobile " + item.address?.address?.mobile)
}
showRoadMapList(it)
}
}
@ -189,8 +180,6 @@ class StopMapListFragment(
}
TruckAction.GOTOMAPS -> {
println("locationMaps")
val uri =
"geo:0,0?q=" + item.address?.address?.nickname + " " + item.address?.address?.street + " " + item.address?.address?.city + " " + item.address?.address?.postalCode
val locationIntent = Intent(Intent.ACTION_VIEW, Uri.parse(uri))

View File

@ -3,6 +3,7 @@ package es.verdnatura.presentation.view.feature.sacador.fragment
import android.content.Context
import android.graphics.drawable.Drawable
import android.text.InputType
import android.util.Log.d
import android.view.View
import android.view.inputmethod.EditorInfo
import android.widget.ImageView
@ -242,7 +243,12 @@ class SacadorFragmentNew(
} else {
if (it.response.isNotBlank()) {
if (collectionsList.isNotEmpty()) {
addCollectionToList(it.response.toInt())
try {
addCollectionToList(it.response.toInt())
} catch (ex: Exception) {
d("vn", ex.message.toString())
}
} else {
callBack(type)
}
@ -258,7 +264,6 @@ class SacadorFragmentNew(
}
"PREITEMPICKERTEST" -> {
println("SacadorFragmentNew sectorCollectionGET")
// viewModel.sectorCollectionGet()
viewModel.sectorCollectionPartial()
}

View File

@ -68,7 +68,8 @@ data class Sale(
var isPicked: Int = 0,
var accumulatedQuantity: Int = 0,
var totalItemShelving: Int = 0,
var currentItemShelving: Int = 0
var currentItemShelving: Int = 0,
var stateCode: String? = ""
)
@ -89,7 +90,9 @@ class CollectionVO(
var errorMessage: String = "",
var itemPackingTypeFk: String = "",
var rgb: String? = null,
var ticketTotalCount: Int? = null
var ticketTotalCount: Int? = null,
var parkingCode: String? = null,
var idAdvanced: Boolean? = null
)
class CollectionSalix(
@ -110,8 +113,10 @@ class TicketSalix(
var agencyName: String = "",
var salesPersonFk: String = "",
var sales: List<SaleVO> = listOf(),
@SerializedName(value = "observations", alternate = ["observaciones"])
var observations: String = "",
@SerializedName(
value = "observations",
alternate = ["observaciones"]
) var observations: String = "",
)
@ -154,7 +159,7 @@ class SaleVO(
var cel1: String = "",
var cel2: String = "",
var cel3: String = "",
var saleGroupFk: String = "",
var saleGroupFk: String? = "",
var picked: String? = "",
var isParent: Boolean = false,
var totalSales: Int = 0,
@ -162,7 +167,9 @@ class SaleVO(
var code: String? = "",
var hasMistake: Any? = false,
var sectorFk: Int? = null,
var packingChecked: Int = 1
var packingChecked: Int = 1,
var isAdvanced: Int? = 0,
var parkingCode: String? = ""
)
@ -173,10 +180,14 @@ class TicketVO(
var agencyName: String = "",
var salesPersonFk: String = "",
var sales: List<SaleVO> = listOf(),
@SerializedName(value = "observations", alternate = ["observaciones"])
var observations: String = "",
@SerializedName(
value = "observations",
alternate = ["observaciones"]
) var observations: String = "",
var isAdvanced: Int? = 0,
var parkingCode: String? = ""
)
)
data class CollectionIdSalix(
var id: Int
@ -273,8 +284,7 @@ class PlacementSupplyListVO(
)
class MistakeTypeVO(
var id: Int,
var description: String
var id: Int, var description: String
)
class MistakeTypeListVO(
@ -286,16 +296,11 @@ class TicketStateList(
)
data class TicketStateSalix(
val ticketFk: Int,
val alertLevel: Int,
val code: String,
val stateFk: Int,
val userFk: Int
val ticketFk: Int, val alertLevel: Int, val code: String, val stateFk: Int, val userFk: Int
) {
@RequiresApi(Build.VERSION_CODES.O)
var created: String = ""
@RequiresApi(Build.VERSION_CODES.O)
get() {
@RequiresApi(Build.VERSION_CODES.O) get() {
return field.isoToString()
}

View File

@ -0,0 +1,131 @@
package es.verdnatura.presentation.view.feature.ubicador.adapter
import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import es.verdnatura.R
import es.verdnatura.databinding.ItemUbicationRow6869Binding
import es.verdnatura.presentation.common.OnMoreClickListener6869
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.common.OnVisibleClickListener6869
import es.verdnatura.presentation.common.loadUrl
import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
import es.verdnatura.presentation.view.feature.ubicador.model.ItemShelving
class UbicadorAdapter6869(
private val items: List<ItemShelving>,
private val onPasillerosItemClickListener: OnPasillerosItemClickListener,
private val onVisibleClickListener: OnVisibleClickListener6869,
private val onMoreClickListener: OnMoreClickListener6869,
private val urlImage: String? = null
) : RecyclerView.Adapter<UbicadorAdapter6869.ItemHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder {
return ItemHolder(
ItemUbicationRow6869Binding.inflate(LayoutInflater.from(parent.context), parent, false)
)
}
override fun getItemCount() = items.size
override fun onBindViewHolder(holder: ItemHolder, position: Int) {
holder.bind(items[position])
}
inner class ItemHolder(
val binding: ItemUbicationRow6869Binding
) : RecyclerView.ViewHolder(binding.root) {
private val res = binding.root.context.resources
@SuppressLint("SetTextI18n")
fun bind(item: ItemShelving) {
binding.apply {
this.item = item
multiText.text = "${item.stickers}x${item.packing}"
if (urlImage != null) imgItem.loadUrl("http:$urlImage/catalog/200x200/${item.item.id}")
imgItem.setOnClickListener {
onPasillerosItemClickListener.onPasillerosItemClickListener(
PasillerosItemVO(
title =
R.string.itemSearch
), item.item.id.toString()
)
}
layerVisible.setOnClickListener {
onVisibleClickListener.onVisibleClickListener(item)
}
if (item.visible == 0) {
visibleText.setTextColor(
ContextCompat.getColor(
visibleText.context,
R.color.verdnatura_brown_grey
)
)
} else {
visibleText.setTextColor(
ContextCompat.getColor(
visibleText.context,
R.color.verdnatura_pumpkin_orange
)
)
}
moreImg.setOnClickListener {
onMoreClickListener.onMoreClickListener(item)
}
namelayout.setOnClickListener {
onPasillerosItemClickListener.onPasillerosItemClickListener(
PasillerosItemVO(
title = R.string.itemSearch
), item.item.id.toString()
)
}
if (item.isChecked != null) {
when (item.isChecked) {
0 -> itemRowLayout.setBackgroundColor(
ContextCompat.getColor(
visibleText.context,
R.color.verdnatura_red_salix
)
)
in 1..Int.MAX_VALUE ->
if (item.visible == 0) {
itemRowLayout.setBackgroundColor(
ContextCompat.getColor(
visibleText.context,
R.color.verdnatura_dark_sky_blue
)
)
} else {
itemRowLayout.setBackgroundColor(
ContextCompat.getColor(
visibleText.context,
R.color.verdnatura_dark_green_verdnatura
)
)
}
}
} else {
itemRowLayout.setBackgroundColor(
ContextCompat.getColor(
visibleText.context,
R.color.verdnatura_black_5
)
)
}
}
}
}
}

View File

@ -86,7 +86,7 @@ class AutomaticAddItemFragment(
listItems.add(
0,
itemScanValue(
textScanned_filterDouble(binding.editMatricula.text.toString()),
textScannedFilterDouble(binding.editMatricula.text.toString()),
arrayOf("buy"),
"more"
).toString().toLong()
@ -161,7 +161,7 @@ class AutomaticAddItemFragment(
customDialogList.setDescription(
getString(R.string.scanShelvingsLocate)
).setOkButton(getString(R.string.locate)) {
listItems.clear()
listShelvings.forEach {
viewModel.itemShelvingMakeMulti(
it.code!!,

View File

@ -15,6 +15,7 @@ import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import es.verdnatura.R
import es.verdnatura.databinding.FragmentUbicadorBinding
import es.verdnatura.domain.ConstAndValues
import es.verdnatura.domain.ConstAndValues.WAREHOUSEFK
import es.verdnatura.domain.isShelving
import es.verdnatura.domain.notNull
@ -27,7 +28,9 @@ import es.verdnatura.presentation.common.OnMoreClickListenerNew
import es.verdnatura.presentation.common.OnOptionsSelectedListener
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.common.OnVisibleClickListenerNew
import es.verdnatura.presentation.common.PrinterDialogManager
import es.verdnatura.presentation.common.ToolBarAdapterTooltip
import es.verdnatura.presentation.common.hideKeyboard
import es.verdnatura.presentation.common.itemScanValue
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.component.CustomDialogInput
@ -39,6 +42,10 @@ import es.verdnatura.presentation.view.feature.articulo.model.BarcodeVO
import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
import es.verdnatura.presentation.view.feature.ubicador.adapter.UbicadorAdapterNew
import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicador
import org.json.JSONObject
import java.time.LocalDate
import java.time.format.DateTimeFormatter
import kotlin.math.ceil
@Suppress("UNUSED_ANONYMOUS_PARAMETER")
class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewModel>(
@ -117,7 +124,7 @@ class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewMo
if (shelvingFk.isNotEmpty()) {
isShelvinLogfromMainScreen = false
setIconsActions(true)
setIcons()
//setIcons()
binding.mainToolbar.toolbarTitle.text = shelvingFk
viewModel.itemShelvingListNew(shelvingFk)
binding.mainToolbar.switchButton.visibility = VISIBLE
@ -125,7 +132,7 @@ class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewMo
isShelvinLogfromMainScreen = true
setIconsActions(false)
//Tarea 7805
setIcons(true)
// setIcons(true)
}
super.init()
}
@ -137,7 +144,7 @@ class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewMo
} else {
GONE
}
setIcons(!showIcons)
}
private fun setDialogs() {
@ -216,19 +223,22 @@ class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewMo
override fun onOptionsItemSelected(item: Drawable) {
when (item) {
iconAdd.drawable -> showAddItemNew(
isEditItem = false, null
)
iconAdd.drawable -> {
showAddItemNew(
isEditItem = false, null
)
}
iconAddMultiple.drawable ->
iconAddMultiple.drawable -> {
ma.onPasillerosItemClickListener(
PasillerosItemVO(
title = R.string.addItemMultipleShelving,
), entryPoint = getString(R.string.addItemMultipleShelving)
)
}
iconReload.drawable -> {
listItems.clear()
if (shelvingFk.isNotBlank()) {
binding.editPrioridad.setText("")
viewModel.itemShelvingListNew(
@ -247,7 +257,8 @@ class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewMo
customDialogReset.setTitle(getString(R.string.checkItemShelvingDescrip))
.setDescription(getString(R.string.checkItemShelving))
.setOkButton(getString(R.string.ok)) {
viewModel.itemShelvingDeleteChecked(shelvingFk)
if (listItems.isNotEmpty())
viewModel.itemShelvingDeleteChecked(listItems[0].shelvingFk!!)
customDialogReset.dismiss()
}.setKoButton(getString(R.string.cancel)) {
customDialogReset.dismiss()
@ -282,7 +293,7 @@ class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewMo
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {
if (binding.editMatricula.text.toString().isNotEmpty()) {
setIconsActions(true)
setIcons()
//setIcons()
if (!modeCheckUbication || (modeCheckUbication && (binding.editMatricula.text.toString()
.isShelving()) && !binding.editMatricula.text!![0].isDigit())
) {
@ -339,6 +350,7 @@ class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewMo
binding.automaticImg.setOnClickListener {
if (shelvingFk.isNotBlank()) ma.onPasillerosItemClickListener(
PasillerosItemVO(title = R.string.titleAuto), entryPoint = shelvingFk
)
@ -420,10 +432,13 @@ class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewMo
customDialogDelete.setTitle(getString(R.string.empty))
.setDescription(getString(R.string.operationNoReturn))
.setOkButton(getString(R.string.empty)) {
if (listItems.isNotEmpty()) {
viewModel.clearShelvingList(
//Tarea 7920
listItems[0].shelvingFk?.toString() ?: shelvingFk
)
}
viewModel.clearShelvingList(
shelvingFk
)
listItems.forEach {
it.stickers = 0
it.visible = 0
@ -454,16 +469,24 @@ class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewMo
parking = customDialogInput.getValue()
//tarea 6964
viewModel.hasItemOlder(
shelvingFk, customDialogInput.getValue(),
shelvingFk, customDialogInput.getValue(), itemFk = null, action = null
)
customDialogInput.dismiss()
}
private fun customDialogActionChange() {
viewModel.shelvingChangeSalix(
shelvingFk, customDialogInput.getValue()
)
//Tarea 7920
if (listItems.isNotEmpty() && listItems[0].shelvingFk == null) {
viewModel.shelvingChangeSalix(
shelvingFk, customDialogInput.getValue()
)
} else {
viewModel.getShelvingFkFromCode(
listItems[0].shelvingFk!!, customDialogInput.getValue()
)
}
shelvingFk = customDialogInput.getValue()
customDialogInput.dismiss()
@ -519,21 +542,28 @@ class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewMo
with(viewModel) {
loadShelvingListNew.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled().notNull {
listItems.clear()
event.getContentIfNotHandled().notNull { it ->
if (isShelvinLogfromMainScreen) {
viewModel.shelvingLogAdd(shelvingFk)
}
listItems = ArrayList()
val totalStickers = it.list.sumOf { item -> item.stickers }
parking = it.list.firstOrNull { item -> item.code != null }?.code ?: ""
listItems.addAll(it.list)
listItems.forEach { item ->
if (item.description.isNullOrEmpty()) {
item.description =
item.longName ?: "${item.name ?: ""} ${item.size ?: ""}"
}
item.stickers =
if (item.packing == null) 0 else ceil((item.visible.toDouble() / item.packing!!.toDouble())).toInt()
}
val totalStickers = listItems.sumOf { item -> item.stickers }
parking = it.list.firstOrNull { item -> item.code != null }?.code ?: ""
binding.mainToolbar.toolbarTitle.text =
shelvingFk.uppercase() + getString(R.string.pUppercase) + parking + getString(
R.string.label
) + totalStickers
if (listItems.isNotEmpty()) binding.editPrioridad.setText(it.list[0].priority.toString())
if (listItems.isNotEmpty()) binding.editPrioridad.setText(listItems[0].priority?.toString())
if (!binding.mainToolbar.switchButton.isChecked && listItems.isNotEmpty()) {
listItems = listItems.asReversed()
@ -572,6 +602,10 @@ class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewMo
}
responseLogAdd.observe(viewLifecycleOwner) {
isShelvinLogfromMainScreen = false
if (it == false) {
setIconsActions(false)
//setIcons()
}
}
loadResponseCode.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled().notNull {
@ -649,7 +683,13 @@ class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewMo
}.show()
}
}
loadBuyUltimateResponse.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled().notNull {
ma.messageWithSound(
getString(R.string.errorPrintBuy), isError = true, isPlayed = true
)
}
}
}
}
@ -759,8 +799,7 @@ class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewMo
.setPackingValue(itemUbicador.packing.toString())
.setVisibleValue(itemUbicador.visible.toString())
//.setEtiquetaValue((itemUbicador.visible / (itemUbicador.packing ?: 0)).toString())
.setEtiquetaValue(itemUbicador.stickers.toString())
.setUnits(
.setEtiquetaValue(itemUbicador.stickers.toString()).setUnits(
if (itemUbicador.stickers != 0) {
(itemUbicador.visible % itemUbicador.stickers).toString()
} else {
@ -842,6 +881,7 @@ class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewMo
customDialogUbicador.getPackingValue().toIntOrNull()
) else {
viewModel.itemShelvingAdd(
shelving = shelvingFk,
item = customDialogUbicador.getItemValue().toLong(),
@ -1031,7 +1071,6 @@ class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewMo
if (!isAutoSelf) {
listItems.remove(item)
adapter!!.notifyItemRemoved(listItems.indexOf(item))
//adapter!!.notifyDataSetChanged()
viewModel.itemShelvingDelete(
item.id
)
@ -1049,7 +1088,46 @@ class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewMo
customDialogTwoButtons.dismiss()
}
customDialogConfirm.show()
}//Tarea 7763
}
//Tarea 7266
.setOkButtonThree(getString(R.string.print)) {
val printerDialogManager = PrinterDialogManager(requireContext())
printerDialogManager.showPrintDialog(
item.item,
item.description ?: ""
) { id, labelType, packing, copies ->
if (item.buyFk == null) {
viewModel.buyUltimate(
itemFk = item.id,
warehouseFk = mobileApplication.dataStoreApp.readDataStoreKey(
WAREHOUSEFK
),
dated = LocalDate.now()
.format(
DateTimeFormatter.ofPattern("yyyy-dd-MM")
),
reportName = "LabelBuy",
printerFk = mobileApplication.dataStoreApp.readDataStoreKey<Int>(
ConstAndValues.PRINTERFK
),
userFk = mobileApplication.userId!!,
priority = "normal",
copies = copies,
labelType = labelType,
packing = packing
)
customDialogTwoButtons.dismiss()
} else {
printItem(
item.buyFk!!, labelType, packing, copies
)
customDialogTwoButtons.dismiss()
}
}
customDialogInput.getEditText().requestFocus()
}
//Tarea 7763
/*
.setOkButtonThree(getString(R.string.rename)) {
customDialogInput.setTitle(getString(R.string.itemNew))
@ -1080,6 +1158,29 @@ class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewMo
customDialogTwoButtons.show()
}
private fun printItem(id: Number?, labelType: String, packing: Int?, copies: Int?) {
try {
viewModel.printItem(
reportName = "LabelBuy",
printerFk = mobileApplication.dataStoreApp.readDataStoreKey<Int>(
ConstAndValues.PRINTERFK
),
userFk = mobileApplication.userId!!,
priority = "normal",
params = JSONObject().apply {
put("copies", copies)
put("id", id)
put("labelType", labelType)
put("packing", packing)
}.toString().replace("\"", "\\\"")
)
} catch (ex: Exception) {
ma.messageWithSound(message = ex.message.toString(), isError = true, isPlayed = true)
}
hideKeyboard()
}
private fun actionRename(item: ItemUbicador, itemScan: String) {
if (itemScan.isNotEmpty()) {
@ -1108,8 +1209,7 @@ class UbicadorFragmentNew : BaseFragment<FragmentUbicadorBinding, UbicadorViewMo
}
private fun customDialogTransferAction(item: ItemUbicador) {
if (customDialogInput.getValue().isNotEmpty()) {
/*tearea 6964*//*
if (customDialogInput.getValue().isNotEmpty()) {/*tearea 6964*//*
viewModel.hasItemOlder(
shelvingFkIn = shelvingFk,
shelvingFkOut = customDialogInput.getValue(),

View File

@ -1,6 +1,7 @@
package es.verdnatura.presentation.view.feature.ubicador.fragment
import android.content.Context
import android.util.Log.d
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.map
@ -9,9 +10,9 @@ import es.verdnatura.R
import es.verdnatura.domain.SalixCallback
import es.verdnatura.domain.formatWithQuotes
import es.verdnatura.domain.userCases.GetItemFromBarcodeUseCase
import es.verdnatura.domain.userCases.GetItemPrintItemUseCase
import es.verdnatura.presentation.base.BaseViewModel
import es.verdnatura.presentation.base.getMessageFromAllResponse
import es.verdnatura.presentation.base.nameofFunction
import es.verdnatura.presentation.common.Action
import es.verdnatura.presentation.common.Event
import es.verdnatura.presentation.common.ItemShelvingSalix
import es.verdnatura.presentation.common.ResponseHasOlder
@ -22,16 +23,15 @@ import es.verdnatura.presentation.view.feature.ubicador.model.ItemShelvingNewer
import es.verdnatura.presentation.view.feature.ubicador.model.ItemShelvingNewerList
import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicador
import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicadorListNew
import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicadorListVO
import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicadorVO
import es.verdnatura.presentation.view.feature.ubicador.model.ShelvingItem
import es.verdnatura.presentation.view.feature.workermistake.model.MakeMultiSalix
import org.json.JSONObject
import retrofit2.Call
import retrofit2.Response
class UbicadorViewModel(val context: Context) : BaseViewModel(context) {
private val getItemFromBarcodeUseCase = GetItemFromBarcodeUseCase(salix)
private val _shelvingList by lazy { MutableLiveData<ItemUbicadorListVO>() }
private val printItemUseCase = GetItemPrintItemUseCase(salix)
private val _responseUbicator by lazy { MutableLiveData<Boolean>() }
val responseUbicator: LiveData<Boolean>
@ -43,12 +43,18 @@ class UbicadorViewModel(val context: Context) : BaseViewModel(context) {
val loadResponseHasOlder: LiveData<Event<ResponseHasOlder>> =
_responseHasOlder.map { Event(it) }
val loadShelvingList: LiveData<Event<ItemUbicadorListVO>> = _shelvingList.map { Event(it) }
private val _shelvingListNew by lazy { MutableLiveData<ItemUbicadorListNew>() }
val loadShelvingListNew: LiveData<Event<ItemUbicadorListNew>> =
_shelvingListNew.map { Event(it) }
private val _shelvingGet by lazy { MutableLiveData<ShelvingItem>() }
val loadShelvingGet: LiveData<Event<ShelvingItem>> =
_shelvingGet.map { Event(it) }
private val _imageConfig by lazy { MutableLiveData<String>() }
val loadImageConfig: LiveData<Event<String>> =
_imageConfig.map { Event(it) }
private val _shelvingListItemNewer by lazy { MutableLiveData<ItemShelvingNewerList>() }
val loadShelvingListItemNewer: LiveData<Event<ItemShelvingNewerList>> =
_shelvingListItemNewer.map { Event(it) }
@ -65,45 +71,24 @@ class UbicadorViewModel(val context: Context) : BaseViewModel(context) {
private val _responseAddList by lazy { MutableLiveData<Boolean>() }
val responseAddList: LiveData<Boolean> = _responseAddList
val loadAddList: LiveData<Event<Boolean>> = _responseAddList.map { Event(it) }
private val _responseLogAdd by lazy { MutableLiveData<Any>() }
val responseLogAdd: LiveData<Any>
get() = _responseLogAdd
fun itemShelvingList(
vShelvingFk: String
) {
salix.itemShelvingList(params = listOf(vShelvingFk.uppercase()).formatWithQuotes()).enqueue(
object : SalixCallback<List<ItemUbicadorVO>>(context) {
override fun onSuccess(response: Response<List<ItemUbicadorVO>>) {
_shelvingList.value = response.body()?.let { ItemUbicadorListVO(it) }
}
private val _buyUltimateResponse by lazy { MutableLiveData<Boolean>() }
val buyUltimateResponse: LiveData<Boolean> = _buyUltimateResponse
val loadBuyUltimateResponse: LiveData<Event<Boolean>> = _buyUltimateResponse.map { Event(it) }
override fun onError(t: Throwable) {
val listError: ArrayList<ItemUbicadorVO> = ArrayList()
listError.add(
ItemUbicadorVO(
0,
isError = true,
errorMessage = getMessageFromAllResponse(
nameofFunction(this),
t.message!!,
),
),
)
_shelvingList.value = ItemUbicadorListVO(listError)
}
},
)
}
private val _getParkingResponse by lazy { MutableLiveData<Boolean>() }
val getParkingResponse: LiveData<Boolean> = _getParkingResponse
val loadGetParkingResponse: LiveData<Event<Boolean>> = _getParkingResponse.map { Event(it) }
fun itemShelvingListNew(
vShelvingFk: String
shelvingFk: String
) {
salix.itemShelvingListNew(params = listOf(vShelvingFk.uppercase()).formatWithQuotes())
salix.itemShelvingListNew(params = listOf(shelvingFk.uppercase()).formatWithQuotes())
.enqueue(
object : SalixCallback<List<ItemUbicador>>(context) {
override fun onSuccess(response: Response<List<ItemUbicador>>) {
@ -114,6 +99,48 @@ class UbicadorViewModel(val context: Context) : BaseViewModel(context) {
)
}
//Tarea 6869
fun itemShelvingGet(
shelvingCode: String
) {
salix.shelvingGet(
filter = """{
"fields":
["priority","parkingFk","code","id"],
"include":[
{"relation":"parking",
"scope":{"fields":["code"]}},
{"relation":"itemShelving",
"scope":{"fields":["id","itemFk","visible","packing","grouping","isChecked","available","buyFk","shelvingFk"],
"include":
{"relation":"item",
"scope":{"fields":["name","longName","size"]}}}}],
"where":{"code":"$shelvingCode"}}""".trim()
).enqueue(
object : SalixCallback<ShelvingItem>(context) {
override fun onSuccess(response: Response<ShelvingItem>) {
_shelvingGet.value = response.body()
}
},
)
}
fun getImageConfig(
) {
salix.getImageConfig(
).enqueue(
object : SalixCallback<JsonObject>(context) {
override fun onSuccess(response: Response<JsonObject>) {
_imageConfig.value =
response.body()!!.entrySet().first().value.asString
}
},
)
}
fun shelvingPriorityUpdate(
priority: Int, shelving: String
@ -222,23 +249,36 @@ class UbicadorViewModel(val context: Context) : BaseViewModel(context) {
fun hasItemOlder(
shelvingFk: String,
parking: String,
parking: String?,
itemFk: Int?,
action: Action?,
itemShelvingFk: Number? = null
) {
salix.getListItemNewer(shelvingFk, parking)
) {
salix.getListItemNewerNew(shelvingFk, parking, itemFk)
//salix.getListItemNewer(shelvingFk, parking)
.enqueue(object : SalixCallback<List<ItemShelvingNewer>>(context) {
override fun onSuccess(response: Response<List<ItemShelvingNewer>>) {
if (response.body()!!.isEmpty()) {
setParking(shelvingFk, parking)
when (action) {
Action.PARKINEAR -> setParking(shelvingFk, parking!!)
Action.TRANSFERIR -> {
itemShelvingTransfer(itemShelvingFk!!, shelvingFk)
}
null -> setParking(shelvingFk, parking!!)
}
} else {
_shelvingListItemNewer.value =
response.body()?.let {
ItemShelvingNewerList(
it,
originalParking = parking,
originalShelvingFk = shelvingFk
originalShelvingFk = shelvingFk,
originalParking = parking!!,
originalItem = itemFk,
originalAction = action
)
}
}
@ -248,6 +288,98 @@ class UbicadorViewModel(val context: Context) : BaseViewModel(context) {
})
}
fun getItemsByReviewOrder(
shelving: String,
parking: String?,
itemFk: Number?,
action: Action?,
itemShelvingFk: Number? = null,
shelvingFkFrom: String? = null
) {
salix.getItemsByReviewOrder(
if (action == Action.TRANSFERIR) shelvingFkFrom!! else shelving,
parking,
itemFk
)
.enqueue(object : SalixCallback<List<ItemShelvingNewer>>(context) {
override fun onSuccess(response: Response<List<ItemShelvingNewer>>) {
if (response.body()!!.isEmpty()) {
when (action) {
Action.PARKINEAR -> setParking(shelving, parking!!)
Action.TRANSFERIR -> {
itemShelvingTransfer(itemShelvingFk!!, shelving!!)
}
null -> d("", "No action")
}
} else {
_shelvingListItemNewer.value =
response.body()?.let {
ItemShelvingNewerList(
it,
originalShelvingFk = shelving,
originalParking = parking!!,
originalItem = itemFk,
originalAction = action,
itemShelvingFk = itemShelvingFk
)
}
}
}
})
}
fun getParkingToTransfer(
shelvingFkTo: String,
itemShelvingFk: Number,
itemFk: Number,
shelvingFkFrom: String? = null
) {
salix.shelvingGet(
filter = """{
"fields": ["priority", "parkingFk", "code", "id"],
"include": [
{
"relation": "parking",
"scope": {
"fields": ["code"]
}
}
],
"where": {
"code": "$shelvingFkTo"
}
}"""
).enqueue(object : SalixCallback<ShelvingItem>(context) {
override fun onSuccess(response: Response<ShelvingItem>) {
val itemShelving = response.body()
if (itemShelving?.parking == null) {
itemShelvingTransfer(itemShelvingFk, shelvingFkTo)
} else {
getItemsByReviewOrder(
shelving = shelvingFkTo,
itemFk = itemFk,
parking = itemShelving.parking.code,
action = Action.TRANSFERIR,
itemShelvingFk = itemShelvingFk,
shelvingFkFrom = shelvingFkFrom!!
)
}
}
override fun onError(t: Throwable) {
_getParkingResponse.value = false
super.onError(t)
}
})
}
fun itemShelvingMerge(
vShelf: Int, shelvingFk: String
@ -266,7 +398,7 @@ class UbicadorViewModel(val context: Context) : BaseViewModel(context) {
}
fun itemShelvingDeleteChecked(
vShelvingFk: String
vShelvingFk: Number
) {
salix.itemShelvingsUpdate(
@ -310,7 +442,12 @@ class UbicadorViewModel(val context: Context) : BaseViewModel(context) {
.enqueue(object : SalixCallback<Any>(context) {
override fun onSuccess(response: Response<Any>) {
_responseLogAdd.value = response.message()
_responseLogAdd.value = true
}
override fun onError(t: Throwable) {
_responseLogAdd.value = false
super.onError(t)
}
})
@ -369,7 +506,24 @@ class UbicadorViewModel(val context: Context) : BaseViewModel(context) {
shelvingFkIn: String, shelvingFkOut: String
) {
salix.itemShelvingsUpdate(
where = JsonObject().apply {
addProperty("shelvingFk", shelvingFkIn)
},
hashMapOf("shelvingFk" to shelvingFkOut)
).enqueue(object : SalixCallback<Any>(context) {
override fun onSuccess(response: Response<Any>) {
_responseUbicator.value = true
super.onSuccess(response)
}
})
}
//tarea 7920
fun shelvingChangeSalixNew(
shelvingFkIn: Number, shelvingFkOut: Number
) {
salix.itemShelvingsUpdate(
where = JsonObject().apply { addProperty("shelvingFk", shelvingFkIn) },
hashMapOf("shelvingFk" to shelvingFkOut)
@ -382,11 +536,32 @@ class UbicadorViewModel(val context: Context) : BaseViewModel(context) {
})
}
fun itemShelvingTransfer(
itemFk: Int, shelvingFk: String
fun getShelvingFkFromCode(
shelvingFkIn: Number, codeOut: String
) {
salix.itemShelvingTransfer(arrayListOf(itemFk, shelvingFk).formatWithQuotes())
salix.shelvingGetFromCode(
filter = """{"where":{"code":"$codeOut"}}"""
).enqueue(object : SalixCallback<ItemUbicador>(context) {
override fun onSuccess(response: Response<ItemUbicador>) {
val myItemCode = response.body().let { it as ItemUbicador }
shelvingChangeSalixNew(
shelvingFkIn = shelvingFkIn,
myItemCode.id.toLong()
)
}
})
}
fun itemShelvingTransfer(
itemShelvingFk: Number, shelvingFk: String
) {
salix.itemShelvingTransfer(arrayListOf(itemShelvingFk, shelvingFk).formatWithQuotes())
.enqueue(object : SalixCallback<Any>(context) {
override fun onSuccess(response: Response<Any>) {
_responseUbicator.value = true
@ -406,7 +581,7 @@ class UbicadorViewModel(val context: Context) : BaseViewModel(context) {
})
}
fun itemShelvingSelfConsumption(shelvingFk: String, itemFk: Int, quantity: Int) {
fun itemShelvingSelfConsumption(shelvingFk: String, itemFk: Number, quantity: Int) {
salix.itemShelvingSelfConsumption(
arrayListOf(
shelvingFk, itemFk, quantity
@ -430,6 +605,72 @@ class UbicadorViewModel(val context: Context) : BaseViewModel(context) {
})
}
fun printItem(
reportName: String,
printerFk: Int,
userFk: Int,
params: Any,
priority: String
) {
printItemUseCase.execute(
params = arrayListOf(
reportName,
printerFk,
userFk,
params,
priority
).formatWithQuotes()
)
.enqueue(object : SalixCallback<Unit>(context) {
})
}
fun buyUltimate(
itemFk: Number,
warehouseFk: Int,
dated: String,
reportName: String,
printerFk: Int,
priority: String,
userFk: Int,
copies: Int,
labelType: String,
packing: Int?
) {
printItemUseCase.executeBuyUltimate(
params = arrayListOf(
itemFk,
warehouseFk,
dated
).formatWithQuotes()
)
.enqueue(object : SalixCallback<Long>(context) {
override fun onSuccess(response: Response<Long>) {
if (response.body() == null) _buyUltimateResponse.value = false
else {
val params =
JSONObject().apply {
put("copies", copies)
put("id", response.body())
put("labelType", labelType)
put("packing", packing)
}.toString().replace("\"", "\\\"")
printItem(
reportName = reportName,
printerFk = printerFk,
priority = priority,
userFk = userFk,
params = params
)
}
}
})
}
fun itemShelvingMakeMulti(
shelvingFk: String, items: List<Long>, warehouseFk: Int
) {

View File

@ -1,5 +1,7 @@
package es.verdnatura.presentation.view.feature.ubicador.model
import es.verdnatura.presentation.common.Action
class ItemUbicadorVO(
var item: Int,
var description: String = "",
@ -17,12 +19,16 @@ class ItemUbicadorVO(
var checked: Boolean = false,
var isNew: Boolean = false,
var isChecked: Int? = null,
var url: String = ""
var url: String = "",
var shelvingFk: Long? = null
)
class ItemUbicador(
var item: Long,
var description: String = "",
var description: String? = null,
var size: Int? = null,
var name: String? = null,
var longName: String? = null,
var visible: Int = 0,
var stickers: Int = 0,
var packing: Int? = null,
@ -30,7 +36,7 @@ class ItemUbicador(
var available: Int? = null,
var code: String? = "",
var created: String? = null,
var shelvingFk: String? = null,
var shelvingFk: Long? = null,
var id: Int = 0,
var priority: Int = 0,
var isError: Boolean = false,
@ -39,8 +45,10 @@ class ItemUbicador(
var isNew: Boolean = false,
var isChecked: Int? = null,
var url: String = "",
var units: Int = 0
)
var units: Int = 0,
var buyFk: Long? = null,
)
class ItemEscanerVO(
var item: Long
@ -55,14 +63,22 @@ class ItemUbicadorListNew(
)
class ItemShelvingNewerList(
var list: List<ItemShelvingNewer> = listOf(),
var originalParking: String,
var originalShelvingFk: String
val list: List<ItemShelvingNewer> = listOf(),
val originalParking: String,
val originalShelvingFk: String,
val originalItem: Number? = null,
val originalAction: Action?,
val itemShelvingFk: Number? = null
)
data class ItemShelvingNewer(
var itemFk: Int,
var shelvingFk: String,
val itemFk: Int,
val shelvingFk: String,
val created: String,
val parkingCode: String,
val itemCreated: String? = null,
val code: String? = null,
val parkingFk: String? = null
)
data class ItemBuy(
@ -71,4 +87,41 @@ data class ItemBuy(
val grouping: Int?,
val packing: Int,
val packagingFk: String?
)
)
data class ShelvingItem(
val id: Int,
val code: String,
val priority: Int,
val parkingFk: Int? = null,//para findOne directo a Shelving
val parking: Parking?,
val itemShelving: MutableList<ItemShelving>?
)
data class Parking(
val id: Int,
val code: String
)
data class ItemShelving(
val id: Int,
val shelvingFk: Int,
val itemFk: Int,
val grouping: Int?,
var isChecked: Int?,
val packing: Int,
var visible: Int,
var available: Int?,
val buyFk: Long?,
val item: Item,
var description: String? = null,
var stickers: Int? = null,
var url: String? = null
)
data class Item(
val id: Long,
val name: String?,
val size: Int?,
val longName: String?
)

View File

@ -4,7 +4,6 @@ import android.content.Context
import android.os.Bundle
import android.view.View
import androidx.core.widget.addTextChangedListener
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import es.verdnatura.R
import es.verdnatura.databinding.FragmentWorkermistakeBinding
@ -15,23 +14,19 @@ import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.OnBarcodeRowClickListener
import es.verdnatura.presentation.common.OnMistakeWorkerClickListener
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.view.commom.NameWithId
import es.verdnatura.presentation.view.commom.SearchableAdapter
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.component.CustomDialogInput
import es.verdnatura.presentation.view.component.CustomDialogList
import es.verdnatura.presentation.view.feature.articulo.adapter.BarcodeAdapter
import es.verdnatura.presentation.view.feature.articulo.model.BarcodeVO
import es.verdnatura.presentation.view.feature.inventario.fragment.InventaryViewModel
import es.verdnatura.presentation.view.feature.inventario.fragment.SearchDepartmentModel
import es.verdnatura.presentation.view.feature.workermistake.adapter.WorkermistakeAdapter
import es.verdnatura.presentation.view.feature.workermistake.model.DepartmentMistake
import es.verdnatura.presentation.view.feature.workermistake.model.MistakeType
import es.verdnatura.presentation.view.feature.workermistake.model.WorkerFromMistake
import ir.mirrajabi.searchdialog.SimpleSearchDialogCompat
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
@Suppress("UNUSED_ANONYMOUS_PARAMETER")
class WorkermistakeFragment(
var entryPoint: String = ""
@ -49,7 +44,6 @@ class WorkermistakeFragment(
private var listMistakes: ArrayList<BarcodeVO> = ArrayList()
private var listMistakesAdapter: BarcodeAdapter? = null
private var workerMistakeName: WorkerFromMistake? = null
private val departments = ArrayList<SearchDepartmentModel>()
companion object {
fun newInstance(entryPoint: String) = WorkermistakeFragment(entryPoint)
@ -83,32 +77,8 @@ class WorkermistakeFragment(
customDialogList = CustomDialogList(requireContext())
binding.filterDepartment.setOnClickListener {
SimpleSearchDialogCompat(
context,
getString(R.string.departamentos),
getString(R.string.escribirparteNombre),
null,
departments
) { baseSearchDialogCompat, nombre, position ->
binding.filterDepartment.text = (nombre.title)
lifecycleScope.launch(Dispatchers.IO) {
mobileApplication.dataStoreApp.editDataStoreKey(
DEPARTMENTMISTAKE,
nombre.getDepartmentName()
)
mobileApplication.dataStoreApp.editDataStoreKey(
DEPARTMENTMISTAKEID,
nombre.getDepartmentId()
)
}
viewModel.workerGetFromHasMistake(
nombre.getDepartmentId()
)
binding.filterItemFk.isEnabled = true
baseSearchDialogCompat.dismiss()
}.show()
binding.searchableRecyclerView.visibility = View.VISIBLE
binding.searchableRecyclerView.setSearchHint(getString(R.string.departamentSearch))
}
customDialogInput = CustomDialogInput(requireContext())
customDialog = CustomDialog(requireContext())
@ -122,6 +92,36 @@ class WorkermistakeFragment(
binding.mainToolbar.toolbarTitle.text = entryPoint
}
private fun setSearchable(listNames: MutableList<NameWithId>) {
val adapter =
SearchableAdapter(
listElements = listNames,
context = requireContext()
) { elementSelected ->
runBlocking {
mobileApplication.dataStoreApp.editDataStoreKey(
DEPARTMENTMISTAKE,
elementSelected.name
)
mobileApplication.dataStoreApp.editDataStoreKey(
DEPARTMENTMISTAKEID,
elementSelected.id
)
viewModel.workerGetFromHasMistake(
elementSelected.id
)
}
binding.filterDepartment.text = elementSelected.name
binding.searchableRecyclerView.visibility = View.GONE
}
binding.searchableRecyclerView.setAdapter(adapter, listNames)
}
private fun setEvents() {
binding.mainToolbar.backButton.setOnClickListener {
ma.onMyBackPressed()
@ -151,7 +151,12 @@ class WorkermistakeFragment(
override fun observeViewModel() {
with(viewModel) {
mistakeDepartmentList.observe(viewLifecycleOwner) {
createDepartmentList(it.list)
setSearchable(it.list.map { item ->
NameWithId(
id = item.id,
name = item.name
)
} as MutableList<NameWithId>)
}
workerFromMistakeList.observe(viewLifecycleOwner) {
createWorkerList(it.list)
@ -214,32 +219,20 @@ class WorkermistakeFragment(
}
private fun createDepartmentList(list: List<DepartmentMistake>) {
departments.clear()
list.forEach { department ->
try {
departments.add(SearchDepartmentModel(department.name, department.id))
} catch (e: Exception) {
e.message!!.toast(requireContext())
}
}
}
private fun createWorkerList(list: List<WorkerFromMistake>) {
listWorker.clear()
list.forEach { worker ->
try {
listWorker.add(worker)
} catch (e: Exception) {
e.message!!.toast(requireContext())
try {
listWorker.apply {
clear()
addAll(list)
}
listWorkerAuxiliary.apply {
clear()
addAll(listWorker)
}
} catch (e: Exception) {
e.message?.toast(requireContext())
}
listWorkerAuxiliary.clear()
listWorkerAuxiliary.addAll(listWorker)
}
}

View File

@ -13,8 +13,8 @@ data class ExpeditionMistakeSalix(
)
data class DepartmentMistake(
var id: Int? = null,
var name: String = ""
var id: Int,
var name: String
)
data class WorkerFromMistake(

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