From c25b2e6cb5008629845e00d945703199f35bfc74 Mon Sep 17 00:00:00 2001 From: MarcoE Date: Wed, 13 Mar 2024 11:08:55 +0100 Subject: [PATCH] Aggiunto filtro per per gruppo merceologico in approvvigionamento linee --- .../ProdFabbisognoLineeProdBindings.java | 8 + .../ProdFabbisognoLineeProdFragment.java | 157 ++++++++++++++---- ...rodFabbisognoLineeProdFilterViewModel.java | 93 +++++++++-- .../dto/OrdineLavorazioneDTO.java | 36 ++++ 4 files changed, 254 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_fabbisogno_linee_prod/ProdFabbisognoLineeProdBindings.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_fabbisogno_linee_prod/ProdFabbisognoLineeProdBindings.java index 02834f8c..d7c70c43 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_fabbisogno_linee_prod/ProdFabbisognoLineeProdBindings.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_fabbisogno_linee_prod/ProdFabbisognoLineeProdBindings.java @@ -2,19 +2,27 @@ package it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod; import java.util.HashMap; +import it.integry.integrywmsnative.gest.ordini_uscita_elenco.filters.FilterGruppoMercLayoutView; import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.filters.FilterCommessaLayoutView; import it.integry.integrywmsnative.ui.filter_chips.FilterChipDTO; import it.integry.integrywmsnative.ui.filter_chips.filters.FilterNumeroOrdineLayoutView; public class ProdFabbisognoLineeProdBindings { public static final int NUM_ORD_FILTER_ID = 0; + public static final int MGRP_FILTER_ID = 1; public static final HashMap AVAILABLE_FILTERS = new HashMap<>() {{ put(NUM_ORD_FILTER_ID, new FilterChipDTO() .setID(NUM_ORD_FILTER_ID) + .setPosizione(0) .setFilterChipText("Numero ordine") .setFilterLayoutView(new FilterNumeroOrdineLayoutView())); + put(MGRP_FILTER_ID, new FilterChipDTO() + .setID(MGRP_FILTER_ID) + .setPosizione(1) + .setFilterChipText("Gruppo merceologico") + .setFilterLayoutView(new FilterGruppoMercLayoutView())); }}; } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_fabbisogno_linee_prod/ProdFabbisognoLineeProdFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_fabbisogno_linee_prod/ProdFabbisognoLineeProdFragment.java index 6126fe36..f5609670 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_fabbisogno_linee_prod/ProdFabbisognoLineeProdFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_fabbisogno_linee_prod/ProdFabbisognoLineeProdFragment.java @@ -22,6 +22,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; +import java.util.Map; import java.util.Objects; import javax.inject.Inject; @@ -33,8 +34,13 @@ import it.integry.integrywmsnative.core.di.BindableBoolean; import it.integry.integrywmsnative.core.expansion.BaseFragment; import it.integry.integrywmsnative.core.expansion.OnGeneralChangedCallback; import it.integry.integrywmsnative.core.interfaces.ITitledFragment; +import it.integry.integrywmsnative.core.model.JtbComt; import it.integry.integrywmsnative.core.model.MtbColr; +import it.integry.integrywmsnative.core.model.MtbGrup; import it.integry.integrywmsnative.core.model.secondary.GestioneEnum; +import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer; +import it.integry.integrywmsnative.core.rest.consumers.CommessaRESTConsumer; +import it.integry.integrywmsnative.core.rest.model.OrdineUscitaInevasoDTO; import it.integry.integrywmsnative.core.rest.model.SitArtOrdDTO; import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.UtilityBigDecimal; @@ -44,6 +50,7 @@ import it.integry.integrywmsnative.databinding.FragmentProdFabbisognoLineeListSi import it.integry.integrywmsnative.databinding.FragmentProdFabbisognoLineeProdBinding; import it.integry.integrywmsnative.databinding.FragmentProdFabbisognoLineeTitleItemBinding; import it.integry.integrywmsnative.gest.accettazione_ordini_elenco.dto.OrdineAccettazioneInevasoDTO; +import it.integry.integrywmsnative.gest.ordini_uscita_elenco.filters.FilterGruppoMercLayoutView; import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ui.MainListProdOrdineProduzioneElencoClienteListModel; import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ui.MainListProdOrdineProduzioneElencoListModel; import it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod.dto.GroupTitleModel; @@ -68,11 +75,17 @@ public class ProdFabbisognoLineeProdFragment extends BaseFragment implements ITi @Inject ProdFabbisognoLineeProdViewModel mViewModel; + @Inject + ArticoloRESTConsumer mArticoloRESTConsumer; + @Inject + CommessaRESTConsumer mCommessaRESTConsumer; private final ArrayList mOnPreDestroyList = new ArrayList<>(); private final ObservableArrayList mProdFabbisognoItemModel = new ObservableArrayList<>(); private FragmentProdFabbisognoLineeProdBinding mBindings; private ProdFabbisognoLineeProdFilterViewModel mFilterViewModel = new ProdFabbisognoLineeProdFilterViewModel(); + private List mtbGrupCache; + private List jtbComtCache; public ProdFabbisognoLineeProdFragment() { // Required empty public constructor @@ -120,6 +133,11 @@ public class ProdFabbisognoLineeProdFragment extends BaseFragment implements ITi mViewModel.getOrdiniList().observe(getViewLifecycleOwner(), data -> { mBindings.emptyView.setVisibility(data == null || data.isEmpty() ? View.VISIBLE : View.GONE); + this.onLoadingStarted(); + this.initMtbGrupsCache(() -> { + this.initJtbComtCache(this::onLoadingEnded); + }); + mFilterViewModel.init(mViewModel.getOrdiniList().getValue()); this.refreshList(null); }); @@ -211,34 +229,67 @@ public class ProdFabbisognoLineeProdFragment extends BaseFragment implements ITi }; mFilterViewModel.getCurrentNumOrdsPredicate().addOnPropertyChangedCallback(onPredicateChanged); + mFilterViewModel.getCurrentGruppoMercPredicate().addOnPropertyChangedCallback(onPredicateChanged); - for (var filterChipDTO : ProdFabbisognoLineeProdBindings.AVAILABLE_FILTERS.entrySet()) { + List filterList = Stream.of(ProdFabbisognoLineeProdBindings.AVAILABLE_FILTERS.entrySet()) + .map(Map.Entry::getValue) + .sortBy(FilterChipDTO::getPosizione) + .toList(); + + for (FilterChipDTO filterChipDTO : filterList) { FilterChipView filterChipView = new FilterChipView( requireActivity(), - filterChipDTO.getValue().getFilterChipText(), - v -> initBottomSheetDialogFilter(filterChipDTO.getValue())); + filterChipDTO.getFilterChipText(), + v -> initBottomSheetDialogFilter(filterChipDTO)); - if (filterChipDTO.getKey() == ProdFabbisognoLineeProdBindings.NUM_ORD_FILTER_ID) { - mFilterViewModel.getCurrentNumOrdsPredicate().addOnPropertyChangedCallback(new OnGeneralChangedCallback() { - @Override - public void run() { - if (mFilterViewModel.getCurrentNumOrdsPredicate().get() == null) { - filterChipView.disableCloseIcon(); + switch (filterChipDTO.getID()){ + case ProdFabbisognoLineeProdBindings.NUM_ORD_FILTER_ID -> { + mFilterViewModel.getCurrentNumOrdsPredicate().addOnPropertyChangedCallback(new OnGeneralChangedCallback() { + @Override + public void run() { + if (mFilterViewModel.getCurrentNumOrdsPredicate().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); + mBindings.filterChips.smoothScrollTo(0, 0); + } else { + filterChipView.enableCloseIcon(); - mBindings.filterChipsGroup.removeView(filterChipView); - mBindings.filterChipsGroup.addView(filterChipView, 0); - mBindings.filterChips.smoothScrollTo(0, 0); + mBindings.filterChipsGroup.removeView(filterChipView); + mBindings.filterChipsGroup.addView(filterChipView, 0); + mBindings.filterChips.smoothScrollTo(0, 0); + } } - } - }); - filterChipView.setOnResetClicked(() -> mFilterViewModel.getCurrentNumOrdsPredicate().set(null)); + }); + filterChipView.setOnResetClicked(() -> mFilterViewModel.getCurrentNumOrdsPredicate().set(null)); + } + + case ProdFabbisognoLineeProdBindings.MGRP_FILTER_ID -> { + mFilterViewModel.getCurrentGruppoMercPredicate().addOnPropertyChangedCallback(new OnGeneralChangedCallback() { + @Override + public void run() { + if (mFilterViewModel.getCurrentGruppoMercPredicate().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.setGruppoMercFilter(null); + mFilterViewModel.getCurrentGruppoMercPredicate().set(null); + }); + } } this.mBindings.filterChipsGroup.addView(filterChipView); } @@ -253,16 +304,24 @@ public class ProdFabbisognoLineeProdFragment extends BaseFragment implements ITi var filterLayoutView = filterChipDTO .getFilterLayoutView(); - if (filterChipDTO.getID() == ProdFabbisognoLineeProdBindings.NUM_ORD_FILTER_ID) { - ((FilterNumeroOrdineLayoutView) filterLayoutView) - .setAllNumOrds(mFilterViewModel.getAllNumOrds()) - .setAvailableNumOrds(mFilterViewModel.getAvailableNumOrds()) - .setOnFilterApplied(mFilterViewModel::setNumOrdFilter) - .setPreSelectedNumOrds(Stream.of(Objects.requireNonNull(mViewModel.getOrdiniList().getValue())) - .filter(mFilterViewModel.getCurrentNumOrdsPredicate().get() == null ? - x -> false : Objects.requireNonNull(mFilterViewModel.getCurrentNumOrdsPredicate().get())) - .map(x -> x.getOrdineLavorazioneDTO().getNumOrd()) - .toList()); + switch (filterChipDTO.getID()) { + case ProdFabbisognoLineeProdBindings.NUM_ORD_FILTER_ID -> + ((FilterNumeroOrdineLayoutView) filterLayoutView) + .setAllNumOrds(mFilterViewModel.getAllNumOrds()) + .setAvailableNumOrds(mFilterViewModel.getAvailableNumOrds()) + .setOnFilterApplied(mFilterViewModel::setNumOrdFilter) + .setPreSelectedNumOrds(Stream.of(Objects.requireNonNull(mViewModel.getOrdiniList().getValue())) + .filter(mFilterViewModel.getCurrentNumOrdsPredicate().get() == null ? + x -> false : Objects.requireNonNull(mFilterViewModel.getCurrentNumOrdsPredicate().get())) + .map(x -> x.getOrdineLavorazioneDTO().getNumOrd()) + .toList()); + + case ProdFabbisognoLineeProdBindings.MGRP_FILTER_ID -> + ((FilterGruppoMercLayoutView) filterLayoutView) + .setAllGroupMerc(mFilterViewModel.getAllGruppoMerc(mtbGrupCache)) + .setAvailableGroupMerc(mFilterViewModel.getAvailableGruppoMerc(mtbGrupCache)) + .setOnFilterApplied(mFilterViewModel::setGruppoMercFilter) + .setPreSelectedGroupMerc(mFilterViewModel.getSelectedMtbGrup()); } if (!filterLayoutView.isAdded()) @@ -270,6 +329,44 @@ public class ProdFabbisognoLineeProdFragment extends BaseFragment implements ITi } + private void initMtbGrupsCache(Runnable onComplete) { + var codMgrpArts = Stream.of(Objects.requireNonNull(this.mViewModel.getOrdiniList().getValue())) + .flatMap(x -> Stream.of(x.getOrdineLavorazioneDTO().getAvailableClassMerc() != null ? + x.getOrdineLavorazioneDTO().getAvailableClassMerc() : new ArrayList<>())) + .map(OrdineLavorazioneDTO.AvailableClassMerc::getCodMgrp) + .withoutNulls() + .distinct() + .toList(); + + this.mArticoloRESTConsumer.getArtsGroups(codMgrpArts, mtbGrupCache -> { + this.mtbGrupCache = mtbGrupCache; + onComplete.run(); + }, this::onError); + } + + private void initJtbComtCache(Runnable onComplete) { + if (this.mViewModel.getOrdiniList().getValue() == null) { + this.jtbComtCache = new ArrayList<>(); + onComplete.run(); + return; + } + var jtbComts = Stream.of(Objects.requireNonNull(this.mViewModel.getOrdiniList().getValue())) + .flatMap(x -> Stream.of(x.getOrdineLavorazioneDTO().getCodJcom())) + .distinct().withoutNulls() + .toList(); + + if (jtbComts.isEmpty()) { + this.jtbComtCache = new ArrayList<>(); + onComplete.run(); + return; + } + + this.mCommessaRESTConsumer.getJtbComts(jtbComts, jtbComtCache -> { + this.jtbComtCache = jtbComtCache; + onComplete.run(); + }, this::onError); + } + @Override public void onDestroy() { for (Runnable onPreDestroy : mOnPreDestroyList) { diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_fabbisogno_linee_prod/filters/ProdFabbisognoLineeProdFilterViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_fabbisogno_linee_prod/filters/ProdFabbisognoLineeProdFilterViewModel.java index 78c93831..73bfbbbc 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_fabbisogno_linee_prod/filters/ProdFabbisognoLineeProdFilterViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_fabbisogno_linee_prod/filters/ProdFabbisognoLineeProdFilterViewModel.java @@ -6,18 +6,25 @@ import androidx.lifecycle.MutableLiveData; import com.annimon.stream.Stream; import com.annimon.stream.function.Predicate; +import java.util.ArrayList; import java.util.List; import java.util.Objects; +import it.integry.integrywmsnative.core.model.MtbGrup; +import it.integry.integrywmsnative.core.rest.model.OrdineUscitaInevasoDTO; +import it.integry.integrywmsnative.gest.ordini_uscita_elenco.OrdiniUscitaElencoDTO; import it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod.dto.ProdFabbisognoLineeItemModelDto; +import it.integry.integrywmsnative.gest.prod_versamento_materiale.dto.OrdineLavorazioneDTO; public class ProdFabbisognoLineeProdFilterViewModel { private final ObservableField> currentNumOrdsPredicate = new ObservableField<>(); + private final ObservableField> currentGruppoMercPredicate = new ObservableField<>(); private List initialList; + private List selectedMtbGrup = new ArrayList<>(); private final MutableLiveData> currentList = new MutableLiveData<>(); - public void init(List initialList){ + public void init(List initialList) { this.initialList = initialList; this.currentList.setValue(this.initialList); } @@ -26,21 +33,37 @@ public class ProdFabbisognoLineeProdFilterViewModel { return this.currentList; } - public void setNumOrdFilter(List numOrds){ + public void setNumOrdFilter(List numOrds) { if (numOrds == null || numOrds.isEmpty()) currentNumOrdsPredicate.set(null); - else{ + else { currentNumOrdsPredicate.set(x -> numOrds.contains(x.getOrdineLavorazioneDTO().getNumOrd())); } } - public void applyAllTests(){ + public void setGruppoMercFilter(List mtbGrupList) { + if (mtbGrupList == null || mtbGrupList.isEmpty()) { + currentGruppoMercPredicate.set(null); + this.selectedMtbGrup = new ArrayList<>(); + } else { + this.selectedMtbGrup = mtbGrupList; + var mtbGrups = Stream.of(mtbGrupList).map(MtbGrup::getCodMgrp).toList(); + + currentGruppoMercPredicate.set(x -> Stream.of(x.getOrdineLavorazioneDTO().getAvailableClassMerc()) + .anyMatch(y -> mtbGrups.contains(y.getCodMgrp()))); + } + } + + public void applyAllTests() { List returnList = null; - if (currentNumOrdsPredicate.get() == null){ + if (currentNumOrdsPredicate.get() == null && + currentGruppoMercPredicate.get() == null) { returnList = this.initialList; - }else { + } else { Stream tmpStream = Stream.of(this.initialList) - .filter(x -> (currentNumOrdsPredicate.get() == null || (currentNumOrdsPredicate.get().test(x)))); + .filter(x -> (currentNumOrdsPredicate.get() == null || (currentNumOrdsPredicate.get().test(x))) && + (currentGruppoMercPredicate.get() == null || (currentGruppoMercPredicate.get().test(x))) + ); returnList = tmpStream.toList(); } @@ -52,7 +75,11 @@ public class ProdFabbisognoLineeProdFilterViewModel { return currentNumOrdsPredicate; } - public List getAllNumOrds(){ + public ObservableField> getCurrentGruppoMercPredicate() { + return currentGruppoMercPredicate; + } + + public List getAllNumOrds() { return Stream .of(Objects.requireNonNull(initialList)) .filter(x -> x.getOrdineLavorazioneDTO().getNumOrd() != null) @@ -62,13 +89,59 @@ public class ProdFabbisognoLineeProdFilterViewModel { .toList(); } - public List getAvailableNumOrds(){ - if (currentNumOrdsPredicate.get() == null) return getAllNumOrds(); + public List getAvailableNumOrds() { + if (currentGruppoMercPredicate.get() == null) return getAllNumOrds(); else { return Stream.of(this.initialList) + .filter(x -> (currentGruppoMercPredicate.get() == null || (currentGruppoMercPredicate.get().test(x)))) .map(x -> x.getOrdineLavorazioneDTO().getNumOrd()) .distinct() .toList(); } } + + public List getSelectedMtbGrup() { + return selectedMtbGrup; + } + + public List getAllGruppoMerc(List mtbGrupFullList) { + var codMgrp = Stream.of(initialList) + .flatMap(x -> + Stream.of(x.getOrdineLavorazioneDTO().getAvailableClassMerc() != null ? + x.getOrdineLavorazioneDTO().getAvailableClassMerc() : + new ArrayList<>())) + .map(OrdineLavorazioneDTO.AvailableClassMerc::getCodMgrp) + .withoutNulls() + .distinct() + .toList(); + + return Stream.of(Objects.requireNonNull(mtbGrupFullList)) + .filter(x -> codMgrp.contains(x.getCodMgrp())) + .distinct() + .withoutNulls() + .sortBy(MtbGrup::getDescrizione) + .toList(); + } + + public List getAvailableGruppoMerc(List mtbGrupFullList){ + if (currentNumOrdsPredicate.get() == null){ + return getAllGruppoMerc(mtbGrupFullList); + } else { + List availableCodMgrups = Stream.of(this.initialList) + .filter(x -> + (currentNumOrdsPredicate.get() == null || (currentNumOrdsPredicate.get().test(x))) + ) + .flatMap(x -> Stream.of(x.getOrdineLavorazioneDTO().getAvailableClassMerc())) + .map(OrdineLavorazioneDTO.AvailableClassMerc::getCodMgrp) + .distinct() + .toList(); + + return Stream.of(Objects.requireNonNull(mtbGrupFullList)) + .filter(x -> availableCodMgrups.contains(x.getCodMgrp())) + .distinct() + .withoutNulls() + .sortBy(MtbGrup::getDescrizione) + .toList(); + } + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/dto/OrdineLavorazioneDTO.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/dto/OrdineLavorazioneDTO.java index f95f038e..e7f03c9d 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/dto/OrdineLavorazioneDTO.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/dto/OrdineLavorazioneDTO.java @@ -3,8 +3,10 @@ package it.integry.integrywmsnative.gest.prod_versamento_materiale.dto; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Date; +import java.util.List; import it.integry.integrywmsnative.core.di.BindableFloat; +import it.integry.integrywmsnative.core.rest.model.OrdineUscitaInevasoDTO; import it.integry.integrywmsnative.core.utility.UtilityDate; public class OrdineLavorazioneDTO { @@ -101,6 +103,7 @@ public class OrdineLavorazioneDTO { private Object mtbColtToEdit; private int hrNum; + private List availableClassMerc; private BindableFloat qtaColVersamento = new BindableFloat(); @@ -533,4 +536,37 @@ public class OrdineLavorazioneDTO { this.descrizioneAttivita = descrizioneAttivita; return this; } + + public List getAvailableClassMerc() { + return availableClassMerc; + } + + public OrdineLavorazioneDTO setAvailableClassMerc(List availableClassMerc) { + this.availableClassMerc = availableClassMerc; + return this; + } + + public static class AvailableClassMerc { + + private String codMgrp; + private List codMsgr; + + public String getCodMgrp() { + return codMgrp; + } + + public AvailableClassMerc setCodMgrp(String codMgrp) { + this.codMgrp = codMgrp; + return this; + } + + public List getCodMsgr() { + return codMsgr; + } + + public AvailableClassMerc setCodMsgr(List codMsgr) { + this.codMsgr = codMsgr; + return this; + } + } }