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.dialogs.ask_cliente.DialogAskClienteComponent;
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.DialogBindProductBarcodeWithPackageModule;
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,
MainAccettazioneBollaElencoModule.class,
AccettazioneBollaPickingModule.class,
DialogBindProductBarcodeWithPackageModule.class
DialogBindProductBarcodeWithPackageModule.class,
DialogAskUnknownBarcodeNotesModule.class
})
public interface MainApplicationComponent {
@ -313,6 +316,7 @@ public interface MainApplicationComponent {
AccettazioneBollaPickingComponent.Factory accettazioneBollaPickingComponent();
DialogBindProductBarcodeWithPackageComponent.Factory dialogBindProductBarcodeWithPackageComponent();
DialogAskUnknownBarcodeNotesComponent.Factory dialogAskUnknownBarcodeNotesComponent();
void inject(MainApplication mainApplication);

View File

@ -9,6 +9,8 @@ public class InsertUDCRowRequestDTO {
private MtbColt targetMtbColt;
private String codMart;
private String descrizione;
private String barcode;
private BigDecimal qtaTot;
private BigDecimal qtaCnf;
private BigDecimal numCnf;
@ -45,6 +47,24 @@ public class InsertUDCRowRequestDTO {
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() {
return qtaTot;
}

View File

@ -66,6 +66,7 @@ public class DBSettingsModel {
private boolean flagAskTipoColloAccettazioneBolla = false;
private boolean flagAskVersamentoAutomaticoAccettazioneBolla = false;
private boolean flagCanAddUnknownItemsAccettazioneBolla = false;
private boolean flagCanAddUnknownBarcodesAccettazioneBolla = false;
public boolean isFlagSpedizioneEnableFakeGiacenza() {
return flagSpedizioneEnableFakeGiacenza;
@ -526,4 +527,13 @@ public class DBSettingsModel {
this.flagCanAddUnknownItemsAccettazioneBolla = flagCanAddUnknownItemsAccettazioneBolla;
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")
.setSection("ACCETTAZIONE_BOLLA")
.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();
@ -450,6 +454,7 @@ public class SettingsManager {
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.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);
if (notePerdita != null)

View File

@ -1,12 +1,12 @@
package it.integry.integrywmsnative.gest.accettazione_bolla_elenco.rest.dto;
import java.util.Date;
import java.time.LocalDate;
public class TestataBollaAccettazioneDTO {
private String codAnag;
private String ragSoc;
private String codDtip;
private Date dataDoc;
private LocalDate dataDoc;
private String serDoc;
private int numDoc;
private String listino;
@ -25,7 +25,7 @@ public class TestataBollaAccettazioneDTO {
return codDtip;
}
public Date getDataDoc() {
public LocalDate getDataDoc() {
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.BottomSheetFragmentLUContentViewModel;
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.bind_product_barcode_with_package.DialogBindProductBarcodeWithPackageView;
import it.integry.integrywmsnative.view.dialogs.info_aggiuntive_lu.DialogInfoAggiuntiveLU;
@ -199,7 +200,7 @@ public class AccettazioneBollaPickingActivity extends BaseActivity implements Ac
});
adapter.setOnItemClicked(clickedItem -> {
this.mViewModel.dispatchOrdineRow(clickedItem);
this.mViewModel.dispatchBollaRow(clickedItem);
});
}
@ -540,9 +541,9 @@ public class AccettazioneBollaPickingActivity extends BaseActivity implements Ac
}
@Override
public void onUnknownBarcodeScanned(String barcode) {
DialogBindProductBarcodeWithPackageView
.newInstance(barcode, null)
public void onUnknownBarcodeScanned(String barcode, RunnableArgs<String> done, Runnable abort) {
DialogAskUnknownBarcodeNotesView
.newInstance(barcode, done, abort)
.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.LUScanNotGrantedException;
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.RunnableArgs;
import it.integry.integrywmsnative.core.expansion.RunnableArgss;
@ -66,7 +67,6 @@ import it.integry.integrywmsnative.gest.spedizione.model.PickedQuantityDTO;
public class AccettazioneBollaPickingViewModel {
private final ArticoloRESTConsumer mArticoloRESTConsumer;
private final BarcodeRESTConsumer mBarcodeRESTConsumer;
private final ColliMagazzinoRESTConsumer mColliMagazzinoRESTConsumer;
@ -76,12 +76,9 @@ public class AccettazioneBollaPickingViewModel {
private final ColliLavorazioneRESTConsumer mColliLavorazioneRESTConsumer;
private ColliCaricoRESTConsumerInterface mColliCaricoRESTConsumer;
private Listener mListener;
private List<TestataBollaAccettazioneDTO> mBolle;
@ -117,7 +114,7 @@ public class AccettazioneBollaPickingViewModel {
List<SitBollaAccettazioneDTO> mSitArts = Stream.of(sitArts)
.filter(x ->
UtilityBigDecimal.greaterThan(x.getQtaDaAccettare(), BigDecimal.ZERO))
UtilityBigDecimal.greaterThan(x.getQtaDaAccettare(), BigDecimal.ZERO))
.toList();
getEmptyPickingList(mSitArts, this.mPickingList::postValue);
@ -170,7 +167,6 @@ public class AccettazioneBollaPickingViewModel {
}
public void retrieveExistentLU(RunnableArgs<List<AlreadyRegisteredUDCDTO>> onComplete) {
this.sendOnLoadingStarted();
@ -319,8 +315,7 @@ public class AccettazioneBollaPickingViewModel {
if (mtbAartList != null && mtbAartList.size() > 0) {
this.searchArtFromAnag(mtbAartList.get(0), pickData, onComplete);
} else {
onComplete.run();
this.sendOnUnknownBarcodeScanned(barcodeProd);
this.manageUnknownBarcode(barcodeProd, onComplete);
}
}, this::sendError);
@ -338,15 +333,15 @@ public class AccettazioneBollaPickingViewModel {
pickingObjectDTO.setTempPickData(pickData);
}
this.loadMatchedRows(matchPickingObject);
this.loadMatchedRows(matchPickingObject, mtbAart);
onComplete.run();
}
private void loadMatchedRows(List<PickingObjectDTO> matchedRows) {
private void loadMatchedRows(List<PickingObjectDTO> matchedRows, MtbAart mtbAart) {
if (matchedRows == null || matchedRows.size() == 0) {
this.sendError(new NoArtsFoundException());
manageNoArtFound(mtbAart);
} else if (matchedRows.size() == 1) {
this.dispatchOrdineRow(matchedRows.get(0));
this.dispatchBollaRow(matchedRows.get(0));
} else {
//So che il codMart sarà solo 1
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) {
this.manageInfoAggiuntiveRequest((additionalNotes, tCol) -> {
final CreateUDCRequestDTO createUDCRequestDTO = new CreateUDCRequestDTO()
.setCodMdep(SettingsManager.i().getUserSession().getDepo().getCodMdep())
.setAnnotazioni(additionalNotes)
@ -386,7 +409,7 @@ public class AccettazioneBollaPickingViewModel {
}
private void manageInfoAggiuntiveRequest(RunnableArgss<String, MtbTCol> onComplete) {
if(!SettingsManager.iDB().isFlagAskTipoColloAccettazioneBolla()) {
if (!SettingsManager.iDB().isFlagAskTipoColloAccettazioneBolla()) {
onComplete.run(null, null);
return;
}
@ -394,13 +417,9 @@ public class AccettazioneBollaPickingViewModel {
this.sendOnInfoAggiuntiveRequest(onComplete);
}
public void dispatchOrdineRow(final PickingObjectDTO pickingObjectDTO) {
public void dispatchBollaRow(final PickingObjectDTO pickingObjectDTO) {
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 qtaColWithdrawRows = new AtomicBigDecimal();
@ -410,12 +429,30 @@ public class AccettazioneBollaPickingViewModel {
qtaColWithdrawRows.addAndGet(row.getQtaCol());
});
BigDecimal numCnfDaEvadere = pickingObjectDTO.getSitBollaAccettazione().getNumCnfDaAccettare().subtract(numCnfWithdrawRows.getBigDecimalValue());
BigDecimal qtaDaEvadere = pickingObjectDTO.getSitBollaAccettazione().getQtaDaAccettare().subtract(qtaColWithdrawRows.getBigDecimalValue());
BigDecimal qtaCnfDaEvadere = qtaCnfDoc;
BigDecimal totalQtaDoc = null;
BigDecimal totalNumCnfDoc = null;
BigDecimal qtaCnfDoc = null;
numCnfDaEvadere = UtilityBigDecimal.getGreaterBetween(numCnfDaEvadere, BigDecimal.ZERO);
qtaDaEvadere = UtilityBigDecimal.getGreaterBetween(qtaDaEvadere, BigDecimal.ZERO);
BigDecimal numCnfDaEvadere = null;
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 qtaColDaPrelevare = null;
@ -427,7 +464,6 @@ public class AccettazioneBollaPickingViewModel {
if (pickingObjectDTO.getTempPickData() != null && pickingObjectDTO.getTempPickData().getManualPickDTO() != null) {
//Oppure le info del barcode scansionato
PickDataDTO.ManualPickDTO manualPickDTO = pickingObjectDTO.getTempPickData().getManualPickDTO();
MtbAart mtbAart = pickingObjectDTO.getMtbAart();
qtaColDaPrelevare = manualPickDTO.getQtaTot();
@ -478,10 +514,14 @@ public class AccettazioneBollaPickingViewModel {
initialQtaCnf = qtaCnfDaPrelevare;
initialQtaTot = qtaColDaPrelevare;
} else {
} else if (totalQtaDoc != null) {
initialNumCnf = totalNumCnfDoc;
initialQtaCnf = qtaCnfDoc;
initialQtaTot = totalQtaDoc;
} else {
initialNumCnf = BigDecimal.ONE;
initialQtaCnf = mtbAart.getQtaCnf();
initialQtaTot = mtbAart.getQtaCnf();
}
if (!this.mUseQtaBolla &&
@ -497,7 +537,10 @@ public class AccettazioneBollaPickingViewModel {
}
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) {
partitaMag = historyMtbAartDTO.getPartitaMag();
@ -548,17 +591,22 @@ public class AccettazioneBollaPickingViewModel {
var clonedTargetMtbColt = (MtbColt) mCurrentMtbColt.clone();
clonedTargetMtbColt.setMtbColr(null);
var sitBolla = pickingObjectDTO.getSitBollaAccettazione();
var firstAvailableBolla = mBolle.get(0);
var insertUDCRowRequestDto = new InsertUDCRowRequestDTO()
.setCodMart(pickingObjectDTO.getMtbAart().getCodMart())
.setDescrizione(pickingObjectDTO.getMtbAart().getCodMart() == null ? pickingObjectDTO.getMtbAart().getDescrizione() : null)
.setBarcode(pickingObjectDTO.getMtbAart().getBarCode())
.setQtaTot(qtaTot)
.setQtaCnf(qtaCnf)
.setNumCnf(numCnf)
.setPartitaMag(partitaMag)
// .setCodJcom(pickingObjectDTO.getSitBollaAccettazione().getCodJcom())
.setDataDoc(pickingObjectDTO.getSitBollaAccettazione().getDataDoc())
.setNumDoc(pickingObjectDTO.getSitBollaAccettazione().getNumDoc())
.setCodDtip(pickingObjectDTO.getSitBollaAccettazione().getCodDtip())
.setSerDoc(pickingObjectDTO.getSitBollaAccettazione().getSerDoc())
.setDataDoc(sitBolla != null ? sitBolla.getDataDoc() : firstAvailableBolla.getDataDoc())
.setNumDoc(sitBolla != null ? sitBolla.getNumDoc() : firstAvailableBolla.getNumDoc())
.setCodDtip(sitBolla != null ? sitBolla.getCodDtip() : firstAvailableBolla.getCodDtip())
.setSerDoc(sitBolla != null ? sitBolla.getSerDoc() : firstAvailableBolla.getSerDoc())
.setTargetMtbColt(clonedTargetMtbColt);
if (dataScad != null)
@ -728,7 +776,7 @@ public class AccettazioneBollaPickingViewModel {
private void manageVersamentoAutomatico(Runnable onComplete) {
if(!SettingsManager.iDB().isFlagAskVersamentoAutomaticoAccettazioneBolla()) {
if (!SettingsManager.iDB().isFlagAskVersamentoAutomaticoAccettazioneBolla()) {
onComplete.run();
return;
}
@ -751,7 +799,7 @@ public class AccettazioneBollaPickingViewModel {
}
private void managePrintCollo(Runnable onComplete) {
if(!mCurrentMtbColt.getDisablePrint() || !SettingsManager.iDB().isFlagAskPrintUlAccettazioneBolla()) {
if (!mCurrentMtbColt.getDisablePrint() || !SettingsManager.iDB().isFlagAskPrintUlAccettazioneBolla()) {
onComplete.run();
return;
}
@ -799,7 +847,8 @@ public class AccettazioneBollaPickingViewModel {
private void addHistoryItem(@NonNull MtbColr mtbColr) {
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();
if (optional.isPresent()) {
@ -809,12 +858,13 @@ public class AccettazioneBollaPickingViewModel {
} else {
this.mHistoryUsedAarts.add(new HistoryMtbAartDTO()
.setCodMart(mtbColr.getCodMart())
.setBarcode(mtbColr.getCodBarre())
.setPartitaMag(mtbColr.getPartitaMag())
.setDataScad(mtbColr.getDataScadPartita()));
}
}
private HistoryMtbAartDTO getHistoryItemIfExists(@NonNull String codMart) {
private HistoryMtbAartDTO getHistoryItemByCodMartIfExists(@NonNull String codMart) {
Optional<HistoryMtbAartDTO> optional = Stream.of(this.mHistoryUsedAarts)
.filter(x -> x.getCodMart().equalsIgnoreCase(codMart))
.findFirst();
@ -822,6 +872,14 @@ public class AccettazioneBollaPickingViewModel {
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() {
if (this.mListener != null) mListener.onLoadingStarted();
}
@ -919,9 +977,9 @@ public class AccettazioneBollaPickingViewModel {
mListener.onULVersata(versamentoAutomaticoULResponseDTO, onComplete);
}
private void sendOnUnknownBarcodeScanned(String barocde) {
private void sendOnUnknownBarcodeScanned(String barocde, RunnableArgs<String> onComplete, Runnable onAbort) {
if (this.mListener != null)
mListener.onUnknownBarcodeScanned(barocde);
mListener.onUnknownBarcodeScanned(barocde, onComplete, onAbort);
}
public AccettazioneBollaPickingViewModel setListeners(Listener listener) {
@ -930,8 +988,6 @@ public class AccettazioneBollaPickingViewModel {
}
public interface Listener extends ILoadingListener, ILUPrintListener, ILUBaseOperationsListener {
void onVersamentoAutomaticoULRequest(RunnableArgs<Boolean> onComplete);
@ -966,7 +1022,7 @@ public class AccettazioneBollaPickingViewModel {
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 {
private String codMart;
private String barcode;
private String partitaMag;
private LocalDate dataScad;
@ -17,6 +18,15 @@ public class HistoryMtbAartDTO {
return this;
}
public String getBarcode() {
return barcode;
}
public HistoryMtbAartDTO setBarcode(String barcode) {
this.barcode = barcode;
return this;
}
public String getPartitaMag() {
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) {
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);
onFailed.run(ex);
} else {

View File

@ -43,22 +43,27 @@ public class BottomSheetFragmentLUContentViewModel {
public void calcPesi() {
MtbColt collo = this.mtbColt.get();
if (collo != null) {
MtbTCol tipoPedana = collo.getMtbTCol();
BigDecimal taraPedana = tipoPedana != null ? tipoPedana.getTaraKg() : BigDecimal.ZERO;
BigDecimal pesoNetto = BigDecimal.ZERO;
for (MtbColr mtbColr : collo.getMtbColr()) {
MtbAart articolo = mtbColr.getMtbAart();
if (articolo != null) {
BigDecimal pesoRiga = articolo.isFlagQtaCnfFissaBoolean() ? mtbColr.getNumCnf().multiply(articolo.getPesoKg()) : mtbColr.getQtaCol();
BigDecimal pesoTara = articolo.getTaraKg().multiply(mtbColr.getNumCnf());
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());
if (collo == null) return;
MtbTCol tipoPedana = collo.getMtbTCol();
BigDecimal taraPedana = tipoPedana != null ? tipoPedana.getTaraKg() : BigDecimal.ZERO;
BigDecimal pesoNetto = BigDecimal.ZERO;
for (MtbColr mtbColr : collo.getMtbColr()) {
MtbAart articolo = mtbColr.getMtbAart();
if (articolo == null || articolo.getPesoKg() == null)
continue;
BigDecimal pesoRiga = articolo.isFlagQtaCnfFissaBoolean() ? mtbColr.getNumCnf().multiply(articolo.getPesoKg()) : mtbColr.getQtaCol();
BigDecimal pesoTara = articolo.getTaraKg().multiply(mtbColr.getNumCnf());
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 {

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_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:maxLines="2"
android:paddingStart="0dp"
android:paddingEnd="8dp"
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>