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 - +