In accettazione da bolla aggiunta possibilità di scansionare barcode non presenti in bolla o anche barcode non riconosciuti (con delle note)

This commit is contained in:
Giuseppe Scorrano 2023-09-14 17:18:54 +02:00
parent 99f21b19f1
commit a7dbe55ad2
16 changed files with 470 additions and 65 deletions

View File

@ -102,6 +102,8 @@ import it.integry.integrywmsnative.view.bottom_sheet__mtb_colr_edit.BottomSheetM
import it.integry.integrywmsnative.view.bottom_sheet__mtb_colr_edit.BottomSheetMtbColrEditModalModule; import it.integry.integrywmsnative.view.bottom_sheet__mtb_colr_edit.BottomSheetMtbColrEditModalModule;
import it.integry.integrywmsnative.view.dialogs.ask_cliente.DialogAskClienteComponent; import it.integry.integrywmsnative.view.dialogs.ask_cliente.DialogAskClienteComponent;
import it.integry.integrywmsnative.view.dialogs.ask_cliente.DialogAskClienteModule; import it.integry.integrywmsnative.view.dialogs.ask_cliente.DialogAskClienteModule;
import it.integry.integrywmsnative.view.dialogs.ask_unknown_barcode_notes.DialogAskUnknownBarcodeNotesComponent;
import it.integry.integrywmsnative.view.dialogs.ask_unknown_barcode_notes.DialogAskUnknownBarcodeNotesModule;
import it.integry.integrywmsnative.view.dialogs.bind_product_barcode_with_package.DialogBindProductBarcodeWithPackageComponent; import it.integry.integrywmsnative.view.dialogs.bind_product_barcode_with_package.DialogBindProductBarcodeWithPackageComponent;
import it.integry.integrywmsnative.view.dialogs.bind_product_barcode_with_package.DialogBindProductBarcodeWithPackageModule; import it.integry.integrywmsnative.view.dialogs.bind_product_barcode_with_package.DialogBindProductBarcodeWithPackageModule;
import it.integry.integrywmsnative.view.dialogs.choose_arts_from_lista_arts.DialogChooseArtsFromMtbAartListComponent; import it.integry.integrywmsnative.view.dialogs.choose_arts_from_lista_arts.DialogChooseArtsFromMtbAartListComponent;
@ -186,7 +188,8 @@ import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCr
DialogSelectArtToOrderModule.class, DialogSelectArtToOrderModule.class,
MainAccettazioneBollaElencoModule.class, MainAccettazioneBollaElencoModule.class,
AccettazioneBollaPickingModule.class, AccettazioneBollaPickingModule.class,
DialogBindProductBarcodeWithPackageModule.class DialogBindProductBarcodeWithPackageModule.class,
DialogAskUnknownBarcodeNotesModule.class
}) })
public interface MainApplicationComponent { public interface MainApplicationComponent {
@ -313,6 +316,7 @@ public interface MainApplicationComponent {
AccettazioneBollaPickingComponent.Factory accettazioneBollaPickingComponent(); AccettazioneBollaPickingComponent.Factory accettazioneBollaPickingComponent();
DialogBindProductBarcodeWithPackageComponent.Factory dialogBindProductBarcodeWithPackageComponent(); DialogBindProductBarcodeWithPackageComponent.Factory dialogBindProductBarcodeWithPackageComponent();
DialogAskUnknownBarcodeNotesComponent.Factory dialogAskUnknownBarcodeNotesComponent();
void inject(MainApplication mainApplication); void inject(MainApplication mainApplication);

View File

@ -9,6 +9,8 @@ public class InsertUDCRowRequestDTO {
private MtbColt targetMtbColt; private MtbColt targetMtbColt;
private String codMart; private String codMart;
private String descrizione;
private String barcode;
private BigDecimal qtaTot; private BigDecimal qtaTot;
private BigDecimal qtaCnf; private BigDecimal qtaCnf;
private BigDecimal numCnf; private BigDecimal numCnf;
@ -45,6 +47,24 @@ public class InsertUDCRowRequestDTO {
return this; return this;
} }
public String getDescrizione() {
return descrizione;
}
public InsertUDCRowRequestDTO setDescrizione(String descrizione) {
this.descrizione = descrizione;
return this;
}
public String getBarcode() {
return barcode;
}
public InsertUDCRowRequestDTO setBarcode(String barcode) {
this.barcode = barcode;
return this;
}
public BigDecimal getQtaTot() { public BigDecimal getQtaTot() {
return qtaTot; return qtaTot;
} }

View File

@ -66,6 +66,7 @@ public class DBSettingsModel {
private boolean flagAskTipoColloAccettazioneBolla = false; private boolean flagAskTipoColloAccettazioneBolla = false;
private boolean flagAskVersamentoAutomaticoAccettazioneBolla = false; private boolean flagAskVersamentoAutomaticoAccettazioneBolla = false;
private boolean flagCanAddUnknownItemsAccettazioneBolla = false; private boolean flagCanAddUnknownItemsAccettazioneBolla = false;
private boolean flagCanAddUnknownBarcodesAccettazioneBolla = false;
public boolean isFlagSpedizioneEnableFakeGiacenza() { public boolean isFlagSpedizioneEnableFakeGiacenza() {
return flagSpedizioneEnableFakeGiacenza; return flagSpedizioneEnableFakeGiacenza;
@ -526,4 +527,13 @@ public class DBSettingsModel {
this.flagCanAddUnknownItemsAccettazioneBolla = flagCanAddUnknownItemsAccettazioneBolla; this.flagCanAddUnknownItemsAccettazioneBolla = flagCanAddUnknownItemsAccettazioneBolla;
return this; return this;
} }
public boolean isFlagCanAddUnknownBarcodesAccettazioneBolla() {
return flagCanAddUnknownBarcodesAccettazioneBolla;
}
public DBSettingsModel setFlagCanAddUnknownBarcodesAccettazioneBolla(boolean flagCanAddUnknownBarcodesAccettazioneBolla) {
this.flagCanAddUnknownBarcodesAccettazioneBolla = flagCanAddUnknownBarcodesAccettazioneBolla;
return this;
}
} }

View File

@ -404,6 +404,10 @@ public class SettingsManager {
.setGestName("PICKING") .setGestName("PICKING")
.setSection("ACCETTAZIONE_BOLLA") .setSection("ACCETTAZIONE_BOLLA")
.setKeySection("FLAG_CAN_ADD_UNKNOWN_ITEMS")); .setKeySection("FLAG_CAN_ADD_UNKNOWN_ITEMS"));
stbGestSetupList.add(new StbGestSetup()
.setGestName("PICKING")
.setSection("ACCETTAZIONE_BOLLA")
.setKeySection("FLAG_CAN_ADD_UNKNOWN_BARCODES"));
String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep(); String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep();
@ -450,6 +454,7 @@ public class SettingsManager {
dbSettingsModelIstance.setFlagAskTipoColloAccettazioneBolla(getValueFromList(list, "ACCETTAZIONE_BOLLA", "FLAG_ASK_TIPO_COLLO", Boolean.class, Boolean.FALSE)); dbSettingsModelIstance.setFlagAskTipoColloAccettazioneBolla(getValueFromList(list, "ACCETTAZIONE_BOLLA", "FLAG_ASK_TIPO_COLLO", Boolean.class, Boolean.FALSE));
dbSettingsModelIstance.setFlagAskVersamentoAutomaticoAccettazioneBolla(getValueFromList(list, "ACCETTAZIONE_BOLLA", "FLAG_ASK_VERSAMENTO_AUTOMATICO", Boolean.class, Boolean.FALSE)); dbSettingsModelIstance.setFlagAskVersamentoAutomaticoAccettazioneBolla(getValueFromList(list, "ACCETTAZIONE_BOLLA", "FLAG_ASK_VERSAMENTO_AUTOMATICO", Boolean.class, Boolean.FALSE));
dbSettingsModelIstance.setFlagCanAddUnknownItemsAccettazioneBolla(getValueFromList(list, "ACCETTAZIONE_BOLLA", "FLAG_CAN_ADD_UNKNOWN_ITEMS", Boolean.class, Boolean.FALSE)); dbSettingsModelIstance.setFlagCanAddUnknownItemsAccettazioneBolla(getValueFromList(list, "ACCETTAZIONE_BOLLA", "FLAG_CAN_ADD_UNKNOWN_ITEMS", Boolean.class, Boolean.FALSE));
dbSettingsModelIstance.setFlagCanAddUnknownBarcodesAccettazioneBolla(getValueFromList(list, "ACCETTAZIONE_BOLLA", "FLAG_CAN_ADD_UNKNOWN_BARCODES", Boolean.class, Boolean.FALSE));
String notePerdita = getValueFromList(list, "DOC_INTERNI", "NOTE_PERDITA", String.class); String notePerdita = getValueFromList(list, "DOC_INTERNI", "NOTE_PERDITA", String.class);
if (notePerdita != null) if (notePerdita != null)

View File

@ -1,12 +1,12 @@
package it.integry.integrywmsnative.gest.accettazione_bolla_elenco.rest.dto; package it.integry.integrywmsnative.gest.accettazione_bolla_elenco.rest.dto;
import java.util.Date; import java.time.LocalDate;
public class TestataBollaAccettazioneDTO { public class TestataBollaAccettazioneDTO {
private String codAnag; private String codAnag;
private String ragSoc; private String ragSoc;
private String codDtip; private String codDtip;
private Date dataDoc; private LocalDate dataDoc;
private String serDoc; private String serDoc;
private int numDoc; private int numDoc;
private String listino; private String listino;
@ -25,7 +25,7 @@ public class TestataBollaAccettazioneDTO {
return codDtip; return codDtip;
} }
public Date getDataDoc() { public LocalDate getDataDoc() {
return dataDoc; return dataDoc;
} }

View File

@ -60,6 +60,7 @@ import it.integry.integrywmsnative.gest.spedizione.model.PickedQuantityDTO;
import it.integry.integrywmsnative.view.bottom_sheet__lu_content.BottomSheetFragmentLUContentView; import it.integry.integrywmsnative.view.bottom_sheet__lu_content.BottomSheetFragmentLUContentView;
import it.integry.integrywmsnative.view.bottom_sheet__lu_content.BottomSheetFragmentLUContentViewModel; import it.integry.integrywmsnative.view.bottom_sheet__lu_content.BottomSheetFragmentLUContentViewModel;
import it.integry.integrywmsnative.view.dialogs.ask_should_versamento_automatico_ul.DialogAskShouldVersamentoAutomaticoULView; import it.integry.integrywmsnative.view.dialogs.ask_should_versamento_automatico_ul.DialogAskShouldVersamentoAutomaticoULView;
import it.integry.integrywmsnative.view.dialogs.ask_unknown_barcode_notes.DialogAskUnknownBarcodeNotesView;
import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView;
import it.integry.integrywmsnative.view.dialogs.bind_product_barcode_with_package.DialogBindProductBarcodeWithPackageView; import it.integry.integrywmsnative.view.dialogs.bind_product_barcode_with_package.DialogBindProductBarcodeWithPackageView;
import it.integry.integrywmsnative.view.dialogs.info_aggiuntive_lu.DialogInfoAggiuntiveLU; import it.integry.integrywmsnative.view.dialogs.info_aggiuntive_lu.DialogInfoAggiuntiveLU;
@ -199,7 +200,7 @@ public class AccettazioneBollaPickingActivity extends BaseActivity implements Ac
}); });
adapter.setOnItemClicked(clickedItem -> { adapter.setOnItemClicked(clickedItem -> {
this.mViewModel.dispatchOrdineRow(clickedItem); this.mViewModel.dispatchBollaRow(clickedItem);
}); });
} }
@ -540,9 +541,9 @@ public class AccettazioneBollaPickingActivity extends BaseActivity implements Ac
} }
@Override @Override
public void onUnknownBarcodeScanned(String barcode) { public void onUnknownBarcodeScanned(String barcode, RunnableArgs<String> done, Runnable abort) {
DialogBindProductBarcodeWithPackageView DialogAskUnknownBarcodeNotesView
.newInstance(barcode, null) .newInstance(barcode, done, abort)
.show(getSupportFragmentManager(), DialogBindProductBarcodeWithPackageView.class.getName()); .show(getSupportFragmentManager(), DialogBindProductBarcodeWithPackageView.class.getName());
} }

View File

@ -20,6 +20,7 @@ import it.integry.integrywmsnative.core.CommonConst;
import it.integry.integrywmsnative.core.exception.AlreadyUsedAnonymousLabelException; import it.integry.integrywmsnative.core.exception.AlreadyUsedAnonymousLabelException;
import it.integry.integrywmsnative.core.exception.LUScanNotGrantedException; import it.integry.integrywmsnative.core.exception.LUScanNotGrantedException;
import it.integry.integrywmsnative.core.exception.NoArtsFoundException; import it.integry.integrywmsnative.core.exception.NoArtsFoundException;
import it.integry.integrywmsnative.core.exception.NoResultFromBarcodeException;
import it.integry.integrywmsnative.core.expansion.AtomicBigDecimal; import it.integry.integrywmsnative.core.expansion.AtomicBigDecimal;
import it.integry.integrywmsnative.core.expansion.RunnableArgs; import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.expansion.RunnableArgss; import it.integry.integrywmsnative.core.expansion.RunnableArgss;
@ -66,7 +67,6 @@ import it.integry.integrywmsnative.gest.spedizione.model.PickedQuantityDTO;
public class AccettazioneBollaPickingViewModel { public class AccettazioneBollaPickingViewModel {
private final ArticoloRESTConsumer mArticoloRESTConsumer; private final ArticoloRESTConsumer mArticoloRESTConsumer;
private final BarcodeRESTConsumer mBarcodeRESTConsumer; private final BarcodeRESTConsumer mBarcodeRESTConsumer;
private final ColliMagazzinoRESTConsumer mColliMagazzinoRESTConsumer; private final ColliMagazzinoRESTConsumer mColliMagazzinoRESTConsumer;
@ -76,12 +76,9 @@ public class AccettazioneBollaPickingViewModel {
private final ColliLavorazioneRESTConsumer mColliLavorazioneRESTConsumer; private final ColliLavorazioneRESTConsumer mColliLavorazioneRESTConsumer;
private ColliCaricoRESTConsumerInterface mColliCaricoRESTConsumer; private ColliCaricoRESTConsumerInterface mColliCaricoRESTConsumer;
private Listener mListener; private Listener mListener;
private List<TestataBollaAccettazioneDTO> mBolle; private List<TestataBollaAccettazioneDTO> mBolle;
@ -117,7 +114,7 @@ public class AccettazioneBollaPickingViewModel {
List<SitBollaAccettazioneDTO> mSitArts = Stream.of(sitArts) List<SitBollaAccettazioneDTO> mSitArts = Stream.of(sitArts)
.filter(x -> .filter(x ->
UtilityBigDecimal.greaterThan(x.getQtaDaAccettare(), BigDecimal.ZERO)) UtilityBigDecimal.greaterThan(x.getQtaDaAccettare(), BigDecimal.ZERO))
.toList(); .toList();
getEmptyPickingList(mSitArts, this.mPickingList::postValue); getEmptyPickingList(mSitArts, this.mPickingList::postValue);
@ -170,7 +167,6 @@ public class AccettazioneBollaPickingViewModel {
} }
public void retrieveExistentLU(RunnableArgs<List<AlreadyRegisteredUDCDTO>> onComplete) { public void retrieveExistentLU(RunnableArgs<List<AlreadyRegisteredUDCDTO>> onComplete) {
this.sendOnLoadingStarted(); this.sendOnLoadingStarted();
@ -319,8 +315,7 @@ public class AccettazioneBollaPickingViewModel {
if (mtbAartList != null && mtbAartList.size() > 0) { if (mtbAartList != null && mtbAartList.size() > 0) {
this.searchArtFromAnag(mtbAartList.get(0), pickData, onComplete); this.searchArtFromAnag(mtbAartList.get(0), pickData, onComplete);
} else { } else {
onComplete.run(); this.manageUnknownBarcode(barcodeProd, onComplete);
this.sendOnUnknownBarcodeScanned(barcodeProd);
} }
}, this::sendError); }, this::sendError);
@ -338,15 +333,15 @@ public class AccettazioneBollaPickingViewModel {
pickingObjectDTO.setTempPickData(pickData); pickingObjectDTO.setTempPickData(pickData);
} }
this.loadMatchedRows(matchPickingObject); this.loadMatchedRows(matchPickingObject, mtbAart);
onComplete.run(); onComplete.run();
} }
private void loadMatchedRows(List<PickingObjectDTO> matchedRows) { private void loadMatchedRows(List<PickingObjectDTO> matchedRows, MtbAart mtbAart) {
if (matchedRows == null || matchedRows.size() == 0) { if (matchedRows == null || matchedRows.size() == 0) {
this.sendError(new NoArtsFoundException()); manageNoArtFound(mtbAart);
} else if (matchedRows.size() == 1) { } else if (matchedRows.size() == 1) {
this.dispatchOrdineRow(matchedRows.get(0)); this.dispatchBollaRow(matchedRows.get(0));
} else { } else {
//So che il codMart sarà solo 1 //So che il codMart sarà solo 1
var firstCodMart = Stream.of(matchedRows) var firstCodMart = Stream.of(matchedRows)
@ -360,10 +355,38 @@ public class AccettazioneBollaPickingViewModel {
} }
private void manageUnknownBarcode(String barcode, Runnable onComplete) {
if (SettingsManager.iDB().isFlagCanAddUnknownBarcodesAccettazioneBolla()) {
//TODO: Implementare popup che richiede delle note aggiuntive sul barcode scansionato
this.sendOnUnknownBarcodeScanned(barcode, notes -> {
this.dispatchBollaRow(new PickingObjectDTO()
.setMtbAart(new MtbAart()
.setDescrizione(notes)
.setDescrizioneEstesa(notes)
.setFlagTracciabilita("N")
.setFlagQtaCnfFissa("S")
.setQtaCnf(BigDecimal.ONE)
.setBarCode(barcode)));
onComplete.run();
}, onComplete);
} else {
this.sendError(new NoResultFromBarcodeException(barcode));
}
}
private void manageNoArtFound(MtbAart mtbAart) {
if (SettingsManager.iDB().isFlagCanAddUnknownItemsAccettazioneBolla()) {
this.dispatchBollaRow(new PickingObjectDTO()
.setMtbAart(mtbAart));
} else
this.sendError(new NoArtsFoundException());
}
public void createNewLU(Integer customNumCollo, String customSerCollo, boolean disablePrint, Runnable onComplete) { public void createNewLU(Integer customNumCollo, String customSerCollo, boolean disablePrint, Runnable onComplete) {
this.manageInfoAggiuntiveRequest((additionalNotes, tCol) -> { this.manageInfoAggiuntiveRequest((additionalNotes, tCol) -> {
final CreateUDCRequestDTO createUDCRequestDTO = new CreateUDCRequestDTO() final CreateUDCRequestDTO createUDCRequestDTO = new CreateUDCRequestDTO()
.setCodMdep(SettingsManager.i().getUserSession().getDepo().getCodMdep()) .setCodMdep(SettingsManager.i().getUserSession().getDepo().getCodMdep())
.setAnnotazioni(additionalNotes) .setAnnotazioni(additionalNotes)
@ -386,7 +409,7 @@ public class AccettazioneBollaPickingViewModel {
} }
private void manageInfoAggiuntiveRequest(RunnableArgss<String, MtbTCol> onComplete) { private void manageInfoAggiuntiveRequest(RunnableArgss<String, MtbTCol> onComplete) {
if(!SettingsManager.iDB().isFlagAskTipoColloAccettazioneBolla()) { if (!SettingsManager.iDB().isFlagAskTipoColloAccettazioneBolla()) {
onComplete.run(null, null); onComplete.run(null, null);
return; return;
} }
@ -394,13 +417,9 @@ public class AccettazioneBollaPickingViewModel {
this.sendOnInfoAggiuntiveRequest(onComplete); this.sendOnInfoAggiuntiveRequest(onComplete);
} }
public void dispatchOrdineRow(final PickingObjectDTO pickingObjectDTO) { public void dispatchBollaRow(final PickingObjectDTO pickingObjectDTO) {
if (this.mCurrentMtbColt == null) return; if (this.mCurrentMtbColt == null) return;
BigDecimal totalQtaDoc = pickingObjectDTO.getSitBollaAccettazione().getQtaDaAccettare();
BigDecimal totalNumCnfDoc = pickingObjectDTO.getSitBollaAccettazione().getNumCnfDaAccettare();
BigDecimal qtaCnfDoc = pickingObjectDTO.getSitBollaAccettazione().getQtaCnfDoc();
AtomicBigDecimal numCnfWithdrawRows = new AtomicBigDecimal(); AtomicBigDecimal numCnfWithdrawRows = new AtomicBigDecimal();
AtomicBigDecimal qtaColWithdrawRows = new AtomicBigDecimal(); AtomicBigDecimal qtaColWithdrawRows = new AtomicBigDecimal();
@ -410,12 +429,30 @@ public class AccettazioneBollaPickingViewModel {
qtaColWithdrawRows.addAndGet(row.getQtaCol()); qtaColWithdrawRows.addAndGet(row.getQtaCol());
}); });
BigDecimal numCnfDaEvadere = pickingObjectDTO.getSitBollaAccettazione().getNumCnfDaAccettare().subtract(numCnfWithdrawRows.getBigDecimalValue()); BigDecimal totalQtaDoc = null;
BigDecimal qtaDaEvadere = pickingObjectDTO.getSitBollaAccettazione().getQtaDaAccettare().subtract(qtaColWithdrawRows.getBigDecimalValue()); BigDecimal totalNumCnfDoc = null;
BigDecimal qtaCnfDaEvadere = qtaCnfDoc; BigDecimal qtaCnfDoc = null;
numCnfDaEvadere = UtilityBigDecimal.getGreaterBetween(numCnfDaEvadere, BigDecimal.ZERO); BigDecimal numCnfDaEvadere = null;
qtaDaEvadere = UtilityBigDecimal.getGreaterBetween(qtaDaEvadere, BigDecimal.ZERO); BigDecimal qtaDaEvadere = null;
BigDecimal qtaCnfDaEvadere = null;
final MtbAart mtbAart = pickingObjectDTO.getMtbAart();
final SitBollaAccettazioneDTO sitBollaAccettazione = pickingObjectDTO.getSitBollaAccettazione();
if (sitBollaAccettazione != null) {
totalQtaDoc = sitBollaAccettazione.getQtaDaAccettare();
totalNumCnfDoc = sitBollaAccettazione.getNumCnfDaAccettare();
qtaCnfDoc = sitBollaAccettazione.getQtaCnfDoc();
numCnfDaEvadere = sitBollaAccettazione.getNumCnfDaAccettare().subtract(numCnfWithdrawRows.getBigDecimalValue());
qtaDaEvadere = sitBollaAccettazione.getQtaDaAccettare().subtract(qtaColWithdrawRows.getBigDecimalValue());
qtaCnfDaEvadere = qtaCnfDoc;
numCnfDaEvadere = UtilityBigDecimal.getGreaterBetween(numCnfDaEvadere, BigDecimal.ZERO);
qtaDaEvadere = UtilityBigDecimal.getGreaterBetween(qtaDaEvadere, BigDecimal.ZERO);
}
BigDecimal numCnfDaPrelevare = null; BigDecimal numCnfDaPrelevare = null;
BigDecimal qtaColDaPrelevare = null; BigDecimal qtaColDaPrelevare = null;
@ -427,7 +464,6 @@ public class AccettazioneBollaPickingViewModel {
if (pickingObjectDTO.getTempPickData() != null && pickingObjectDTO.getTempPickData().getManualPickDTO() != null) { if (pickingObjectDTO.getTempPickData() != null && pickingObjectDTO.getTempPickData().getManualPickDTO() != null) {
//Oppure le info del barcode scansionato //Oppure le info del barcode scansionato
PickDataDTO.ManualPickDTO manualPickDTO = pickingObjectDTO.getTempPickData().getManualPickDTO(); PickDataDTO.ManualPickDTO manualPickDTO = pickingObjectDTO.getTempPickData().getManualPickDTO();
MtbAart mtbAart = pickingObjectDTO.getMtbAart();
qtaColDaPrelevare = manualPickDTO.getQtaTot(); qtaColDaPrelevare = manualPickDTO.getQtaTot();
@ -478,10 +514,14 @@ public class AccettazioneBollaPickingViewModel {
initialQtaCnf = qtaCnfDaPrelevare; initialQtaCnf = qtaCnfDaPrelevare;
initialQtaTot = qtaColDaPrelevare; initialQtaTot = qtaColDaPrelevare;
} else { } else if (totalQtaDoc != null) {
initialNumCnf = totalNumCnfDoc; initialNumCnf = totalNumCnfDoc;
initialQtaCnf = qtaCnfDoc; initialQtaCnf = qtaCnfDoc;
initialQtaTot = totalQtaDoc; initialQtaTot = totalQtaDoc;
} else {
initialNumCnf = BigDecimal.ONE;
initialQtaCnf = mtbAart.getQtaCnf();
initialQtaTot = mtbAart.getQtaCnf();
} }
if (!this.mUseQtaBolla && if (!this.mUseQtaBolla &&
@ -497,7 +537,10 @@ public class AccettazioneBollaPickingViewModel {
} }
if (partitaMag == null && dataScad == null) { if (partitaMag == null && dataScad == null) {
HistoryMtbAartDTO historyMtbAartDTO = this.getHistoryItemIfExists(pickingObjectDTO.getMtbAart().getCodMart()); HistoryMtbAartDTO historyMtbAartDTO =
pickingObjectDTO.getMtbAart().getCodMart() != null ?
this.getHistoryItemByCodMartIfExists(pickingObjectDTO.getMtbAart().getCodMart()) :
this.getHistoryItemByBarcodeIfExists(pickingObjectDTO.getMtbAart().getBarCode());
if (historyMtbAartDTO != null) { if (historyMtbAartDTO != null) {
partitaMag = historyMtbAartDTO.getPartitaMag(); partitaMag = historyMtbAartDTO.getPartitaMag();
@ -548,17 +591,22 @@ public class AccettazioneBollaPickingViewModel {
var clonedTargetMtbColt = (MtbColt) mCurrentMtbColt.clone(); var clonedTargetMtbColt = (MtbColt) mCurrentMtbColt.clone();
clonedTargetMtbColt.setMtbColr(null); clonedTargetMtbColt.setMtbColr(null);
var sitBolla = pickingObjectDTO.getSitBollaAccettazione();
var firstAvailableBolla = mBolle.get(0);
var insertUDCRowRequestDto = new InsertUDCRowRequestDTO() var insertUDCRowRequestDto = new InsertUDCRowRequestDTO()
.setCodMart(pickingObjectDTO.getMtbAart().getCodMart()) .setCodMart(pickingObjectDTO.getMtbAart().getCodMart())
.setDescrizione(pickingObjectDTO.getMtbAart().getCodMart() == null ? pickingObjectDTO.getMtbAart().getDescrizione() : null)
.setBarcode(pickingObjectDTO.getMtbAart().getBarCode())
.setQtaTot(qtaTot) .setQtaTot(qtaTot)
.setQtaCnf(qtaCnf) .setQtaCnf(qtaCnf)
.setNumCnf(numCnf) .setNumCnf(numCnf)
.setPartitaMag(partitaMag) .setPartitaMag(partitaMag)
// .setCodJcom(pickingObjectDTO.getSitBollaAccettazione().getCodJcom()) // .setCodJcom(pickingObjectDTO.getSitBollaAccettazione().getCodJcom())
.setDataDoc(pickingObjectDTO.getSitBollaAccettazione().getDataDoc()) .setDataDoc(sitBolla != null ? sitBolla.getDataDoc() : firstAvailableBolla.getDataDoc())
.setNumDoc(pickingObjectDTO.getSitBollaAccettazione().getNumDoc()) .setNumDoc(sitBolla != null ? sitBolla.getNumDoc() : firstAvailableBolla.getNumDoc())
.setCodDtip(pickingObjectDTO.getSitBollaAccettazione().getCodDtip()) .setCodDtip(sitBolla != null ? sitBolla.getCodDtip() : firstAvailableBolla.getCodDtip())
.setSerDoc(pickingObjectDTO.getSitBollaAccettazione().getSerDoc()) .setSerDoc(sitBolla != null ? sitBolla.getSerDoc() : firstAvailableBolla.getSerDoc())
.setTargetMtbColt(clonedTargetMtbColt); .setTargetMtbColt(clonedTargetMtbColt);
if (dataScad != null) if (dataScad != null)
@ -728,7 +776,7 @@ public class AccettazioneBollaPickingViewModel {
private void manageVersamentoAutomatico(Runnable onComplete) { private void manageVersamentoAutomatico(Runnable onComplete) {
if(!SettingsManager.iDB().isFlagAskVersamentoAutomaticoAccettazioneBolla()) { if (!SettingsManager.iDB().isFlagAskVersamentoAutomaticoAccettazioneBolla()) {
onComplete.run(); onComplete.run();
return; return;
} }
@ -751,7 +799,7 @@ public class AccettazioneBollaPickingViewModel {
} }
private void managePrintCollo(Runnable onComplete) { private void managePrintCollo(Runnable onComplete) {
if(!mCurrentMtbColt.getDisablePrint() || !SettingsManager.iDB().isFlagAskPrintUlAccettazioneBolla()) { if (!mCurrentMtbColt.getDisablePrint() || !SettingsManager.iDB().isFlagAskPrintUlAccettazioneBolla()) {
onComplete.run(); onComplete.run();
return; return;
} }
@ -799,7 +847,8 @@ public class AccettazioneBollaPickingViewModel {
private void addHistoryItem(@NonNull MtbColr mtbColr) { private void addHistoryItem(@NonNull MtbColr mtbColr) {
Optional<HistoryMtbAartDTO> optional = Stream.of(this.mHistoryUsedAarts) Optional<HistoryMtbAartDTO> optional = Stream.of(this.mHistoryUsedAarts)
.filter(x -> x.getCodMart().equalsIgnoreCase(mtbColr.getCodMart())) .filter(x -> (x.getCodMart() != null && x.getCodMart().equalsIgnoreCase(mtbColr.getCodMart())) ||
(x.getCodMart() == null && x.getBarcode().equalsIgnoreCase(mtbColr.getCodBarre())))
.findFirst(); .findFirst();
if (optional.isPresent()) { if (optional.isPresent()) {
@ -809,12 +858,13 @@ public class AccettazioneBollaPickingViewModel {
} else { } else {
this.mHistoryUsedAarts.add(new HistoryMtbAartDTO() this.mHistoryUsedAarts.add(new HistoryMtbAartDTO()
.setCodMart(mtbColr.getCodMart()) .setCodMart(mtbColr.getCodMart())
.setBarcode(mtbColr.getCodBarre())
.setPartitaMag(mtbColr.getPartitaMag()) .setPartitaMag(mtbColr.getPartitaMag())
.setDataScad(mtbColr.getDataScadPartita())); .setDataScad(mtbColr.getDataScadPartita()));
} }
} }
private HistoryMtbAartDTO getHistoryItemIfExists(@NonNull String codMart) { private HistoryMtbAartDTO getHistoryItemByCodMartIfExists(@NonNull String codMart) {
Optional<HistoryMtbAartDTO> optional = Stream.of(this.mHistoryUsedAarts) Optional<HistoryMtbAartDTO> optional = Stream.of(this.mHistoryUsedAarts)
.filter(x -> x.getCodMart().equalsIgnoreCase(codMart)) .filter(x -> x.getCodMart().equalsIgnoreCase(codMart))
.findFirst(); .findFirst();
@ -822,6 +872,14 @@ public class AccettazioneBollaPickingViewModel {
return optional.isPresent() ? optional.get() : null; return optional.isPresent() ? optional.get() : null;
} }
private HistoryMtbAartDTO getHistoryItemByBarcodeIfExists(@NonNull String barcode) {
Optional<HistoryMtbAartDTO> optional = Stream.of(this.mHistoryUsedAarts)
.filter(x -> x.getBarcode().equalsIgnoreCase(barcode))
.findFirst();
return optional.isPresent() ? optional.get() : null;
}
private void sendOnLoadingStarted() { private void sendOnLoadingStarted() {
if (this.mListener != null) mListener.onLoadingStarted(); if (this.mListener != null) mListener.onLoadingStarted();
} }
@ -919,9 +977,9 @@ public class AccettazioneBollaPickingViewModel {
mListener.onULVersata(versamentoAutomaticoULResponseDTO, onComplete); mListener.onULVersata(versamentoAutomaticoULResponseDTO, onComplete);
} }
private void sendOnUnknownBarcodeScanned(String barocde) { private void sendOnUnknownBarcodeScanned(String barocde, RunnableArgs<String> onComplete, Runnable onAbort) {
if (this.mListener != null) if (this.mListener != null)
mListener.onUnknownBarcodeScanned(barocde); mListener.onUnknownBarcodeScanned(barocde, onComplete, onAbort);
} }
public AccettazioneBollaPickingViewModel setListeners(Listener listener) { public AccettazioneBollaPickingViewModel setListeners(Listener listener) {
@ -930,8 +988,6 @@ public class AccettazioneBollaPickingViewModel {
} }
public interface Listener extends ILoadingListener, ILUPrintListener, ILUBaseOperationsListener { public interface Listener extends ILoadingListener, ILUPrintListener, ILUBaseOperationsListener {
void onVersamentoAutomaticoULRequest(RunnableArgs<Boolean> onComplete); void onVersamentoAutomaticoULRequest(RunnableArgs<Boolean> onComplete);
@ -966,7 +1022,7 @@ public class AccettazioneBollaPickingViewModel {
void onULVersata(VersamentoAutomaticoULResponseDTO versamentoAutomaticoULResponseDTO, Runnable onComplete); void onULVersata(VersamentoAutomaticoULResponseDTO versamentoAutomaticoULResponseDTO, Runnable onComplete);
void onUnknownBarcodeScanned(String barcode); void onUnknownBarcodeScanned(String barcode, RunnableArgs<String> done, Runnable abort);
} }

View File

@ -5,6 +5,7 @@ import java.time.LocalDate;
public class HistoryMtbAartDTO { public class HistoryMtbAartDTO {
private String codMart; private String codMart;
private String barcode;
private String partitaMag; private String partitaMag;
private LocalDate dataScad; private LocalDate dataScad;
@ -17,6 +18,15 @@ public class HistoryMtbAartDTO {
return this; return this;
} }
public String getBarcode() {
return barcode;
}
public HistoryMtbAartDTO setBarcode(String barcode) {
this.barcode = barcode;
return this;
}
public String getPartitaMag() { public String getPartitaMag() {
return partitaMag; return partitaMag;
} }

View File

@ -187,7 +187,10 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab
private void cyclicRecover(Iterator<Integer> sessionsIterator, Runnable onComplete, RunnableArgs<Exception> onFailed) { private void cyclicRecover(Iterator<Integer> sessionsIterator, Runnable onComplete, RunnableArgs<Exception> onFailed) {
RunnableArgss<Exception, Integer> tmpOnFailed = (ex, recoveredMtbColtID) -> { RunnableArgss<Exception, Integer> tmpOnFailed = (ex, recoveredMtbColtID) -> {
if (ex.getMessage().contains("Dati entity mtb_colt non trovati") || ex.getMessage().contains("Dati collo non corretti") || (ex.getMessage().contains("Il collo numero") && ex.getMessage().contains("non esiste"))) { if (ex.getMessage().contains("Dati entity mtb_colt non trovati") ||
ex.getMessage().contains("Dati collo non corretti") ||
(ex.getMessage().contains("Il collo numero") && ex.getMessage().contains("non esiste")) ||
ex.getMessage().contains("Impossibile eliminare un collo agganciato a documento")) {
colliDataRecoverService.closeSession(recoveredMtbColtID); colliDataRecoverService.closeSession(recoveredMtbColtID);
onFailed.run(ex); onFailed.run(ex);
} else { } else {

View File

@ -43,22 +43,27 @@ public class BottomSheetFragmentLUContentViewModel {
public void calcPesi() { public void calcPesi() {
MtbColt collo = this.mtbColt.get(); MtbColt collo = this.mtbColt.get();
if (collo != null) { if (collo == null) return;
MtbTCol tipoPedana = collo.getMtbTCol();
BigDecimal taraPedana = tipoPedana != null ? tipoPedana.getTaraKg() : BigDecimal.ZERO; MtbTCol tipoPedana = collo.getMtbTCol();
BigDecimal pesoNetto = BigDecimal.ZERO; BigDecimal taraPedana = tipoPedana != null ? tipoPedana.getTaraKg() : BigDecimal.ZERO;
for (MtbColr mtbColr : collo.getMtbColr()) { BigDecimal pesoNetto = BigDecimal.ZERO;
MtbAart articolo = mtbColr.getMtbAart();
if (articolo != null) { for (MtbColr mtbColr : collo.getMtbColr()) {
BigDecimal pesoRiga = articolo.isFlagQtaCnfFissaBoolean() ? mtbColr.getNumCnf().multiply(articolo.getPesoKg()) : mtbColr.getQtaCol(); MtbAart articolo = mtbColr.getMtbAart();
BigDecimal pesoTara = articolo.getTaraKg().multiply(mtbColr.getNumCnf());
pesoRiga = pesoRiga.add(pesoTara); if (articolo == null || articolo.getPesoKg() == null)
pesoNetto = pesoNetto.add(pesoRiga); continue;
}
} BigDecimal pesoRiga = articolo.isFlagQtaCnfFissaBoolean() ? mtbColr.getNumCnf().multiply(articolo.getPesoKg()) : mtbColr.getQtaCol();
this.pesoNettoKg.set(pesoNetto.setScale(2, RoundingMode.CEILING).toString()); BigDecimal pesoTara = articolo.getTaraKg().multiply(mtbColr.getNumCnf());
this.pesoKg.set(pesoNetto.add(taraPedana).setScale(2, RoundingMode.CEILING).toString()); pesoRiga = pesoRiga.add(pesoTara);
pesoNetto = pesoNetto.add(pesoRiga);
} }
this.pesoNettoKg.set(pesoNetto.setScale(2, RoundingMode.CEILING).toString());
this.pesoKg.set(pesoNetto.add(taraPedana).setScale(2, RoundingMode.CEILING).toString());
} }
public interface Listener { public interface Listener {

View File

@ -0,0 +1,14 @@
package it.integry.integrywmsnative.view.dialogs.ask_unknown_barcode_notes;
import dagger.Subcomponent;
@Subcomponent
public interface DialogAskUnknownBarcodeNotesComponent {
@Subcomponent.Factory
interface Factory {
DialogAskUnknownBarcodeNotesComponent create();
}
void inject(DialogAskUnknownBarcodeNotesView dialogBindProductBarcodeWithPackageView);
}

View File

@ -0,0 +1,15 @@
package it.integry.integrywmsnative.view.dialogs.ask_unknown_barcode_notes;
import dagger.Module;
import dagger.Provides;
import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer;
@Module(subcomponents = DialogAskUnknownBarcodeNotesComponent.class)
public class DialogAskUnknownBarcodeNotesModule {
@Provides
DialogAskUnknownBarcodeNotesViewModel providesDialogAskUnknownBarcodeNotesViewModel(ArticoloRESTConsumer articoloRESTConsumer) {
return new DialogAskUnknownBarcodeNotesViewModel(articoloRESTConsumer);
}
}

View File

@ -0,0 +1,128 @@
package it.integry.integrywmsnative.view.dialogs.ask_unknown_barcode_notes;
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.google.android.material.dialog.MaterialAlertDialogBuilder;
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.BaseDialogFragment;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.databinding.DialogAskUnknownBarcodeNotesBinding;
public class DialogAskUnknownBarcodeNotesView extends BaseDialogFragment {
@Inject
DialogAskUnknownBarcodeNotesViewModel mViewModel;
private DialogAskUnknownBarcodeNotesBinding mBindings;
private Context mContext;
private final String unknownBarcode;
private final RunnableArgs<String> onComplete;
private final Runnable onAbort;
private int mBarcodeScannerIstanceID;
//Pass here all external parameters
public static DialogAskUnknownBarcodeNotesView newInstance(String unknownBarcode, RunnableArgs<String> onComplete, Runnable onAbort) {
return new DialogAskUnknownBarcodeNotesView(unknownBarcode, onComplete, onAbort);
}
private DialogAskUnknownBarcodeNotesView(String unknownBarcode, RunnableArgs<String> onComplete, Runnable onAbort) {
super();
this.unknownBarcode = unknownBarcode;
this.onComplete = onComplete;
this.onAbort = onAbort;
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
this.mContext = requireContext();
mBindings = DialogAskUnknownBarcodeNotesBinding.inflate(LayoutInflater.from(this.mContext), null, false);
mBindings.setLifecycleOwner(this);
setCancelable(false);
MainApplication.appComponent
.dialogAskUnknownBarcodeNotesComponent()
.create()
.inject(this);
var alertDialog = new MaterialAlertDialogBuilder(this.mContext)
.setView(mBindings.getRoot())
.setPositiveButton(R.string.confirm, ((dialogInterface, i) -> {
if(this.onComplete != null) onComplete.run(mViewModel.userNotes.get());
}))
.setNegativeButton(R.string.abort, (dialogInterface, i) -> {
if(this.onAbort != null) onAbort.run();
})
.setCancelable(isCancelable())
.create();
alertDialog.setCanceledOnTouchOutside(isCancelable());
alertDialog.setOnShowListener(this);
initBarcode();
mViewModel.init(unknownBarcode);
mBindings.setViewmodel(mViewModel);
return alertDialog;
}
@Override
public void onDismiss(@NonNull DialogInterface dialog) {
BarcodeManager.removeCallback(mBarcodeScannerIstanceID);
BarcodeManager.enable();
super.onDismiss(dialog);
}
private void initBarcode() {
mBarcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessful(onScanSuccessfull)
.setOnScanFailed(this::onError));
BarcodeManager.enable();
setBarcodeListener(true);
}
private final RunnableArgs<BarcodeScanDTO> onScanSuccessfull = data -> {
this.onLoadingStarted();
this.mViewModel.processBarcodeDTO(data, () -> {
this.onLoadingEnded();
dismiss();
}, this::onError);
};
@Override
public void onError(Exception ex) {
super.onError(ex);
BarcodeManager.enable();
}
}

View File

@ -0,0 +1,60 @@
package it.integry.integrywmsnative.view.dialogs.ask_unknown_barcode_notes;
import androidx.databinding.ObservableField;
import javax.inject.Inject;
import io.reactivex.Observable;
import it.integry.barcode_base_android_library.model.BarcodeScanDTO;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer;
import it.integry.integrywmsnative.core.utility.UtilityBarcode;
public class DialogAskUnknownBarcodeNotesViewModel {
public ObservableField<String> userNotes = new ObservableField<>();
private ArticoloRESTConsumer articoloRESTConsumer;
private String unknownBarcode;
@Inject
public DialogAskUnknownBarcodeNotesViewModel(ArticoloRESTConsumer articoloRESTConsumer) {
this.articoloRESTConsumer = articoloRESTConsumer;
}
public void init(String unknownBarcode) {
this.unknownBarcode = unknownBarcode;
}
public void processBarcodeDTO(BarcodeScanDTO barcodeScanDTO, Runnable onComplete, RunnableArgs<Exception> onFailed) {
if (UtilityBarcode.isEtichettaAnonima(barcodeScanDTO) ||
UtilityBarcode.isEtichettaPosizione(barcodeScanDTO) ||
UtilityBarcode.isEtichetta128(barcodeScanDTO) ||
UtilityBarcode.isEanPeso(barcodeScanDTO)) {
onFailed.run(new Exception("E' necessario scansionare un'etichetta EAN13 per procedere"));
} else {
this.loadArticolo(barcodeScanDTO.getStringValue(), onComplete, onFailed);
}
}
private void loadArticolo(String stringValue, Runnable onComplete, RunnableArgs<Exception> onFailed) {
this.articoloRESTConsumer.searchByBarcode(stringValue, mtbAarts -> {
if(mtbAarts == null || mtbAarts.isEmpty()) {
onFailed.run(new Exception("Nessun articolo trovato con il barcode: " + stringValue));
return;
}
if(mtbAarts.size() > 1) {
onFailed.run(new Exception("Sono stati trovati " + mtbAarts.size() + " articoli agganciati al barcode: " + stringValue));
return;
}
var mtbAart = mtbAarts.get(0);
articoloRESTConsumer.updateBarcodeImballo(mtbAart.getCodMart(), unknownBarcode, onComplete, onFailed);
}, onFailed);
}
}

View File

@ -83,7 +83,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="1" android:maxLines="2"
android:paddingStart="0dp" android:paddingStart="0dp"
android:paddingEnd="8dp" android:paddingEnd="8dp"
android:text="@{mtbColr.getDescrizione()}" android:text="@{mtbColr.getDescrizione()}"

View File

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewmodel"
type="it.integry.integrywmsnative.view.dialogs.ask_unknown_barcode_notes.DialogAskUnknownBarcodeNotesViewModel" />
</data>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
app:cardCornerRadius="16dp"
app:cardElevation="0dp">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingHorizontal="16dp"
android:paddingVertical="16dp">
<androidx.appcompat.widget.AppCompatImageView
style="@style/MaterialAlertDialog.Material3.Title.Icon.CenterStacked"
android:layout_width="36dp"
android:layout_height="36dp"
android:src="@drawable/ic_black_barcode_scanner"
app:tint="?colorPrimary" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/title_text"
style="@style/MaterialAlertDialog.Material3.Title.Text.CenterStacked"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_marginBottom="16dp"
android:text="Aggiungi una nota" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/description_text"
style="@style/TextAppearance.Material3.BodyMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="Il barcode che hai scansionato non è stato riconosciuto, è necessario aggiungere delle note sul prodotto" />
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:imeOptions="actionDone"
android:layout_marginTop="12dp"
android:hint="Note">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="false"
android:imeOptions="actionDone"
app:binding="@{viewmodel.userNotes}" />
</com.google.android.material.textfield.TextInputLayout>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.cardview.widget.CardView>
</layout>