Implementata creazione di un nuovo articolo da Rettifica Giacenze

This commit is contained in:
2024-12-09 19:18:03 +01:00
parent 73b1a77a12
commit 653cd3fd75
72 changed files with 2366 additions and 542 deletions

View File

@@ -126,6 +126,8 @@ import it.integry.integrywmsnative.view.dialogs.choose_arts_from_mtbcolr_list.Di
import it.integry.integrywmsnative.view.dialogs.choose_arts_from_mtbcolr_list.DialogChooseArtsFromMtbColrListModule;
import it.integry.integrywmsnative.view.dialogs.choose_batch_lot.DialogChooseBatchLotComponent;
import it.integry.integrywmsnative.view.dialogs.choose_batch_lot.DialogChooseBatchLotModule;
import it.integry.integrywmsnative.view.dialogs.create_new_art.DialogCreateNewArtComponent;
import it.integry.integrywmsnative.view.dialogs.create_new_art.DialogCreateNewArtModule;
import it.integry.integrywmsnative.view.dialogs.info_aggiuntive_lu.DialogInfoAggiuntiveLUComponent;
import it.integry.integrywmsnative.view.dialogs.info_aggiuntive_lu.DialogInfoAggiuntiveLUModule;
import it.integry.integrywmsnative.view.dialogs.input_lu_prod.DialogInputLUProdComponent;
@@ -218,7 +220,8 @@ import it.integry.integrywmsnative.view.dialogs.tracciamento_imballi.DialogTracc
DialogInfoGiacenzaModule.class,
ArticoliInGiacenzaModule.class,
DialogTracciamentoImballiModule.class,
DialogAskVettoreModule.class
DialogAskVettoreModule.class,
DialogCreateNewArtModule.class
})
public interface MainApplicationComponent {
@@ -365,6 +368,8 @@ public interface MainApplicationComponent {
DialogAskVettoreComponent.Factory dialogAskVettoreComponent();
DialogCreateNewArtComponent.Factory dialogCreateNewArtComponent();
void inject(MainApplication mainApplication);
void inject(AppContext mainApplication);

View File

@@ -111,6 +111,28 @@ public class Converters {
}
}
@BindingAdapter("binding")
public static void bindEditText(AppCompatTextView view, final ValidatableObservableField<String> observableField) {
Pair<ValidatableObservableField<String>, TextWatcherAdapter> pair = (Pair) view.getTag(R.id.bound_observable);
if (pair == null || pair.first != observableField) {
if (pair != null) {
view.removeTextChangedListener(pair.second);
}
TextWatcherAdapter watcher = new TextWatcherAdapter() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (observableField != null) observableField.set(s.toString());
}
};
view.setTag(R.id.bound_observable, new Pair<>(observableField, watcher));
view.addTextChangedListener(watcher);
}
String newValue = observableField.get();
if (!view.getText().toString().equals(newValue)) {
view.setText(newValue);
}
}
@BindingAdapter("binding")
public static void bindEditText(EditText view, final BindableString bindableString) {
Pair<BindableString, TextWatcherAdapter> pair = (Pair) view.getTag(R.id.bound_observable);
@@ -156,6 +178,28 @@ public class Converters {
}
}
@BindingAdapter("binding")
public static void bindEditText(EditText view, final ValidatableObservableField<String> observableString) {
Pair<ValidatableObservableField<String>, TextWatcherAdapter> pair = (Pair) view.getTag(R.id.bound_observable);
if (pair == null || pair.first != observableString) {
if (pair != null) {
view.removeTextChangedListener(pair.second);
}
TextWatcherAdapter watcher = new TextWatcherAdapter() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
observableString.set(s.toString());
}
};
view.setTag(R.id.bound_observable, new Pair<>(observableString, watcher));
view.addTextChangedListener(watcher);
}
String newValue = observableString.get();
if (!view.getText().toString().equals(newValue)) {
view.setText(newValue);
}
}
@BindingAdapter("binding")
public static void bindEditText(AutoCompleteTextView view, final ObservableField<String> observableString) {
Pair<ObservableField<String>, TextWatcherAdapter> pair = (Pair) view.getTag(R.id.bound_observable);
@@ -260,6 +304,36 @@ public class Converters {
}
}
@BindingAdapter("binding")
public static void bindTextInputEditTextBigDecimal(EditText view, final ValidatableObservableField<BigDecimal> observableBigDecimal) {
Pair<ValidatableObservableField<BigDecimal>, TextWatcherAdapter> pair = (Pair) view.getTag(R.id.bound_observable);
if (pair == null || pair.first != observableBigDecimal) {
if (pair != null) {
view.removeTextChangedListener(pair.second);
}
TextWatcherAdapter watcher = new TextWatcherAdapter() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
BigDecimal value = null;
String newValueString = s.toString().trim();
if (!UtilityString.isNullOrEmpty(newValueString))
value = new BigDecimal(newValueString);
observableBigDecimal.set(value);
}
};
view.setTag(R.id.bound_observable, new Pair<>(observableBigDecimal, watcher));
view.addTextChangedListener(watcher);
}
BigDecimal newValue = observableBigDecimal.get();
BigDecimal viewValue = !view.getText().toString().trim().isEmpty() ? new BigDecimal(view.getText().toString()) : null;
if (!UtilityBigDecimal.equalsTo(viewValue, newValue)) {
view.setText(UtilityNumber.decimalToString(newValue));
}
}
@BindingAdapter("binding")
public static void bindTextInputEditTextBigDecimal(TextInputEditText view, final BindableBigDecimal bindableBigDecimal) {
Pair<BindableBigDecimal, TextWatcherAdapter> pair = (Pair) view.getTag(R.id.bound_observable);
@@ -657,6 +731,30 @@ public class Converters {
view.setChecked(newValue);
}
@BindingAdapter("checked")
public static void bindCheckbox(AppCompatCheckBox view, final ObservableField<Boolean> bindableBoolean) {
if (view.getTag(R.id.bound_observable) != bindableBoolean) {
view.setTag(R.id.bound_observable, bindableBoolean);
view.setOnCheckedChangeListener((compoundButton, b) -> {
bindableBoolean.set(b);
});
}
Boolean newValue = bindableBoolean.get();
view.setChecked(newValue);
}
@BindingAdapter("checked")
public static void bindCheckbox(AppCompatCheckBox view, final ValidatableObservableField<Boolean> bindableBoolean) {
if (view.getTag(R.id.bound_observable) != bindableBoolean) {
view.setTag(R.id.bound_observable, bindableBoolean);
view.setOnCheckedChangeListener((compoundButton, b) -> {
bindableBoolean.set(b);
});
}
Boolean newValue = bindableBoolean.get();
view.setChecked(newValue);
}
@BindingAdapter("checked")
public static void bindCheckbox(CheckBox view, final BindableBoolean bindableBoolean) {
if (view.getTag(R.id.bound_observable) != bindableBoolean) {
@@ -723,8 +821,8 @@ public class Converters {
@BindingAdapter({"reverse_visibility"})
public static void bindViewReverseVisibility(View view, final BindableBoolean bindableBoolean) {
if (view.getTag(R.id.bound_observable) != bindableBoolean) {
view.setTag(R.id.bound_observable, bindableBoolean);
if (view.getTag(R.id.bound_reverse_visibility) != bindableBoolean) {
view.setTag(R.id.bound_reverse_visibility, bindableBoolean);
}
bindableBoolean.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
@Override

View File

@@ -0,0 +1,65 @@
package it.integry.integrywmsnative.core.di;
import androidx.annotation.Nullable;
import androidx.databinding.BaseObservable;
import androidx.databinding.Bindable;
import java.util.ArrayList;
import java.util.List;
import it.integry.integrywmsnative.BR;
import it.integry.integrywmsnative.core.di.validators.Validator;
public class ValidatableObservableField<T> extends BaseObservable {
private T mValue;
private final List<Validator<T>> validators = new ArrayList<>();
public String errorMessage;
public ValidatableObservableField() {
}
public ValidatableObservableField(T value) {
mValue = value;
}
/**
* @return the stored value.
*/
@Nullable
public T get() {
return mValue;
}
public void set(T value) {
if (value != mValue) {
mValue = value;
notifyChange();
validate();
}
}
public void addValidator(Validator<T> validator) {
validators.add(validator);
}
public boolean validate() {
for (Validator<T> validator : validators) {
if (!validator.isValid(mValue)) {
setErrorMessage(validator.getErrorMessage());
return false;
}
}
setErrorMessage(null);
return true;
}
@Bindable
public String getErrorMessage() {
return errorMessage;
}
private void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
notifyPropertyChanged(BR.errorMessage); // Notifica il cambiamento di errorMessage
}
}

View File

@@ -2,5 +2,25 @@ package it.integry.integrywmsnative.core.di.binders;
public class AutoCompleteTextViewBinders {
// @BindingAdapter("binding")
// public static void bindUntMisText(AppCompatAutoCompleteTextView view, ObservableField<MtbUntMis> untMisField) {
// Pair<ObservableField<MtbUntMis>, TextWatcherAdapter> pair = (Pair) view.getTag(R.id.bound_observable);
// if (pair == null || pair.first != untMisField) {
// if (pair != null) {
// view.removeTextChangedListener(pair.second);
// }
// TextWatcherAdapter watcher = new TextWatcherAdapter() {
// @Override
// public void onTextChanged(CharSequence s, int start, int before, int count) {
// if (untMisField != null) untMisField.set(s.toString());
// }
// };
// view.setTag(R.id.bound_observable, new Pair<>(untMisField, watcher));
// view.addTextChangedListener(watcher);
// }
// String newValue = untMisField != null && untMisField.get() != null ? Objects.requireNonNull(untMisField.get()).getUntMis() : "";
// if (!view.getText().toString().equals(newValue)) {
// view.setText(newValue);
// }
// }
}

View File

@@ -1,6 +1,7 @@
package it.integry.integrywmsnative.core.di.binders;
import androidx.databinding.BindingAdapter;
import com.google.android.material.textfield.TextInputLayout;
public class TextInputLayoutBinders {

View File

@@ -0,0 +1,23 @@
package it.integry.integrywmsnative.core.di.validators;
import java.math.BigDecimal;
public class GreaterThenValidator implements Validator<BigDecimal> {
private final String errorMessage;
private final BigDecimal greaterThanValue;
public GreaterThenValidator(BigDecimal greaterThanValue, String errorMessage) {
this.greaterThanValue = greaterThanValue;
this.errorMessage = errorMessage;
}
@Override
public boolean isValid(BigDecimal value) {
return value != null && value.compareTo(greaterThanValue) > 0;
}
@Override
public String getErrorMessage() {
return errorMessage;
}
}

View File

@@ -0,0 +1,21 @@
package it.integry.integrywmsnative.core.di.validators;
public class MinLengthValidator implements Validator<String> {
private final int minLength;
private final String errorMessage;
public MinLengthValidator(int minLength, String errorMessage) {
this.minLength = minLength;
this.errorMessage = errorMessage;
}
@Override
public boolean isValid(String value) {
return value != null && value.length() >= minLength;
}
@Override
public String getErrorMessage() {
return errorMessage;
}
}

View File

@@ -0,0 +1,19 @@
package it.integry.integrywmsnative.core.di.validators;
public class NotEmptyValidator implements Validator<String> {
private final String errorMessage;
public NotEmptyValidator(String errorMessage) {
this.errorMessage = errorMessage;
}
@Override
public boolean isValid(String value) {
return value != null && !value.trim().isEmpty();
}
@Override
public String getErrorMessage() {
return errorMessage;
}
}

View File

@@ -0,0 +1,19 @@
package it.integry.integrywmsnative.core.di.validators;
public class NotNullValidator<T> implements Validator<T>{
private final String errorMessage;
public NotNullValidator(String errorMessage) {
this.errorMessage = errorMessage;
}
@Override
public boolean isValid(T value) {
return value != null;
}
@Override
public String getErrorMessage() {
return errorMessage;
}
}

View File

@@ -0,0 +1,7 @@
package it.integry.integrywmsnative.core.di.validators;
public interface Validator<T> {
boolean isValid(T value);
String getErrorMessage();
}

View File

@@ -1,5 +1,8 @@
package it.integry.integrywmsnative.core.model;
import java.util.ArrayList;
import java.util.List;
public class MtbGrup extends EntityBase {
private String codMgrp;
@@ -8,6 +11,7 @@ public class MtbGrup extends EntityBase {
private String logoWeb;
private String criterioVal;
private String tipoMgrp;
private List<MtbSgrp> mtbSgrp = new ArrayList<>();
public MtbGrup() {
this.type = "mtb_grup";
@@ -66,4 +70,13 @@ public class MtbGrup extends EntityBase {
this.tipoMgrp = tipoMgrp;
return this;
}
public List<MtbSgrp> getMtbSgrp() {
return mtbSgrp;
}
public MtbGrup setMtbSgrp(List<MtbSgrp> mtbSgrp) {
this.mtbSgrp = mtbSgrp;
return this;
}
}

View File

@@ -0,0 +1,49 @@
package it.integry.integrywmsnative.core.model;
public class MtbSfam extends EntityBase {
private String codMgrp;
private String codMsgr;
private String codMsfa;
private String descrizione;
public MtbSfam() {
this.type = "mtb_sfam";
}
public String getCodMgrp() {
return codMgrp;
}
public MtbSfam setCodMgrp(String codMgrp) {
this.codMgrp = codMgrp;
return this;
}
public String getCodMsgr() {
return codMsgr;
}
public MtbSfam setCodMsgr(String codMsgr) {
this.codMsgr = codMsgr;
return this;
}
public String getCodMsfa() {
return codMsfa;
}
public MtbSfam setCodMsfa(String codMsfa) {
this.codMsfa = codMsfa;
return this;
}
public String getDescrizione() {
return descrizione;
}
public MtbSfam setDescrizione(String descrizione) {
this.descrizione = descrizione;
return this;
}
}

View File

@@ -0,0 +1,112 @@
package it.integry.integrywmsnative.core.model;
import java.util.ArrayList;
import java.util.List;
public class MtbSgrp extends EntityBase {
private String codMgrp;
private String codMsgr;
private String descrizione;
private String inclInStat;
private String contoRimFin;
private Integer ordinamento;
private Boolean chkGiacenzaNeg;
private Boolean flagReso;
private String codCconWip;
private List<MtbSfam> mtbSfam = new ArrayList<>();
public MtbSgrp() {
this.type = "mtb_sgrp";
}
public String getCodMgrp() {
return codMgrp;
}
public MtbSgrp setCodMgrp(String codMgrp) {
this.codMgrp = codMgrp;
return this;
}
public String getCodMsgr() {
return codMsgr;
}
public MtbSgrp setCodMsgr(String codMsgr) {
this.codMsgr = codMsgr;
return this;
}
public String getDescrizione() {
return descrizione;
}
public MtbSgrp setDescrizione(String descrizione) {
this.descrizione = descrizione;
return this;
}
public String getInclInStat() {
return inclInStat;
}
public MtbSgrp setInclInStat(String inclInStat) {
this.inclInStat = inclInStat;
return this;
}
public String getContoRimFin() {
return contoRimFin;
}
public MtbSgrp setContoRimFin(String contoRimFin) {
this.contoRimFin = contoRimFin;
return this;
}
public Integer getOrdinamento() {
return ordinamento;
}
public MtbSgrp setOrdinamento(Integer ordinamento) {
this.ordinamento = ordinamento;
return this;
}
public Boolean getChkGiacenzaNeg() {
return chkGiacenzaNeg;
}
public MtbSgrp setChkGiacenzaNeg(Boolean chkGiacenzaNeg) {
this.chkGiacenzaNeg = chkGiacenzaNeg;
return this;
}
public Boolean getFlagReso() {
return flagReso;
}
public MtbSgrp setFlagReso(Boolean flagReso) {
this.flagReso = flagReso;
return this;
}
public String getCodCconWip() {
return codCconWip;
}
public MtbSgrp setCodCconWip(String codCconWip) {
this.codCconWip = codCconWip;
return this;
}
public List<MtbSfam> getMtbSfam() {
return mtbSfam;
}
public MtbSgrp setMtbSfam(List<MtbSfam> mtbSfam) {
this.mtbSfam = mtbSfam;
return this;
}
}

View File

@@ -18,7 +18,10 @@ import it.integry.integrywmsnative.core.model.MtbUntMis;
import it.integry.integrywmsnative.core.model.dto.StatoArticoloDTO;
import it.integry.integrywmsnative.core.rest.RESTBuilder;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.rest.model.articolo.ArticoloDTO;
import it.integry.integrywmsnative.core.rest.model.articolo.RetrieveArticoloByCodMartRequestDTO;
import it.integry.integrywmsnative.core.rest.model.articolo.SaveArticoloRequestDTO;
import it.integry.integrywmsnative.core.rest.model.articolo.SaveArticoloResponseDTO;
import it.integry.integrywmsnative.core.rest.model.articolo.SearchArticoloByBarcodeRequestDTO;
import it.integry.integrywmsnative.core.rest.model.articolo.SearchArticoloByBarcodeResponseDTO;
import it.integry.integrywmsnative.core.rest.model.articolo.UpdateBarcodeImballoRequestDTO;
@@ -36,6 +39,41 @@ public class ArticoloRESTConsumer extends _BaseRESTConsumer {
this.systemRESTConsumer = systemRESTConsumer;
}
public void retrieveAvailableUntMis(RunnableArgs<List<MtbUntMis>> onComplete, RunnableArgs<Exception> onFailed) {
ArticoloRESTConsumerService articoloRESTConsumerService = RESTBuilder.getService(ArticoloRESTConsumerService.class);
articoloRESTConsumerService
.retrieveAvailableUntMis()
.enqueue(new Callback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<MtbUntMis>> call, Response<ServiceRESTResponse<MtbUntMis>> response) {
analyzeAnswerList(response, "retrieveAvailableUntMis", onComplete, onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<MtbUntMis>> call, Throwable t) {
onFailed.run(new Exception(t));
}
});
}
public void retrieveAvailableGruppiMerceologici(RunnableArgs<List<MtbGrup>> onComplete, RunnableArgs<Exception> onFailed) {
ArticoloRESTConsumerService articoloRESTConsumerService = RESTBuilder.getService(ArticoloRESTConsumerService.class);
articoloRESTConsumerService
.retrieveAvailableGruppiMerceologici()
.enqueue(new Callback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<MtbGrup>> call, Response<ServiceRESTResponse<MtbGrup>> response) {
analyzeAnswerList(response, "retrieveAvailableGruppiMerceologici", onComplete, onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<MtbGrup>> call, Throwable t) {
onFailed.run(new Exception(t));
}
});
}
public void searchByBarcode(String barcodeProd, RunnableArgs<List<MtbAart>> onComplete, RunnableArgs<Exception> onFailed) {
ArticoloRESTConsumerService articoloRESTConsumerService = RESTBuilder.getService(ArticoloRESTConsumerService.class);
@@ -205,4 +243,28 @@ public class ArticoloRESTConsumer extends _BaseRESTConsumer {
}
});
}
public void saveArticolo(ArticoloDTO articoloToSave, RunnableArgs<String> onComplete, RunnableArgs<Exception> onFailed) {
ArticoloRESTConsumerService articoloRESTConsumerService = RESTBuilder.getService(ArticoloRESTConsumerService.class);
var request = new SaveArticoloRequestDTO()
.setArtToSave(articoloToSave);
articoloRESTConsumerService
.saveArticolo(request)
.enqueue(new Callback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<SaveArticoloResponseDTO>> call, Response<ServiceRESTResponse<SaveArticoloResponseDTO>> response) {
analyzeAnswer(response, "saveArticolo", data -> {
onComplete.run(data.getCodMart());
}, onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<SaveArticoloResponseDTO>> call, Throwable t) {
onFailed.run(new Exception(t));
}
});
}
}

View File

@@ -3,9 +3,13 @@ package it.integry.integrywmsnative.core.rest.consumers;
import java.util.List;
import it.integry.integrywmsnative.core.model.MtbAart;
import it.integry.integrywmsnative.core.model.MtbGrup;
import it.integry.integrywmsnative.core.model.MtbUntMis;
import it.integry.integrywmsnative.core.model.dto.StatoArticoloDTO;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.rest.model.articolo.RetrieveArticoloByCodMartRequestDTO;
import it.integry.integrywmsnative.core.rest.model.articolo.SaveArticoloRequestDTO;
import it.integry.integrywmsnative.core.rest.model.articolo.SaveArticoloResponseDTO;
import it.integry.integrywmsnative.core.rest.model.articolo.SearchArticoloByBarcodeRequestDTO;
import it.integry.integrywmsnative.core.rest.model.articolo.SearchArticoloByBarcodeResponseDTO;
import it.integry.integrywmsnative.core.rest.model.articolo.UpdateBarcodeImballoRequestDTO;
@@ -17,6 +21,13 @@ import retrofit2.http.Query;
public interface ArticoloRESTConsumerService {
@GET("wms/articolo/availableUntMis")
Call<ServiceRESTResponse<MtbUntMis>> retrieveAvailableUntMis();
@GET("wms/articolo/availableGruppiMerceologici")
Call<ServiceRESTResponse<MtbGrup>> retrieveAvailableGruppiMerceologici();
@POST("wms/articolo/searchByBarcode")
Call<ServiceRESTResponse<SearchArticoloByBarcodeResponseDTO>> searchByBarcode(@Body() SearchArticoloByBarcodeRequestDTO searchArticoloByBarcodeRequest);
@@ -29,4 +40,7 @@ public interface ArticoloRESTConsumerService {
@GET("getProductLotStatus")
Call<ServiceRESTResponse<List<StatoArticoloDTO>>> getStatoPartita(@Query("codMart") String codMart, @Query("partitaMag") String partitaMag);
@POST("wms/articolo/saveArticolo")
Call<ServiceRESTResponse<SaveArticoloResponseDTO>> saveArticolo(@Body SaveArticoloRequestDTO saveArticoloRequest);
}

View File

@@ -286,7 +286,7 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
public void onResponse(Call<ServiceRESTResponse<MtbColt>> call, Response<ServiceRESTResponse<MtbColt>> response) {
analyzeAnswer(response, "GetBySSCC", mtbColt -> {
if (mtbColt != null && mtbColt.getMtbColr() != null && mtbColt.getMtbColr().size() > 0) {
if (mtbColt != null && mtbColt.getMtbColr() != null && !mtbColt.getMtbColr().isEmpty()) {
List<MtbColt> mtbColtList = new ArrayList<>();
mtbColtList.add(mtbColt);
fillMtbAartsOfMtbColts(mtbColtList, mtbColts -> onComplete.run(mtbColts.get(0)), onFailed);

View File

@@ -0,0 +1,257 @@
package it.integry.integrywmsnative.core.rest.model.articolo;
import java.math.BigDecimal;
public class ArticoloDTO {
private String codMart;
private String descrizione;
private String untMis;
private String barcode;
private BigDecimal qtaCnf;
private String codAliq;
private String articoloComposto;
private String descrizioneEstesa;
private String note;
private String posizione;
private String codMgrp;
private String codMsfa;
private String codMsgr;
private String codMstp;
private String codMtip;
private boolean flagStato;
private String barcodeImballo;
private String diacod;
private boolean flagQtaCnfFissa;
private String idArtEqui;
private boolean flagKit;
private String precode;
private String gruppo;
private String sottoGruppo;
private String sottoFamiglia;
public String getCodMart() {
return codMart;
}
public ArticoloDTO setCodMart(String codMart) {
this.codMart = codMart;
return this;
}
public String getDescrizione() {
return descrizione;
}
public ArticoloDTO setDescrizione(String descrizione) {
this.descrizione = descrizione;
return this;
}
public String getUntMis() {
return untMis;
}
public ArticoloDTO setUntMis(String untMis) {
this.untMis = untMis;
return this;
}
public String getBarcode() {
return barcode;
}
public ArticoloDTO setBarcode(String barcode) {
this.barcode = barcode;
return this;
}
public BigDecimal getQtaCnf() {
return qtaCnf;
}
public ArticoloDTO setQtaCnf(BigDecimal qtaCnf) {
this.qtaCnf = qtaCnf;
return this;
}
public String getCodAliq() {
return codAliq;
}
public ArticoloDTO setCodAliq(String codAliq) {
this.codAliq = codAliq;
return this;
}
public String getArticoloComposto() {
return articoloComposto;
}
public ArticoloDTO setArticoloComposto(String articoloComposto) {
this.articoloComposto = articoloComposto;
return this;
}
public String getDescrizioneEstesa() {
return descrizioneEstesa;
}
public ArticoloDTO setDescrizioneEstesa(String descrizioneEstesa) {
this.descrizioneEstesa = descrizioneEstesa;
return this;
}
public String getNote() {
return note;
}
public ArticoloDTO setNote(String note) {
this.note = note;
return this;
}
public String getPosizione() {
return posizione;
}
public ArticoloDTO setPosizione(String posizione) {
this.posizione = posizione;
return this;
}
public String getCodMgrp() {
return codMgrp;
}
public ArticoloDTO setCodMgrp(String codMgrp) {
this.codMgrp = codMgrp;
return this;
}
public String getCodMsfa() {
return codMsfa;
}
public ArticoloDTO setCodMsfa(String codMsfa) {
this.codMsfa = codMsfa;
return this;
}
public String getCodMsgr() {
return codMsgr;
}
public ArticoloDTO setCodMsgr(String codMsgr) {
this.codMsgr = codMsgr;
return this;
}
public String getCodMstp() {
return codMstp;
}
public ArticoloDTO setCodMstp(String codMstp) {
this.codMstp = codMstp;
return this;
}
public String getCodMtip() {
return codMtip;
}
public ArticoloDTO setCodMtip(String codMtip) {
this.codMtip = codMtip;
return this;
}
public boolean isFlagStato() {
return flagStato;
}
public ArticoloDTO setFlagStato(boolean flagStato) {
this.flagStato = flagStato;
return this;
}
public String getBarcodeImballo() {
return barcodeImballo;
}
public ArticoloDTO setBarcodeImballo(String barcodeImballo) {
this.barcodeImballo = barcodeImballo;
return this;
}
public String getDiacod() {
return diacod;
}
public ArticoloDTO setDiacod(String diacod) {
this.diacod = diacod;
return this;
}
public boolean isFlagQtaCnfFissa() {
return flagQtaCnfFissa;
}
public ArticoloDTO setFlagQtaCnfFissa(boolean flagQtaCnfFissa) {
this.flagQtaCnfFissa = flagQtaCnfFissa;
return this;
}
public String getIdArtEqui() {
return idArtEqui;
}
public ArticoloDTO setIdArtEqui(String idArtEqui) {
this.idArtEqui = idArtEqui;
return this;
}
public boolean isFlagKit() {
return flagKit;
}
public ArticoloDTO setFlagKit(boolean flagKit) {
this.flagKit = flagKit;
return this;
}
public String getPrecode() {
return precode;
}
public ArticoloDTO setPrecode(String precode) {
this.precode = precode;
return this;
}
public String getGruppo() {
return gruppo;
}
public ArticoloDTO setGruppo(String gruppo) {
this.gruppo = gruppo;
return this;
}
public String getSottoGruppo() {
return sottoGruppo;
}
public ArticoloDTO setSottoGruppo(String sottoGruppo) {
this.sottoGruppo = sottoGruppo;
return this;
}
public String getSottoFamiglia() {
return sottoFamiglia;
}
public ArticoloDTO setSottoFamiglia(String sottoFamiglia) {
this.sottoFamiglia = sottoFamiglia;
return this;
}
}

View File

@@ -0,0 +1,14 @@
package it.integry.integrywmsnative.core.rest.model.articolo;
public class SaveArticoloRequestDTO {
private ArticoloDTO artToSave;
public ArticoloDTO getArtToSave() {
return artToSave;
}
public SaveArticoloRequestDTO setArtToSave(ArticoloDTO artToSave) {
this.artToSave = artToSave;
return this;
}
}

View File

@@ -0,0 +1,9 @@
package it.integry.integrywmsnative.core.rest.model.articolo;
public class SaveArticoloResponseDTO {
private String codMart;
public String getCodMart() {
return codMart;
}
}

View File

@@ -83,6 +83,8 @@ public class DBSettingsModel {
private boolean suggestDataScad = false;
private boolean flagPositionChangeRequest = false;
private String docInterniRequestNumDoc;
private boolean flagEnableArtCreation;
private List<String> allowedCodMgrpForArtCreation;
public boolean isFlagSpedizioneEnableFakeGiacenza() {
return flagSpedizioneEnableFakeGiacenza;
@@ -705,6 +707,24 @@ public class DBSettingsModel {
return this;
}
public List<String> getAllowedCodMgrpForArtCreation() {
return allowedCodMgrpForArtCreation;
}
public DBSettingsModel setAllowedCodMgrpForArtCreation(List<String> allowedCodMgrpForArtCreation) {
this.allowedCodMgrpForArtCreation = allowedCodMgrpForArtCreation;
return this;
}
public boolean isFlagEnableArtCreation() {
return flagEnableArtCreation;
}
public DBSettingsModel setFlagEnableArtCreation(boolean flagEnableArtCreation) {
this.flagEnableArtCreation = flagEnableArtCreation;
return this;
}
public boolean isFlagPositionChangeRequest() {
return flagPositionChangeRequest;
}

View File

@@ -569,6 +569,21 @@ public class SettingsManager {
.setKeySection("REQUEST_NUM_DOC")
.setSetter(dbSettingsModelIstance::setDocInterniRequestNumDoc));
stbGestSetupReaderList.add(new StbGestSetupReader<>(Boolean.class)
.setGestName("PICKING")
.setSection("SETUP")
.setKeySection("ENABLE_ART_CREATION")
.setSetter(dbSettingsModelIstance::setFlagEnableArtCreation));
stbGestSetupReaderList.add(new StbGestSetupReader<>(String.class)
.setGestName("PICKING")
.setSection("SETUP")
.setKeySection("ENABLE_ART_CREATION_GRP_MERC")
.setSetter(data -> {
if (data != null)
dbSettingsModelIstance.setAllowedCodMgrpForArtCreation(Arrays.asList(data.split("\\|")));
}));
String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep();

View File

@@ -1,6 +1,12 @@
package it.integry.integrywmsnative.core.utility;
import android.graphics.Bitmap;
import android.graphics.Color;
import com.annimon.stream.Stream;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import java.util.Calendar;
@@ -109,12 +115,12 @@ public class UtilityBarcode {
}
public static String convertITF14toEAN13(String barcodeITF14) {
public static String convertITF14toEAN13(String barcodeITF14) throws Exception {
String barcodeEAN13 = null;
if (barcodeITF14.length() == 14) {
barcodeEAN13 = barcodeITF14.substring(1, barcodeITF14.length() - 1).trim();
barcodeEAN13 += getEAN13CheckDigit(barcodeEAN13);
barcodeEAN13 += calculateEAN13CheckDigit(barcodeEAN13);
}
return barcodeEAN13;
@@ -131,18 +137,69 @@ public class UtilityBarcode {
}
private static String getEAN13CheckDigit(String ean) {
if (ean.length() != 12) {
UtilityLogger.error(new Exception("Please provide an input string of 12 chars. Current lenght: " + ean.length()));
return null;
public static boolean isValidEan13(String ean13) {
// Verifica che il codice sia lungo esattamente 13 cifre
if (ean13.length() != 13 || !ean13.matches("\\d+")) {
return false;
}
long tot = 0;
for (int i = 0; i < 12; i++) {
tot = tot + (Long.parseLong(String.valueOf(ean.charAt(i))) * (i % 2 == 0 ? 1 : 3));
}
return tot % 10 == 0 ? "0" : "" + (10 - (tot % 10));
// Calcola il check digit dalle prime 12 cifre
int calculatedCheckDigit = calculateEAN13CheckDigit(ean13.substring(0, 12));
int providedCheckDigit = Character.getNumericValue(ean13.charAt(12));
// Confronta il check digit calcolato con quello fornito
return calculatedCheckDigit == providedCheckDigit;
}
private static int calculateEAN13CheckDigit(String ean12) {
int sum = 0;
for (int i = 0; i < ean12.length(); i++) {
int digit = Character.getNumericValue(ean12.charAt(i));
sum += (i % 2 == 0) ? digit : digit * 3;
}
return (10 - (sum % 10)) % 10;
}
public static Bitmap generateBarcodeImage(String barcode, int width, int height) throws Exception {
if(barcode == null) return null;
BarcodeType barcodeType;
if(barcode.length() == 8)
barcodeType = BarcodeType.EAN8;
else if(barcode.length() == 13)
barcodeType = BarcodeType.EAN13;
else if(barcode.length() == 14)
barcodeType = BarcodeType.INTERLEAVED_2OF5;
else throw new Exception("Barcode " + barcode + " non valido");
return generateBarcodeImage(barcode, barcodeType, width, height);
}
public static Bitmap generateBarcodeImage(String barcode, BarcodeType type, int width, int height) throws Exception {
// Genera la matrice del codice a barre
MultiFormatWriter writer = new MultiFormatWriter();
BarcodeFormat barcodeFormat = switch (type) {
case EAN8 -> BarcodeFormat.EAN_8;
case EAN13 -> BarcodeFormat.EAN_13;
case INTERLEAVED_2OF5 -> BarcodeFormat.ITF;
case CODE128 -> BarcodeFormat.CODE_128;
default -> throw new Exception("Barcode " + barcode + " non valido (tipo: " + type + ")");
};
BitMatrix bitMatrix = writer.encode(barcode, barcodeFormat, width, height);
// Crea un bitmap a partire dalla matrice
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
bitmap.setPixel(x, y, bitMatrix.get(x, y) ? Color.BLACK : Color.WHITE);
}
}
return bitmap;
}
}

View File

@@ -1,9 +1,16 @@
package it.integry.integrywmsnative.core.utility;
import androidx.databinding.Observable;
import androidx.databinding.ObservableArrayList;
import androidx.databinding.ObservableField;
import androidx.databinding.ObservableList;
import java.util.stream.Collectors;
import it.integry.integrywmsnative.core.expansion.OnGeneralChangedCallback;
import it.integry.integrywmsnative.core.expansion.OnListGeneralChangedCallback;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.expansion.RunnableArgsWithReturn;
public class UtilityObservable {
@@ -16,4 +23,36 @@ public class UtilityObservable {
});
}
public static <T, R> ObservableField<R> convertObservable(ObservableField<T> observableField, RunnableArgsWithReturn<T, R> dataConverter) {
ObservableField<R> returnObservable = new ObservableField<>();
observableField.addOnPropertyChangedCallback(new OnGeneralChangedCallback() {
@Override
public void run() {
returnObservable.set(dataConverter.run(observableField.get()));
}
});
returnObservable.set(dataConverter.run(observableField.get()));
return returnObservable;
}
public static <T, R> ObservableArrayList<R> convertObservableArrayList(ObservableArrayList<T> observableField, RunnableArgsWithReturn<T, R> dataConverter) {
ObservableArrayList<R> returnObservable = new ObservableArrayList<>();
observableField.addOnListChangedCallback(new OnListGeneralChangedCallback<T>() {
@Override
public void onChanged(ObservableList<T> sender) {
returnObservable.clear();
returnObservable.addAll(sender.stream().map(dataConverter::run).collect(Collectors.toUnmodifiableList()));
}
});
returnObservable.addAll(observableField.stream().map(dataConverter::run).collect(Collectors.toUnmodifiableList()));
return returnObservable;
}
}

View File

@@ -195,6 +195,9 @@ public class ProdRecuperoMaterialeViewModel {
mtbColtScarico.getMtbColr().add(mtbColrScarico);
}
} else {
BigDecimal qtaColToSave;
BigDecimal numCnfToSave;
if (SettingsManager.iDB().isFlagForceAllToColli() || (item.getMtbAart() != null && !item.getMtbAart().isFlagQtaCnfFissaBoolean())) {

View File

@@ -97,7 +97,7 @@ public class PVOrdineAcquistoEditActivity extends BaseActivity implements PVOrdi
}
String testataOrdString = String.format(this.getString(R.string.ord_acq_testata), ordine.getOrdineId(), UtilityDate.formatDate(ordine.getDataIns(), UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN));
mBinding.orderIdentifier.setText(Html.fromHtml(testataOrdString));
FabMenuCustomAnimations.changeIconOnFocus(mBinding.closeActivityFab, R.drawable.ic_check_white_24dp, R.drawable.ic_close_24dp);
FabMenuCustomAnimations.changeIconOnFocus(mBinding.closeActivityFab, R.drawable.ic_round_check_24, R.drawable.ic_close_24dp);
initBarcodeReader();

View File

@@ -15,8 +15,6 @@ import android.view.inputmethod.EditorInfo;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.core.content.ContextCompat;
import androidx.core.content.res.ResourcesCompat;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ObservableField;
import androidx.recyclerview.widget.LinearLayoutManager;
@@ -63,6 +61,7 @@ import it.integry.integrywmsnative.view.dialogs.DialogConsts;
import it.integry.integrywmsnative.view.dialogs.ask_position_of_lu.DialogAskPositionOfLUView;
import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView;
import it.integry.integrywmsnative.view.dialogs.choose_art_from_lista_arts.DialogChooseArtFromListaArtsView;
import it.integry.integrywmsnative.view.dialogs.create_new_art.DialogCreateNewArtView;
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.scan_or_create_lu.DialogScanOrCreateLUView;
@@ -142,7 +141,7 @@ public class RettificaGiacenzeFragment extends BaseFragment implements ITitledFr
Bundle savedInstanceState) {
setRetainInstance(true);
mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_main_rettifica_giacenze, container, false);
mBinding = FragmentMainRettificaGiacenzeBinding.inflate(inflater, container, false);
mBinding.setLifecycleOwner(this);
@@ -205,15 +204,18 @@ public class RettificaGiacenzeFragment extends BaseFragment implements ITitledFr
private void init() {
mBinding.autoCompleteFornitori.setOnFocusChangeListener((v, hasFocus) -> {
setUIToForn();
if (hasFocus)
setUIToForn();
});
mBinding.inputCodArtDescrForn.setOnFocusChangeListener((v, hasFocus) -> {
setUIToForn();
if (hasFocus)
setUIToForn();
});
mBinding.inputCodArtDescrInt.setOnFocusChangeListener((v, hasFocus) -> {
setUIToIntArt();
if (hasFocus)
setUIToIntArt();
});
mViewModel.init(
@@ -238,23 +240,30 @@ public class RettificaGiacenzeFragment extends BaseFragment implements ITitledFr
public void setUIToForn() {
mBinding.rettificaGiacenzeFornCheckBox.setChecked(true);
mBinding.rettificaGiacenzeFornLayout.setBackground(ResourcesCompat.getDrawable(getActivity().getResources(), R.drawable.circular_background_left, null));
mBinding.rettificaGiacenzeFornLayout.setBackgroundTintList(ColorStateList.valueOf(getActivity().getResources().getColor(R.color.alpha_blue_500)));
mBinding.rettificaGiacenzeArtIntCheckBox.setChecked(false);
mBinding.rettificaGiacenzeArtIntLayout.setBackground(null);
mBinding.rettificaGiacenzeArtIntLayout.setBackgroundTintList(null);
mBinding.inputCodArtDescrInt.clearFocus();
if (!mBinding.inputCodArtDescrForn.hasFocus() && !mBinding.autoCompleteFornitori.hasFocus()) {
mBinding.inputCodArtDescrForn.clearFocus();
mBinding.autoCompleteFornitori.requestFocusFromTouch();
}
}
public void setUIToIntArt() {
mBinding.rettificaGiacenzeArtIntCheckBox.setChecked(true);
mBinding.rettificaGiacenzeArtIntLayout.setBackground(ResourcesCompat.getDrawable(getActivity().getResources(), R.drawable.circular_background_left, null));
mBinding.rettificaGiacenzeArtIntLayout.setBackgroundTintList(ColorStateList.valueOf(getActivity().getResources().getColor(R.color.alpha_blue_500)));
mBinding.rettificaGiacenzeFornCheckBox.setChecked(false);
mBinding.rettificaGiacenzeFornLayout.setBackground(null);
mBinding.rettificaGiacenzeFornLayout.setBackgroundTintList(null);
mBinding.inputCodArtDescrForn.clearFocus();
mBinding.autoCompleteFornitori.clearFocus();
mBinding.inputCodArtDescrInt.requestFocusFromTouch();
}
@Override
@@ -295,13 +304,22 @@ public class RettificaGiacenzeFragment extends BaseFragment implements ITitledFr
return true;
}
mViewModel.searchArtInt(mBinding.inputCodArtDescrInt.getText().toString(), null);
mViewModel.searchArtInt(mBinding.inputCodArtDescrInt.getText().toString(), null, null);
return true;
}
return false;
});
}
@Override
public void onRequestNewArtCreation(String description, BarcodeScanDTO barcode) {
DialogCreateNewArtView.newInstance(description, barcode, currentMtbColtObs.get().getPosizione(),
createdCodMart -> {
mViewModel.searchArtInt(createdCodMart, null, null);
})
.show(requireActivity().getSupportFragmentManager(), "tag");
}
@Override
public void onArtListLoaded(ArrayList<MtbAart> artList, RunnableArgs<MtbAart> onArtChoosed) {
new DialogChooseArtFromListaArtsView(true, artList, onArtChoosed)
@@ -418,10 +436,11 @@ public class RettificaGiacenzeFragment extends BaseFragment implements ITitledFr
onComplete.run(pickedQuantityDTO, shouldCloseLU);
})
.show(requireActivity().getSupportFragmentManager(), "tag");
}, () -> {});
}, () -> {
});
}
private void checkIfItemIsActive(String flagStato, String codMart, Runnable onContinue, Runnable onNegativeClick){
private void checkIfItemIsActive(String flagStato, String codMart, Runnable onContinue, Runnable onNegativeClick) {
if (flagStato.equalsIgnoreCase("I")) {
DialogSimpleMessageView.makeWarningDialog(
new SpannableString(Html.fromHtml(String.format(UtilityResources.getString(R.string.item_not_enabled), codMart))),

View File

@@ -111,7 +111,10 @@ public class RettificaGiacenzeViewModel {
public void processBarcodeDTO(BarcodeScanDTO barcodeScanDTO, Runnable onComplete) {
if (UtilityBarcode.isEtichetta128(barcodeScanDTO)) {
if(UtilityBarcode.isEtichettaPosizione(barcodeScanDTO)) {
//Not implemented now
onComplete.run();
} else if (UtilityBarcode.isEtichetta128(barcodeScanDTO)) {
//Cerco tramite etichetta ean 128 (che può indicarmi un articolo o una UL)
this.executeEtichettaEan128(barcodeScanDTO, onComplete);
@@ -120,7 +123,7 @@ public class RettificaGiacenzeViewModel {
this.executeEtichettaEanPeso(barcodeScanDTO, onComplete);
} else if (UtilityBarcode.isEtichettaArt(barcodeScanDTO)) {
this.searchArtInt(barcodeScanDTO.getStringValue(), onComplete);
this.searchArtInt(null, barcodeScanDTO, onComplete);
} else {
onComplete.run();
@@ -145,9 +148,9 @@ public class RettificaGiacenzeViewModel {
if (!UtilityString.isNullOrEmpty(barcodeProd)) {
PickDataDTO pickDataDTO = PickDataDTO.fromEan128(ean128Model);
this.loadArticolo(barcodeProd, pickDataDTO, onComplete);
this.loadArticolo(barcodeProd, pickDataDTO, barcodeScanDTO, onComplete);
} else if (!UtilityString.isNullOrEmpty(codMart)) {
this.searchArtInt(codMart, onComplete);
this.searchArtInt(codMart, barcodeScanDTO, onComplete);
} else {
//EAN 128 non completo o comunque mancano i riferimenti al prodotto
onComplete.run();
@@ -158,18 +161,18 @@ public class RettificaGiacenzeViewModel {
private void executeEtichettaEanPeso(BarcodeScanDTO barcodeScanDTO, Runnable onComplete) {
try {
Ean13PesoModel ean13PesoModel = Ean13PesoModel.fromBarcode(barcodeScanDTO.getStringValue());
this.loadArticolo(ean13PesoModel.getPrecode(), PickDataDTO.fromEan128(ean13PesoModel.toEan128()), onComplete);
this.loadArticolo(ean13PesoModel.getPrecode(), PickDataDTO.fromEan128(ean13PesoModel.toEan128()), barcodeScanDTO, onComplete);
} catch (Exception ex) {
this.sendError(ex);
}
}
private void loadArticolo(String barcodeProd, PickDataDTO pickData, Runnable onComplete) {
private void loadArticolo(String barcodeProd, PickDataDTO pickData, BarcodeScanDTO barcodeScanDTO, Runnable onComplete) {
this.mArticoloRESTConsumer.searchByBarcode(barcodeProd, mtbAartList -> {
if (onComplete != null) onComplete.run();
if (mtbAartList != null && !mtbAartList.isEmpty()) {
this.dispatchArts(mtbAartList, pickData);
this.dispatchArts(mtbAartList, pickData, null, barcodeScanDTO);
} else {
this.sendError(new NoResultFromBarcodeException(barcodeProd));
}
@@ -190,25 +193,28 @@ public class RettificaGiacenzeViewModel {
.map(x -> (MtbAart) x.getMtbAart())
.toList();
dispatchArts(mtbAarts, null);
dispatchArts(mtbAarts, null, queryText, null);
}, this::sendError);
}
public void searchArtInt(String queryText, Runnable onComplete) {
public void searchArtInt(String queryText, BarcodeScanDTO barcodeScanDTO, Runnable onComplete) {
this.sendOnLoadingStarted();
mRettificaGiacenzeRESTConsumer.searchArtInt(queryText, listaArts -> {
mRettificaGiacenzeRESTConsumer.searchArtInt(UtilityString.isNull(queryText, barcodeScanDTO.getStringValue()), listaArts -> {
this.sendOnLoadingEnded();
dispatchArts(listaArts, null);
dispatchArts(listaArts, null, queryText, barcodeScanDTO);
if (onComplete != null) onComplete.run();
}, this::sendError);
}
private void dispatchArts(List<MtbAart> artsList, PickDataDTO pickData) {
if (artsList == null || artsList.size() == 0) {
this.sendError(new NoArtsFoundException());
private void dispatchArts(List<MtbAart> artsList, PickDataDTO pickData, String description, BarcodeScanDTO barcodeProd) {
if (artsList == null || artsList.isEmpty()) {
if(SettingsManager.iDB().isFlagEnableArtCreation())
this.sendRequestNewArtCreation(description, barcodeProd);
else
this.sendError(new NoArtsFoundException());
return;
}
@@ -556,8 +562,6 @@ public class RettificaGiacenzeViewModel {
private void saveEditedRow(MtbColr mtbColrToUpdate, BigDecimal numCnf, BigDecimal qtaCnf, BigDecimal qtaTot, String partitaMag, LocalDate dataScad, boolean shouldCloseLU) {
this.sendOnLoadingStarted();
// if(!mIsCreatedLU && mCurrentMtbColt.isDocumentPresent()) {
this.mColliMagazzinoRESTConsumer.creaRettificaCollo(
mtbColrToUpdate,
numCnf,
@@ -579,47 +583,6 @@ public class RettificaGiacenzeViewModel {
},
this::sendError
);
// } else {
//
// MtbColt mtbColt = new MtbColt()
// .setNumCollo(mtbColrToUpdate.getNumCollo())
// .setDataCollo(mtbColrToUpdate.getDataColloS())
// .setSerCollo(mtbColrToUpdate.getSerCollo())
// .setGestione(mtbColrToUpdate.getGestione())
// .setMtbColr(new ObservableArrayList<>());
// mtbColt.setOperation(CommonModelConsts.OPERATION.NO_OP);
//
// final MtbColr mtbColr = (MtbColr) mtbColrToUpdate.clone();
// mtbColr
// .setNumCnf(numCnf.subtract(mtbColr.getNumCnf()))
// .setQtaCnf(qtaCnf)
// .setQtaCol(qtaTot.subtract(mtbColr.getQtaCol()))
// .setPartitaMag(partitaMag)
// .setDataScadPartita(dataScad)
// .setUtente(SettingsManager.i().getUser().getFullname())
// .setCausale(MtbColr.Causale.RETTIFICA)
// .setDatetimeRow(UtilityDate.getDateInstance())
// .setOperation(CommonModelConsts.OPERATION.INSERT);
//
// mtbColt.getMtbColr().add(mtbColr);
//
// this.mColliMagazzinoRESTConsumer.saveCollo(mtbColt, (value) -> {
//
// mtbColr.setNumCnf(numCnf)
// .setQtaCnf(qtaCnf)
// .setQtaCol(qtaTot);
//
// this.mCurrentMtbColt.getMtbColr().remove(mtbColrToUpdate);
// this.mCurrentMtbColt.getMtbColr().add(mtbColr);
//
// this.mAnyEditDone = true;
//
// this.sendOnRowSaved();
// this.sendOnLoadingEnded();
//
// }, this::sendError);
// }
}
public void deleteRow(MtbColr mtbColrToDelete) {
@@ -627,7 +590,6 @@ public class RettificaGiacenzeViewModel {
if (shouldDelete) {
this.sendOnLoadingStarted();
// if(!mIsCreatedLU && mCurrentMtbColt.isDocumentPresent()) {
this.mColliMagazzinoRESTConsumer.creaRettificaCollo(
mtbColrToDelete,
BigDecimal.ZERO,
@@ -639,37 +601,6 @@ public class RettificaGiacenzeViewModel {
},
this::sendError
);
// } else {
// MtbColt mtbColt = new MtbColt()
// .setNumCollo(mtbColrToDelete.getNumCollo())
// .setDataCollo(mtbColrToDelete.getDataColloS())
// .setSerCollo(mtbColrToDelete.getSerCollo())
// .setGestione(mtbColrToDelete.getGestione())
// .setMtbColr(new ObservableArrayList<>());
// mtbColt.setOperation(CommonModelConsts.OPERATION.NO_OP);
//
// MtbColr mtbColr = (MtbColr) mtbColrToDelete.clone();
// mtbColr
// .setNumCnf(mtbColr.getNumCnf().multiply(new BigDecimal(-1)))
// .setQtaCnf(mtbColr.getQtaCnf())
// .setQtaCol(mtbColr.getQtaCol().multiply(new BigDecimal(-1)))
// .setPartitaMag(mtbColr.getPartitaMag())
// .setDataScadPartita(mtbColr.getDataScadPartitaD())
// .setUtente(SettingsManager.i().getUser().getFullname())
// .setCausale(MtbColr.Causale.RETTIFICA)
// .setDatetimeRow(UtilityDate.getDateInstance())
// .setOperation(CommonModelConsts.OPERATION.INSERT);
//
// mtbColt.getMtbColr().add(mtbColr);
//
// this.mColliMagazzinoRESTConsumer.saveCollo(mtbColt, (value) -> {
// this.mCurrentMtbColt.getMtbColr().remove(mtbColrToDelete);
//
// this.sendOnRowSaved();
// this.sendOnLoadingEnded();
//
// }, this::sendError);
// }
}
});
}
@@ -686,6 +617,10 @@ public class RettificaGiacenzeViewModel {
if (this.mListener != null) mListener.onFornitoriLoaded(fornitoriList);
}
private void sendRequestNewArtCreation(String description, BarcodeScanDTO barcode) {
if(this.mListener != null) mListener.onRequestNewArtCreation(description, barcode);
}
private void sendOnArtListLoaded(ArrayList<MtbAart> artList, RunnableArgs<MtbAart> onArtChoosed) {
if (this.mListener != null) mListener.onArtListLoaded(artList, onArtChoosed);
@@ -777,6 +712,8 @@ public class RettificaGiacenzeViewModel {
void onFornitoriLoaded(ArrayList<FornitoreDTO> fornitoriList);
void onRequestNewArtCreation(String description, BarcodeScanDTO barcode);
void onArtListLoaded(ArrayList<MtbAart> artList, RunnableArgs<MtbAart> onArtChoosed);
void onLUOpenRequest(boolean enableCreation, boolean checkIfDocumentExists, boolean warnOnOpeningVendita, RunnableArgss<MtbColt, Boolean> onComplete);

View File

@@ -104,7 +104,8 @@ public class DialogUltimeConsegneFiltroAvanzato {
private void initView(DialogUltimeConsegneFiltroAvanzatoBinding bindings, DialogUltimeConsegneFiltroAvanzatoViewModel viewModel) {
arrayAdapterRagSoc = new SimpleAutoCompleteDropdownAdapter(mContext, R.layout.dialog_vendita_filtro_avanzato__single_item, getAvailableRagSocs(false));
arrayAdapterRagSoc = new SimpleAutoCompleteDropdownAdapter<>(mContext, R.layout.dialog_vendita_filtro_avanzato__single_item, getAvailableRagSocs(false));
arrayAdapterRagSoc.addAll();
bindings.filledExposedDropdownRagSoc.setAdapter(arrayAdapterRagSoc);
bindings.filledExposedDropdownDataDoc.setOnClickListener(view -> {

View File

@@ -1,105 +1,116 @@
package it.integry.integrywmsnative.ui.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import androidx.annotation.NonNull;
import androidx.databinding.ObservableArrayList;
import androidx.databinding.ObservableList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class SimpleAutoCompleteDropdownAdapter extends ArrayAdapter {
public class SimpleAutoCompleteDropdownAdapter<T> extends ArrayAdapter<T> {
private List<Object> mObjects;
private final ObservableArrayList<T> objects;
private final LayoutInflater mInflater;
private int mDropDownResource;
public SimpleAutoCompleteDropdownAdapter(@NonNull Context context, int resource) {
super(context, resource);
public SimpleAutoCompleteDropdownAdapter(@NonNull Context context, int resource, @NonNull List<T> objects) {
this(context, resource, new ObservableArrayList<>());
this.objects.addAll(objects);
}
public SimpleAutoCompleteDropdownAdapter(@NonNull Context context, int resource, int textViewResourceId) {
super(context, resource, textViewResourceId);
public SimpleAutoCompleteDropdownAdapter(@NonNull Context context, int resource, @NonNull ObservableArrayList<T> objects) {
super(context, resource, new ArrayList<>(objects));
mInflater = LayoutInflater.from(context);
mDropDownResource = resource;
this.objects = objects;
// Listener per aggiornare l'adapter quando la lista cambia
this.objects.addOnListChangedCallback(new ObservableList.OnListChangedCallback<ObservableList<T>>() {
@Override
public void onChanged(ObservableList<T> sender) {
updateAdapter();
}
@Override
public void onItemRangeChanged(ObservableList<T> sender, int positionStart, int itemCount) {
updateAdapter();
}
@Override
public void onItemRangeInserted(ObservableList<T> sender, int positionStart, int itemCount) {
updateAdapter();
}
@Override
public void onItemRangeMoved(ObservableList<T> sender, int fromPosition, int toPosition, int itemCount) {
updateAdapter();
}
@Override
public void onItemRangeRemoved(ObservableList<T> sender, int positionStart, int itemCount) {
updateAdapter();
}
});
}
public SimpleAutoCompleteDropdownAdapter(@NonNull Context context, int resource, @NonNull Object[] objects) {
super(context, resource, objects);
mObjects = Arrays.asList(objects);
private void updateAdapter() {
clear();
addAll(objects);
notifyDataSetChanged();
}
public SimpleAutoCompleteDropdownAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull Object[] objects) {
super(context, resource, textViewResourceId, objects);
mObjects = Arrays.asList(objects);
}
public SimpleAutoCompleteDropdownAdapter(@NonNull Context context, int resource, @NonNull List objects) {
super(context, resource, objects);
mObjects = objects;
}
public SimpleAutoCompleteDropdownAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull List objects) {
super(context, resource, textViewResourceId, objects);
mObjects = objects;
}
@NonNull
@Override
public Filter getFilter() {
return new StringFilter(mObjects);
return new StringFilter(objects);
}
private class StringFilter extends Filter {
private class StringFilter<T> extends Filter {
private ArrayList<T> sourceObjects;
private final List<T> sourceObjects;
public StringFilter(List<T> objects) {
if(objects == null) return;
sourceObjects = new ArrayList<T>();
synchronized (this) {
sourceObjects.addAll(objects);
}
this.sourceObjects = objects;
}
@Override
protected FilterResults performFiltering(CharSequence chars) {
String filterSeq = chars.toString().toLowerCase();
String filterSeq = chars == null ? "" : chars.toString().toLowerCase();
FilterResults result = new FilterResults();
if (filterSeq != null && filterSeq.length() > 0) {
ArrayList<T> filter = new ArrayList<T>();
for (T object : sourceObjects) {
// the filtering itself:
if (object.toString().toLowerCase().contains(filterSeq))
filter.add(object);
}
result.count = filter.size();
result.values = filter;
if (filterSeq.isEmpty()) {
result.values = new ArrayList<>(sourceObjects);
result.count = sourceObjects.size();
} else {
// add all objects
synchronized (this) {
result.values = sourceObjects;
result.count = sourceObjects.size();
ArrayList<T> filtered = new ArrayList<>();
for (T object : sourceObjects) {
String stringObject = object.toString();
if (stringObject.toLowerCase().contains(filterSeq)) {
filtered.add(object);
}
}
result.values = filtered;
result.count = filtered.size();
}
return result;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
// NOTE: this function is *always* called from the UI thread.
if(constraint != null && constraint.length() > 2) {
ArrayList<T> filtered = (ArrayList<T>) results.values;
notifyDataSetChanged();
clear();
for (int i = 0, l = filtered.size(); i < l; i++)
add(filtered.get(i));
notifyDataSetInvalidated();
protected void publishResults(CharSequence constraint, FilterResults results) {
List<T> filtered = (List<T>) results.values;
if (filtered != null) {
synchronized (this) {
clear();
addAll(filtered);
notifyDataSetChanged();
}
}
}
}

View File

@@ -0,0 +1,14 @@
package it.integry.integrywmsnative.view.dialogs.create_new_art;
import dagger.Subcomponent;
@Subcomponent
public interface DialogCreateNewArtComponent {
@Subcomponent.Factory
interface Factory {
DialogCreateNewArtComponent create();
}
void inject(DialogCreateNewArtView dialogCreateNewArtView);
}

View File

@@ -0,0 +1,15 @@
package it.integry.integrywmsnative.view.dialogs.create_new_art;
import dagger.Module;
import dagger.Provides;
import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer;
@Module(subcomponents = DialogCreateNewArtComponent.class)
public class DialogCreateNewArtModule {
@Provides
DialogCreateNewArtViewModel providesDialogCreateNewArtViewModel(ArticoloRESTConsumer articoloRESTConsumer) {
return new DialogCreateNewArtViewModel(articoloRESTConsumer);
}
}

View File

@@ -0,0 +1,302 @@
package it.integry.integrywmsnative.view.dialogs.create_new_art;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.text.InputFilter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.ObservableField;
import androidx.databinding.ObservableList;
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.di.BindableBoolean;
import it.integry.integrywmsnative.core.expansion.BaseDialogFragment;
import it.integry.integrywmsnative.core.expansion.OnGeneralChangedCallback;
import it.integry.integrywmsnative.core.expansion.OnListGeneralChangedCallback;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.model.MtbDepoPosizione;
import it.integry.integrywmsnative.core.model.MtbGrup;
import it.integry.integrywmsnative.core.model.MtbSfam;
import it.integry.integrywmsnative.core.model.MtbSgrp;
import it.integry.integrywmsnative.core.model.MtbUntMis;
import it.integry.integrywmsnative.core.utility.UtilityBarcode;
import it.integry.integrywmsnative.core.utility.UtilityObservable;
import it.integry.integrywmsnative.core.utility.UtilityString;
import it.integry.integrywmsnative.databinding.DialogCreateNewArtBinding;
import it.integry.integrywmsnative.ui.adapter.SimpleAutoCompleteDropdownAdapter;
public class DialogCreateNewArtView extends BaseDialogFragment implements DialogCreateNewArtViewModel.Listener {
public final ObservableField<String> selectedUntMisText = new ObservableField<>();
public final ObservableField<String> selectedMtbGrupText = new ObservableField<>();
public final ObservableField<String> selectedMtbSubGrupText = new ObservableField<>();
public final ObservableField<String> selectedMtbSubSubGrupText = new ObservableField<>();
public final ObservableField<String> selectedPosizioneText = new ObservableField<>();
public final BindableBoolean editingBarcode = new BindableBoolean(false);
@Inject
DialogCreateNewArtViewModel mViewModel;
private DialogCreateNewArtBinding mBindings;
private Context mContext;
public final BarcodeScanDTO mScannedBarcode;
private int mBarcodeScannerIstanceID;
private final String initialPosizione;
private final RunnableArgs<String> onArticleCreated;
//Pass here all external parameters
public static DialogCreateNewArtView newInstance() {
return newInstance(null, null, null);
}
//Pass here all external parameters
public static DialogCreateNewArtView newInstance(String description, BarcodeScanDTO barcode, String posizione) {
return new DialogCreateNewArtView(description, barcode, posizione, null);
}
public static DialogCreateNewArtView newInstance(String description, BarcodeScanDTO barcode, String posizione, RunnableArgs<String> onArticleCreated) {
return new DialogCreateNewArtView(description, barcode, posizione, onArticleCreated);
}
private DialogCreateNewArtView(String description, BarcodeScanDTO barcode, String posizione, RunnableArgs<String> onArticleCreated) {
super();
this.mScannedBarcode = barcode;
this.onArticleCreated = onArticleCreated;
this.initialPosizione = posizione;
MainApplication.appComponent
.dialogCreateNewArtComponent()
.create()
.inject(this);
mViewModel.setListener(this);
if (description != null) mViewModel.descrizione.set(description.toUpperCase());
}
@Override
public int getTheme() {
return R.style.AppTheme_NewMaterial_Dialog_FullscreenDialog;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
this.mContext = requireContext();
mBindings = DialogCreateNewArtBinding.inflate(LayoutInflater.from(this.mContext), null, false);
mBindings.setLifecycleOwner(this);
mBindings.setViewmodel(mViewModel);
mBindings.setView(this);
mBindings.toolbar.setTitle("Nuovo articolo");
this.initBarcodeReader();
this.initObservable();
this.initBarcodes();
mBindings.inputDescrizioneText.setFilters(new InputFilter.AllCaps[]{
new InputFilter.AllCaps()
});
SimpleAutoCompleteDropdownAdapter<String> arrayAdapterPosizioni = new SimpleAutoCompleteDropdownAdapter<>(mContext,
android.R.layout.simple_dropdown_item_1line,
UtilityObservable.convertObservableArrayList(mViewModel.retrieveAvailablePosizioni(), MtbDepoPosizione::getPosizione));
mBindings.inputDefaultPosText.setAdapter(arrayAdapterPosizioni);
mViewModel.retrieveAvailablePosizioni().addOnListChangedCallback(new OnListGeneralChangedCallback<MtbDepoPosizione>() {
@Override
public void onChanged(ObservableList<MtbDepoPosizione> sender) {
if(!UtilityString.isNullOrEmpty(initialPosizione)) {
selectedPosizioneText.set(initialPosizione);
} else if(sender.size() == 1) {
selectedPosizioneText.set(sender.get(0).getPosizione());
}
}
});
SimpleAutoCompleteDropdownAdapter<String> arrayAdapterUntMis = new SimpleAutoCompleteDropdownAdapter<>(mContext,
android.R.layout.simple_dropdown_item_1line,
UtilityObservable.convertObservableArrayList(mViewModel.retrieveAvailableUntMis(), MtbUntMis::getUntMis));
mBindings.filledUntMisText.setAdapter(arrayAdapterUntMis);
mViewModel.retrieveAvailableUntMis().addOnListChangedCallback(new OnListGeneralChangedCallback<MtbUntMis>() {
@Override
public void onChanged(ObservableList<MtbUntMis> sender) {
if(sender.size() == 1) {
selectedUntMisText.set(sender.get(0).getUntMis());
} else if(sender.stream().anyMatch(x -> x.getUntMis().equalsIgnoreCase("PZ"))) {
MtbUntMis pzUntMis = sender.stream().filter(x -> x.getUntMis().equalsIgnoreCase("PZ")).findFirst().get();
selectedUntMisText.set(pzUntMis.getUntMis());
}
}
});
SimpleAutoCompleteDropdownAdapter<String> arrayAdapterGruppoArt = new SimpleAutoCompleteDropdownAdapter<>(mContext,
android.R.layout.simple_dropdown_item_1line,
UtilityObservable.convertObservableArrayList(mViewModel.retrieveAvailableArtGroups(), x -> String.format("%s - %s", x.getCodMgrp(), x.getDescrizione())));
mBindings.filledGruppoText.setAdapter(arrayAdapterGruppoArt);
mViewModel.retrieveAvailableArtGroups().addOnListChangedCallback(new OnListGeneralChangedCallback<MtbGrup>() {
@Override
public void onChanged(ObservableList<MtbGrup> sender) {
if(sender.size() == 1) {
selectedMtbGrupText.set(String.format("%s - %s", sender.get(0).getCodMgrp(), sender.get(0).getDescrizione()));
}
}
});
SimpleAutoCompleteDropdownAdapter<String> arrayAdapterSottoGruppoArt = new SimpleAutoCompleteDropdownAdapter<>(mContext,
android.R.layout.simple_dropdown_item_1line,
UtilityObservable.convertObservableArrayList(mViewModel.retrieveAvailableArtSubGroups(), x -> String.format("%s - %s", x.getCodMsgr(), x.getDescrizione())));
mBindings.filledSottoGruppoText.setAdapter(arrayAdapterSottoGruppoArt);
mViewModel.retrieveAvailableArtSubGroups().addOnListChangedCallback(new OnListGeneralChangedCallback<MtbSgrp>() {
@Override
public void onChanged(ObservableList<MtbSgrp> sender) {
if(sender.size() == 1) {
selectedMtbSubGrupText.set(String.format("%s - %s", sender.get(0).getCodMsgr(), sender.get(0).getDescrizione()));
}
}
});
SimpleAutoCompleteDropdownAdapter<String> arrayAdapterSottoSottoGruppoArt = new SimpleAutoCompleteDropdownAdapter<>(mContext,
android.R.layout.simple_dropdown_item_1line,
UtilityObservable.convertObservableArrayList(mViewModel.retrieveAvailableArtSubSubGroups(), x -> String.format("%s - %s", x.getCodMsfa(), x.getDescrizione())));
mBindings.filledSottoSottoGruppoText.setAdapter(arrayAdapterSottoSottoGruppoArt);
mViewModel.retrieveAvailableArtSubSubGroups().addOnListChangedCallback(new OnListGeneralChangedCallback<MtbSfam>() {
@Override
public void onChanged(ObservableList<MtbSfam> sender) {
if(sender.size() == 1) {
selectedMtbSubSubGrupText.set(String.format("%s - %s", sender.get(0).getCodMsfa(), sender.get(0).getDescrizione()));
}
}
});
mViewModel.init();
return mBindings.getRoot();
}
private void initBarcodeReader() {
mBarcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessful(data -> {
requireActivity().runOnUiThread(() -> {
if (UtilityBarcode.isEtichettaPosizione(data)) {
selectedPosizioneText.set(data.getStringValue());
} else if (editingBarcode.get()) {
mViewModel.barcodeProdotto.set(data.getStringValue());
saveBarcode();
}
});
})
.setOnScanFailed(this::onError));
}
@Override
public void onDismiss(@NonNull DialogInterface dialog) {
super.onDismiss(dialog);
BarcodeManager.removeCallback(mBarcodeScannerIstanceID);
}
private void initObservable() {
this.selectedUntMisText.addOnPropertyChangedCallback(new OnGeneralChangedCallback() {
@Override
public void run() {
mViewModel.selectedUntMis.set(mViewModel.retrieveAvailableUntMis().stream()
.filter(x -> x.getUntMis().equals(selectedUntMisText.get()))
.findFirst().orElse(null));
}
});
this.selectedMtbGrupText.addOnPropertyChangedCallback(new OnGeneralChangedCallback() {
@Override
public void run() {
mViewModel.selectedMtbGrup.set(mViewModel.retrieveAvailableArtGroups().stream()
.filter(x -> String.format("%s - %s", x.getCodMgrp(), x.getDescrizione()).equals(selectedMtbGrupText.get()))
.findFirst().orElse(null));
selectedMtbSubGrupText.set(null);
}
});
this.selectedMtbSubGrupText.addOnPropertyChangedCallback(new OnGeneralChangedCallback() {
@Override
public void run() {
mViewModel.selectedMtbSubGrup.set(mViewModel.retrieveAvailableArtSubGroups().stream()
.filter(x -> String.format("%s - %s", x.getCodMsgr(), x.getDescrizione()).equals(selectedMtbSubGrupText.get()))
.findFirst().orElse(null));
selectedMtbSubSubGrupText.set(null);
}
});
this.selectedMtbSubSubGrupText.addOnPropertyChangedCallback(new OnGeneralChangedCallback() {
@Override
public void run() {
mViewModel.selectedMtbSubSubGrup.set(mViewModel.retrieveAvailableArtSubSubGroups().stream()
.filter(x -> String.format("%s - %s", x.getCodMsfa(), x.getDescrizione()).equals(selectedMtbSubSubGrupText.get()))
.findFirst().orElse(null));
}
});
this.selectedPosizioneText.addOnPropertyChangedCallback(new OnGeneralChangedCallback() {
@Override
public void run() {
mViewModel.selectedPosizioneDefault.set(mViewModel.retrieveAvailablePosizioni().stream()
.filter(x -> x.getPosizione().equals(selectedPosizioneText.get()))
.findFirst().orElse(null));
}
});
}
private void initBarcodes() {
if (mScannedBarcode != null) {
mViewModel.barcodeProdotto.set(mScannedBarcode.getStringValue());
try {
generateBarcodeBitmap();
} catch (Exception e) {
onError(e);
}
}
}
public void saveBarcode() {
try {
generateBarcodeBitmap();
editingBarcode.toggle();
} catch (Exception e) {
onError(e);
}
}
private void generateBarcodeBitmap() throws Exception {
Bitmap barcodeBitmap = UtilityBarcode.generateBarcodeImage(mViewModel.barcodeProdotto.get(), 500, 170);
mBindings.barcodeProdottoImage.setImageBitmap(barcodeBitmap);
}
@Override
public void onSaved(String codMart) {
this.dismiss();
if (this.onArticleCreated != null) this.onArticleCreated.run(codMart);
}
}

View File

@@ -0,0 +1,209 @@
package it.integry.integrywmsnative.view.dialogs.create_new_art;
import androidx.databinding.ObservableArrayList;
import java.math.BigDecimal;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import it.integry.integrywmsnative.core.di.ValidatableObservableField;
import it.integry.integrywmsnative.core.di.validators.GreaterThenValidator;
import it.integry.integrywmsnative.core.di.validators.NotEmptyValidator;
import it.integry.integrywmsnative.core.di.validators.NotNullValidator;
import it.integry.integrywmsnative.core.expansion.OnGeneralChangedCallback;
import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingListener;
import it.integry.integrywmsnative.core.model.MtbDepoPosizione;
import it.integry.integrywmsnative.core.model.MtbGrup;
import it.integry.integrywmsnative.core.model.MtbSfam;
import it.integry.integrywmsnative.core.model.MtbSgrp;
import it.integry.integrywmsnative.core.model.MtbUntMis;
import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer;
import it.integry.integrywmsnative.core.rest.model.articolo.ArticoloDTO;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityString;
public class DialogCreateNewArtViewModel {
private Listener mListener;
private final ArticoloRESTConsumer articoloRESTConsumer;
private final ObservableArrayList<MtbUntMis> availableUntMis = new ObservableArrayList<>();
private final ObservableArrayList<MtbGrup> availableMtbGroups = new ObservableArrayList<>();
private final ObservableArrayList<MtbSgrp> availableMtbSubGroups = new ObservableArrayList<>();
private final ObservableArrayList<MtbSfam> availableMtbSubSubGroups = new ObservableArrayList<>();
private final ObservableArrayList<MtbDepoPosizione> availablePosizioni = new ObservableArrayList<>();
public ValidatableObservableField<String> descrizione = new ValidatableObservableField<>() {{
addValidator(new NotEmptyValidator("La descrizione non può essere vuota"));
}};
public final ValidatableObservableField<String> noteAggiuntive = new ValidatableObservableField<>();
public final ValidatableObservableField<BigDecimal> qtaCnf = new ValidatableObservableField<>(BigDecimal.ONE) {{
addValidator(new NotNullValidator<>("La qta x cnf deve essere > 0"));
addValidator(new GreaterThenValidator(BigDecimal.ZERO, "La qta x cnf deve essere > 0"));
}};
public final ValidatableObservableField<String> barcodeProdotto = new ValidatableObservableField<>();
public final ValidatableObservableField<Boolean> qtaCnfFissa = new ValidatableObservableField<>(true);
public ValidatableObservableField<MtbUntMis> selectedUntMis = new ValidatableObservableField<>(null) {{
addValidator(new NotNullValidator<>("Seleziona un'unità di misura"));
}};
public ValidatableObservableField<MtbGrup> selectedMtbGrup = new ValidatableObservableField<>(null) {{
addValidator(new NotNullValidator<>("Seleziona un gruppo"));
}};
public ValidatableObservableField<MtbSgrp> selectedMtbSubGrup = new ValidatableObservableField<>(null) {{
addValidator(new NotNullValidator<>("Seleziona un sotto gruppo"));
}};
public ValidatableObservableField<MtbSfam> selectedMtbSubSubGrup = new ValidatableObservableField<>(null) {{
addValidator(new NotNullValidator<>("Seleziona un sotto-sotto gruppo"));
}};
public ValidatableObservableField<MtbDepoPosizione> selectedPosizioneDefault = new ValidatableObservableField<>(null) {{
addValidator(new NotNullValidator<>("Seleziona una posizione"));
}};
public DialogCreateNewArtViewModel(ArticoloRESTConsumer articoloRESTConsumer) {
this.articoloRESTConsumer = articoloRESTConsumer;
}
public void init() {
this.sendOnLoadingStarted();
this.availablePosizioni.addAll(SettingsManager.iDB().getAvailablePosizioni());
this.articoloRESTConsumer.retrieveAvailableUntMis(untMisList -> {
this.availableUntMis.addAll(untMisList);
this.articoloRESTConsumer.retrieveAvailableGruppiMerceologici(mtbGrupList -> {
List<String> allowedCodMgrpForArtCreation = SettingsManager.iDB().getAllowedCodMgrpForArtCreation();
if(allowedCodMgrpForArtCreation != null && !allowedCodMgrpForArtCreation.isEmpty()) {
mtbGrupList = mtbGrupList.stream()
.filter(x -> allowedCodMgrpForArtCreation.contains(x.getCodMgrp()))
.collect(Collectors.toUnmodifiableList());
}
if(mtbGrupList.size() == 1)
this.selectedMtbGrup.set(mtbGrupList.get(0));
this.availableMtbGroups.addAll(mtbGrupList);
this.sendOnLoadingEnded();
}, this::sendError);
}, this::sendError);
this.selectedMtbGrup.addOnPropertyChangedCallback(new OnGeneralChangedCallback() {
@Override
public void run() {
availableMtbSubGroups.clear();
if (selectedMtbGrup != null && selectedMtbGrup.get() != null)
availableMtbSubGroups.addAll(Objects.requireNonNull(selectedMtbGrup.get()).getMtbSgrp());
}
});
this.selectedMtbSubGrup.addOnPropertyChangedCallback(new OnGeneralChangedCallback() {
@Override
public void run() {
availableMtbSubSubGroups.clear();
if (selectedMtbSubGrup != null && selectedMtbSubGrup.get() != null)
availableMtbSubSubGroups.addAll(Objects.requireNonNull(selectedMtbSubGrup.get()).getMtbSfam());
}
});
}
public ObservableArrayList<MtbDepoPosizione> retrieveAvailablePosizioni() {
return availablePosizioni;
}
public ObservableArrayList<MtbUntMis> retrieveAvailableUntMis() {
return availableUntMis;
}
public ObservableArrayList<MtbGrup> retrieveAvailableArtGroups() {
return availableMtbGroups;
}
public ObservableArrayList<MtbSgrp> retrieveAvailableArtSubGroups() {
return availableMtbSubGroups;
}
public ObservableArrayList<MtbSfam> retrieveAvailableArtSubSubGroups() {
return availableMtbSubSubGroups;
}
public void save() {
if (descrizione.validate() &
noteAggiuntive.validate() &
selectedMtbGrup.validate() &
selectedMtbSubGrup.validate() &
selectedMtbSubSubGrup.validate() &
selectedUntMis.validate() &
qtaCnf.validate() &
qtaCnfFissa.validate() &
selectedPosizioneDefault.validate() &
barcodeProdotto.validate()
) {
ArticoloDTO articoloToSave = new ArticoloDTO()
.setDescrizione(descrizione.get())
.setDescrizioneEstesa(descrizione.get())
.setNote(UtilityString.empty2null(noteAggiuntive.get()))
.setCodMgrp(selectedMtbGrup.get().getCodMgrp())
.setCodMsgr(selectedMtbSubGrup.get().getCodMsgr())
.setCodMsfa(selectedMtbSubSubGrup.get().getCodMsfa())
.setUntMis(selectedUntMis.get().getUntMis())
.setFlagQtaCnfFissa(qtaCnfFissa.get().booleanValue())
.setQtaCnf(qtaCnf.get())
.setPosizione(selectedPosizioneDefault.get().getPosizione())
.setBarcode(UtilityString.empty2null(barcodeProdotto.get()))
.setFlagStato(true);
this.sendOnLoadingStarted();
articoloRESTConsumer.saveArticolo(articoloToSave, codMart -> {
this.sendOnLoadingEnded();
this.sendOnSaved(codMart);
}, this::sendError);
}
}
private void sendOnLoadingStarted() {
if (this.mListener != null) mListener.onLoadingStarted();
}
private void sendOnLoadingEnded() {
if (this.mListener != null) mListener.onLoadingEnded();
}
private void sendError(Exception ex) {
if (this.mListener != null) mListener.onError(ex);
}
private void sendOnSaved(String codMart) {
if (this.mListener != null) mListener.onSaved(codMart);
}
public void setListener(Listener listener) {
this.mListener = listener;
}
interface Listener extends ILoadingListener {
void onSaved(String codMart);
void onError(Exception ex);
}
}

View File

@@ -188,7 +188,7 @@ public class DialogInputQuantityV2View extends BaseDialogFragment implements Dia
this.initProductLotStatusNotification();
}
MtbUntMis mtbUntMis = mDialogInputQuantityV2DTO.getMtbAart().getMtbUntMis() != null && mDialogInputQuantityV2DTO.getMtbAart().getMtbUntMis().size() > 0 ? mDialogInputQuantityV2DTO.getMtbAart().getMtbUntMis().get(0) : null;
MtbUntMis mtbUntMis = mDialogInputQuantityV2DTO.getMtbAart().getMtbUntMis() != null && !mDialogInputQuantityV2DTO.getMtbAart().getMtbUntMis().isEmpty() ? mDialogInputQuantityV2DTO.getMtbAart().getMtbUntMis().get(0) : null;
if (!(mtbUntMis != null && mtbUntMis.isFlagDig())) {
mBindings.inputQtaTotText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
}
@@ -231,7 +231,7 @@ public class DialogInputQuantityV2View extends BaseDialogFragment implements Dia
this.mBindings.inputDataScadLayout.setEndIconTintList(ColorStateList.valueOf(ContextCompat.getColor(requireContext(), com.tfb.fbtoast.R.color.error_color)));
}
case NON_IN_SCADENZA -> {
this.mBindings.inputDataScadLayout.setEndIconDrawable(R.drawable.ic_check_white_24dp);
this.mBindings.inputDataScadLayout.setEndIconDrawable(R.drawable.ic_round_check_24);
this.mBindings.inputDataScadLayout.setEndIconTintList(ColorStateList.valueOf(ContextCompat.getColor(requireContext(), com.tfb.fbtoast.R.color.success_color)));
}
}
@@ -295,6 +295,8 @@ public class DialogInputQuantityV2View extends BaseDialogFragment implements Dia
int onNumCnfInputChanged = SettingsManager.iDB().getOnNumCnfInputChanged();
int onQtaTotInputChanged = SettingsManager.iDB().getOnQtaTotInputChanged();
onNumCnfInputChanged = onNumCnfInputChanged == 0 && mViewModel.getMtbAart().isFlagQtaCnfFissaBoolean() ? 2 : onNumCnfInputChanged;
this.mViewModel.setListener(this);
this.mViewModel.init(onNumCnfInputChanged, onQtaTotInputChanged);
}