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/build.gradle b/app/build.gradle
index 51435cf0..80bb4cbd 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -10,8 +10,8 @@ apply plugin: 'com.google.gms.google-services'
android {
- def appVersionCode = 412
- def appVersionName = '1.38.02'
+ def appVersionCode = 413
+ def appVersionName = '1.39.00'
signingConfigs {
release {
diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java
index 1e5fcc52..586a56b5 100644
--- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java
+++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java
@@ -67,6 +67,10 @@ import it.integry.integrywmsnative.gest.prod_recupero_materiale.ProdRecuperoMate
import it.integry.integrywmsnative.gest.prod_recupero_materiale.ProdRecuperoMaterialeModule;
import it.integry.integrywmsnative.gest.prod_rientro_merce.ProdRientroMerceComponent;
import it.integry.integrywmsnative.gest.prod_rientro_merce.order_detail.ProdRientroMerceOrderDetailComponent;
+import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.ProdRiposizionamentoDaProdComponent;
+import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.ProdRiposizionamentoDaProdModule;
+import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dialogs.info_giacenza.DialogInfoGiacenzaComponent;
+import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dialogs.info_giacenza.DialogInfoGiacenzaModule;
import it.integry.integrywmsnative.gest.prod_versamento_materiale.ProdVersamentoMaterialeComponent;
import it.integry.integrywmsnative.gest.prod_versamento_materiale.ProdVersamentoMaterialeModule;
import it.integry.integrywmsnative.gest.prod_versamento_materiale_su_mag_prossimita.ProdVersamentoMaterialeInBufferComponent;
@@ -200,7 +204,9 @@ import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCr
ProdVersamentoMaterialeInBufferModule.class,
DialogInputQuantityToReturnModule.class,
DialogInfoAggiuntiveLUModule.class,
- DialogAskLineaProdModule.class
+ DialogAskLineaProdModule.class,
+ ProdRiposizionamentoDaProdModule.class,
+ DialogInfoGiacenzaModule.class
})
public interface MainApplicationComponent {
@@ -336,6 +342,10 @@ public interface MainApplicationComponent {
DialogAskLineaProdComponent.Factory dialogAskLineaProdComponent();
+ ProdRiposizionamentoDaProdComponent.Factory prodRiposizionamentoDaprodComponent();
+
+ DialogInfoGiacenzaComponent.Factory dialogInfoGiacenzaComponent();
+
void inject(MainApplication mainApplication);
void inject(AppContext mainApplication);
diff --git a/app/src/main/java/it/integry/integrywmsnative/core/class_router/configs/MenuConfiguration.java b/app/src/main/java/it/integry/integrywmsnative/core/class_router/configs/MenuConfiguration.java
index 5dba0ebb..04d06c80 100644
--- a/app/src/main/java/it/integry/integrywmsnative/core/class_router/configs/MenuConfiguration.java
+++ b/app/src/main/java/it/integry/integrywmsnative/core/class_router/configs/MenuConfiguration.java
@@ -14,6 +14,7 @@ import it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod.ProdFabbisogn
import it.integry.integrywmsnative.gest.prod_linee_produzione.ProdLineeProduzioneFragment;
import it.integry.integrywmsnative.gest.prod_recupero_materiale.ProdRecuperoMaterialeFragment;
import it.integry.integrywmsnative.gest.prod_rientro_merce.ProdRientroMerceFragment;
+import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.ProdRiposizionamentoDaProdFragment;
import it.integry.integrywmsnative.gest.prod_versamento_materiale.ProdVersamentoMaterialeFragment;
import it.integry.integrywmsnative.gest.prod_versamento_materiale_su_mag_prossimita.ProdVersamentoMaterialeInBufferFragment;
import it.integry.integrywmsnative.gest.pv_ordini_acquisto.PVOrdiniAcquistoGrigliaFragment;
@@ -179,6 +180,14 @@ public class MenuConfiguration extends BaseMenuConfiguration {
.setTitleIcon(R.drawable.ic_dashboard_prod_versamento_su_ord)
.setDrawerIcon(R.drawable.ic_black_external)
.setFragmentFactory(() -> PickingLiberoFragment.newInstance(R.string.prod_versamento_su_ordine_title_fragment, GestioneEnum.LAVORAZIONE, false, true)))
+
+ .addItem(new MenuItem()
+ .setID(R.id.nav_prod_riposizionamento_da_ord)
+ .setCodMenu("MG069")
+ .setTitleText(R.string.prod_riposizionamento_da_prod_title)
+ .setTitleIcon(R.drawable.ic_production_line_produzione)
+ .setDrawerIcon(R.drawable.ic_black_load_shelf)
+ .setFragmentFactory(ProdRiposizionamentoDaProdFragment::newInstance))
).addGroup(
new MenuGroup()
.setGroupText(R.string.internal_handling)
diff --git a/app/src/main/java/it/integry/integrywmsnative/core/model/MvwSitArtUdcDetInventario.java b/app/src/main/java/it/integry/integrywmsnative/core/model/MvwSitArtUdcDetInventario.java
index acfd8b69..dcaaa84a 100644
--- a/app/src/main/java/it/integry/integrywmsnative/core/model/MvwSitArtUdcDetInventario.java
+++ b/app/src/main/java/it/integry/integrywmsnative/core/model/MvwSitArtUdcDetInventario.java
@@ -38,6 +38,7 @@ public class MvwSitArtUdcDetInventario {
private BigDecimal pesoLordoKg;
private String codJfas;
private MtbAart mtbAart;
+ private Integer numOrd;
public String getGestione() {
return gestione;
@@ -282,6 +283,15 @@ public class MvwSitArtUdcDetInventario {
return this;
}
+ public Integer getNumOrd() {
+ return numOrd;
+ }
+
+ public MvwSitArtUdcDetInventario setNumOrd(Integer numOrd) {
+ this.numOrd = numOrd;
+ return this;
+ }
+
public MtbColr toMtbColr() {
return new MtbColr()
.setCodJcom(getCodJcom())
diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/GiacenzaRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/GiacenzaRESTConsumer.java
index d0a00e42..01b67698 100644
--- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/GiacenzaRESTConsumer.java
+++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/GiacenzaRESTConsumer.java
@@ -17,6 +17,7 @@ import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.rest.model.giacenza.InstantItemSituationIncomingItemDto;
import it.integry.integrywmsnative.core.rest.model.giacenza.InstantItemSituationResponseDto;
import it.integry.integrywmsnative.core.utility.UtilityString;
+import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dto.ArtsInGiacenzaDTO;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@@ -71,6 +72,48 @@ public class GiacenzaRESTConsumer extends _BaseRESTConsumer {
});
}
+ public void getGiacenzeInPosizione(List posizioni, boolean withTestataCollo, RunnableArgs> onComplete, RunnableArgs onFailed) {
+ GiacenzaRESTConsumerService giacenzaRESTConsumerService = RESTBuilder.getService(GiacenzaRESTConsumerService.class);
+ giacenzaRESTConsumerService.retrieveAvailableItems(posizioni, withTestataCollo).enqueue(new Callback<>() {
+ @Override
+ public void onResponse(Call>> call, Response>> response) {
+ analyzeAnswer(response, "getGiacenzeInPosizione", inventarioList -> {
+
+ List codMarts = Stream.of(inventarioList)
+ .map(x -> x.getCodMart().trim())
+ .toList();
+
+ mArticoloRESTConsumer.getByCodMarts(codMarts, mtbAarts -> {
+ for (var articoli : inventarioList) {
+ List mvwSitArtUdcDetInventario = articoli.getMvwSitArtUdcDetInventarioDTO();
+ if (mvwSitArtUdcDetInventario != null && !mvwSitArtUdcDetInventario.isEmpty()){
+ for (var row : mvwSitArtUdcDetInventario){
+ MtbAart foundMtbAart = null;
+ Optional mtbAartOpt = Stream.of(mtbAarts)
+ .filter(x -> x.getCodMart().equalsIgnoreCase(row.getCodMart()))
+ .findFirst();
+
+ if (mtbAartOpt.isPresent()) {
+ foundMtbAart = mtbAartOpt.get();
+ }
+
+ row.setMtbAart(foundMtbAart);
+ }
+ }
+ }
+
+ onComplete.run(inventarioList);
+ }, onFailed);
+ }, onFailed);
+ }
+
+ @Override
+ public void onFailure(Call>> call, Throwable t) {
+ onFailed.run(new Exception(t));
+ }
+ });
+ }
+
public void getGiacenzeByArticolo(String codMart, String partitaMag, RunnableArgs> onComplete, RunnableArgs onFailed) {
GiacenzaRESTConsumerService giacenzaRESTConsumerService = RESTBuilder.getService(GiacenzaRESTConsumerService.class);
var serviceRESTResponseCall =
diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/GiacenzaRESTConsumerService.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/GiacenzaRESTConsumerService.java
index a965d535..1a0705f9 100644
--- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/GiacenzaRESTConsumerService.java
+++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/GiacenzaRESTConsumerService.java
@@ -2,11 +2,16 @@ package it.integry.integrywmsnative.core.rest.consumers;
import java.util.List;
+import it.integry.integrywmsnative.core.model.DtbDoct;
import it.integry.integrywmsnative.core.model.MvwSitArtUdcDetInventario;
+import it.integry.integrywmsnative.core.rest.model.LoadColliDTO;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.rest.model.giacenza.InstantItemSituationResponseDto;
+import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dto.ArtsInGiacenzaDTO;
import retrofit2.Call;
+import retrofit2.http.Body;
import retrofit2.http.GET;
+import retrofit2.http.POST;
import retrofit2.http.Query;
public interface GiacenzaRESTConsumerService {
@@ -15,6 +20,9 @@ public interface GiacenzaRESTConsumerService {
Call>> retrieveAvailableItems(
@Query("posizione") String posizione);
+ @POST("wms/giacenza/availableItemsByPosizione")
+ Call>> retrieveAvailableItems(@Body List posizioni, @Query("withTestataCollo") boolean withTestataCollo);
+
@GET("wms/giacenza/availableItemsByArticolo")
Call>> retrieveAvailableItemsByArt(
@Query("codMart") String 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 e9abf04a..4de94e89 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
@@ -71,6 +71,7 @@ public class DBSettingsModel {
private boolean flagDisableMandatoryTracciabilitaAccettazioneBolla = false;
private boolean flagAllowULRecoverAccettazioneBolla = true;
private boolean flagOverflowQuantityWarning = false;
+ private String viewPosizioni;
public boolean isFlagSpedizioneEnableFakeGiacenza() {
return flagSpedizioneEnableFakeGiacenza;
@@ -576,4 +577,13 @@ public class DBSettingsModel {
this.groupPoductionByCommodityGroup = groupPoductionByCommodityGroup;
return this;
}
+
+ public String getViewPosizioni() {
+ return viewPosizioni;
+ }
+
+ public DBSettingsModel setViewPosizioni(String viewPosizioni) {
+ this.viewPosizioni = viewPosizioni;
+ return this;
+ }
}
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 97fe2c86..e7840a70 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
@@ -278,6 +278,11 @@ public class SettingsManager {
.setKeySection("FLAG_GROUP_BY_GRP_MERC")
.setSetter(dbSettingsModelIstance::setGroupPoductionByCommodityGroup)
.setDefaultValue(false));
+ stbGestSetupReaderList.add(new StbGestSetupReader<>(String.class)
+ .setGestName("PICKING")
+ .setSection("PRODUZIONE")
+ .setKeySection("VIEW_POSIZIONI")
+ .setSetter(dbSettingsModelIstance::setViewPosizioni));
stbGestSetupReaderList.add(new StbGestSetupReader<>(Boolean.class)
.setGestName("PICKING")
.setSection("SPEDIZIONE")
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/ProdRiposizionamentoDaProdComponent.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdComponent.java
new file mode 100644
index 00000000..55ffdf93
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdComponent.java
@@ -0,0 +1,14 @@
+package it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod;
+
+import dagger.Subcomponent;
+
+@Subcomponent
+public interface ProdRiposizionamentoDaProdComponent {
+
+ @Subcomponent.Factory
+ interface Factory {
+ ProdRiposizionamentoDaProdComponent create();
+ }
+
+ void inject(ProdRiposizionamentoDaProdFragment ProdRiposizionamentoDaProdFragment);
+}
\ No newline at end of file
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
new file mode 100644
index 00000000..46861a07
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdFragment.java
@@ -0,0 +1,305 @@
+package it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+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.util.List;
+import java.util.Objects;
+
+import javax.inject.Inject;
+
+import it.integry.barcode_base_android_library.model.BarcodeScanDTO;
+import it.integry.integrywmsnative.BR;
+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.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;
+import it.integry.integrywmsnative.core.model.MtbDepoPosizione;
+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.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;
+
+public class ProdRiposizionamentoDaProdFragment extends BaseFragment implements ITitledFragment, ProdRiposizionamentoDaProdViewModel.Listener {
+
+ @Inject
+ ProdRiposizionamentoDaProdViewModel mViewModel;
+ 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;
+
+
+ public ProdRiposizionamentoDaProdFragment() {
+ // Required empty public constructor
+ }
+
+ public static ProdRiposizionamentoDaProdFragment newInstance() {
+ return new ProdRiposizionamentoDaProdFragment();
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setRetainInstance(true);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ mBindings = DataBindingUtil.inflate(inflater, R.layout.fragment_prod_riposizionamento_da_prod, container, false);
+
+ MainApplication.appComponent
+ .prodRiposizionamentoDaprodComponent()
+ .create()
+ .inject(this);
+
+ mViewModel.setListener(this);
+ mBindings.setLifecycleOwner(this);
+ mBindings.setView(this);
+ mBindings.setViewmodel(mViewModel);
+
+ mBindings.swiperefresh.setRefreshing(true);
+ mBindings.swiperefresh.setOnRefreshListener(() -> {
+ mViewModel.loadData();
+ });
+
+ mHandler.postDelayed(mRunnable, mInterval);
+
+ 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);
+
+ mFilterViewModel.init(mViewModel.getItemsInventario().getValue());
+ this.refreshList(null);
+ });
+
+ var itemType = new Type(R.layout.prod_riposizionamento_da_prod__list_item, BR.item);
+
+ itemType.onBind(x -> {
+ x.getBinding().setView(this);
+ return null;
+ });
+
+ new LiveAdapter(mItemsInventario)
+ .map(ArtsInGiacenzaDTO.class, itemType)
+ .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());
+ } catch (Exception e) {
+ UtilityExceptions.defaultException(this.getContext(), e);
+ }
+ }
+
+ private final Runnable mRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mBindings.swiperefresh.setRefreshing(true);
+ mViewModel.loadData();
+ mHandler.postDelayed(this, mInterval);
+ }
+ };
+
+ private void initBarcodeReader() {
+ barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
+ .setOnScanSuccessful(onScanSuccessful)
+ .setOnScanFailed(ex -> UtilityExceptions.defaultException(getActivity(), ex, false)));
+
+ BarcodeManager.enable();
+ }
+
+ private final RunnableArgs onScanSuccessful = data -> {
+ mHandler.removeCallbacks(mRunnable);
+ this.onLoadingStarted();
+
+ this.mViewModel.processBarcodeDTO(data, this::onLoadingEnded);
+ };
+
+ private void choosePosition(RunnableArgs onComplete) {
+ DialogAskPositionOfLUView.makeBase(false, (status, mtbDepoPosizione) -> {
+
+ if (status == DialogConsts.Results.ABORT) {
+ popMe();
+ } else {
+ onComplete.run(mtbDepoPosizione);
+ }
+
+ }, this::onError)
+ .show(requireActivity().getSupportFragmentManager(), "tag");
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ mViewModel.init();
+ }
+
+ @Override
+ public void onDestroy() {
+ BarcodeManager.removeCallback(barcodeScannerIstanceID);
+ mHandler.removeCallbacks(mRunnable);
+ mViewModel.setListener(null);
+
+ for (Runnable onPreDestroy : mOnPreDestroyList) {
+ onPreDestroy.run();
+ }
+ super.onDestroy();
+ }
+
+ @Override
+ public void onCreateActionBar(AppCompatTextView titleText, Context context) {
+ titleText.setText(context.getText(R.string.prod_riposizionamento_da_prod_title).toString());
+ }
+
+ @Override
+ public void onInventoriesLoadingStarted() {
+ mBindings.swiperefresh.setRefreshing(true);
+ }
+
+ @Override
+ public void onInventoriesLoadingEnded() {
+ mBindings.swiperefresh.setRefreshing(false);
+ }
+
+ @Override
+ public void onInventoriesLoadingError(Exception ex) {
+ mBindings.swiperefresh.setRefreshing(false);
+ this.onError(ex);
+ }
+
+ @Override
+ public void onRequestChoosePosition(RunnableArgs onComplete) {
+ choosePosition(onComplete);
+ }
+
+ @Override
+ public void onDataSaved() {
+ mHandler.postDelayed(mRunnable, mInterval);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdModule.java
new file mode 100644
index 00000000..9741ec07
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdModule.java
@@ -0,0 +1,19 @@
+package it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod;
+
+import dagger.Module;
+import dagger.Provides;
+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;
+
+@Module(subcomponents = ProdRiposizionamentoDaProdComponent.class)
+public class ProdRiposizionamentoDaProdModule {
+
+ @Provides
+ ProdRiposizionamentoDaProdViewModel providesProdRiposizionamentoDaProdViewModel(GiacenzaRESTConsumer giacenzaRESTConsumer, BarcodeRESTConsumer barcodeRESTConsumer, ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer) {
+ return new ProdRiposizionamentoDaProdViewModel(giacenzaRESTConsumer, barcodeRESTConsumer, colliMagazzinoRESTConsumer);
+ }
+
+}
\ No newline at end of file
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
new file mode 100644
index 00000000..299f904e
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdViewModel.java
@@ -0,0 +1,249 @@
+package it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod;
+
+import androidx.lifecycle.MutableLiveData;
+
+import com.annimon.stream.Optional;
+import com.annimon.stream.Stream;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import it.integry.barcode_base_android_library.model.BarcodeScanDTO;
+import it.integry.integrywmsnative.core.exception.NoLUFoundException;
+import it.integry.integrywmsnative.core.exception.ScannedPositionNotExistException;
+import it.integry.integrywmsnative.core.expansion.RunnableArgs;
+import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingListener;
+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.rest.consumers.BarcodeRESTConsumer;
+import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer;
+import it.integry.integrywmsnative.core.rest.consumers.GiacenzaRESTConsumer;
+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.UtilityString;
+import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dto.ArtsInGiacenzaDTO;
+
+public class ProdRiposizionamentoDaProdViewModel {
+
+ private final GiacenzaRESTConsumer mGiacenzaRESTConsumer;
+ private final BarcodeRESTConsumer mBarcodeRESTConsumer;
+ private final ColliMagazzinoRESTConsumer mColliMagazzinoRESTConsumer;
+ private final MutableLiveData> itemsInventario = new MutableLiveData<>();
+ private final MutableLiveData mtbColtMutableLiveData = new MutableLiveData<>();
+ private final MutableLiveData> mMvwSitArtUdcDetInventarioLiveData = new MutableLiveData<>();
+ private Listener mListener;
+
+ public ProdRiposizionamentoDaProdViewModel(GiacenzaRESTConsumer giacenzaRESTConsumer, BarcodeRESTConsumer barcodeRESTConsumer, ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer) {
+ this.mGiacenzaRESTConsumer = giacenzaRESTConsumer;
+ this.mBarcodeRESTConsumer = barcodeRESTConsumer;
+ this.mColliMagazzinoRESTConsumer = colliMagazzinoRESTConsumer;
+ }
+
+ public void processBarcodeDTO(BarcodeScanDTO barcodeScanDTO, Runnable onComplete) {
+ if (UtilityBarcode.isEtichettaAnonima(barcodeScanDTO)) {
+ this.executeEtichettaLU(barcodeScanDTO.getStringValue(), true, onComplete);
+ } else if (UtilityBarcode.isEtichetta128(barcodeScanDTO)) {
+ this.executeEtichettaEan128(barcodeScanDTO, onComplete);
+ } else {
+ onComplete.run();
+ }
+ }
+
+ private void executeEtichettaEan128(BarcodeScanDTO barcodeScanDTO, Runnable onBarcodeScanComplete) {
+ this.mBarcodeRESTConsumer.decodeEan128(barcodeScanDTO, ean128Model -> {
+
+ String barcodeProd = null;
+
+ if (!UtilityString.isNullOrEmpty(ean128Model.Sscc)) barcodeProd = ean128Model.Sscc;
+ if (!UtilityString.isNullOrEmpty(ean128Model.Gtin)) barcodeProd = ean128Model.Gtin;
+ if (!UtilityString.isNullOrEmpty(ean128Model.Content))
+ barcodeProd = ean128Model.Content;
+
+
+ if (!UtilityString.isNullOrEmpty(barcodeProd)) {
+
+ if (!UtilityString.isNullOrEmpty(ean128Model.Sscc)) {
+ this.executeEtichettaLU(ean128Model.Sscc, false, onBarcodeScanComplete);
+ } else {
+ this.sendError(new NoLUFoundException());
+ }
+
+
+ } else {
+ //EAN 128 non completo o comunque mancano i riferimenti al prodotto
+ onBarcodeScanComplete.run();
+ }
+ }, this::sendError);
+ }
+
+ private void executeEtichettaLU(String sscc, boolean isAnonima, Runnable onComplete) {
+ this.mColliMagazzinoRESTConsumer.getBySSCC(sscc, true, false, mtbColt -> {
+ if (mtbColt == null && !isAnonima) {
+ this.sendError(new NoLUFoundException());
+ } else {
+ List mvwSitArtUdcDetInventario = Stream.of(Objects.requireNonNull(itemsInventario.getValue()))
+ .flatMap(item -> Stream.of(item.getMvwSitArtUdcDetInventarioDTO()))
+ .toList();
+
+ mMvwSitArtUdcDetInventarioLiveData.setValue(mvwSitArtUdcDetInventario);
+
+ boolean isPresent = Stream.of(mvwSitArtUdcDetInventario)
+ .anyMatch(x ->
+ x.getGestione().equals(mtbColt.getGestione()) &&
+ x.getDataCollo().isEqual(UtilityDate.toLocalDate(mtbColt.getDataColloD())) &&
+ x.getSerCollo().equals(mtbColt.getSerCollo()) &&
+ x.getNumCollo().equals(mtbColt.getNumCollo()));
+
+ if (isPresent && mtbColt != null) {
+ mtbColt.setDisablePrint(true);
+ onComplete.run();
+ this.onLUOpened(mtbColt);
+ } else {
+ this.sendError(new NoLUFoundException());
+ }
+ }
+ }, this::sendError);
+ }
+
+ private void onLUOpened(MtbColt mtbColt) {
+ this.mtbColtMutableLiveData.setValue(mtbColt);
+ this.sendRequestChoosePosition(this::setPosizione);
+ }
+
+ public void setPosizione(MtbDepoPosizione mtbDepoPosizione) {
+ MtbColt mtbColt = mtbColtMutableLiveData.getValue();
+
+ this.sendOnLoadingStarted();
+
+ if (mtbDepoPosizione == null) {
+ //Nessuna posizione trovata con questo barcode
+ this.sendError(new ScannedPositionNotExistException());
+ } else {
+ if (mtbColt != null) {
+ mColliMagazzinoRESTConsumer.changePosizione(mtbColt, mtbDepoPosizione, () -> {
+ List mvwSitArtUdcDetInventarioList = mMvwSitArtUdcDetInventarioLiveData.getValue();
+
+ if (mvwSitArtUdcDetInventarioList != null) {
+ Optional mvwSitArtUdcDetInventario = Stream.of(mvwSitArtUdcDetInventarioList)
+ .filter(x ->
+ x.getGestione().equals(mtbColt.getGestione()) &&
+ x.getDataCollo().isEqual(UtilityDate.toLocalDate(mtbColt.getDataColloD())) &&
+ x.getSerCollo().equals(mtbColt.getSerCollo()) &&
+ x.getNumCollo().equals(mtbColt.getNumCollo()))
+ .findFirst();
+
+ mvwSitArtUdcDetInventario.ifPresent(mvwSitArtUdcDetInventarioList::remove);
+
+ Map> groupedByCodMartAndPartitaMag =
+ mvwSitArtUdcDetInventarioList.stream()
+ .collect(Collectors.groupingBy(dto -> dto.getCodMart() + dto.getPartitaMag()));
+
+ List artsInGiacenza = Stream.of(groupedByCodMartAndPartitaMag.entrySet())
+ .map(entry -> {
+ List dtoList = entry.getValue();
+
+ BigDecimal totalNumCnf = dtoList.stream()
+ .map(MvwSitArtUdcDetInventario::getNumCnf)
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+ return new ArtsInGiacenzaDTO()
+ .setCodMart(dtoList.get(0).getCodMart())
+ .setPartitaMag(dtoList.get(0).getPartitaMag())
+ .setPosizione(dtoList.get(0).getPosizione())
+ .setDescrizione(dtoList.get(0).getDescrizioneEstesa())
+ .setNumOrd(dtoList.get(0).getNumOrd())
+ .setNumCnf(totalNumCnf)
+ .setCount(dtoList.size())
+ .setMvwSitArtUdcDetInventarioDTO(dtoList);
+ })
+ .sorted(Comparator.comparing(ArtsInGiacenzaDTO::getPosizione))
+ .toList();
+
+ itemsInventario.postValue(artsInGiacenza);
+ this.sendOnLoadingEnded();
+ this.sendOnDataSaved();
+ }
+ }, this::sendError);
+ } else this.sendError(new NoLUFoundException());
+ }
+ }
+
+ public void init() {
+ loadData();
+ }
+
+ public void loadData() {
+ List posizioni = Arrays.asList(SettingsManager.iDB().getViewPosizioni().split("\\|"));
+
+ this.mGiacenzaRESTConsumer.getGiacenzeInPosizione(posizioni, true, availableItems -> {
+ availableItems = Stream.of(availableItems)
+ .sorted(Comparator.comparing(ArtsInGiacenzaDTO::getPosizione))
+ .toList();
+
+ itemsInventario.postValue(availableItems);
+ this.sendOnInventoriesLoadingEnded();
+ }, this::sendError);
+ }
+
+ public MutableLiveData> getItemsInventario() {
+ return itemsInventario;
+ }
+
+ 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 sendOnInventoriesLoadingStarted() {
+ if (this.mListener != null) mListener.onInventoriesLoadingStarted();
+ }
+
+ private void sendOnInventoriesLoadingEnded() {
+ if (this.mListener != null) mListener.onInventoriesLoadingEnded();
+ }
+
+ private void sendOnInventoriesLoadingError(Exception ex) {
+ if (this.mListener != null) mListener.onInventoriesLoadingError(ex);
+ }
+
+ private void sendRequestChoosePosition(RunnableArgs onComplete) {
+ if (this.mListener != null) mListener.onRequestChoosePosition(onComplete);
+ }
+
+ private void sendOnDataSaved() {
+ if (this.mListener != null) mListener.onDataSaved();
+ }
+
+ public void setListener(Listener listener) {
+ this.mListener = listener;
+ }
+
+
+ public interface Listener extends ILoadingListener {
+ void onError(Exception ex);
+
+ void onInventoriesLoadingStarted();
+
+ void onInventoriesLoadingEnded();
+
+ void onInventoriesLoadingError(Exception ex);
+
+ void onRequestChoosePosition(RunnableArgs onComplete);
+
+ void onDataSaved();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dialogs/info_giacenza/DialogInfoGiacenzaComponent.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dialogs/info_giacenza/DialogInfoGiacenzaComponent.java
new file mode 100644
index 00000000..d5db6752
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dialogs/info_giacenza/DialogInfoGiacenzaComponent.java
@@ -0,0 +1,14 @@
+package it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dialogs.info_giacenza;
+
+import dagger.Subcomponent;
+
+@Subcomponent
+public interface DialogInfoGiacenzaComponent {
+
+ @Subcomponent.Factory
+ interface Factory {
+ DialogInfoGiacenzaComponent create();
+ }
+
+ void inject(DialogInfoGiacenzaView dialogInfoGiacenzaView);
+}
\ No newline at end of file
diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dialogs/info_giacenza/DialogInfoGiacenzaModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dialogs/info_giacenza/DialogInfoGiacenzaModule.java
new file mode 100644
index 00000000..b978eabf
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dialogs/info_giacenza/DialogInfoGiacenzaModule.java
@@ -0,0 +1,14 @@
+package it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dialogs.info_giacenza;
+
+import dagger.Module;
+import dagger.Provides;
+
+@Module(subcomponents = DialogInfoGiacenzaComponent.class)
+public class DialogInfoGiacenzaModule {
+
+ @Provides
+ DialogInfoGiacenzaViewModel providesDialogInfoGiacenzaViewModel() {
+ return new DialogInfoGiacenzaViewModel();
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dialogs/info_giacenza/DialogInfoGiacenzaView.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dialogs/info_giacenza/DialogInfoGiacenzaView.java
new file mode 100644
index 00000000..4bbb9f6c
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dialogs/info_giacenza/DialogInfoGiacenzaView.java
@@ -0,0 +1,94 @@
+package it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dialogs.info_giacenza;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.annimon.stream.Stream;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+import com.ravikoradiya.liveadapter.LiveAdapter;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import it.integry.integrywmsnative.BR;
+import it.integry.integrywmsnative.MainApplication;
+import it.integry.integrywmsnative.R;
+import it.integry.integrywmsnative.core.expansion.BaseDialogFragment;
+import it.integry.integrywmsnative.core.model.MvwSitArtUdcDetInventario;
+import it.integry.integrywmsnative.databinding.DialogInfoGiacenzaBinding;
+import it.integry.integrywmsnative.gest.spedizione.dialogs.row_info.info_situazione_articolo.ui.DialogInfoSituazioneArticoloAvailableListItem;
+
+public class DialogInfoGiacenzaView extends BaseDialogFragment {
+ @Inject
+ DialogInfoGiacenzaViewModel mViewModel;
+
+ private DialogInfoGiacenzaBinding mBindings;
+ private Context mContext;
+ private List item;
+
+ public static DialogInfoGiacenzaView newInstance(List item) {
+ return new DialogInfoGiacenzaView(item);
+ }
+
+ public DialogInfoGiacenzaView(List item) {
+ this.item = item;
+ }
+
+ @NonNull
+ @Override
+ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+ this.mContext = requireContext();
+
+ mBindings = DialogInfoGiacenzaBinding.inflate(LayoutInflater.from(this.mContext), null, false);
+ mBindings.setLifecycleOwner(this);
+
+ MainApplication.appComponent
+ .dialogInfoGiacenzaComponent()
+ .create()
+ .inject(this);
+
+ setCancelable(true);
+
+ var alertDialog = new MaterialAlertDialogBuilder(this.mContext)
+ .setView(mBindings.getRoot())
+ .setNeutralButton(R.string.action_close, null)
+ .setCancelable(isCancelable())
+ .create();
+
+ alertDialog.setCanceledOnTouchOutside(isCancelable());
+ alertDialog.setOnShowListener(this);
+ return alertDialog;
+ }
+
+ @Override
+ public void onShow(DialogInterface dialogInterface) {
+ super.onShow(dialogInterface);
+
+ this.onLoadingStarted();
+
+ this.initAvailableItemsList(item);
+
+ this.onLoadingEnded();
+ }
+
+ private void initAvailableItemsList(List availableItems) {
+ if(availableItems == null || availableItems.isEmpty())
+ return;
+
+ var itemList = Stream.of(availableItems)
+ .map(DialogInfoSituazioneArticoloAvailableListItem::fromMvwSitArtUdcDetInventario)
+ .toList();
+
+ new LiveAdapter(itemList, BR.item)
+ .map(DialogInfoSituazioneArticoloAvailableListItem.class, R.layout.dialog_info_giacenza_list_item)
+ .into(this.mBindings.availableList);
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dialogs/info_giacenza/DialogInfoGiacenzaViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dialogs/info_giacenza/DialogInfoGiacenzaViewModel.java
new file mode 100644
index 00000000..dca6b0a1
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dialogs/info_giacenza/DialogInfoGiacenzaViewModel.java
@@ -0,0 +1,5 @@
+package it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dialogs.info_giacenza;
+
+public class DialogInfoGiacenzaViewModel {
+
+}
\ No newline at end of file
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
new file mode 100644
index 00000000..11ea91a8
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dto/ArtsInGiacenzaDTO.java
@@ -0,0 +1,95 @@
+package it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dto;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import it.integry.integrywmsnative.core.model.MvwSitArtUdcDetInventario;
+
+public class ArtsInGiacenzaDTO {
+
+ private String codMart;
+ private String partitaMag;
+ private String descrizione;
+ private String posizione;
+ private BigDecimal numCnf;
+ private Integer numOrd;
+ private Integer count;
+ private List mvwSitArtUdcDetInventarioDTO;
+
+ public String getCodMart() {
+ return codMart;
+ }
+
+ public ArtsInGiacenzaDTO setCodMart(String codMart) {
+ this.codMart = codMart;
+ return this;
+ }
+
+ public String getPartitaMag() {
+ return partitaMag;
+ }
+
+ public ArtsInGiacenzaDTO setPartitaMag(String partitaMag) {
+ this.partitaMag = partitaMag;
+ return this;
+ }
+
+ public String getPosizione() {
+ return posizione;
+ }
+
+ public ArtsInGiacenzaDTO setPosizione(String posizione) {
+ this.posizione = posizione;
+ return this;
+ }
+
+ public BigDecimal getNumCnf() {
+ return numCnf;
+ }
+
+ public ArtsInGiacenzaDTO setNumCnf(BigDecimal numCnf) {
+ this.numCnf = numCnf;
+ return this;
+ }
+
+ public Integer getCount() {
+ return count;
+ }
+
+ public ArtsInGiacenzaDTO setCount(Integer count) {
+ this.count = count;
+ return this;
+ }
+
+ public List getMvwSitArtUdcDetInventarioDTO() {
+ return mvwSitArtUdcDetInventarioDTO;
+ }
+
+ public ArtsInGiacenzaDTO setMvwSitArtUdcDetInventarioDTO(List mvwSitArtUdcDetInventarioDTO) {
+ this.mvwSitArtUdcDetInventarioDTO = mvwSitArtUdcDetInventarioDTO;
+ return this;
+ }
+
+ public String getDescrizione() {
+ return descrizione;
+ }
+
+ public ArtsInGiacenzaDTO setDescrizione(String descrizione) {
+ this.descrizione = descrizione;
+ return this;
+ }
+
+ public Integer getNumOrd() {
+ return numOrd;
+ }
+
+ public String getNumOrdS() {
+ if (numOrd == null) return "/";
+ return numOrd.toString();
+ }
+
+ public ArtsInGiacenzaDTO setNumOrd(Integer numOrd) {
+ this.numOrd = numOrd;
+ 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/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java
index fe02ceb5..e9e5703f 100644
--- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java
@@ -795,7 +795,7 @@ public class SpedizioneViewModel {
MtbColt refMtbColt = matchedItem.getRefMtbColt();
if (matchedItem.getMtbColts() != null && matchedItem.getMtbColts().size() == 1) {
refMtbColt = matchedItem.getMtbColts().get(0);
- } else if (matchedItem.getTempPickData().getSourceMtbColt() != null) {
+ } else if (matchedItem.getTempPickData() != null && matchedItem.getTempPickData().getSourceMtbColt() != null) {
refMtbColt = matchedItem.getTempPickData().getSourceMtbColt();
}
MtbColr refMtbColr = refMtbColt != null ? refMtbColt.getMtbColr().get(0) : null;
diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/ask_position_of_lu/DialogAskPositionOfLUView.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/ask_position_of_lu/DialogAskPositionOfLUView.java
index 1b889fb1..d6d538d5 100644
--- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/ask_position_of_lu/DialogAskPositionOfLUView.java
+++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/ask_position_of_lu/DialogAskPositionOfLUView.java
@@ -172,11 +172,12 @@ public class DialogAskPositionOfLUView extends BaseDialogFragment implements Dia
BarcodeManager.enable();
} else {
completedFlow = true;
+
+ BarcodeManager.enable();
if (onComplete != null)
onComplete.run(DialogConsts.Results.YES, foundPosizione);
dismiss();
- BarcodeManager.enable();
}
} else {
diff --git a/app/src/main/res/drawable/ic_production_line_produzione.xml b/app/src/main/res/drawable/ic_production_line_produzione.xml
new file mode 100644
index 00000000..c1c92a63
--- /dev/null
+++ b/app/src/main/res/drawable/ic_production_line_produzione.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/dialog_info_giacenza.xml b/app/src/main/res/layout/dialog_info_giacenza.xml
new file mode 100644
index 00000000..90228fbe
--- /dev/null
+++ b/app/src/main/res/layout/dialog_info_giacenza.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_info_giacenza_list_item.xml b/app/src/main/res/layout/dialog_info_giacenza_list_item.xml
new file mode 100644
index 00000000..f691706e
--- /dev/null
+++ b/app/src/main/res/layout/dialog_info_giacenza_list_item.xml
@@ -0,0 +1,213 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_prod_riposizionamento_da_prod.xml b/app/src/main/res/layout/fragment_prod_riposizionamento_da_prod.xml
new file mode 100644
index 00000000..aa105a21
--- /dev/null
+++ b/app/src/main/res/layout/fragment_prod_riposizionamento_da_prod.xml
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
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
new file mode 100644
index 00000000..228eb750
--- /dev/null
+++ b/app/src/main/res/layout/prod_riposizionamento_da_prod__list_item.xml
@@ -0,0 +1,247 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 02de1b79..230c471c 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -25,6 +25,7 @@
Rettifica spedizione
Inventario
Approvvig. linee prod.
+ Riposizionamento da prod.
Posizionamento merce
Errore
Ops
diff --git a/app/src/main/res/values/config.xml b/app/src/main/res/values/config.xml
index cb4d1d33..bd177288 100644
--- a/app/src/main/res/values/config.xml
+++ b/app/src/main/res/values/config.xml
@@ -22,6 +22,7 @@
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 1858e149..439ba2de 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -73,6 +73,7 @@
Inventory
Inventory
Production line requirements
+ Riposizionamento da prod.
Items placement
Free picking
Error
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
-
+