From bdd6f2152205374794da7ecb5282c69d14a59824 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 14 Nov 2024 09:59:39 +0100 Subject: [PATCH 01/22] Fix su DialogProgressView --- .../integrywmsnative/view/dialogs/DialogProgressView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/DialogProgressView.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/DialogProgressView.java index 0d33ce4c..37152686 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/DialogProgressView.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/DialogProgressView.java @@ -64,7 +64,7 @@ public class DialogProgressView extends DialogFragment { } public void show(@NonNull FragmentManager manager) { - if (!progressOpened && !isAdded() && !isInLayout()) { + if (!isAdded() && !isInLayout()) { this.progressOpened = true; super.show(manager, "loading-dialog"); } @@ -72,7 +72,7 @@ public class DialogProgressView extends DialogFragment { @Override public void dismiss() { - if (progressOpened) { + if (isAdded() || isInLayout()) { this.progressOpened = false; super.dismissAllowingStateLoss(); } From 665c261b9a0deccf24b7805b78649c7eb9ebf127 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 14 Nov 2024 10:01:56 +0100 Subject: [PATCH 02/22] -> v1.41.04 (452) --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4b483430..bdc44fe4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ apply plugin: 'com.google.gms.google-services' android { - def appVersionCode = 451 - def appVersionName = '1.41.03' + def appVersionCode = 452 + def appVersionName = '1.41.04' signingConfigs { release { From 4b0fbd0b6bc91d0f4e473f94ef92720711fc1764 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Fri, 15 Nov 2024 19:14:04 +0100 Subject: [PATCH 03/22] Rimossi destinatari che non sono attivi --- .../view/dialogs/ask_cliente/DialogAskClienteView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/ask_cliente/DialogAskClienteView.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/ask_cliente/DialogAskClienteView.java index 42ceaa18..60ff5f75 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/ask_cliente/DialogAskClienteView.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/ask_cliente/DialogAskClienteView.java @@ -207,7 +207,7 @@ public class DialogAskClienteView extends BaseDialogFragment { " nazione\n" + "FROM vtb_dest\n" + "INNER JOIN vtb_clie ON vtb_clie.cod_anag = vtb_dest.cod_anag\n" + - "WHERE vtb_clie.flag_stato = 'A'"; + "WHERE vtb_clie.flag_stato = 'A' AND vtb_dest.flag_attivo = 'S'"; Type typeOfObjectsList = new TypeToken>() { }.getType(); From 290d737ff70d2751325051e96feccc935d26339c Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Mon, 18 Nov 2024 11:38:59 +0100 Subject: [PATCH 04/22] -> v1.41.05 (453) --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bdc44fe4..beed556b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ apply plugin: 'com.google.gms.google-services' android { - def appVersionCode = 452 - def appVersionName = '1.41.04' + def appVersionCode = 453 + def appVersionName = '1.41.05' signingConfigs { release { From 2adfda5f30b4ac45cdb5935f358b880b81a22496 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Mon, 18 Nov 2024 16:34:02 +0100 Subject: [PATCH 05/22] Ulteriori fix su DialogProgressView --- .../core/expansion/BaseActivity.java | 2 +- .../core/expansion/BaseDialogFragment.java | 2 +- .../core/expansion/BaseFragment.java | 2 +- .../gest/settings/MainSettingsFragment.java | 2 +- .../gest/spedizione/SpedizioneViewModel.java | 29 ++++++++----------- 5 files changed, 16 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseActivity.java b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseActivity.java index 7fbc2ab9..d96a6950 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseActivity.java @@ -61,7 +61,7 @@ public class BaseActivity extends AppCompatActivity { private void closeProgress() { BarcodeManager.enable(); executorService.execute(() -> { - mCurrentProgress.dismissAllowingStateLoss(); + mCurrentProgress.dismiss(); }); } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java index 8a426227..5f607310 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java @@ -85,7 +85,7 @@ public abstract class BaseDialogFragment extends DialogFragment implements Dialo private void closeProgress() { BarcodeManager.enable(); executorService.execute(() -> { - mCurrentProgress.dismissAllowingStateLoss(); + mCurrentProgress.dismiss(); }); } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseFragment.java b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseFragment.java index 78c75012..3df725b5 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseFragment.java @@ -74,7 +74,7 @@ public abstract class BaseFragment extends Fragment { private void closeProgress() { BarcodeManager.enable(); executorService.execute(() -> { - mCurrentProgress.dismissAllowingStateLoss(); + mCurrentProgress.dismiss(); }); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java index 71d6f300..ac529751 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java @@ -316,7 +316,7 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT private void closeProgress() { executorService.execute(() -> { - mCurrentProgress.dismissAllowingStateLoss(); + mCurrentProgress.dismiss(); }); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java index 52d48cfb..ce43239c 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java @@ -1,6 +1,5 @@ package it.integry.integrywmsnative.gest.spedizione; -import androidx.annotation.IntegerRes; import androidx.databinding.ObservableArrayList; import androidx.lifecycle.MutableLiveData; @@ -11,18 +10,15 @@ import java.time.LocalDate; import java.util.ArrayList; import java.util.Comparator; import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; -import java.util.stream.Stream; import javax.inject.Inject; import it.integry.barcode_base_android_library.model.BarcodeScanDTO; -import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.CommonConst; import it.integry.integrywmsnative.core.data_recover.ColliDataRecoverService; import it.integry.integrywmsnative.core.exception.EmptyLUException; @@ -89,7 +85,6 @@ import it.integry.integrywmsnative.core.utility.UtilityBarcode; import it.integry.integrywmsnative.core.utility.UtilityBigDecimal; import it.integry.integrywmsnative.core.utility.UtilityDate; import it.integry.integrywmsnative.core.utility.UtilityPosizione; -import it.integry.integrywmsnative.core.utility.UtilityResources; import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.gest.spedizione.exceptions.CurrentMonoLUPositionIsNotCorrectException; import it.integry.integrywmsnative.gest.spedizione.exceptions.InvalidMagazzinoAutomaticoMovementException; @@ -99,7 +94,6 @@ import it.integry.integrywmsnative.gest.spedizione.exceptions.OrdersLoadExceptio import it.integry.integrywmsnative.gest.spedizione.model.PickedQuantityDTO; import it.integry.integrywmsnative.gest.spedizione.model.PickingObjectDTO; import it.integry.integrywmsnative.gest.spedizione.model.PrintOrderCloseDTO; -import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.exception.OverflowQtaTotOrderedQuantityException; import it.integry.integrywmsnative.view.dialogs.tracciamento_imballi.TracciamentoImballoDTO; public class SpedizioneViewModel { @@ -193,19 +187,20 @@ public class SpedizioneViewModel { this.mUseQtaOrd = useQtaOrd; this.mUseColliPedana = useColliPedana; - if (enableGiacenza) { - mOrdiniRestConsumerService.getSuggestedPickingList(this.mDefaultCodMdep, pickingList, pickingObjectList -> { - this.mPickingList.postValue(pickingObjectList); - }, ex -> this.sendError(new OrdersLoadException(ex))); - } else { - getEmptyPickingList(pickingList, pickingObjectList -> { - this.mPickingList.postValue(pickingObjectList); - }); - } - getPartitaMagList(pickingList, mtbPartitaMagList -> { this.mPartitaMagList = mtbPartitaMagList; - this.sendOnLoadingEnded(); + + if (enableGiacenza) { + mOrdiniRestConsumerService.getSuggestedPickingList(this.mDefaultCodMdep, pickingList, pickingObjectList -> { + this.mPickingList.postValue(pickingObjectList); + this.sendOnLoadingEnded(); + }, ex -> this.sendError(new OrdersLoadException(ex))); + } else { + getEmptyPickingList(pickingList, pickingObjectList -> { + this.mPickingList.postValue(pickingObjectList); + this.sendOnLoadingEnded(); + }); + } }); this.mDefaultGestioneOfUL = gestioneCol; From 929c52b94ceb6f6db0225b309ccbbbf7f5e492e2 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Mon, 18 Nov 2024 16:36:45 +0100 Subject: [PATCH 06/22] -> v1.41.06 (454) --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index beed556b..ff2d655c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ apply plugin: 'com.google.gms.google-services' android { - def appVersionCode = 453 - def appVersionName = '1.41.05' + def appVersionCode = 454 + def appVersionName = '1.41.06' signingConfigs { release { From 8b3d1f2a2ed88051686adf9e6b6f06063751726b Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Mon, 18 Nov 2024 18:31:01 +0100 Subject: [PATCH 07/22] Ulteriori fix su DialogProgressView --- .../integrywmsnative/core/expansion/BaseActivity.java | 8 ++++---- .../core/expansion/BaseDialogFragment.java | 8 ++++---- .../integrywmsnative/core/expansion/BaseFragment.java | 8 ++++---- .../gest/settings/MainSettingsFragment.java | 8 ++++---- .../integrywmsnative/view/dialogs/DialogProgressView.java | 4 ++-- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseActivity.java b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseActivity.java index d96a6950..5cf92c86 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseActivity.java @@ -53,16 +53,16 @@ public class BaseActivity extends AppCompatActivity { private void openProgress() { BarcodeManager.disable(); - executorService.execute(() -> { + //executorService.execute(() -> { this.mCurrentProgress.show(getSupportFragmentManager()); - }); + //}); } private void closeProgress() { BarcodeManager.enable(); - executorService.execute(() -> { + //executorService.execute(() -> { mCurrentProgress.dismiss(); - }); + //}); } @Override diff --git a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java index 5f607310..4cb8d6d9 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java @@ -77,16 +77,16 @@ public abstract class BaseDialogFragment extends DialogFragment implements Dialo private void openProgress() { BarcodeManager.disable(); - executorService.execute(() -> { +// executorService.execute(() -> { this.mCurrentProgress.show(requireActivity().getSupportFragmentManager()); - }); +// }); } private void closeProgress() { BarcodeManager.enable(); - executorService.execute(() -> { +// executorService.execute(() -> { mCurrentProgress.dismiss(); - }); +// }); } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseFragment.java b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseFragment.java index 3df725b5..b3b79372 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseFragment.java @@ -66,16 +66,16 @@ public abstract class BaseFragment extends Fragment { private void openProgress() { BarcodeManager.disable(); - executorService.execute(() -> { +// executorService.execute(() -> { this.mCurrentProgress.show(requireActivity().getSupportFragmentManager()); - }); +// }); } private void closeProgress() { BarcodeManager.enable(); - executorService.execute(() -> { +// executorService.execute(() -> { mCurrentProgress.dismiss(); - }); +// }); } public void onError(Exception ex) { diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java index ac529751..fbe5a87c 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java @@ -309,15 +309,15 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT private void openProgress() { - executorService.execute(() -> { +// executorService.execute(() -> { this.mCurrentProgress.show(requireActivity().getSupportFragmentManager()); - }); +// }); } private void closeProgress() { - executorService.execute(() -> { +// executorService.execute(() -> { mCurrentProgress.dismiss(); - }); +// }); } diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/DialogProgressView.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/DialogProgressView.java index 37152686..2b4d0120 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/DialogProgressView.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/DialogProgressView.java @@ -64,7 +64,7 @@ public class DialogProgressView extends DialogFragment { } public void show(@NonNull FragmentManager manager) { - if (!isAdded() && !isInLayout()) { + if (!isAdded() && !isInLayout() && !progressOpened) { this.progressOpened = true; super.show(manager, "loading-dialog"); } @@ -72,7 +72,7 @@ public class DialogProgressView extends DialogFragment { @Override public void dismiss() { - if (isAdded() || isInLayout()) { + if (isAdded() || isInLayout() || progressOpened) { this.progressOpened = false; super.dismissAllowingStateLoss(); } From 0e24f7188cebc04c1550472de4e477d942fe2cfd Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Mon, 18 Nov 2024 18:31:43 +0100 Subject: [PATCH 08/22] -> v1.41.07 (455) --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ff2d655c..d8479f19 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ apply plugin: 'com.google.gms.google-services' android { - def appVersionCode = 454 - def appVersionName = '1.41.06' + def appVersionCode = 455 + def appVersionName = '1.41.07' signingConfigs { release { From 47143fe97d8962fd0f177fab3eb1a3b3c263cf47 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 21 Nov 2024 18:33:20 +0100 Subject: [PATCH 09/22] Fix sul caricamento degli ordini di acquisto --- .../core/expansion/BaseDialogFragment.java | 3 ++- .../PVOrdiniAcquistoRESTConsumer.java | 21 ++++++------------- .../DialogScanGrigliaAcquistoView.java | 5 ++++- build.gradle | 2 +- 4 files changed, 13 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java index 4cb8d6d9..42b9c1c0 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java @@ -91,8 +91,9 @@ public abstract class BaseDialogFragment extends DialogFragment implements Dialo public void onError(Exception ex) { + this.onLoadingEnded(); + requireActivity().runOnUiThread(() -> { - this.onLoadingEnded(); UtilityExceptions.defaultException(requireActivity(), ex); }); } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PVOrdiniAcquistoRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PVOrdiniAcquistoRESTConsumer.java index 16459e4d..930353f6 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PVOrdiniAcquistoRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PVOrdiniAcquistoRESTConsumer.java @@ -17,7 +17,6 @@ import it.integry.integrywmsnative.core.rest.RESTBuilder; import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse; import it.integry.integrywmsnative.core.utility.UtilityDate; import it.integry.integrywmsnative.core.utility.UtilityLogger; -import it.integry.integrywmsnative.core.utility.UtilityThread; import it.integry.integrywmsnative.gest.contab_doc_interni.dto.ArtDTO; import it.integry.integrywmsnative.gest.contab_doc_interni.dto.OrdineDTO; import it.integry.integrywmsnative.gest.contab_doc_interni.dto.SaveDTO; @@ -42,17 +41,13 @@ public class PVOrdiniAcquistoRESTConsumer extends _BaseRESTConsumer { public void onResponse(Call> call, Response> response) { var startTime = new Date().getTime(); analyzeAnswer(response, "retrieveArticoliOrdine", articoliOrdineWrapper -> { - UtilityThread.executeParallel(() -> { - Log.d("LOADING TIME 1", "MS: " + (new Date().getTime() - startTime)); - onSuccess.run(articoliOrdineWrapper); - }, false); + Log.d("LOADING TIME 1", "MS: " + (new Date().getTime() - startTime)); + onSuccess.run(articoliOrdineWrapper); }, onFailed); } @Override public void onFailure(Call> call, Throwable t) { - Log.e("getArticoliListino_pv", t.toString()); - UtilityLogger.error(new Exception(t)); onFailed.run(new Exception(t)); } }); @@ -66,17 +61,13 @@ public class PVOrdiniAcquistoRESTConsumer extends _BaseRESTConsumer { public void onResponse(Call> call, Response> response) { var startTime = new Date().getTime(); analyzeAnswer(response, "retrieveArticoliOrdine", articoliOrdineWrapper -> { - UtilityThread.executeParallel(() -> { - Log.d("LOADING TIME 1", "MS: " + (new Date().getTime() - startTime)); - onSuccess.run(articoliOrdineWrapper); - }, false); + Log.d("LOADING TIME 1", "MS: " + (new Date().getTime() - startTime)); + onSuccess.run(articoliOrdineWrapper); }, onFailed); } @Override public void onFailure(Call> call, Throwable t) { - Log.e("getArticoliListino_pv", t.toString()); - UtilityLogger.error(new Exception(t)); onFailed.run(new Exception(t)); } }); @@ -105,7 +96,7 @@ public class PVOrdiniAcquistoRESTConsumer extends _BaseRESTConsumer { public void onResponse(Call> call, Response> response) { var startTime = new Date().getTime(); analyzeAnswer(response, "retrieveArticoliOrdine", articoliOrdineWrapper -> { - UtilityThread.executeParallel(() -> { +// UtilityThread.executeParallel(() -> { // if (data == null) { // onFailed.run(new Exception("Nessun ordine generato")); // return; @@ -117,7 +108,7 @@ public class PVOrdiniAcquistoRESTConsumer extends _BaseRESTConsumer { // ordine.setCodMdep(data.getCodMdep()); // ordine.setNumOrd(data.getNumOrd()); onSuccess.run(ordine); - }, false); +// }, false); }, onFailed); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/dialogs/DialogScanGrigliaAcquistoView.java b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/dialogs/DialogScanGrigliaAcquistoView.java index 05cf08fe..048baa31 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/dialogs/DialogScanGrigliaAcquistoView.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/dialogs/DialogScanGrigliaAcquistoView.java @@ -130,8 +130,10 @@ public class DialogScanGrigliaAcquistoView extends BaseDialogFragment { this.onLoadingStarted(); String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep(); pvOrdiniAcquistoRESTConsumer.retrieveArticoli(codAlis, codMdep, dto -> { + this.onLoadingEnded(); - if (dto.getArticoli().size() == 0) { + + if (dto.getArticoli().isEmpty()) { if (UtilityString.isNullOrEmpty(codAlis)) { onFailed.run(new NoArtsFoundException()); } else { @@ -146,6 +148,7 @@ public class DialogScanGrigliaAcquistoView extends BaseDialogFragment { mGriglia.setDescrDepo(dto.getDescrDepo()); mListArticoli = dto.getArticoli(); this.dismiss(); + }, onFailed); } diff --git a/build.gradle b/build.gradle index aeeee85b..b8a52f85 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { ext { kotlin_version = '1.9.20' - agp_version = '8.7.1' + agp_version = '8.7.2' } repositories { From 191953a0036c98a1bb85d19529b0856a31f48aaf Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 21 Nov 2024 18:34:04 +0100 Subject: [PATCH 10/22] -> v1.41.08 (456) --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d8479f19..b2b722c9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ apply plugin: 'com.google.gms.google-services' android { - def appVersionCode = 455 - def appVersionName = '1.41.07' + def appVersionCode = 456 + def appVersionName = '1.41.08' signingConfigs { release { From 9df1c37ee9e80fbfbe9b553092e1c49e30cb9d80 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Mon, 25 Nov 2024 11:40:13 +0100 Subject: [PATCH 11/22] Fix su esportazione log --- .../core/utility/UtilityExceptions.java | 2 ++ .../gest/settings/MainSettingsFragment.java | 23 +++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityExceptions.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityExceptions.java index 6843d1b8..cfe305fa 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityExceptions.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityExceptions.java @@ -63,6 +63,8 @@ public class UtilityExceptions { if (!BuildConfig.DEBUG && !toIgnore) { if (sendEmail) UtilityLogger.error(ex); FirebaseCrashlytics.getInstance().recordException(ex); + } else { + ex.printStackTrace(); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java index fbe5a87c..e10e28c8 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java @@ -18,7 +18,6 @@ import androidx.preference.PreferenceFragmentCompat; import androidx.sqlite.db.SimpleSQLiteQuery; import com.annimon.stream.Stream; -import com.google.firebase.crashlytics.FirebaseCrashlytics; import com.harrysoft.androidbluetoothserial.BluetoothManager; import java.io.BufferedReader; @@ -45,6 +44,7 @@ import it.integry.integrywmsnative.core.interfaces.ITitledFragment; import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer; import it.integry.integrywmsnative.core.rest.model.MailAttachmentDTO; import it.integry.integrywmsnative.core.rest.model.MailRequestDTO; +import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.core.utility.UtilityResources; import it.integry.integrywmsnative.view.dialogs.DialogProgressView; import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; @@ -293,13 +293,16 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT }); }); } catch (Exception ex) { - requireActivity().runOnUiThread(() -> { - DialogSimpleMessageView - .makeErrorDialog(new SpannableString(Html.fromHtml(ex.getMessage())), null, null) - .show(requireActivity().getSupportFragmentManager(), "tag"); - }); + UtilityExceptions.defaultException(requireContext(), ex); + this.closeProgress(); - FirebaseCrashlytics.getInstance().recordException(ex); +// requireActivity().runOnUiThread(() -> { +// DialogSimpleMessageView +// .makeErrorDialog(new SpannableString(Html.fromHtml(ex.getMessage())), null, null) +// .show(requireActivity().getSupportFragmentManager(), "tag"); +// }); +// +// FirebaseCrashlytics.getInstance().recordException(ex); } }); }) @@ -330,6 +333,12 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT String line; while ((line = br.readLine()) != null) { + + if(!line.matches("\\d{13}.*")) { + int lastNewLineChar = text.lastIndexOf("\n"); + text.deleteCharAt(text.length() - 1); + } + text.append(line); text.append('\n'); } From 3d341ac99d172ce4be8e75506c268cd1c0a8014a Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Mon, 25 Nov 2024 11:48:13 +0100 Subject: [PATCH 12/22] -> v1.41.09 (457) --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b2b722c9..6f112f2d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ apply plugin: 'com.google.gms.google-services' android { - def appVersionCode = 456 - def appVersionName = '1.41.08' + def appVersionCode = 457 + def appVersionName = '1.41.09' signingConfigs { release { From 7ed3b421a10d868125e17ee2f140b74a1c3180ff Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Wed, 4 Dec 2024 10:25:10 +0100 Subject: [PATCH 13/22] Fix su setup nulla in DialogSelectDocInfoViewModel --- .../dialog/DialogSelectDocInfoViewModel.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/contab_doc_interni/dialog/DialogSelectDocInfoViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/contab_doc_interni/dialog/DialogSelectDocInfoViewModel.java index ec74bfa4..39f6af4c 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/contab_doc_interni/dialog/DialogSelectDocInfoViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/contab_doc_interni/dialog/DialogSelectDocInfoViewModel.java @@ -3,6 +3,7 @@ package it.integry.integrywmsnative.gest.contab_doc_interni.dialog; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; +import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; @@ -36,7 +37,8 @@ public class DialogSelectDocInfoViewModel extends ViewModel { private final MutableLiveData noteRequired = new MutableLiveData<>(false); public DialogSelectDocInfoViewModel() { - List requestNumDocList = Arrays.asList(SettingsManager.iDB().getDocInterniRequestNumDoc().split("\\|")); + String docInterniRequestNumDoc = SettingsManager.iDB().getDocInterniRequestNumDoc(); + List requestNumDocList = docInterniRequestNumDoc != null ? Arrays.asList(docInterniRequestNumDoc.split("\\|")) : new ArrayList<>(); tipoDoc.observeForever(val -> fornitoreRequired.postValue(val != null && (val.getGestioneDoc().equals("T") || val.getGestioneDoc().equals("A") || (val.getGestioneDoc().equals("P") && !val.getGestione().equals("L"))))); From 39841f6b0d548479f0427731c107b8214178e450 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Wed, 4 Dec 2024 10:26:38 +0100 Subject: [PATCH 14/22] -> v1.41.10 (458) --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6f112f2d..d95ad6cb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ apply plugin: 'com.google.gms.google-services' android { - def appVersionCode = 457 - def appVersionName = '1.41.09' + def appVersionCode = 458 + def appVersionName = '1.41.10' signingConfigs { release { From e70d5697c30439e9f4cef7c76bd184132849dc44 Mon Sep 17 00:00:00 2001 From: ValerioC Date: Thu, 5 Dec 2024 16:08:48 +0100 Subject: [PATCH 15/22] aggiunto isnull su numero risorse in query recuper materiale versato --- .../rest/ProdRecuperMaterialeRESTConsumer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/rest/ProdRecuperMaterialeRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/rest/ProdRecuperMaterialeRESTConsumer.java index bfa6841a..c29fc86a 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/rest/ProdRecuperMaterialeRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/rest/ProdRecuperMaterialeRESTConsumer.java @@ -68,7 +68,7 @@ public class ProdRecuperMaterialeRESTConsumer extends _BaseRESTConsumer { " dtb_ord_steps.hr_num as hr, " + " mtb_colr.riga_ord, " + " CONVERT(INTEGER, ROUND((CAST(dtb_ord_steps.hr_num AS DECIMAL(20, 5)) / " + - " SUM(dtb_ord_steps.hr_num) OVER (PARTITION BY mtb_colr.num_collo)) * 100, " + + " SUM(CASE WHEN dtb_ord_steps.hr_num > 0 then dtb_ord_steps.hr_num else 1 end) OVER (PARTITION BY mtb_colr.num_collo)) * 100, " + " 0)) as percentage_hr " + " FROM mtb_colr " + " INNER JOIN mtb_colt ON mtb_colr.num_collo = mtb_colt.num_collo " + From b48b2fbac95513e37fb106ab102b8840d5893bd4 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 5 Dec 2024 17:24:48 +0100 Subject: [PATCH 16/22] Fix su sorting partita mag nulla in Spedizione --- .../integrywmsnative/gest/spedizione/SpedizioneViewModel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java index ce43239c..8a4b558b 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java @@ -942,7 +942,7 @@ public class SpedizioneViewModel { if (availableBatchLots.stream().anyMatch(x -> x.getDataScad() == null)) { tmp.addAll(availableBatchLots.stream() .filter(x -> x.getDataScad() == null) - .sorted(Comparator.comparing(MtbPartitaMag::getPartitaMag)) + .sorted(Comparator.comparing(x -> UtilityString.isNull(x.getPartitaMag(), ""))) .collect(Collectors.toList())); } From 403f2ec57c59bff70e2256d9105617d00c38fa4d Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 5 Dec 2024 17:25:42 +0100 Subject: [PATCH 17/22] -> v1.41.11 (459) --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d95ad6cb..fd88aa00 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ apply plugin: 'com.google.gms.google-services' android { - def appVersionCode = 458 - def appVersionName = '1.41.10' + def appVersionCode = 459 + def appVersionName = '1.41.11' signingConfigs { release { From 73b1a77a12ac01ba6e4adec96d006778b2416d3a Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Fri, 6 Dec 2024 11:37:09 +0100 Subject: [PATCH 18/22] Migliorata gestione degli Updates in modo da forzare gli aggiornamenti di default a meno che non venga specificato forced=false nel file version.txt --- app/build.gradle | 2 +- .../rest/consumers/SystemRESTConsumer.java | 23 +++++++--- .../consumers/SystemRESTConsumerService.java | 4 ++ .../rest/consumers/_BaseRESTConsumer.java | 26 +++++++++++ .../model/system/LatestAppVersionInfoDTO.java | 44 +++++++++++++++++++ .../core/update/UpdatesManager.java | 38 +++++++++++----- .../core/utility/FileDownloader.java | 2 + .../gest/main/MainActivity.java | 6 ++- 8 files changed, 127 insertions(+), 18 deletions(-) create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/rest/model/system/LatestAppVersionInfoDTO.java diff --git a/app/build.gradle b/app/build.gradle index fd88aa00..fcb68f41 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -75,7 +75,7 @@ android { build { doLast { delete "$projectDir/build/outputs/apk/release/version.txt" - file("$projectDir/build/outputs/apk/release/version.txt").text = appVersionCode + '\n' + appVersionName + file("$projectDir/build/outputs/apk/release/version.txt").text = appVersionCode + '\n' + appVersionName + '\n' + 'forced=true' } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumer.java index fd8bbbda..da5fd31c 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumer.java @@ -4,9 +4,6 @@ import android.text.TextUtils; import android.util.Log; import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonParseException; import com.orhanobut.logger.Logger; import java.io.ByteArrayInputStream; @@ -15,7 +12,6 @@ import java.io.InputStreamReader; import java.io.Reader; import java.lang.reflect.Type; import java.net.ConnectException; -import java.util.Date; import java.util.List; import javax.inject.Singleton; @@ -29,9 +25,9 @@ import it.integry.integrywmsnative.core.rest.model.AvailableCodMdepsDTO; import it.integry.integrywmsnative.core.rest.model.MailRequestDTO; import it.integry.integrywmsnative.core.rest.model.NativeSqlRequestDTO; import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse; +import it.integry.integrywmsnative.core.rest.model.system.LatestAppVersionInfoDTO; import it.integry.integrywmsnative.core.rest.model.system.RegisterDeviceRequestDTO; import it.integry.integrywmsnative.core.settings.SettingsManager; -import it.integry.integrywmsnative.core.utility.UtilityDate; import it.integry.integrywmsnative.core.utility.UtilityGson; import it.integry.integrywmsnative.core.utility.UtilityString; import retrofit2.Call; @@ -42,6 +38,23 @@ import retrofit2.Response; public class SystemRESTConsumer extends _BaseRESTConsumer { + public void retrieveUpdatesInfo(final RunnableArgs onSuccess, final RunnableArgs onFailed) { + SystemRESTConsumerService systemRESTConsumerService = RESTBuilder.getService(SystemRESTConsumerService.class); + systemRESTConsumerService.retrieveUpdatesInfo() + .enqueue(new Callback<>() { + @Override + public void onResponse(Call call, Response response) { + analyzeAnswerGeneric(response, "updates", onSuccess, onFailed); + } + + @Override + public void onFailure(Call call, Throwable t) { + onFailed.run(new Exception(t)); + } + }); + } + + public void registerDevice(final Runnable onSuccess, final RunnableArgs onFailed) { RegisterDeviceRequestDTO registerDeviceRequestDTO = new RegisterDeviceRequestDTO() .setApp("WMS"); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumerService.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumerService.java index 2ed64fbe..7c6f0662 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumerService.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumerService.java @@ -6,6 +6,7 @@ import it.integry.integrywmsnative.core.rest.model.AvailableCodMdepsDTO; import it.integry.integrywmsnative.core.rest.model.MailRequestDTO; import it.integry.integrywmsnative.core.rest.model.NativeSqlRequestDTO; import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse; +import it.integry.integrywmsnative.core.rest.model.system.LatestAppVersionInfoDTO; import it.integry.integrywmsnative.core.rest.model.system.RegisterDeviceRequestDTO; import retrofit2.Call; import retrofit2.http.Body; @@ -15,6 +16,9 @@ import retrofit2.http.Query; public interface SystemRESTConsumerService { + @GET("wms/currentVersion") + Call retrieveUpdatesInfo(); + @POST("device/register") Call> registerDevice(@Body RegisterDeviceRequestDTO registerDeviceRequestDTO); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/_BaseRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/_BaseRESTConsumer.java index e513aeca..01cc92cc 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/_BaseRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/_BaseRESTConsumer.java @@ -15,6 +15,32 @@ import retrofit2.Response; public abstract class _BaseRESTConsumer { + + public static void analyzeAnswerGeneric(Response response, String logTitle, RunnableArgs onComplete, RunnableArgs onFailed) { + try { + var data = analyzeAnswerGeneric(response, logTitle); + onComplete.run(data); + } catch (Exception e) { + onFailed.run(e); + } + } + + public static T analyzeAnswerGeneric(Response response, String logTitle) throws Exception { + if (response.isSuccessful()) { + return response.body(); + } else { + if (response.code() == 404) { + Log.e(logTitle, "Errore " + response.code() + ": risorsa non trovata (" + response.raw().request().url() + ")"); + throw new Exception("Errore " + response.code() + ": risorsa non trovata (" + logTitle + ")"); + } else if (response.code() == 550) + throw new InvalidLicenseException(); + else { + Log.e(logTitle, "Status " + response.code() + ": " + response.message()); + throw new Exception("Status " + response.code() + ": " + response.message()); + } + } + } + public static T analyzeAnswer(Response> response, String logTitle) throws Exception { if (response.isSuccessful()) { if (response.body() != null) { diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/model/system/LatestAppVersionInfoDTO.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/model/system/LatestAppVersionInfoDTO.java new file mode 100644 index 00000000..ccc61710 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/model/system/LatestAppVersionInfoDTO.java @@ -0,0 +1,44 @@ +package it.integry.integrywmsnative.core.rest.model.system; + +public class LatestAppVersionInfoDTO { + private String latestVersion; + private int latestVersionCode; + private String url; + private boolean forced; + + public String getLatestVersion() { + return latestVersion; + } + + public LatestAppVersionInfoDTO setLatestVersion(String latestVersion) { + this.latestVersion = latestVersion; + return this; + } + + public int getLatestVersionCode() { + return latestVersionCode; + } + + public LatestAppVersionInfoDTO setLatestVersionCode(int latestVersionCode) { + this.latestVersionCode = latestVersionCode; + return this; + } + + public String getUrl() { + return url; + } + + public LatestAppVersionInfoDTO setUrl(String url) { + this.url = url; + return this; + } + + public boolean isForced() { + return forced; + } + + public LatestAppVersionInfoDTO setForced(boolean forced) { + this.forced = forced; + return this; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/update/UpdatesManager.java b/app/src/main/java/it/integry/integrywmsnative/core/update/UpdatesManager.java index e776427a..3aaee7d8 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/update/UpdatesManager.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/update/UpdatesManager.java @@ -15,16 +15,19 @@ import java.io.File; import javax.inject.Singleton; +import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer; import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.FileDownloader; +import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.view.dialogs.DialogProgressView; @Singleton public class UpdatesManager { + private AppCompatActivity mContext; - public void init(AppCompatActivity activityContext) { + public void init(AppCompatActivity activityContext, SystemRESTConsumer systemRESTConsumer) { this.mContext = activityContext; final String baseEndpoint = SettingsManager.i().getServer().getProtocol() + "://" + SettingsManager.i().getServer().getHost() + @@ -34,15 +37,22 @@ public class UpdatesManager { final String currentDownloadUrl = baseEndpoint + "/ems-api/wms/android-release.apk"; - AppUpdater appUpdater = new AppUpdater(mContext) - .setDisplay(Display.DIALOG) - .setUpdateFrom(UpdateFrom.JSON) - .setUpdateJSON(currentVersionUrl) - .setButtonDoNotShowAgain(null) - .setButtonUpdateClickListener((dialog, which) -> { - installAPK(currentDownloadUrl); - }); - appUpdater.start(); + systemRESTConsumer.retrieveUpdatesInfo(latestData -> { + + AppUpdater appUpdater = new AppUpdater(mContext) + .setDisplay(Display.DIALOG) + .setUpdateFrom(UpdateFrom.JSON) + .setUpdateJSON(currentVersionUrl) + .setButtonDoNotShowAgain(null) + .setButtonUpdateClickListener((dialog, which) -> { + installAPK(currentDownloadUrl); + }); + + if(latestData.isForced()) + appUpdater.setButtonDismiss(null); + + appUpdater.start(); + }, ex -> UtilityExceptions.defaultException(mContext, ex)); } @@ -67,6 +77,11 @@ public class UpdatesManager { mContext.runOnUiThread(() -> { progressDialogBuilder.dismiss(); + if (!destination.exists()) { + UtilityExceptions.defaultException(mContext, new Exception("Errore durante il download dell'aggiornamento")); + return; + } + Uri fileLoc; Intent intent; @@ -93,7 +108,8 @@ public class UpdatesManager { try { fileDownloader.download(); } catch (Exception e) { - e.printStackTrace(); + progressDialogBuilder.dismissAllowingStateLoss(); + UtilityExceptions.defaultException(mContext, e); } }).start(); } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/FileDownloader.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/FileDownloader.java index 4e51b26d..fd9fc64e 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/utility/FileDownloader.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/FileDownloader.java @@ -61,6 +61,8 @@ public class FileDownloader { } } catch (Exception e) { + if(downloadFile != null && downloadFile.exists()) + downloadFile.delete(); throw e; } finally { diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java index 64941217..58603a94 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java @@ -41,6 +41,7 @@ import it.integry.integrywmsnative.core.interfaces.ISearchableFragment; import it.integry.integrywmsnative.core.interfaces.ISelectAllFragment; import it.integry.integrywmsnative.core.interfaces.ITitledFragment; import it.integry.integrywmsnative.core.menu.MenuService; +import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer; import it.integry.integrywmsnative.core.rest.watcher.ServerStatusChecker; import it.integry.integrywmsnative.core.update.UpdatesManager; import it.integry.integrywmsnative.core.utility.UtilityContext; @@ -69,6 +70,9 @@ public class MainActivity extends BaseActivity @Inject UpdatesManager updatesManager; + @Inject + SystemRESTConsumer systemRESTConsumer; + @Inject DialogProgressView mDialogProgressView; @@ -85,7 +89,7 @@ public class MainActivity extends BaseActivity mBinding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.activity_main, null, false); setContentView(mBinding.getRoot()); - updatesManager.init(this); + updatesManager.init(this, systemRESTConsumer); UtilityContext.initMainActivity(this); setSupportActionBar(mBinding.appBarMain.toolbar); From 653cd3fd75af39b9f838f4bcb1d137eb00843256 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Mon, 9 Dec 2024 19:18:03 +0100 Subject: [PATCH 19/22] Implementata creazione di un nuovo articolo da Rettifica Giacenze --- app/build.gradle | 19 +- .../MainApplicationComponent.java | 7 +- .../integrywmsnative/core/di/Converters.java | 102 ++++- .../core/di/ValidatableObservableField.java | 65 +++ .../binders/AutoCompleteTextViewBinders.java | 22 +- .../di/binders/TextInputLayoutBinders.java | 1 + .../di/validators/GreaterThenValidator.java | 23 + .../di/validators/MinLengthValidator.java | 21 + .../core/di/validators/NotEmptyValidator.java | 19 + .../core/di/validators/NotNullValidator.java | 19 + .../core/di/validators/Validator.java | 7 + .../integrywmsnative/core/model/MtbGrup.java | 13 + .../integrywmsnative/core/model/MtbSfam.java | 49 ++ .../integrywmsnative/core/model/MtbSgrp.java | 112 +++++ .../rest/consumers/ArticoloRESTConsumer.java | 62 +++ .../ArticoloRESTConsumerService.java | 14 + .../consumers/ColliMagazzinoRESTConsumer.java | 2 +- .../core/rest/model/articolo/ArticoloDTO.java | 257 +++++++++++ .../articolo/SaveArticoloRequestDTO.java | 14 + .../articolo/SaveArticoloResponseDTO.java | 9 + .../core/settings/DBSettingsModel.java | 20 + .../core/settings/SettingsManager.java | 15 + .../core/utility/UtilityBarcode.java | 81 +++- .../core/utility/UtilityObservable.java | 39 ++ .../ProdRecuperoMaterialeViewModel.java | 3 + .../PVOrdineAcquistoEditActivity.java | 2 +- .../RettificaGiacenzeFragment.java | 45 +- .../RettificaGiacenzeViewModel.java | 115 ++--- .../DialogUltimeConsegneFiltroAvanzato.java | 3 +- .../SimpleAutoCompleteDropdownAdapter.java | 133 +++--- .../DialogCreateNewArtComponent.java | 14 + .../DialogCreateNewArtModule.java | 15 + .../DialogCreateNewArtView.java | 302 +++++++++++++ .../DialogCreateNewArtViewModel.java | 209 +++++++++ .../DialogInputQuantityV2View.java | 6 +- .../main/res/drawable/ic_check_black_24dp.xml | 9 - .../main/res/drawable/ic_check_white_24dp.xml | 9 - .../main/res/drawable/ic_round_check_24.xml | 5 + .../layout-land-hdpi/dialog_input_lu_prod.xml | 12 +- .../dialog_input_quantity_v2.xml | 46 +- .../main/res/layout-large/activity_login.xml | 17 +- app/src/main/res/layout/activity_login.xml | 201 ++++----- .../activity_pv_ordine_acquisto_edit.xml | 4 +- app/src/main/res/layout/app_bar_main.xml | 2 +- .../res/layout/dialog_ask_info_inventario.xml | 4 +- .../dialog_ask_position_of_lu__page2.xml | 2 +- .../res/layout/dialog_ask_should_print.xml | 2 +- .../main/res/layout/dialog_create_new_art.xml | 424 ++++++++++++++++++ .../res/layout/dialog_info_aggiuntive_lu.xml | 2 +- .../main/res/layout/dialog_input_general.xml | 2 +- .../main/res/layout/dialog_input_lu_prod.xml | 12 +- .../main/res/layout/dialog_input_peso_lu.xml | 4 +- .../dialog_input_quantity_to_return.xml | 2 +- .../res/layout/dialog_input_quantity_v2.xml | 60 ++- .../res/layout/dialog_pv_edit_articolo.xml | 6 +- .../fragment_main_accettazione_bolla.xml | 2 +- .../fragment_main_accettazione_ordini.xml | 2 +- .../layout/fragment_main_ordini_uscita.xml | 2 +- .../fragment_main_rettifica_giacenze.xml | 148 +++--- .../fragment_main_ultime_consegne_cliente.xml | 2 +- .../res/layout/fragment_picking_libero.xml | 2 +- .../fragment_prod_fabbisogno_linee_prod.xml | 2 +- ...fragment_prod_ordine_produzione_elenco.xml | 2 +- .../fragment_prod_versamento_materiale.xml | 2 +- .../fragment_ultimi_arrivi_fornitore.xml | 2 +- .../res/menu/doc_interni_edit_fab_menu.xml | 2 +- app/src/main/res/values-it/strings.xml | 4 +- app/src/main/res/values/colors.xml | 2 +- app/src/main/res/values/config.xml | 2 + app/src/main/res/values/strings.xml | 6 +- app/src/main/res/values/styles.xml | 52 +-- app/src/main/res/values/themes.xml | 10 +- 72 files changed, 2366 insertions(+), 542 deletions(-) create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/di/ValidatableObservableField.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/di/validators/GreaterThenValidator.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/di/validators/MinLengthValidator.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/di/validators/NotEmptyValidator.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/di/validators/NotNullValidator.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/di/validators/Validator.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/model/MtbSfam.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/model/MtbSgrp.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/rest/model/articolo/ArticoloDTO.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/rest/model/articolo/SaveArticoloRequestDTO.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/rest/model/articolo/SaveArticoloResponseDTO.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/view/dialogs/create_new_art/DialogCreateNewArtComponent.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/view/dialogs/create_new_art/DialogCreateNewArtModule.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/view/dialogs/create_new_art/DialogCreateNewArtView.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/view/dialogs/create_new_art/DialogCreateNewArtViewModel.java delete mode 100644 app/src/main/res/drawable/ic_check_black_24dp.xml delete mode 100644 app/src/main/res/drawable/ic_check_white_24dp.xml create mode 100644 app/src/main/res/drawable/ic_round_check_24.xml create mode 100644 app/src/main/res/layout/dialog_create_new_art.xml diff --git a/app/build.gradle b/app/build.gradle index fcb68f41..749e9ba6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -92,7 +92,7 @@ android { } dependencies { - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.3' implementation fileTree(include: ['*.jar'], dir: 'libs') androidTestImplementation('androidx.test.espresso:espresso-core:3.3.0', { exclude group: 'com.android.support', module: 'support-annotations' @@ -103,17 +103,17 @@ dependencies { //Firebase // Import the Firebase BoM - implementation platform('com.google.firebase:firebase-bom:32.8.1') + implementation platform('com.google.firebase:firebase-bom:33.7.0') implementation 'com.google.firebase:firebase-analytics' implementation 'com.google.firebase:firebase-crashlytics' implementation 'com.google.firebase:firebase-perf' - implementation 'com.google.android.gms:play-services-basement:18.3.0' + implementation 'com.google.android.gms:play-services-basement:18.5.0' - implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.appcompat:appcompat:1.7.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'com.google.android.material:material:1.11.0' - implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'com.google.android.material:material:1.12.0' + implementation 'androidx.constraintlayout:constraintlayout:2.2.0' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.recyclerview:recyclerview:1.3.2' @@ -127,12 +127,12 @@ dependencies { implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.annimon:stream:1.2.2' - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.7.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.8.7' // implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' implementation 'org.apache.commons:commons-text:1.9' //MVVM - def dagger2_version = '2.46.1' + def dagger2_version = '2.49' api "com.google.dagger:dagger:$dagger2_version" annotationProcessor "com.google.dagger:dagger-compiler:$dagger2_version" api "com.google.dagger:dagger-android:$dagger2_version" @@ -182,6 +182,9 @@ dependencies { // RxJava is also required. implementation 'io.reactivex.rxjava2:rxjava:2.1.12' implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' + + //Barcode generator + implementation group: 'com.google.zxing', name: 'core', version: '3.5.3' } repositories { diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java index 13acc45b..214f6815 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java @@ -126,6 +126,8 @@ import it.integry.integrywmsnative.view.dialogs.choose_arts_from_mtbcolr_list.Di import it.integry.integrywmsnative.view.dialogs.choose_arts_from_mtbcolr_list.DialogChooseArtsFromMtbColrListModule; import it.integry.integrywmsnative.view.dialogs.choose_batch_lot.DialogChooseBatchLotComponent; import it.integry.integrywmsnative.view.dialogs.choose_batch_lot.DialogChooseBatchLotModule; +import it.integry.integrywmsnative.view.dialogs.create_new_art.DialogCreateNewArtComponent; +import it.integry.integrywmsnative.view.dialogs.create_new_art.DialogCreateNewArtModule; import it.integry.integrywmsnative.view.dialogs.info_aggiuntive_lu.DialogInfoAggiuntiveLUComponent; import it.integry.integrywmsnative.view.dialogs.info_aggiuntive_lu.DialogInfoAggiuntiveLUModule; import it.integry.integrywmsnative.view.dialogs.input_lu_prod.DialogInputLUProdComponent; @@ -218,7 +220,8 @@ import it.integry.integrywmsnative.view.dialogs.tracciamento_imballi.DialogTracc DialogInfoGiacenzaModule.class, ArticoliInGiacenzaModule.class, DialogTracciamentoImballiModule.class, - DialogAskVettoreModule.class + DialogAskVettoreModule.class, + DialogCreateNewArtModule.class }) public interface MainApplicationComponent { @@ -365,6 +368,8 @@ public interface MainApplicationComponent { DialogAskVettoreComponent.Factory dialogAskVettoreComponent(); + DialogCreateNewArtComponent.Factory dialogCreateNewArtComponent(); + void inject(MainApplication mainApplication); void inject(AppContext mainApplication); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/di/Converters.java b/app/src/main/java/it/integry/integrywmsnative/core/di/Converters.java index f17ece86..0fdf8ca2 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/di/Converters.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/di/Converters.java @@ -111,6 +111,28 @@ public class Converters { } } + @BindingAdapter("binding") + public static void bindEditText(AppCompatTextView view, final ValidatableObservableField observableField) { + Pair, TextWatcherAdapter> pair = (Pair) view.getTag(R.id.bound_observable); + if (pair == null || pair.first != observableField) { + if (pair != null) { + view.removeTextChangedListener(pair.second); + } + TextWatcherAdapter watcher = new TextWatcherAdapter() { + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (observableField != null) observableField.set(s.toString()); + } + }; + view.setTag(R.id.bound_observable, new Pair<>(observableField, watcher)); + view.addTextChangedListener(watcher); + } + String newValue = observableField.get(); + if (!view.getText().toString().equals(newValue)) { + view.setText(newValue); + } + } + @BindingAdapter("binding") public static void bindEditText(EditText view, final BindableString bindableString) { Pair pair = (Pair) view.getTag(R.id.bound_observable); @@ -156,6 +178,28 @@ public class Converters { } } + @BindingAdapter("binding") + public static void bindEditText(EditText view, final ValidatableObservableField observableString) { + Pair, TextWatcherAdapter> pair = (Pair) view.getTag(R.id.bound_observable); + if (pair == null || pair.first != observableString) { + if (pair != null) { + view.removeTextChangedListener(pair.second); + } + TextWatcherAdapter watcher = new TextWatcherAdapter() { + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + observableString.set(s.toString()); + } + }; + view.setTag(R.id.bound_observable, new Pair<>(observableString, watcher)); + view.addTextChangedListener(watcher); + } + String newValue = observableString.get(); + if (!view.getText().toString().equals(newValue)) { + view.setText(newValue); + } + } + @BindingAdapter("binding") public static void bindEditText(AutoCompleteTextView view, final ObservableField observableString) { Pair, TextWatcherAdapter> pair = (Pair) view.getTag(R.id.bound_observable); @@ -260,6 +304,36 @@ public class Converters { } } + @BindingAdapter("binding") + public static void bindTextInputEditTextBigDecimal(EditText view, final ValidatableObservableField observableBigDecimal) { + Pair, TextWatcherAdapter> pair = (Pair) view.getTag(R.id.bound_observable); + if (pair == null || pair.first != observableBigDecimal) { + if (pair != null) { + view.removeTextChangedListener(pair.second); + } + TextWatcherAdapter watcher = new TextWatcherAdapter() { + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + BigDecimal value = null; + String newValueString = s.toString().trim(); + + if (!UtilityString.isNullOrEmpty(newValueString)) + value = new BigDecimal(newValueString); + + observableBigDecimal.set(value); + } + }; + view.setTag(R.id.bound_observable, new Pair<>(observableBigDecimal, watcher)); + view.addTextChangedListener(watcher); + } + BigDecimal newValue = observableBigDecimal.get(); + BigDecimal viewValue = !view.getText().toString().trim().isEmpty() ? new BigDecimal(view.getText().toString()) : null; + + if (!UtilityBigDecimal.equalsTo(viewValue, newValue)) { + view.setText(UtilityNumber.decimalToString(newValue)); + } + } + @BindingAdapter("binding") public static void bindTextInputEditTextBigDecimal(TextInputEditText view, final BindableBigDecimal bindableBigDecimal) { Pair pair = (Pair) view.getTag(R.id.bound_observable); @@ -657,6 +731,30 @@ public class Converters { view.setChecked(newValue); } + @BindingAdapter("checked") + public static void bindCheckbox(AppCompatCheckBox view, final ObservableField bindableBoolean) { + if (view.getTag(R.id.bound_observable) != bindableBoolean) { + view.setTag(R.id.bound_observable, bindableBoolean); + view.setOnCheckedChangeListener((compoundButton, b) -> { + bindableBoolean.set(b); + }); + } + Boolean newValue = bindableBoolean.get(); + view.setChecked(newValue); + } + + @BindingAdapter("checked") + public static void bindCheckbox(AppCompatCheckBox view, final ValidatableObservableField bindableBoolean) { + if (view.getTag(R.id.bound_observable) != bindableBoolean) { + view.setTag(R.id.bound_observable, bindableBoolean); + view.setOnCheckedChangeListener((compoundButton, b) -> { + bindableBoolean.set(b); + }); + } + Boolean newValue = bindableBoolean.get(); + view.setChecked(newValue); + } + @BindingAdapter("checked") public static void bindCheckbox(CheckBox view, final BindableBoolean bindableBoolean) { if (view.getTag(R.id.bound_observable) != bindableBoolean) { @@ -723,8 +821,8 @@ public class Converters { @BindingAdapter({"reverse_visibility"}) public static void bindViewReverseVisibility(View view, final BindableBoolean bindableBoolean) { - if (view.getTag(R.id.bound_observable) != bindableBoolean) { - view.setTag(R.id.bound_observable, bindableBoolean); + if (view.getTag(R.id.bound_reverse_visibility) != bindableBoolean) { + view.setTag(R.id.bound_reverse_visibility, bindableBoolean); } bindableBoolean.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() { @Override diff --git a/app/src/main/java/it/integry/integrywmsnative/core/di/ValidatableObservableField.java b/app/src/main/java/it/integry/integrywmsnative/core/di/ValidatableObservableField.java new file mode 100644 index 00000000..aec6c65c --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/di/ValidatableObservableField.java @@ -0,0 +1,65 @@ +package it.integry.integrywmsnative.core.di; + +import androidx.annotation.Nullable; +import androidx.databinding.BaseObservable; +import androidx.databinding.Bindable; + +import java.util.ArrayList; +import java.util.List; + +import it.integry.integrywmsnative.BR; +import it.integry.integrywmsnative.core.di.validators.Validator; + +public class ValidatableObservableField extends BaseObservable { + private T mValue; + private final List> validators = new ArrayList<>(); + public String errorMessage; + + public ValidatableObservableField() { + } + + public ValidatableObservableField(T value) { + mValue = value; + } + + /** + * @return the stored value. + */ + @Nullable + public T get() { + return mValue; + } + + public void set(T value) { + if (value != mValue) { + mValue = value; + notifyChange(); + validate(); + } + } + + public void addValidator(Validator validator) { + validators.add(validator); + } + + public boolean validate() { + for (Validator validator : validators) { + if (!validator.isValid(mValue)) { + setErrorMessage(validator.getErrorMessage()); + return false; + } + } + setErrorMessage(null); + return true; + } + + @Bindable + public String getErrorMessage() { + return errorMessage; + } + + private void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + notifyPropertyChanged(BR.errorMessage); // Notifica il cambiamento di errorMessage + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/di/binders/AutoCompleteTextViewBinders.java b/app/src/main/java/it/integry/integrywmsnative/core/di/binders/AutoCompleteTextViewBinders.java index a09b4af8..d9f5fba5 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/di/binders/AutoCompleteTextViewBinders.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/di/binders/AutoCompleteTextViewBinders.java @@ -2,5 +2,25 @@ package it.integry.integrywmsnative.core.di.binders; public class AutoCompleteTextViewBinders { - +// @BindingAdapter("binding") +// public static void bindUntMisText(AppCompatAutoCompleteTextView view, ObservableField untMisField) { +// Pair, TextWatcherAdapter> pair = (Pair) view.getTag(R.id.bound_observable); +// if (pair == null || pair.first != untMisField) { +// if (pair != null) { +// view.removeTextChangedListener(pair.second); +// } +// TextWatcherAdapter watcher = new TextWatcherAdapter() { +// @Override +// public void onTextChanged(CharSequence s, int start, int before, int count) { +// if (untMisField != null) untMisField.set(s.toString()); +// } +// }; +// view.setTag(R.id.bound_observable, new Pair<>(untMisField, watcher)); +// view.addTextChangedListener(watcher); +// } +// String newValue = untMisField != null && untMisField.get() != null ? Objects.requireNonNull(untMisField.get()).getUntMis() : ""; +// if (!view.getText().toString().equals(newValue)) { +// view.setText(newValue); +// } +// } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/di/binders/TextInputLayoutBinders.java b/app/src/main/java/it/integry/integrywmsnative/core/di/binders/TextInputLayoutBinders.java index cc974d49..4da2a6bd 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/di/binders/TextInputLayoutBinders.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/di/binders/TextInputLayoutBinders.java @@ -1,6 +1,7 @@ package it.integry.integrywmsnative.core.di.binders; import androidx.databinding.BindingAdapter; + import com.google.android.material.textfield.TextInputLayout; public class TextInputLayoutBinders { diff --git a/app/src/main/java/it/integry/integrywmsnative/core/di/validators/GreaterThenValidator.java b/app/src/main/java/it/integry/integrywmsnative/core/di/validators/GreaterThenValidator.java new file mode 100644 index 00000000..cddbd5f5 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/di/validators/GreaterThenValidator.java @@ -0,0 +1,23 @@ +package it.integry.integrywmsnative.core.di.validators; + +import java.math.BigDecimal; + +public class GreaterThenValidator implements Validator { + private final String errorMessage; + private final BigDecimal greaterThanValue; + + public GreaterThenValidator(BigDecimal greaterThanValue, String errorMessage) { + this.greaterThanValue = greaterThanValue; + this.errorMessage = errorMessage; + } + + @Override + public boolean isValid(BigDecimal value) { + return value != null && value.compareTo(greaterThanValue) > 0; + } + + @Override + public String getErrorMessage() { + return errorMessage; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/di/validators/MinLengthValidator.java b/app/src/main/java/it/integry/integrywmsnative/core/di/validators/MinLengthValidator.java new file mode 100644 index 00000000..cb5fef92 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/di/validators/MinLengthValidator.java @@ -0,0 +1,21 @@ +package it.integry.integrywmsnative.core.di.validators; + +public class MinLengthValidator implements Validator { + private final int minLength; + private final String errorMessage; + + public MinLengthValidator(int minLength, String errorMessage) { + this.minLength = minLength; + this.errorMessage = errorMessage; + } + + @Override + public boolean isValid(String value) { + return value != null && value.length() >= minLength; + } + + @Override + public String getErrorMessage() { + return errorMessage; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/di/validators/NotEmptyValidator.java b/app/src/main/java/it/integry/integrywmsnative/core/di/validators/NotEmptyValidator.java new file mode 100644 index 00000000..5a5d88f2 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/di/validators/NotEmptyValidator.java @@ -0,0 +1,19 @@ +package it.integry.integrywmsnative.core.di.validators; + +public class NotEmptyValidator implements Validator { + private final String errorMessage; + + public NotEmptyValidator(String errorMessage) { + this.errorMessage = errorMessage; + } + + @Override + public boolean isValid(String value) { + return value != null && !value.trim().isEmpty(); + } + + @Override + public String getErrorMessage() { + return errorMessage; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/di/validators/NotNullValidator.java b/app/src/main/java/it/integry/integrywmsnative/core/di/validators/NotNullValidator.java new file mode 100644 index 00000000..5e2f74c2 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/di/validators/NotNullValidator.java @@ -0,0 +1,19 @@ +package it.integry.integrywmsnative.core.di.validators; + +public class NotNullValidator implements Validator{ + private final String errorMessage; + + public NotNullValidator(String errorMessage) { + this.errorMessage = errorMessage; + } + + @Override + public boolean isValid(T value) { + return value != null; + } + + @Override + public String getErrorMessage() { + return errorMessage; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/di/validators/Validator.java b/app/src/main/java/it/integry/integrywmsnative/core/di/validators/Validator.java new file mode 100644 index 00000000..34ec0631 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/di/validators/Validator.java @@ -0,0 +1,7 @@ +package it.integry.integrywmsnative.core.di.validators; + +public interface Validator { + boolean isValid(T value); + + String getErrorMessage(); +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/model/MtbGrup.java b/app/src/main/java/it/integry/integrywmsnative/core/model/MtbGrup.java index 28e83607..e3754b57 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/model/MtbGrup.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/model/MtbGrup.java @@ -1,5 +1,8 @@ package it.integry.integrywmsnative.core.model; +import java.util.ArrayList; +import java.util.List; + public class MtbGrup extends EntityBase { private String codMgrp; @@ -8,6 +11,7 @@ public class MtbGrup extends EntityBase { private String logoWeb; private String criterioVal; private String tipoMgrp; + private List mtbSgrp = new ArrayList<>(); public MtbGrup() { this.type = "mtb_grup"; @@ -66,4 +70,13 @@ public class MtbGrup extends EntityBase { this.tipoMgrp = tipoMgrp; return this; } + + public List getMtbSgrp() { + return mtbSgrp; + } + + public MtbGrup setMtbSgrp(List mtbSgrp) { + this.mtbSgrp = mtbSgrp; + return this; + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/model/MtbSfam.java b/app/src/main/java/it/integry/integrywmsnative/core/model/MtbSfam.java new file mode 100644 index 00000000..611ac1a5 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/model/MtbSfam.java @@ -0,0 +1,49 @@ +package it.integry.integrywmsnative.core.model; + +public class MtbSfam extends EntityBase { + + private String codMgrp; + private String codMsgr; + private String codMsfa; + private String descrizione; + + public MtbSfam() { + this.type = "mtb_sfam"; + } + + public String getCodMgrp() { + return codMgrp; + } + + public MtbSfam setCodMgrp(String codMgrp) { + this.codMgrp = codMgrp; + return this; + } + + public String getCodMsgr() { + return codMsgr; + } + + public MtbSfam setCodMsgr(String codMsgr) { + this.codMsgr = codMsgr; + return this; + } + + public String getCodMsfa() { + return codMsfa; + } + + public MtbSfam setCodMsfa(String codMsfa) { + this.codMsfa = codMsfa; + return this; + } + + public String getDescrizione() { + return descrizione; + } + + public MtbSfam setDescrizione(String descrizione) { + this.descrizione = descrizione; + return this; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/model/MtbSgrp.java b/app/src/main/java/it/integry/integrywmsnative/core/model/MtbSgrp.java new file mode 100644 index 00000000..793b5fbd --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/model/MtbSgrp.java @@ -0,0 +1,112 @@ +package it.integry.integrywmsnative.core.model; + +import java.util.ArrayList; +import java.util.List; + +public class MtbSgrp extends EntityBase { + + private String codMgrp; + private String codMsgr; + private String descrizione; + private String inclInStat; + private String contoRimFin; + private Integer ordinamento; + private Boolean chkGiacenzaNeg; + private Boolean flagReso; + private String codCconWip; + private List mtbSfam = new ArrayList<>(); + + public MtbSgrp() { + this.type = "mtb_sgrp"; + } + + public String getCodMgrp() { + return codMgrp; + } + + public MtbSgrp setCodMgrp(String codMgrp) { + this.codMgrp = codMgrp; + return this; + } + + public String getCodMsgr() { + return codMsgr; + } + + public MtbSgrp setCodMsgr(String codMsgr) { + this.codMsgr = codMsgr; + return this; + } + + public String getDescrizione() { + return descrizione; + } + + public MtbSgrp setDescrizione(String descrizione) { + this.descrizione = descrizione; + return this; + } + + public String getInclInStat() { + return inclInStat; + } + + public MtbSgrp setInclInStat(String inclInStat) { + this.inclInStat = inclInStat; + return this; + } + + public String getContoRimFin() { + return contoRimFin; + } + + public MtbSgrp setContoRimFin(String contoRimFin) { + this.contoRimFin = contoRimFin; + return this; + } + + public Integer getOrdinamento() { + return ordinamento; + } + + public MtbSgrp setOrdinamento(Integer ordinamento) { + this.ordinamento = ordinamento; + return this; + } + + public Boolean getChkGiacenzaNeg() { + return chkGiacenzaNeg; + } + + public MtbSgrp setChkGiacenzaNeg(Boolean chkGiacenzaNeg) { + this.chkGiacenzaNeg = chkGiacenzaNeg; + return this; + } + + public Boolean getFlagReso() { + return flagReso; + } + + public MtbSgrp setFlagReso(Boolean flagReso) { + this.flagReso = flagReso; + return this; + } + + public String getCodCconWip() { + return codCconWip; + } + + public MtbSgrp setCodCconWip(String codCconWip) { + this.codCconWip = codCconWip; + return this; + } + + public List getMtbSfam() { + return mtbSfam; + } + + public MtbSgrp setMtbSfam(List mtbSfam) { + this.mtbSfam = mtbSfam; + return this; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ArticoloRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ArticoloRESTConsumer.java index 50577a84..87db9581 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ArticoloRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ArticoloRESTConsumer.java @@ -18,7 +18,10 @@ import it.integry.integrywmsnative.core.model.MtbUntMis; import it.integry.integrywmsnative.core.model.dto.StatoArticoloDTO; import it.integry.integrywmsnative.core.rest.RESTBuilder; import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse; +import it.integry.integrywmsnative.core.rest.model.articolo.ArticoloDTO; import it.integry.integrywmsnative.core.rest.model.articolo.RetrieveArticoloByCodMartRequestDTO; +import it.integry.integrywmsnative.core.rest.model.articolo.SaveArticoloRequestDTO; +import it.integry.integrywmsnative.core.rest.model.articolo.SaveArticoloResponseDTO; import it.integry.integrywmsnative.core.rest.model.articolo.SearchArticoloByBarcodeRequestDTO; import it.integry.integrywmsnative.core.rest.model.articolo.SearchArticoloByBarcodeResponseDTO; import it.integry.integrywmsnative.core.rest.model.articolo.UpdateBarcodeImballoRequestDTO; @@ -36,6 +39,41 @@ public class ArticoloRESTConsumer extends _BaseRESTConsumer { this.systemRESTConsumer = systemRESTConsumer; } + + public void retrieveAvailableUntMis(RunnableArgs> onComplete, RunnableArgs onFailed) { + ArticoloRESTConsumerService articoloRESTConsumerService = RESTBuilder.getService(ArticoloRESTConsumerService.class); + articoloRESTConsumerService + .retrieveAvailableUntMis() + .enqueue(new Callback<>() { + @Override + public void onResponse(Call> call, Response> response) { + analyzeAnswerList(response, "retrieveAvailableUntMis", onComplete, onFailed); + } + + @Override + public void onFailure(Call> call, Throwable t) { + onFailed.run(new Exception(t)); + } + }); + } + + public void retrieveAvailableGruppiMerceologici(RunnableArgs> onComplete, RunnableArgs onFailed) { + ArticoloRESTConsumerService articoloRESTConsumerService = RESTBuilder.getService(ArticoloRESTConsumerService.class); + articoloRESTConsumerService + .retrieveAvailableGruppiMerceologici() + .enqueue(new Callback<>() { + @Override + public void onResponse(Call> call, Response> response) { + analyzeAnswerList(response, "retrieveAvailableGruppiMerceologici", onComplete, onFailed); + } + + @Override + public void onFailure(Call> call, Throwable t) { + onFailed.run(new Exception(t)); + } + }); + } + public void searchByBarcode(String barcodeProd, RunnableArgs> onComplete, RunnableArgs onFailed) { ArticoloRESTConsumerService articoloRESTConsumerService = RESTBuilder.getService(ArticoloRESTConsumerService.class); @@ -205,4 +243,28 @@ public class ArticoloRESTConsumer extends _BaseRESTConsumer { } }); } + + + public void saveArticolo(ArticoloDTO articoloToSave, RunnableArgs onComplete, RunnableArgs onFailed) { + ArticoloRESTConsumerService articoloRESTConsumerService = RESTBuilder.getService(ArticoloRESTConsumerService.class); + + var request = new SaveArticoloRequestDTO() + .setArtToSave(articoloToSave); + + articoloRESTConsumerService + .saveArticolo(request) + .enqueue(new Callback<>() { + @Override + public void onResponse(Call> call, Response> response) { + analyzeAnswer(response, "saveArticolo", data -> { + onComplete.run(data.getCodMart()); + }, onFailed); + } + + @Override + public void onFailure(Call> call, Throwable t) { + onFailed.run(new Exception(t)); + } + }); + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ArticoloRESTConsumerService.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ArticoloRESTConsumerService.java index 7a4754a7..c497adc6 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ArticoloRESTConsumerService.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ArticoloRESTConsumerService.java @@ -3,9 +3,13 @@ package it.integry.integrywmsnative.core.rest.consumers; import java.util.List; import it.integry.integrywmsnative.core.model.MtbAart; +import it.integry.integrywmsnative.core.model.MtbGrup; +import it.integry.integrywmsnative.core.model.MtbUntMis; import it.integry.integrywmsnative.core.model.dto.StatoArticoloDTO; import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse; import it.integry.integrywmsnative.core.rest.model.articolo.RetrieveArticoloByCodMartRequestDTO; +import it.integry.integrywmsnative.core.rest.model.articolo.SaveArticoloRequestDTO; +import it.integry.integrywmsnative.core.rest.model.articolo.SaveArticoloResponseDTO; import it.integry.integrywmsnative.core.rest.model.articolo.SearchArticoloByBarcodeRequestDTO; import it.integry.integrywmsnative.core.rest.model.articolo.SearchArticoloByBarcodeResponseDTO; import it.integry.integrywmsnative.core.rest.model.articolo.UpdateBarcodeImballoRequestDTO; @@ -17,6 +21,13 @@ import retrofit2.http.Query; public interface ArticoloRESTConsumerService { + + @GET("wms/articolo/availableUntMis") + Call> retrieveAvailableUntMis(); + + @GET("wms/articolo/availableGruppiMerceologici") + Call> retrieveAvailableGruppiMerceologici(); + @POST("wms/articolo/searchByBarcode") Call> searchByBarcode(@Body() SearchArticoloByBarcodeRequestDTO searchArticoloByBarcodeRequest); @@ -29,4 +40,7 @@ public interface ArticoloRESTConsumerService { @GET("getProductLotStatus") Call>> getStatoPartita(@Query("codMart") String codMart, @Query("partitaMag") String partitaMag); + @POST("wms/articolo/saveArticolo") + Call> saveArticolo(@Body SaveArticoloRequestDTO saveArticoloRequest); + } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java index 4249e1fc..ab10d9d8 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java @@ -286,7 +286,7 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { public void onResponse(Call> call, Response> response) { analyzeAnswer(response, "GetBySSCC", mtbColt -> { - if (mtbColt != null && mtbColt.getMtbColr() != null && mtbColt.getMtbColr().size() > 0) { + if (mtbColt != null && mtbColt.getMtbColr() != null && !mtbColt.getMtbColr().isEmpty()) { List mtbColtList = new ArrayList<>(); mtbColtList.add(mtbColt); fillMtbAartsOfMtbColts(mtbColtList, mtbColts -> onComplete.run(mtbColts.get(0)), onFailed); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/model/articolo/ArticoloDTO.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/model/articolo/ArticoloDTO.java new file mode 100644 index 00000000..b6d8f64e --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/model/articolo/ArticoloDTO.java @@ -0,0 +1,257 @@ +package it.integry.integrywmsnative.core.rest.model.articolo; + +import java.math.BigDecimal; + +public class ArticoloDTO { + + private String codMart; + private String descrizione; + private String untMis; + private String barcode; + private BigDecimal qtaCnf; + private String codAliq; + private String articoloComposto; + private String descrizioneEstesa; + private String note; + private String posizione; + private String codMgrp; + private String codMsfa; + private String codMsgr; + private String codMstp; + private String codMtip; + private boolean flagStato; + private String barcodeImballo; + private String diacod; + private boolean flagQtaCnfFissa; + private String idArtEqui; + private boolean flagKit; + private String precode; + private String gruppo; + private String sottoGruppo; + private String sottoFamiglia; + + public String getCodMart() { + return codMart; + } + + public ArticoloDTO setCodMart(String codMart) { + this.codMart = codMart; + return this; + } + + public String getDescrizione() { + return descrizione; + } + + public ArticoloDTO setDescrizione(String descrizione) { + this.descrizione = descrizione; + return this; + } + + public String getUntMis() { + return untMis; + } + + public ArticoloDTO setUntMis(String untMis) { + this.untMis = untMis; + return this; + } + + public String getBarcode() { + return barcode; + } + + public ArticoloDTO setBarcode(String barcode) { + this.barcode = barcode; + return this; + } + + public BigDecimal getQtaCnf() { + return qtaCnf; + } + + public ArticoloDTO setQtaCnf(BigDecimal qtaCnf) { + this.qtaCnf = qtaCnf; + return this; + } + + public String getCodAliq() { + return codAliq; + } + + public ArticoloDTO setCodAliq(String codAliq) { + this.codAliq = codAliq; + return this; + } + + public String getArticoloComposto() { + return articoloComposto; + } + + public ArticoloDTO setArticoloComposto(String articoloComposto) { + this.articoloComposto = articoloComposto; + return this; + } + + public String getDescrizioneEstesa() { + return descrizioneEstesa; + } + + public ArticoloDTO setDescrizioneEstesa(String descrizioneEstesa) { + this.descrizioneEstesa = descrizioneEstesa; + return this; + } + + public String getNote() { + return note; + } + + public ArticoloDTO setNote(String note) { + this.note = note; + return this; + } + + public String getPosizione() { + return posizione; + } + + public ArticoloDTO setPosizione(String posizione) { + this.posizione = posizione; + return this; + } + + public String getCodMgrp() { + return codMgrp; + } + + public ArticoloDTO setCodMgrp(String codMgrp) { + this.codMgrp = codMgrp; + return this; + } + + public String getCodMsfa() { + return codMsfa; + } + + public ArticoloDTO setCodMsfa(String codMsfa) { + this.codMsfa = codMsfa; + return this; + } + + public String getCodMsgr() { + return codMsgr; + } + + public ArticoloDTO setCodMsgr(String codMsgr) { + this.codMsgr = codMsgr; + return this; + } + + public String getCodMstp() { + return codMstp; + } + + public ArticoloDTO setCodMstp(String codMstp) { + this.codMstp = codMstp; + return this; + } + + public String getCodMtip() { + return codMtip; + } + + public ArticoloDTO setCodMtip(String codMtip) { + this.codMtip = codMtip; + return this; + } + + public boolean isFlagStato() { + return flagStato; + } + + public ArticoloDTO setFlagStato(boolean flagStato) { + this.flagStato = flagStato; + return this; + } + + public String getBarcodeImballo() { + return barcodeImballo; + } + + public ArticoloDTO setBarcodeImballo(String barcodeImballo) { + this.barcodeImballo = barcodeImballo; + return this; + } + + public String getDiacod() { + return diacod; + } + + public ArticoloDTO setDiacod(String diacod) { + this.diacod = diacod; + return this; + } + + public boolean isFlagQtaCnfFissa() { + return flagQtaCnfFissa; + } + + public ArticoloDTO setFlagQtaCnfFissa(boolean flagQtaCnfFissa) { + this.flagQtaCnfFissa = flagQtaCnfFissa; + return this; + } + + public String getIdArtEqui() { + return idArtEqui; + } + + public ArticoloDTO setIdArtEqui(String idArtEqui) { + this.idArtEqui = idArtEqui; + return this; + } + + public boolean isFlagKit() { + return flagKit; + } + + public ArticoloDTO setFlagKit(boolean flagKit) { + this.flagKit = flagKit; + return this; + } + + public String getPrecode() { + return precode; + } + + public ArticoloDTO setPrecode(String precode) { + this.precode = precode; + return this; + } + + public String getGruppo() { + return gruppo; + } + + public ArticoloDTO setGruppo(String gruppo) { + this.gruppo = gruppo; + return this; + } + + public String getSottoGruppo() { + return sottoGruppo; + } + + public ArticoloDTO setSottoGruppo(String sottoGruppo) { + this.sottoGruppo = sottoGruppo; + return this; + } + + public String getSottoFamiglia() { + return sottoFamiglia; + } + + public ArticoloDTO setSottoFamiglia(String sottoFamiglia) { + this.sottoFamiglia = sottoFamiglia; + return this; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/model/articolo/SaveArticoloRequestDTO.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/model/articolo/SaveArticoloRequestDTO.java new file mode 100644 index 00000000..c3b3952e --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/model/articolo/SaveArticoloRequestDTO.java @@ -0,0 +1,14 @@ +package it.integry.integrywmsnative.core.rest.model.articolo; + +public class SaveArticoloRequestDTO { + private ArticoloDTO artToSave; + + public ArticoloDTO getArtToSave() { + return artToSave; + } + + public SaveArticoloRequestDTO setArtToSave(ArticoloDTO artToSave) { + this.artToSave = artToSave; + return this; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/model/articolo/SaveArticoloResponseDTO.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/model/articolo/SaveArticoloResponseDTO.java new file mode 100644 index 00000000..58196cf6 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/model/articolo/SaveArticoloResponseDTO.java @@ -0,0 +1,9 @@ +package it.integry.integrywmsnative.core.rest.model.articolo; + +public class SaveArticoloResponseDTO { + private String codMart; + + public String getCodMart() { + return codMart; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/settings/DBSettingsModel.java b/app/src/main/java/it/integry/integrywmsnative/core/settings/DBSettingsModel.java index d0e0c679..ba237dd3 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/settings/DBSettingsModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/settings/DBSettingsModel.java @@ -83,6 +83,8 @@ public class DBSettingsModel { private boolean suggestDataScad = false; private boolean flagPositionChangeRequest = false; private String docInterniRequestNumDoc; + private boolean flagEnableArtCreation; + private List allowedCodMgrpForArtCreation; public boolean isFlagSpedizioneEnableFakeGiacenza() { return flagSpedizioneEnableFakeGiacenza; @@ -705,6 +707,24 @@ public class DBSettingsModel { return this; } + public List getAllowedCodMgrpForArtCreation() { + return allowedCodMgrpForArtCreation; + } + + public DBSettingsModel setAllowedCodMgrpForArtCreation(List allowedCodMgrpForArtCreation) { + this.allowedCodMgrpForArtCreation = allowedCodMgrpForArtCreation; + return this; + } + + public boolean isFlagEnableArtCreation() { + return flagEnableArtCreation; + } + + public DBSettingsModel setFlagEnableArtCreation(boolean flagEnableArtCreation) { + this.flagEnableArtCreation = flagEnableArtCreation; + return this; + } + public boolean isFlagPositionChangeRequest() { return flagPositionChangeRequest; } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsManager.java b/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsManager.java index 6350c3da..5b59af13 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsManager.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsManager.java @@ -569,6 +569,21 @@ public class SettingsManager { .setKeySection("REQUEST_NUM_DOC") .setSetter(dbSettingsModelIstance::setDocInterniRequestNumDoc)); + stbGestSetupReaderList.add(new StbGestSetupReader<>(Boolean.class) + .setGestName("PICKING") + .setSection("SETUP") + .setKeySection("ENABLE_ART_CREATION") + .setSetter(dbSettingsModelIstance::setFlagEnableArtCreation)); + + stbGestSetupReaderList.add(new StbGestSetupReader<>(String.class) + .setGestName("PICKING") + .setSection("SETUP") + .setKeySection("ENABLE_ART_CREATION_GRP_MERC") + .setSetter(data -> { + if (data != null) + dbSettingsModelIstance.setAllowedCodMgrpForArtCreation(Arrays.asList(data.split("\\|"))); + })); + String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep(); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityBarcode.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityBarcode.java index 2d8bec0e..febdf753 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityBarcode.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityBarcode.java @@ -1,6 +1,12 @@ package it.integry.integrywmsnative.core.utility; +import android.graphics.Bitmap; +import android.graphics.Color; + import com.annimon.stream.Stream; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.common.BitMatrix; import java.util.Calendar; @@ -109,12 +115,12 @@ public class UtilityBarcode { } - public static String convertITF14toEAN13(String barcodeITF14) { + public static String convertITF14toEAN13(String barcodeITF14) throws Exception { String barcodeEAN13 = null; if (barcodeITF14.length() == 14) { barcodeEAN13 = barcodeITF14.substring(1, barcodeITF14.length() - 1).trim(); - barcodeEAN13 += getEAN13CheckDigit(barcodeEAN13); + barcodeEAN13 += calculateEAN13CheckDigit(barcodeEAN13); } return barcodeEAN13; @@ -131,18 +137,69 @@ public class UtilityBarcode { } - private static String getEAN13CheckDigit(String ean) { - - if (ean.length() != 12) { - UtilityLogger.error(new Exception("Please provide an input string of 12 chars. Current lenght: " + ean.length())); - return null; + public static boolean isValidEan13(String ean13) { + // Verifica che il codice sia lungo esattamente 13 cifre + if (ean13.length() != 13 || !ean13.matches("\\d+")) { + return false; } - long tot = 0; - for (int i = 0; i < 12; i++) { - tot = tot + (Long.parseLong(String.valueOf(ean.charAt(i))) * (i % 2 == 0 ? 1 : 3)); - } - return tot % 10 == 0 ? "0" : "" + (10 - (tot % 10)); + // Calcola il check digit dalle prime 12 cifre + int calculatedCheckDigit = calculateEAN13CheckDigit(ean13.substring(0, 12)); + int providedCheckDigit = Character.getNumericValue(ean13.charAt(12)); + + // Confronta il check digit calcolato con quello fornito + return calculatedCheckDigit == providedCheckDigit; } + private static int calculateEAN13CheckDigit(String ean12) { + int sum = 0; + for (int i = 0; i < ean12.length(); i++) { + int digit = Character.getNumericValue(ean12.charAt(i)); + sum += (i % 2 == 0) ? digit : digit * 3; + } + return (10 - (sum % 10)) % 10; + } + + public static Bitmap generateBarcodeImage(String barcode, int width, int height) throws Exception { + if(barcode == null) return null; + + BarcodeType barcodeType; + + if(barcode.length() == 8) + barcodeType = BarcodeType.EAN8; + else if(barcode.length() == 13) + barcodeType = BarcodeType.EAN13; + else if(barcode.length() == 14) + barcodeType = BarcodeType.INTERLEAVED_2OF5; + else throw new Exception("Barcode " + barcode + " non valido"); + + return generateBarcodeImage(barcode, barcodeType, width, height); + } + + public static Bitmap generateBarcodeImage(String barcode, BarcodeType type, int width, int height) throws Exception { + // Genera la matrice del codice a barre + MultiFormatWriter writer = new MultiFormatWriter(); + + BarcodeFormat barcodeFormat = switch (type) { + case EAN8 -> BarcodeFormat.EAN_8; + case EAN13 -> BarcodeFormat.EAN_13; + case INTERLEAVED_2OF5 -> BarcodeFormat.ITF; + case CODE128 -> BarcodeFormat.CODE_128; + default -> throw new Exception("Barcode " + barcode + " non valido (tipo: " + type + ")"); + }; + + BitMatrix bitMatrix = writer.encode(barcode, barcodeFormat, width, height); + + // Crea un bitmap a partire dalla matrice + Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + bitmap.setPixel(x, y, bitMatrix.get(x, y) ? Color.BLACK : Color.WHITE); + } + } + + return bitmap; + } + + } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityObservable.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityObservable.java index 6861738f..f16c98c4 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityObservable.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityObservable.java @@ -1,9 +1,16 @@ package it.integry.integrywmsnative.core.utility; import androidx.databinding.Observable; +import androidx.databinding.ObservableArrayList; import androidx.databinding.ObservableField; +import androidx.databinding.ObservableList; +import java.util.stream.Collectors; + +import it.integry.integrywmsnative.core.expansion.OnGeneralChangedCallback; +import it.integry.integrywmsnative.core.expansion.OnListGeneralChangedCallback; import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.expansion.RunnableArgsWithReturn; public class UtilityObservable { @@ -16,4 +23,36 @@ public class UtilityObservable { }); } + public static ObservableField convertObservable(ObservableField observableField, RunnableArgsWithReturn dataConverter) { + ObservableField returnObservable = new ObservableField<>(); + + observableField.addOnPropertyChangedCallback(new OnGeneralChangedCallback() { + @Override + public void run() { + returnObservable.set(dataConverter.run(observableField.get())); + } + }); + + returnObservable.set(dataConverter.run(observableField.get())); + + return returnObservable; + } + + public static ObservableArrayList convertObservableArrayList(ObservableArrayList observableField, RunnableArgsWithReturn dataConverter) { + ObservableArrayList returnObservable = new ObservableArrayList<>(); + + observableField.addOnListChangedCallback(new OnListGeneralChangedCallback() { + @Override + public void onChanged(ObservableList sender) { + + returnObservable.clear(); + returnObservable.addAll(sender.stream().map(dataConverter::run).collect(Collectors.toUnmodifiableList())); + } + }); + + returnObservable.addAll(observableField.stream().map(dataConverter::run).collect(Collectors.toUnmodifiableList())); + + return returnObservable; + } + } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeViewModel.java index 737f80ad..832d6547 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeViewModel.java @@ -195,6 +195,9 @@ public class ProdRecuperoMaterialeViewModel { mtbColtScarico.getMtbColr().add(mtbColrScarico); } } else { + + + BigDecimal qtaColToSave; BigDecimal numCnfToSave; if (SettingsManager.iDB().isFlagForceAllToColli() || (item.getMtbAart() != null && !item.getMtbAart().isFlagQtaCnfFissaBoolean())) { diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditActivity.java index f01b9cef..e14a5f8f 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditActivity.java @@ -97,7 +97,7 @@ public class PVOrdineAcquistoEditActivity extends BaseActivity implements PVOrdi } String testataOrdString = String.format(this.getString(R.string.ord_acq_testata), ordine.getOrdineId(), UtilityDate.formatDate(ordine.getDataIns(), UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN)); mBinding.orderIdentifier.setText(Html.fromHtml(testataOrdString)); - FabMenuCustomAnimations.changeIconOnFocus(mBinding.closeActivityFab, R.drawable.ic_check_white_24dp, R.drawable.ic_close_24dp); + FabMenuCustomAnimations.changeIconOnFocus(mBinding.closeActivityFab, R.drawable.ic_round_check_24, R.drawable.ic_close_24dp); initBarcodeReader(); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeFragment.java index 27dfbdca..51f1c221 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeFragment.java @@ -15,8 +15,6 @@ import android.view.inputmethod.EditorInfo; import androidx.annotation.NonNull; import androidx.appcompat.widget.AppCompatTextView; import androidx.core.content.ContextCompat; -import androidx.core.content.res.ResourcesCompat; -import androidx.databinding.DataBindingUtil; import androidx.databinding.ObservableField; import androidx.recyclerview.widget.LinearLayoutManager; @@ -63,6 +61,7 @@ import it.integry.integrywmsnative.view.dialogs.DialogConsts; import it.integry.integrywmsnative.view.dialogs.ask_position_of_lu.DialogAskPositionOfLUView; import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; import it.integry.integrywmsnative.view.dialogs.choose_art_from_lista_arts.DialogChooseArtFromListaArtsView; +import it.integry.integrywmsnative.view.dialogs.create_new_art.DialogCreateNewArtView; import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2DTO; import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2View; import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCreateLUView; @@ -142,7 +141,7 @@ public class RettificaGiacenzeFragment extends BaseFragment implements ITitledFr Bundle savedInstanceState) { setRetainInstance(true); - mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_main_rettifica_giacenze, container, false); + mBinding = FragmentMainRettificaGiacenzeBinding.inflate(inflater, container, false); mBinding.setLifecycleOwner(this); @@ -205,15 +204,18 @@ public class RettificaGiacenzeFragment extends BaseFragment implements ITitledFr private void init() { mBinding.autoCompleteFornitori.setOnFocusChangeListener((v, hasFocus) -> { - setUIToForn(); + if (hasFocus) + setUIToForn(); }); mBinding.inputCodArtDescrForn.setOnFocusChangeListener((v, hasFocus) -> { - setUIToForn(); + if (hasFocus) + setUIToForn(); }); mBinding.inputCodArtDescrInt.setOnFocusChangeListener((v, hasFocus) -> { - setUIToIntArt(); + if (hasFocus) + setUIToIntArt(); }); mViewModel.init( @@ -238,23 +240,30 @@ public class RettificaGiacenzeFragment extends BaseFragment implements ITitledFr public void setUIToForn() { mBinding.rettificaGiacenzeFornCheckBox.setChecked(true); - mBinding.rettificaGiacenzeFornLayout.setBackground(ResourcesCompat.getDrawable(getActivity().getResources(), R.drawable.circular_background_left, null)); mBinding.rettificaGiacenzeFornLayout.setBackgroundTintList(ColorStateList.valueOf(getActivity().getResources().getColor(R.color.alpha_blue_500))); mBinding.rettificaGiacenzeArtIntCheckBox.setChecked(false); - mBinding.rettificaGiacenzeArtIntLayout.setBackground(null); mBinding.rettificaGiacenzeArtIntLayout.setBackgroundTintList(null); + + mBinding.inputCodArtDescrInt.clearFocus(); + + if (!mBinding.inputCodArtDescrForn.hasFocus() && !mBinding.autoCompleteFornitori.hasFocus()) { + mBinding.inputCodArtDescrForn.clearFocus(); + mBinding.autoCompleteFornitori.requestFocusFromTouch(); + } } public void setUIToIntArt() { mBinding.rettificaGiacenzeArtIntCheckBox.setChecked(true); - mBinding.rettificaGiacenzeArtIntLayout.setBackground(ResourcesCompat.getDrawable(getActivity().getResources(), R.drawable.circular_background_left, null)); mBinding.rettificaGiacenzeArtIntLayout.setBackgroundTintList(ColorStateList.valueOf(getActivity().getResources().getColor(R.color.alpha_blue_500))); mBinding.rettificaGiacenzeFornCheckBox.setChecked(false); - mBinding.rettificaGiacenzeFornLayout.setBackground(null); mBinding.rettificaGiacenzeFornLayout.setBackgroundTintList(null); + + mBinding.inputCodArtDescrForn.clearFocus(); + mBinding.autoCompleteFornitori.clearFocus(); + mBinding.inputCodArtDescrInt.requestFocusFromTouch(); } @Override @@ -295,13 +304,22 @@ public class RettificaGiacenzeFragment extends BaseFragment implements ITitledFr return true; } - mViewModel.searchArtInt(mBinding.inputCodArtDescrInt.getText().toString(), null); + mViewModel.searchArtInt(mBinding.inputCodArtDescrInt.getText().toString(), null, null); return true; } return false; }); } + @Override + public void onRequestNewArtCreation(String description, BarcodeScanDTO barcode) { + DialogCreateNewArtView.newInstance(description, barcode, currentMtbColtObs.get().getPosizione(), + createdCodMart -> { + mViewModel.searchArtInt(createdCodMart, null, null); + }) + .show(requireActivity().getSupportFragmentManager(), "tag"); + } + @Override public void onArtListLoaded(ArrayList artList, RunnableArgs onArtChoosed) { new DialogChooseArtFromListaArtsView(true, artList, onArtChoosed) @@ -418,10 +436,11 @@ public class RettificaGiacenzeFragment extends BaseFragment implements ITitledFr onComplete.run(pickedQuantityDTO, shouldCloseLU); }) .show(requireActivity().getSupportFragmentManager(), "tag"); - }, () -> {}); + }, () -> { + }); } - private void checkIfItemIsActive(String flagStato, String codMart, Runnable onContinue, Runnable onNegativeClick){ + private void checkIfItemIsActive(String flagStato, String codMart, Runnable onContinue, Runnable onNegativeClick) { if (flagStato.equalsIgnoreCase("I")) { DialogSimpleMessageView.makeWarningDialog( new SpannableString(Html.fromHtml(String.format(UtilityResources.getString(R.string.item_not_enabled), codMart))), diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeViewModel.java index 3f2a77b6..c8cbea23 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeViewModel.java @@ -111,7 +111,10 @@ public class RettificaGiacenzeViewModel { public void processBarcodeDTO(BarcodeScanDTO barcodeScanDTO, Runnable onComplete) { - if (UtilityBarcode.isEtichetta128(barcodeScanDTO)) { + if(UtilityBarcode.isEtichettaPosizione(barcodeScanDTO)) { + //Not implemented now + onComplete.run(); + } else if (UtilityBarcode.isEtichetta128(barcodeScanDTO)) { //Cerco tramite etichetta ean 128 (che può indicarmi un articolo o una UL) this.executeEtichettaEan128(barcodeScanDTO, onComplete); @@ -120,7 +123,7 @@ public class RettificaGiacenzeViewModel { this.executeEtichettaEanPeso(barcodeScanDTO, onComplete); } else if (UtilityBarcode.isEtichettaArt(barcodeScanDTO)) { - this.searchArtInt(barcodeScanDTO.getStringValue(), onComplete); + this.searchArtInt(null, barcodeScanDTO, onComplete); } else { onComplete.run(); @@ -145,9 +148,9 @@ public class RettificaGiacenzeViewModel { if (!UtilityString.isNullOrEmpty(barcodeProd)) { PickDataDTO pickDataDTO = PickDataDTO.fromEan128(ean128Model); - this.loadArticolo(barcodeProd, pickDataDTO, onComplete); + this.loadArticolo(barcodeProd, pickDataDTO, barcodeScanDTO, onComplete); } else if (!UtilityString.isNullOrEmpty(codMart)) { - this.searchArtInt(codMart, onComplete); + this.searchArtInt(codMart, barcodeScanDTO, onComplete); } else { //EAN 128 non completo o comunque mancano i riferimenti al prodotto onComplete.run(); @@ -158,18 +161,18 @@ public class RettificaGiacenzeViewModel { private void executeEtichettaEanPeso(BarcodeScanDTO barcodeScanDTO, Runnable onComplete) { try { Ean13PesoModel ean13PesoModel = Ean13PesoModel.fromBarcode(barcodeScanDTO.getStringValue()); - this.loadArticolo(ean13PesoModel.getPrecode(), PickDataDTO.fromEan128(ean13PesoModel.toEan128()), onComplete); + this.loadArticolo(ean13PesoModel.getPrecode(), PickDataDTO.fromEan128(ean13PesoModel.toEan128()), barcodeScanDTO, onComplete); } catch (Exception ex) { this.sendError(ex); } } - private void loadArticolo(String barcodeProd, PickDataDTO pickData, Runnable onComplete) { + private void loadArticolo(String barcodeProd, PickDataDTO pickData, BarcodeScanDTO barcodeScanDTO, Runnable onComplete) { this.mArticoloRESTConsumer.searchByBarcode(barcodeProd, mtbAartList -> { if (onComplete != null) onComplete.run(); if (mtbAartList != null && !mtbAartList.isEmpty()) { - this.dispatchArts(mtbAartList, pickData); + this.dispatchArts(mtbAartList, pickData, null, barcodeScanDTO); } else { this.sendError(new NoResultFromBarcodeException(barcodeProd)); } @@ -190,25 +193,28 @@ public class RettificaGiacenzeViewModel { .map(x -> (MtbAart) x.getMtbAart()) .toList(); - dispatchArts(mtbAarts, null); + dispatchArts(mtbAarts, null, queryText, null); }, this::sendError); } - public void searchArtInt(String queryText, Runnable onComplete) { + public void searchArtInt(String queryText, BarcodeScanDTO barcodeScanDTO, Runnable onComplete) { this.sendOnLoadingStarted(); - mRettificaGiacenzeRESTConsumer.searchArtInt(queryText, listaArts -> { + mRettificaGiacenzeRESTConsumer.searchArtInt(UtilityString.isNull(queryText, barcodeScanDTO.getStringValue()), listaArts -> { this.sendOnLoadingEnded(); - dispatchArts(listaArts, null); + dispatchArts(listaArts, null, queryText, barcodeScanDTO); if (onComplete != null) onComplete.run(); }, this::sendError); } - private void dispatchArts(List artsList, PickDataDTO pickData) { - if (artsList == null || artsList.size() == 0) { - this.sendError(new NoArtsFoundException()); + private void dispatchArts(List artsList, PickDataDTO pickData, String description, BarcodeScanDTO barcodeProd) { + if (artsList == null || artsList.isEmpty()) { + if(SettingsManager.iDB().isFlagEnableArtCreation()) + this.sendRequestNewArtCreation(description, barcodeProd); + else + this.sendError(new NoArtsFoundException()); return; } @@ -556,8 +562,6 @@ public class RettificaGiacenzeViewModel { private void saveEditedRow(MtbColr mtbColrToUpdate, BigDecimal numCnf, BigDecimal qtaCnf, BigDecimal qtaTot, String partitaMag, LocalDate dataScad, boolean shouldCloseLU) { this.sendOnLoadingStarted(); -// if(!mIsCreatedLU && mCurrentMtbColt.isDocumentPresent()) { - this.mColliMagazzinoRESTConsumer.creaRettificaCollo( mtbColrToUpdate, numCnf, @@ -579,47 +583,6 @@ public class RettificaGiacenzeViewModel { }, this::sendError ); - -// } else { -// -// MtbColt mtbColt = new MtbColt() -// .setNumCollo(mtbColrToUpdate.getNumCollo()) -// .setDataCollo(mtbColrToUpdate.getDataColloS()) -// .setSerCollo(mtbColrToUpdate.getSerCollo()) -// .setGestione(mtbColrToUpdate.getGestione()) -// .setMtbColr(new ObservableArrayList<>()); -// mtbColt.setOperation(CommonModelConsts.OPERATION.NO_OP); -// -// final MtbColr mtbColr = (MtbColr) mtbColrToUpdate.clone(); -// mtbColr -// .setNumCnf(numCnf.subtract(mtbColr.getNumCnf())) -// .setQtaCnf(qtaCnf) -// .setQtaCol(qtaTot.subtract(mtbColr.getQtaCol())) -// .setPartitaMag(partitaMag) -// .setDataScadPartita(dataScad) -// .setUtente(SettingsManager.i().getUser().getFullname()) -// .setCausale(MtbColr.Causale.RETTIFICA) -// .setDatetimeRow(UtilityDate.getDateInstance()) -// .setOperation(CommonModelConsts.OPERATION.INSERT); -// -// mtbColt.getMtbColr().add(mtbColr); -// -// this.mColliMagazzinoRESTConsumer.saveCollo(mtbColt, (value) -> { -// -// mtbColr.setNumCnf(numCnf) -// .setQtaCnf(qtaCnf) -// .setQtaCol(qtaTot); -// -// this.mCurrentMtbColt.getMtbColr().remove(mtbColrToUpdate); -// this.mCurrentMtbColt.getMtbColr().add(mtbColr); -// -// this.mAnyEditDone = true; -// -// this.sendOnRowSaved(); -// this.sendOnLoadingEnded(); -// -// }, this::sendError); -// } } public void deleteRow(MtbColr mtbColrToDelete) { @@ -627,7 +590,6 @@ public class RettificaGiacenzeViewModel { if (shouldDelete) { this.sendOnLoadingStarted(); -// if(!mIsCreatedLU && mCurrentMtbColt.isDocumentPresent()) { this.mColliMagazzinoRESTConsumer.creaRettificaCollo( mtbColrToDelete, BigDecimal.ZERO, @@ -639,37 +601,6 @@ public class RettificaGiacenzeViewModel { }, this::sendError ); -// } else { -// MtbColt mtbColt = new MtbColt() -// .setNumCollo(mtbColrToDelete.getNumCollo()) -// .setDataCollo(mtbColrToDelete.getDataColloS()) -// .setSerCollo(mtbColrToDelete.getSerCollo()) -// .setGestione(mtbColrToDelete.getGestione()) -// .setMtbColr(new ObservableArrayList<>()); -// mtbColt.setOperation(CommonModelConsts.OPERATION.NO_OP); -// -// MtbColr mtbColr = (MtbColr) mtbColrToDelete.clone(); -// mtbColr -// .setNumCnf(mtbColr.getNumCnf().multiply(new BigDecimal(-1))) -// .setQtaCnf(mtbColr.getQtaCnf()) -// .setQtaCol(mtbColr.getQtaCol().multiply(new BigDecimal(-1))) -// .setPartitaMag(mtbColr.getPartitaMag()) -// .setDataScadPartita(mtbColr.getDataScadPartitaD()) -// .setUtente(SettingsManager.i().getUser().getFullname()) -// .setCausale(MtbColr.Causale.RETTIFICA) -// .setDatetimeRow(UtilityDate.getDateInstance()) -// .setOperation(CommonModelConsts.OPERATION.INSERT); -// -// mtbColt.getMtbColr().add(mtbColr); -// -// this.mColliMagazzinoRESTConsumer.saveCollo(mtbColt, (value) -> { -// this.mCurrentMtbColt.getMtbColr().remove(mtbColrToDelete); -// -// this.sendOnRowSaved(); -// this.sendOnLoadingEnded(); -// -// }, this::sendError); -// } } }); } @@ -686,6 +617,10 @@ public class RettificaGiacenzeViewModel { if (this.mListener != null) mListener.onFornitoriLoaded(fornitoriList); } + private void sendRequestNewArtCreation(String description, BarcodeScanDTO barcode) { + if(this.mListener != null) mListener.onRequestNewArtCreation(description, barcode); + } + private void sendOnArtListLoaded(ArrayList artList, RunnableArgs onArtChoosed) { if (this.mListener != null) mListener.onArtListLoaded(artList, onArtChoosed); @@ -777,6 +712,8 @@ public class RettificaGiacenzeViewModel { void onFornitoriLoaded(ArrayList fornitoriList); + void onRequestNewArtCreation(String description, BarcodeScanDTO barcode); + void onArtListLoaded(ArrayList artList, RunnableArgs onArtChoosed); void onLUOpenRequest(boolean enableCreation, boolean checkIfDocumentExists, boolean warnOnOpeningVendita, RunnableArgss onComplete); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/dialog/DialogUltimeConsegneFiltroAvanzato.java b/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/dialog/DialogUltimeConsegneFiltroAvanzato.java index 21907134..b072fe8f 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/dialog/DialogUltimeConsegneFiltroAvanzato.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ultime_consegne_cliente/dialog/DialogUltimeConsegneFiltroAvanzato.java @@ -104,7 +104,8 @@ public class DialogUltimeConsegneFiltroAvanzato { private void initView(DialogUltimeConsegneFiltroAvanzatoBinding bindings, DialogUltimeConsegneFiltroAvanzatoViewModel viewModel) { - arrayAdapterRagSoc = new SimpleAutoCompleteDropdownAdapter(mContext, R.layout.dialog_vendita_filtro_avanzato__single_item, getAvailableRagSocs(false)); + arrayAdapterRagSoc = new SimpleAutoCompleteDropdownAdapter<>(mContext, R.layout.dialog_vendita_filtro_avanzato__single_item, getAvailableRagSocs(false)); + arrayAdapterRagSoc.addAll(); bindings.filledExposedDropdownRagSoc.setAdapter(arrayAdapterRagSoc); bindings.filledExposedDropdownDataDoc.setOnClickListener(view -> { diff --git a/app/src/main/java/it/integry/integrywmsnative/ui/adapter/SimpleAutoCompleteDropdownAdapter.java b/app/src/main/java/it/integry/integrywmsnative/ui/adapter/SimpleAutoCompleteDropdownAdapter.java index f2e665d4..d3d62fd0 100644 --- a/app/src/main/java/it/integry/integrywmsnative/ui/adapter/SimpleAutoCompleteDropdownAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/ui/adapter/SimpleAutoCompleteDropdownAdapter.java @@ -1,105 +1,116 @@ package it.integry.integrywmsnative.ui.adapter; import android.content.Context; +import android.view.LayoutInflater; import android.widget.ArrayAdapter; import android.widget.Filter; import androidx.annotation.NonNull; +import androidx.databinding.ObservableArrayList; +import androidx.databinding.ObservableList; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -public class SimpleAutoCompleteDropdownAdapter extends ArrayAdapter { +public class SimpleAutoCompleteDropdownAdapter extends ArrayAdapter { - private List mObjects; + private final ObservableArrayList objects; + private final LayoutInflater mInflater; + private int mDropDownResource; - public SimpleAutoCompleteDropdownAdapter(@NonNull Context context, int resource) { - super(context, resource); + public SimpleAutoCompleteDropdownAdapter(@NonNull Context context, int resource, @NonNull List objects) { + this(context, resource, new ObservableArrayList<>()); + this.objects.addAll(objects); } - public SimpleAutoCompleteDropdownAdapter(@NonNull Context context, int resource, int textViewResourceId) { - super(context, resource, textViewResourceId); + public SimpleAutoCompleteDropdownAdapter(@NonNull Context context, int resource, @NonNull ObservableArrayList objects) { + super(context, resource, new ArrayList<>(objects)); + mInflater = LayoutInflater.from(context); + mDropDownResource = resource; + this.objects = objects; + + // Listener per aggiornare l'adapter quando la lista cambia + this.objects.addOnListChangedCallback(new ObservableList.OnListChangedCallback>() { + @Override + public void onChanged(ObservableList sender) { + updateAdapter(); + } + + @Override + public void onItemRangeChanged(ObservableList sender, int positionStart, int itemCount) { + updateAdapter(); + } + + @Override + public void onItemRangeInserted(ObservableList sender, int positionStart, int itemCount) { + updateAdapter(); + } + + @Override + public void onItemRangeMoved(ObservableList sender, int fromPosition, int toPosition, int itemCount) { + updateAdapter(); + } + + @Override + public void onItemRangeRemoved(ObservableList sender, int positionStart, int itemCount) { + updateAdapter(); + } + }); } - public SimpleAutoCompleteDropdownAdapter(@NonNull Context context, int resource, @NonNull Object[] objects) { - super(context, resource, objects); - mObjects = Arrays.asList(objects); + private void updateAdapter() { + clear(); + addAll(objects); + notifyDataSetChanged(); } - public SimpleAutoCompleteDropdownAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull Object[] objects) { - super(context, resource, textViewResourceId, objects); - mObjects = Arrays.asList(objects); - } - - public SimpleAutoCompleteDropdownAdapter(@NonNull Context context, int resource, @NonNull List objects) { - super(context, resource, objects); - mObjects = objects; - } - - public SimpleAutoCompleteDropdownAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull List objects) { - super(context, resource, textViewResourceId, objects); - mObjects = objects; - } - - @NonNull @Override public Filter getFilter() { - return new StringFilter(mObjects); + return new StringFilter(objects); } + private class StringFilter extends Filter { - - - private class StringFilter extends Filter { - - private ArrayList sourceObjects; + private final List sourceObjects; public StringFilter(List objects) { - if(objects == null) return; - sourceObjects = new ArrayList(); - synchronized (this) { - sourceObjects.addAll(objects); - } + this.sourceObjects = objects; } @Override protected FilterResults performFiltering(CharSequence chars) { - String filterSeq = chars.toString().toLowerCase(); + String filterSeq = chars == null ? "" : chars.toString().toLowerCase(); FilterResults result = new FilterResults(); - if (filterSeq != null && filterSeq.length() > 0) { - ArrayList filter = new ArrayList(); - for (T object : sourceObjects) { - // the filtering itself: - if (object.toString().toLowerCase().contains(filterSeq)) - filter.add(object); - } - result.count = filter.size(); - result.values = filter; + if (filterSeq.isEmpty()) { + result.values = new ArrayList<>(sourceObjects); + result.count = sourceObjects.size(); } else { - // add all objects - synchronized (this) { - result.values = sourceObjects; - result.count = sourceObjects.size(); + ArrayList filtered = new ArrayList<>(); + for (T object : sourceObjects) { + String stringObject = object.toString(); + + if (stringObject.toLowerCase().contains(filterSeq)) { + filtered.add(object); + } } + result.values = filtered; + result.count = filtered.size(); } return result; } @SuppressWarnings("unchecked") @Override - protected void publishResults(CharSequence constraint, - FilterResults results) { - // NOTE: this function is *always* called from the UI thread. - if(constraint != null && constraint.length() > 2) { - ArrayList filtered = (ArrayList) results.values; - notifyDataSetChanged(); - clear(); - for (int i = 0, l = filtered.size(); i < l; i++) - add(filtered.get(i)); - notifyDataSetInvalidated(); + protected void publishResults(CharSequence constraint, FilterResults results) { + List filtered = (List) results.values; + if (filtered != null) { + synchronized (this) { + clear(); + addAll(filtered); + notifyDataSetChanged(); + } } } } diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/create_new_art/DialogCreateNewArtComponent.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/create_new_art/DialogCreateNewArtComponent.java new file mode 100644 index 00000000..2cc6abe0 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/create_new_art/DialogCreateNewArtComponent.java @@ -0,0 +1,14 @@ +package it.integry.integrywmsnative.view.dialogs.create_new_art; + +import dagger.Subcomponent; + +@Subcomponent +public interface DialogCreateNewArtComponent { + + @Subcomponent.Factory + interface Factory { + DialogCreateNewArtComponent create(); + } + + void inject(DialogCreateNewArtView dialogCreateNewArtView); +} \ No newline at end of file diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/create_new_art/DialogCreateNewArtModule.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/create_new_art/DialogCreateNewArtModule.java new file mode 100644 index 00000000..cdc5dfe6 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/create_new_art/DialogCreateNewArtModule.java @@ -0,0 +1,15 @@ +package it.integry.integrywmsnative.view.dialogs.create_new_art; + +import dagger.Module; +import dagger.Provides; +import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer; + +@Module(subcomponents = DialogCreateNewArtComponent.class) +public class DialogCreateNewArtModule { + + @Provides + DialogCreateNewArtViewModel providesDialogCreateNewArtViewModel(ArticoloRESTConsumer articoloRESTConsumer) { + return new DialogCreateNewArtViewModel(articoloRESTConsumer); + } + +} \ No newline at end of file diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/create_new_art/DialogCreateNewArtView.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/create_new_art/DialogCreateNewArtView.java new file mode 100644 index 00000000..24e5b708 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/create_new_art/DialogCreateNewArtView.java @@ -0,0 +1,302 @@ +package it.integry.integrywmsnative.view.dialogs.create_new_art; + +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.Bitmap; +import android.os.Bundle; +import android.text.InputFilter; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.databinding.ObservableField; +import androidx.databinding.ObservableList; + +import javax.inject.Inject; + +import it.integry.barcode_base_android_library.model.BarcodeScanDTO; +import it.integry.integrywmsnative.MainApplication; +import it.integry.integrywmsnative.R; +import it.integry.integrywmsnative.core.barcode_reader.BarcodeCallbackDTO; +import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager; +import it.integry.integrywmsnative.core.di.BindableBoolean; +import it.integry.integrywmsnative.core.expansion.BaseDialogFragment; +import it.integry.integrywmsnative.core.expansion.OnGeneralChangedCallback; +import it.integry.integrywmsnative.core.expansion.OnListGeneralChangedCallback; +import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.model.MtbDepoPosizione; +import it.integry.integrywmsnative.core.model.MtbGrup; +import it.integry.integrywmsnative.core.model.MtbSfam; +import it.integry.integrywmsnative.core.model.MtbSgrp; +import it.integry.integrywmsnative.core.model.MtbUntMis; +import it.integry.integrywmsnative.core.utility.UtilityBarcode; +import it.integry.integrywmsnative.core.utility.UtilityObservable; +import it.integry.integrywmsnative.core.utility.UtilityString; +import it.integry.integrywmsnative.databinding.DialogCreateNewArtBinding; +import it.integry.integrywmsnative.ui.adapter.SimpleAutoCompleteDropdownAdapter; + +public class DialogCreateNewArtView extends BaseDialogFragment implements DialogCreateNewArtViewModel.Listener { + + public final ObservableField selectedUntMisText = new ObservableField<>(); + public final ObservableField selectedMtbGrupText = new ObservableField<>(); + public final ObservableField selectedMtbSubGrupText = new ObservableField<>(); + public final ObservableField selectedMtbSubSubGrupText = new ObservableField<>(); + public final ObservableField selectedPosizioneText = new ObservableField<>(); + public final BindableBoolean editingBarcode = new BindableBoolean(false); + + @Inject + DialogCreateNewArtViewModel mViewModel; + + private DialogCreateNewArtBinding mBindings; + private Context mContext; + + public final BarcodeScanDTO mScannedBarcode; + private int mBarcodeScannerIstanceID; + + private final String initialPosizione; + private final RunnableArgs onArticleCreated; + + //Pass here all external parameters + public static DialogCreateNewArtView newInstance() { + return newInstance(null, null, null); + } + + //Pass here all external parameters + public static DialogCreateNewArtView newInstance(String description, BarcodeScanDTO barcode, String posizione) { + return new DialogCreateNewArtView(description, barcode, posizione, null); + } + + public static DialogCreateNewArtView newInstance(String description, BarcodeScanDTO barcode, String posizione, RunnableArgs onArticleCreated) { + return new DialogCreateNewArtView(description, barcode, posizione, onArticleCreated); + } + + private DialogCreateNewArtView(String description, BarcodeScanDTO barcode, String posizione, RunnableArgs onArticleCreated) { + super(); + this.mScannedBarcode = barcode; + this.onArticleCreated = onArticleCreated; + this.initialPosizione = posizione; + + MainApplication.appComponent + .dialogCreateNewArtComponent() + .create() + .inject(this); + + mViewModel.setListener(this); + if (description != null) mViewModel.descrizione.set(description.toUpperCase()); + } + + @Override + public int getTheme() { + return R.style.AppTheme_NewMaterial_Dialog_FullscreenDialog; + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + this.mContext = requireContext(); + + mBindings = DialogCreateNewArtBinding.inflate(LayoutInflater.from(this.mContext), null, false); + mBindings.setLifecycleOwner(this); + mBindings.setViewmodel(mViewModel); + mBindings.setView(this); + mBindings.toolbar.setTitle("Nuovo articolo"); + + this.initBarcodeReader(); + this.initObservable(); + this.initBarcodes(); + + mBindings.inputDescrizioneText.setFilters(new InputFilter.AllCaps[]{ + new InputFilter.AllCaps() + }); + + SimpleAutoCompleteDropdownAdapter arrayAdapterPosizioni = new SimpleAutoCompleteDropdownAdapter<>(mContext, + android.R.layout.simple_dropdown_item_1line, + UtilityObservable.convertObservableArrayList(mViewModel.retrieveAvailablePosizioni(), MtbDepoPosizione::getPosizione)); + mBindings.inputDefaultPosText.setAdapter(arrayAdapterPosizioni); + mViewModel.retrieveAvailablePosizioni().addOnListChangedCallback(new OnListGeneralChangedCallback() { + @Override + public void onChanged(ObservableList sender) { + if(!UtilityString.isNullOrEmpty(initialPosizione)) { + selectedPosizioneText.set(initialPosizione); + } else if(sender.size() == 1) { + selectedPosizioneText.set(sender.get(0).getPosizione()); + } + } + }); + + SimpleAutoCompleteDropdownAdapter arrayAdapterUntMis = new SimpleAutoCompleteDropdownAdapter<>(mContext, + android.R.layout.simple_dropdown_item_1line, + UtilityObservable.convertObservableArrayList(mViewModel.retrieveAvailableUntMis(), MtbUntMis::getUntMis)); + mBindings.filledUntMisText.setAdapter(arrayAdapterUntMis); + mViewModel.retrieveAvailableUntMis().addOnListChangedCallback(new OnListGeneralChangedCallback() { + @Override + public void onChanged(ObservableList sender) { + if(sender.size() == 1) { + selectedUntMisText.set(sender.get(0).getUntMis()); + } else if(sender.stream().anyMatch(x -> x.getUntMis().equalsIgnoreCase("PZ"))) { + MtbUntMis pzUntMis = sender.stream().filter(x -> x.getUntMis().equalsIgnoreCase("PZ")).findFirst().get(); + selectedUntMisText.set(pzUntMis.getUntMis()); + } + } + }); + + SimpleAutoCompleteDropdownAdapter arrayAdapterGruppoArt = new SimpleAutoCompleteDropdownAdapter<>(mContext, + android.R.layout.simple_dropdown_item_1line, + UtilityObservable.convertObservableArrayList(mViewModel.retrieveAvailableArtGroups(), x -> String.format("%s - %s", x.getCodMgrp(), x.getDescrizione()))); + mBindings.filledGruppoText.setAdapter(arrayAdapterGruppoArt); + mViewModel.retrieveAvailableArtGroups().addOnListChangedCallback(new OnListGeneralChangedCallback() { + @Override + public void onChanged(ObservableList sender) { + if(sender.size() == 1) { + selectedMtbGrupText.set(String.format("%s - %s", sender.get(0).getCodMgrp(), sender.get(0).getDescrizione())); + } + } + }); + + SimpleAutoCompleteDropdownAdapter arrayAdapterSottoGruppoArt = new SimpleAutoCompleteDropdownAdapter<>(mContext, + android.R.layout.simple_dropdown_item_1line, + UtilityObservable.convertObservableArrayList(mViewModel.retrieveAvailableArtSubGroups(), x -> String.format("%s - %s", x.getCodMsgr(), x.getDescrizione()))); + mBindings.filledSottoGruppoText.setAdapter(arrayAdapterSottoGruppoArt); + mViewModel.retrieveAvailableArtSubGroups().addOnListChangedCallback(new OnListGeneralChangedCallback() { + @Override + public void onChanged(ObservableList sender) { + if(sender.size() == 1) { + selectedMtbSubGrupText.set(String.format("%s - %s", sender.get(0).getCodMsgr(), sender.get(0).getDescrizione())); + } + } + }); + + SimpleAutoCompleteDropdownAdapter arrayAdapterSottoSottoGruppoArt = new SimpleAutoCompleteDropdownAdapter<>(mContext, + android.R.layout.simple_dropdown_item_1line, + UtilityObservable.convertObservableArrayList(mViewModel.retrieveAvailableArtSubSubGroups(), x -> String.format("%s - %s", x.getCodMsfa(), x.getDescrizione()))); + mBindings.filledSottoSottoGruppoText.setAdapter(arrayAdapterSottoSottoGruppoArt); + mViewModel.retrieveAvailableArtSubSubGroups().addOnListChangedCallback(new OnListGeneralChangedCallback() { + @Override + public void onChanged(ObservableList sender) { + if(sender.size() == 1) { + selectedMtbSubSubGrupText.set(String.format("%s - %s", sender.get(0).getCodMsfa(), sender.get(0).getDescrizione())); + } + } + }); + + mViewModel.init(); + + return mBindings.getRoot(); + } + + private void initBarcodeReader() { + mBarcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO() + .setOnScanSuccessful(data -> { + requireActivity().runOnUiThread(() -> { + + if (UtilityBarcode.isEtichettaPosizione(data)) { + selectedPosizioneText.set(data.getStringValue()); + } else if (editingBarcode.get()) { + mViewModel.barcodeProdotto.set(data.getStringValue()); + saveBarcode(); + } + }); + }) + .setOnScanFailed(this::onError)); + } + + @Override + public void onDismiss(@NonNull DialogInterface dialog) { + super.onDismiss(dialog); + BarcodeManager.removeCallback(mBarcodeScannerIstanceID); + } + + private void initObservable() { + this.selectedUntMisText.addOnPropertyChangedCallback(new OnGeneralChangedCallback() { + @Override + public void run() { + mViewModel.selectedUntMis.set(mViewModel.retrieveAvailableUntMis().stream() + .filter(x -> x.getUntMis().equals(selectedUntMisText.get())) + .findFirst().orElse(null)); + } + }); + + + + this.selectedMtbGrupText.addOnPropertyChangedCallback(new OnGeneralChangedCallback() { + @Override + public void run() { + mViewModel.selectedMtbGrup.set(mViewModel.retrieveAvailableArtGroups().stream() + .filter(x -> String.format("%s - %s", x.getCodMgrp(), x.getDescrizione()).equals(selectedMtbGrupText.get())) + .findFirst().orElse(null)); + + selectedMtbSubGrupText.set(null); + } + }); + + + + this.selectedMtbSubGrupText.addOnPropertyChangedCallback(new OnGeneralChangedCallback() { + @Override + public void run() { + mViewModel.selectedMtbSubGrup.set(mViewModel.retrieveAvailableArtSubGroups().stream() + .filter(x -> String.format("%s - %s", x.getCodMsgr(), x.getDescrizione()).equals(selectedMtbSubGrupText.get())) + .findFirst().orElse(null)); + + selectedMtbSubSubGrupText.set(null); + } + }); + + + this.selectedMtbSubSubGrupText.addOnPropertyChangedCallback(new OnGeneralChangedCallback() { + @Override + public void run() { + mViewModel.selectedMtbSubSubGrup.set(mViewModel.retrieveAvailableArtSubSubGroups().stream() + .filter(x -> String.format("%s - %s", x.getCodMsfa(), x.getDescrizione()).equals(selectedMtbSubSubGrupText.get())) + .findFirst().orElse(null)); + } + }); + + + + + this.selectedPosizioneText.addOnPropertyChangedCallback(new OnGeneralChangedCallback() { + @Override + public void run() { + mViewModel.selectedPosizioneDefault.set(mViewModel.retrieveAvailablePosizioni().stream() + .filter(x -> x.getPosizione().equals(selectedPosizioneText.get())) + .findFirst().orElse(null)); + } + }); + } + + + private void initBarcodes() { + if (mScannedBarcode != null) { + mViewModel.barcodeProdotto.set(mScannedBarcode.getStringValue()); + try { + generateBarcodeBitmap(); + } catch (Exception e) { + onError(e); + } + } + } + + public void saveBarcode() { + try { + generateBarcodeBitmap(); + editingBarcode.toggle(); + } catch (Exception e) { + onError(e); + } + } + + private void generateBarcodeBitmap() throws Exception { + Bitmap barcodeBitmap = UtilityBarcode.generateBarcodeImage(mViewModel.barcodeProdotto.get(), 500, 170); + mBindings.barcodeProdottoImage.setImageBitmap(barcodeBitmap); + } + + @Override + public void onSaved(String codMart) { + this.dismiss(); + + if (this.onArticleCreated != null) this.onArticleCreated.run(codMart); + } +} \ No newline at end of file diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/create_new_art/DialogCreateNewArtViewModel.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/create_new_art/DialogCreateNewArtViewModel.java new file mode 100644 index 00000000..1b0a2ace --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/create_new_art/DialogCreateNewArtViewModel.java @@ -0,0 +1,209 @@ +package it.integry.integrywmsnative.view.dialogs.create_new_art; + +import androidx.databinding.ObservableArrayList; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import it.integry.integrywmsnative.core.di.ValidatableObservableField; +import it.integry.integrywmsnative.core.di.validators.GreaterThenValidator; +import it.integry.integrywmsnative.core.di.validators.NotEmptyValidator; +import it.integry.integrywmsnative.core.di.validators.NotNullValidator; +import it.integry.integrywmsnative.core.expansion.OnGeneralChangedCallback; +import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingListener; +import it.integry.integrywmsnative.core.model.MtbDepoPosizione; +import it.integry.integrywmsnative.core.model.MtbGrup; +import it.integry.integrywmsnative.core.model.MtbSfam; +import it.integry.integrywmsnative.core.model.MtbSgrp; +import it.integry.integrywmsnative.core.model.MtbUntMis; +import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer; +import it.integry.integrywmsnative.core.rest.model.articolo.ArticoloDTO; +import it.integry.integrywmsnative.core.settings.SettingsManager; +import it.integry.integrywmsnative.core.utility.UtilityString; + +public class DialogCreateNewArtViewModel { + + + private Listener mListener; + + private final ArticoloRESTConsumer articoloRESTConsumer; + + private final ObservableArrayList availableUntMis = new ObservableArrayList<>(); + private final ObservableArrayList availableMtbGroups = new ObservableArrayList<>(); + private final ObservableArrayList availableMtbSubGroups = new ObservableArrayList<>(); + private final ObservableArrayList availableMtbSubSubGroups = new ObservableArrayList<>(); + + private final ObservableArrayList availablePosizioni = new ObservableArrayList<>(); + + public ValidatableObservableField descrizione = new ValidatableObservableField<>() {{ + addValidator(new NotEmptyValidator("La descrizione non può essere vuota")); + }}; + + public final ValidatableObservableField noteAggiuntive = new ValidatableObservableField<>(); + public final ValidatableObservableField qtaCnf = new ValidatableObservableField<>(BigDecimal.ONE) {{ + addValidator(new NotNullValidator<>("La qta x cnf deve essere > 0")); + addValidator(new GreaterThenValidator(BigDecimal.ZERO, "La qta x cnf deve essere > 0")); + }}; + + public final ValidatableObservableField barcodeProdotto = new ValidatableObservableField<>(); + public final ValidatableObservableField qtaCnfFissa = new ValidatableObservableField<>(true); + + public ValidatableObservableField selectedUntMis = new ValidatableObservableField<>(null) {{ + addValidator(new NotNullValidator<>("Seleziona un'unità di misura")); + }}; + public ValidatableObservableField selectedMtbGrup = new ValidatableObservableField<>(null) {{ + addValidator(new NotNullValidator<>("Seleziona un gruppo")); + }}; + public ValidatableObservableField selectedMtbSubGrup = new ValidatableObservableField<>(null) {{ + addValidator(new NotNullValidator<>("Seleziona un sotto gruppo")); + }}; + public ValidatableObservableField selectedMtbSubSubGrup = new ValidatableObservableField<>(null) {{ + addValidator(new NotNullValidator<>("Seleziona un sotto-sotto gruppo")); + }}; + + public ValidatableObservableField selectedPosizioneDefault = new ValidatableObservableField<>(null) {{ + addValidator(new NotNullValidator<>("Seleziona una posizione")); + }}; + + + public DialogCreateNewArtViewModel(ArticoloRESTConsumer articoloRESTConsumer) { + this.articoloRESTConsumer = articoloRESTConsumer; + } + + public void init() { + this.sendOnLoadingStarted(); + + this.availablePosizioni.addAll(SettingsManager.iDB().getAvailablePosizioni()); + + this.articoloRESTConsumer.retrieveAvailableUntMis(untMisList -> { + this.availableUntMis.addAll(untMisList); + + this.articoloRESTConsumer.retrieveAvailableGruppiMerceologici(mtbGrupList -> { + + List allowedCodMgrpForArtCreation = SettingsManager.iDB().getAllowedCodMgrpForArtCreation(); + + if(allowedCodMgrpForArtCreation != null && !allowedCodMgrpForArtCreation.isEmpty()) { + mtbGrupList = mtbGrupList.stream() + .filter(x -> allowedCodMgrpForArtCreation.contains(x.getCodMgrp())) + .collect(Collectors.toUnmodifiableList()); + } + + if(mtbGrupList.size() == 1) + this.selectedMtbGrup.set(mtbGrupList.get(0)); + + this.availableMtbGroups.addAll(mtbGrupList); + + this.sendOnLoadingEnded(); + }, this::sendError); + }, this::sendError); + + this.selectedMtbGrup.addOnPropertyChangedCallback(new OnGeneralChangedCallback() { + @Override + public void run() { + availableMtbSubGroups.clear(); + + if (selectedMtbGrup != null && selectedMtbGrup.get() != null) + availableMtbSubGroups.addAll(Objects.requireNonNull(selectedMtbGrup.get()).getMtbSgrp()); + } + }); + + this.selectedMtbSubGrup.addOnPropertyChangedCallback(new OnGeneralChangedCallback() { + @Override + public void run() { + availableMtbSubSubGroups.clear(); + + if (selectedMtbSubGrup != null && selectedMtbSubGrup.get() != null) + availableMtbSubSubGroups.addAll(Objects.requireNonNull(selectedMtbSubGrup.get()).getMtbSfam()); + } + }); + + } + + public ObservableArrayList retrieveAvailablePosizioni() { + return availablePosizioni; + } + + public ObservableArrayList retrieveAvailableUntMis() { + return availableUntMis; + } + + public ObservableArrayList retrieveAvailableArtGroups() { + return availableMtbGroups; + } + + public ObservableArrayList retrieveAvailableArtSubGroups() { + return availableMtbSubGroups; + } + + public ObservableArrayList retrieveAvailableArtSubSubGroups() { + return availableMtbSubSubGroups; + } + + + public void save() { + if (descrizione.validate() & + noteAggiuntive.validate() & + selectedMtbGrup.validate() & + selectedMtbSubGrup.validate() & + selectedMtbSubSubGrup.validate() & + selectedUntMis.validate() & + qtaCnf.validate() & + qtaCnfFissa.validate() & + selectedPosizioneDefault.validate() & + barcodeProdotto.validate() + ) { + ArticoloDTO articoloToSave = new ArticoloDTO() + .setDescrizione(descrizione.get()) + .setDescrizioneEstesa(descrizione.get()) + .setNote(UtilityString.empty2null(noteAggiuntive.get())) + .setCodMgrp(selectedMtbGrup.get().getCodMgrp()) + .setCodMsgr(selectedMtbSubGrup.get().getCodMsgr()) + .setCodMsfa(selectedMtbSubSubGrup.get().getCodMsfa()) + .setUntMis(selectedUntMis.get().getUntMis()) + .setFlagQtaCnfFissa(qtaCnfFissa.get().booleanValue()) + .setQtaCnf(qtaCnf.get()) + .setPosizione(selectedPosizioneDefault.get().getPosizione()) + .setBarcode(UtilityString.empty2null(barcodeProdotto.get())) + .setFlagStato(true); + + this.sendOnLoadingStarted(); + articoloRESTConsumer.saveArticolo(articoloToSave, codMart -> { + this.sendOnLoadingEnded(); + this.sendOnSaved(codMart); + }, this::sendError); + } + } + + + private void sendOnLoadingStarted() { + if (this.mListener != null) mListener.onLoadingStarted(); + } + + private void sendOnLoadingEnded() { + if (this.mListener != null) mListener.onLoadingEnded(); + } + + private void sendError(Exception ex) { + if (this.mListener != null) mListener.onError(ex); + } + + private void sendOnSaved(String codMart) { + if (this.mListener != null) mListener.onSaved(codMart); + } + + public void setListener(Listener listener) { + this.mListener = listener; + } + + + interface Listener extends ILoadingListener { + + void onSaved(String codMart); + + void onError(Exception ex); + + } + +} \ No newline at end of file diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2View.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2View.java index ba92bce0..119cbaf9 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2View.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2View.java @@ -188,7 +188,7 @@ public class DialogInputQuantityV2View extends BaseDialogFragment implements Dia this.initProductLotStatusNotification(); } - MtbUntMis mtbUntMis = mDialogInputQuantityV2DTO.getMtbAart().getMtbUntMis() != null && mDialogInputQuantityV2DTO.getMtbAart().getMtbUntMis().size() > 0 ? mDialogInputQuantityV2DTO.getMtbAart().getMtbUntMis().get(0) : null; + MtbUntMis mtbUntMis = mDialogInputQuantityV2DTO.getMtbAart().getMtbUntMis() != null && !mDialogInputQuantityV2DTO.getMtbAart().getMtbUntMis().isEmpty() ? mDialogInputQuantityV2DTO.getMtbAart().getMtbUntMis().get(0) : null; if (!(mtbUntMis != null && mtbUntMis.isFlagDig())) { mBindings.inputQtaTotText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); } @@ -231,7 +231,7 @@ public class DialogInputQuantityV2View extends BaseDialogFragment implements Dia this.mBindings.inputDataScadLayout.setEndIconTintList(ColorStateList.valueOf(ContextCompat.getColor(requireContext(), com.tfb.fbtoast.R.color.error_color))); } case NON_IN_SCADENZA -> { - this.mBindings.inputDataScadLayout.setEndIconDrawable(R.drawable.ic_check_white_24dp); + this.mBindings.inputDataScadLayout.setEndIconDrawable(R.drawable.ic_round_check_24); this.mBindings.inputDataScadLayout.setEndIconTintList(ColorStateList.valueOf(ContextCompat.getColor(requireContext(), com.tfb.fbtoast.R.color.success_color))); } } @@ -295,6 +295,8 @@ public class DialogInputQuantityV2View extends BaseDialogFragment implements Dia int onNumCnfInputChanged = SettingsManager.iDB().getOnNumCnfInputChanged(); int onQtaTotInputChanged = SettingsManager.iDB().getOnQtaTotInputChanged(); + onNumCnfInputChanged = onNumCnfInputChanged == 0 && mViewModel.getMtbAart().isFlagQtaCnfFissaBoolean() ? 2 : onNumCnfInputChanged; + this.mViewModel.setListener(this); this.mViewModel.init(onNumCnfInputChanged, onQtaTotInputChanged); } diff --git a/app/src/main/res/drawable/ic_check_black_24dp.xml b/app/src/main/res/drawable/ic_check_black_24dp.xml deleted file mode 100644 index 3c728c59..00000000 --- a/app/src/main/res/drawable/ic_check_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_check_white_24dp.xml b/app/src/main/res/drawable/ic_check_white_24dp.xml deleted file mode 100644 index 6541ee3e..00000000 --- a/app/src/main/res/drawable/ic_check_white_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_round_check_24.xml b/app/src/main/res/drawable/ic_round_check_24.xml new file mode 100644 index 00000000..e202540c --- /dev/null +++ b/app/src/main/res/drawable/ic_round_check_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout-land-hdpi/dialog_input_lu_prod.xml b/app/src/main/res/layout-land-hdpi/dialog_input_lu_prod.xml index d78b5cda..05a513ca 100644 --- a/app/src/main/res/layout-land-hdpi/dialog_input_lu_prod.xml +++ b/app/src/main/res/layout-land-hdpi/dialog_input_lu_prod.xml @@ -177,7 +177,7 @@ - - - - - - - - -