Refactoring ultimi arrivi fornitori

This commit is contained in:
Giuseppe Scorrano 2021-03-11 15:45:42 +01:00
parent ff448b36b9
commit 11903d1a34
10 changed files with 335 additions and 232 deletions

View File

@ -29,6 +29,8 @@ import it.integry.integrywmsnative.gest.spedizione.dialogs.row_info.prod_fabbiso
import it.integry.integrywmsnative.gest.spedizione.dialogs.row_info.prod_fabbisogno_linee_prod.DialogRowInfoProdFabbisognoLineeProdModule; import it.integry.integrywmsnative.gest.spedizione.dialogs.row_info.prod_fabbisogno_linee_prod.DialogRowInfoProdFabbisognoLineeProdModule;
import it.integry.integrywmsnative.gest.ultime_consegne_cliente.UltimeConsegneClienteComponent; import it.integry.integrywmsnative.gest.ultime_consegne_cliente.UltimeConsegneClienteComponent;
import it.integry.integrywmsnative.gest.ultime_consegne_cliente.UltimeConsegneClienteModule; import it.integry.integrywmsnative.gest.ultime_consegne_cliente.UltimeConsegneClienteModule;
import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.UltimiArriviFornitoreComponent;
import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.UltimiArriviFornitoreModule;
import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2Component; import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2Component;
import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2Module; import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2Module;
import it.integry.integrywmsnative.view.dialogs.scan_art.DialogScanArtComponent; import it.integry.integrywmsnative.view.dialogs.scan_art.DialogScanArtComponent;
@ -47,6 +49,7 @@ import it.integry.integrywmsnative.view.dialogs.scan_art.DialogScanArtModule;
SpedizioneModule.class, SpedizioneModule.class,
AccettazionePickingModule.class, AccettazionePickingModule.class,
UltimeConsegneClienteModule.class, UltimeConsegneClienteModule.class,
UltimiArriviFornitoreModule.class,
PickingResiModule.class, PickingResiModule.class,
OrdiniUscitaElencoModule.class, OrdiniUscitaElencoModule.class,
DialogInputQuantityV2Module.class, DialogInputQuantityV2Module.class,
@ -64,6 +67,7 @@ public interface MainApplicationComponent {
SpedizioneComponent.Factory spedizioneComponent(); SpedizioneComponent.Factory spedizioneComponent();
AccettazionePickingComponent.Factory accettazionePickingComponent(); AccettazionePickingComponent.Factory accettazionePickingComponent();
UltimeConsegneClienteComponent.Factory ultimeConsegneClienteComponent(); UltimeConsegneClienteComponent.Factory ultimeConsegneClienteComponent();
UltimiArriviFornitoreComponent.Factory ultimiArriviFornitoreComponent();
PickingResiComponent.Factory pickingResiComponent(); PickingResiComponent.Factory pickingResiComponent();
OrdiniUscitaElencoComponent.Factory prodOrdineLavorazioneElencoComponent(); OrdiniUscitaElencoComponent.Factory prodOrdineLavorazioneElencoComponent();
DialogInputQuantityV2Component.Factory dialogInputQuantityV2Component(); DialogInputQuantityV2Component.Factory dialogInputQuantityV2Component();

View File

@ -174,20 +174,8 @@ public class UltimeConsegneClienteViewModel {
if (this.mListener != null) mListener.onError(ex); if (this.mListener != null) mListener.onError(ex);
} }
// private void sendOnOrderFiltered(List<OrdiniUscitaElencoDTO> filteredOrders) {
// if (this.mListener != null) mListener.onOrderFiltered(filteredOrders);
// }
//
// private void sendOnOrdersDispatched(List<OrdineUscitaInevasoDTO> orders, List<SitArtOrdDTO> sitArts, List<MtbColt> alreadyRegisteredMtbColts) {
// if (this.mListener != null) mListener.onOrdersDispatched(orders, sitArts, alreadyRegisteredMtbColts);
// }
public interface Listener extends ILoadingListener { public interface Listener extends ILoadingListener {
void onError(Exception ex); void onError(Exception ex);
// void onOrderFiltered(List<OrdiniUscitaElencoDTO> filteredOrders);
//
// void onOrdersDispatched(List<OrdineUscitaInevasoDTO> orders, List<SitArtOrdDTO> sitArts, List<MtbColt> alreadyRegisteredMtbColts);
} }
} }

View File

@ -9,7 +9,6 @@ import androidx.databinding.DataBindingUtil;
import androidx.databinding.ObservableArrayList; import androidx.databinding.ObservableArrayList;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.R;
@ -25,8 +24,6 @@ import it.integry.integrywmsnative.databinding.FragmentMainUltimeConsegneCliente
public class UltimeConsegneMainListAdapter extends ExtendedSectionedRecyclerView<DocumentoResoDTO, UltimeConsegneMainListAdapter.SubheaderHolder, UltimeConsegneMainListAdapter.SingleItemViewHolder> { public class UltimeConsegneMainListAdapter extends ExtendedSectionedRecyclerView<DocumentoResoDTO, UltimeConsegneMainListAdapter.SubheaderHolder, UltimeConsegneMainListAdapter.SingleItemViewHolder> {
private Context mContext; private Context mContext;
private ArrayList<String> mSectionTitleItems;
private RunnableArgs<DocumentoResoDTO> mOnSelectionChanged; private RunnableArgs<DocumentoResoDTO> mOnSelectionChanged;

View File

@ -0,0 +1,15 @@
package it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore;
import dagger.Subcomponent;
@Subcomponent
public interface UltimiArriviFornitoreComponent {
@Subcomponent.Factory
interface Factory{
UltimiArriviFornitoreComponent create();
}
void inject(UltimiArriviFornitoreFragment ultimiArriviFornitoreFragment);
}

View File

@ -7,41 +7,64 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatTextView; import androidx.appcompat.widget.AppCompatTextView;
import androidx.databinding.DataBindingUtil; import androidx.databinding.DataBindingUtil;
import androidx.databinding.ObservableArrayList;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.annimon.stream.Optional;
import com.annimon.stream.Stream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.inject.Inject;
import it.integry.integrywmsnative.MainApplication;
import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager;
import it.integry.integrywmsnative.core.expansion.BaseFragment;
import it.integry.integrywmsnative.core.interfaces.IFilterableFragment; import it.integry.integrywmsnative.core.interfaces.IFilterableFragment;
import it.integry.integrywmsnative.core.interfaces.IScrollableFragment; import it.integry.integrywmsnative.core.interfaces.IScrollableFragment;
import it.integry.integrywmsnative.core.interfaces.ITitledFragment; import it.integry.integrywmsnative.core.interfaces.ITitledFragment;
import it.integry.integrywmsnative.core.model.GtbAnag;
import it.integry.integrywmsnative.core.rest.model.DocumentoResoDTO;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityExceptions;
import it.integry.integrywmsnative.databinding.FragmentUltimiArriviFornitoreBinding; import it.integry.integrywmsnative.databinding.FragmentUltimiArriviFornitoreBinding;
import it.integry.integrywmsnative.gest.picking_resi.PickingResiActivity;
import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.core.UltimiArriviFornitoreListAdapter;
import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.core.UltimiArriviFornitoreViewModel; import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.core.UltimiArriviFornitoreViewModel;
import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.dialog.DialogUltimiArriviFornitoreFiltroAvanzato;
import it.integry.integrywmsnative.ui.ElevatedToolbar; import it.integry.integrywmsnative.ui.ElevatedToolbar;
/** /**
* A simple {@link Fragment} subclass. * A simple {@link Fragment} subclass.
*/ */
public class UltimiArriviFornitoreFragment extends Fragment implements ITitledFragment, IScrollableFragment, IFilterableFragment { public class UltimiArriviFornitoreFragment extends BaseFragment implements ITitledFragment, IScrollableFragment, IFilterableFragment, UltimiArriviFornitoreViewModel.Listener {
private final List<Runnable> mOnPreDestroyList = new ArrayList<>(); private final List<Runnable> mOnPreDestroyList = new ArrayList<>();
private ElevatedToolbar mToolbar; private ElevatedToolbar mToolbar;
private UltimiArriviFornitoreViewModel mViewModel; private int barcodeScannerIstanceID = -1;
private final ObservableArrayList<DocumentoResoDTO> mDocumentiMutableData = new ObservableArrayList<>();
@Inject
UltimiArriviFornitoreViewModel mViewModel;
private FragmentUltimiArriviFornitoreBinding mBindings;
private DialogUltimiArriviFornitoreFiltroAvanzato.DialogUltimiArriviFiltroAvanzatoViewModel mAppliedFilterViewModel;
public UltimiArriviFornitoreFragment() { public UltimiArriviFornitoreFragment() {
// Required empty public constructor // Required empty public constructor
} }
public static UltimiArriviFornitoreFragment newInstance() { public static UltimiArriviFornitoreFragment newInstance() {
UltimiArriviFornitoreFragment fragment = new UltimiArriviFornitoreFragment(); return new UltimiArriviFornitoreFragment();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
} }
@ -49,18 +72,134 @@ public class UltimiArriviFornitoreFragment extends Fragment implements ITitledFr
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
// Inflate the layout for this fragment // Inflate the layout for this fragment
FragmentUltimiArriviFornitoreBinding mBinding = DataBindingUtil.inflate(LayoutInflater.from(getActivity()), R.layout.fragment_ultimi_arrivi_fornitore, container, false); mBindings = DataBindingUtil.inflate(LayoutInflater.from(getActivity()), R.layout.fragment_ultimi_arrivi_fornitore, container, false);
mViewModel = new UltimiArriviFornitoreViewModel(getActivity(), mBinding); MainApplication.appComponent
.ultimiArriviFornitoreComponent()
.create()
.inject(this);
mBinding.setViewmodel(mViewModel); mViewModel.setListener(this);
mToolbar.setRecyclerView(mBinding.recyclerView); mBindings.setLifecycleOwner(this);
mBindings.setView(this);
mBindings.setViewmodel(mViewModel);
this.initRecyclerView();
// Inflate the layout for this fragment // Inflate the layout for this fragment
return mBinding.getRoot(); return mBindings.getRoot();
} }
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep();
mViewModel.init(codMdep);
this.mBindings.mainFab.hide();
this.mBindings.mainFab.setOnClickListener(v -> {
dispatchConsegne();
});
this.mViewModel.getDocuments().observe(this, this::refreshList);
openFilterDialog();
}
public void openFilterDialog() {
this.mViewModel.loadCodAnagFornitori(gtbAnags -> {
DialogUltimiArriviFornitoreFiltroAvanzato.make(getActivity(), gtbAnags, mAppliedFilterViewModel, (filter) -> {
mAppliedFilterViewModel = filter;
refreshItems();
}).show();
});
}
private void initRecyclerView() {
UltimiArriviFornitoreListAdapter mAdapter =
new UltimiArriviFornitoreListAdapter(getActivity(), mDocumentiMutableData);
mAdapter.setOnSelectionChanged(this::onSingleSelectionChanged);
mAdapter.setEmptyView(mBindings.emptyView);
mBindings.recyclerView.setHasFixedSize(true);
mBindings.recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mBindings.recyclerView.setAdapter(mAdapter);
// mBindings.fastscroll.setRecyclerView(mBindings.recyclerView);
if (mToolbar != null)
mToolbar.setRecyclerView(mBindings.recyclerView);
}
private void refreshList(List<DocumentoResoDTO> documentList) {
this.mDocumentiMutableData.clear();
this.mDocumentiMutableData.addAll(sort(documentList));
}
private void refreshItems() {
this.openProgress();
String currentAnagFilter = mAppliedFilterViewModel != null ? mAppliedFilterViewModel.ragSoc.get() : null;
String currentCodAnagFilter = null;
Optional<GtbAnag> singleGtbAnag = Stream.of(mViewModel.getGtbAnagClienti().getValue())
.filter(x -> (x.getCodAnag() + " - " + x.getRagSoc()).equals(currentAnagFilter))
.findSingle();
if (singleGtbAnag.isPresent()) {
currentCodAnagFilter = singleGtbAnag.get().getCodAnag();
}
this.mViewModel.loadArriviFornitori(currentCodAnagFilter,
null,
-1,
365);
}
private List<DocumentoResoDTO> sort(List<DocumentoResoDTO> dataset) {
List<DocumentoResoDTO> items = Stream.of(dataset)
.sortBy(DocumentoResoDTO::getRagSoc)
.toList();
return items;
}
private void onSingleSelectionChanged(DocumentoResoDTO dto) {
List<DocumentoResoDTO> selectedOrders = getSelectedItems();
if(dto.isSelected()) {
Stream.of(selectedOrders)
.filter(x -> !x.getRagSoc().equalsIgnoreCase(dto.getRagSoc()))
.forEach(x -> x.setSelected(false));
}
if(selectedOrders != null && selectedOrders.size() > 0) {
mBindings.mainFab.show();
}
else {
mBindings.mainFab.hide();
}
}
private List<DocumentoResoDTO> getSelectedItems() {
return Stream.of(this.mDocumentiMutableData)
.filter(DocumentoResoDTO::isSelected)
.toList();
}
private void dispatchConsegne() {
List<DocumentoResoDTO> selectedConsegne = getSelectedItems();
PickingResiActivity.startActivity(getActivity(), getActivity().getText(R.string.ultime_arrivi_fornitore_title).toString(), selectedConsegne, -1);
}
@Override @Override
public void onDestroy() { public void onDestroy() {
for (Runnable onPreDestroy : mOnPreDestroyList) { for (Runnable onPreDestroy : mOnPreDestroyList) {
@ -80,12 +219,9 @@ public class UltimiArriviFornitoreFragment extends Fragment implements ITitledFr
} }
@Override @Override
public void onFilterClick() { public void onFilterClick() {
mViewModel.openFilterDialog(); openFilterDialog();
} }
@ -93,4 +229,23 @@ public class UltimiArriviFornitoreFragment extends Fragment implements ITitledFr
public void addOnPreDestroy(Runnable onPreDestroy) { public void addOnPreDestroy(Runnable onPreDestroy) {
this.mOnPreDestroyList.add(onPreDestroy); this.mOnPreDestroyList.add(onPreDestroy);
} }
@Override
public void onLoadingStarted() {
BarcodeManager.disable();
this.openProgress();
}
@Override
public void onLoadingEnded() {
this.closeProgress();
BarcodeManager.enable();
}
@Override
public void onError(Exception ex) {
this.closeProgress();
UtilityExceptions.defaultException(getActivity(), ex, mCurrentProgress);
BarcodeManager.enable();
}
} }

View File

@ -0,0 +1,30 @@
package it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore;
import javax.inject.Singleton;
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.SystemRESTConsumer;
import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.core.UltimiArriviFornitoreViewModel;
import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.rest.UltimiArriviFornitoreRESTConsumer;
@Module(subcomponents = UltimiArriviFornitoreComponent.class)
public class UltimiArriviFornitoreModule {
@Singleton
@Provides
UltimiArriviFornitoreRESTConsumer providesUltimiArriviFornitoreRESTConsumer(SystemRESTConsumer systemRESTConsumer) {
return new UltimiArriviFornitoreRESTConsumer(systemRESTConsumer);
}
@Provides
UltimiArriviFornitoreViewModel providesUltimiArriviFornitoreViewModel(
UltimiArriviFornitoreRESTConsumer ultimiArriviFornitoreRESTConsumer,
BarcodeRESTConsumer barcodeRESTConsumer,
ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer) {
return new UltimiArriviFornitoreViewModel(ultimiArriviFornitoreRESTConsumer, barcodeRESTConsumer, colliMagazzinoRESTConsumer);
}
}

View File

@ -6,38 +6,29 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.databinding.DataBindingUtil; import androidx.databinding.DataBindingUtil;
import androidx.databinding.ObservableArrayList;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.annimon.stream.Stream;
import com.zhukic.sectionedrecyclerview.SectionedRecyclerViewAdapter;
import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.List; import java.util.List;
import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.rest.model.DocumentoResoDTO;
import it.integry.integrywmsnative.core.expansion.RunnableArgs; import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.expansion.view.ExtendedSectionedRecyclerView;
import it.integry.integrywmsnative.core.rest.model.DocumentoResoDTO;
import it.integry.integrywmsnative.core.utility.UtilityDate; import it.integry.integrywmsnative.core.utility.UtilityDate;
import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.core.utility.UtilityExceptions;
import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.core.utility.UtilityString;
import it.integry.integrywmsnative.databinding.FragmentUltimiArriviFornitoreListHeaderBinding; import it.integry.integrywmsnative.databinding.FragmentUltimiArriviFornitoreListHeaderBinding;
import it.integry.integrywmsnative.databinding.FragmentUltimiArriviFornitoreListSingleItemBinding; import it.integry.integrywmsnative.databinding.FragmentUltimiArriviFornitoreListSingleItemBinding;
import it.integry.integrywmsnative.ui.fastscroll.SectionTitleProvider;
public class UltimiArriviFornitoreListAdapter extends SectionedRecyclerViewAdapter<UltimiArriviFornitoreListAdapter.SubheaderHolder, UltimiArriviFornitoreListAdapter.SingleItemViewHolder> implements SectionTitleProvider { public class UltimiArriviFornitoreListAdapter extends ExtendedSectionedRecyclerView<DocumentoResoDTO,
UltimiArriviFornitoreListAdapter.SubheaderHolder,
UltimiArriviFornitoreListAdapter.SingleItemViewHolder> {
private Context mContext; private Context mContext;
private List<DocumentoResoDTO> mDataset;
private ArrayList<String> mSectionTitleItems;
private RunnableArgs<DocumentoResoDTO> mOnSelectionChanged; private RunnableArgs<DocumentoResoDTO> mOnSelectionChanged;
@Override
public String getSectionTitle(int position) {
return mSectionTitleItems.get(position);
}
static class SubheaderHolder extends RecyclerView.ViewHolder { static class SubheaderHolder extends RecyclerView.ViewHolder {
@ -64,13 +55,9 @@ public class UltimiArriviFornitoreListAdapter extends SectionedRecyclerViewAdapt
public UltimiArriviFornitoreListAdapter(Context context, ArrayList<DocumentoResoDTO> dataset) { public UltimiArriviFornitoreListAdapter(Context context, ObservableArrayList<DocumentoResoDTO> mutableDataSet) {
super(); super(mutableDataSet);
this.mContext = context; this.mContext = context;
this.mDataset = new ArrayList<>();
this.mSectionTitleItems = new ArrayList<>();
mDataset.addAll(sort(dataset));
} }
@ -152,7 +139,7 @@ public class UltimiArriviFornitoreListAdapter extends SectionedRecyclerViewAdapt
public void updateItems(List<DocumentoResoDTO> updatedDataset) { public void updateItems(List<DocumentoResoDTO> updatedDataset) {
mDataset.clear(); mDataset.clear();
mDataset.addAll(sort(updatedDataset)); mDataset.addAll(updatedDataset);
notifyDataSetChanged(); notifyDataSetChanged();
notifyDataChanged(); notifyDataChanged();
} }
@ -163,28 +150,5 @@ public class UltimiArriviFornitoreListAdapter extends SectionedRecyclerViewAdapt
} }
private List<DocumentoResoDTO> sort(List<DocumentoResoDTO> dataset) {
List<DocumentoResoDTO> items = Stream.of(dataset)
.sortBy(DocumentoResoDTO::getRagSoc)
.toList();
Stream.of(items)
.map(DocumentoResoDTO::getRagSoc)
.distinct()
.forEach(x -> {
this.mSectionTitleItems.add(String.valueOf(x.charAt(0)));
long count = Stream.of(dataset)
.filter(y -> y.getRagSoc().equalsIgnoreCase(x))
.count();
for(int i = 0; i < count; i++) this.mSectionTitleItems.add(String.valueOf(x.charAt(0)));
});
return items;
}
} }

View File

@ -1,154 +1,105 @@
package it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.core; package it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.core;
import android.app.Dialog; import androidx.lifecycle.MutableLiveData;
import android.content.Context;
import android.view.View;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.annimon.stream.Optional;
import com.annimon.stream.Stream;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import it.integry.integrywmsnative.R; import javax.inject.Inject;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingListener;
import it.integry.integrywmsnative.core.model.GtbAnag; import it.integry.integrywmsnative.core.model.GtbAnag;
import it.integry.integrywmsnative.core.rest.consumers.BarcodeRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer;
import it.integry.integrywmsnative.core.rest.model.DocumentoResoDTO; import it.integry.integrywmsnative.core.rest.model.DocumentoResoDTO;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityExceptions;
import it.integry.integrywmsnative.core.utility.UtilityProgress;
import it.integry.integrywmsnative.databinding.FragmentUltimiArriviFornitoreBinding;
import it.integry.integrywmsnative.gest.picking_resi.PickingResiActivity;
import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.dialog.DialogUltimiArriviFornitoreFiltroAvanzato;
import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.rest.UltimiArriviFornitoreRESTConsumer; import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.rest.UltimiArriviFornitoreRESTConsumer;
public class UltimiArriviFornitoreViewModel { public class UltimiArriviFornitoreViewModel {
private Context mContext; private final MutableLiveData<List<GtbAnag>> mGtbAnagClienti = new MutableLiveData<>();
private FragmentUltimiArriviFornitoreBinding mBinding; private final MutableLiveData<List<DocumentoResoDTO>> mDocuments = new MutableLiveData<>();
private List<DocumentoResoDTO> mItems; private final UltimiArriviFornitoreRESTConsumer mUltimiArriviFornitoreRESTConsumer;
private List<DocumentoResoDTO> mRenderedItems = new ArrayList<>(); private final BarcodeRESTConsumer mBarcodeRESTConsumer;
private final ColliMagazzinoRESTConsumer mColliMagazzinoRESTConsumer;
private List<GtbAnag> mAvailableGtbAnags = null; private Listener mListener;
private UltimiArriviFornitoreListAdapter mAdapter; private String mCodMdep;
private DialogUltimiArriviFornitoreFiltroAvanzato.DialogUltimiArriviFiltroAvanzatoViewModel mAppliedFilterViewModel; @Inject
public UltimiArriviFornitoreViewModel(
UltimiArriviFornitoreRESTConsumer ultimiArriviFornitoreRESTConsumer,
BarcodeRESTConsumer barcodeRESTConsumer,
ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer) {
this.mUltimiArriviFornitoreRESTConsumer = ultimiArriviFornitoreRESTConsumer;
this.mBarcodeRESTConsumer = barcodeRESTConsumer;
this.mColliMagazzinoRESTConsumer = colliMagazzinoRESTConsumer;
}
public UltimiArriviFornitoreViewModel(Context context, FragmentUltimiArriviFornitoreBinding binding) {
this.mContext = context;
this.mBinding = binding;
this.mBinding.mainFab.hide(); public void init(String codMdep) {
this.mBinding.mainFab.setOnClickListener(v -> { this.mCodMdep = codMdep;
dispatchConsegne(); }
});
openFilterDialog();
public void loadCodAnagFornitori(RunnableArgs<List<GtbAnag>> onComplete) {
this.sendOnLoadingStarted();
this.mUltimiArriviFornitoreRESTConsumer.getAvailableCodAnagFornitori(gtbAnags -> {
mGtbAnagClienti.postValue(gtbAnags);
this.sendOnLoadingEnded();
onComplete.run(gtbAnags);
}, this::sendError);
}
public void loadArriviFornitori(String codAnag, String codMart, int limitDocsForCli, int limitDays) {
this.sendOnLoadingStarted();
this.mUltimiArriviFornitoreRESTConsumer.getUltimeConsegneFornitori(mCodMdep, codAnag, codMart, limitDocsForCli, limitDays, documentList -> {
this.mDocuments.postValue(documentList);
this.sendOnLoadingEnded();
}, this::sendError);
} }
private void initDataAdapter(ArrayList<DocumentoResoDTO> dataset) {
mAdapter = new UltimiArriviFornitoreListAdapter(mContext, dataset);
mAdapter.setOnSelectionChanged(this::onSingleSelectionChanged);
mBinding.recyclerView.setHasFixedSize(true);
mBinding.recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
mBinding.recyclerView.setAdapter(mAdapter);
mBinding.fastscroll.setRecyclerView(mBinding.recyclerView);
public MutableLiveData<List<GtbAnag>> getGtbAnagClienti() {
return mGtbAnagClienti;
} }
public MutableLiveData<List<DocumentoResoDTO>> getDocuments() {
public void openFilterDialog() { return mDocuments;
Dialog progressDialog = UtilityProgress.createDefaultProgressDialog(mContext);
UltimiArriviFornitoreRESTConsumer.getAvailableCodAnagFornitori(gtbAnags -> {
mAvailableGtbAnags = gtbAnags;
progressDialog.dismiss();
DialogUltimiArriviFornitoreFiltroAvanzato.make(mContext, mAvailableGtbAnags, mAppliedFilterViewModel, (filter) -> {
mAppliedFilterViewModel = filter;
refreshItems();
}).show();
}, ex -> {
UtilityExceptions.defaultException(mContext, ex, progressDialog);
});
} }
public UltimiArriviFornitoreViewModel setListener(UltimiArriviFornitoreViewModel.Listener listener) {
private void dispatchConsegne() { this.mListener = listener;
List<DocumentoResoDTO> selectedConsegne = getSelectedItems(); return this;
PickingResiActivity.startActivity(mContext, mContext.getText(R.string.ultime_arrivi_fornitore_title).toString(), selectedConsegne, -1);
} }
private List<DocumentoResoDTO> getSelectedItems() { private void sendOnLoadingStarted() {
return Stream.of(this.mItems) if (this.mListener != null) mListener.onLoadingStarted();
.filter(DocumentoResoDTO::isSelected)
.toList();
} }
private void sendOnLoadingEnded() {
private void refreshItems(){ if (this.mListener != null) mListener.onLoadingEnded();
Dialog progressDialog = UtilityProgress.createDefaultProgressDialog(mContext);
String currentAnagFilter = mAppliedFilterViewModel != null ? mAppliedFilterViewModel.ragSoc.get() : null;
String currentCodAnagFilter = null;
Optional<GtbAnag> singleGtbAnag = Stream.of(mAvailableGtbAnags)
.filter(x -> (x.getCodAnag() + " - " + x.getRagSoc()).equals(currentAnagFilter))
.findSingle();
if(singleGtbAnag.isPresent()) {
currentCodAnagFilter = singleGtbAnag.get().getCodAnag();
} }
private void sendError(Exception ex) {
UltimiArriviFornitoreRESTConsumer.getUltimeConsegneFornitori( if (this.mListener != null) mListener.onError(ex);
SettingsManager.i().getUserSession().getDepo().getCodMdep(),
currentCodAnagFilter,
null,
null,
365,
consegne -> {
this.mItems = consegne;
this.initDataAdapter(consegne);
mBinding.emptyView.setVisibility((this.mItems != null && this.mItems.size() > 0) ? View.GONE : View.VISIBLE);
mRenderedItems.clear();
if(this.mItems != null) mRenderedItems.addAll(this.mItems);
mAdapter.updateItems(mRenderedItems);
progressDialog.dismiss();
}, ex -> {
UtilityExceptions.defaultException(mContext, ex, progressDialog);
});
} }
public interface Listener extends ILoadingListener {
private void onSingleSelectionChanged(DocumentoResoDTO dto) { void onError(Exception ex);
List<DocumentoResoDTO> selectedOrders = getSelectedItems();
if(dto.isSelected()) {
Stream.of(selectedOrders)
.filter(x -> !x.getRagSoc().equalsIgnoreCase(dto.getRagSoc()))
.forEach(x -> x.setSelected(false));
}
if(selectedOrders != null && selectedOrders.size() > 0) {
mBinding.mainFab.show();
}
else {
mBinding.mainFab.hide();
}
} }
} }

View File

@ -6,42 +6,43 @@ import java.lang.reflect.Type;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import it.integry.integrywmsnative.core.model.GtbAnag; import javax.inject.Singleton;
import it.integry.integrywmsnative.core.rest.consumers.ISimpleOperationCallback;
import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.utility.UtilityDB;
import it.integry.integrywmsnative.core.rest.model.DocumentoResoDTO;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.model.GtbAnag;
import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer;
import it.integry.integrywmsnative.core.rest.model.DocumentoResoDTO;
import it.integry.integrywmsnative.core.utility.UtilityDB;
@Singleton
public class UltimiArriviFornitoreRESTConsumer { public class UltimiArriviFornitoreRESTConsumer {
public static void getAvailableCodAnagFornitori(RunnableArgs<List<GtbAnag>> onComplete, RunnableArgs<Exception> onFailed) { private final SystemRESTConsumer systemRESTConsumer;
public UltimiArriviFornitoreRESTConsumer(SystemRESTConsumer systemRESTConsumer) {
this.systemRESTConsumer = systemRESTConsumer;
}
public void getAvailableCodAnagFornitori(RunnableArgs<List<GtbAnag>> onComplete, RunnableArgs<Exception> onFailed) {
String sql = "SELECT DISTINCT gtb_anag.cod_anag, gtb_anag.rag_soc " + String sql = "SELECT DISTINCT gtb_anag.cod_anag, gtb_anag.rag_soc " +
"FROM gtb_anag " + "FROM gtb_anag " +
"INNER JOIN atb_forn ON atb_forn.cod_anag = gtb_anag.cod_anag " + "INNER JOIN atb_forn ON atb_forn.cod_anag = gtb_anag.cod_anag " +
"WHERE flag_stato = 'A'"; "WHERE flag_stato = 'A'";
Type typeOfObjectsList = new TypeToken<ArrayList<GtbAnag>>() {}.getType(); Type typeOfObjectsList = new TypeToken<ArrayList<GtbAnag>>() {
SystemRESTConsumer.processSqlStatic(sql, typeOfObjectsList, new ISimpleOperationCallback<ArrayList<GtbAnag>>() { }.getType();
@Override this.systemRESTConsumer.<ArrayList<GtbAnag>>processSql(sql, typeOfObjectsList, value -> {
public void onSuccess(ArrayList<GtbAnag> value) {
if (onComplete != null) onComplete.run(value); if (onComplete != null) onComplete.run(value);
} }, ex -> {
@Override
public void onFailed(Exception ex) {
if (onFailed != null) onFailed.run(ex); if (onFailed != null) onFailed.run(ex);
}
}); });
} }
public static void getUltimeConsegneFornitori(String codMdep, String codAnag, String codMart, Integer limitConsegnePerCli, int limitDays, RunnableArgs<ArrayList<DocumentoResoDTO>> onComplete, RunnableArgs<Exception> onFailed) { public void getUltimeConsegneFornitori(String codMdep, String codAnag, String codMart, int limitConsegnePerCli, int limitDays, RunnableArgs<ArrayList<DocumentoResoDTO>> onComplete, RunnableArgs<Exception> onFailed) {
String sql = "SELECT consegne.*, " + String sql = "SELECT consegne.*, " +
" rag_soc " + " rag_soc " +
"FROM WMS_GetUltimeConsegneFornitori(" + "FROM WMS_GetUltimeConsegneFornitori(" +
UtilityDB.valueToString(limitConsegnePerCli) + ", " + UtilityDB.valueToString(limitConsegnePerCli >= 0 ? limitConsegnePerCli : null) + ", " +
UtilityDB.valueToString(codAnag) + ", " + UtilityDB.valueToString(codAnag) + ", " +
UtilityDB.valueToString(codMart) + ", " + UtilityDB.valueToString(codMart) + ", " +
UtilityDB.valueToString(codMdep) + ", " + UtilityDB.valueToString(codMdep) + ", " +
@ -52,16 +53,10 @@ public class UltimiArriviFornitoreRESTConsumer {
Type typeOfObjectsList = new TypeToken<ArrayList<DocumentoResoDTO>>() {}.getType(); Type typeOfObjectsList = new TypeToken<ArrayList<DocumentoResoDTO>>() {}.getType();
SystemRESTConsumer.processSqlStatic(sql, typeOfObjectsList, new ISimpleOperationCallback<ArrayList<DocumentoResoDTO>>() { this.systemRESTConsumer.<ArrayList<DocumentoResoDTO>>processSql(sql, typeOfObjectsList, value -> {
@Override
public void onSuccess(ArrayList<DocumentoResoDTO> value) {
if (onComplete != null) onComplete.run(value); if (onComplete != null) onComplete.run(value);
} }, ex -> {
@Override
public void onFailed(Exception ex) {
if (onFailed != null) onFailed.run(ex); if (onFailed != null) onFailed.run(ex);
}
}); });
} }

View File

@ -4,6 +4,10 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<data> <data>
<variable
name="view"
type="it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.UltimiArriviFornitoreFragment" />
<variable <variable
name="viewmodel" name="viewmodel"
type="it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.core.UltimiArriviFornitoreViewModel" /> type="it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.core.UltimiArriviFornitoreViewModel" />
@ -29,12 +33,12 @@
android:scrollbars="none" android:scrollbars="none"
android:paddingEnd="4dp"/> android:paddingEnd="4dp"/>
<it.integry.integrywmsnative.ui.fastscroll.FastScroller <!-- <it.integry.integrywmsnative.ui.fastscroll.FastScroller-->
android:id="@+id/fastscroll" <!-- android:id="@+id/fastscroll"-->
android:orientation="vertical" <!-- android:orientation="vertical"-->
android:layout_width="wrap_content" <!-- android:layout_width="wrap_content"-->
android:layout_height="match_parent" <!-- android:layout_height="match_parent"-->
android:layout_alignParentEnd="true"/> <!-- android:layout_alignParentEnd="true"/>-->
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout