Nella sezione "rettifica giacenza" aggiunto avviso nell'inserimento di una nuova della partita per articolo

This commit is contained in:
Marco Elefante 2024-03-12 16:34:52 +01:00
parent a9b5483005
commit b86a1eb1bd
10 changed files with 243 additions and 115 deletions

View File

@ -1,5 +1,7 @@
package it.integry.integrywmsnative.core.rest.consumers;
import androidx.annotation.NonNull;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
@ -10,6 +12,7 @@ import javax.inject.Singleton;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.model.DtbOrdt;
import it.integry.integrywmsnative.core.model.MtbPartitaMag;
import it.integry.integrywmsnative.core.model.MtbTCol;
import it.integry.integrywmsnative.core.rest.RESTBuilder;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
@ -86,4 +89,20 @@ public class MagazzinoRESTConsumer extends _BaseRESTConsumer {
}
});
}
public void retrievePartitaMag(String partitaMag, String codMart, RunnableArgs<MtbPartitaMag> onComplete, RunnableArgs<Exception> onFailed){
MagazzinoRESTConsumerService service = RESTBuilder.getService(MagazzinoRESTConsumerService.class);
service.retrievePartitaMag(codMart, partitaMag)
.enqueue(new Callback<>() {
@Override
public void onResponse(@NonNull Call<ServiceRESTResponse<MtbPartitaMag>> call, @NonNull Response<ServiceRESTResponse<MtbPartitaMag>> response) {
analyzeAnswer(response, "retrievePartitaMag", onComplete, onFailed);
}
@Override
public void onFailure(@NonNull Call<ServiceRESTResponse<MtbPartitaMag>> call, @NonNull Throwable t) {
onFailed.run(new Exception(t));
}
});
}
}

View File

@ -3,11 +3,14 @@ package it.integry.integrywmsnative.core.rest.consumers;
import java.util.List;
import it.integry.integrywmsnative.core.model.DtbOrdt;
import it.integry.integrywmsnative.core.model.MtbPartitaMag;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.gest.contab_doc_interni.dto.SaveDTO;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
public interface MagazzinoRESTConsumerService {
@ -17,4 +20,8 @@ public interface MagazzinoRESTConsumerService {
@POST("SM2SaveTerminalino")
Call<List<ServiceRESTResponse<DtbOrdt>>> saveOrdine(@Body SaveDTO saveDTO);
@GET("wms/partita-magazzino/retrievePartitaMag")
Call<ServiceRESTResponse<MtbPartitaMag>> retrievePartitaMag(@Query("codMart") String codMart,
@Query("partitaMag") String partitaMag);
}

View File

@ -74,6 +74,7 @@ public class DBSettingsModel {
private boolean flagAccettazioneAllowBarcodeFornitore = false;
private boolean flagProduzioneShowInfo = false;
private boolean flagAccettazioneBollaUseQtaOrd = true;
private boolean flagWarningNewPartitaMag = false;
public boolean isFlagSpedizioneEnableFakeGiacenza() {
return flagSpedizioneEnableFakeGiacenza;
@ -623,4 +624,13 @@ public class DBSettingsModel {
public void setFlagAccettazioneBollaUseQtaOrd(boolean flagAccettazioneBollaUseQtaOrd) {
this.flagAccettazioneBollaUseQtaOrd = flagAccettazioneBollaUseQtaOrd;
}
public boolean isFlagWarningNewPartitaMag() {
return flagWarningNewPartitaMag;
}
public DBSettingsModel setFlagWarningNewPartitaMag(boolean flagWarningNewPartitaMag) {
this.flagWarningNewPartitaMag = flagWarningNewPartitaMag;
return this;
}
}

View File

@ -511,6 +511,12 @@ public class SettingsManager {
.setKeySection("FLAG_USE_QTA_ORD")
.setSetter(dbSettingsModelIstance::setFlagAccettazioneBollaUseQtaOrd)
.setDefaultValue(true));
stbGestSetupReaderList.add(new StbGestSetupReader<>(Boolean.class)
.setGestName("PICKING")
.setSection("SETUP")
.setKeySection("FLAG_WARNING_NEW_PARTITA_MAG")
.setSetter(dbSettingsModelIstance::setFlagWarningNewPartitaMag)
.setDefaultValue(false));
String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep();

View File

@ -404,8 +404,7 @@ public class RettificaGiacenzeFragment extends BaseFragment implements ITitledFr
String flagStato = dialogInputQuantityV2DTO.getMtbAart().getFlagStato();
if (flagStato.equalsIgnoreCase("I")) {
DialogSimpleMessageView.makeInfoDialog(
getActivity().getResources().getString(R.string.confirm),
DialogSimpleMessageView.makeWarningDialog(
new SpannableString(Html.fromHtml(String.format(UtilityResources.getString(R.string.item_not_enabled), codMart))),
null,
() -> {

View File

@ -3,13 +3,14 @@ package it.integry.integrywmsnative.view.dialogs.input_quantity_v2;
import dagger.Module;
import dagger.Provides;
import it.integry.integrywmsnative.core.rest.consumers.BarcodeRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.MagazzinoRESTConsumer;
@Module(subcomponents = DialogInputQuantityV2Component.class)
public class DialogInputQuantityV2Module {
@Provides
DialogInputQuantityV2ViewModel providesDialogInputQuantityV2ViewModel(BarcodeRESTConsumer barcodeRESTConsumer) {
return new DialogInputQuantityV2ViewModel(barcodeRESTConsumer);
DialogInputQuantityV2ViewModel providesDialogInputQuantityV2ViewModel(BarcodeRESTConsumer barcodeRESTConsumer, MagazzinoRESTConsumer magazzinoRESTConsumer) {
return new DialogInputQuantityV2ViewModel(barcodeRESTConsumer, magazzinoRESTConsumer);
}
}

View File

@ -261,6 +261,8 @@ public class DialogInputQuantityV2View extends BaseDialogFragment implements Dia
this.mAbort = false;
dismiss();
this.mOnComplete.run(this.mViewModel.getResult(), false);
}else {
this.onLoadingEnded();
}
});
}
@ -269,19 +271,14 @@ public class DialogInputQuantityV2View extends BaseDialogFragment implements Dia
this.mViewModel.validate(validated -> {
if (validated) {
this.mAbort = false;
dismiss();
dismiss();this.onLoadingEnded();
this.mOnComplete.run(this.mViewModel.getResult(), true);
}else {
this.onLoadingEnded();
}
});
}
// @Override
// public void onDismiss(@NonNull DialogInterface dialog) {
// BarcodeManager.removeCallback(mBarcodeScannerIstanceID);
// if (mAbort) this.mOnAbort.run();
// super.onDismiss(dialog);
// }
@Override
public void onStart() {
super.onStart();

View File

@ -3,22 +3,29 @@ package it.integry.integrywmsnative.view.dialogs.input_quantity_v2;
import androidx.databinding.ObservableField;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.util.concurrent.FutureTask;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.inject.Inject;
import it.integry.barcode_base_android_library.model.BarcodeScanDTO;
import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.di.BindableString;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.expansion.RunnableArgsWithReturn;
import it.integry.integrywmsnative.core.model.MtbAart;
import it.integry.integrywmsnative.core.model.MtbPartitaMag;
import it.integry.integrywmsnative.core.model.secondary.StatoPartitaMag;
import it.integry.integrywmsnative.core.rest.consumers.BarcodeRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.MagazzinoRESTConsumer;
import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingListener;
import it.integry.integrywmsnative.core.rest.model.Ean13PesoModel;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityBarcode;
import it.integry.integrywmsnative.core.utility.UtilityBigDecimal;
import it.integry.integrywmsnative.core.utility.UtilityDate;
import it.integry.integrywmsnative.core.utility.UtilityResources;
import it.integry.integrywmsnative.core.utility.UtilityString;
import it.integry.integrywmsnative.view.dialogs.exception.InactiveBatchLotException;
import it.integry.integrywmsnative.view.dialogs.exception.InvalidBatchLotException;
@ -89,12 +96,15 @@ public class DialogInputQuantityV2ViewModel {
private Listener mListener;
private final BarcodeRESTConsumer mBarcodeRESTConsumer;
private final MagazzinoRESTConsumer mMagazzinoRESTConsumer;
private StatoPartitaMag statoArt;
private MtbPartitaMag mtbPartitaMag;
@Inject
public DialogInputQuantityV2ViewModel(BarcodeRESTConsumer barcodeRESTConsumer) {
public DialogInputQuantityV2ViewModel(BarcodeRESTConsumer barcodeRESTConsumer, MagazzinoRESTConsumer magazzinoRESTConsumer) {
this.mBarcodeRESTConsumer = barcodeRESTConsumer;
this.mMagazzinoRESTConsumer = magazzinoRESTConsumer;
}
public void init(int onNumCnfInputChanged, int onQtaTotInputChanged) {
@ -475,6 +485,8 @@ public class DialogInputQuantityV2ViewModel {
}
public void validate(RunnableArgs<Boolean> onValidated) {
this.sendOnLoadingStarted();
new Thread(() -> {
if (this.internalQtaCnf == null || UtilityBigDecimal.equalsTo(this.internalQtaCnf, BigDecimal.ZERO)) {
this.mListener.onError(new InvalidQtaCnfQuantityException());
@ -497,7 +509,7 @@ public class DialogInputQuantityV2ViewModel {
}
}
if(this.statoArt == StatoPartitaMag.DISATTIVO){
if (this.statoArt == StatoPartitaMag.DISATTIVO) {
this.mListener.onError(new InactiveBatchLotException(internalPartitaMag));
onValidated.run(false);
return;
@ -567,23 +579,81 @@ public class DialogInputQuantityV2ViewModel {
if (!UtilityString.isNullOrEmpty(this.internalPartitaMag))
this.internalPartitaMag = this.internalPartitaMag.toUpperCase();
//Gli ultimi due controlli sono in coda a causa della callBack di onWarning, non eseguirebbe i controlli messi dopo
if (SettingsManager.iDB().isFlagWarningNewPartitaMag()) {
asyncMagazzinoRESTConsumer(internalPartitaMag, this.getMtbAart().getCodMart());
if (mtbPartitaMag == null) {
boolean result = runAsyncWarningDialog(UtilityResources.getString(R.string.batch_lot_inexistent_error_message));
if (!result) {
onValidated.run(false);
return;
}
}
}
if (this.warnOnQuantityOverflow && UtilityBigDecimal.greaterThan(this.internalQtaTot, this.totalQtaOrd) &&
this.mtbAart.get().isFlagQtaCnfFissaBoolean()) {
this.mListener.onWarning("Hai inserito una quantità superiore rispetto a quella presente nell'ordine. <br>Continuare?", onValidated);
boolean result = runAsyncWarningDialog(UtilityResources.getString(R.string.confirm_ordered_quantity_overflow_error_message));
if (!result) {
onValidated.run(false);
return;
}
}
if (this.warnOnQuantityOverflow && UtilityBigDecimal.greaterThan(this.internalNumCnf, this.totalNumCnfOrd) &&
!this.mtbAart.get().isFlagQtaCnfFissaBoolean()) {
this.mListener.onWarning("Hai inserito una quantità superiore rispetto a quella presente nell'ordine. <br>Continuare?", onValidated);
boolean result = runAsyncWarningDialog(UtilityResources.getString(R.string.confirm_ordered_num_cnf_overflow_error_message));
if (!result) {
onValidated.run(false);
return;
}
}
this.sendOnLoadingEnded();
onValidated.run(true);
}).start();
}
private boolean runAsyncWarningDialog(String text) {
try {
final FutureTask<Object> ft = new FutureTask<>(() -> {
}, new Object());
AtomicBoolean returnResult = new AtomicBoolean();
mListener.onWarning(text, result -> {
returnResult.set(result);
ft.run();
});
ft.get();
return returnResult.get();
} catch (Exception e) {
this.sendError(e);
return false;
}
}
private void asyncMagazzinoRESTConsumer(String partitaMag, String codMart) {
try {
final FutureTask<Object> ft = new FutureTask<>(() -> {
}, new Object());
mMagazzinoRESTConsumer.retrievePartitaMag(
partitaMag,
codMart,
returnPartitaMag -> {
mtbPartitaMag = returnPartitaMag;
ft.run();
},
e -> {
this.sendError(e);
ft.run();
});
ft.get();
} catch (Exception e) {
this.sendError(e);
}
}
public DialogInputQuantityV2ResultDTO getResult() {
@ -619,14 +689,27 @@ public class DialogInputQuantityV2ViewModel {
return this;
}
private void sendError(Exception ex) {
if (this.mListener != null) mListener.onError(ex);
}
public MtbAart getMtbAart() {
return this.mtbAart.get();
}
public interface Listener {
private void sendOnLoadingStarted() {
if (this.mListener != null) mListener.onLoadingStarted();
}
private void sendOnLoadingEnded() {
if (this.mListener != null) mListener.onLoadingEnded();
}
public interface Listener extends ILoadingListener {
void onDataChanged();
void onError(Exception ex);
void onWarning(String text, RunnableArgs<Boolean> result);
}
}

View File

@ -194,10 +194,13 @@
<string name="invalid_quantity_x_package_error_message"><![CDATA[La <b>quantità per confezioni</b> inserita non è valida]]></string>
<string name="available_num_cnf_overflow_error_message"><![CDATA[Il <b>numero di confezioni</b> inserito supera la quantità massima disponibile]]></string>
<string name="ordered_quantity_overflow_error_message"><![CDATA[La <b>quantità</b> inserita supera la quantità ordinata]]></string>
<string name="confirm_ordered_quantity_overflow_error_message"><![CDATA[La <b>quantità</b> inserita supera la quantità ordinata. Continuare?]]></string>
<string name="ordered_num_cnf_overflow_error_message"><![CDATA[Il <b>numero di confezioni</b> inserito supera la quantità ordinata]]></string>
<string name="confirm_ordered_num_cnf_overflow_error_message"><![CDATA[Il <b>numero di confezioni</b> inserito supera la quantità ordinata. Continuare?]]></string>
<string name="invalid_production_line_error_message"><![CDATA[<b>Linea di produzione</b> non valida]]></string>
<string name="expire_date_error_message"><![CDATA[La <b>data di scadenza</b> inserita non è valida]]></string>
<string name="batch_lot_error_message"><![CDATA[Il <b>lotto</b> inserito non è valido]]></string>
<string name="batch_lot_inexistent_error_message">È stato inserito un nuovo lotto per questo articolo. Continuare?</string>
<string name="empty_notes_input_message"><![CDATA[Il <b>campo note</b> deve essere compilato per il modulo corrente.]]></string>
<string name="settings_category">Impostazioni</string>
<string name="check_box_preference_title">Check box</string>

View File

@ -194,10 +194,13 @@
<string name="available_quantity_overflow_error_message"><![CDATA[The inserted <b>amount</b> exceeds the maximum amount available, please check it]]></string>
<string name="available_num_cnf_overflow_error_message"><![CDATA[The inserted <b>package\'s amount</b> exceeds the maximum amount available, please check it]]></string>
<string name="ordered_quantity_overflow_error_message"><![CDATA[The inserted <b>amount</b> exceeds the total ordered amount, please check it]]></string>
<string name="confirm_ordered_quantity_overflow_error_message"><![CDATA[The inserted <b>amount</b> exceeds the total ordered amount. To continue?]]></string>
<string name="confirm_ordered_num_cnf_overflow_error_message"><![CDATA[The inserted <b>package\'s amount</b> exceeds the total ordered amount. To continue?]]></string>
<string name="ordered_num_cnf_overflow_error_message"><![CDATA[The inserted <b>package\'s amount</b> exceeds the total ordered amount, please check it]]></string>
<string name="invalid_production_line_error_message"><![CDATA[Invalid <b>production line</b>]]></string>
<string name="expire_date_error_message"><![CDATA[The inserted <b>expire date</b> is not valid, please check it.]]></string>
<string name="batch_lot_error_message"><![CDATA[The inserted <b>batch lot</b> is not valid, please check it.]]></string>
<string name="batch_lot_inexistent_error_message">A new batch lot has been added for this item. To continue?</string>
<string name="empty_notes_input_message"><![CDATA[The <b>notes field</b> requires to be filled in for the current form.]]></string>
<string name="settings_category">Settings</string>
<string name="check_box_preference_title">Check box</string>