mirror of
https://git.imnavajas.es/jjimenez/erp-imprimelibros.git
synced 2026-01-13 00:48:49 +00:00
falta actualizar bien el resumen
This commit is contained in:
@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user