Merge branch 'develop' into feature/RefactoringGestioneColli

# Conflicts:
#	app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeModule.java
#	app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeViewModel.java
#	app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/rest/ProdRecuperoMaterialeRESTConsumer.java
#	app/src/main/res/layout/fragment_prod_recupero_materiale.xml
This commit is contained in:
2025-09-17 15:14:00 +02:00
5 changed files with 105 additions and 120 deletions

View File

@@ -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());
}

View File

@@ -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));

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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<String, Object> 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,33 +94,33 @@ 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));
.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));
});