Merge remote-tracking branch 'origin/develop' into develop

This commit is contained in:
2023-03-28 19:21:42 +02:00
18 changed files with 568 additions and 49 deletions

View File

@@ -67,8 +67,10 @@ import it.integry.integrywmsnative.gest.prod_versamento_materiale.ProdVersamento
import it.integry.integrywmsnative.gest.prod_versamento_materiale.ProdVersamentoMaterialeModule;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.PVOrdineAcquistoEditComponent;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.PVOrdineAcquistoEditModule;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.DialogEditArticoloComponent;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.DialogEditArticoloModule;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.edit_articolo.DialogEditArticoloComponent;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.edit_articolo.DialogEditArticoloModule;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.selectArtFromList.DialogSelectArtToOrderComponent;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.selectArtFromList.DialogSelectArtToOrderModule;
import it.integry.integrywmsnative.gest.pv_ordini_acquisto.PVOrdiniAcquistoGrigliaComponent;
import it.integry.integrywmsnative.gest.pv_ordini_acquisto.PVOrdiniAcquistoGrigliaModule;
import it.integry.integrywmsnative.gest.pv_ordini_acquisto.dialogs.DialogScanGrigliaAcquistoComponent;
@@ -175,7 +177,7 @@ import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCr
DialogChooseArtsFromMtbAartListModule.class,
MainSettingsModule.class,
DialogInfoSituazioneArticoloModule.class,
DialogSelectDocRowsModule.class
DialogSelectArtToOrderModule.class
})
public interface MainApplicationComponent {
@@ -295,6 +297,8 @@ public interface MainApplicationComponent {
DialogSelectDocRowsComponent.Factory dialogSelectDocRowsNewComponent();
DialogSelectArtToOrderComponent.Factory dialogSelectArtToOrderNewComponent();
void inject(MainApplication mainApplication);
void inject(AppContext mainApplication);

View File

@@ -12,7 +12,6 @@ import javax.inject.Singleton;
import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloOrdine;
import it.integry.integrywmsnative.core.data_store.db.entity.Ordine;
import it.integry.integrywmsnative.core.data_store.db.view_model.OrdiniAcquistoGrigliaDTO;
import it.integry.integrywmsnative.core.exception.InvalidProductOrderedException;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.rest.RESTBuilder;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
@@ -91,10 +90,6 @@ public class PVOrdiniAcquistoRESTConsumer extends _BaseRESTConsumer {
int i = 0;
for (ArticoloOrdine art : articoli) {
i++;
if (art.isInvalid()) {
onFailed.run(new InvalidProductOrderedException(art.getCodMart()));
return;
}
artRows.add(convertArtToDTO(art, i));
}

View File

@@ -13,9 +13,11 @@ import androidx.core.content.ContextCompat;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.annimon.stream.Stream;
import com.ravikoradiya.liveadapter.LiveAdapter;
import com.ravikoradiya.liveadapter.Type;
import java.math.BigDecimal;
import java.util.List;
import javax.inject.Inject;
@@ -36,7 +38,9 @@ import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityDate;
import it.integry.integrywmsnative.databinding.ActivityPvOrdineAcquistoEditBinding;
import it.integry.integrywmsnative.databinding.FragmentPvArticoliOrdineAcquistoListSingleItemBinding;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.DialogEditArticoloView;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.edit_articolo.DialogEditArticoloView;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.selectArtFromList.DialogSelectArtToOrderItemListModel;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.selectArtFromList.DialogSelectArtToOrderView;
import it.integry.integrywmsnative.ui.FabMenuCustomAnimations;
import it.integry.integrywmsnative.ui.SimpleDividerItemDecoration;
import it.integry.integrywmsnative.view.dialogs.DialogAskActionView;
@@ -246,4 +250,34 @@ public class PVOrdineAcquistoEditActivity extends BaseActivity implements PVOrdi
return SettingsManager.iDB().getFlagOrdinaNuoviArticoliInGriglia();
}
@Override
public void confirmExportInvalidProducts(Runnable onConfirm) {
DialogSimpleMessageView.makeInfoDialog(getText(R.string.warning).toString(),
Html.fromHtml(getResources().getString(R.string.confirm_export_invalid_product)),
null,
onConfirm
,
this::onLoadingEnded).show(getSupportFragmentManager(), "confirmExportInvalidProducts");
}
@Override
public void chooseArtFromList(List<ArticoloOrdinabileDTO> listArticoli, RunnableArgs<ArticoloOrdinabileDTO> onArtChosen) {
List<DialogSelectArtToOrderItemListModel<Object>> dataset =
Stream.of(listArticoli)
.map(x -> new DialogSelectArtToOrderItemListModel<>()
.setCodMart(x.getCodMart())
.setBarcode(x.getSelectedBarcode())
.setOriginalModel(x)
.setNew(mViewModel.isArtInOrder(x))
.setDescrizione(x.getDescrizione())
.setQtaOrd(BigDecimal.valueOf(x.getQtaOrd()))
.setCodAlis(x.getCodAlis())
.setUntMisOrd(x.getUntMis()))
.toList();
DialogSelectArtToOrderView.newInstance(dataset,
data -> onArtChosen.run((ArticoloOrdinabileDTO) data.getOriginalModel()),
this::onLoadingEnded)
.show(this.getSupportFragmentManager(), "dialogSelectDocRowsNew");
}
}

View File

@@ -161,8 +161,8 @@ public class PVOrdineAcquistoEditViewModel {
try {
this.sendOnLoadingStarted();
ArticoloOrdinabileDTO articoloDTO = getArticoloFromBarcode(barcode);
if (articoloDTO == null) {
List<ArticoloOrdinabileDTO> listArticoli = matchArticoliForBarcode(barcode);
if (listArticoli == null || listArticoli.isEmpty()) {
if (SettingsManager.iDB().isFlagConsentiFuoriPianoLogistico() && UtilityString.isNullOrEmpty(mCurrentOrdine.getCodAlis())) {
this.mListener.confirmCheckForUnlistedProduct(barcode);
return;
@@ -170,11 +170,20 @@ public class PVOrdineAcquistoEditViewModel {
throw new NoResultFromBarcodeException(barcode);
}
}
this.addArticoloToOrdine(
articoloDTO,
this::sendOnLoadingEnded,
this::sendError
);
if (listArticoli.size() == 1) {
this.addArticoloToOrdine(
listArticoli.get(0),
this::sendOnLoadingEnded,
this::sendError
);
} else {
this.mListener.chooseArtFromList(listArticoli, (art) -> {
this.addArticoloToOrdine(
art,
this::sendOnLoadingEnded,
this::sendError);
});
}
} catch (Exception e) {
this.sendError(e);
BarcodeManager.enable();
@@ -248,22 +257,20 @@ public class PVOrdineAcquistoEditViewModel {
return articolo;
}
public ArticoloOrdinabileDTO getArticoloFromBarcode(String barcode) throws NoArtsInGridException {
public List<ArticoloOrdinabileDTO> matchArticoliForBarcode(String barcode) throws NoArtsInGridException, MultipleResultFromBarcodeException, NoResultFromBarcodeException {
if (mArticoliGriglia == null || mArticoliGriglia.isEmpty()) {
throw new NoArtsInGridException();
}
ArticoloOrdinabileDTO art = Stream.of(mArticoliGriglia).filter(articolo ->
List<ArticoloOrdinabileDTO> articoli = Stream.of(mArticoliGriglia).filter(articolo ->
articolo.getCodMart().equalsIgnoreCase(barcode) ||
articolo.getBarcode().contains(barcode) ||
articolo.getBarcode().contains(StringUtils.leftPad(barcode, 13, "0"))
)
).map((art) -> art.setSelectedBarcode(barcode))
// .sortBy(x -> x.getSortByBarcodeCondition(barcode))
.findFirst().orElse(null);
if (art != null) {
art.setSelectedBarcode(barcode);
}
return art;
.toList();
return articoli;
}
@@ -318,19 +325,30 @@ public class PVOrdineAcquistoEditViewModel {
this.sendError(new ExpiredProductListException());
return;
}
if (mArticoli.getValue() == null) {
if (mArticoli.getValue() == null || mArticoli.getValue().isEmpty()) {
this.sendError(new EmptyOrderException());
return;
}
String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep();
pvOrdiniAcquistoRESTConsumer.saveOrdine(mCurrentOrdine, mArticoli.getValue(), codMdep, (ordine) -> {
mOrdineRepository.updateOrder(ordine, ord -> {
this.sendOnLoadingEnded();
onComplete.run();
Runnable saveOrdine = () -> {
pvOrdiniAcquistoRESTConsumer.saveOrdine(mCurrentOrdine, mArticoli.getValue(), codMdep, (ordine) -> {
mOrdineRepository.updateOrder(ordine, ord -> {
this.sendOnLoadingEnded();
onComplete.run();
}, this::sendError);
}, this::sendError);
};
if (Stream.of(mArticoli.getValue()).anyMatch(ArticoloOrdine::isInvalid)) {
this.mListener.confirmExportInvalidProducts(saveOrdine);
return;
}
saveOrdine.run();
}, this::sendError);
}
private void sendOnItemDispatched(ArticoloOrdine articoloOrdine, Runnable onSuccess) {
@@ -353,12 +371,26 @@ public class PVOrdineAcquistoEditViewModel {
this.sendOnLoadingStarted();
String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep();
pvOrdiniAcquistoRESTConsumer.retrieveArticolo(null, codMdep, barcode, (grigliaDTO) -> {
RunnableArgs<ArticoloOrdinabileDTO> addArtToOrder = (articolo) -> {
ArticoloOrdinabileDTO existingArt = Stream.of(mArticoliGriglia).filter(x -> x.getCodMart().equalsIgnoreCase(articolo.getCodMart())).findFirstOrElse(null);
if (existingArt != null) {
List<String> barcodes = existingArt.getBarcode();
barcodes.addAll(articolo.getBarcode());
barcodes = Stream.of(barcodes).distinct().toList();
existingArt.setBarcode(barcodes);
} else {
mArticoliGriglia.add(articolo);
}
this.processBarcode(barcode);
};
if (grigliaDTO == null || grigliaDTO.getArticoli().isEmpty()) {
this.sendError(new ArtNotFoundInGridException());
return;
}
if (grigliaDTO.getArticoli().size() > 1) {
this.sendError(new MultipleResultFromBarcodeException());
this.mListener.chooseArtFromList(grigliaDTO.getArticoli(), addArtToOrder);
return;
}
ArticoloOrdinabileDTO newArt = Stream.of(grigliaDTO.getArticoli()).findFirstOrElse(null);
@@ -367,22 +399,19 @@ public class PVOrdineAcquistoEditViewModel {
return;
}
ArticoloOrdinabileDTO existingArt = Stream.of(mArticoliGriglia).filter(x -> x.getCodMart().equalsIgnoreCase(newArt.getCodMart())).findFirstOrElse(null);
if (existingArt != null) {
List<String> barcodes = existingArt.getBarcode();
barcodes.addAll(newArt.getBarcode());
barcodes = Stream.of(barcodes).distinct().toList();
existingArt.setBarcode(barcodes);
} else {
mArticoliGriglia.add(newArt);
}
this.processBarcode(barcode);
addArtToOrder.run(newArt);
}, this::sendError);
}
public boolean isArtInOrder(ArticoloOrdinabileDTO articolo) {
if (mArticoli.getValue() == null || mArticoli.getValue().isEmpty()) {
return false;
}
return Stream.of(mArticoli.getValue()).noneMatch(x -> x.getCodMart().equalsIgnoreCase(articolo.getCodMart()));
}
public interface Listener extends ILoadingListener {
void onItemDispatched(ArticoloOrdine articoloOrdine, Runnable onSuccess);
@@ -393,6 +422,10 @@ public class PVOrdineAcquistoEditViewModel {
void onError(Exception ex);
void confirmCheckForUnlistedProduct(String barcode);
void confirmExportInvalidProducts(Runnable onConfirm);
void chooseArtFromList(List<ArticoloOrdinabileDTO> listArticoli, RunnableArgs<ArticoloOrdinabileDTO> onArtChosen);
}
public PVOrdineAcquistoEditViewModel setListener(Listener listener) {

View File

@@ -1,4 +1,4 @@
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog;
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.edit_articolo;
import dagger.Subcomponent;

View File

@@ -1,4 +1,4 @@
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog;
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.edit_articolo;
import dagger.Module;
import dagger.Provides;

View File

@@ -1,4 +1,4 @@
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog;
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.edit_articolo;
import android.content.DialogInterface;
import android.graphics.Color;

View File

@@ -1,4 +1,4 @@
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog;
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.edit_articolo;
import java.math.BigDecimal;
import java.math.RoundingMode;

View File

@@ -0,0 +1,14 @@
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.selectArtFromList;
import dagger.Subcomponent;
@Subcomponent
public interface DialogSelectArtToOrderComponent {
@Subcomponent.Factory
interface Factory {
DialogSelectArtToOrderComponent create();
}
void inject(DialogSelectArtToOrderView DialogSelectArtView);
}

View File

@@ -0,0 +1,101 @@
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.selectArtFromList;
import java.math.BigDecimal;
import it.integry.integrywmsnative.core.di.BindableBoolean;
public class DialogSelectArtToOrderItemListModel<T> {
private String codMart;
private String descrizione;
private BigDecimal qtaOrd;
private String untMisOrd;
private String barcode;
private String codAlis;
private boolean isNew;
private T originalModel;
private BindableBoolean checked = new BindableBoolean(false);
public String getCodMart() {
return codMart;
}
public DialogSelectArtToOrderItemListModel<T> setCodMart(String codMart) {
this.codMart = codMart;
return this;
}
public String getDescrizione() {
return descrizione;
}
public DialogSelectArtToOrderItemListModel<T> setDescrizione(String descrizione) {
this.descrizione = descrizione;
return this;
}
public BigDecimal getQtaOrd() {
return qtaOrd;
}
public DialogSelectArtToOrderItemListModel<T> setQtaOrd(BigDecimal qtaOrd) {
this.qtaOrd = qtaOrd;
return this;
}
public String getUntMisOrd() {
return untMisOrd;
}
public DialogSelectArtToOrderItemListModel<T> setUntMisOrd(String untMisOrd) {
this.untMisOrd = untMisOrd;
return this;
}
public String getBarcode() {
return barcode;
}
public DialogSelectArtToOrderItemListModel<T> setBarcode(String barcode) {
this.barcode = barcode;
return this;
}
public boolean isNew() {
return isNew;
}
public DialogSelectArtToOrderItemListModel<T> setNew(boolean aNew) {
isNew = aNew;
return this;
}
public T getOriginalModel() {
return originalModel;
}
public DialogSelectArtToOrderItemListModel<T> setOriginalModel(T originalModel) {
this.originalModel = originalModel;
return this;
}
public BindableBoolean getChecked() {
return checked;
}
public DialogSelectArtToOrderItemListModel<T> setChecked(BindableBoolean checked) {
this.checked = checked;
return this;
}
public String getCodAlis() {
return codAlis;
}
public DialogSelectArtToOrderItemListModel<T> setCodAlis(String codAlis) {
this.codAlis = codAlis;
return this;
}
}

View File

@@ -0,0 +1,14 @@
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.selectArtFromList;
import dagger.Module;
import dagger.Provides;
@Module(subcomponents = DialogSelectArtToOrderComponent.class)
public class DialogSelectArtToOrderModule {
@Provides
DialogSelectArtToOrderViewModel providesDialogSelectArtNewViewModel() {
return new DialogSelectArtToOrderViewModel();
}
}

View File

@@ -0,0 +1,130 @@
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.selectArtFromList;
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 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.BaseDialogFragment;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.databinding.DialogSelectArtToOrderBinding;
import it.integry.integrywmsnative.databinding.DialogSelectArtToOrderItemModelBinding;
/**
* @noinspection rawtypes
*/
public class DialogSelectArtToOrderView extends BaseDialogFragment {
@Inject
DialogSelectArtToOrderViewModel mViewModel;
private DialogSelectArtToOrderBinding mBindings;
private Context mContext;
private final List<DialogSelectArtToOrderItemListModel<Object>> listArts;
private final RunnableArgs<DialogSelectArtToOrderItemListModel> onConfirm;
private final Runnable onAbort;
//Pass here all external parameters
public static DialogSelectArtToOrderView newInstance(List<DialogSelectArtToOrderItemListModel<Object>> listArts,
RunnableArgs<DialogSelectArtToOrderItemListModel> onConfirm,
Runnable onAbort) {
return new DialogSelectArtToOrderView(listArts, onConfirm, onAbort);
}
private DialogSelectArtToOrderView(List<DialogSelectArtToOrderItemListModel<Object>> listArts,
RunnableArgs<DialogSelectArtToOrderItemListModel> onConfirm,
Runnable onAbort) {
super();
this.listArts = listArts;
this.onConfirm = onConfirm;
this.onAbort = onAbort;
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
this.mContext = requireContext();
mBindings = DialogSelectArtToOrderBinding.inflate(LayoutInflater.from(this.mContext), null, false);
mBindings.setLifecycleOwner(this);
MainApplication.appComponent
.dialogSelectArtToOrderNewComponent()
.create()
.inject(this);
setCancelable(false);
var alertDialog = new MaterialAlertDialogBuilder(this.mContext)
.setView(mBindings.getRoot())
.setCancelable(isCancelable())
.setPositiveButton(R.string.confirm, (dialog, which) -> {
final DialogSelectArtToOrderItemListModel<Object> selectedItem = Stream.of(listArts)
.filter(x -> x.getChecked().get())
.findFirstOrElse(null);
if (selectedItem != null)
this.onConfirm.run(selectedItem);
})
.setNegativeButton(R.string.abort, (dialog, which) -> {
if (this.onAbort != null) this.onAbort.run();
})
.create();
alertDialog.setCanceledOnTouchOutside(isCancelable());
alertDialog.setOnShowListener(this);
return alertDialog;
}
@Override
public void onShow(DialogInterface dialogInterface) {
super.onShow(dialogInterface);
this.listArts.get(0).getChecked().set(true);
this.initRecyclerView();
}
private void initRecyclerView() {
var itemType = new Type<DialogSelectArtToOrderItemListModel, DialogSelectArtToOrderItemModelBinding>(R.layout.dialog_select_art_to_order__item_model, BR.row);
// itemType.areItemSame((oldItem, newItem) -> Objects.equals(oldItem.getId(), newItem.getId()));
itemType.areContentsTheSame(DialogSelectArtToOrderItemListModel::equals);
itemType.onClick(x -> {
resetChecks();
x.getBinding().getRow().getChecked().set(true);
return null;
});
new LiveAdapter(listArts)
.map(DialogSelectArtToOrderItemListModel.class, itemType)
.into(this.mBindings.itemList);
}
private void resetChecks() {
for (var item : listArts) {
item.getChecked().set(false);
}
}
}

View File

@@ -0,0 +1,5 @@
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.selectArtFromList;
public class DialogSelectArtToOrderViewModel {
}