diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java index 29a0307f..52f687d4 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java @@ -31,7 +31,6 @@ import it.integry.integrywmsnative.core.di.BindableBoolean; import it.integry.integrywmsnative.core.expansion.BaseFragment; import it.integry.integrywmsnative.core.expansion.RunnableArgs; import it.integry.integrywmsnative.core.interfaces.IFilterableFragment; -import it.integry.integrywmsnative.core.interfaces.ILifecycleFragment; import it.integry.integrywmsnative.core.interfaces.IScrollableFragment; import it.integry.integrywmsnative.core.interfaces.ISelectAllFragment; import it.integry.integrywmsnative.core.interfaces.ITitledFragment; @@ -53,7 +52,7 @@ import it.integry.integrywmsnative.gest.spedizione.dialogs.row_info.BaseDialogRo import it.integry.integrywmsnative.ui.ElevatedToolbar; import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; -public class OrdiniUscitaElencoFragment extends BaseFragment implements ITitledFragment, ILifecycleFragment, IScrollableFragment, ISelectAllFragment, IFilterableFragment, OrdiniUscitaElencoViewModel.Listener { +public class OrdiniUscitaElencoFragment extends BaseFragment implements ITitledFragment, IScrollableFragment, ISelectAllFragment, IFilterableFragment, OrdiniUscitaElencoViewModel.Listener { public BindableBoolean fabVisible = new BindableBoolean(false); @@ -139,6 +138,8 @@ public class OrdiniUscitaElencoFragment extends BaseFragment implements ITitledF @Override public void onDestroy() { + BarcodeManager.removeCallback(barcodeScannerIstanceID); + for (Runnable onPreDestroy : mOnPreDestroyList) { onPreDestroy.run(); } @@ -257,12 +258,6 @@ public class OrdiniUscitaElencoFragment extends BaseFragment implements ITitledF .forEach(x -> x.getSelectedObservable().set(false)); } - @Override - public void onPreDestroy(Runnable onComplete) { - BarcodeManager.removeCallback(barcodeScannerIstanceID); - onComplete.run(); - } - @Override public void onCreateActionBar(AppCompatTextView titleText, Context context) { titleText.setText(context.getText(R.string.prod_ordine_lavorazione_title_fragment).toString()); @@ -276,7 +271,6 @@ public class OrdiniUscitaElencoFragment extends BaseFragment implements ITitledF .toList(); this.mViewModel.loadPicking(selectedOrders); - } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/PickingResiActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/PickingResiActivity.java index 8e9444a4..ecdaf0ae 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/PickingResiActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/PickingResiActivity.java @@ -35,6 +35,7 @@ import it.integry.integrywmsnative.core.model.MtbColr; import it.integry.integrywmsnative.core.model.MtbColt; import it.integry.integrywmsnative.core.rest.model.DocumentoResoDTO; import it.integry.integrywmsnative.core.settings.SettingsManager; +import it.integry.integrywmsnative.core.utility.UtilityBigDecimal; import it.integry.integrywmsnative.core.utility.UtilityDate; import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.core.utility.UtilityResources; @@ -50,8 +51,8 @@ import it.integry.integrywmsnative.view.bottom_sheet__lu_content.BottomSheetFrag import it.integry.integrywmsnative.view.bottom_sheet__lu_content.BottomSheetFragmentLUContentViewModel; import it.integry.integrywmsnative.view.dialogs.ask_should_print.DialogAskShouldPrint; import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; -import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2View; import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2DTO; +import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2View; import it.integry.integrywmsnative.view.dialogs.note_aggiuntive_lu.NoteAggiuntiveLUDialog; public class PickingResiActivity extends BaseActivity implements BottomSheetFragmentLUContentView.Listener, BottomSheetFragmentLUContentViewModel.Listener, PickingResiViewModel.Listener { @@ -179,9 +180,9 @@ public class PickingResiActivity extends BaseActivity implements BottomSheetFrag this.mBindings.mainList.setAdapter(pickingResiListAdapter); this.mBindings.mainList.setLayoutManager(new LinearLayoutManager(this)); - pickingResiListAdapter.setOnItemClicked(clickedItem -> { + pickingResiListAdapter.setOnItemClicked((clickedItem, refMtbColt) -> { if (!noLUPresent.get()) { - this.mViewmodel.dispatchOrdineRow(clickedItem); + this.mViewmodel.dispatchOrdineRow(clickedItem, refMtbColt); } }); } @@ -190,7 +191,11 @@ public class PickingResiActivity extends BaseActivity implements BottomSheetFrag private List convertDataModelToListModel(List dataList) { List pickingResiListModels = new ArrayList<>(); - Stream.of(dataList) + List tmpList = Stream.of(dataList) + .filter(x -> !x.isHidden() && UtilityBigDecimal.greaterThan(x.getQtaDoc(), BigDecimal.ZERO)) + .toList(); + + Stream.of(tmpList) .sortBy(x -> x.getNumDoc() + " " + x.getDataDocS() + " " + x.getCodDtip() + " " + x.getSerDoc() + " " + x.getCodAnag() + " " + x.getIdRiga()) .forEach(x -> { @@ -251,6 +256,10 @@ public class PickingResiActivity extends BaseActivity implements BottomSheetFrag }); } + public void removeListFilter() { + this.mViewmodel.resetMatchedRows(); + } + @Override public void onMtbColrEdit(MtbColr mtbColr) { this.mViewmodel.dispatchRowEdit(mtbColr); @@ -321,11 +330,23 @@ public class PickingResiActivity extends BaseActivity implements BottomSheetFrag this.openProgress(); onComplete.run(pickedQuantityDTO, shouldCloseLU); }, () -> { -// this.mViewmodel.resetMatchedRows(); + this.mViewmodel.resetMatchedRows(); }) .show(getSupportFragmentManager(), "tag"); } + @Override + public void onFilterApplied(String newValue) { + this.mBindings.filteredArtsInListExpandableLayout.expand(true); + this.mBindings.descriptionFilterText.setText(!UtilityString.isNullOrEmpty(newValue) ? newValue : ""); + } + + @Override + public void onFilterRemoved() { + this.mBindings.filteredArtsInListExpandableLayout.collapse(true); + this.mBindings.descriptionFilterText.setText(""); + } + @Override public void onRowSaved() { FBToast.successToast(this, getResources().getString(R.string.data_saved), FBToast.LENGTH_SHORT); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/PickingResiViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/PickingResiViewModel.java index 84cd3e22..4c7a3f64 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/PickingResiViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/PickingResiViewModel.java @@ -14,7 +14,11 @@ import java.util.List; import javax.inject.Inject; import it.integry.barcode_base_android_library.model.BarcodeScanDTO; +import it.integry.integrywmsnative.core.CommonConst; import it.integry.integrywmsnative.core.data_recover.ColliDataRecoverService; +import it.integry.integrywmsnative.core.exception.InvalidLUException; +import it.integry.integrywmsnative.core.exception.NoArtsFoundException; +import it.integry.integrywmsnative.core.exception.NoLUFoundException; import it.integry.integrywmsnative.core.exception.NoPrintersFoundException; import it.integry.integrywmsnative.core.expansion.RunnableArgs; import it.integry.integrywmsnative.core.expansion.RunnableArgss; @@ -25,6 +29,7 @@ import it.integry.integrywmsnative.core.model.CommonModelConsts; import it.integry.integrywmsnative.core.model.MtbAart; import it.integry.integrywmsnative.core.model.MtbColr; import it.integry.integrywmsnative.core.model.MtbColt; +import it.integry.integrywmsnative.core.model.dto.PickDataDTO; import it.integry.integrywmsnative.core.report.ReportManager; import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.BarcodeRESTConsumer; @@ -39,6 +44,7 @@ import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.gest.picking_resi.exceptions.DocumentsLoadException; import it.integry.integrywmsnative.gest.picking_resi.rest.PickingResiRESTConsumer; import it.integry.integrywmsnative.gest.picking_resi.rest.WithdrawableDtbDocr; +import it.integry.integrywmsnative.gest.spedizione.exceptions.NotCurrentYearLUException; import it.integry.integrywmsnative.gest.spedizione.model.PickedQuantityDTO; public class PickingResiViewModel { @@ -229,23 +235,26 @@ public class PickingResiViewModel { private void postCloseOperations(MtbColt mtbColt, Runnable onComplete) { this.mColliRegistrati.add(mtbColt); - Stream.of(this.mPickingList.getValue()) - .forEach(x -> { - List withdraws = x.getWithdrawRows(); + List tmpList = getPickingList().getValue(); - for (int k = 0; k < withdraws.size(); k++) { - MtbColr withdrawRow = withdraws.get(k); - x.setQtaDoc(x.getQtaDoc().subtract(withdrawRow.getQtaCol())); - } + for (int i = 0; i < tmpList.size(); i++) { + WithdrawableDtbDocr x = tmpList.get(i); + List withdraws = x.getWithdrawRows(); - x.getWithdrawRows().clear(); + for (int k = 0; k < withdraws.size(); k++) { + MtbColr withdrawRow = withdraws.get(k); + x.setQtaDoc(x.getQtaDoc().subtract(withdrawRow.getQtaCol())); + } - if (UtilityBigDecimal.equalsOrLowerThan(x.getQtaDoc(), BigDecimal.ZERO)) { - this.mPickingList.getValue().remove(x); - } - }); + x.getWithdrawRows().clear(); - this.mPickingList.postValue(this.mPickingList.getValue()); + if (UtilityBigDecimal.equalsOrLowerThan(x.getQtaDoc(), BigDecimal.ZERO)) { + tmpList.remove(x); + i--; + } + } + + this.mPickingList.postValue(tmpList); onComplete.run(); } @@ -259,41 +268,232 @@ public class PickingResiViewModel { //Se il collo non esiste allora lo creo associandolo a questa etichetta anonima //invece se esiste apro un collo nuovo e cerco gli articoli presenti nell'ul //dell'etichetta anonima -// this.executeEtichettaAnonimaNotOpenedLU(barcodeScanDTO, onComplete); + this.executeEtichettaAnonimaNotOpenedLU(barcodeScanDTO, onComplete); } else { -// this.processBarcodeNotOpenedLU(barcodeScanDTO, onComplete); + this.processBarcodeNotOpenedLU(barcodeScanDTO, onComplete); } } else { if (UtilityBarcode.isEtichettaAnonima(barcodeScanDTO)) { //Cerco gli articoli presenti nell'ul dell'etichetta anonima -// this.executeEtichettaLU(barcodeScanDTO.getStringValue(), onComplete); + this.executeEtichettaLU(barcodeScanDTO.getStringValue(), onComplete); } else { -// this.processBarcodeAlreadyOpenedLU(barcodeScanDTO, onComplete); + this.processBarcodeAlreadyOpenedLU(barcodeScanDTO, onComplete); } } } - public void dispatchOrdineRow(final WithdrawableDtbDocr withdrawableDtbDocr) { + private void processBarcodeNotOpenedLU(BarcodeScanDTO barcodeScanDTO, Runnable onComplete) { + this.createNewLU( + null, + null, + () -> processBarcodeAlreadyOpenedLU(barcodeScanDTO, onComplete)); + } + + + private void processBarcodeAlreadyOpenedLU(BarcodeScanDTO barcodeScanDTO, Runnable onComplete) { + + if (UtilityBarcode.isEtichetta128(barcodeScanDTO)) { + //Cerco tramite etichetta ean 128 (che può indicarmi un articolo o una UL) + this.executeEtichettaEan128(barcodeScanDTO, onComplete); + + + } else onComplete.run(); + } + + + private void executeEtichettaAnonimaNotOpenedLU(BarcodeScanDTO barcodeScanDTO, Runnable onComplete) { + mColliMagazzinoRESTConsumer.getBySSCC(barcodeScanDTO.getStringValue(), true, false, mtbColt -> { + + if (mtbColt == null) { + + if (!UtilityBarcode.isEtichettaAnonimaOfCurrentYear(barcodeScanDTO.getStringValue())) { + this.sendError(new NotCurrentYearLUException()); + } else { + + this.createNewLU( + UtilityBarcode.getNumColloFromULAnonima(barcodeScanDTO.getStringValue()), + CommonConst.Config.DEFAULT_ANONYMOUS_UL_SERIE, onComplete); + } + } else { + + this.createNewLU( + null, + null, + () -> searchArtFromUL(mtbColt, onComplete) + ); + } + + }, this::sendError); + } + + private void executeEtichettaLU(String SSCC, Runnable onComplete) { + mColliMagazzinoRESTConsumer.getBySSCC(SSCC, true, false, mtbColt -> { + + if (mtbColt != null && mtbColt.getMtbColr() != null && mtbColt.getMtbColr().size() > 0) { + if (mtbColt.getSegno() != -1) { + searchArtFromUL(mtbColt, onComplete); + } else this.sendError(new InvalidLUException()); + } else { + this.sendError(new NoArtsFoundException()); + } + + }, this::sendError); + } + + + private void executeEtichettaEan128(BarcodeScanDTO barcodeScanDTO, Runnable onComplete) { + 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, onComplete); + } else { + this.sendError(new NoLUFoundException()); + } + } else { + //EAN 128 non completo o comunque mancano i riferimenti al prodotto + onComplete.run(); + } + }, this::sendError); + } + + private void searchArtFromUL(MtbColt scannedUL, Runnable onComplete) { + + final List pickingList = mPickingList.getValue(); + final List matchPickingObject = new ArrayList<>(); + + + //Controllo se nel collo ho degli articoli che corrispondono per codice / taglia / colore / lotto + Stream.of(scannedUL.getMtbColr()) + .filter(x -> !UtilityString.isNullOrEmpty(x.getCodMart())) + .forEach(x -> { + + for (WithdrawableDtbDocr pickingObject : pickingList) { + //Da verificare se il controllo per partita deve essere sempre effettuato + if (UtilityString.equalsIgnoreCase(x.getCodMart(), pickingObject.getCodMart()) && + UtilityString.equalsIgnoreCase(x.getCodTagl(), pickingObject.getCodTagl()) && + UtilityString.equalsIgnoreCase(x.getCodCol(), pickingObject.getCodCol())) { + + if (!matchPickingObject.contains(pickingObject)) { + matchPickingObject.add(pickingObject); + } + + } + } + }); + + for (WithdrawableDtbDocr matchedObject : matchPickingObject) { + MtbColt cloneMtbColt = (MtbColt) scannedUL.clone(); + ObservableArrayList cloneMtbColrs = (ObservableArrayList) cloneMtbColt.getMtbColr().clone(); + + + Stream.of(cloneMtbColt.getMtbColr()) + .filter(x -> !(UtilityString.equalsIgnoreCase(x.getCodMart(), matchedObject.getCodMart()) && + UtilityString.equalsIgnoreCase(x.getCodTagl(), matchedObject.getCodTagl()) && + UtilityString.equalsIgnoreCase(x.getCodCol(), matchedObject.getCodCol()))) + .forEach(cloneMtbColrs::remove); + + cloneMtbColt.setMtbColr(cloneMtbColrs); + + PickDataDTO tempPickData = new PickDataDTO() + .setSourceMtbColt(cloneMtbColt); + + matchedObject.setTempPickData(tempPickData); + } + + + this.loadMatchedRows(matchPickingObject); + onComplete.run(); + } + + + private void loadMatchedRows(List matchedRows) { + if (matchedRows == null || matchedRows.size() == 0) { + this.sendError(new NoArtsFoundException()); + } else if (matchedRows.size() == 1) { + WithdrawableDtbDocr matchedItem = matchedRows.get(0); + + if (matchedItem.getWithdrawRows() != null && matchedItem.getWithdrawRows().size() > 1) { + + List pickingList = mPickingList.getValue(); + + Stream.of(pickingList) + .filter(x -> x != matchedItem) + .forEach(x -> x.setHidden(true)); + + this.sendFilterApplied(null); + this.getPickingList().postValue(pickingList); + } else { + this.dispatchOrdineRow(matchedItem, matchedItem.getRefMtbColt()); + } + + } else { + List pickingList = mPickingList.getValue(); + + for (int i = 0; i < pickingList.size(); i++) { + if (!matchedRows.contains(pickingList.get(i))) { + pickingList.get(i).setHidden(true); + } + } + + this.sendFilterApplied(null); + this.getPickingList().postValue(pickingList); + + } + } + + + public void dispatchOrdineRow(final WithdrawableDtbDocr withdrawableDtbDocr, final MtbColt refMtbColt) { BigDecimal totalQtaDoc = withdrawableDtbDocr.getQtaDoc(); BigDecimal totalNumCnfDoc = withdrawableDtbDocr.getNumCnf(); BigDecimal qtaCnfDoc = withdrawableDtbDocr.getQtaCnf(); + //TODO: Al posto di prelevare la prima riga bisognerebbe controllare se c'è ne una che corrisponde con la partita richiesta + MtbColr mtbColrToDispatch = withdrawableDtbDocr.getTempPickData() != null && + withdrawableDtbDocr.getTempPickData().getSourceMtbColt() != null && + withdrawableDtbDocr.getTempPickData().getSourceMtbColt().getMtbColr() != null && + withdrawableDtbDocr.getTempPickData().getSourceMtbColt().getMtbColr().size() > 0 ? + withdrawableDtbDocr.getTempPickData().getSourceMtbColt().getMtbColr().get(0) : null; + + BigDecimal totalAvailableQtaCol; + BigDecimal totalAvailableQtaCnf; + BigDecimal totalAvailableNumCnf; + + if (mtbColrToDispatch != null) { + totalAvailableQtaCol = mtbColrToDispatch.getQtaCol(); + totalAvailableQtaCnf = mtbColrToDispatch.getQtaCnf(); + totalAvailableNumCnf = mtbColrToDispatch.getNumCnf(); + } else { + totalAvailableQtaCol = totalQtaDoc; + totalAvailableQtaCnf = qtaCnfDoc; + totalAvailableNumCnf = totalNumCnfDoc; + } this.sendOnItemDispatched( withdrawableDtbDocr.getMtbAart(), - totalNumCnfDoc, - qtaCnfDoc, - totalQtaDoc, - totalQtaDoc, - totalNumCnfDoc, - qtaCnfDoc, + totalAvailableNumCnf, + totalAvailableQtaCnf, + totalAvailableQtaCol, + totalAvailableQtaCol, + totalAvailableNumCnf, + totalAvailableQtaCnf, withdrawableDtbDocr.getPartitaMag(), withdrawableDtbDocr.getDataScadPartitaMagD(), (pickedQuantityDTO, shouldCloseLU) -> { this.saveNewRow(withdrawableDtbDocr, + refMtbColt, pickedQuantityDTO.getNumCnf(), pickedQuantityDTO.getQtaCnf(), pickedQuantityDTO.getQtaTot(), @@ -328,7 +528,7 @@ public class PickingResiViewModel { } - public void saveNewRow(WithdrawableDtbDocr withdrawableDtbDocr, BigDecimal numCnf, BigDecimal qtaCnf, BigDecimal qtaTot, String partitaMag, Date dataScad, boolean shouldCloseLU) { + public void saveNewRow(WithdrawableDtbDocr withdrawableDtbDocr, MtbColt refMtbColt, BigDecimal numCnf, BigDecimal qtaCnf, BigDecimal qtaTot, String partitaMag, Date dataScad, boolean shouldCloseLU) { this.sendOnLoadingStarted(); final MtbColr mtbColr = new MtbColr() @@ -348,6 +548,39 @@ public class PickingResiViewModel { .setDataDoc(withdrawableDtbDocr.getDataDocS()) .setIdRigaDoc(withdrawableDtbDocr.getIdRiga()); + //TODO: Al posto di prelevare la prima riga bisognerebbe controllare se c'è ne una che corrisponde con la partita richiesta + MtbColr mtbColrToDispatch = withdrawableDtbDocr.getTempPickData() != null && + withdrawableDtbDocr.getTempPickData().getSourceMtbColt() != null && + withdrawableDtbDocr.getTempPickData().getSourceMtbColt().getMtbColr() != null && + withdrawableDtbDocr.getTempPickData().getSourceMtbColt().getMtbColr().size() > 0 ? + withdrawableDtbDocr.getTempPickData().getSourceMtbColt().getMtbColr().get(0) : null; + + if (mtbColrToDispatch != null) { + if (UtilityString.isNullOrEmpty(mCurrentMtbColt.getCodTcol())) + mCurrentMtbColt.setCodTcol(UtilityString.empty2null(withdrawableDtbDocr.getTempPickData().getSourceMtbColt().getCodTcol())); + + mtbColr + .setCodJcom(UtilityString.empty2null(mtbColrToDispatch.getCodJcom())) + .setSerColloRif(UtilityString.empty2null(mtbColrToDispatch.getSerCollo())) + .setNumColloRif(mtbColrToDispatch.getNumCollo()) + .setGestioneRif(UtilityString.empty2null(mtbColrToDispatch.getGestione())) + .setDataColloRif(UtilityString.empty2null(mtbColrToDispatch.getDataColloS())); + + + if (mtbColrToDispatch.getPesoNettoKg() != null) { + //Proporzione + BigDecimal pesoNettoKg = UtilityBigDecimal.divide(UtilityBigDecimal.multiply(qtaTot, mtbColrToDispatch.getPesoNettoKg()), mtbColrToDispatch.getQtaCol()); + mtbColr.setPesoNettoKg(pesoNettoKg); + } + + if (mtbColrToDispatch.getPesoLordoKg() != null) { + //Proporzione + BigDecimal pesoLordoKg = UtilityBigDecimal.divide(UtilityBigDecimal.multiply(qtaTot, mtbColrToDispatch.getPesoLordoKg()), mtbColrToDispatch.getQtaCol()); + mtbColr.setPesoLordoKg(pesoLordoKg); + } + } + + mtbColr.setOperation(CommonModelConsts.OPERATION.INSERT_OR_UPDATE); MtbColt cloneMtbColt = (MtbColt) mCurrentMtbColt.clone(); @@ -482,6 +715,17 @@ public class PickingResiViewModel { }); } + public void resetMatchedRows() { + for (WithdrawableDtbDocr pickingObjectDTO : this.mPickingList.getValue()) { + pickingObjectDTO + .setTempPickData(null) + .setHidden(false); + } + + this.mPickingList.postValue(this.mPickingList.getValue()); + this.sendFilterRemoved(); + } + public MutableLiveData> getPickingList() { return mPickingList; @@ -549,6 +793,14 @@ public class PickingResiViewModel { if (this.mListener != null) mListener.onRowSaved(); } + private void sendFilterApplied(String newValue) { + if (this.mListener != null) mListener.onFilterApplied(newValue); + } + + private void sendFilterRemoved() { + if (this.mListener != null) mListener.onFilterRemoved(); + } + public PickingResiViewModel setListener(Listener listener) { this.mListener = listener; @@ -572,5 +824,9 @@ public class PickingResiViewModel { Date dataScad, RunnableArgss onComplete); + void onFilterApplied(String newValue); + + void onFilterRemoved(); + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/core/PickingResiListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/core/PickingResiListAdapter.java index 28a198ba..30459d32 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/core/PickingResiListAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/core/PickingResiListAdapter.java @@ -20,7 +20,8 @@ import java.util.List; import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.expansion.OnListGeneralChangedCallback; -import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.expansion.RunnableArgss; +import it.integry.integrywmsnative.core.model.MtbColt; import it.integry.integrywmsnative.core.utility.UtilityNumber; import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.databinding.PickingResiMainListItemBinding; @@ -31,7 +32,7 @@ public class PickingResiListAdapter extends SectionedRecyclerViewAdapter mDataset = new ArrayList<>(); - private RunnableArgs mOnItemClicked; + private RunnableArgss mOnItemClicked; static class SubheaderHolder extends RecyclerView.ViewHolder { PickingResiMainListItemHeaderBinding mBinding; @@ -65,7 +66,7 @@ public class PickingResiListAdapter extends SectionedRecyclerViewAdapter onItemClicked) { + public void setOnItemClicked(RunnableArgss onItemClicked) { this.mOnItemClicked = onItemClicked; } @@ -123,7 +124,7 @@ public class PickingResiListAdapter extends SectionedRecyclerViewAdapter { if (this.mOnItemClicked != null) - this.mOnItemClicked.run(pickingResiListModel.getOriginalModel()); + this.mOnItemClicked.run(pickingResiListModel.getOriginalModel(), pickingResiListModel.getSourceMtbColt()); }); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/core/PickingResiListModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/core/PickingResiListModel.java index d5816c64..fe12ed1e 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/core/PickingResiListModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/core/PickingResiListModel.java @@ -2,6 +2,7 @@ package it.integry.integrywmsnative.gest.picking_resi.core; import java.math.BigDecimal; +import it.integry.integrywmsnative.core.model.MtbColt; import it.integry.integrywmsnative.gest.picking_resi.rest.WithdrawableDtbDocr; public class PickingResiListModel { @@ -19,6 +20,7 @@ public class PickingResiListModel { private boolean active; private WithdrawableDtbDocr mOriginalModel; + private MtbColt mSourceMtbColt; public String getGroupTitle() { return groupTitle; @@ -100,4 +102,13 @@ public class PickingResiListModel { this.mOriginalModel = originalModel; return this; } + + public MtbColt getSourceMtbColt() { + return mSourceMtbColt; + } + + public PickingResiListModel setSourceMtbColt(MtbColt sourceMtbColt) { + this.mSourceMtbColt = sourceMtbColt; + return this; + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/rest/WithdrawableDtbDocr.java b/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/rest/WithdrawableDtbDocr.java index 08fabdd5..b8a79a8a 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/rest/WithdrawableDtbDocr.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/rest/WithdrawableDtbDocr.java @@ -5,13 +5,18 @@ import java.util.List; import it.integry.integrywmsnative.core.model.DtbDocr; import it.integry.integrywmsnative.core.model.MtbColr; +import it.integry.integrywmsnative.core.model.MtbColt; +import it.integry.integrywmsnative.core.model.dto.PickDataDTO; public class WithdrawableDtbDocr extends DtbDocr { private String gestione; - private List withdrawRows = new ArrayList<>(); + private PickDataDTO tempPickData; + private MtbColt refMtbColt; + private boolean hidden = false; + public WithdrawableDtbDocr() { super(); } @@ -33,4 +38,31 @@ public class WithdrawableDtbDocr extends DtbDocr { this.gestione = gestione; return this; } + + public MtbColt getRefMtbColt() { + return refMtbColt; + } + + public WithdrawableDtbDocr setRefMtbColt(MtbColt refMtbColt) { + this.refMtbColt = refMtbColt; + return this; + } + + public PickDataDTO getTempPickData() { + return tempPickData; + } + + public WithdrawableDtbDocr setTempPickData(PickDataDTO tempPickData) { + this.tempPickData = tempPickData; + return this; + } + + public boolean isHidden() { + return hidden; + } + + public WithdrawableDtbDocr setHidden(boolean hidden) { + this.hidden = hidden; + return this; + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreFragment.java index 88ee83cd..6b008c8f 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreFragment.java @@ -12,7 +12,6 @@ import androidx.annotation.Nullable; import androidx.appcompat.widget.AppCompatTextView; import androidx.databinding.DataBindingUtil; import androidx.databinding.ObservableArrayList; -import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import com.annimon.stream.Optional; @@ -23,14 +22,20 @@ import java.util.List; import javax.inject.Inject; +import it.integry.barcode_base_android_library.model.BarcodeScanDTO; 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.RunnableArgs; import it.integry.integrywmsnative.core.interfaces.IFilterableFragment; import it.integry.integrywmsnative.core.interfaces.IScrollableFragment; import it.integry.integrywmsnative.core.interfaces.ITitledFragment; import it.integry.integrywmsnative.core.model.GtbAnag; +import it.integry.integrywmsnative.core.model.MtbAart; +import it.integry.integrywmsnative.core.model.MtbColr; +import it.integry.integrywmsnative.core.model.MtbColt; import it.integry.integrywmsnative.core.rest.model.DocumentoResoDTO; import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.UtilityExceptions; @@ -40,9 +45,10 @@ import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.core.UltimiArriv 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.view.dialogs.choose_arts_from_lista_arts.DialogChooseArtsFromListaArts; /** - * A simple {@link Fragment} subclass. + * A simple {@link BaseFragment} subclass. */ public class UltimiArriviFornitoreFragment extends BaseFragment implements ITitledFragment, IScrollableFragment, IFilterableFragment, UltimiArriviFornitoreViewModel.Listener { @@ -86,6 +92,7 @@ public class UltimiArriviFornitoreFragment extends BaseFragment implements ITitl mBindings.setViewmodel(mViewModel); this.initRecyclerView(); + this.initBarcodeReader(); // Inflate the layout for this fragment return mBindings.getRoot(); @@ -103,7 +110,7 @@ public class UltimiArriviFornitoreFragment extends BaseFragment implements ITitl dispatchConsegne(); }); - this.mViewModel.getDocuments().observe(this, this::refreshList); + this.mViewModel.getDocuments().observe(this.getViewLifecycleOwner(), this::refreshList); openFilterDialog(); } @@ -113,7 +120,7 @@ public class UltimiArriviFornitoreFragment extends BaseFragment implements ITitl this.mViewModel.loadCodAnagFornitori(gtbAnags -> { DialogUltimiArriviFornitoreFiltroAvanzato.make(getActivity(), gtbAnags, mAppliedFilterViewModel, (filter) -> { mAppliedFilterViewModel = filter; - refreshItems(); + filterItems(null); }).show(); }); } @@ -130,18 +137,33 @@ public class UltimiArriviFornitoreFragment extends BaseFragment implements ITitl mBindings.recyclerView.setAdapter(mAdapter); // mBindings.fastscroll.setRecyclerView(mBindings.recyclerView); - if (mToolbar != null) mToolbar.setRecyclerView(mBindings.recyclerView); } + private void initBarcodeReader() { + barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO() + .setOnScanSuccessfull(onScanSuccessful) + .setOnScanFailed(ex -> UtilityExceptions.defaultException(getActivity(), ex, false))); + + BarcodeManager.enable(); + } + + private final RunnableArgs onScanSuccessful = data -> { + BarcodeManager.disable(); + + this.mViewModel.processBarcodeDTO(data, () -> { + BarcodeManager.enable(); + }); + }; + private void refreshList(List documentList) { this.mDocumentiMutableData.clear(); this.mDocumentiMutableData.addAll(sort(documentList)); } - private void refreshItems() { + private void filterItems(List filteredMtbAarts) { this.openProgress(); String currentAnagFilter = mAppliedFilterViewModel != null ? mAppliedFilterViewModel.ragSoc.get() : null; @@ -156,7 +178,7 @@ public class UltimiArriviFornitoreFragment extends BaseFragment implements ITitl } this.mViewModel.loadArriviFornitori(currentCodAnagFilter, - null, + filteredMtbAarts, -1, 365); } @@ -202,6 +224,8 @@ public class UltimiArriviFornitoreFragment extends BaseFragment implements ITitl @Override public void onDestroy() { + BarcodeManager.removeCallback(barcodeScannerIstanceID); + for (Runnable onPreDestroy : mOnPreDestroyList) { onPreDestroy.run(); } @@ -248,4 +272,21 @@ public class UltimiArriviFornitoreFragment extends BaseFragment implements ITitl UtilityExceptions.defaultException(getActivity(), ex, mCurrentProgress); BarcodeManager.enable(); } + + @Override + public void onMtbColtScanned(MtbColt scannedMtbColt) { + + DialogChooseArtsFromListaArts + .make(getActivity(), scannedMtbColt.getMtbColr(), items -> { + + List mtbAarts = Stream.of(items) + .map(MtbColr::getMtbAart) + .toList(); + + filterItems(mtbAarts); + + }, null) + .show(); + + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/core/UltimiArriviFornitoreViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/core/UltimiArriviFornitoreViewModel.java index 3217e6ff..7b17b4eb 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/core/UltimiArriviFornitoreViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/core/UltimiArriviFornitoreViewModel.java @@ -6,12 +6,19 @@ import java.util.List; import javax.inject.Inject; +import it.integry.barcode_base_android_library.model.BarcodeScanDTO; +import it.integry.integrywmsnative.core.exception.InvalidLUException; +import it.integry.integrywmsnative.core.exception.NoLUFoundException; 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.MtbAart; +import it.integry.integrywmsnative.core.model.MtbColt; 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.utility.UtilityBarcode; +import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.rest.UltimiArriviFornitoreRESTConsumer; public class UltimiArriviFornitoreViewModel { @@ -54,18 +61,92 @@ public class UltimiArriviFornitoreViewModel { }, this::sendError); } - public void loadArriviFornitori(String codAnag, String codMart, int limitDocsForCli, int limitDays) { + public void loadArriviFornitori(String codAnag, List mtbAarts, int limitDocsForCli, int limitDays) { this.sendOnLoadingStarted(); - this.mUltimiArriviFornitoreRESTConsumer.getUltimeConsegneFornitori(mCodMdep, codAnag, codMart, limitDocsForCli, limitDays, documentList -> { + this.mUltimiArriviFornitoreRESTConsumer.getUltimeConsegneFornitori(mCodMdep, codAnag, mtbAarts, limitDocsForCli, limitDays, documentList -> { this.mDocuments.postValue(documentList); this.sendOnLoadingEnded(); }, this::sendError); } + public void processBarcodeDTO(BarcodeScanDTO barcodeScanDTO, Runnable onComplete) { + + this.sendOnLoadingStarted(); + + Runnable onBarcodeScanComplete = () -> { + onComplete.run(); + this.sendOnLoadingEnded(); + }; + + if (UtilityBarcode.isEtichettaAnonima(barcodeScanDTO)) { + this.executeEtichettaLU(barcodeScanDTO.getStringValue(), onBarcodeScanComplete); + } else if (UtilityBarcode.isEtichetta128(barcodeScanDTO)) { + this.executeEtichettaEan128(barcodeScanDTO, onBarcodeScanComplete); + } else { + onComplete.run(); + } + } + private void executeEtichettaLU(String SSCC, Runnable onComplete) { + this.mColliMagazzinoRESTConsumer.getBySSCC(SSCC, true, false, mtbColt -> { + + if(mtbColt != null && mtbColt.getMtbColr() != null && mtbColt.getMtbColr().size() > 0) { + if(mtbColt.getSegno() > 0) { + + this.sendOnMtbColtScanned(mtbColt); + +// this.mOrdiniUscitaElencoRESTConsumer.getOrdiniFromCommessaCollo(mCurrentCodMdep, mtbColt, orderList -> { +// +// if(orderList != null && orderList.size() > 0) { +// List numOrds = Stream.of(orderList) +// .map(DtbOrdt::getNumOrd) +// .toList(); +// +// List filteredOrders = Stream.of(mOrderList.getValue()) +// .filter(x -> numOrds.contains(x.getNumOrd())).toList(); +// +// onComplete.run(filteredOrders); +// } else { +// this.sendError(new NoOrderFoundException()); +// } +// +// }, this::sendError); + } else { + this.sendError(new InvalidLUException()); + } + } else { + this.sendError(new NoLUFoundException()); + } + + }, this::sendError); + } + + private void executeEtichettaEan128(BarcodeScanDTO barcodeScanDTO, Runnable onComplete) { + 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, onComplete); + } else { + this.sendError(new NoLUFoundException()); + } + } else { + //EAN 128 non completo o comunque mancano i riferimenti al prodotto + this.sendError(new NoLUFoundException()); + } + }, this::sendError); + } @@ -99,7 +180,13 @@ public class UltimiArriviFornitoreViewModel { if (this.mListener != null) mListener.onError(ex); } + private void sendOnMtbColtScanned(MtbColt scannedMtbColt) { + if (this.mListener != null) mListener.onMtbColtScanned(scannedMtbColt); + } + public interface Listener extends ILoadingListener { void onError(Exception ex); + + void onMtbColtScanned(MtbColt scannedMtbColt); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/rest/UltimiArriviFornitoreRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/rest/UltimiArriviFornitoreRESTConsumer.java index 8a2d3663..d53fd61c 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/rest/UltimiArriviFornitoreRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/rest/UltimiArriviFornitoreRESTConsumer.java @@ -1,7 +1,10 @@ package it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.rest; +import com.annimon.stream.Stream; import com.google.gson.reflect.TypeToken; +import org.apache.commons.lang3.StringUtils; + import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; @@ -10,6 +13,7 @@ import javax.inject.Singleton; import it.integry.integrywmsnative.core.expansion.RunnableArgs; import it.integry.integrywmsnative.core.model.GtbAnag; +import it.integry.integrywmsnative.core.model.MtbAart; import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer; import it.integry.integrywmsnative.core.rest.model.DocumentoResoDTO; import it.integry.integrywmsnative.core.utility.UtilityDB; @@ -38,13 +42,21 @@ public class UltimiArriviFornitoreRESTConsumer { }); } - public void getUltimeConsegneFornitori(String codMdep, String codAnag, String codMart, int limitConsegnePerCli, int limitDays, RunnableArgs> onComplete, RunnableArgs onFailed) { + public void getUltimeConsegneFornitori(String codMdep, String codAnag, List mtbAarts, int limitConsegnePerCli, int limitDays, RunnableArgs> onComplete, RunnableArgs onFailed) { + String codMarts = null; + + if (mtbAarts != null && mtbAarts.size() > 0) { + codMarts = StringUtils.join(Stream.of(mtbAarts) + .map(MtbAart::getCodMart) + .toList(), "|"); + } + String sql = "SELECT consegne.*, " + " rag_soc " + "FROM WMS_GetUltimeConsegneFornitori(" + UtilityDB.valueToString(limitConsegnePerCli >= 0 ? limitConsegnePerCli : null) + ", " + UtilityDB.valueToString(codAnag) + ", " + - UtilityDB.valueToString(codMart) + ", " + + UtilityDB.valueToString(codMarts) + ", " + UtilityDB.valueToString(codMdep) + ", " + UtilityDB.valueToString(limitDays) + ") consegne " + "LEFT OUTER JOIN gtb_anag ON consegne.cod_anag = gtb_anag.cod_anag " + @@ -52,7 +64,8 @@ public class UltimiArriviFornitoreRESTConsumer { " counter_consegna "; - Type typeOfObjectsList = new TypeToken>() {}.getType(); + Type typeOfObjectsList = new TypeToken>() { + }.getType(); this.systemRESTConsumer.>processSql(sql, typeOfObjectsList, value -> { if (onComplete != null) onComplete.run(value); }, ex -> { diff --git a/app/src/main/res/layout/activity_picking_resi.xml b/app/src/main/res/layout/activity_picking_resi.xml index db600e6c..bb0ac519 100644 --- a/app/src/main/res/layout/activity_picking_resi.xml +++ b/app/src/main/res/layout/activity_picking_resi.xml @@ -63,6 +63,64 @@ android:orientation="vertical" app:layout_behavior="@string/appbar_scrolling_view_behavior"> + + + + + + + + + + + + + + + + + + + +