falta actualizar bien el resumen

This commit is contained in:
2025-10-30 19:48:26 +01:00
parent feff9ee94a
commit 167c136dca
28 changed files with 518 additions and 342 deletions

View File

@ -1,6 +1,6 @@
package com.imprimelibros.erp.cart;
import jakarta.transaction.Transactional;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Service;
@ -10,9 +10,12 @@ import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import com.imprimelibros.erp.presupuesto.classes.PresupuestoFormatter;
import com.imprimelibros.erp.presupuesto.dto.Presupuesto;
import com.imprimelibros.erp.cart.dto.DireccionCardDTO;
import com.imprimelibros.erp.cart.dto.DireccionShipment;
import com.imprimelibros.erp.cart.dto.UpdateCartRequest;
import com.imprimelibros.erp.common.Utils;
import com.imprimelibros.erp.direcciones.DireccionService;
@ -68,9 +71,7 @@ public class CartService {
List<CartItem> items = itemRepo.findByCartId(cart.getId());
for (CartItem item : items) {
Presupuesto p = presupuestoRepo.findById(item.getPresupuestoId())
.orElseThrow(
() -> new IllegalStateException("Presupuesto no encontrado: " + item.getPresupuestoId()));
Presupuesto p = item.getPresupuesto();
Map<String, Object> elemento = getElementoCart(p, locale);
elemento.put("cartItemId", item.getId());
@ -88,7 +89,8 @@ public class CartService {
if (!exists) {
CartItem ci = new CartItem();
ci.setCart(cart);
ci.setPresupuestoId(presupuestoId);
ci.setPresupuesto(presupuestoRepo.findById(presupuestoId)
.orElseThrow(() -> new IllegalArgumentException("Presupuesto no encontrado")));
itemRepo.save(ci);
}
}
@ -165,58 +167,140 @@ public class CartService {
}
public Map<String, Object> getCartSummary(Cart cart, Locale locale) {
double base = 0.0;
double iva4 = 0.0;
double iva21 = 0.0;
double shipment = 0.0;
Boolean errorShipementCost = false;
List<CartItem> items = cart.getItems();
List<CartDireccion> direcciones = cart.getDirecciones();
for (CartItem item : items) {
Presupuesto p = presupuestoRepo.findById(item.getPresupuestoId())
.orElseThrow(() -> new IllegalStateException("Presupuesto no encontrado: " + item.getPresupuestoId()));
Presupuesto p = item.getPresupuesto();
base += p.getBaseImponible().doubleValue();
iva4 += p.getIvaImporte4().doubleValue();
iva21 += p.getIvaImporte21().doubleValue();
if(cart.getOnlyOneShipment() != null && cart.getOnlyOneShipment()) {
if (cart.getOnlyOneShipment() != null && cart.getOnlyOneShipment()) {
// Si es envío único, que es a españa y no ha canarias
if(direcciones != null && direcciones.size() > 0) {
if (direcciones != null && direcciones.size() > 0) {
CartDireccion cd = direcciones.get(0);
Boolean freeShipment = direccionService.checkFreeShipment(cd.getDireccion().getCp(), cd.getDireccion().getPaisCode3()) && !cd.getIsPalets();
if(!freeShipment) {
Map<String, Object> data =
Map.of(
"cp", cd.getDireccion().getCp(),
"pais_code3", cd.getDireccion().getPaisCode3(),
"peso", p.getPeso() != null ? p.getPeso() : 0,
"unidades", cd.getUnidades(),
"palets", cd.getIsPalets() ? 1 : 0
);
var shipmentCost = skApiClient.getCosteEnvio(data, locale);
Boolean freeShipment = direccionService.checkFreeShipment(cd.getDireccion().getCp(),
cd.getDireccion().getPaisCode3()) && !cd.getIsPalets();
if (!freeShipment) {
try {
Map<String, Object> data = Map.of(
"cp", cd.getDireccion().getCp(),
"pais_code3", cd.getDireccion().getPaisCode3(),
"peso", p.getPeso() != null ? p.getPeso() : 0,
"unidades", p.getSelectedTirada(),
"palets", cd.getIsPalets() ? 1 : 0);
var shipmentCost = skApiClient.getCosteEnvio(data, locale);
if (shipmentCost != null && shipmentCost.get("data") != null) {
shipment += (Double) shipmentCost.get("data");
iva21 += ((Double) shipmentCost.get("data")) * 0.21;
} else {
errorShipementCost = true;
}
} catch (Exception e) {
errorShipementCost = true;
}
}
// si tiene prueba de envio, hay que añadir el coste
if (p.getServiciosJson() != null && p.getServiciosJson().contains("ejemplar-prueba")) {
try {
Map<String, Object> data = Map.of(
"cp", cd.getDireccion().getCp(),
"pais_code3", cd.getDireccion().getPaisCode3(),
"peso", p.getPeso() != null ? p.getPeso() : 0,
"unidades", 1,
"palets", cd.getIsPalets() ? 1 : 0);
var shipmentCost = skApiClient.getCosteEnvio(data, locale);
if (shipmentCost != null && shipmentCost.get("data") != null) {
shipment += (Double) shipmentCost.get("data");
iva21 += ((Double) shipmentCost.get("data")) * 0.21;
} else {
errorShipementCost = true;
}
} catch (Exception e) {
errorShipementCost = true;
}
}
}
}
}
double total = base + iva4 + iva21;
double total = base + iva4 + iva21 + shipment;
Map<String, Object> summary = new HashMap<>();
summary.put("base", Utils.formatCurrency(base, locale));
summary.put("iva4", Utils.formatCurrency(iva4, locale));
summary.put("iva21", Utils.formatCurrency(iva21, locale));
summary.put("shipment", Utils.formatCurrency(shipment, locale));
summary.put("total", Utils.formatCurrency(total, locale));
summary.put("errorShipmentCost", errorShipementCost);
return summary;
}
@Transactional(readOnly = true)
public Map<String, Object> getCartDirecciones(Long cartId, Locale locale) {
Cart cart = cartRepo.findByIdFetchAll(cartId)
.orElseThrow(() -> new IllegalArgumentException("Carrito no encontrado"));
Map<String, Object> result = new HashMap<>();
List<CartDireccion> direcciones = cart.getDirecciones();
if (cart.getOnlyOneShipment() && !direcciones.isEmpty()) {
result.put("mainDir", direcciones.get(0).toDireccionCard(messageSource, locale));
} else {
List<DireccionCardDTO> dirCards = cart.getDirecciones().stream()
.filter(Objects::nonNull)
.map(cd -> cd.toDireccionCard(messageSource, locale))
.filter(Objects::nonNull)
.toList();
result.put("direcciones", dirCards);
}
return result;
}
@Transactional
public Boolean updateCart(Long cartId, UpdateCartRequest request) {
try{
Cart cart = cartRepo.findById(cartId).orElseThrow(() -> new IllegalArgumentException("Carrito no encontrado"));
try {
Cart cart = cartRepo.findById(cartId)
.orElseThrow(() -> new IllegalArgumentException("Carrito no encontrado"));
cart.setOnlyOneShipment(request.isOnlyOneShipment());
// Borramos todas las direcciones actuales de la bbdd
// Opcional (limpieza): romper backref antes de clear
for (CartDireccion d : cart.getDirecciones()) {
d.setCart(null);
}
cart.getDirecciones().clear();
// Guardamos las direcciones
List<DireccionShipment> direcciones = request.getDirecciones();
if (direcciones != null && direcciones.size() > 0) {
for (DireccionShipment dir : direcciones) {
// Crear una nueva CartDireccion por cada item
CartDireccion cd = new CartDireccion();
cd.setCart(cart);
cd.setDireccion(dir.getId() != null ? direccionService.findById(dir.getId())
.orElseThrow(() -> new IllegalArgumentException("Dirección no encontrada")) : null);
cd.setIsPalets(dir.getIsPalets() != null ? dir.getIsPalets() : false);
cd.setUnidades(dir.getUnidades() != null ? dir.getUnidades() : null);
if (dir.getPresupuestoId() != null) {
Presupuesto p = presupuestoRepo.findById(dir.getPresupuestoId())
.orElse(null);
cd.setPresupuesto(p);
}
cart.addDireccion(cd);
}
} else {
}
cartRepo.save(cart);
return true;
} catch (Exception e) {