From 653cd3fd75af39b9f838f4bcb1d137eb00843256 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Mon, 9 Dec 2024 19:18:03 +0100 Subject: [PATCH] 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 @@ - - - - - - - - -