diff --git a/app/build.gradle b/app/build.gradle index 6d538635..f5d04728 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ apply plugin: 'com.google.gms.google-services' android { - def appVersionCode = 416 - def appVersionName = '1.39.03' + def appVersionCode = 417 + def appVersionName = '1.40.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 586a56b5..b0b4f000 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java @@ -29,6 +29,8 @@ import it.integry.integrywmsnative.gest.contab_doc_interni.edit_form.dialog.sele import it.integry.integrywmsnative.gest.contab_doc_interni.edit_form.dialog.selectDocRows.DialogSelectDocRowsModule; import it.integry.integrywmsnative.gest.contenuto_bancale.ContenutoBancaleComponent; import it.integry.integrywmsnative.gest.contenuto_bancale.ContenutoBancaleModule; +import it.integry.integrywmsnative.gest.articoli_in_giacenza.ArticoliInGiacenzaComponent; +import it.integry.integrywmsnative.gest.articoli_in_giacenza.ArticoliInGiacenzaModule; import it.integry.integrywmsnative.gest.inventario.ElencoInventariComponent; import it.integry.integrywmsnative.gest.inventario.ElencoInventariModule; import it.integry.integrywmsnative.gest.inventario.bottom_sheet__inventario_actions.BottomSheetInventarioActionsComponent; @@ -206,7 +208,8 @@ import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCr DialogInfoAggiuntiveLUModule.class, DialogAskLineaProdModule.class, ProdRiposizionamentoDaProdModule.class, - DialogInfoGiacenzaModule.class + DialogInfoGiacenzaModule.class, + ArticoliInGiacenzaModule.class }) public interface MainApplicationComponent { @@ -346,6 +349,8 @@ public interface MainApplicationComponent { DialogInfoGiacenzaComponent.Factory dialogInfoGiacenzaComponent(); + ArticoliInGiacenzaComponent.Factory controlloGiacenzeComponent(); + 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 04d06c80..f8f01b4c 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 @@ -5,6 +5,7 @@ import it.integry.integrywmsnative.core.model.secondary.GestioneEnum; import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.gest.accettazione_bolla_elenco.MainAccettazioneBollaElencoFragment; import it.integry.integrywmsnative.gest.accettazione_ordini_elenco.MainAccettazioneOrdiniElencoFragment; +import it.integry.integrywmsnative.gest.articoli_in_giacenza.ArticoliInGiacenzaFragment; import it.integry.integrywmsnative.gest.contab_doc_interni.DocInterniFragment; import it.integry.integrywmsnative.gest.inventario.ElencoInventariFragment; import it.integry.integrywmsnative.gest.ordini_uscita_elenco.OrdiniUscitaElencoFragment; @@ -218,6 +219,13 @@ public class MenuConfiguration extends BaseMenuConfiguration { .setDrawerIcon(R.drawable.ic_black_empty_box) .setFragmentFactory(ElencoInventariFragment::newInstance)) + .addItem(new MenuItem() + .setID(R.id.nav_articoli_in_giacenza) + .setCodMenu("MG070") + .setTitleText(R.string.articoli_in_giacenza_title) + .setTitleIcon(R.drawable.ic_dashboard_articoli_in_giacenza) + .setDrawerIcon(R.drawable.ic_black_empty_box) + .setFragmentFactory(ArticoliInGiacenzaFragment::newInstance)) ).addGroup( new MenuGroup() 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 dcaaa84a..189a8ac4 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 @@ -4,6 +4,8 @@ import java.math.BigDecimal; import java.time.LocalDate; import it.integry.integrywmsnative.core.utility.UtilityDate; +import it.integry.integrywmsnative.core.utility.UtilityNumber; +import it.integry.integrywmsnative.core.utility.UtilityString; /** * Created by ValerioC on 06/03/2018. @@ -292,6 +294,12 @@ public class MvwSitArtUdcDetInventario { return this; } + public String getQtaText(){ + String text = UtilityNumber.decimalToString(this.qtaCol); + text += !UtilityString.isNullOrEmpty(this.untMis) ? "\n" + this.untMis : ""; + return text; + } + 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 01b67698..acb51b71 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 @@ -41,27 +41,31 @@ public class GiacenzaRESTConsumer extends _BaseRESTConsumer { public void onResponse(Call>> call, Response>> response) { analyzeAnswer(response, "getGiacenzeInPosizione", inventarioList -> { - List codMarts = Stream.of(inventarioList) - .map(x -> x.getCodMart().trim()) - .toList(); + if(inventarioList != null && !inventarioList.isEmpty()){ + List codMarts = Stream.of(inventarioList) + .map(x -> x.getCodMart().trim()) + .toList(); - mArticoloRESTConsumer.getByCodMarts(codMarts, mtbAarts -> { - for (var row : inventarioList) { + mArticoloRESTConsumer.getByCodMarts(codMarts, mtbAarts -> { + for (var row : inventarioList) { - MtbAart foundMtbAart = null; - Optional mtbAartOpt = Stream.of(mtbAarts) - .filter(x -> x.getCodMart().equalsIgnoreCase(row.getCodMart())) - .findFirst(); + MtbAart foundMtbAart = null; + Optional mtbAartOpt = Stream.of(mtbAarts) + .filter(x -> x.getCodMart().equalsIgnoreCase(row.getCodMart())) + .findFirst(); - if (mtbAartOpt.isPresent()) { - foundMtbAart = mtbAartOpt.get(); + if (mtbAartOpt.isPresent()) { + foundMtbAart = mtbAartOpt.get(); + } + + row.setMtbAart(foundMtbAart); } - row.setMtbAart(foundMtbAart); - } - - onComplete.run(inventarioList); - }, onFailed); + onComplete.run(inventarioList); + }, onFailed); + }else{ + onComplete.run(new ArrayList<>()); + } }, onFailed); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/articoli_in_giacenza/ArticoliInGiacenzaComponent.java b/app/src/main/java/it/integry/integrywmsnative/gest/articoli_in_giacenza/ArticoliInGiacenzaComponent.java new file mode 100644 index 00000000..e4fd2f28 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/articoli_in_giacenza/ArticoliInGiacenzaComponent.java @@ -0,0 +1,14 @@ +package it.integry.integrywmsnative.gest.articoli_in_giacenza; + +import dagger.Subcomponent; + +@Subcomponent +public interface ArticoliInGiacenzaComponent { + + @Subcomponent.Factory + interface Factory { + ArticoliInGiacenzaComponent create(); + } + + void inject(ArticoliInGiacenzaFragment ControlloGiacenzeFragment); +} \ No newline at end of file diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/articoli_in_giacenza/ArticoliInGiacenzaFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/articoli_in_giacenza/ArticoliInGiacenzaFragment.java new file mode 100644 index 00000000..6bb6d754 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/articoli_in_giacenza/ArticoliInGiacenzaFragment.java @@ -0,0 +1,139 @@ +package it.integry.integrywmsnative.gest.articoli_in_giacenza; + +import android.content.Context; +import android.os.Bundle; +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.ravikoradiya.liveadapter.LiveAdapter; +import com.ravikoradiya.liveadapter.Type; + +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.BaseFragment; +import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.interfaces.ITitledFragment; +import it.integry.integrywmsnative.core.model.MtbDepoPosizione; +import it.integry.integrywmsnative.core.model.MvwSitArtUdcDetInventario; +import it.integry.integrywmsnative.databinding.FragmentArticoliInGiacenzaBinding; +import it.integry.integrywmsnative.databinding.ListaGiacenzePerPosizioneModelBinding; +import it.integry.integrywmsnative.view.dialogs.DialogConsts; +import it.integry.integrywmsnative.view.dialogs.ask_position_of_lu.DialogAskPositionOfLUView; + +public class ArticoliInGiacenzaFragment extends BaseFragment implements ITitledFragment, ArticoliInGiacenzaViewModel.Listener { + @Inject + ArticoliInGiacenzaViewModel mViewModel; + private FragmentArticoliInGiacenzaBinding mBindings; + private final ObservableArrayList mItemsInventario = new ObservableArrayList<>(); + + public ArticoliInGiacenzaFragment() { + // Required empty public constructor + } + + public static ArticoliInGiacenzaFragment newInstance() { + return new ArticoliInGiacenzaFragment(); + } + + @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_articoli_in_giacenza, container, false); + + MainApplication.appComponent + .controlloGiacenzeComponent() + .create() + .inject(this); + + mViewModel.setListener(this); + mBindings.setLifecycleOwner(this); + mBindings.setView(this); + mBindings.setViewmodel(mViewModel); + + this.initRecyclerView(); + + return mBindings.getRoot(); + } + + private void initRecyclerView() { + mViewModel.getMvwSitArtUdcDetInventario().observe(getViewLifecycleOwner(), data -> { + mBindings.emptyView.setVisibility(data == null || data.isEmpty() ? View.VISIBLE : View.GONE); + + this.refreshList(null); + }); + + var itemType = new Type(R.layout.lista_giacenze_per_posizione_model, BR.item); + + new LiveAdapter(mItemsInventario) + .map(MvwSitArtUdcDetInventario.class, itemType) + .into(this.mBindings.inventarioList); + } + + public void refreshList(List filteredList) { + List tmpList; + + if (filteredList != null) { + tmpList = filteredList; + } else { + tmpList = mViewModel.getMvwSitArtUdcDetInventario().getValue(); + } + this.mItemsInventario.clear(); + if (tmpList != null) { + this.mItemsInventario.addAll(tmpList); + } + } + + 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 onCreateActionBar(AppCompatTextView titleText, Context context) { + titleText.setText(context.getText(R.string.articoli_in_giacenza_title).toString()); + } + + @Override + public void onStart() { + super.onStart(); + mViewModel.init(); + } + + @Override + public void onDestroy() { + mViewModel.setListener(null); + + for (Runnable onPreDestroy : mOnPreDestroyList) { + onPreDestroy.run(); + } + super.onDestroy(); + } + + @Override + public void onRequestChoosePosition(RunnableArgs onComplete) { + choosePosition(onComplete); + } +} \ No newline at end of file diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/articoli_in_giacenza/ArticoliInGiacenzaModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/articoli_in_giacenza/ArticoliInGiacenzaModule.java new file mode 100644 index 00000000..50602367 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/articoli_in_giacenza/ArticoliInGiacenzaModule.java @@ -0,0 +1,16 @@ +package it.integry.integrywmsnative.gest.articoli_in_giacenza; + +import dagger.Module; +import dagger.Provides; +import it.integry.integrywmsnative.core.rest.consumers.GiacenzaRESTConsumer; +import it.integry.integrywmsnative.core.services.inventario.InventarioService; + +@Module(subcomponents = ArticoliInGiacenzaComponent.class) +public class ArticoliInGiacenzaModule { + + @Provides + ArticoliInGiacenzaViewModel providesControlloGiacenzeViewModel(InventarioService inventarioService) { + return new ArticoliInGiacenzaViewModel(inventarioService); + } + +} \ No newline at end of file diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/articoli_in_giacenza/ArticoliInGiacenzaViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/articoli_in_giacenza/ArticoliInGiacenzaViewModel.java new file mode 100644 index 00000000..d5304559 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/articoli_in_giacenza/ArticoliInGiacenzaViewModel.java @@ -0,0 +1,69 @@ +package it.integry.integrywmsnative.gest.articoli_in_giacenza; + +import androidx.lifecycle.MutableLiveData; + +import java.util.List; + +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.MtbDepoPosizione; +import it.integry.integrywmsnative.core.model.MvwSitArtUdcDetInventario; +import it.integry.integrywmsnative.core.services.inventario.InventarioService; +import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dto.ArtsInGiacenzaDTO; + +public class ArticoliInGiacenzaViewModel { + private final InventarioService mInventarioService; + private final MutableLiveData> mvwSitArtUdcDetInventario = new MutableLiveData<>(); + private Listener mListener; + + public ArticoliInGiacenzaViewModel(InventarioService inventarioService){ + this.mInventarioService = inventarioService; + } + + public void init() { + this.sendRequestChoosePosition(this::setPosizione); + } + + private void setPosizione(MtbDepoPosizione posizione){ + if (posizione == null) { + //Nessuna posizione trovata con questo barcode + this.sendError(new ScannedPositionNotExistException()); + }else{ + this.sendOnLoadingStarted(); + mInventarioService.getInventarioDaPosizione(posizione, inventario -> { + mvwSitArtUdcDetInventario.postValue(inventario); + this.sendOnLoadingEnded(); + }, this::sendError); + } + } + + public MutableLiveData> getMvwSitArtUdcDetInventario() { + return mvwSitArtUdcDetInventario; + } + + public void setListener(Listener listener) { + this.mListener = listener; + } + + private void sendError(Exception ex) { + if (this.mListener != null) mListener.onError(ex); + } + + private void sendRequestChoosePosition(RunnableArgs onComplete) { + if (this.mListener != null) mListener.onRequestChoosePosition(onComplete); + } + + private void sendOnLoadingStarted() { + if (this.mListener != null) mListener.onLoadingStarted(); + } + + private void sendOnLoadingEnded() { + if (this.mListener != null) mListener.onLoadingEnded(); + } + + public interface Listener extends ILoadingListener { + void onError(Exception ex); + void onRequestChoosePosition(RunnableArgs onComplete); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_dashboard_articoli_in_giacenza.xml b/app/src/main/res/drawable/ic_dashboard_articoli_in_giacenza.xml new file mode 100644 index 00000000..122516f5 --- /dev/null +++ b/app/src/main/res/drawable/ic_dashboard_articoli_in_giacenza.xml @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/resource_package.xml b/app/src/main/res/drawable/resource_package.xml new file mode 100644 index 00000000..122516f5 --- /dev/null +++ b/app/src/main/res/drawable/resource_package.xml @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_articoli_in_giacenza.xml b/app/src/main/res/layout/fragment_articoli_in_giacenza.xml new file mode 100644 index 00000000..3ff6ecd3 --- /dev/null +++ b/app/src/main/res/layout/fragment_articoli_in_giacenza.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/lista_giacenze_per_posizione_model.xml b/app/src/main/res/layout/lista_giacenze_per_posizione_model.xml new file mode 100644 index 00000000..34257fb5 --- /dev/null +++ b/app/src/main/res/layout/lista_giacenze_per_posizione_model.xml @@ -0,0 +1,313 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 230c471c..c4564f27 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -26,6 +26,7 @@ Inventario Approvvig. linee prod. Riposizionamento da prod. + Articoli in giacenza Posizionamento merce Errore Ops diff --git a/app/src/main/res/values/config.xml b/app/src/main/res/values/config.xml index bd177288..275d97df 100644 --- a/app/src/main/res/values/config.xml +++ b/app/src/main/res/values/config.xml @@ -18,6 +18,7 @@ + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 439ba2de..160c0409 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -73,7 +73,8 @@ Inventory Inventory Production line requirements - Riposizionamento da prod. + Repositioning from production + Items in stock Items placement Free picking Error