modificado iva dependiendo de si es reducido o no y del lugar de la entrega

This commit is contained in:
2025-10-14 14:04:21 +02:00
parent 37ae61d6f7
commit 90376e61c8
6 changed files with 47 additions and 33 deletions

View File

@ -2,32 +2,36 @@ package com.imprimelibros.erp.common.web;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.List;
public final class IpUtils {
private IpUtils() {}
private static final List<String> HEADERS = Arrays.asList(
"X-Forwarded-For",
"X-Real-IP",
"CF-Connecting-IP",
"True-Client-IP",
"X-Client-IP",
"X-Forwarded",
"Forwarded-For",
"Forwarded"
);
public class IpUtils {
public static String getClientIp(HttpServletRequest request) {
for (String h : HEADERS) {
String v = request.getHeader(h);
if (v != null && !v.isBlank() && !"unknown".equalsIgnoreCase(v)) {
// X-Forwarded-For puede traer lista: "client, proxy1, proxy2"
String first = v.split(",")[0].trim();
if (!first.isBlank()) return first;
String[] headers = {
"X-Forwarded-For",
"Proxy-Client-IP",
"WL-Proxy-Client-IP",
"HTTP_X_FORWARDED_FOR",
"HTTP_X_FORWARDED",
"HTTP_X_CLUSTER_CLIENT_IP",
"HTTP_CLIENT_IP",
"HTTP_FORWARDED_FOR",
"HTTP_FORWARDED",
"HTTP_VIA",
"REMOTE_ADDR"
};
for (String header : headers) {
String ip = request.getHeader(header);
if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
// Si hay varios (X-Forwarded-For), toma el primero
return ip.split(",")[0];
}
}
return request.getRemoteAddr();
// Fallback
String ip = request.getRemoteAddr();
if ("0:0:0:0:0:0:0:1".equals(ip) || "::1".equals(ip)) {
return "127.0.0.1";
}
return ip;
}
}

View File

@ -51,6 +51,7 @@ import com.imprimelibros.erp.users.UserDao;
import com.imprimelibros.erp.users.UserDetailsImpl;
import com.imprimelibros.erp.presupuesto.service.PresupuestoFormDataMapper;
import com.imprimelibros.erp.presupuesto.service.PresupuestoFormDataMapper.PresupuestoFormDataDto;
import com.imprimelibros.erp.common.web.IpUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.ConstraintViolation;
@ -482,7 +483,7 @@ public class PresupuestoController {
List<Map<String, Object>> serviciosList = (List<Map<String, Object>>) body.getOrDefault("servicios", List.of());
String sessionId = request.getSession(true).getId();
String ip = request.getRemoteAddr();
String ip = IpUtils.getClientIp(request);
var resumen = presupuestoService.getResumen(p, serviciosList, save, mode, locale, sessionId, ip);

View File

@ -4,6 +4,7 @@ import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import com.imprimelibros.erp.presupuesto.validation.ConsistentTiradas;
import com.imprimelibros.erp.presupuesto.validation.PaginasCosido;
import com.imprimelibros.erp.presupuesto.validation.Par;
import com.imprimelibros.erp.presupuesto.validation.PresupuestoValidationGroups;
import com.imprimelibros.erp.presupuesto.validation.Tamanio;
@ -22,6 +23,7 @@ import java.math.BigDecimal;
import com.imprimelibros.erp.users.User;
@ConsistentTiradas(groups = PresupuestoValidationGroups.DatosGenerales.class)
@PaginasCosido(groups = PresupuestoValidationGroups.DatosGenerales.class)
@Tamanio(groups = PresupuestoValidationGroups.DatosGenerales.class)
@EntityListeners(AuditingEntityListener.class)
@Entity

View File

@ -24,6 +24,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import java.math.BigDecimal;
import java.math.RoundingMode;
import com.imprimelibros.erp.common.web.IpUtils;
import com.imprimelibros.erp.configurationERP.VariableService;
import com.imprimelibros.erp.presupuesto.GeoIpService;
import com.imprimelibros.erp.presupuesto.PresupuestoRepository;
@ -845,6 +846,8 @@ public class PresupuestoService {
if (mode.equals("public")) {
presupuesto = getDatosLocalizacion(presupuesto, sessionId, ip);
presupuesto.setOrigen(Presupuesto.Origen.publico);
presupuesto = this.getDatosLocalizacion(presupuesto, sessionId, ip);
} else
presupuesto.setOrigen(Presupuesto.Origen.privado);
@ -962,8 +965,10 @@ public class PresupuestoService {
BigDecimal precioTotalTirada = BigDecimal.valueOf(precioUnit)
.multiply(BigDecimal.valueOf(cantidad))
.setScale(2, RoundingMode.HALF_UP);
if( hayDepositoLegal ){
precioTotalTirada = precioTotalTirada.add(BigDecimal.valueOf(precioUnit).multiply(BigDecimal.valueOf(4))).setScale(6, RoundingMode.HALF_UP);
if (hayDepositoLegal) {
precioTotalTirada = precioTotalTirada
.add(BigDecimal.valueOf(precioUnit).multiply(BigDecimal.valueOf(4)))
.setScale(6, RoundingMode.HALF_UP);
}
// servicios_total
@ -1020,7 +1025,7 @@ public class PresupuestoService {
// Si la entrega es en peninsula, se mira el valor del iva
// Canarias y paises UE no llevan IVA
if (presupuesto.getEntregaTipo() == Presupuesto.Entrega.peninsula){
if (presupuesto.getEntregaTipo() == Presupuesto.Entrega.peninsula) {
// Si el iva es reducido, el precio de la tirada y el del prototipo llevan IVA
// 4%
if (presupuesto.getIvaReducido()) {
@ -1035,7 +1040,7 @@ public class PresupuestoService {
BigDecimal.valueOf(100), 2,
RoundingMode.HALF_UP);
}
}
}
baseImponible = baseImponible.add(serviciosTotal);
BigDecimal totalConIva = baseImponible.add(ivaImporte21).add(ivaImporte4);
@ -1120,7 +1125,7 @@ public class PresupuestoService {
if (mode.equals("public")) {
presupuesto.setOrigen(Presupuesto.Origen.publico);
String sessionId = request.getSession(true).getId();
String ip = request.getRemoteAddr();
String ip = IpUtils.getClientIp(request);
presupuesto = this.getDatosLocalizacion(presupuesto, sessionId, ip);
if (id != null) {
@ -1178,6 +1183,7 @@ public class PresupuestoService {
return true;
}
// =======================================================================
// Métodos privados
// =======================================================================