diff --git a/app/src/main/java/it/integry/integrywmsnative/core/di/BindableFloat.java b/app/src/main/java/it/integry/integrywmsnative/core/di/BindableFloat.java index b6223f41..fcb58c50 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/di/BindableFloat.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/di/BindableFloat.java @@ -4,9 +4,6 @@ import androidx.databinding.BaseObservable; import java.math.BigDecimal; -import it.integry.integrywmsnative.core.CommonConst; -import it.integry.integrywmsnative.core.utility.UtilityNumber; - public class BindableFloat extends BaseObservable { private Float value; @@ -15,10 +12,6 @@ public class BindableFloat extends BaseObservable { } public BigDecimal getBigDecimal() { - int numberOfDigits = UtilityNumber.countNumberOfDecimalDigits(get()); - - if(numberOfDigits > CommonConst.Config.NUMBER_OF_DECIMAL_DIGITS) numberOfDigits = CommonConst.Config.NUMBER_OF_DECIMAL_DIGITS; - return BigDecimal.valueOf(get()); } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/di/Converters.java b/app/src/main/java/it/integry/integrywmsnative/core/di/Converters.java index aabea435..d6d9571c 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/di/Converters.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/di/Converters.java @@ -265,7 +265,7 @@ public class Converters { BigDecimal value = null; if (!UtilityString.isNullOrEmpty(s.toString())) - value = new BigDecimal(s.toString()); + value = UtilityNumber.parseBigDecimal(s.toString(), Locale.getDefault()); observableBigDecimal.set(value); } @@ -275,7 +275,7 @@ public class Converters { } BigDecimal newValue = observableBigDecimal.get(); - BigDecimal viewValue = !view.getText().toString().trim().isEmpty() ? new BigDecimal(view.getText().toString()) : null; + BigDecimal viewValue = !view.getText().toString().trim().isEmpty() ? UtilityNumber.parseBigDecimal(view.getText().toString(), Locale.getDefault()) : null; if (!UtilityBigDecimal.equalsTo(viewValue, newValue)) { view.setText(UtilityNumber.decimalToString(newValue)); @@ -296,7 +296,7 @@ public class Converters { String newValueString = s.toString().trim(); if (!UtilityString.isNullOrEmpty(newValueString)) - value = new BigDecimal(newValueString); + value = UtilityNumber.parseBigDecimal(newValueString, Locale.getDefault()); observableBigDecimal.set(value); } @@ -305,7 +305,7 @@ public class Converters { view.addTextChangedListener(watcher); } BigDecimal newValue = observableBigDecimal.get(); - BigDecimal viewValue = !view.getText().toString().trim().isEmpty() ? new BigDecimal(view.getText().toString()) : null; + BigDecimal viewValue = !view.getText().toString().trim().isEmpty() ? UtilityNumber.parseBigDecimal(view.getText().toString(), Locale.getDefault()) : null; if (!UtilityBigDecimal.equalsTo(viewValue, newValue)) { view.setText(UtilityNumber.decimalToString(newValue)); @@ -326,7 +326,7 @@ public class Converters { String newValueString = s.toString().trim(); if (!UtilityString.isNullOrEmpty(newValueString)) - value = new BigDecimal(newValueString); + value = UtilityNumber.parseBigDecimal(newValueString, Locale.getDefault()); observableBigDecimal.set(value); } @@ -335,7 +335,7 @@ public class Converters { view.addTextChangedListener(watcher); } BigDecimal newValue = observableBigDecimal.get(); - BigDecimal viewValue = !view.getText().toString().trim().isEmpty() ? new BigDecimal(view.getText().toString()) : null; + BigDecimal viewValue = !view.getText().toString().trim().isEmpty() ? UtilityNumber.parseBigDecimal(view.getText().toString(), Locale.getDefault()) : null; if (!UtilityBigDecimal.equalsTo(viewValue, newValue)) { view.setText(UtilityNumber.decimalToString(newValue)); @@ -354,7 +354,8 @@ public class Converters { public void onTextChanged(CharSequence s, int start, int before, int count) { BigDecimal value = null; if (!UtilityString.isNullOrEmpty(s.toString())) - value = new BigDecimal(s.toString()); + value = UtilityNumber.parseBigDecimal(s.toString(), Locale.getDefault()); + bindableBigDecimal.set(value); } }; @@ -362,7 +363,7 @@ public class Converters { view.addTextChangedListener(watcher); } BigDecimal newValue = bindableBigDecimal.get(); - BigDecimal viewValue = !view.getText().toString().trim().isEmpty() ? new BigDecimal(view.getText().toString()) : null; + BigDecimal viewValue = !view.getText().toString().trim().isEmpty() ? UtilityNumber.parseBigDecimal(view.getText().toString(), Locale.getDefault()) : null; if (!UtilityBigDecimal.equalsTo(viewValue, newValue)) { view.setText(UtilityNumber.decimalToString(newValue)); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityNumber.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityNumber.java index 4da65217..232b78fc 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityNumber.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityNumber.java @@ -1,6 +1,7 @@ package it.integry.integrywmsnative.core.utility; import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Locale; @@ -9,7 +10,8 @@ import it.integry.integrywmsnative.core.CommonConst; public class UtilityNumber { - private static DecimalFormat decimalFormatInstance; + // Locale italiano per la formattazione + private static final Locale ITALIAN_LOCALE = new Locale("it", "IT"); public static String decimalToString(Float bigDecimal){ if(bigDecimal == null) return "0"; @@ -23,71 +25,59 @@ public class UtilityNumber { public static String decimalToString(BigDecimal bigDecimal, int decimal){ if(bigDecimal == null) return "0"; - return decimalToString(bigDecimal.floatValue(), decimal); + + // Usa stripTrailingZeros per rimuovere gli zeri finali + BigDecimal stripped = bigDecimal.stripTrailingZeros(); + // Limita il numero di decimali visualizzati + int scale = Math.min(stripped.scale(), decimal); + stripped = stripped.setScale(scale, RoundingMode.DOWN); + + // Configura il formato italiano con virgola come separatore decimale + DecimalFormatSymbols italianSymbols = new DecimalFormatSymbols(ITALIAN_LOCALE); + italianSymbols.setDecimalSeparator(','); + + // Crea il pattern dinamico basato sul numero di decimali + StringBuilder patternBuilder = new StringBuilder("0"); + if (scale > 0) { + patternBuilder.append("."); + for (int i = 0; i < scale; i++) { + patternBuilder.append("0"); + } + } + + DecimalFormat formatter = new DecimalFormat(patternBuilder.toString(), italianSymbols); + String result = formatter.format(stripped); + + // Se il risultato termina con ',', rimuovilo (per i numeri interi) + if (result.endsWith(",")) { + result = result.substring(0, result.length() - 1); + } + + return result; } public static String decimalToString(float floatValue, int decimal) { - DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(Locale.getDefault()); - otherSymbols.setDecimalSeparator('.'); - otherSymbols.setGroupingSeparator(','); - - final DecimalFormat decimalFormat = new DecimalFormat(); - decimalFormat.setMaximumFractionDigits(decimal); - decimalFormat.setDecimalFormatSymbols(otherSymbols); - decimalFormat.setGroupingUsed(false); - decimalFormat.setMinimumFractionDigits(Math.min(2, decimal)); - - return decimalFormat.format(floatValue); + return decimalToString(BigDecimal.valueOf(floatValue), decimal); } - public static DecimalFormat getNumberFormatInstance() { - - if(decimalFormatInstance == null) { - DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(Locale.getDefault()); - otherSymbols.setDecimalSeparator('.'); - otherSymbols.setGroupingSeparator(','); - - decimalFormatInstance = new DecimalFormat(); - decimalFormatInstance.setMaximumFractionDigits(CommonConst.Config.NUMBER_OF_DECIMAL_DIGITS); - decimalFormatInstance.setDecimalFormatSymbols(otherSymbols); - decimalFormatInstance.setGroupingUsed(false); + public static BigDecimal parseBigDecimal(String value, Locale locale) { + if (value == null || value.trim().isEmpty()) return null; + try { + DecimalFormatSymbols symbols = new DecimalFormatSymbols(locale); + DecimalFormat format = new DecimalFormat(); + format.setDecimalFormatSymbols(symbols); + format.setParseBigDecimal(true); + return (BigDecimal) format.parse(value); + } catch (Exception e) { + return null; } - - return decimalFormatInstance; } - public static int countNumberOfDecimalDigits(Float value) { - String text = getNumberFormatInstance().format(Math.abs(value)); - int integerPlaces = text.indexOf('.'); - int decimalPlaces = text.length() - integerPlaces - 1; - - return decimalPlaces; - } - - public static String normalizeStringNumber(String numberString) { - return numberString.replaceAll(",", "."); - } - - - - - public static Float decimalToFloat(BigDecimal bigDecimalValue) { - float multiplier = (float) Math.pow(10, CommonConst.Config.NUMBER_OF_DECIMAL_DIGITS); - - Float floatValue = null; - - if(bigDecimalValue != null) { - int intValue = (int) (bigDecimalValue.floatValue() * multiplier); - floatValue = Float.valueOf(intValue / multiplier); - } - - return floatValue; - } - - public static float truncateToDecimal(float v, int i) { - int delta = 10*i; - - return ((int)v*delta)/delta; - + /** + * Parsa una stringa numerica italiana (con virgola come separatore decimale) + * e restituisce un BigDecimal + */ + public static BigDecimal parseItalianBigDecimal(String value) { + return parseBigDecimal(value, ITALIAN_LOCALE); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeModule.java index 5d7cacb6..deb9aa48 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeModule.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeModule.java @@ -1,28 +1,10 @@ package it.integry.integrywmsnative.gest.prod_recupero_materiale; -import java.util.concurrent.ExecutorService; - import dagger.Module; -import dagger.Provides; -import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer; -import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; -import it.integry.integrywmsnative.core.rest.consumers.MaterialiRESTConsumer; -import it.integry.integrywmsnative.gest.prod_recupero_materiale.rest.ProdRecuperoMaterialeRESTConsumer; @Module(subcomponents = ProdRecuperoMaterialeComponent.class) public class ProdRecuperoMaterialeModule { - @Provides - ProdRecuperoMaterialeRESTConsumer providesProdRecuperMaterialeRESTConsumer(MaterialiRESTConsumer materialiRESTConsumer, ArticoloRESTConsumer articoloRESTConsumer) { - return new ProdRecuperoMaterialeRESTConsumer(articoloRESTConsumer, materialiRESTConsumer); - } - @Provides - ProdRecuperoMaterialeViewModel providesProdRecuperoMaterialeViewModel(ProdRecuperoMaterialeRESTConsumer prodRecuperoMaterialeRESTConsumer, - ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer, - MaterialiRESTConsumer materialiRESTConsumer, - ExecutorService executorService) { - return new ProdRecuperoMaterialeViewModel(prodRecuperoMaterialeRESTConsumer, colliMagazzinoRESTConsumer, materialiRESTConsumer, executorService); - } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/rest/ProdRecuperoMaterialeRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/rest/ProdRecuperoMaterialeRESTConsumer.java index a8dd7b06..7716fe3e 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/rest/ProdRecuperoMaterialeRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/rest/ProdRecuperoMaterialeRESTConsumer.java @@ -5,7 +5,6 @@ import androidx.annotation.NonNull; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @@ -24,6 +23,7 @@ public class ProdRecuperoMaterialeRESTConsumer extends _BaseRESTConsumer { private final ArticoloRESTConsumer mArticoloRESTConsumer; private final MaterialiRESTConsumer mMaterialiRESTConsumer; + @Inject public ProdRecuperoMaterialeRESTConsumer(ArticoloRESTConsumer articoloRESTConsumer, MaterialiRESTConsumer materialiRESTConsumer) { this.mMaterialiRESTConsumer = materialiRESTConsumer; this.mArticoloRESTConsumer = articoloRESTConsumer; @@ -55,6 +55,25 @@ public class ProdRecuperoMaterialeRESTConsumer extends _BaseRESTConsumer { return keyMap; }, Collectors.toList())); + for (HashMap ulKey : ulListGrouped.keySet()) { + var matchingUls = ulList.stream().filter(x -> + Objects.equals(x.getGestione(), ulKey.get("gestione")) && + Objects.equals(x.getDataCollo(), ulKey.get("data_collo")) && + Objects.equals(x.getSerCollo(), ulKey.get("ser_collo")) && + Objects.equals(x.getNumCollo(), ulKey.get("num_collo")) && + Objects.equals(x.getCodMart(), ulKey.get("cod_mart")) && + Objects.equals(x.getPartitaMag(), ulKey.get("partita_mag")) && + Objects.equals(x.getGestioneRif(), ulKey.get("gestione_rif")) && + Objects.equals(x.getDataColloRif(), ulKey.get("data_collo_rif")) && + Objects.equals(x.getSerColloRif(), ulKey.get("ser_collo_rif")) && + Objects.equals(x.getNumColloRif(), ulKey.get("num_collo_rif")) + ).collect(Collectors.toUnmodifiableList()); + + ulKey.put("qta_col", matchingUls.stream().map(HistoryVersamentoProdULRestDTO::getQtaCol) + .reduce(BigDecimal.ZERO, BigDecimal::add)); + ulKey.put("num_cnf", matchingUls.stream().map(HistoryVersamentoProdULRestDTO::getNumCnf) + .reduce(BigDecimal.ZERO, BigDecimal::add)); + } ulListGrouped.forEach((key, value) -> { @@ -75,35 +94,35 @@ public class ProdRecuperoMaterialeRESTConsumer extends _BaseRESTConsumer { .collect(Collectors.toUnmodifiableList()); var restData = value.get(0); + var qtaCol = (BigDecimal) key.get("qta_col"); + var numCnf = (BigDecimal) key.get("num_cnf"); - newUlList.add(new HistoryVersamentoProdULDTO() - .setGestione(restData.getGestione()) - .setDataCollo(restData.getDataCollo()) - .setSerCollo(restData.getSerCollo()) - .setNumCollo(restData.getNumCollo()) - .setSegno(restData.getSegno()) - .setCodMart(restData.getCodMart()) - .setCodCol(restData.getCodCol()) - .setCodTagl(restData.getCodTagl()) - .setCodJfas(restData.getCodJfas()) - .setDescrizioneArt(restData.getDescrizioneArt()) - .setDescrizioneFase(restData.getDescrizioneFase()) - .setQtaCol(restData.getQtaCol()) - .setQtaCnf(restData.getQtaCnf()) - .setNumCnf(restData.getNumCnf()) - .setPartitaMag(restData.getPartitaMag()) - .setCodJcom(restData.getCodJcom()) - .setDatetimeRow(restData.getDatetimeRow()) - .setUntMis(restData.getUntMis()) - .setBarcodeUlOut(restData.getBarcodeUlOut()) - .setCodMdepOut(restData.getCodMdepOut()) - .setPosizioneOut(restData.getPosizioneOut()) - .setBarcodeUlIn(restData.getBarcodeUlIn()) - .setCodMdepIn(restData.getCodMdepIn()) - .setPosizioneIn(restData.getPosizioneIn()) - .setOrdini(listaOrdini)); + newUlList.add(new HistoryVersamentoProdULDTO() + .setGestione(restDTO.getGestione()) + .setDataCollo(restDTO.getDataCollo()) + .setSerCollo(restDTO.getSerCollo()) + .setNumCollo(restDTO.getNumCollo()) + .setSegno(restDTO.getSegno()) + .setCodMart(restDTO.getCodMart()) + .setCodCol(restDTO.getCodCol()) + .setCodTagl(restDTO.getCodTagl()) + .setCodJfas(restDTO.getCodJfas()) + .setDescrizioneArt(restDTO.getDescrizioneArt()) + .setDescrizioneFase(restDTO.getDescrizioneFase()) + .setQtaCol(qtaCol) + .setQtaCnf(restDTO.getQtaCnf()) + .setNumCnf(numCnf) + .setPartitaMag(restDTO.getPartitaMag()) + .setCodJcom(restDTO.getCodJcom()) + .setDatetimeRow(restDTO.getDatetimeRow()) + .setUntMis(restDTO.getUntMis()) + .setGestioneRif(restDTO.getGestioneRif()) + .setDataColloRif(restDTO.getDataColloRif()) + .setSerColloRif(restDTO.getSerColloRif()) + .setNumColloRif(restDTO.getNumColloRif()) + .setOrdini(ordineList)); - }); + }); if (!newUlList.isEmpty()) {