trabajando en obtener las direcciones para guardar

This commit is contained in:
2025-11-07 20:11:23 +01:00
parent 90239be31e
commit 7254c8f11b
7 changed files with 238 additions and 15 deletions

View File

@ -193,6 +193,11 @@
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<!-- IMPORTANTE: incluir dependencias con scope=system en el fat-jar -->
<configuration>
<!-- Esto hace que meta las dependencias con scope=system en BOOT-INF/lib -->
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin> </plugin>
<!-- (Migraciones) Plugin Maven para generar/ejecutar changelogs --> <!-- (Migraciones) Plugin Maven para generar/ejecutar changelogs -->

View File

@ -14,11 +14,13 @@ import java.util.Objects;
import com.imprimelibros.erp.presupuesto.classes.PresupuestoFormatter; import com.imprimelibros.erp.presupuesto.classes.PresupuestoFormatter;
import com.imprimelibros.erp.presupuesto.dto.Presupuesto; import com.imprimelibros.erp.presupuesto.dto.Presupuesto;
import com.imprimelibros.erp.presupuesto.service.PresupuestoService;
import com.imprimelibros.erp.cart.dto.CartDireccionRepository; import com.imprimelibros.erp.cart.dto.CartDireccionRepository;
import com.imprimelibros.erp.cart.dto.DireccionCardDTO; import com.imprimelibros.erp.cart.dto.DireccionCardDTO;
import com.imprimelibros.erp.cart.dto.DireccionShipment; import com.imprimelibros.erp.cart.dto.DireccionShipment;
import com.imprimelibros.erp.cart.dto.UpdateCartRequest; import com.imprimelibros.erp.cart.dto.UpdateCartRequest;
import com.imprimelibros.erp.common.Utils; import com.imprimelibros.erp.common.Utils;
import com.imprimelibros.erp.direcciones.Direccion;
import com.imprimelibros.erp.direcciones.DireccionService; import com.imprimelibros.erp.direcciones.DireccionService;
import com.imprimelibros.erp.externalApi.skApiClient; import com.imprimelibros.erp.externalApi.skApiClient;
import com.imprimelibros.erp.pedido.PedidoService; import com.imprimelibros.erp.pedido.PedidoService;
@ -36,12 +38,13 @@ public class CartService {
private final DireccionService direccionService; private final DireccionService direccionService;
private final skApiClient skApiClient; private final skApiClient skApiClient;
private final PedidoService pedidoService; private final PedidoService pedidoService;
private final PresupuestoService presupuestoService;
public CartService(CartRepository cartRepo, CartItemRepository itemRepo, public CartService(CartRepository cartRepo, CartItemRepository itemRepo,
CartDireccionRepository cartDireccionRepo, MessageSource messageSource, CartDireccionRepository cartDireccionRepo, MessageSource messageSource,
PresupuestoFormatter presupuestoFormatter, PresupuestoRepository presupuestoRepo, PresupuestoFormatter presupuestoFormatter, PresupuestoRepository presupuestoRepo,
Utils utils, DireccionService direccionService, skApiClient skApiClient, Utils utils, DireccionService direccionService, skApiClient skApiClient,
PedidoService pedidoService) { PedidoService pedidoService, PresupuestoService presupuestoService) {
this.cartRepo = cartRepo; this.cartRepo = cartRepo;
this.itemRepo = itemRepo; this.itemRepo = itemRepo;
this.cartDireccionRepo = cartDireccionRepo; this.cartDireccionRepo = cartDireccionRepo;
@ -51,6 +54,7 @@ public class CartService {
this.direccionService = direccionService; this.direccionService = direccionService;
this.skApiClient = skApiClient; this.skApiClient = skApiClient;
this.pedidoService = pedidoService; this.pedidoService = pedidoService;
this.presupuestoService = presupuestoService;
} }
@ -411,6 +415,72 @@ public class CartService {
cartDireccionRepo.deleteByDireccionIdAndCartStatus(direccionId, Cart.Status.ACTIVE); cartDireccionRepo.deleteByDireccionIdAndCartStatus(direccionId, Cart.Status.ACTIVE);
} }
@Transactional
public Long crearPedido(Long cartId) {
Cart cart = this.getCartById(cartId);
List<CartItem> items = cart.getItems();
List<Map<String, Object>> presupuestoRequests = new ArrayList<>();
for (CartItem item : items) {
Presupuesto p = item.getPresupuesto();
Map<String, Object> data_to_send = presupuestoService.toSkApiRequest(p, true);
Map<String, Object> result = skApiClient.savePresupuesto(data_to_send);
if (result.containsKey("error")) {
System.out.println("Error al guardar presupuesto en SK: " + 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;
presupuestoRequests.add(dataMap);
}
// Aquí ya tienes todos los presupuestos SK en presupuestoRequests
// TODO: crear el pedido de verdad y devolver su ID
// Long pedidoId = pedidoService.crearPedidoDesdePresupuestos(cart,
// presupuestoRequests);
// return pedidoId;
return 1L;
}
public List<Map<String, Object>> getDireccionesPresupuesto(Cart cart, Presupuesto presupuesto) {
List<CartDireccion> direcciones = cart.getDirecciones().stream()
.filter(d -> d.getPresupuesto() != null && d.getPresupuesto().getId().equals(presupuesto.getId()))
.toList();
if(cart.getOnlyOneShipment()){
direcciones = direcciones.stream().limit(1).toList();
Direccion dir = direcciones.size() > 0 ? direcciones.get(0).getDireccion() : null;
if(dir != null){
asdaslkdjasldjaslkdjaslkdjaslkdjaslkjljaslkd
}
}
List<Map<String, Object>> resultado = new ArrayList<>();
for (CartDireccion cd : direcciones) {
Map<String, Object> dirMap = new HashMap<>();
dirMap.put("direccion", cd.getDireccion());
dirMap.put("isPalets", cd.getIsPalets());
dirMap.put("unidades", cd.getUnidades());
resultado.add(dirMap);
}
return resultado;
}
/*************************************** /***************************************
* MÉTODOS PRIVADOS * MÉTODOS PRIVADOS
***************************************/ ***************************************/
@ -454,4 +524,6 @@ public class CartService {
return result; return result;
} }
} }

View File

@ -128,6 +128,75 @@ public class skApiClient {
}); });
} }
public Map<String, Object> savePresupuesto(Map<String, Object> requestBody) {
return performWithRetryMap(() -> {
String url = this.skApiUrl + "api/guardar";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setBearerAuth(authService.getToken());
HttpEntity<Map<String, Object>> entity = new HttpEntity<>(requestBody, headers);
ResponseEntity<String> response = restTemplate.exchange(
url,
HttpMethod.POST,
entity,
String.class);
ObjectMapper mapper = new ObjectMapper();
try {
Map<String, Object> responseBody = mapper.readValue(
response.getBody(),
new TypeReference<Map<String, Object>>() {
});
// Si la API devuelve "error" a nivel raíz
if (responseBody.get("error") != null) {
// Devolvemos un mapa con sólo el error para que el caller decida
return Map.of("error", responseBody.get("error"));
}
Object dataObj = responseBody.get("data");
if (dataObj instanceof Map<?, ?> dataRaw) {
@SuppressWarnings("unchecked")
Map<String, Object> data = (Map<String, Object>) dataRaw;
Boolean success = (Boolean) data.get("success");
// OJO: aquí mantengo tu lógica tal cual (success == null o false => OK)
// Si tu API realmente usa success=true como éxito, esto habría que invertirlo.
if (success != null && !success) {
Map<String, String> presupuestoData = mapper.convertValue(
data.get("data"),
new TypeReference<Map<String, String>>() {
});
if (presupuestoData != null && !presupuestoData.isEmpty()) {
data.put("id", Long.valueOf(presupuestoData.get("id")));
data.put("iskn", presupuestoData.get("iskn"));
}
} else {
// Tu lógica actual: si success es true u otra cosa → error 2
return Map.of("error", 2);
}
// Devolvemos sólo la parte interesante: el data ya enriquecido
return Map.of("data", data);
}
// Si data no es un Map, devolvemos error genérico
return Map.of("error", 1);
} catch (JsonProcessingException e) {
e.printStackTrace();
return Map.of("error", 1);
}
});
}
public Integer getMaxSolapas(Map<String, Object> requestBody, Locale locale) { public Integer getMaxSolapas(Map<String, Object> requestBody, Locale locale) {
try { try {
String jsonResponse = performWithRetry(() -> { String jsonResponse = performWithRetry(() -> {
@ -238,7 +307,6 @@ public class skApiClient {
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();
headers.setBearerAuth(authService.getToken()); headers.setBearerAuth(authService.getToken());
ResponseEntity<String> response = restTemplate.exchange( ResponseEntity<String> response = restTemplate.exchange(
uri, uri,
HttpMethod.GET, HttpMethod.GET,
@ -255,10 +323,10 @@ public class skApiClient {
return Map.of("error", messageSource.getMessage("direcciones.error.noShippingCost", null, locale)); return Map.of("error", messageSource.getMessage("direcciones.error.noShippingCost", null, locale));
} else { } else {
Double total = Optional.ofNullable(responseBody.get("data")) Double total = Optional.ofNullable(responseBody.get("data"))
.filter(Number.class::isInstance) .filter(Number.class::isInstance)
.map(Number.class::cast) .map(Number.class::cast)
.map(Number::doubleValue) .map(Number::doubleValue)
.orElse(0.0); .orElse(0.0);
return Map.of("data", total); return Map.of("data", total);
} }

View File

@ -456,6 +456,8 @@ public class PaymentService {
if (cart != null) { if (cart != null) {
// Bloqueamos el carrito // Bloqueamos el carrito
this.cartService.lockCartById(cart.getId()); this.cartService.lockCartById(cart.getId());
// Creamos el pedido
this.cartService.crearPedido(cart.getId());
// order ID es generado dentro de createOrderFromCart donde se marcan los // order ID es generado dentro de createOrderFromCart donde se marcan los
// presupuestos como no editables // presupuestos como no editables
// Long orderId = // Long orderId =

View File

@ -2,25 +2,41 @@ package com.imprimelibros.erp.pedido;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.imprimelibros.erp.externalApi.skApiClient;
import com.imprimelibros.erp.presupuesto.service.PresupuestoService;
@Service @Service
public class PedidoService { public class PedidoService {
protected final skApiClient skApiClient;
protected final PresupuestoService presupuestoService;
public PedidoService(skApiClient skApiClient, PresupuestoService presupuestoService) {
this.skApiClient = skApiClient;
this.presupuestoService = presupuestoService;
}
public int getDescuentoFidelizacion() { public int getDescuentoFidelizacion() {
// descuento entre el 1% y el 6% para clientes fidelidad (mas de 1500€ en el ultimo año) // 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 double totalGastado = 1600.0; // Ejemplo, deberías obtenerlo del historial del cliente
if(totalGastado < 1200) { if (totalGastado < 1200) {
return 0; return 0;
} else if(totalGastado >= 1200 && totalGastado < 1999) { } else if (totalGastado >= 1200 && totalGastado < 1999) {
return 1; return 1;
} else if(totalGastado >= 2000 && totalGastado < 2999) { } else if (totalGastado >= 2000 && totalGastado < 2999) {
return 2; return 2;
} else if(totalGastado >= 3000 && totalGastado < 3999) { } else if (totalGastado >= 3000 && totalGastado < 3999) {
return 3; return 3;
} else if(totalGastado >= 4000 && totalGastado < 4999) { } else if (totalGastado >= 4000 && totalGastado < 4999) {
return 4; return 4;
} else if(totalGastado >= 5000) { } else if (totalGastado >= 5000) {
return 5; return 5;
} }
return 0; return 0;
} }
} }

View File

@ -290,6 +290,10 @@ public class PresupuestoService {
} }
public Map<String, Object> toSkApiRequest(Presupuesto presupuesto) { public Map<String, Object> toSkApiRequest(Presupuesto presupuesto) {
return toSkApiRequest(presupuesto, false);
}
public Map<String, Object> toSkApiRequest(Presupuesto presupuesto, Boolean toSave) {
final int SK_CLIENTE_ID = 1284; final int SK_CLIENTE_ID = 1284;
final int SK_PAGINAS_CUADERNILLO = 32; final int SK_PAGINAS_CUADERNILLO = 32;
@ -343,9 +347,41 @@ public class PresupuestoService {
faja.put("alto", presupuesto.getAltoFaja()); faja.put("alto", presupuesto.getAltoFaja());
body.put("faja", faja); body.put("faja", faja);
} }
// body.put("servicios", servicios);
if( toSave ){
Map<String, Object> data = new HashMap<>();
data.put("input_data", body);
data.put("ferroDigital", 1);
data.put("ferro", 0);
data.put("marcapaginas", 0);
data.put("retractilado5", 0);
if(presupuesto.getServiciosJson() != null && presupuesto.getServiciosJson().indexOf("ejemplar-prueba")>0){
data.put("prototipo", 1);
}
else{
data.put("prototipo", 0);
}
if(presupuesto.getServiciosJson() != null && presupuesto.getServiciosJson().indexOf("retractilado")>0){
data.put("retractilado", 1);
}
else{
data.put("retractilado", 0);
}
data.put("ivaReducido", presupuesto.getIvaReducido() ? 1 : 0);
data.put("confirmar", 1);
Map<String, Object> datosCabecera = new HashMap<>();
datosCabecera.put("titulo", presupuesto.getTitulo());
datosCabecera.put("autor", presupuesto.getAutor());
datosCabecera.put("isbn", presupuesto.getIsbn());
datosCabecera.put("coleccion", "");
datosCabecera.put("referenciaCliente", presupuesto.getId());
data.put("datosCabecera", datosCabecera);
return data;
}
return body; return body;
} }
public Integer getTipoImpresionId(Presupuesto presupuesto) { public Integer getTipoImpresionId(Presupuesto presupuesto) {

View File

@ -0,0 +1,24 @@
package com.imprimelibros.erp.presupuesto;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.imprimelibros.erp.cart.CartService;
@SpringBootTest
public class savePresupuestosTest {
@Autowired
private CartService cartService;
@Test
void testGuardarPresupuesto() {
Long resultado = cartService.crearPedido(8L);
System.out.println("📦 Presupuesto guardado:");
System.out.println(resultado);
// Aquí irían las aserciones para verificar que el presupuesto se guardó correctamente
}
}