diff --git a/.idea/appInsightsSettings.xml b/.idea/appInsightsSettings.xml
index 6bbe2aee..e9268407 100644
--- a/.idea/appInsightsSettings.xml
+++ b/.idea/appInsightsSettings.xml
@@ -2,5 +2,26 @@
+
\ No newline at end of file
diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdBindings.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdBindings.java
new file mode 100644
index 00000000..79e263dd
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdBindings.java
@@ -0,0 +1,19 @@
+package it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod;
+
+import java.util.HashMap;
+
+import it.integry.integrywmsnative.gest.accettazione_ordini_picking.filters.FilterPosizioneLayoutView;
+import it.integry.integrywmsnative.ui.filter_chips.FilterChipDTO;
+
+public class ProdRiposizionamentoDaProdBindings {
+ public static final int POSITIONS_FILTER_ID = 0;
+
+ public static final HashMap AVAILABLE_FILTERS = new HashMap<>() {{
+
+ put(POSITIONS_FILTER_ID, new FilterChipDTO()
+ .setID(POSITIONS_FILTER_ID)
+ .setFilterChipText("Posizione")
+ .setFilterLayoutView(new FilterPosizioneLayoutView()));
+
+ }};
+}
diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdFragment.java
index afb42d5f..46861a07 100644
--- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdFragment.java
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdFragment.java
@@ -3,7 +3,6 @@ package it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
-import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -12,10 +11,10 @@ import androidx.appcompat.widget.AppCompatTextView;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ObservableArrayList;
+import com.annimon.stream.Stream;
import com.ravikoradiya.liveadapter.LiveAdapter;
import com.ravikoradiya.liveadapter.Type;
-import java.lang.reflect.Constructor;
import java.util.List;
import java.util.Objects;
@@ -28,6 +27,7 @@ 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.expansion.BaseFragment;
+import it.integry.integrywmsnative.core.expansion.OnGeneralChangedCallback;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.interfaces.ITitledFragment;
import it.integry.integrywmsnative.core.model.MtbColt;
@@ -36,14 +36,15 @@ import it.integry.integrywmsnative.core.model.MvwSitArtUdcDetInventario;
import it.integry.integrywmsnative.core.utility.UtilityExceptions;
import it.integry.integrywmsnative.databinding.FragmentProdRiposizionamentoDaProdBinding;
import it.integry.integrywmsnative.databinding.ProdRiposizionamentoDaProdListItemBinding;
+import it.integry.integrywmsnative.gest.accettazione_ordini_picking.filters.FilterPosizioneLayoutView;
import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dialogs.info_giacenza.DialogInfoGiacenzaView;
import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dto.ArtsInGiacenzaDTO;
-import it.integry.integrywmsnative.view.dialogs.DialogAskLivelloPosizione;
+import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.filter.ProdRiposizionamentoDaProdFilterViewModel;
+import it.integry.integrywmsnative.ui.filter_chips.FilterChipDTO;
+import it.integry.integrywmsnative.ui.filter_chips.FilterChipView;
+import it.integry.integrywmsnative.ui.filter_chips.filters.FilterNumeroOrdineLayoutView;
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.info_aggiuntive_lu.DialogInfoAggiuntiveLUView;
-import okhttp3.internal.http2.Header;
public class ProdRiposizionamentoDaProdFragment extends BaseFragment implements ITitledFragment, ProdRiposizionamentoDaProdViewModel.Listener {
@@ -52,11 +53,10 @@ public class ProdRiposizionamentoDaProdFragment extends BaseFragment implements
private FragmentProdRiposizionamentoDaProdBinding mBindings;
private final ObservableArrayList mItemsInventario = new ObservableArrayList<>();
-
+ private ProdRiposizionamentoDaProdFilterViewModel mFilterViewModel = new ProdRiposizionamentoDaProdFilterViewModel();
private final Handler mHandler = new Handler();
private final int mInterval = 120 * 1000; //2 minuti
private int barcodeScannerIstanceID = -1;
- private MtbColt scanedMtbColt;
public ProdRiposizionamentoDaProdFragment() {
@@ -94,18 +94,37 @@ public class ProdRiposizionamentoDaProdFragment extends BaseFragment implements
});
mHandler.postDelayed(mRunnable, mInterval);
- this.initBarcodeReader();
+ this.initBarcodeReader();
this.initRecyclerView();
+ this.initFilters();
+
return mBindings.getRoot();
}
+ public void refreshList(List filteredList) {
+ List tmpList;
+
+ if (filteredList != null) {
+ tmpList = filteredList;
+ } else if (mFilterViewModel != null) {
+ mFilterViewModel.applyAllTests();
+ tmpList = mFilterViewModel.getCurrentList().getValue();
+ } else {
+ tmpList = mViewModel.getItemsInventario().getValue();
+ }
+ this.mItemsInventario.clear();
+ if (tmpList != null) {
+ this.mItemsInventario.addAll(tmpList);
+ }
+ }
+
private void initRecyclerView() {
mViewModel.getItemsInventario().observe(getViewLifecycleOwner(), data -> {
mBindings.emptyView.setVisibility(data == null || data.isEmpty() ? View.VISIBLE : View.GONE);
- this.mItemsInventario.clear();
- this.mItemsInventario.addAll(data);
+ mFilterViewModel.init(mViewModel.getItemsInventario().getValue());
+ this.refreshList(null);
});
var itemType = new Type(R.layout.prod_riposizionamento_da_prod__list_item, BR.item);
@@ -120,6 +139,76 @@ public class ProdRiposizionamentoDaProdFragment extends BaseFragment implements
.into(this.mBindings.inventarioList);
}
+ private void initFilters() {
+ var onPredicateChanged = new OnGeneralChangedCallback() {
+ @Override
+ public void run() {
+ refreshList(null);
+ }
+ };
+
+ mFilterViewModel.getCurrentPositionPredicate().addOnPropertyChangedCallback(onPredicateChanged);
+
+ for (var filterChipDTO : ProdRiposizionamentoDaProdBindings.AVAILABLE_FILTERS.entrySet()) {
+
+ FilterChipView filterChipView = new FilterChipView(
+ requireActivity(),
+ filterChipDTO.getValue().getFilterChipText(),
+ v -> initBottomSheetDialogFilter(filterChipDTO.getValue()));
+
+ if (filterChipDTO.getKey() == ProdRiposizionamentoDaProdBindings.POSITIONS_FILTER_ID) {
+ mFilterViewModel.getCurrentPositionPredicate().addOnPropertyChangedCallback(new OnGeneralChangedCallback() {
+ @Override
+ public void run() {
+ if (mFilterViewModel.getCurrentPositionPredicate().get() == null) {
+ filterChipView.disableCloseIcon();
+
+ mBindings.filterChipsGroup.removeView(filterChipView);
+ mBindings.filterChipsGroup.addView(filterChipView);
+ mBindings.filterChips.smoothScrollTo(0, 0);
+ } else {
+ filterChipView.enableCloseIcon();
+
+ mBindings.filterChipsGroup.removeView(filterChipView);
+ mBindings.filterChipsGroup.addView(filterChipView, 0);
+ mBindings.filterChips.smoothScrollTo(0, 0);
+ }
+ }
+ });
+ filterChipView.setOnResetClicked(() -> mFilterViewModel.getCurrentPositionPredicate().set(null));
+ }
+ this.mBindings.filterChipsGroup.addView(filterChipView);
+ }
+ }
+
+ private void initBottomSheetDialogFilter(FilterChipDTO filterChipDTO) {
+ filterChipDTO
+ .getFilterLayoutView()
+ .setFilterName(filterChipDTO.getFilterChipText())
+ .setContext(requireActivity());
+
+ var filterLayoutView = filterChipDTO
+ .getFilterLayoutView();
+
+ if (filterChipDTO.getID() == ProdRiposizionamentoDaProdBindings.POSITIONS_FILTER_ID) {
+ ((FilterPosizioneLayoutView) filterLayoutView)
+ .setAll(mFilterViewModel.getAllPosition())
+ .setAvailable(mFilterViewModel.getAvailablePosition())
+ .setOnFilterApplied(mFilterViewModel::setPositionFilter)
+ .setPreselected(
+ Stream.of(Objects.requireNonNull(mViewModel.getItemsInventario().getValue()))
+ .filter(mFilterViewModel.getCurrentPositionPredicate().get() == null ?
+ x -> false : Objects.requireNonNull(mFilterViewModel.getCurrentPositionPredicate().get()))
+ .map(ArtsInGiacenzaDTO::getPosizione)
+ .toList()
+ );
+ }
+
+ if (!filterLayoutView.isAdded())
+ filterLayoutView.show(requireActivity().getSupportFragmentManager(), "TAG");
+
+ }
+
public void onInfoClick(List item) {
try {
DialogInfoGiacenzaView.newInstance(item).show(getChildFragmentManager(), DialogInfoGiacenzaView.class.getName());
diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdViewModel.java
index b47c533b..299f904e 100644
--- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdViewModel.java
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdViewModel.java
@@ -1,13 +1,11 @@
package it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod;
-import androidx.databinding.ObservableArrayList;
import androidx.lifecycle.MutableLiveData;
import com.annimon.stream.Optional;
import com.annimon.stream.Stream;
import java.math.BigDecimal;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
@@ -16,30 +14,19 @@ import java.util.Objects;
import java.util.stream.Collectors;
import it.integry.barcode_base_android_library.model.BarcodeScanDTO;
-import it.integry.integrywmsnative.core.exception.AlreadyAttachedDocumentToLUException;
-import it.integry.integrywmsnative.core.exception.InvalidCodMdepException;
-import it.integry.integrywmsnative.core.exception.InvalidLUGestioneException;
-import it.integry.integrywmsnative.core.exception.NoArtsInLUException;
import it.integry.integrywmsnative.core.exception.NoLUFoundException;
import it.integry.integrywmsnative.core.exception.ScannedPositionNotExistException;
-import it.integry.integrywmsnative.core.exception.TooManyLUFoundInMonoLUPositionException;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingListener;
-import it.integry.integrywmsnative.core.model.MtbColr;
import it.integry.integrywmsnative.core.model.MtbColt;
import it.integry.integrywmsnative.core.model.MtbDepoPosizione;
import it.integry.integrywmsnative.core.model.MvwSitArtUdcDetInventario;
-import it.integry.integrywmsnative.core.model.secondary.GestioneEnum;
import it.integry.integrywmsnative.core.rest.consumers.BarcodeRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.GiacenzaRESTConsumer;
-import it.integry.integrywmsnative.core.rest.consumers.MagazzinoAutomaticoRESTConsumer;
-import it.integry.integrywmsnative.core.rest.consumers.PosizioniRESTConsumer;
-import it.integry.integrywmsnative.core.rest.model.magazzino_automatico.MagazzinoAutomaticoPutItemsRequestDTO;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityBarcode;
import it.integry.integrywmsnative.core.utility.UtilityDate;
-import it.integry.integrywmsnative.core.utility.UtilityPosizione;
import it.integry.integrywmsnative.core.utility.UtilityString;
import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dto.ArtsInGiacenzaDTO;
@@ -162,8 +149,8 @@ public class ProdRiposizionamentoDaProdViewModel {
.map(entry -> {
List dtoList = entry.getValue();
- BigDecimal totalQtaCnf = dtoList.stream()
- .map(MvwSitArtUdcDetInventario::getQtaCnf)
+ BigDecimal totalNumCnf = dtoList.stream()
+ .map(MvwSitArtUdcDetInventario::getNumCnf)
.reduce(BigDecimal.ZERO, BigDecimal::add);
return new ArtsInGiacenzaDTO()
@@ -171,7 +158,8 @@ public class ProdRiposizionamentoDaProdViewModel {
.setPartitaMag(dtoList.get(0).getPartitaMag())
.setPosizione(dtoList.get(0).getPosizione())
.setDescrizione(dtoList.get(0).getDescrizioneEstesa())
- .setQtaCnf(totalQtaCnf)
+ .setNumOrd(dtoList.get(0).getNumOrd())
+ .setNumCnf(totalNumCnf)
.setCount(dtoList.size())
.setMvwSitArtUdcDetInventarioDTO(dtoList);
})
diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dto/ArtsInGiacenzaDTO.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dto/ArtsInGiacenzaDTO.java
index 49bd52c8..11ea91a8 100644
--- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dto/ArtsInGiacenzaDTO.java
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dto/ArtsInGiacenzaDTO.java
@@ -11,7 +11,7 @@ public class ArtsInGiacenzaDTO {
private String partitaMag;
private String descrizione;
private String posizione;
- private BigDecimal qtaCnf;
+ private BigDecimal numCnf;
private Integer numOrd;
private Integer count;
private List mvwSitArtUdcDetInventarioDTO;
@@ -43,12 +43,12 @@ public class ArtsInGiacenzaDTO {
return this;
}
- public BigDecimal getQtaCnf() {
- return qtaCnf;
+ public BigDecimal getNumCnf() {
+ return numCnf;
}
- public ArtsInGiacenzaDTO setQtaCnf(BigDecimal qtaCnf) {
- this.qtaCnf = qtaCnf;
+ public ArtsInGiacenzaDTO setNumCnf(BigDecimal numCnf) {
+ this.numCnf = numCnf;
return this;
}
diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/filter/ProdRiposizionamentoDaProdFilterViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/filter/ProdRiposizionamentoDaProdFilterViewModel.java
new file mode 100644
index 00000000..4ca0aae4
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/filter/ProdRiposizionamentoDaProdFilterViewModel.java
@@ -0,0 +1,73 @@
+package it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.filter;
+
+import androidx.databinding.ObservableField;
+import androidx.lifecycle.MutableLiveData;
+
+import com.annimon.stream.Stream;
+import com.annimon.stream.function.Predicate;
+
+import java.util.List;
+import java.util.Objects;
+
+import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dto.ArtsInGiacenzaDTO;
+
+public class ProdRiposizionamentoDaProdFilterViewModel {
+ private final ObservableField> currentPositionPredicate = new ObservableField<>();
+
+ private List initialList;
+ private final MutableLiveData> currentList = new MutableLiveData<>();
+
+ public void init(List initialList){
+ this.initialList = initialList;
+ this.currentList.setValue(this.initialList);
+ }
+
+ public MutableLiveData> getCurrentList() {
+ return currentList;
+ }
+
+ public void setPositionFilter(List positions){
+ if (positions == null || positions.isEmpty()) currentPositionPredicate.set(null);
+ else{
+ currentPositionPredicate.set(x -> positions.contains(x.getPosizione()));
+ }
+ }
+
+ public void applyAllTests(){
+ List returnList = null;
+
+ if (currentPositionPredicate.get() == null){
+ returnList = this.initialList;
+ }else {
+ Stream tmpStream = Stream.of(this.initialList)
+ .filter(x -> (currentPositionPredicate.get() == null || (Objects.requireNonNull(currentPositionPredicate.get()).test(x))));
+ returnList = tmpStream.toList();
+ }
+
+ this.currentList.setValue(returnList);
+ }
+
+ public ObservableField> getCurrentPositionPredicate() {
+ return currentPositionPredicate;
+ }
+
+ public List getAllPosition(){
+ return Stream
+ .of(initialList)
+ .filter(x -> x.getPosizione() != null)
+ .sortBy(ArtsInGiacenzaDTO::getPosizione)
+ .map(ArtsInGiacenzaDTO::getPosizione)
+ .distinct()
+ .toList();
+ }
+
+ public List getAvailablePosition(){
+ if (currentPositionPredicate.get() == null) return getAllPosition();
+ else {
+ return Stream.of(this.initialList)
+ .map(ArtsInGiacenzaDTO::getPosizione)
+ .distinct()
+ .toList();
+ }
+ }
+}
diff --git a/app/src/main/res/layout/prod_riposizionamento_da_prod__list_item.xml b/app/src/main/res/layout/prod_riposizionamento_da_prod__list_item.xml
index 6e0d3a70..228eb750 100644
--- a/app/src/main/res/layout/prod_riposizionamento_da_prod__list_item.xml
+++ b/app/src/main/res/layout/prod_riposizionamento_da_prod__list_item.xml
@@ -15,6 +15,10 @@
+
+
+
+
@@ -93,35 +97,91 @@
android:textStyle="bold"
tools:text="PartitaMag" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+ android:paddingLeft="6dp"
+ android:paddingTop="2dp"
+ android:paddingRight="6dp"
+ android:paddingBottom="2dp"
+ style="@style/AppTheme.NewMaterial.Layout.Badge">
+
+
+
+
+
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index d707ae7f..356a54fb 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -68,15 +68,17 @@
- @drawable/material_text_color
- 18sp
-
+