[CARELLI - Ordini Acquisto]

Aggiunto controllo modifica ed esportazione ordini con listino non valido
This commit is contained in:
Valerio Castellana 2023-03-27 11:44:20 +02:00
parent 0f08d704ac
commit ff09147968
15 changed files with 219 additions and 6 deletions

View File

@ -94,6 +94,9 @@ public class ArticoloOrdine {
@Ignore
private int bgTint;
@Ignore
private boolean invalid = false;
public Integer getArticoloOrdineId() {
return articoloOrdineId;
@ -300,4 +303,13 @@ public class ArticoloOrdine {
this.ctMaxOrd = ctMaxOrd;
return this;
}
public boolean isInvalid() {
return invalid;
}
public ArticoloOrdine setInvalid(boolean invalid) {
this.invalid = invalid;
return this;
}
}

View File

@ -0,0 +1,10 @@
package it.integry.integrywmsnative.core.exception;
import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.utility.UtilityResources;
public final class ExpiredProductListException extends Exception {
public ExpiredProductListException() {
super(UtilityResources.getString(R.string.expired_list_session));
}
}

View File

@ -0,0 +1,15 @@
package it.integry.integrywmsnative.core.exception;
import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.utility.UtilityResources;
public final class InvalidProductOrderedException extends Exception {
public InvalidProductOrderedException() {
super(UtilityResources.getString(R.string.invalid_product_ordered));
}
public InvalidProductOrderedException(String product) {
super(UtilityResources.getString(R.string.invalid_product_ordered) + " (" + product + ")");
}
}

View File

@ -0,0 +1,15 @@
package it.integry.integrywmsnative.core.exception;
import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.utility.UtilityResources;
public final class MultipleResultFromBarcodeException extends Exception {
public MultipleResultFromBarcodeException() {
super(UtilityResources.getString(R.string.multiple_results_from_barcode));
}
public MultipleResultFromBarcodeException(String barcode) {
super(UtilityResources.getString(R.string.multiple_results_from_barcode) + " (" + barcode + ")");
}
}

View File

@ -12,6 +12,7 @@ import javax.inject.Singleton;
import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloOrdine;
import it.integry.integrywmsnative.core.data_store.db.entity.Ordine;
import it.integry.integrywmsnative.core.data_store.db.view_model.OrdiniAcquistoGrigliaDTO;
import it.integry.integrywmsnative.core.exception.InvalidProductOrderedException;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.rest.RESTBuilder;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
@ -90,6 +91,10 @@ public class PVOrdiniAcquistoRESTConsumer extends _BaseRESTConsumer {
int i = 0;
for (ArticoloOrdine art : articoli) {
i++;
if (art.isInvalid()) {
onFailed.run(new InvalidProductOrderedException(art.getCodMart()));
return;
}
artRows.add(convertArtToDTO(art, i));
}

View File

@ -38,6 +38,7 @@ public class DBSettingsModel {
private boolean flagSpedizioneUseQtaOrd;
private boolean flagOrdinaNuoviArticoliInGriglia;
private boolean flagOrdinaArticoliOnScan;
private boolean flagConsentiFuoriPianoLogistico;
private String docInterniCheckFornitore;
private String produzioneDefaultCodAnag;
private boolean flagPrintPackingListOnOrderClose;
@ -416,4 +417,13 @@ public class DBSettingsModel {
this.flagCanAddUnknownItemsInventario = flagCanAddUnknownItemsInventario;
return this;
}
public boolean isFlagConsentiFuoriPianoLogistico() {
return flagConsentiFuoriPianoLogistico;
}
public DBSettingsModel setFlagConsentiFuoriPianoLogistico(boolean flagConsentiFuoriPianoLogistico) {
this.flagConsentiFuoriPianoLogistico = flagConsentiFuoriPianoLogistico;
return this;
}
}

View File

@ -305,6 +305,10 @@ public class SettingsManager {
.setGestName("PVM")
.setSection("ORDINI_A")
.setKeySection("ORDINA_ARTICOLI_ON_SCAN"));
stbGestSetupList.add(new StbGestSetup()
.setGestName("PVM")
.setSection("ORDINI_A")
.setKeySection("FLAG_CONSENTI_ORIDNE_DA_GRIGLIA"));
stbGestSetupList.add(new StbGestSetup()
.setGestName("PVM")
.setSection("DOC_INTERNI")
@ -381,6 +385,7 @@ public class SettingsManager {
dbSettingsModelIstance.setFlagAccettazioneUseQtaOrd(getValueFromList(list, "ACCETTAZIONE", "FLAG_USE_QTA_ORD", Boolean.class));
dbSettingsModelIstance.setFlagPickLiberoAllowEmptyDest(getValueFromList(list, "PICKING_LIBERO", "FLAG_ALLOW_EMPTY_DEST", Boolean.class));
dbSettingsModelIstance.setFlagOrdinaArticoliOnScan(getValueFromList(list, "ORDINI_A", "ORDINA_ARTICOLI_ON_SCAN", Boolean.class));
dbSettingsModelIstance.setFlagConsentiFuoriPianoLogistico(getValueFromList(list, "ORDINI_A", "FLAG_CONSENTI_ORIDNE_DA_GRIGLIA", Boolean.class));
dbSettingsModelIstance.setFlagPrintPackingListOnOrderClose(getValueFromList(list, "SPEDIZIONE", "FLAG_PRINT_PACKING_LIST_ON_CLOSE", Boolean.class));
dbSettingsModelIstance.setFlagPrintEtichetteOnOrderClose(getValueFromList(list, "SPEDIZIONE", "FLAG_PRINT_ETICHETTE_ON_CLOSE", Boolean.class));
dbSettingsModelIstance.setFlagAskInfoAggiuntiveSpedizione(getValueFromList(list, "SPEDIZIONE", "FLAG_ASK_INFO_AGGIUNTIVE", Boolean.class));

View File

@ -202,6 +202,16 @@ public class PVOrdineAcquistoEditActivity extends BaseActivity implements PVOrdi
onSuccess, this::onLoadingEnded).show(getSupportFragmentManager(), "confirmExceedingQtyOrder");
}
@Override
public void confirmCheckForUnlistedProduct(String barcode) {
DialogSimpleMessageView.makeInfoDialog(getText(R.string.info).toString(),
Html.fromHtml(getResources().getString(R.string.confirm_order_unlisted_item)),
null,
() -> {
this.mViewModel.loadArticolo(barcode);
}, this::onLoadingEnded).show(getSupportFragmentManager(), "confirmExceedingQtyOrder");
}
@Override
public int getColorFromResource(int resId) {
return getResources().getColor(resId);

View File

@ -8,6 +8,7 @@ import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.stream.Collectors;
@ -22,7 +23,10 @@ import it.integry.integrywmsnative.core.data_store.db.repository.ArticoloGriglia
import it.integry.integrywmsnative.core.data_store.db.repository.GrigliaRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.OrdineRepository;
import it.integry.integrywmsnative.core.data_store.db.view_model.ArticoloOrdinabileDTO;
import it.integry.integrywmsnative.core.exception.ArtNotFoundInGridException;
import it.integry.integrywmsnative.core.exception.EmptyOrderException;
import it.integry.integrywmsnative.core.exception.ExpiredProductListException;
import it.integry.integrywmsnative.core.exception.MultipleResultFromBarcodeException;
import it.integry.integrywmsnative.core.exception.NoArtsInGridException;
import it.integry.integrywmsnative.core.exception.NoResultFromBarcodeException;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
@ -31,6 +35,7 @@ import it.integry.integrywmsnative.core.rest.consumers.PVOrdiniAcquistoRESTConsu
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityBigDecimal;
import it.integry.integrywmsnative.core.utility.UtilityDate;
import it.integry.integrywmsnative.core.utility.UtilityString;
public class PVOrdineAcquistoEditViewModel {
@ -58,6 +63,8 @@ public class PVOrdineAcquistoEditViewModel {
private List<ArticoloOrdinabileDTO> mArticoliGriglia = new ArrayList<>();
private final MutableLiveData<List<ArticoloOrdine>> mArticoli = new MutableLiveData<>();
private Calendar dataInizioModifica;
public PVOrdineAcquistoEditViewModel(OrdineRepository ordineRepository,
GrigliaRepository grigliaRepository,
@ -75,6 +82,14 @@ public class PVOrdineAcquistoEditViewModel {
this.mCurrentOrdine = ordine;
mArticoliGriglia.clear();
mArticoliGriglia.addAll(articoliGriglia);
Calendar today = Calendar.getInstance();
today.set(Calendar.MILLISECOND, 0);
today.set(Calendar.SECOND, 0);
today.set(Calendar.MINUTE, 0);
today.set(Calendar.HOUR_OF_DAY, 0);
this.dataInizioModifica = today;
this.refreshListArticoli();
}
@ -82,10 +97,21 @@ public class PVOrdineAcquistoEditViewModel {
refreshListArticoli(null);
}
public boolean checkOrderSessionValid() {
Calendar today = Calendar.getInstance();
today.set(Calendar.MILLISECOND, 0);
today.set(Calendar.SECOND, 0);
today.set(Calendar.MINUTE, 0);
today.set(Calendar.HOUR_OF_DAY, 0);
return today.after(this.dataInizioModifica);
}
public void refreshListArticoli(Runnable onSuccess) {
this.sendOnLoadingStarted();
this.loadArticoli(mCurrentOrdine, articoli -> {
articoli = Stream.of(articoli).map(this::completeDataArticoli).sorted((a, b) -> a.getDataIns().after(b.getDataIns()) ? -1 : 1).toList();
this.mArticoli.postValue(articoli);
this.sendOnLoadingEnded();
if (onSuccess != null)
@ -109,6 +135,8 @@ public class PVOrdineAcquistoEditViewModel {
art.setFlagQtaMultipla(artGrid.getFlagQtaMultipla());
art.setCtMaxOrd(BigDecimal.valueOf(artGrid.getCtMaxOrd()));
art.setSystemNote(artGrid.generateSystemNote());
} else {
art.setInvalid(true);
}
return art;
}
@ -135,8 +163,13 @@ public class PVOrdineAcquistoEditViewModel {
ArticoloOrdinabileDTO articoloDTO = getArticoloFromBarcode(barcode);
if (articoloDTO == null) {
if (SettingsManager.iDB().isFlagConsentiFuoriPianoLogistico() && UtilityString.isNullOrEmpty(mCurrentOrdine.getCodAlis())) {
this.mListener.confirmCheckForUnlistedProduct(barcode);
return;
} else {
throw new NoResultFromBarcodeException(barcode);
}
}
this.addArticoloToOrdine(
articoloDTO,
this::sendOnLoadingEnded,
@ -168,7 +201,7 @@ public class PVOrdineAcquistoEditViewModel {
};
if (isAutoOrderOnScan()) {
if (!UtilityBigDecimal.isNullOrZero(articolo.getCtMaxOrd()) && UtilityBigDecimal.greaterThan(BigDecimal.valueOf(articolo.getQtaOrd() + articolo.getQtaCnf()), articolo.getCtMaxOrd())) {
if (!UtilityBigDecimal.isNullOrZero(articolo.getCtMaxOrd()) && UtilityBigDecimal.greaterThan(BigDecimal.valueOf(articolo.getQtaOrd() + articolo.getQtaCnf()), articolo.getCtMaxOrd().multiply(BigDecimal.valueOf(articolo.getQtaCnf())))) {
mListener.confirmExceedingQtyOrder(saveAction);
} else {
saveAction.run();
@ -280,6 +313,10 @@ public class PVOrdineAcquistoEditViewModel {
public void exportOrdine(Runnable onComplete) {
this.sendOnLoadingStarted();
if (!checkOrderSessionValid()) {
this.sendError(new ExpiredProductListException());
return;
}
if (mArticoli.getValue() == null) {
this.sendError(new EmptyOrderException());
return;
@ -311,6 +348,40 @@ public class PVOrdineAcquistoEditViewModel {
if (this.mListener != null) mListener.onError(ex);
}
public void loadArticolo(String barcode) {
this.sendOnLoadingStarted();
String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep();
pvOrdiniAcquistoRESTConsumer.retrieveArticolo(null, codMdep, barcode, (grigliaDTO) -> {
if (grigliaDTO == null || grigliaDTO.getArticoli().isEmpty()) {
this.sendError(new ArtNotFoundInGridException());
return;
}
if (grigliaDTO.getArticoli().size() > 1) {
this.sendError(new MultipleResultFromBarcodeException());
return;
}
ArticoloOrdinabileDTO newArt = Stream.of(grigliaDTO.getArticoli()).findFirstOrElse(null);
if (newArt == null) {
this.sendError(new ArtNotFoundInGridException());
return;
}
ArticoloOrdinabileDTO existingArt = Stream.of(mArticoliGriglia).filter(x -> x.getCodMart().equalsIgnoreCase(newArt.getCodMart())).findFirstOrElse(null);
if (existingArt != null) {
List<String> barcodes = existingArt.getBarcode();
barcodes.addAll(newArt.getBarcode());
barcodes = Stream.of(barcodes).distinct().toList();
existingArt.setBarcode(barcodes);
} else {
mArticoliGriglia.add(newArt);
}
this.processBarcode(barcode);
}, this::sendError);
}
public interface Listener extends ILoadingListener {
void onItemDispatched(ArticoloOrdine articoloOrdine, Runnable onSuccess);
@ -319,6 +390,8 @@ public class PVOrdineAcquistoEditViewModel {
int getColorFromResource(int resId);
void onError(Exception ex);
void confirmCheckForUnlistedProduct(String barcode);
}
public PVOrdineAcquistoEditViewModel setListener(Listener listener) {

View File

@ -15,6 +15,7 @@ import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.LinearLayoutManager;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.inject.Inject;
@ -30,6 +31,7 @@ import it.integry.integrywmsnative.core.data_store.db.repository.GrigliaReposito
import it.integry.integrywmsnative.core.data_store.db.repository.OrdineRepository;
import it.integry.integrywmsnative.core.data_store.db.view_model.ArticoloOrdinabileDTO;
import it.integry.integrywmsnative.core.data_store.db.wrappers.OrdineWrapper;
import it.integry.integrywmsnative.core.exception.ExpiredProductListException;
import it.integry.integrywmsnative.core.expansion.BaseFragment;
import it.integry.integrywmsnative.core.interfaces.IPoppableActivity;
import it.integry.integrywmsnative.core.interfaces.IScrollableFragment;
@ -133,6 +135,13 @@ public class PVOrdiniAcquistoGrigliaFragment extends BaseFragment implements ITi
private void setListaArticoli(List<ArticoloOrdinabileDTO> listArticoli) {
mListArticoli.clear();
mListArticoli.addAll(listArticoli);
Calendar today = Calendar.getInstance();
today.set(Calendar.MILLISECOND, 0);
today.set(Calendar.SECOND, 0);
today.set(Calendar.MINUTE, 0);
today.set(Calendar.HOUR_OF_DAY, 0);
this.mPvOrdiniAcquistoGrigliaViewModel.setDataCaricamentoListino(today);
mBinding.countArtLis.setText(String.valueOf(listArticoli.size()));
}
@ -172,6 +181,10 @@ public class PVOrdiniAcquistoGrigliaFragment extends BaseFragment implements ITi
}
private void editOrdine(Ordine ordine) {
if (this.mPvOrdiniAcquistoGrigliaViewModel.checkProductListSessionInvalid()) {
this.onError(new ExpiredProductListException());
return;
}
requireActivity().startActivity(PVOrdineAcquistoEditActivity.newInstance(requireActivity(), ordine, mListArticoli));
}
@ -207,6 +220,10 @@ public class PVOrdiniAcquistoGrigliaFragment extends BaseFragment implements ITi
}
public void createNewOrder() {
if (this.mPvOrdiniAcquistoGrigliaViewModel.checkProductListSessionInvalid()) {
this.onError(new ExpiredProductListException());
return;
}
this.onLoadingStarted();
mPvOrdiniAcquistoGrigliaViewModel.createNewOrder(mGriglia, order -> {

View File

@ -1,5 +1,7 @@
package it.integry.integrywmsnative.gest.pv_ordini_acquisto;
import java.util.Calendar;
import javax.inject.Inject;
import it.integry.integrywmsnative.core.data_store.db.entity.Griglia;
@ -18,6 +20,8 @@ public class PVOrdiniAcquistoGrigliaViewModel {
private final OrdineRepository ordineRepository;
private final GrigliaRepository grigliaRepository;
private Calendar dataCaricamentoListino;
@Inject
public PVOrdiniAcquistoGrigliaViewModel(PVOrdiniAcquistoRESTConsumer pvOrdiniAcquistoRESTConsumer,
ArticoloGrigliaRepository articoloGrigliaRepository,
@ -45,4 +49,23 @@ public class PVOrdiniAcquistoGrigliaViewModel {
ordineRepository.delete(ordine, onSuccess, onFail);
}
public Calendar getDataCaricamentoListino() {
return dataCaricamentoListino;
}
public PVOrdiniAcquistoGrigliaViewModel setDataCaricamentoListino(Calendar dataCaricamentoListino) {
this.dataCaricamentoListino = dataCaricamentoListino;
return this;
}
public boolean checkProductListSessionInvalid() {
Calendar today = Calendar.getInstance();
today.set(Calendar.MILLISECOND, 0);
today.set(Calendar.SECOND, 0);
today.set(Calendar.MINUTE, 0);
today.set(Calendar.HOUR_OF_DAY, 0);
return today.after(this.dataCaricamentoListino);
}
}

View File

@ -6,6 +6,8 @@
<import type="android.view.View" />
<import type="it.integry.integrywmsnative.R" />
<import type="it.integry.integrywmsnative.core.utility.UtilityString" />
<import type="it.integry.integrywmsnative.core.utility.UtilityNumber" />
@ -55,6 +57,17 @@
android:src="@drawable/ic_baseline_new_24"
android:tint="@color/orange_600" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/unavailable_product_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:adjustViewBounds="true"
android:layout_marginStart="4dp"
android:visibility="@{articolo.invalid ? View.VISIBLE : View.GONE}"
android:src="@drawable/ic_error_white_24dp"
android:tint="@color/red_600" />
</androidx.appcompat.widget.LinearLayoutCompat>
@ -95,6 +108,7 @@
android:layout_height="wrap_content"
android:background="@drawable/badge_round_corner"
android:backgroundTint="@{articolo.bgTint}"
android:visibility="@{articolo.invalid ? View.GONE : View.VISIBLE}"
android:gravity="center"
android:paddingLeft="6dp"
android:paddingTop="2dp"

View File

@ -445,4 +445,7 @@
<string name="max_orderable_qty">Qta massima ordinabile</string>
<string name="max_qty_exceeded">Quantità massima superata</string>
<string name="confirm_orderable_qty_exceeded"><![CDATA[La quantità massima consentita per questo articolo è stata superata! <br/> Vuoi cotinuare comunque con il salvataggio?]]>\</string>
<string name="confirm_order_unlisted_item"><![CDATA[L\'articolo selezionato non è presente nel piano logistico!<br>Vuoi provare a cercarlo comunque nel sistema?]]></string>
<string name="invalid_product_ordered">L\'ordine presenta un articolo non valido per la lista selezionata!</string>
<string name="expired_list_session"><![CDATA[La lista di prodotti è stata caricata troppo tempo fa!.]]></string>
</resources>

View File

@ -26,12 +26,10 @@
<color name="empty_view_bg_gray">#f5f5f5</color>
<color name="bg_checked_layout">#E8F0FE</color>
<color name="bg_checked_layout_dark">#C9D5F0</color>
<color name="colorPrimaryA10">#1A1A73E8</color>
<color name="colorPrimaryA20">#331A73E8</color>
<color name="colorPrimaryA30">#4D1A73E8</color>
@ -85,7 +83,6 @@
<color name="indigo_700">#303F9F</color>
<color name="light_blue_100">#B3E5FC</color>
<color name="light_blue_200">#81D4FA</color>
<color name="light_blue_300">#4fc3f7</color>
@ -102,6 +99,7 @@
<color name="orange_800">#EF6C00</color>
<color name="red_100">#EFB4B4</color>
<color name="red_200">#ef9a9a</color>
<color name="red_300">#e57373</color>
<color name="red_400">#EF5350</color>

View File

@ -452,4 +452,7 @@
<string name="max_orderable_qty">Max orderable qty</string>
<string name="max_qty_exceeded">Max quantity exceeded</string>
<string name="confirm_orderable_qty_exceeded"><![CDATA[Max permitted quantity exceeded for the current product!<br/> Do you wish to continue?]]></string>
<string name="confirm_order_unlisted_item"><![CDATA[The selected product was not found in the current logistics plan! <br> Do you want to search for it regardless?]]></string>
<string name="invalid_product_ordered">One or more ordered products are not available in the selected list!</string>
<string name="expired_list_session"><![CDATA[The product list was loaded too much time ago!]]></string>
</resources>