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