trabajando en la vista de peiddos

This commit is contained in:
2025-11-17 22:52:35 +01:00
parent 6ff5250d1b
commit 997741c3c9
17 changed files with 4119 additions and 34 deletions

View File

@ -298,7 +298,7 @@ public class CartService {
}
double totalBeforeDiscount = base + iva4 + iva21 + shipment;
int fidelizacion = pedidoService.getDescuentoFidelizacion();
int fidelizacion = pedidoService.getDescuentoFidelizacion(cart.getUserId());
double descuento = totalBeforeDiscount * fidelizacion / 100.0;
double total = totalBeforeDiscount - descuento;

View File

@ -1,9 +1,23 @@
package com.imprimelibros.erp.pedidos;
import java.time.LocalDateTime;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface PedidoRepository extends JpaRepository<Pedido, Long>, JpaSpecificationExecutor<Pedido> {
// Suma de "total" para un "createdBy" desde una fecha dada
@Query("""
SELECT COALESCE(SUM(p.total), 0)
FROM Pedido p
WHERE p.createdBy.id = :userId
AND p.createdAt >= :afterDate
""")
Double sumTotalByCreatedByAndCreatedAtAfter(@Param("userId") Long userId,
@Param("afterDate") LocalDateTime afterDate);
}

View File

@ -9,11 +9,14 @@ import java.util.Map;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.imprimelibros.erp.common.Utils;
import com.imprimelibros.erp.direcciones.Direccion;
import com.imprimelibros.erp.presupuesto.PresupuestoRepository;
import com.imprimelibros.erp.presupuesto.dto.Presupuesto;
import com.imprimelibros.erp.presupuesto.service.PresupuestoService;
import com.imprimelibros.erp.users.UserService;
import com.imprimelibros.erp.direcciones.DireccionService;
import com.imprimelibros.erp.pedidos.PedidoLinea.Estado;
@Service
public class PedidoService {
@ -24,22 +27,25 @@ public class PedidoService {
private final PedidoDireccionRepository pedidoDireccionRepository;
private final DireccionService direccionService;
private final UserService userService;
private final PresupuestoService presupuestoService;
public PedidoService(PedidoRepository pedidoRepository, PedidoLineaRepository pedidoLineaRepository,
PresupuestoRepository presupuestoRepository, PedidoDireccionRepository pedidoDireccionRepository,
DireccionService direccionService, UserService userService) {
DireccionService direccionService, UserService userService, PresupuestoService presupuestoService) {
this.pedidoRepository = pedidoRepository;
this.pedidoLineaRepository = pedidoLineaRepository;
this.presupuestoRepository = presupuestoRepository;
this.pedidoDireccionRepository = pedidoDireccionRepository;
this.direccionService = direccionService;
this.userService = userService;
this.presupuestoService = presupuestoService;
}
public int getDescuentoFidelizacion() {
public int getDescuentoFidelizacion(Long userId) {
// descuento entre el 1% y el 6% para clientes fidelidad (mas de 1500€ en el
// ultimo año)
double totalGastado = 1600.0; // Ejemplo, deberías obtenerlo del historial del cliente
LocalDateTime haceUnAno = LocalDateTime.now().minusYears(1);
double totalGastado = pedidoRepository.sumTotalByCreatedByAndCreatedAtAfter(userId, haceUnAno);
if (totalGastado < 1200) {
return 0;
} else if (totalGastado >= 1200 && totalGastado < 1999) {
@ -106,7 +112,7 @@ public class PedidoService {
linea.setPresupuesto(presupuesto);
linea.setCreatedBy(userId);
linea.setCreatedAt(LocalDateTime.now());
linea.setEstado(PedidoLinea.Estado.aprobado);
linea.setEstado(getEstadoInicial(presupuesto));
linea.setEstadoManual(false);
pedidoLineaRepository.save(linea);
@ -226,4 +232,13 @@ public class PedidoService {
}
private Estado getEstadoInicial(Presupuesto p){
if(presupuestoService.hasMaquetacion(p)){
return Estado.maquetacion;
} else {
return Estado.haciendo_ferro;
}
}
}

View File

@ -65,7 +65,6 @@ public class PedidosController {
List<String> searchable = List.of(
"id"
// "client" no, porque lo calculas a posteriori
);
// Campos ordenables
@ -78,7 +77,7 @@ public class PedidosController {
Specification<Pedido> base = (root, query, cb) -> cb.conjunction();
if (!isAdmin) {
base = base.and((root, query, cb) -> cb.equal(root.get("userId"), currentUserId));
base = base.and((root, query, cb) -> cb.equal(root.get("createdBy").get("id"), currentUserId));
}
String clientSearch = dt.getColumnSearch("cliente");
String estadoSearch = dt.getColumnSearch("estado");

View File

@ -388,7 +388,7 @@ public class Presupuesto extends AbstractAuditedEntity implements Cloneable {
private Long proveedorRef2;
@Column(name = "is_reimpresion", nullable = false)
private Boolean isReimpresion;
private Boolean isReimpresion = false;
// ====== MÉTODOS AUX ======

View File

@ -1143,6 +1143,7 @@ public class PresupuestoService {
if(presupuesto.getSelectedTirada() != null && presupuesto.getSelectedTirada().equals(tirada))
presupuesto.setServiciosJson(new ObjectMapper().writeValueAsString(servicios));
} catch (Exception ignore) {
System.out.println("Error guardando servicios JSON: " + ignore.getMessage());
}
}
@ -1310,6 +1311,15 @@ public class PresupuestoService {
}
return true;
}
public Boolean hasMaquetacion(Presupuesto presupuesto) {
if (presupuesto.getServiciosJson() != null && !presupuesto.getServiciosJson().isEmpty()) {
if(presupuesto.getServiciosJson().contains("maquetacion")) {
return true;
}
}
return false;
}
// =======================================================================
// Métodos privados