mirror of
https://git.imnavajas.es/jjimenez/erp-imprimelibros.git
synced 2026-01-13 08:58:48 +00:00
sistema de pedidos pendientes de pago hechos
This commit is contained in:
@ -22,6 +22,7 @@ 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.externalApi.skApiClient;
|
||||
import com.imprimelibros.erp.pedidos.PedidoLinea.Estado;
|
||||
|
||||
@Service
|
||||
@ -35,10 +36,13 @@ public class PedidoService {
|
||||
private final UserService userService;
|
||||
private final PresupuestoService presupuestoService;
|
||||
private final CartService cartService;
|
||||
private final skApiClient skApiClient;
|
||||
private final PresupuestoRepository presupuestoRepo;
|
||||
|
||||
public PedidoService(PedidoRepository pedidoRepository, PedidoLineaRepository pedidoLineaRepository,
|
||||
PresupuestoRepository presupuestoRepository, PedidoDireccionRepository pedidoDireccionRepository,
|
||||
DireccionService direccionService, UserService userService, PresupuestoService presupuestoService, CartService cartService) {
|
||||
DireccionService direccionService, UserService userService, PresupuestoService presupuestoService,
|
||||
CartService cartService, skApiClient skApiClient, PresupuestoRepository presupuestoRepo) {
|
||||
this.pedidoRepository = pedidoRepository;
|
||||
this.pedidoLineaRepository = pedidoLineaRepository;
|
||||
this.presupuestoRepository = presupuestoRepository;
|
||||
@ -47,9 +51,10 @@ public class PedidoService {
|
||||
this.userService = userService;
|
||||
this.presupuestoService = presupuestoService;
|
||||
this.cartService = cartService;
|
||||
this.skApiClient = skApiClient;
|
||||
this.presupuestoRepo = presupuestoRepo;
|
||||
}
|
||||
|
||||
|
||||
@Transactional
|
||||
public Pedido crearPedido(
|
||||
Long cartId,
|
||||
@ -71,7 +76,7 @@ public class PedidoService {
|
||||
pedido.setTotal((Double) cartSummaryRaw.getOrDefault("total", 0.0d));
|
||||
|
||||
// Proveedor
|
||||
if(proveedor != null && proveedorRef != null) {
|
||||
if (proveedor != null && proveedorRef != null) {
|
||||
pedido.setProveedor(proveedor);
|
||||
pedido.setProveedorRef(proveedorRef);
|
||||
}
|
||||
@ -89,7 +94,7 @@ public class PedidoService {
|
||||
|
||||
List<CartItem> items = cart.getItems();
|
||||
|
||||
for (Integer i = 0; i < items.size(); i++) {
|
||||
for (Integer i = 0; i < items.size(); i++) {
|
||||
CartItem item = items.get(i);
|
||||
Presupuesto pCart = item.getPresupuesto();
|
||||
|
||||
@ -110,43 +115,16 @@ public class PedidoService {
|
||||
|
||||
// Guardar las direcciones asociadas a la línea del pedido
|
||||
Map<String, Object> direcciones_presupuesto = this.getDireccionesPresupuesto(cart, p);
|
||||
saveDireccionesPedidoLinea(direcciones_presupuesto, pedidoGuardado, linea, direccionFacturacionId);
|
||||
saveDireccionesPedidoLinea(direcciones_presupuesto, pedidoGuardado, linea, direccionFacturacionId);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
// Crear líneas del pedido
|
||||
for (Long presupuestoId : presupuestoIds) {
|
||||
Presupuesto presupuesto = presupuestoRepository.getReferenceById(presupuestoId);
|
||||
|
||||
PedidoLinea linea = new PedidoLinea();
|
||||
linea.setPedido(saved);
|
||||
linea.setPresupuesto(presupuesto);
|
||||
linea.setCreatedBy(userId);
|
||||
linea.setCreatedAt(LocalDateTime.now());
|
||||
if(estadoInicial != null){
|
||||
linea.setEstado(estadoInicial);
|
||||
} else {
|
||||
linea.setEstado(getEstadoInicial(presupuesto));
|
||||
}
|
||||
linea.setEstadoManual(false);
|
||||
pedidoLineaRepository.save(linea);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, Map<String, Object>> direcciones = (Map<String, Map<String, Object>>) presupuestoDirecciones
|
||||
.get(presupuesto.getId().toString());
|
||||
if (direcciones != null) {
|
||||
saveDireccionesPedidoLinea(direcciones, saved, linea, direccionFacturacionId);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
return pedidoGuardado;
|
||||
}
|
||||
|
||||
public Boolean markPedidoAsProcesingPayment(Long pedidoId){
|
||||
public Boolean markPedidoAsProcesingPayment(Long pedidoId) {
|
||||
Pedido pedido = pedidoRepository.findById(pedidoId).orElse(null);
|
||||
if(pedido == null){
|
||||
if (pedido == null) {
|
||||
return false;
|
||||
}
|
||||
List<PedidoLinea> lineas = pedidoLineaRepository.findByPedidoId(pedidoId);
|
||||
@ -158,10 +136,9 @@ public class PedidoService {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public Boolean markPedidoAsPaymentDenied(Long pedidoId){
|
||||
public Boolean markPedidoAsPaymentDenied(Long pedidoId) {
|
||||
Pedido pedido = pedidoRepository.findById(pedidoId).orElse(null);
|
||||
if(pedido == null){
|
||||
if (pedido == null) {
|
||||
return false;
|
||||
}
|
||||
List<PedidoLinea> lineas = pedidoLineaRepository.findByPedidoId(pedidoId);
|
||||
@ -173,142 +150,12 @@ public class PedidoService {
|
||||
return true;
|
||||
}
|
||||
|
||||
public Boolean markPedidoAsPaid(Long pedidoId){
|
||||
Pedido pedido = pedidoRepository.findById(pedidoId).orElse(null);
|
||||
if(pedido == null){
|
||||
return false;
|
||||
}
|
||||
List<PedidoLinea> lineas = pedidoLineaRepository.findByPedidoId(pedidoId);
|
||||
for (PedidoLinea linea : lineas) {
|
||||
linea.setEstado(this.getEstadoInicial(linea.getPresupuesto()));
|
||||
pedidoLineaRepository.save(linea);
|
||||
|
||||
// Save presupuesto in SK
|
||||
}
|
||||
|
||||
// Save pedido in SK
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public Pedido findById(Long pedidoId){
|
||||
public Pedido findById(Long pedidoId) {
|
||||
return pedidoRepository.findById(pedidoId).orElse(null);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@Transactional
|
||||
public Long crearPedido(Long cartId, Long dirFactId, Locale locale) {
|
||||
|
||||
return crearPedido(cartId, dirFactId, locale, null);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Transactional
|
||||
// Crear pedido interno (no en el proveedor) a partir del carrito
|
||||
public Long crearPedido(Long cartId, Long dirFactId, Locale locale, PedidoLinea.Estado estadoInicial) {
|
||||
|
||||
Cart cart = cartService.getCartById(cartId);
|
||||
List<CartItem> items = cart.getItems();
|
||||
|
||||
List<Map<String, Object>> presupuestoRequests = new ArrayList<>();
|
||||
Map<String, Object> presupuestoDireccionesRequest = new HashMap<>();
|
||||
List<Long> presupuestoIds = new ArrayList<>();
|
||||
|
||||
for (Integer i = 0; i < items.size(); i++) {
|
||||
CartItem item = items.get(i);
|
||||
Presupuesto pCart = item.getPresupuesto();
|
||||
|
||||
// Asegurarnos de trabajar con la entidad gestionada por JPA
|
||||
Presupuesto p = presupuestoRepository.findById(pCart.getId())
|
||||
.orElseThrow(() -> new IllegalStateException("Presupuesto no encontrado: " + pCart.getId()));
|
||||
|
||||
/*Map<String, Object> data_to_send = presupuestoService.toSkApiRequest(p, true);
|
||||
data_to_send.put("createPedido", 0);
|
||||
|
||||
// Recuperar el mapa anidado datosCabecera
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, Object> datosCabecera = (Map<String, Object>) data_to_send.get("datosCabecera");
|
||||
if (datosCabecera != null) {
|
||||
Object tituloOriginal = datosCabecera.get("titulo");
|
||||
datosCabecera.put(
|
||||
"titulo",
|
||||
"[" + (i + 1) + "/" + items.size() + "] " + (tituloOriginal != null ? tituloOriginal : ""));
|
||||
}
|
||||
|
||||
Map<String, Object> direcciones_presupuesto = this.getDireccionesPresupuesto(cart, p);
|
||||
data_to_send.put("direcciones", direcciones_presupuesto.get("direcciones"));
|
||||
data_to_send.put("direccionesFP1", direcciones_presupuesto.get("direccionesFP1"));
|
||||
|
||||
presupuestoDireccionesRequest.put(p.getId().toString(), direcciones_presupuesto);
|
||||
|
||||
|
||||
Map<String, Object> result = skApiClient.savePresupuesto(data_to_send);
|
||||
|
||||
if (result.containsKey("error")) {
|
||||
System.out.println("Error al guardar presupuesto en SK");
|
||||
System.out.println("-------------------------");
|
||||
System.out.println(result.get("error"));
|
||||
// decide si seguir con otros items o abortar:
|
||||
// continue; o bien throw ...
|
||||
continue;
|
||||
}
|
||||
|
||||
Object dataObj = result.get("data");
|
||||
if (!(dataObj instanceof Map<?, ?> dataRaw)) {
|
||||
System.out.println("Formato inesperado de 'data' en savePresupuesto: " + result);
|
||||
continue;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, Object> dataMap = (Map<String, Object>) dataRaw;
|
||||
Long presId = ((Number) dataMap.get("id")).longValue();
|
||||
String skin = ((String) dataMap.get("iskn")).toString();
|
||||
p.setProveedor("Safekat");
|
||||
p.setProveedorRef1(skin);
|
||||
p.setProveedorRef2(presId);
|
||||
p.setEstado(Presupuesto.Estado.aceptado);
|
||||
presupuestoRepo.save(p);
|
||||
|
||||
presupuestoIds.add(p.getId());
|
||||
|
||||
presupuestoRequests.add(dataMap);
|
||||
}
|
||||
|
||||
// Crear el pedido en base a los presupuestos guardados
|
||||
if (presupuestoRequests.isEmpty()) {
|
||||
throw new IllegalStateException("No se pudieron guardar los presupuestos en SK.");
|
||||
} else {
|
||||
ArrayList<Long> presupuestoSkIds = new ArrayList<>();
|
||||
for (Map<String, Object> presData : presupuestoRequests) {
|
||||
Long presId = ((Number) presData.get("id")).longValue();
|
||||
presupuestoSkIds.add(presId);
|
||||
}
|
||||
Map<String, Object> ids = new HashMap<>();
|
||||
ids.put("presupuesto_ids", presupuestoSkIds);
|
||||
Long pedidoId = skApiClient.crearPedido(ids);
|
||||
if (pedidoId == null) {
|
||||
throw new IllegalStateException("No se pudo crear el pedido en SK.");
|
||||
}
|
||||
Pedido pedidoInterno = pedidoService.crearPedido(
|
||||
presupuestoIds,
|
||||
presupuestoDireccionesRequest,
|
||||
dirFactId,
|
||||
this.getCartSummaryRaw(cart, locale),
|
||||
"Safekat",
|
||||
String.valueOf(pedidoId),
|
||||
cart.getUserId(),
|
||||
estadoInicial);
|
||||
|
||||
return pedidoInterno.getId();
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
/** Lista de los items del pedido preparados para la vista*/
|
||||
/** Lista de los items del pedido preparados para la vista */
|
||||
@Transactional
|
||||
public List<Map<String, Object>> getLineas(Long pedidoId, Locale locale) {
|
||||
Pedido p = pedidoRepository.findById(pedidoId).orElse(null);
|
||||
@ -323,8 +170,8 @@ public class PedidoService {
|
||||
Presupuesto presupuesto = item.getPresupuesto();
|
||||
Map<String, Object> elemento = presupuestoService.getPresupuestoInfoForCard(presupuesto, locale);
|
||||
elemento.put("estado", item.getEstado());
|
||||
elemento.put("fechaEntrega", item.getFechaEntrega() != null ?
|
||||
Utils.formatDate(item.getFechaEntrega(), locale) : "");
|
||||
elemento.put("fechaEntrega",
|
||||
item.getFechaEntrega() != null ? Utils.formatDate(item.getFechaEntrega(), locale) : "");
|
||||
elemento.put("lineaId", item.getId());
|
||||
resultados.add(elemento);
|
||||
}
|
||||
@ -345,19 +192,127 @@ public class PedidoService {
|
||||
return false;
|
||||
}
|
||||
List<PedidoLinea> lineas = pedidoLineaRepository.findByPedidoId(pedidoId);
|
||||
List<Map<String, Object>> referenciasProveedor = new ArrayList<>();
|
||||
Integer total = lineas.size();
|
||||
Integer counter = 1;
|
||||
for (PedidoLinea linea : lineas) {
|
||||
if (linea.getEstado() == Estado.pendiente_pago) {
|
||||
if (linea.getEstado() == Estado.pendiente_pago
|
||||
|| linea.getEstado() == Estado.denegado_pago) {
|
||||
|
||||
Presupuesto presupuesto = linea.getPresupuesto();
|
||||
linea.setEstado(getEstadoInicial(presupuesto));
|
||||
pedidoLineaRepository.save(linea);
|
||||
|
||||
// Save presupuesto in SK
|
||||
Map<String, Object> result = savePresupuestoSK(linea.getId(), presupuesto, counter, total);
|
||||
if (result == null) {
|
||||
return false;
|
||||
}
|
||||
referenciasProveedor.add(result);
|
||||
counter++;
|
||||
}
|
||||
}
|
||||
|
||||
if (referenciasProveedor.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Save pedido in SK
|
||||
ArrayList<Long> presupuestoSkIds = new ArrayList<>();
|
||||
for (Map<String, Object> presData : referenciasProveedor) {
|
||||
Long presId = ((Number) presData.get("id")).longValue();
|
||||
presupuestoSkIds.add(presId);
|
||||
}
|
||||
|
||||
Map<String, Object> ids = new HashMap<>();
|
||||
ids.put("presupuesto_ids", presupuestoSkIds);
|
||||
Long skPedidoId = skApiClient.crearPedido(ids);
|
||||
if (skPedidoId == null) {
|
||||
System.out.println("No se pudo crear el pedido en SK.");
|
||||
return false;
|
||||
}
|
||||
pedido.setProveedor("Safekat");
|
||||
pedido.setProveedorRef(skPedidoId.toString());
|
||||
pedidoRepository.save(pedido);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/***************************
|
||||
* MÉTODOS PRIVADOS
|
||||
***************************/
|
||||
@Transactional
|
||||
private Map<String, Object> savePresupuestoSK(Long pedidoLineaId, Presupuesto presupuesto, Integer counter, Integer total) {
|
||||
|
||||
Map<String, Object> data_to_send = presupuestoService.toSkApiRequest(presupuesto, true);
|
||||
data_to_send.put("createPedido", 0);
|
||||
|
||||
// Recuperar el mapa anidado datosCabecera
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, Object> datosCabecera = (Map<String, Object>) data_to_send.get("datosCabecera");
|
||||
if (datosCabecera != null) {
|
||||
Object tituloOriginal = datosCabecera.get("titulo");
|
||||
datosCabecera.put(
|
||||
"titulo",
|
||||
"[" + (counter) + "/" + total + "] " + (tituloOriginal != null ? tituloOriginal : ""));
|
||||
}
|
||||
|
||||
List<PedidoDireccion> direccionesPedidoLinea = pedidoDireccionRepository
|
||||
.findByPedidoLineaId(pedidoLineaId);
|
||||
List<Map<String, Object>> direccionesPresupuesto = new ArrayList<>();
|
||||
List<Map<String, Object>> direccionEjemplarPrueba = new ArrayList<>();
|
||||
|
||||
for (PedidoDireccion pd : direccionesPedidoLinea) {
|
||||
if (pd.isEjemplarPrueba()) {
|
||||
direccionEjemplarPrueba.add(
|
||||
pd.toSkMap(presupuesto.getPeso()));
|
||||
} else {
|
||||
direccionesPresupuesto.add(
|
||||
pd.toSkMap(presupuesto.getPeso() * pd.getUnidades()));
|
||||
}
|
||||
|
||||
}
|
||||
if (presupuesto.getServiciosJson() != null && presupuesto.getServiciosJson().contains("deposito-legal")) {
|
||||
direccionesPresupuesto.add(
|
||||
PedidoDireccion.toSkMapDepositoLegal());
|
||||
}
|
||||
data_to_send.put("direcciones", direccionesPresupuesto);
|
||||
if (direccionEjemplarPrueba.size() > 0)
|
||||
data_to_send.put("direccionesFP1", direccionEjemplarPrueba.get(0));
|
||||
else {
|
||||
data_to_send.put("direccionesFP1", new ArrayList<>());
|
||||
}
|
||||
|
||||
Map<String, Object> result = skApiClient.savePresupuesto(data_to_send);
|
||||
|
||||
if (result.containsKey("error")) {
|
||||
System.out.println("Error al guardar presupuesto en SK");
|
||||
System.out.println("-------------------------");
|
||||
System.out.println(result.get("error"));
|
||||
// decide si seguir con otros items o abortar:
|
||||
// continue; o bien throw ...
|
||||
return null;
|
||||
}
|
||||
|
||||
Object dataObj = result.get("data");
|
||||
if (!(dataObj instanceof Map<?, ?> dataRaw)) {
|
||||
System.out.println("Formato inesperado de 'data' en savePresupuesto: " + result);
|
||||
return null;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, Object> dataMap = (Map<String, Object>) dataRaw;
|
||||
Long presId = ((Number) dataMap.get("id")).longValue();
|
||||
String skin = ((String) dataMap.get("iskn")).toString();
|
||||
presupuesto.setProveedor("Safekat");
|
||||
presupuesto.setProveedorRef1(skin);
|
||||
presupuesto.setProveedorRef2(presId);
|
||||
presupuesto.setEstado(Presupuesto.Estado.aceptado);
|
||||
presupuestoRepo.save(presupuesto);
|
||||
|
||||
return dataMap;
|
||||
}
|
||||
|
||||
// Obtener las direcciones de envío asociadas a un presupuesto en el carrito
|
||||
private Map<String, Object> getDireccionesPresupuesto(Cart cart, Presupuesto presupuesto) {
|
||||
|
||||
@ -373,10 +328,9 @@ public class PedidoService {
|
||||
presupuesto.getPeso(),
|
||||
direcciones.get(0).getIsPalets(),
|
||||
false));
|
||||
|
||||
|
||||
direccionesPresupuesto.add(direcciones.get(0).toSkMapDepositoLegal());
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
direccionesPresupuesto.add(direcciones.get(0).toSkMap(
|
||||
presupuesto.getSelectedTirada(),
|
||||
presupuesto.getPeso(),
|
||||
@ -442,22 +396,28 @@ public class PedidoService {
|
||||
return direccionesRet;
|
||||
}
|
||||
|
||||
|
||||
@Transactional
|
||||
private void saveDireccionesPedidoLinea(
|
||||
Map<String, Object> direcciones,
|
||||
Pedido pedido,
|
||||
PedidoLinea linea, Long direccionFacturacionId) {
|
||||
|
||||
String email = pedido.getCreatedBy().getUserName();
|
||||
|
||||
// direccion prueba
|
||||
if (direcciones.containsKey("direccionesFP1")) {
|
||||
|
||||
try {
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, Object> fp1 = (Map<String, Object>) direcciones.get("direccionesFP1");
|
||||
@SuppressWarnings("unchecked")
|
||||
PedidoDireccion direccion = saveDireccion(
|
||||
email,
|
||||
false,
|
||||
(HashMap<String, Object>) fp1.get("direccion"),
|
||||
pedido,
|
||||
linea, true,
|
||||
linea,
|
||||
true,
|
||||
false);
|
||||
pedidoDireccionRepository.save(direccion);
|
||||
} catch (Exception e) {
|
||||
@ -476,6 +436,10 @@ public class PedidoService {
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
PedidoDireccion direccion = saveDireccion(
|
||||
email,
|
||||
((Number) ((HashMap<String, Object>) dir)
|
||||
.getOrDefault("entregaPalets", 0))
|
||||
.intValue() == 1,
|
||||
(HashMap<String, Object>) ((HashMap<String, Object>) dir).get("direccion"),
|
||||
pedido,
|
||||
linea, false,
|
||||
@ -500,20 +464,30 @@ public class PedidoService {
|
||||
dirFactMap.put("identificacion_fiscal", dirFact.getIdentificacionFiscal());
|
||||
|
||||
PedidoDireccion direccion = saveDireccion(
|
||||
email,
|
||||
false,
|
||||
dirFactMap,
|
||||
pedido,
|
||||
linea, false,
|
||||
linea,
|
||||
false,
|
||||
true);
|
||||
pedidoDireccionRepository.save(direccion);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private PedidoDireccion saveDireccion(HashMap<String, Object> dir, Pedido pedido, PedidoLinea linea,
|
||||
private PedidoDireccion saveDireccion(
|
||||
String email,
|
||||
Boolean palets,
|
||||
HashMap<String, Object> dir,
|
||||
Pedido pedido,
|
||||
PedidoLinea linea,
|
||||
Boolean isEjemplarPrueba,
|
||||
Boolean isFacturacion) {
|
||||
|
||||
PedidoDireccion direccion = new PedidoDireccion();
|
||||
direccion.setEmail(email);
|
||||
direccion.setPalets(isEjemplarPrueba || isFacturacion ? false : palets);
|
||||
direccion.setPedidoLinea(isFacturacion ? null : linea);
|
||||
if (isFacturacion) {
|
||||
direccion.setUnidades(null);
|
||||
@ -549,9 +523,9 @@ public class PedidoService {
|
||||
|
||||
}
|
||||
|
||||
private Estado getEstadoInicial(Presupuesto p){
|
||||
private Estado getEstadoInicial(Presupuesto p) {
|
||||
|
||||
if(presupuestoService.hasMaquetacion(p)){
|
||||
if (presupuestoService.hasMaquetacion(p)) {
|
||||
return Estado.maquetacion;
|
||||
} else {
|
||||
return Estado.haciendo_ferro;
|
||||
|
||||
Reference in New Issue
Block a user