modificado los margenes por precio en lugar de por tirada y tipos

This commit is contained in:
2025-10-20 09:37:04 +02:00
parent 1888850a64
commit d3ef954ceb
14 changed files with 275 additions and 331 deletions

View File

@ -18,6 +18,8 @@ import com.imprimelibros.erp.presupuesto.dto.Presupuesto.TipoCubierta;
import com.imprimelibros.erp.presupuesto.dto.Presupuesto.TipoEncuadernacion;
import java.util.Map;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.List;
import java.util.function.Supplier;
@ -34,7 +36,8 @@ public class skApiClient {
private final MargenPresupuestoDao margenPresupuestoDao;
private final MessageSource messageSource;
public skApiClient(AuthService authService, MargenPresupuestoDao margenPresupuestoDao, MessageSource messageSource) {
public skApiClient(AuthService authService, MargenPresupuestoDao margenPresupuestoDao,
MessageSource messageSource) {
this.authService = authService;
this.restTemplate = new RestTemplate();
this.margenPresupuestoDao = margenPresupuestoDao;
@ -80,23 +83,28 @@ public class skApiClient {
data.get("precios"), new TypeReference<List<Double>>() {
});
for (int i = 0; i < tiradas.size(); i++) {
int tirada = tiradas.get(i);
for (int i = 0; i < precios.size(); i++) {
BigDecimal importe = new BigDecimal(precios.get(i));
MargenPresupuesto margen = margenPresupuestoDao.findByTipoAndTirada(
tipoEncuadernacion, tipoCubierta, tirada);
BigDecimal importeTotal = importe.multiply(BigDecimal.valueOf(tiradas.get(i)));
MargenPresupuesto margen = margenPresupuestoDao
.findByImporte(importeTotal).orElse(null);
if (margen != null) {
double margenValue = calcularMargen(
tirada,
margen.getTiradaMin(),
margen.getTiradaMax(),
BigDecimal margenValue = calcularMargen(
importeTotal,
margen.getImporteMin(),
margen.getImporteMax(),
margen.getMargenMax(),
margen.getMargenMin());
double nuevoPrecio = precios.get(i) * (1 + margenValue / 100.0);
precios.set(i, Math.round(nuevoPrecio * 10000.0) / 10000.0); // redondear a 2 decimales
BigDecimal nuevoPrecio = new BigDecimal(precios.get(i)).multiply(BigDecimal.ONE
.add(margenValue.divide(BigDecimal.valueOf(100), RoundingMode.HALF_UP)));
precios.set(i, nuevoPrecio.setScale(4, RoundingMode.HALF_UP).doubleValue()); // redondear
// a 4
// decimales
} else {
System.out.println("No se encontró margen para tirada " + tirada);
System.out.println("No se encontró margen para importe " + importe);
}
}
@ -154,7 +162,8 @@ public class skApiClient {
JsonNode root = mapper.readTree(jsonResponse);
if (root.get("data") == null || !root.get("data").isInt()) {
throw new RuntimeException(messageSource.getMessage("presupuesto.errores.error-interior", new Object[]{1} , locale));
throw new RuntimeException(
messageSource.getMessage("presupuesto.errores.error-interior", new Object[] { 1 }, locale));
}
return root.get("data").asInt();
@ -227,13 +236,15 @@ public class skApiClient {
}
}
private static double calcularMargen(
int tirada, int tiradaMin, int tiradaMax,
double margenMax, double margenMin) {
if (tirada <= tiradaMin)
private static BigDecimal calcularMargen(
BigDecimal importe, BigDecimal importeMin, BigDecimal importeMax,
BigDecimal margenMax, BigDecimal margenMin) {
if (importe.compareTo(importeMin) <= 0)
return margenMax;
if (tirada >= tiradaMax)
if (importe.compareTo(importeMax) >= 0)
return margenMin;
return margenMax - ((double) (tirada - tiradaMin) / (tiradaMax - tiradaMin)) * (margenMax - margenMin);
return margenMax.subtract(margenMax.subtract(margenMin)
.multiply(importe.subtract(importeMin)
.divide(importeMax.subtract(importeMin), RoundingMode.HALF_UP)));
}
}