diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index fdf8d994..e805548a 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index a7111eb6..599f4f67 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ apply plugin: 'com.google.gms.google-services' android { - def appVersionCode = 424 - def appVersionName = '1.40.07' + def appVersionCode = 430 + def appVersionName = '1.40.13' signingConfigs { release { @@ -103,17 +103,17 @@ dependencies { //Firebase // Import the Firebase BoM - implementation platform('com.google.firebase:firebase-bom:29.1.0') + implementation platform('com.google.firebase:firebase-bom:32.8.1') implementation 'com.google.firebase:firebase-analytics' implementation 'com.google.firebase:firebase-core' implementation 'com.google.firebase:firebase-crashlytics' implementation 'com.google.firebase:firebase-perf' - implementation 'com.google.android.gms:play-services-basement:18.2.0' + implementation 'com.google.android.gms:play-services-basement:18.3.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'com.google.android.material:material:1.10.0' + implementation 'com.google.android.material:material:1.11.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.recyclerview:recyclerview:1.3.2' @@ -128,7 +128,7 @@ dependencies { implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.annimon:stream:1.2.2' - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.2' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.7.0' // implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' implementation 'org.apache.commons:commons-text:1.9' diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/MagazzinoRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/MagazzinoRESTConsumer.java index 687689be..2383218f 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/MagazzinoRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/MagazzinoRESTConsumer.java @@ -90,7 +90,15 @@ public class MagazzinoRESTConsumer extends _BaseRESTConsumer { }); } - public void retrievePartitaMag(String partitaMag, String codMart, RunnableArgs onComplete, RunnableArgs onFailed){ + public MtbPartitaMag retrievePartitaMagSyncronized(String partitaMag, String codMart, RunnableArgs onFailed) throws Exception { + MagazzinoRESTConsumerService service = RESTBuilder.getService(MagazzinoRESTConsumerService.class); + Response> response = service.retrievePartitaMag(codMart, partitaMag) + .execute(); + + return analyzeAnswer(response, "retrievePartitaMag"); + } + + public void retrievePartitaMag(String partitaMag, String codMart, RunnableArgs onComplete, RunnableArgs onFailed) { MagazzinoRESTConsumerService service = RESTBuilder.getService(MagazzinoRESTConsumerService.class); service.retrievePartitaMag(codMart, partitaMag) .enqueue(new Callback<>() { diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/deserializer/LocalDateDeserializer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/deserializer/LocalDateDeserializer.java index 5570f9ba..fdd81603 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/deserializer/LocalDateDeserializer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/deserializer/LocalDateDeserializer.java @@ -13,15 +13,13 @@ import it.integry.integrywmsnative.core.utility.UtilityDate; import it.integry.integrywmsnative.core.utility.UtilityString; public class LocalDateDeserializer implements JsonDeserializer { - - DateTimeFormatter formatter = DateTimeFormatter.ofPattern(UtilityDate.COMMONS_DATE_FORMATS.DMY_TIME_SLASH); - - @Override public LocalDate deserialize(JsonElement element, Type arg1, JsonDeserializationContext arg2) throws JsonParseException { String date = element.getAsString(); if (UtilityString.isNullOrEmpty(date)) return null; + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(UtilityString.determineDateFormat(date)); + return LocalDate.parse(date, formatter); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityString.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityString.java index 629bfabc..a273c07f 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityString.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityString.java @@ -5,6 +5,8 @@ import android.text.Spanned; import androidx.annotation.StringRes; +import java.util.HashMap; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -13,6 +15,98 @@ import java.util.regex.Pattern; */ public class UtilityString { + private static final Map DATE_FORMAT_REGEXPS = new HashMap() {{ + + //----------------------------------------------------------------------------------------- + //giorno-mese-giorno + put("^\\d{1,2}/\\d{1,2}/\\d{4}$", "dd/MM/yyyy"); + put("^\\d{1,2}\\.\\d{1,2}\\.\\d{4}$", "dd.MM.yyyy"); + put("^\\d{1,2}-\\d{1,2}-\\d{4}$", "dd-MM-yyyy"); + + //anno-mese-giorno + put("^\\d{4}/\\d{1,2}/\\d{1,2}$", "yyyy/MM/dd"); + put("^\\d{4}\\.\\d{1,2}\\.\\d{1,2}$", "yyyy.MM.dd"); + put("^\\d{4}-\\d{1,2}-\\d{1,2}$", "yyyy-MM-dd"); + + + //----------------------------------------------------------------------------------------- + //senza spazi + put("^\\d{8}$", "yyyyMMdd"); + put("^\\d{1,2}\\s[a-z]{3}\\s\\d{4}$", "dd MMM yyyy"); + put("^\\d{1,2}\\s[a-z]{4,}\\s\\d{4}$", "dd MMMM yyyy"); + + put("^\\d{12}$", "yyyyMMddHHmm"); + put("^\\d{8}\\s\\d{4}$", "yyyyMMdd HHmm"); + + put("^\\d{14}$", "yyyyMMddHHmmss"); + put("^\\d{8}\\s\\d{6}$", "yyyyMMdd HHmmss"); + + + //----------------------------------------------------------------------------------------- + //giorno-mese-anno hhmm + put("^\\d{1,2}/\\d{1,2}/\\d{4}\\s\\d{1,2}\\.\\d{2}$", "dd/MM/yyyy HH.mm"); + put("^\\d{1,2}/\\d{1,2}/\\d{4}\\s\\d{1,2}:\\d{2}$", "dd/MM/yyyy HH:mm"); + + put("^\\d{1,2}\\.\\d{1,2}\\.\\d{4}\\s\\d{1,2}\\.\\d{2}$", "dd.MM.yyyy HH.mm"); + put("^\\d{1,2}\\.\\d{1,2}\\.\\d{4}\\s\\d{1,2}:\\d{2}$", "dd.MM.yyyy HH:mm"); + + put("^\\d{1,2}-\\d{1,2}-\\d{4}\\s\\d{1,2}\\.\\d{2}$", "dd-MM-yyyy HH.mm"); + put("^\\d{1,2}-\\d{1,2}-\\d{4}\\s\\d{1,2}:\\d{2}$", "dd-MM-yyyy HH:mm"); + + //anno-mese-giorno hhmm + put("^\\d{4}/\\d{1,2}/\\d{1,2}\\s\\d{1,2}\\.\\d{2}$", "yyyy/MM/dd HH.mm"); + put("^\\d{4}/\\d{1,2}/\\d{1,2}\\s\\d{1,2}:\\d{2}$", "yyyy/MM/dd HH:mm"); + + put("^\\d{4}\\.\\d{1,2}\\.\\d{1,2}\\s\\d{1,2}\\.\\d{2}$", "yyyy.MM.dd HH.mm"); + put("^\\d{4}\\.\\d{1,2}\\.\\d{1,2}\\s\\d{1,2}:\\d{2}$", "yyyy.MM.dd HH:mm"); + + put("^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}\\.\\d{2}$", "yyyy-MM-dd HH.mm"); + put("^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:\\d{2}$", "yyyy-MM-dd HH:mm"); + + + //----------------------------------------------------------------------------------------- + //giorno-mese-anno hhmmss + put("^\\d{1,2}/\\d{1,2}/\\d{4}\\s\\d{1,2}\\.\\d{2}\\.\\d{2}$", "dd/MM/yyyy HH.mm.ss"); + put("^\\d{1,2}/\\d{1,2}/\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd/MM/yyyy HH:mm:ss"); + + put("^\\d{1,2}\\.\\d{1,2}\\.\\d{4}\\s\\d{1,2}\\.\\d{2}\\.\\d{2}$", "dd.MM.yyyy HH.mm.ss"); + put("^\\d{1,2}\\.\\d{1,2}\\.\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd.MM.yyyy HH:mm:ss"); + + put("^\\d{1,2}-\\d{1,2}-\\d{4}\\s\\d{1,2}\\.\\d{2}\\.\\d{2}$", "dd-MM-yyyy HH.mm.ss"); + put("^\\d{1,2}-\\d{1,2}-\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd-MM-yyyy HH:mm:ss"); + + //anno-mese-giorno hhmmss + put("^\\d{4}/\\d{1,2}/\\d{1,2}\\s\\d{1,2}\\.\\d{2}\\.\\d{2}$", "yyyy/MM/dd HH.mm.ss"); + put("^\\d{4}/\\d{1,2}/\\d{1,2}\\s\\d{1,2}:\\d{2}:\\d{2}$", "yyyy/MM/dd HH:mm:ss"); + + put("^\\d{4}\\.\\d{1,2}\\.\\d{1,2}\\s\\d{1,2}\\.\\d{2}\\.\\d{2}$", "yyyy.MM.dd HH.mm.ss"); + put("^\\d{4}\\.\\d{1,2}\\.\\d{1,2}\\s\\d{1,2}:\\d{2}:\\d{2}$", "yyyy.MM.dd HH:mm:ss"); + + put("^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}\\.\\d{2}\\.\\d{2}$", "yyyy-MM-dd HH.mm.ss"); + put("^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:\\d{2}:\\d{2}$", "yyyy-MM-dd HH:mm:ss"); + + //anno-mese-giorno hhmmssS + put("^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:\\d{2}:\\d{2}.\\d{1,3}$", "yyyy-MM-dd HH:mm:ss.SSS"); + + //----------------------------------------------------------------------------------------- + //altri formati + put("^\\d{1,2}\\s[a-z]{3}\\s\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd MMM yyyy HH:mm:ss"); + put("^\\d{1,2}\\s[a-z]{4,}\\s\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd MMMM yyyy HH:mm:ss"); + + put("^\\d{4}-\\d{1,2}-\\d{1,2}[T]\\d{1,2}:\\d{2}:\\d{2}$", "yyyy-MM-ddTHH:mm:ss"); + + put("^\\d{4}-\\d{1,2}-\\d{1,2}t\\d{1,2}:\\d{2}:\\d{2}.\\d{1,3}z$", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + put("^(\\d{4})-(\\d{2})-(\\d{2})t(\\d{2}):(\\d{2}):(\\d{2})((\\+|-)(\\d{2}):(\\d{2}))$", "yyyy-MM-dd'T'HH:mm:ss"); + }}; + + public static String determineDateFormat(String dateString) { + for (String regexp : DATE_FORMAT_REGEXPS.keySet()) { + if (dateString.toLowerCase().matches(regexp)) { + return DATE_FORMAT_REGEXPS.get(regexp); + } + } + return null; // Unknown format. + } public static boolean isNullOrEmpty(String stringToCheck){ return stringToCheck == null || stringToCheck.trim().isEmpty(); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdFragment.java index c8a67912..28bf7210 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdFragment.java @@ -136,6 +136,14 @@ public class ProdRiposizionamentoDaProdFragment extends BaseFragment implements return null; }); + itemType.areContentsTheSame((oldObject, newObject) -> + oldObject.getCodMart().equalsIgnoreCase(newObject.getCodMart()) && + oldObject.getNumOrd().equals(newObject.getNumOrd()) && + oldObject.getDataOrd().equals(newObject.getDataOrd()) + ); + + itemType.areItemSame((oldObject, newObject) -> oldObject == newObject); + new LiveAdapter(mItemsInventario) .map(ArtsInGiacenzaDTO.class, itemType) .into(this.mBindings.inventarioList); @@ -199,10 +207,10 @@ public class ProdRiposizionamentoDaProdFragment extends BaseFragment implements .setOnFilterApplied(mFilterViewModel::setPositionFilter) .setPreselected( Stream.of(Objects.requireNonNull(mViewModel.getItemsInventario().getValue())) - .filter(mFilterViewModel.getCurrentPositionPredicate().get() == null ? - x -> false : Objects.requireNonNull(mFilterViewModel.getCurrentPositionPredicate().get())) - .map(ArtsInGiacenzaDTO::getPosizione) - .toList() + .filter(mFilterViewModel.getCurrentPositionPredicate().get() == null ? + x -> false : Objects.requireNonNull(mFilterViewModel.getCurrentPositionPredicate().get())) + .map(ArtsInGiacenzaDTO::getPosizione) + .toList() ); } @@ -213,6 +221,7 @@ public class ProdRiposizionamentoDaProdFragment extends BaseFragment implements public void onInfoClick(ArtsInGiacenzaDTO item) { try { + BarcodeManager.disable(); DialogInfoGiacenzaView.newInstance(item).show(getChildFragmentManager(), DialogInfoGiacenzaView.class.getName()); } catch (Exception e) { UtilityExceptions.defaultException(this.getContext(), e); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdViewModel.java index 07b473a0..f08c9147 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/ProdRiposizionamentoDaProdViewModel.java @@ -179,7 +179,24 @@ public class ProdRiposizionamentoDaProdViewModel { Objects.equals(x.getNumOrd(), dtoList.get(0).getNumOrd()) && Objects.equals(x.getDataOrd(), dtoList.get(0).getDataOrd()) ) - .findFirstOrElse(null); + .findFirstOrElse(new StatoArtInventarioDTO()); + + MvwSitArtUdcDetInventario mvwInventario = mvwSitArtUdcDetInventario.get(); + + if (mvwInventario.getCodMart().equalsIgnoreCase(dtoList.get(0).getCodMart()) && + Objects.equals(mvwInventario.getNumOrd(), dtoList.get(0).getNumOrd()) && + Objects.equals(mvwInventario.getDataOrd(), dtoList.get(0).getDataOrd())) { + BigDecimal colliMag = statoArticolo.getColliMag(); + Integer pedMag = statoArticolo.getPedMag(); + BigDecimal qtaMag = statoArticolo.getQtaMag(); + + BigDecimal numCnf = mvwInventario.getNumCnf(); + BigDecimal qtaCol = mvwInventario.getQtaCol(); + + statoArticolo.setColliMag(colliMag.add(numCnf)); + statoArticolo.setQtaMag(qtaMag.add(qtaCol)); + statoArticolo.setPedMag(pedMag + 1); + } return new ArtsInGiacenzaDTO() .setCodMart(dtoList.get(0).getCodMart()) diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dialogs/info_giacenza/DialogInfoGiacenzaView.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dialogs/info_giacenza/DialogInfoGiacenzaView.java index 092ae768..d19784ca 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dialogs/info_giacenza/DialogInfoGiacenzaView.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dialogs/info_giacenza/DialogInfoGiacenzaView.java @@ -10,13 +10,9 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.annimon.stream.Stream; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.ravikoradiya.liveadapter.LiveAdapter; -import java.util.ArrayList; -import java.util.List; - import javax.inject.Inject; import it.integry.integrywmsnative.BR; @@ -24,7 +20,6 @@ import it.integry.integrywmsnative.MainApplication; import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.expansion.BaseDialogFragment; import it.integry.integrywmsnative.databinding.DialogInfoGiacenzaBinding; -import it.integry.integrywmsnative.databinding.DialogInfoGiacenzaSituazioneArticoloBinding; import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dto.ArtsInGiacenzaDTO; import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dto.StatoArtInventarioDTO; import it.integry.integrywmsnative.gest.spedizione.dialogs.row_info.info_situazione_articolo.ui.DialogInfoSituazioneArticoloAvailableListItem; @@ -34,8 +29,7 @@ public class DialogInfoGiacenzaView extends BaseDialogFragment { DialogInfoGiacenzaViewModel mViewModel; private DialogInfoGiacenzaBinding mBindings; - private Context mContext; - private ArtsInGiacenzaDTO item; + private final ArtsInGiacenzaDTO item; public static DialogInfoGiacenzaView newInstance(ArtsInGiacenzaDTO item) { return new DialogInfoGiacenzaView(item); @@ -48,9 +42,9 @@ public class DialogInfoGiacenzaView extends BaseDialogFragment { @NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { - this.mContext = requireContext(); + Context mContext = requireContext(); - mBindings = DialogInfoGiacenzaBinding.inflate(LayoutInflater.from(this.mContext), null, false); + mBindings = DialogInfoGiacenzaBinding.inflate(LayoutInflater.from(mContext), null, false); mBindings.setLifecycleOwner(this); MainApplication.appComponent @@ -60,7 +54,7 @@ public class DialogInfoGiacenzaView extends BaseDialogFragment { setCancelable(true); - var alertDialog = new MaterialAlertDialogBuilder(this.mContext) + var alertDialog = new MaterialAlertDialogBuilder(mContext) .setView(mBindings.getRoot()) .setNeutralButton(R.string.action_close, null) .setCancelable(isCancelable()) @@ -86,17 +80,8 @@ public class DialogInfoGiacenzaView extends BaseDialogFragment { if (availableItems == null) return; - var listItem = Stream.of(availableItems) - .flatMap(x -> Stream.of(x.getMvwSitArtUdcDetInventarioDTO()) - .map(DialogInfoSituazioneArticoloAvailableListItem::fromMvwSitArtUdcDetInventario) - ) - .toList(); - - List statoArticolo = null; StatoArtInventarioDTO statoArtInventario = availableItems.getStatoArtInventario(); if (statoArtInventario != null) { - statoArticolo = Stream.of(statoArtInventario).toList(); - if (statoArtInventario.colliArrivoIsLessThenZero() && statoArtInventario.colliMagIsLessThenZero()) { this.mBindings.situazioneArticolo.setVisibility(View.GONE); @@ -105,11 +90,11 @@ public class DialogInfoGiacenzaView extends BaseDialogFragment { this.mBindings.situazioneArticolo.setVisibility(View.GONE); } - new LiveAdapter(listItem, BR.item) + new LiveAdapter(this.item.getSituazioneArticoloAvailableListItem(), BR.item) .map(DialogInfoSituazioneArticoloAvailableListItem.class, R.layout.dialog_info_giacenza_list_item) .into(this.mBindings.availableList); - new LiveAdapter(statoArticolo, BR.item) + new LiveAdapter(this.item.getStatoInventario(), BR.item) .map(StatoArtInventarioDTO.class, R.layout.dialog_info_giacenza_situazione_articolo) .into(this.mBindings.situazioneArticolo); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dto/ArtsInGiacenzaDTO.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dto/ArtsInGiacenzaDTO.java index c400cc98..e7e583d6 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dto/ArtsInGiacenzaDTO.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_riposizionamento_da_prod/dto/ArtsInGiacenzaDTO.java @@ -1,10 +1,13 @@ package it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dto; +import com.annimon.stream.Stream; + import java.math.BigDecimal; import java.util.Date; import java.util.List; import it.integry.integrywmsnative.core.model.MvwSitArtUdcDetInventario; +import it.integry.integrywmsnative.gest.spedizione.dialogs.row_info.info_situazione_articolo.ui.DialogInfoSituazioneArticoloAvailableListItem; public class ArtsInGiacenzaDTO { @@ -113,4 +116,16 @@ public class ArtsInGiacenzaDTO { this.dataOrd = dataOrd; return this; } + + public List getSituazioneArticoloAvailableListItem() { + return Stream.of(this) + .flatMap(x -> Stream.of(x.getMvwSitArtUdcDetInventarioDTO()) + .map(DialogInfoSituazioneArticoloAvailableListItem::fromMvwSitArtUdcDetInventario) + ) + .toList(); + } + + public List getStatoInventario(){ + return Stream.of(this.statoArtInventario).toList(); + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeFragment.java index a64b93f4..27dfbdca 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeFragment.java @@ -403,32 +403,7 @@ public class RettificaGiacenzeFragment extends BaseFragment implements ITitledFr String codMart = dialogInputQuantityV2DTO.getMtbAart().getCodMart(); String flagStato = dialogInputQuantityV2DTO.getMtbAart().getFlagStato(); - if (flagStato.equalsIgnoreCase("I")) { - DialogSimpleMessageView.makeWarningDialog( - new SpannableString(Html.fromHtml(String.format(UtilityResources.getString(R.string.item_not_enabled), codMart))), - null, - () -> { - if (!mDialogInputQuantityV2View.isVisible()) - mDialogInputQuantityV2View - .setDialogInputQuantityV2DTO(dialogInputQuantityV2DTO) - .setOnComplete((resultDTO, shouldCloseLU) -> { - PickedQuantityDTO pickedQuantityDTO = new PickedQuantityDTO() - .setNumCnf(resultDTO.getNumCnf()) - .setQtaCnf(resultDTO.getQtaCnf()) - .setQtaTot(resultDTO.getQtaTot()) - .setPartitaMag(resultDTO.getPartitaMag()) - .setDataScad(resultDTO.getDataScad()); - - this.onLoadingStarted(); - onComplete.run(pickedQuantityDTO, shouldCloseLU); - }) - .setOnAbort(this::onLoadingEnded) - .show(requireActivity().getSupportFragmentManager(), "tag"); - }, - this::onLoadingEnded) - .show(getActivity().getSupportFragmentManager(), "tag"); - } else { - this.onLoadingEnded(); + checkIfItemIsActive(flagStato, codMart, () -> { if (!mDialogInputQuantityV2View.isVisible()) mDialogInputQuantityV2View .setDialogInputQuantityV2DTO(dialogInputQuantityV2DTO) @@ -440,13 +415,23 @@ public class RettificaGiacenzeFragment extends BaseFragment implements ITitledFr .setPartitaMag(resultDTO.getPartitaMag()) .setDataScad(resultDTO.getDataScad()); - this.onLoadingStarted(); onComplete.run(pickedQuantityDTO, shouldCloseLU); }) - .setOnAbort(this::onLoadingEnded) .show(requireActivity().getSupportFragmentManager(), "tag"); + }, () -> {}); + } + + 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))), + null, + onContinue, + onNegativeClick) + .show(getActivity().getSupportFragmentManager(), "tag"); + } else { + onContinue.run(); } - ; } @Override diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2View.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2View.java index 8fdcaecf..0aa33da3 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2View.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2View.java @@ -256,14 +256,19 @@ public class DialogInputQuantityV2View extends BaseDialogFragment implements Dia }; public void save() { + this.onLoadingStarted(); + this.mViewModel.validate(validated -> { - if (validated) { - this.mAbort = false; - dismiss(); - this.mOnComplete.run(this.mViewModel.getResult(), false); - }else { + + requireActivity().runOnUiThread(() -> { this.onLoadingEnded(); - } + + if (validated) { + this.mAbort = false; + dismiss(); + this.mOnComplete.run(this.mViewModel.getResult(), false); + } + }); }); } @@ -271,9 +276,9 @@ public class DialogInputQuantityV2View extends BaseDialogFragment implements Dia this.mViewModel.validate(validated -> { if (validated) { this.mAbort = false; - dismiss();this.onLoadingEnded(); + dismiss(); this.mOnComplete.run(this.mViewModel.getResult(), true); - }else { + } else { this.onLoadingEnded(); } }); @@ -527,13 +532,6 @@ public class DialogInputQuantityV2View extends BaseDialogFragment implements Dia this.mEnableDataCallback = true; } - @Override - public void onError(Exception ex) { - DialogSimpleMessageView - .makeErrorDialog(new SpannableString(Html.fromHtml(ex.getMessage())), null, null) - .show(requireActivity().getSupportFragmentManager(), "tag"); - } - @Override public void onWarning(String text, RunnableArgs result) { DialogSimpleMessageView.makeWarningDialog(new SpannableString(Html.fromHtml(text)), diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2ViewModel.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2ViewModel.java index e9916cd4..42609532 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2ViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2ViewModel.java @@ -99,7 +99,6 @@ public class DialogInputQuantityV2ViewModel { private final MagazzinoRESTConsumer mMagazzinoRESTConsumer; private StatoPartitaMag statoArt; - private MtbPartitaMag mtbPartitaMag; @Inject public DialogInputQuantityV2ViewModel(BarcodeRESTConsumer barcodeRESTConsumer, MagazzinoRESTConsumer magazzinoRESTConsumer) { @@ -485,46 +484,66 @@ public class DialogInputQuantityV2ViewModel { } public void validate(RunnableArgs onValidated) { - this.sendOnLoadingStarted(); new Thread(() -> { if (this.internalQtaCnf == null || UtilityBigDecimal.equalsTo(this.internalQtaCnf, BigDecimal.ZERO)) { - this.mListener.onError(new InvalidQtaCnfQuantityException()); + this.sendError(new InvalidQtaCnfQuantityException()); onValidated.run(false); return; } - if (!disableTracciabilitaCheck && mtbAart.get().isFlagTracciabilitaBoolean() && UtilityString.isNullOrEmpty(internalPartitaMag)) { - if (suggestPartitaMagRunnable != null) { - internalPartitaMag = suggestPartitaMagRunnable.run(this); - if (internalPartitaMag == null) { - this.mListener.onError(new InvalidBatchLotException()); + if (!disableTracciabilitaCheck && mtbAart.get().isFlagTracciabilitaBoolean()) { + if (UtilityString.isNullOrEmpty(internalPartitaMag)) { + if (suggestPartitaMagRunnable != null) { + internalPartitaMag = suggestPartitaMagRunnable.run(this); + if (internalPartitaMag == null) { + this.sendError(new InvalidBatchLotException()); + onValidated.run(false); + return; + } + } else { + this.sendError(new InvalidBatchLotException()); onValidated.run(false); return; } } else { - this.mListener.onError(new InvalidBatchLotException()); - onValidated.run(false); - return; + if (SettingsManager.iDB().isFlagWarningNewPartitaMag()) { + MtbPartitaMag mtbPartitaMag = null; + try { + mtbPartitaMag = retrievePartitaMag(internalPartitaMag, this.getMtbAart().getCodMart()); + } catch (Exception e) { + this.sendError(e); + onValidated.run(false); + return; + } + + if (mtbPartitaMag == null) { + boolean result = runWarningDialogSyncronized(UtilityResources.getString(R.string.batch_lot_inexistent_error_message)); + if (!result) { + onValidated.run(false); + return; + } + } + } } } if (this.statoArt == StatoPartitaMag.DISATTIVO) { - this.mListener.onError(new InactiveBatchLotException(internalPartitaMag)); + this.sendError(new InactiveBatchLotException(internalPartitaMag)); onValidated.run(false); return; } if (this.shouldAskDataScad && UtilityString.isNullOrEmpty(internalPartitaMag)) { - this.mListener.onError(new InvalidBatchLotException()); + this.sendError(new InvalidBatchLotException()); onValidated.run(false); return; } if (this.shouldAskDataScad && this.internalDataScad == null) { - this.mListener.onError(new InvalidExpireDateException()); + this.sendError(new InvalidExpireDateException()); onValidated.run(false); return; } @@ -532,7 +551,7 @@ public class DialogInputQuantityV2ViewModel { if (!this.canOverflowOrderQuantity && UtilityBigDecimal.greaterThan(this.internalQtaTot, this.totalQtaOrd) && this.mtbAart.get().isFlagQtaCnfFissaBoolean()) { - this.mListener.onError(new OverflowQtaTotOrderedQuantityException()); + this.sendError(new OverflowQtaTotOrderedQuantityException()); onValidated.run(false); return; } @@ -540,14 +559,14 @@ public class DialogInputQuantityV2ViewModel { if (!this.canOverflowOrderQuantity && UtilityBigDecimal.greaterThan(this.internalNumCnf, this.totalNumCnfOrd) && !this.mtbAart.get().isFlagQtaCnfFissaBoolean()) { - this.mListener.onError(new OverflowNumCnfOrderedQuantityException()); + this.sendError(new OverflowNumCnfOrderedQuantityException()); onValidated.run(false); return; } if (UtilityBigDecimal.greaterThan(this.internalQtaTot, this.totalQtaAvailable)) { - this.mListener.onError(new OverflowQtaTotAvailableQuantityException()); + this.sendError(new OverflowQtaTotAvailableQuantityException()); onValidated.run(false); return; } @@ -555,7 +574,7 @@ public class DialogInputQuantityV2ViewModel { if (UtilityBigDecimal.greaterThan(this.internalNumCnf, this.totalNumCnfAvailable) && !this.mtbAart.get().isFlagQtaCnfFissaBoolean()) { - this.mListener.onError(new OverflowNumCnfAvailableQuantityException()); + this.sendError(new OverflowNumCnfAvailableQuantityException()); onValidated.run(false); return; } @@ -565,13 +584,13 @@ public class DialogInputQuantityV2ViewModel { UtilityBigDecimal.equalsOrLowerThan(this.internalQtaCnf, BigDecimal.ZERO) || UtilityBigDecimal.equalsOrLowerThan(this.internalQtaTot, BigDecimal.ZERO))) { - this.mListener.onError(new InvalidQuantityException()); + this.sendError(new InvalidQuantityException()); onValidated.run(false); return; } if (this.isNoteMandatory() && (this.internalNote == null || this.internalNote.length() <= 0)) { - this.mListener.onError(new InvalidNotesException()); + this.sendError(new InvalidNotesException()); onValidated.run(false); return; } @@ -579,22 +598,10 @@ public class DialogInputQuantityV2ViewModel { if (!UtilityString.isNullOrEmpty(this.internalPartitaMag)) this.internalPartitaMag = this.internalPartitaMag.toUpperCase(); - if (SettingsManager.iDB().isFlagWarningNewPartitaMag()) { - asyncMagazzinoRESTConsumer(internalPartitaMag, this.getMtbAart().getCodMart()); - - if (mtbPartitaMag == null) { - boolean result = runAsyncWarningDialog(UtilityResources.getString(R.string.batch_lot_inexistent_error_message)); - if (!result) { - onValidated.run(false); - return; - } - } - } - if (this.warnOnQuantityOverflow && UtilityBigDecimal.greaterThan(this.internalQtaTot, this.totalQtaOrd) && this.mtbAart.get().isFlagQtaCnfFissaBoolean()) { - boolean result = runAsyncWarningDialog(UtilityResources.getString(R.string.confirm_ordered_quantity_overflow_error_message)); + boolean result = runWarningDialogSyncronized(UtilityResources.getString(R.string.confirm_ordered_quantity_overflow_error_message)); if (!result) { onValidated.run(false); return; @@ -604,19 +611,18 @@ public class DialogInputQuantityV2ViewModel { if (this.warnOnQuantityOverflow && UtilityBigDecimal.greaterThan(this.internalNumCnf, this.totalNumCnfOrd) && !this.mtbAart.get().isFlagQtaCnfFissaBoolean()) { - boolean result = runAsyncWarningDialog(UtilityResources.getString(R.string.confirm_ordered_num_cnf_overflow_error_message)); + boolean result = runWarningDialogSyncronized(UtilityResources.getString(R.string.confirm_ordered_num_cnf_overflow_error_message)); if (!result) { onValidated.run(false); return; } } - this.sendOnLoadingEnded(); onValidated.run(true); }).start(); } - private boolean runAsyncWarningDialog(String text) { + private boolean runWarningDialogSyncronized(String text) { try { final FutureTask ft = new FutureTask<>(() -> { }, new Object()); @@ -634,26 +640,9 @@ public class DialogInputQuantityV2ViewModel { } } - private void asyncMagazzinoRESTConsumer(String partitaMag, String codMart) { - try { - final FutureTask ft = new FutureTask<>(() -> { - }, new Object()); - mMagazzinoRESTConsumer.retrievePartitaMag( - partitaMag, - codMart, - returnPartitaMag -> { - mtbPartitaMag = returnPartitaMag; - ft.run(); - }, - e -> { - this.sendError(e); - ft.run(); - }); + private MtbPartitaMag retrievePartitaMag(String partitaMag, String codMart) throws Exception { + return mMagazzinoRESTConsumer.retrievePartitaMagSyncronized(partitaMag, codMart, this::sendError); - ft.get(); - } catch (Exception e) { - this.sendError(e); - } } public DialogInputQuantityV2ResultDTO getResult() { diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_or_create_lu/DialogScanOrCreateLUViewModel.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_or_create_lu/DialogScanOrCreateLUViewModel.java index 990b2bd1..26a02de5 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_or_create_lu/DialogScanOrCreateLUViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_or_create_lu/DialogScanOrCreateLUViewModel.java @@ -3,6 +3,7 @@ package it.integry.integrywmsnative.view.dialogs.scan_or_create_lu; import com.annimon.stream.Stream; import it.integry.barcode_base_android_library.model.BarcodeScanDTO; +import it.integry.integrywmsnative.core.CommonConst; import it.integry.integrywmsnative.core.exception.AlreadyAttachedDocumentToLUException; import it.integry.integrywmsnative.core.exception.NoLUFoundException; import it.integry.integrywmsnative.core.exception.TooManyLUFoundInMonoLUPositionException; @@ -114,7 +115,20 @@ public class DialogScanOrCreateLUViewModel { if (mtbColt == null) { if (mEnableCreation) { - this.mColliMagazzinoRESTConsumer.createColloFromEtichettaAnonima(barcodeScanDTO, GestioneEnum.LAVORAZIONE, createdMtbColt -> { + Integer customNumCollo = null; + + try { + customNumCollo = UtilityBarcode.getNumColloFromULAnonima(barcodeScanDTO.getStringValue()); + } catch (Exception ex) { + this.sendError(ex); + } + + var createUdcRequest = new CreateUDCRequestDTO() + .setCodMdep(SettingsManager.i().getUserSession().getDepo().getCodMdep()) + .setNumCollo(customNumCollo) + .setSerCollo(CommonConst.Config.DEFAULT_ANONYMOUS_UL_SERIE); + + this.mColliLavorazioneRESTConsumer.createUDC(createUdcRequest, createdMtbColt -> { onComplete.run(); this.sendOnLUOpened(createdMtbColt, true); }, this::sendError); diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 12c3fac0..8a79a67e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -354,8 +354,8 @@ Consegnato il %s Personalizzazioni Frudis - %s non è attivo.]]> - %s non è attivo.]]> + %s non è attivo. Continuare?]]> + %s non è attivo. Continuare?]]> Punto Vendita SaporiVeri PV Genera ordini di acquisto diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3bd81317..72ec40f4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -359,8 +359,8 @@ Delivered on %s Frudis customizations - %s is inactive.]]> - %s is inactive.]]> + %s is inactive. To continue?]]> + %s is inactive. To continue?]]> Other Home Logout diff --git a/build.gradle b/build.gradle index 125adf3e..a814d42b 100644 --- a/build.gradle +++ b/build.gradle @@ -2,8 +2,8 @@ buildscript { ext { - kotlin_version = '1.9.0' - agp_version = '8.3.1' + kotlin_version = '1.9.20' + agp_version = '8.3.2' } repositories { @@ -13,7 +13,7 @@ buildscript { dependencies { classpath "com.android.tools.build:gradle:$agp_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.google.gms:google-services:4.4.0' + classpath 'com.google.gms:google-services:4.4.1' classpath 'com.google.firebase:perf-plugin:1.4.2'