From 20d85632fef7ccfbe5ee9e66b4c35817224cf58f Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Wed, 12 Oct 2022 11:20:25 -0300 Subject: [PATCH 01/32] Cambia la forma de guardar un Pedido --- .../java/sic/controller/PedidoController.java | 16 +-- ...edidoDTO.java => CantidadProductoDTO.java} | 2 +- src/main/java/sic/modelo/dto/PedidoDTO.java | 2 +- src/main/java/sic/service/IPedidoService.java | 14 +- .../java/sic/service/IProductoService.java | 2 +- .../sic/service/impl/PedidoServiceImpl.java | 70 +++++++++- .../sic/service/impl/ProductoServiceImpl.java | 2 +- .../sic/controller/PedidoControllerTest.java | 8 +- .../sic/integration/AppIntegrationTest.java | 14 +- .../service/impl/PedidoServiceImplTest.java | 132 ++++++++++++++---- .../service/impl/ProductoServiceImplTest.java | 11 +- 11 files changed, 205 insertions(+), 68 deletions(-) rename src/main/java/sic/modelo/dto/{NuevoRenglonPedidoDTO.java => CantidadProductoDTO.java} (88%) diff --git a/src/main/java/sic/controller/PedidoController.java b/src/main/java/sic/controller/PedidoController.java index a0d9b771e..6a4702dce 100644 --- a/src/main/java/sic/controller/PedidoController.java +++ b/src/main/java/sic/controller/PedidoController.java @@ -17,7 +17,7 @@ import sic.modelo.dto.NuevosResultadosComprobanteDTO; import sic.modelo.Resultados; import sic.modelo.dto.PedidoDTO; -import sic.modelo.dto.NuevoRenglonPedidoDTO; +import sic.modelo.dto.CantidadProductoDTO; import sic.service.*; @RestController @@ -62,7 +62,7 @@ public List getRenglonesDelPedido(@PathVariable long idPedido, @PostMapping("/pedidos/renglones/clientes/{idCliente}") @AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO, Rol.VENDEDOR, Rol.VIAJANTE}) public List calcularRenglonesPedido( - @RequestBody List nuevosRenglonesPedidoDTO) { + @RequestBody List nuevosRenglonesPedidoDTO) { return pedidoService.calcularRenglonesPedido( pedidoService.getArrayDeIdProducto(nuevosRenglonesPedidoDTO), pedidoService.getArrayDeCantidadesProducto(nuevosRenglonesPedidoDTO)); @@ -79,14 +79,10 @@ public void actualizar(@RequestBody PedidoDTO pedidoDTO) { pedido.setRecargoPorcentaje(pedidoDTO.getRecargoPorcentaje()); if (pedidoDTO.getDescuentoPorcentaje() != null) pedido.setDescuentoPorcentaje(pedidoDTO.getDescuentoPorcentaje()); - List renglonesAnteriores = new ArrayList<>(pedido.getRenglones()); - pedido.getRenglones().clear(); - pedido - .getRenglones() - .addAll( - pedidoService.calcularRenglonesPedido( - pedidoService.getArrayDeIdProducto(pedidoDTO.getRenglones()), - pedidoService.getArrayDeCantidadesProducto(pedidoDTO.getRenglones()))); + List renglonesAnteriores = new ArrayList<>(); + pedido.getRenglones().forEach(renglonPedido -> renglonesAnteriores.add(CantidadProductoDTO.builder() + .idProductoItem(renglonPedido.getIdProductoItem()).cantidad(renglonPedido.getCantidad()).build())); + pedido.setRenglones(this.pedidoService.actualizarRenglonesPedido(pedido.getRenglones(), pedidoDTO.getRenglones())); pedidoService.actualizar( pedido, renglonesAnteriores, diff --git a/src/main/java/sic/modelo/dto/NuevoRenglonPedidoDTO.java b/src/main/java/sic/modelo/dto/CantidadProductoDTO.java similarity index 88% rename from src/main/java/sic/modelo/dto/NuevoRenglonPedidoDTO.java rename to src/main/java/sic/modelo/dto/CantidadProductoDTO.java index 57ef2841f..442ad3836 100644 --- a/src/main/java/sic/modelo/dto/NuevoRenglonPedidoDTO.java +++ b/src/main/java/sic/modelo/dto/CantidadProductoDTO.java @@ -11,7 +11,7 @@ @AllArgsConstructor @NoArgsConstructor @Builder -public class NuevoRenglonPedidoDTO { +public class CantidadProductoDTO { private long idProductoItem; private BigDecimal cantidad; diff --git a/src/main/java/sic/modelo/dto/PedidoDTO.java b/src/main/java/sic/modelo/dto/PedidoDTO.java index 844380a90..0400fcb38 100644 --- a/src/main/java/sic/modelo/dto/PedidoDTO.java +++ b/src/main/java/sic/modelo/dto/PedidoDTO.java @@ -20,7 +20,7 @@ public class PedidoDTO { private String observaciones; private Long idCliente; private TipoDeEnvio tipoDeEnvio; - private List renglones; + private List renglones; private Long[] idsFormaDePago; private BigDecimal[] montos; private BigDecimal recargoPorcentaje; diff --git a/src/main/java/sic/service/IPedidoService.java b/src/main/java/sic/service/IPedidoService.java index 2f23555fe..7e53ee61c 100644 --- a/src/main/java/sic/service/IPedidoService.java +++ b/src/main/java/sic/service/IPedidoService.java @@ -7,7 +7,7 @@ import org.springframework.data.domain.Page; import sic.modelo.*; import sic.modelo.criteria.BusquedaPedidoCriteria; -import sic.modelo.dto.NuevoRenglonPedidoDTO; +import sic.modelo.dto.CantidadProductoDTO; import sic.modelo.dto.NuevosResultadosComprobanteDTO; import sic.modelo.Resultados; @@ -19,7 +19,7 @@ public interface IPedidoService { Pedido getPedidoPorNumeroAndSucursal(long nroPedido, Sucursal sucursal); - void actualizar(Pedido pedido, List renglonesAnteriores, Long idSucursal, List recibos); + void actualizar(Pedido pedido, List renglonesAnteriores, Long idSucursal, List recibos); void actualizarFacturasDelPedido(Pedido pedido, List facturas); @@ -49,11 +49,15 @@ public interface IPedidoService { Resultados calcularResultadosPedido(NuevosResultadosComprobanteDTO calculoPedido); - long[] getArrayDeIdProducto(List nuevosRenglones); + long[] getArrayDeIdProducto(List nuevosRenglones); - BigDecimal[] getArrayDeCantidadesProducto(List nuevosRenglones); + BigDecimal[] getArrayDeCantidadesProducto(List nuevosRenglones); void actualizarCantidadReservadaDeProductosPorCambioDeEstado(Pedido pedido); - void actualizarCantidadReservadaDeProductosPorModificacion(Pedido pedido, List renglonesAnteriores); + void actualizarCantidadReservadaDeProductosPorModificacion(Pedido pedido, List renglonesAnteriores); + + List actualizarRenglonesPedido(List renglonesDelPedido, List renglonesParaActualizar); + + RenglonPedido actualizarCantidadRenglonPedido(RenglonPedido renglonPedido, BigDecimal cantidadNueva); } diff --git a/src/main/java/sic/service/IProductoService.java b/src/main/java/sic/service/IProductoService.java index 8201f19f6..3204d6c09 100644 --- a/src/main/java/sic/service/IProductoService.java +++ b/src/main/java/sic/service/IProductoService.java @@ -17,7 +17,7 @@ public interface IProductoService { void actualizar(Producto productoPorActualizar, Producto productoPersistido, byte[] imagen); void devolverStockPedido( - Pedido pedido, TipoDeOperacion tipoDeOperacion, List renglonesAnteriores, Long idSucursalOrigen); + Pedido pedido, TipoDeOperacion tipoDeOperacion, List renglonesAnteriores, Long idSucursalOrigen); void actualizarStockPedido(Pedido pedido, TipoDeOperacion tipoDeOperacion); diff --git a/src/main/java/sic/service/impl/PedidoServiceImpl.java b/src/main/java/sic/service/impl/PedidoServiceImpl.java index 2f0aac60b..d6379e87a 100644 --- a/src/main/java/sic/service/impl/PedidoServiceImpl.java +++ b/src/main/java/sic/service/impl/PedidoServiceImpl.java @@ -391,7 +391,7 @@ private Pageable getPageable(Integer pagina, String ordenarPor, String sentido) @Override @Transactional - public void actualizar(Pedido pedido, List renglonesAnteriores, Long idSucursalOrigen, List recibos) { + public void actualizar(Pedido pedido, List renglonesAnteriores, Long idSucursalOrigen, List recibos) { //de los renglones, sacar ids y cantidades, array de nuevosResultadosPedido BigDecimal[] importesDeRenglones = new BigDecimal[pedido.getRenglones().size()]; int i = 0; @@ -676,7 +676,7 @@ public void cancelarPedidosAbiertos() { } @Override - public long[] getArrayDeIdProducto(List nuevosRenglones) { + public long[] getArrayDeIdProducto(List nuevosRenglones) { long[] idProductoItem = new long[nuevosRenglones.size()]; for (int i = 0; i < nuevosRenglones.size(); ++i) { idProductoItem[i] = nuevosRenglones.get(i).getIdProductoItem(); @@ -685,7 +685,7 @@ public long[] getArrayDeIdProducto(List nuevosRenglones) } @Override - public BigDecimal[] getArrayDeCantidadesProducto(List nuevosRenglones) { + public BigDecimal[] getArrayDeCantidadesProducto(List nuevosRenglones) { BigDecimal[] cantidades = new BigDecimal[nuevosRenglones.size()]; for (int i = 0; i < nuevosRenglones.size(); ++i) { cantidades[i] = nuevosRenglones.get(i).getCantidad(); @@ -706,7 +706,7 @@ public void actualizarCantidadReservadaDeProductosPorCambioDeEstado(Pedido pedid } @Override - public void actualizarCantidadReservadaDeProductosPorModificacion(Pedido pedido, List renglonesAnteriores) { + public void actualizarCantidadReservadaDeProductosPorModificacion(Pedido pedido, List renglonesAnteriores) { if (pedido.getEstado() == EstadoPedido.ABIERTO) { renglonesAnteriores.forEach(renglonPedido -> productoService.quitarCantidadReservada(renglonPedido.getIdProductoItem(), renglonPedido.getCantidad())); pedido.getRenglones().forEach(renglonPedido -> @@ -716,4 +716,66 @@ public void actualizarCantidadReservadaDeProductosPorModificacion(Pedido pedido, messageSource.getMessage("mensaje_producto_error_actualizar_cantidad_reservada", null, Locale.getDefault())); } } + + @Override + public List actualizarRenglonesPedido(List renglonesDelPedido, List nuevosRenglones) { + List renglonesParaAgregar = new ArrayList<>(); + List idsProductos = new ArrayList<>(); + nuevosRenglones.forEach(renglon -> idsProductos.add(renglon.getIdProductoItem())); + renglonesDelPedido.forEach(renglonPedido -> {// marca para eliminar los renglones seteando la cantidad a cero + if (!idsProductos.contains(renglonPedido.getIdProductoItem())){ + renglonPedido.setIdProductoItem(0); + }}); + renglonesDelPedido.removeIf(renglonPedido -> renglonPedido.getIdProductoItem() == 0); //elimina los renglones + nuevosRenglones.forEach(nuevoRenglon -> { + renglonesDelPedido.stream().filter(renglonPedido -> nuevoRenglon.getIdProductoItem() == renglonPedido.getIdProductoItem()) + .forEach(renglonPedido -> { + this.actualizarCantidadRenglonPedido(renglonPedido, nuevoRenglon.getCantidad()); + nuevoRenglon.setIdProductoItem(0L); + }); + }); + nuevosRenglones.removeIf(nuevoRenglon -> nuevoRenglon.getIdProductoItem() == 0); + nuevosRenglones.forEach(nuevoRenglon -> { + renglonesParaAgregar.add(this.calcularRenglonPedido(nuevoRenglon.getIdProductoItem(), nuevoRenglon.getCantidad())); + }); + renglonesDelPedido.addAll(renglonesParaAgregar); + return renglonesDelPedido; + } + + @Override + public RenglonPedido actualizarCantidadRenglonPedido(RenglonPedido renglonPedido, BigDecimal cantidad) { + if (cantidad.compareTo(BigDecimal.ZERO) <= 0) { + throw new BusinessServiceException( + messageSource.getMessage( + "mensaje_producto_cantidad_igual_menor_cero", null, Locale.getDefault())); + } + Producto producto = productoService.getProductoNoEliminadoPorId(renglonPedido.getIdProductoItem()); + renglonPedido.setCantidad(cantidad); + renglonPedido.setPrecioUnitario(producto.getPrecioProducto().getPrecioLista()); + if (producto.getPrecioProducto().isOferta() + && renglonPedido.getCantidad().compareTo(producto.getCantidadProducto().getCantMinima()) >= 0 + && producto.getPrecioProducto().getPorcentajeBonificacionOferta() != null) { + renglonPedido.setBonificacionPorcentaje(producto.getPrecioProducto().getPorcentajeBonificacionOferta()); + renglonPedido.setBonificacionNeta( + CalculosComprobante.calcularProporcion( + renglonPedido.getPrecioUnitario(), producto.getPrecioProducto().getPorcentajeBonificacionOferta())); + } else if (renglonPedido.getCantidad().compareTo(producto.getCantidadProducto().getCantMinima()) >= 0) { + renglonPedido.setBonificacionPorcentaje(producto.getPrecioProducto().getPorcentajeBonificacionPrecio()); + renglonPedido.setBonificacionNeta( + CalculosComprobante.calcularProporcion( + renglonPedido.getPrecioUnitario(), producto.getPrecioProducto().getPorcentajeBonificacionPrecio())); + } else { + renglonPedido.setBonificacionPorcentaje(BigDecimal.ZERO); + renglonPedido.setBonificacionNeta(BigDecimal.ZERO); + } + renglonPedido.setImporteAnterior( + CalculosComprobante.calcularImporte( + renglonPedido.getCantidad(), producto.getPrecioProducto().getPrecioLista(), BigDecimal.ZERO)); + renglonPedido.setImporte( + CalculosComprobante.calcularImporte( + renglonPedido.getCantidad(), + producto.getPrecioProducto().getPrecioLista(), + renglonPedido.getBonificacionNeta())); + return renglonPedido; + } } diff --git a/src/main/java/sic/service/impl/ProductoServiceImpl.java b/src/main/java/sic/service/impl/ProductoServiceImpl.java index c3685356e..7b8f9a8df 100644 --- a/src/main/java/sic/service/impl/ProductoServiceImpl.java +++ b/src/main/java/sic/service/impl/ProductoServiceImpl.java @@ -503,7 +503,7 @@ private void calcularPrecioBonificado(Producto producto) { @Override public void devolverStockPedido( - Pedido pedido, TipoDeOperacion tipoDeOperacion, List renglonesAnteriores, Long idSucursalOrigen) { + Pedido pedido, TipoDeOperacion tipoDeOperacion, List renglonesAnteriores, Long idSucursalOrigen) { if (tipoDeOperacion == TipoDeOperacion.ACTUALIZACION && pedido.getEstado() == EstadoPedido.ABIERTO && renglonesAnteriores != null diff --git a/src/test/java/sic/controller/PedidoControllerTest.java b/src/test/java/sic/controller/PedidoControllerTest.java index 40b5b8561..263c47c7c 100644 --- a/src/test/java/sic/controller/PedidoControllerTest.java +++ b/src/test/java/sic/controller/PedidoControllerTest.java @@ -6,7 +6,7 @@ import org.mockito.Mock; import org.springframework.test.context.junit.jupiter.SpringExtension; import sic.modelo.*; -import sic.modelo.dto.NuevoRenglonPedidoDTO; +import sic.modelo.dto.CantidadProductoDTO; import sic.modelo.dto.NuevosResultadosComprobanteDTO; import sic.service.impl.PedidoServiceImpl; @@ -34,11 +34,11 @@ void shouldGetPedidoPorId() { @Test void shouldCalcularRenglonesPedido() { - List nuevoRenglonPedido = new ArrayList<>(); + List nuevoRenglonPedido = new ArrayList<>(); nuevoRenglonPedido.add( - NuevoRenglonPedidoDTO.builder().idProductoItem(1L).cantidad(BigDecimal.TEN).build()); + CantidadProductoDTO.builder().idProductoItem(1L).cantidad(BigDecimal.TEN).build()); nuevoRenglonPedido.add( - NuevoRenglonPedidoDTO.builder().idProductoItem(2L).cantidad(BigDecimal.ONE).build()); + CantidadProductoDTO.builder().idProductoItem(2L).cantidad(BigDecimal.ONE).build()); List renglones = new ArrayList<>(); long[] idsProducto = {1L, 2L}; BigDecimal[] cantidades = {BigDecimal.TEN, BigDecimal.ONE}; diff --git a/src/test/java/sic/integration/AppIntegrationTest.java b/src/test/java/sic/integration/AppIntegrationTest.java index 55b20874d..20db6617c 100644 --- a/src/test/java/sic/integration/AppIntegrationTest.java +++ b/src/test/java/sic/integration/AppIntegrationTest.java @@ -45,8 +45,6 @@ import sic.modelo.criteria.*; import sic.modelo.dto.*; -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; import java.io.*; import java.math.BigDecimal; import java.nio.charset.Charset; @@ -850,14 +848,14 @@ void testEscenarioAltaClienteYPedido() { Producto productoDos = restTemplate.getForObject(apiPrefix + "/productos/2/sucursales/1", Producto.class); assertEquals(new BigDecimal("13.000000000000000"), productoUno.getCantidadTotalEnSucursales()); assertEquals(new BigDecimal("12.000000000000000"), productoDos.getCantidadTotalEnSucursales()); - List renglonesPedidoDTO = new ArrayList<>(); + List renglonesPedidoDTO = new ArrayList<>(); renglonesPedidoDTO.add( - NuevoRenglonPedidoDTO.builder() + CantidadProductoDTO.builder() .idProductoItem(1L) .cantidad(new BigDecimal("5.000000000000000")) .build()); renglonesPedidoDTO.add( - NuevoRenglonPedidoDTO.builder() + CantidadProductoDTO.builder() .idProductoItem(2L) .cantidad(new BigDecimal("2.000000000000000")) .build()); @@ -946,17 +944,17 @@ void testEscenarioModificacionPedido() { sic.model.RenglonPedido[].class)); assertNotNull(renglonesPedidos); assertEquals(2, renglonesPedidos.size()); - List renglonesPedidoDTO = new ArrayList<>(); + List renglonesPedidoDTO = new ArrayList<>(); renglonesPedidos.forEach( renglonPedido -> renglonesPedidoDTO.add( - NuevoRenglonPedidoDTO.builder() + CantidadProductoDTO.builder() .idProductoItem(renglonPedido.getIdProductoItem()) .cantidad(renglonPedido.getCantidad()) .build())); renglonesPedidoDTO.get(1).setCantidad(new BigDecimal("3")); renglonesPedidoDTO.add( - NuevoRenglonPedidoDTO.builder().idProductoItem(3L).cantidad(BigDecimal.TEN).build()); + CantidadProductoDTO.builder().idProductoItem(3L).cantidad(BigDecimal.TEN).build()); PedidoDTO pedidoDTO = PedidoDTO.builder() .idPedido(pedidosRecuperados.get(0).getIdPedido()) diff --git a/src/test/java/sic/service/impl/PedidoServiceImplTest.java b/src/test/java/sic/service/impl/PedidoServiceImplTest.java index d6ec43bf2..9e3e259d1 100644 --- a/src/test/java/sic/service/impl/PedidoServiceImplTest.java +++ b/src/test/java/sic/service/impl/PedidoServiceImplTest.java @@ -12,10 +12,11 @@ import sic.exception.ServiceException; import sic.modelo.*; import sic.modelo.criteria.BusquedaPedidoCriteria; -import sic.modelo.dto.NuevoRenglonPedidoDTO; +import sic.modelo.dto.CantidadProductoDTO; import sic.modelo.dto.ProductoFaltanteDTO; import sic.modelo.dto.UbicacionDTO; import sic.modelo.embeddable.CantidadProductoEmbeddable; +import sic.modelo.embeddable.PrecioProductoEmbeddable; import sic.repository.PedidoRepository; import sic.repository.RenglonPedidoRepository; import sic.service.IEmailService; @@ -49,6 +50,45 @@ class PedidoServiceImplTest { @Autowired PedidoServiceImpl pedidoService; + + private Producto construirProducto() { + Producto producto = new Producto(); + producto.setIdProducto(1L); + producto.setCodigo("1"); + producto.setDescripcion("Cinta adhesiva doble faz 3M"); + producto.setMedida(new Medida()); + producto.setPrecioProducto(new PrecioProductoEmbeddable()); + producto.getPrecioProducto().setPrecioCosto(new BigDecimal("89.35")); + producto.getPrecioProducto().setGananciaPorcentaje(new BigDecimal("38.74")); + producto.getPrecioProducto().setGananciaNeto(new BigDecimal("34.614")); + producto.getPrecioProducto().setPrecioVentaPublico(new BigDecimal("123.964")); + producto.getPrecioProducto().setIvaPorcentaje(new BigDecimal("21")); + producto.getPrecioProducto().setIvaNeto(new BigDecimal("26.032")); + producto.getPrecioProducto().setPrecioLista(new BigDecimal("150")); + producto.getPrecioProducto().setPorcentajeBonificacionPrecio(new BigDecimal("10")); + producto.getPrecioProducto().setPrecioBonificado(new BigDecimal("135")); + producto.getPrecioProducto().setPorcentajeBonificacionOferta(BigDecimal.ZERO); + producto.setCantidadProducto(new CantidadProductoEmbeddable()); + producto.getCantidadProducto().setCantMinima(new BigDecimal("5")); + producto.setFechaAlta(LocalDateTime.now()); + producto.setFechaUltimaModificacion(LocalDateTime.now()); + Sucursal sucursal = new Sucursal(); + Rubro rubro = new Rubro(); + Proveedor proveedor = new Proveedor(); + Set cantidadEnSucursales = new HashSet<>(); + CantidadEnSucursal cantidadEnSucursal = new CantidadEnSucursal(); + cantidadEnSucursal.setCantidad(BigDecimal.TEN); + cantidadEnSucursal.setSucursal(sucursal); + cantidadEnSucursales.add(cantidadEnSucursal); + cantidadEnSucursal.setSucursal(sucursal); + producto.getCantidadProducto().setCantidadEnSucursales(cantidadEnSucursales); + producto.getCantidadProducto().setCantidadTotalEnSucursales(BigDecimal.TEN); + producto.getCantidadProducto().setCantidadReservada(BigDecimal.ZERO); + producto.setRubro(rubro); + producto.setProveedor(proveedor); + return producto; + } + @Test void shouldCancelarPedidoAbierto() { Pedido pedido = new Pedido(); @@ -85,13 +125,13 @@ void shouldNotCancelarPedidoCerrado() { @Test void shouldGetArrayDeIdProducto() { - List nuevosRenglonesPedido = new ArrayList<>(); - NuevoRenglonPedidoDTO nuevoRenglonPedidoDTO1 = new NuevoRenglonPedidoDTO(); - nuevoRenglonPedidoDTO1.setIdProductoItem(1L); - NuevoRenglonPedidoDTO nuevoRenglonPedidoDTO2 = new NuevoRenglonPedidoDTO(); - nuevoRenglonPedidoDTO2.setIdProductoItem(5L); - nuevosRenglonesPedido.add(nuevoRenglonPedidoDTO1); - nuevosRenglonesPedido.add(nuevoRenglonPedidoDTO2); + List nuevosRenglonesPedido = new ArrayList<>(); + CantidadProductoDTO cantidadProductoDTO1 = new CantidadProductoDTO(); + cantidadProductoDTO1.setIdProductoItem(1L); + CantidadProductoDTO cantidadProductoDTO2 = new CantidadProductoDTO(); + cantidadProductoDTO2.setIdProductoItem(5L); + nuevosRenglonesPedido.add(cantidadProductoDTO1); + nuevosRenglonesPedido.add(cantidadProductoDTO2); long[] idsProductoEsperado = new long[] {1L, 5L}; long[] idsProductoResultado = pedidoService.getArrayDeIdProducto(nuevosRenglonesPedido); assertEquals(idsProductoEsperado.length, idsProductoResultado.length); @@ -101,13 +141,13 @@ void shouldGetArrayDeIdProducto() { @Test void shouldGetArrayDeCantidadesProducto() { - List nuevosRenglonesPedido = new ArrayList<>(); - NuevoRenglonPedidoDTO nuevoRenglonPedidoDTO1 = new NuevoRenglonPedidoDTO(); - nuevoRenglonPedidoDTO1.setCantidad(BigDecimal.TEN); - NuevoRenglonPedidoDTO nuevoRenglonPedidoDTO2 = new NuevoRenglonPedidoDTO(); - nuevoRenglonPedidoDTO2.setCantidad(BigDecimal.ONE); - nuevosRenglonesPedido.add(nuevoRenglonPedidoDTO1); - nuevosRenglonesPedido.add(nuevoRenglonPedidoDTO2); + List nuevosRenglonesPedido = new ArrayList<>(); + CantidadProductoDTO cantidadProductoDTO1 = new CantidadProductoDTO(); + cantidadProductoDTO1.setCantidad(BigDecimal.TEN); + CantidadProductoDTO cantidadProductoDTO2 = new CantidadProductoDTO(); + cantidadProductoDTO2.setCantidad(BigDecimal.ONE); + nuevosRenglonesPedido.add(cantidadProductoDTO1); + nuevosRenglonesPedido.add(cantidadProductoDTO2); BigDecimal[] idsProductoEsperado = new BigDecimal[] {BigDecimal.TEN, BigDecimal.ONE}; BigDecimal[] idsProductoResultado = pedidoService.getArrayDeCantidadesProducto(nuevosRenglonesPedido); @@ -388,11 +428,8 @@ void shouldActualizarCantidadReservadaDeProductosPorModificacion() { renglonPedido.setCantidad(BigDecimal.TEN); renglonesPedido.add(renglonPedido); pedido.setRenglones(renglonesPedido); - List renglonesAnterioresPedido = new ArrayList<>(); - RenglonPedido renglonAnteriorPedido = new RenglonPedido(); - renglonAnteriorPedido.setIdProductoItem(5L); - renglonAnteriorPedido.setCantidad(BigDecimal.ONE); - renglonesAnterioresPedido.add(renglonAnteriorPedido); + List renglonesAnterioresPedido = new ArrayList<>(); + renglonesAnterioresPedido.add(CantidadProductoDTO.builder().idProductoItem(5L).cantidad(BigDecimal.ONE).build()); pedidoService.actualizarCantidadReservadaDeProductosPorModificacion(pedido, renglonesAnterioresPedido); verify(productoService).quitarCantidadReservada(5L, BigDecimal.ONE); verify(productoService).agregarCantidadReservada(1L, BigDecimal.TEN); @@ -402,15 +439,60 @@ void shouldActualizarCantidadReservadaDeProductosPorModificacion() { void shouldThrowsServiceExceptionActualizarCantidadReservadaDeProductosPorModificacion() { Pedido pedido = new Pedido(); pedido.setEstado(EstadoPedido.CANCELADO); - List renglonesAnterioresPedido = new ArrayList<>(); - RenglonPedido renglonAnteriorPedido = new RenglonPedido(); - renglonAnteriorPedido.setIdProductoItem(5L); - renglonAnteriorPedido.setCantidad(BigDecimal.ONE); - renglonesAnterioresPedido.add(renglonAnteriorPedido); + List renglonesAnterioresPedido = new ArrayList<>(); + renglonesAnterioresPedido.add(CantidadProductoDTO.builder().idProductoItem(5L).cantidad(BigDecimal.ONE).build()); assertThrows( ServiceException.class, () -> pedidoService.actualizarCantidadReservadaDeProductosPorModificacion(pedido, renglonesAnterioresPedido)); verify(messageSource) .getMessage(eq("mensaje_producto_error_actualizar_cantidad_reservada"), any(), any()); } + + @Test + void shouldActualizarRenglonesPedido() { + Producto productoUno = this.construirProducto(); + Producto productoDos = this.construirProducto(); + productoDos.setIdProducto(2L); + Producto productoTres = this.construirProducto(); + productoTres.setIdProducto(3L); + when(productoService.getProductoNoEliminadoPorId(1L)).thenReturn(productoUno); + when(productoService.getProductoNoEliminadoPorId(2L)).thenReturn(productoDos); + when(productoService.getProductoNoEliminadoPorId(3L)).thenReturn(productoTres); + List renglones = new ArrayList<>(); + RenglonPedido renglonPedido1 = new RenglonPedido(); + renglonPedido1.setIdRenglonPedido(1L); + renglonPedido1.setIdProductoItem(1L); + renglonPedido1.setCantidad(BigDecimal.TEN); + RenglonPedido renglonPedido2 = new RenglonPedido(); + renglonPedido2.setIdRenglonPedido(2L); + renglonPedido2.setIdProductoItem(2L); + renglonPedido2.setCantidad(BigDecimal.ONE); + renglones.add(renglonPedido1); + renglones.add(renglonPedido2); + List nuevosRenglonesPedido = new ArrayList<>(); + CantidadProductoDTO cantidadProductoDTO = new CantidadProductoDTO(); + cantidadProductoDTO.setIdProductoItem(1L); + cantidadProductoDTO.setCantidad(BigDecimal.ONE); + nuevosRenglonesPedido.add(cantidadProductoDTO); + CantidadProductoDTO nuevoRenglonPedido2DTO = new CantidadProductoDTO(); + nuevoRenglonPedido2DTO.setIdProductoItem(3L); + nuevoRenglonPedido2DTO.setCantidad(BigDecimal.TEN); + nuevosRenglonesPedido.add(nuevoRenglonPedido2DTO); + pedidoService.actualizarRenglonesPedido(renglones, nuevosRenglonesPedido); + assertEquals(1L, renglones.get(0).getIdProductoItem()); + assertEquals(3L, renglones.get(1).getIdProductoItem()); + assertEquals(BigDecimal.ONE, renglones.get(0).getCantidad()); + assertEquals(1L, renglones.get(0).getIdProductoItem()); + assertEquals(BigDecimal.TEN, renglones.get(1).getCantidad()); + assertEquals(3L, renglones.get(1).getIdProductoItem()); + } + + @Test + void shouldActualizarRenglon() { + Producto productoUno = this.construirProducto(); + when(productoService.getProductoNoEliminadoPorId(1L)).thenReturn(productoUno); + RenglonPedido renglonPedido1 = pedidoService.calcularRenglonPedido(productoUno.getIdProducto(), BigDecimal.TEN); + pedidoService.actualizarCantidadRenglonPedido(renglonPedido1, BigDecimal.ONE); + assertEquals(BigDecimal.ONE, renglonPedido1.getCantidad()); + } } diff --git a/src/test/java/sic/service/impl/ProductoServiceImplTest.java b/src/test/java/sic/service/impl/ProductoServiceImplTest.java index 46ed9ffcf..c18b561e8 100644 --- a/src/test/java/sic/service/impl/ProductoServiceImplTest.java +++ b/src/test/java/sic/service/impl/ProductoServiceImplTest.java @@ -22,10 +22,7 @@ import sic.exception.ServiceException; import sic.modelo.*; import sic.modelo.criteria.BusquedaProductoCriteria; -import sic.modelo.dto.NuevoProductoDTO; -import sic.modelo.dto.ProductoFaltanteDTO; -import sic.modelo.dto.ProductosParaActualizarDTO; -import sic.modelo.dto.ProductosParaVerificarStockDTO; +import sic.modelo.dto.*; import sic.modelo.embeddable.CantidadProductoEmbeddable; import sic.modelo.embeddable.PrecioProductoEmbeddable; import sic.repository.ProductoFavoritoRepository; @@ -635,10 +632,8 @@ void shouldDevolverStockPedido() { Sucursal sucursal = new Sucursal(); sucursal.setIdSucursal(1L); pedido.setSucursal(sucursal); - List renglonesAnteriores = new ArrayList<>(); - RenglonPedido renglonPedidoAnterior = new RenglonPedido(); - renglonPedidoAnterior.setIdProductoItem(1L); - renglonesAnteriores.add(renglonPedido); + List renglonesAnteriores = new ArrayList<>(); + renglonesAnteriores.add(CantidadProductoDTO.builder().idProductoItem(1L).build()); productoService.devolverStockPedido( pedido, TipoDeOperacion.ACTUALIZACION, renglonesAnteriores, 1L); verify(messageSource) From 3942843caf464fa52a6f6727797d3c38aed46b57 Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Wed, 9 Nov 2022 04:15:24 -0300 Subject: [PATCH 02/32] First approach of Javer's use --- pom.xml | 5 +++++ src/main/java/sic/config/AppConfig.java | 6 ++++++ src/main/java/sic/config/MockAuthorProvider.java | 12 ++++++++++++ src/main/java/sic/controller/PedidoController.java | 5 +++++ src/main/java/sic/repository/PedidoRepository.java | 2 ++ src/main/java/sic/service/IPedidoService.java | 2 ++ .../java/sic/service/impl/PedidoServiceImpl.java | 14 ++++++++++++++ src/test/resources/application.properties | 1 + 8 files changed, 47 insertions(+) create mode 100644 src/main/java/sic/config/MockAuthorProvider.java diff --git a/pom.xml b/pom.xml index 690a81b77..7b36cd9b4 100644 --- a/pom.xml +++ b/pom.xml @@ -172,6 +172,11 @@ gson ${google-gson.version} + + org.javers + javers-spring-boot-starter-sql + 6.7.1 + diff --git a/src/main/java/sic/config/AppConfig.java b/src/main/java/sic/config/AppConfig.java index 459a9414c..0877adc52 100644 --- a/src/main/java/sic/config/AppConfig.java +++ b/src/main/java/sic/config/AppConfig.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.module.SimpleModule; +import org.javers.spring.auditable.AuthorProvider; import org.modelmapper.ModelMapper; import org.modelmapper.PropertyMap; import org.springframework.boot.web.servlet.FilterRegistrationBean; @@ -112,4 +113,9 @@ public RestTemplate restTemplate() { public Clock clock() { return Clock.systemDefaultZone(); } + + @Bean + public AuthorProvider provideJaversAuthor() { + return new MockAuthorProvider(); + } } diff --git a/src/main/java/sic/config/MockAuthorProvider.java b/src/main/java/sic/config/MockAuthorProvider.java new file mode 100644 index 000000000..f2c419bef --- /dev/null +++ b/src/main/java/sic/config/MockAuthorProvider.java @@ -0,0 +1,12 @@ +package sic.config; + +import org.javers.spring.auditable.AuthorProvider; + +public class MockAuthorProvider implements AuthorProvider { + + + @Override + public String provide() { + return "testUsuario"; + } +} \ No newline at end of file diff --git a/src/main/java/sic/controller/PedidoController.java b/src/main/java/sic/controller/PedidoController.java index 6a4702dce..22d3a2aad 100644 --- a/src/main/java/sic/controller/PedidoController.java +++ b/src/main/java/sic/controller/PedidoController.java @@ -154,4 +154,9 @@ public ResponseEntity getReportePedido(@PathVariable long idPedido) { public Resultados calcularResultadosPedido(@RequestBody NuevosResultadosComprobanteDTO nuevosResultadosComprobanteDTO) { return pedidoService.calcularResultadosPedido(nuevosResultadosComprobanteDTO); } + + @GetMapping("/pedidos/{idPedido}/changes") + public String getSnapshots(@PathVariable long idPedido) { + return pedidoService.getPedidoChanges(idPedido); + } } diff --git a/src/main/java/sic/repository/PedidoRepository.java b/src/main/java/sic/repository/PedidoRepository.java index ee509f713..0e8e1174a 100644 --- a/src/main/java/sic/repository/PedidoRepository.java +++ b/src/main/java/sic/repository/PedidoRepository.java @@ -1,5 +1,6 @@ package sic.repository; +import org.javers.spring.annotation.JaversSpringDataAuditable; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.Query; @@ -8,6 +9,7 @@ import org.springframework.data.repository.query.Param; import sic.modelo.*; +@JaversSpringDataAuditable public interface PedidoRepository extends PagingAndSortingRepository, QuerydslPredicateExecutor { diff --git a/src/main/java/sic/service/IPedidoService.java b/src/main/java/sic/service/IPedidoService.java index 7e53ee61c..26195f887 100644 --- a/src/main/java/sic/service/IPedidoService.java +++ b/src/main/java/sic/service/IPedidoService.java @@ -60,4 +60,6 @@ public interface IPedidoService { List actualizarRenglonesPedido(List renglonesDelPedido, List renglonesParaActualizar); RenglonPedido actualizarCantidadRenglonPedido(RenglonPedido renglonPedido, BigDecimal cantidadNueva); + + String getPedidoChanges(long idPedido); } diff --git a/src/main/java/sic/service/impl/PedidoServiceImpl.java b/src/main/java/sic/service/impl/PedidoServiceImpl.java index d6379e87a..c97a3d1b2 100644 --- a/src/main/java/sic/service/impl/PedidoServiceImpl.java +++ b/src/main/java/sic/service/impl/PedidoServiceImpl.java @@ -13,6 +13,9 @@ import net.sf.jasperreports.engine.*; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; +import org.javers.core.Changes; +import org.javers.core.Javers; +import org.javers.repository.jql.QueryBuilder; import org.modelmapper.ModelMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,6 +52,8 @@ public class PedidoServiceImpl implements IPedidoService { private final IEmailService emailService; private final IReciboService reciboService; private final ICuentaCorrienteService cuentaCorrienteService; + + private final Javers javers; private final ModelMapper modelMapper; private static final BigDecimal CIEN = new BigDecimal("100"); private final Logger logger = LoggerFactory.getLogger(this.getClass()); @@ -66,6 +71,7 @@ public PedidoServiceImpl( IEmailService emailService, IReciboService reciboService, ICuentaCorrienteService cuentaCorrienteService, + Javers javers, ModelMapper modelMapper, MessageSource messageSource, CustomValidator customValidator) { @@ -77,6 +83,7 @@ public PedidoServiceImpl( this.emailService = emailService; this.reciboService = reciboService; this.cuentaCorrienteService = cuentaCorrienteService; + this.javers = javers; this.modelMapper = modelMapper; this.messageSource = messageSource; this.customValidator = customValidator; @@ -778,4 +785,11 @@ public RenglonPedido actualizarCantidadRenglonPedido(RenglonPedido renglonPedido renglonPedido.getBonificacionNeta())); return renglonPedido; } + + @Override + public String getPedidoChanges(long idPedido) { + QueryBuilder queryBuilder = QueryBuilder.byInstance(this.getPedidoNoEliminadoPorId(idPedido)); + Changes changes = javers.findChanges(queryBuilder.build()); + return javers.getJsonConverter().toJson(changes); + } } diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index 5d67d186b..01b553a9e 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -15,3 +15,4 @@ spring.jpa.defer-datasource-initialization=true spring.jpa.properties.hibernate.show_sql=false logging.level.root=INFO spring.main.banner-mode=OFF +javers.newObjectSnapshot=true From faebe8366a7b59df39c9332f475933c5d7ab515a Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Thu, 19 Jan 2023 12:06:55 -0300 Subject: [PATCH 03/32] First approach to use switch --- .../java/sic/controller/PedidoController.java | 6 ++- src/main/java/sic/modelo/dto/ChangeDTO.java | 21 ++++++++ .../java/sic/modelo/dto/ValueChangeDTO.java | 18 +++++++ .../java/sic/repository/PedidoRepository.java | 2 +- src/main/java/sic/service/IAuthService.java | 6 +++ src/main/java/sic/service/IPedidoService.java | 3 +- .../sic/service/impl/AuthServiceImpl.java | 12 +++++ .../sic/service/impl/PedidoServiceImpl.java | 49 ++++++++++++++++++- 8 files changed, 112 insertions(+), 5 deletions(-) create mode 100644 src/main/java/sic/modelo/dto/ChangeDTO.java create mode 100644 src/main/java/sic/modelo/dto/ValueChangeDTO.java diff --git a/src/main/java/sic/controller/PedidoController.java b/src/main/java/sic/controller/PedidoController.java index 22d3a2aad..e81e04be2 100644 --- a/src/main/java/sic/controller/PedidoController.java +++ b/src/main/java/sic/controller/PedidoController.java @@ -14,12 +14,15 @@ import sic.aspect.AccesoRolesPermitidos; import sic.modelo.*; import sic.modelo.criteria.BusquedaPedidoCriteria; +import sic.modelo.dto.ChangeDTO; import sic.modelo.dto.NuevosResultadosComprobanteDTO; import sic.modelo.Resultados; import sic.modelo.dto.PedidoDTO; import sic.modelo.dto.CantidadProductoDTO; import sic.service.*; +import javax.servlet.http.HttpServletRequest; + @RestController @RequestMapping("/api/v1") public class PedidoController { @@ -156,7 +159,8 @@ public Resultados calcularResultadosPedido(@RequestBody NuevosResultadosComproba } @GetMapping("/pedidos/{idPedido}/changes") - public String getSnapshots(@PathVariable long idPedido) { + public List getSnapshots(@PathVariable long idPedido, HttpServletRequest request) { + authService.setActiveUserToken(request.getHeader("Authorization")); return pedidoService.getPedidoChanges(idPedido); } } diff --git a/src/main/java/sic/modelo/dto/ChangeDTO.java b/src/main/java/sic/modelo/dto/ChangeDTO.java new file mode 100644 index 000000000..c41df7ca5 --- /dev/null +++ b/src/main/java/sic/modelo/dto/ChangeDTO.java @@ -0,0 +1,21 @@ +package sic.modelo.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ChangeDTO { + + LocalDateTime date; + UsuarioDTO usuarioDTO; + List changes; + +} diff --git a/src/main/java/sic/modelo/dto/ValueChangeDTO.java b/src/main/java/sic/modelo/dto/ValueChangeDTO.java new file mode 100644 index 000000000..21d333efd --- /dev/null +++ b/src/main/java/sic/modelo/dto/ValueChangeDTO.java @@ -0,0 +1,18 @@ +package sic.modelo.dto; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ValueChangeDTO { + + String propertyName; + String beforeValue; + String afterValue; +} diff --git a/src/main/java/sic/repository/PedidoRepository.java b/src/main/java/sic/repository/PedidoRepository.java index 0e8e1174a..90238410d 100644 --- a/src/main/java/sic/repository/PedidoRepository.java +++ b/src/main/java/sic/repository/PedidoRepository.java @@ -9,7 +9,7 @@ import org.springframework.data.repository.query.Param; import sic.modelo.*; -@JaversSpringDataAuditable +//@JaversSpringDataAuditable public interface PedidoRepository extends PagingAndSortingRepository, QuerydslPredicateExecutor { diff --git a/src/main/java/sic/service/IAuthService.java b/src/main/java/sic/service/IAuthService.java index 58e4102ef..feeaee9d3 100644 --- a/src/main/java/sic/service/IAuthService.java +++ b/src/main/java/sic/service/IAuthService.java @@ -2,6 +2,8 @@ import io.jsonwebtoken.Claims; import sic.modelo.Rol; +import sic.modelo.Usuario; + import java.util.List; public interface IAuthService { @@ -19,4 +21,8 @@ public interface IAuthService { void validarRecaptcha(String recaptcha); void excluirTokenAcceso(String authorizationHeader); + + void setActiveUserToken(String token); + + long getActiveUserId(); } diff --git a/src/main/java/sic/service/IPedidoService.java b/src/main/java/sic/service/IPedidoService.java index 26195f887..6dc1089cd 100644 --- a/src/main/java/sic/service/IPedidoService.java +++ b/src/main/java/sic/service/IPedidoService.java @@ -8,6 +8,7 @@ import sic.modelo.*; import sic.modelo.criteria.BusquedaPedidoCriteria; import sic.modelo.dto.CantidadProductoDTO; +import sic.modelo.dto.ChangeDTO; import sic.modelo.dto.NuevosResultadosComprobanteDTO; import sic.modelo.Resultados; @@ -61,5 +62,5 @@ public interface IPedidoService { RenglonPedido actualizarCantidadRenglonPedido(RenglonPedido renglonPedido, BigDecimal cantidadNueva); - String getPedidoChanges(long idPedido); + List getPedidoChanges(long idPedido); } diff --git a/src/main/java/sic/service/impl/AuthServiceImpl.java b/src/main/java/sic/service/impl/AuthServiceImpl.java index 8f6d7f4e0..0d53f1260 100644 --- a/src/main/java/sic/service/impl/AuthServiceImpl.java +++ b/src/main/java/sic/service/impl/AuthServiceImpl.java @@ -31,6 +31,8 @@ public class AuthServiceImpl implements IAuthService { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private static final String URL_RECAPTCHA = "https://www.google.com/recaptcha/api/siteverify"; private static final String BEARER_TOKEN_PREFIX = "Bearer"; + + private long activeUserID; private final MessageSource messageSource; @Value("${RECAPTCHA_SECRET_KEY}") @@ -131,4 +133,14 @@ public void excluirTokenAcceso(String authorizationHeader) { tokenAccesoExcluidoRepository.save(new TokenAccesoExcluido(0, token)); } } + + @Override + public void setActiveUserToken(String token) { + activeUserID = this.getClaimsDelToken(token).get("idUsuario", Integer.class); + } + + @Override + public long getActiveUserId() { + return activeUserID; + } } diff --git a/src/main/java/sic/service/impl/PedidoServiceImpl.java b/src/main/java/sic/service/impl/PedidoServiceImpl.java index c97a3d1b2..6ab80eef5 100644 --- a/src/main/java/sic/service/impl/PedidoServiceImpl.java +++ b/src/main/java/sic/service/impl/PedidoServiceImpl.java @@ -15,7 +15,12 @@ import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import org.javers.core.Changes; import org.javers.core.Javers; +import org.javers.core.diff.Change; +import org.javers.core.diff.changetype.PropertyChange; +import org.javers.core.diff.changetype.ValueChange; +import org.javers.core.diff.changetype.container.ListChange; import org.javers.repository.jql.QueryBuilder; +import org.javers.spring.annotation.JaversAuditable; import org.modelmapper.ModelMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,6 +58,8 @@ public class PedidoServiceImpl implements IPedidoService { private final IReciboService reciboService; private final ICuentaCorrienteService cuentaCorrienteService; + private final IAuthService authService; + private final Javers javers; private final ModelMapper modelMapper; private static final BigDecimal CIEN = new BigDecimal("100"); @@ -72,6 +79,7 @@ public PedidoServiceImpl( IReciboService reciboService, ICuentaCorrienteService cuentaCorrienteService, Javers javers, + IAuthService authService, ModelMapper modelMapper, MessageSource messageSource, CustomValidator customValidator) { @@ -84,6 +92,7 @@ public PedidoServiceImpl( this.reciboService = reciboService; this.cuentaCorrienteService = cuentaCorrienteService; this.javers = javers; + this.authService = authService; this.modelMapper = modelMapper; this.messageSource = messageSource; this.customValidator = customValidator; @@ -172,6 +181,7 @@ public long generarNumeroPedido(Sucursal sucursal) { @Override @Transactional + @JaversAuditable public Pedido guardar(Pedido pedido, List recibos) { Cliente clienteDeUsuario = clienteService.getClientePorIdUsuario(pedido.getUsuario().getIdUsuario()); if (pedido.getCliente().equals(clienteDeUsuario) && pedido.getUsuario().getRoles().contains(Rol.VENDEDOR) && @@ -234,6 +244,7 @@ public Pedido guardar(Pedido pedido, List recibos) { "Reporte.pdf"); logger.warn("El mail del pedido nro {} se envió.", pedido.getNroPedido()); } + javers.commit(String.valueOf(authService.getActiveUserId()), pedido); return pedido; } @@ -432,6 +443,7 @@ public void actualizar(Pedido pedido, List renglonesAnterio productoService.devolverStockPedido(pedido, TipoDeOperacion.ACTUALIZACION, renglonesAnteriores, idSucursalOrigen); productoService.actualizarStockPedido(pedido, TipoDeOperacion.ACTUALIZACION); pedidoRepository.save(pedido); + javers.commit(String.valueOf(authService.getActiveUserId()), pedido); this.actualizarCantidadReservadaDeProductosPorModificacion(pedido, renglonesAnteriores); } @@ -787,9 +799,42 @@ public RenglonPedido actualizarCantidadRenglonPedido(RenglonPedido renglonPedido } @Override - public String getPedidoChanges(long idPedido) { + public List getPedidoChanges(long idPedido) { QueryBuilder queryBuilder = QueryBuilder.byInstance(this.getPedidoNoEliminadoPorId(idPedido)); Changes changes = javers.findChanges(queryBuilder.build()); - return javers.getJsonConverter().toJson(changes); + return this.getChangesDTO(changes); + } + + private List getChangesDTO(Changes changes) { + var changesDTO = new ArrayList(); + changes.groupByCommit().forEach(changeByCommit -> { + Usuario usuarioAuthor = usuarioService.getUsuarioNoEliminadoPorId(Long.parseLong(changeByCommit.getCommit().getAuthor())); + changesDTO.add(ChangeDTO.builder() + .date(changeByCommit.getCommit().getCommitDate()) + .usuarioDTO(UsuarioDTO.builder() + .nombre(usuarioAuthor.getNombre()) + .build()) + .changes(this.getValuesChangesDTO(changeByCommit.get())) + .build()); + }); + return changesDTO; + } + + private List getValuesChangesDTO(List changes) { + var ValuesChanges = new ArrayList(); + changes.forEach(change -> { + switch (change.getClass().getName()) { // mirar los grupos, en general son 3 grupos que sus subgrupos se llaman diferente, hacer por cada caso + //va a quedar medio feo pero es peor que nada de momento + + }; + //var asdn = change.getc instanceof ValueChange ? ((ValueChange)change) : ((ListChange)change); +// var valueChange = ((change.getClass().)change); +// ValuesChanges.add(ValueChangeDTO.builder() +// .propertyName(valueChange.getPropertyName()) +// .beforeValue(valueChange.getLeft().toString()) +// .afterValue(valueChange.getRight().toString()) +// .build()); + }); + return ValuesChanges; } } From 208b8a57192407bff9ec1cf1fc8f78232488413d Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Fri, 3 Feb 2023 09:04:48 -0300 Subject: [PATCH 04/32] Implements the changeDTO and ValueChangeDTO models. There is not enough information about the rows in the results --- .../java/sic/controller/PedidoController.java | 19 ++-- src/main/java/sic/modelo/dto/ChangeDTO.java | 10 +- .../java/sic/modelo/dto/ValueChangeDTO.java | 10 +- .../java/sic/repository/PedidoRepository.java | 2 - .../sic/service/impl/PedidoServiceImpl.java | 106 ++++++++++++++---- 5 files changed, 110 insertions(+), 37 deletions(-) diff --git a/src/main/java/sic/controller/PedidoController.java b/src/main/java/sic/controller/PedidoController.java index e81e04be2..69c70cb14 100644 --- a/src/main/java/sic/controller/PedidoController.java +++ b/src/main/java/sic/controller/PedidoController.java @@ -14,11 +14,8 @@ import sic.aspect.AccesoRolesPermitidos; import sic.modelo.*; import sic.modelo.criteria.BusquedaPedidoCriteria; -import sic.modelo.dto.ChangeDTO; -import sic.modelo.dto.NuevosResultadosComprobanteDTO; +import sic.modelo.dto.*; import sic.modelo.Resultados; -import sic.modelo.dto.PedidoDTO; -import sic.modelo.dto.CantidadProductoDTO; import sic.service.*; import javax.servlet.http.HttpServletRequest; @@ -72,7 +69,8 @@ public List calcularRenglonesPedido( } @PutMapping("/pedidos") - public void actualizar(@RequestBody PedidoDTO pedidoDTO) { + public void actualizar(@RequestBody PedidoDTO pedidoDTO, HttpServletRequest request) { + authService.setActiveUserToken(request.getHeader("Authorization")); Pedido pedido = pedidoService.getPedidoNoEliminadoPorId(pedidoDTO.getIdPedido()); Long idSucursalOrigen = pedido.getIdSucursal(); pedido.setSucursal(sucursalService.getSucursalPorId(pedidoDTO.getIdSucursal())); @@ -101,7 +99,9 @@ public void actualizar(@RequestBody PedidoDTO pedidoDTO) { @PostMapping("/pedidos") public Pedido guardar(@RequestBody PedidoDTO pedidoDTO, - @RequestHeader("Authorization") String authorizationHeader) { + @RequestHeader("Authorization") String authorizationHeader, + HttpServletRequest request) { + authService.setActiveUserToken(request.getHeader("Authorization")); Claims claims = authService.getClaimsDelToken(authorizationHeader); Pedido pedido = new Pedido(); pedido.setObservaciones(pedidoDTO.getObservaciones()); @@ -139,7 +139,8 @@ public Page buscarConCriteria( @PutMapping("/pedidos/{idPedido}") @AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO, Rol.VENDEDOR}) - public void cancelar(@PathVariable long idPedido) { + public void cancelar(@PathVariable long idPedido, HttpServletRequest request) { + authService.setActiveUserToken(request.getHeader("Authorization")); pedidoService.cancelar(pedidoService.getPedidoNoEliminadoPorId(idPedido)); } @@ -159,8 +160,8 @@ public Resultados calcularResultadosPedido(@RequestBody NuevosResultadosComproba } @GetMapping("/pedidos/{idPedido}/changes") - public List getSnapshots(@PathVariable long idPedido, HttpServletRequest request) { - authService.setActiveUserToken(request.getHeader("Authorization")); + @AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO}) + public List getChanges(@PathVariable long idPedido, HttpServletRequest request) { return pedidoService.getPedidoChanges(idPedido); } } diff --git a/src/main/java/sic/modelo/dto/ChangeDTO.java b/src/main/java/sic/modelo/dto/ChangeDTO.java index c41df7ca5..ce295e95d 100644 --- a/src/main/java/sic/modelo/dto/ChangeDTO.java +++ b/src/main/java/sic/modelo/dto/ChangeDTO.java @@ -1,21 +1,27 @@ package sic.modelo.dto; +import com.fasterxml.jackson.annotation.JsonView; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import sic.controller.Views; +import sic.modelo.TipoDeOperacion; import java.time.LocalDateTime; +import java.util.HashMap; import java.util.List; @Data @AllArgsConstructor @NoArgsConstructor @Builder +@JsonView(Views.Encargado.class) public class ChangeDTO { LocalDateTime date; - UsuarioDTO usuarioDTO; - List changes; + String usuario; + String tipoDeOperacion; + HashMap> changes; } diff --git a/src/main/java/sic/modelo/dto/ValueChangeDTO.java b/src/main/java/sic/modelo/dto/ValueChangeDTO.java index 21d333efd..7cb2fcf51 100644 --- a/src/main/java/sic/modelo/dto/ValueChangeDTO.java +++ b/src/main/java/sic/modelo/dto/ValueChangeDTO.java @@ -1,18 +1,22 @@ package sic.modelo.dto; +import com.fasterxml.jackson.annotation.JsonView; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import sic.controller.Views; @Data @AllArgsConstructor @NoArgsConstructor @Builder +@JsonView(Views.Encargado.class) public class ValueChangeDTO { - String propertyName; - String beforeValue; - String afterValue; + String propertyName; // renglon producto + String beforeValue; // poxi 4 + String afterValue; // poxi 2 + String prettyPrint; } diff --git a/src/main/java/sic/repository/PedidoRepository.java b/src/main/java/sic/repository/PedidoRepository.java index 90238410d..ee509f713 100644 --- a/src/main/java/sic/repository/PedidoRepository.java +++ b/src/main/java/sic/repository/PedidoRepository.java @@ -1,6 +1,5 @@ package sic.repository; -import org.javers.spring.annotation.JaversSpringDataAuditable; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.Query; @@ -9,7 +8,6 @@ import org.springframework.data.repository.query.Param; import sic.modelo.*; -//@JaversSpringDataAuditable public interface PedidoRepository extends PagingAndSortingRepository, QuerydslPredicateExecutor { diff --git a/src/main/java/sic/service/impl/PedidoServiceImpl.java b/src/main/java/sic/service/impl/PedidoServiceImpl.java index 6ab80eef5..db00378e2 100644 --- a/src/main/java/sic/service/impl/PedidoServiceImpl.java +++ b/src/main/java/sic/service/impl/PedidoServiceImpl.java @@ -16,9 +16,11 @@ import org.javers.core.Changes; import org.javers.core.Javers; import org.javers.core.diff.Change; -import org.javers.core.diff.changetype.PropertyChange; -import org.javers.core.diff.changetype.ValueChange; +import org.javers.core.diff.changetype.*; +import org.javers.core.diff.changetype.container.CollectionChange; +import org.javers.core.diff.changetype.container.ElementValueChange; import org.javers.core.diff.changetype.container.ListChange; +import org.javers.core.diff.changetype.container.ValueAddOrRemove; import org.javers.repository.jql.QueryBuilder; import org.javers.spring.annotation.JaversAuditable; import org.modelmapper.ModelMapper; @@ -244,7 +246,9 @@ public Pedido guardar(Pedido pedido, List recibos) { "Reporte.pdf"); logger.warn("El mail del pedido nro {} se envió.", pedido.getNroPedido()); } - javers.commit(String.valueOf(authService.getActiveUserId()), pedido); + Map properties = new HashMap<>(); + properties.put("TipoDeOperacion", TipoDeOperacion.ALTA.name()); + javers.commit(String.valueOf(authService.getActiveUserId()), pedido, properties); return pedido; } @@ -443,7 +447,9 @@ public void actualizar(Pedido pedido, List renglonesAnterio productoService.devolverStockPedido(pedido, TipoDeOperacion.ACTUALIZACION, renglonesAnteriores, idSucursalOrigen); productoService.actualizarStockPedido(pedido, TipoDeOperacion.ACTUALIZACION); pedidoRepository.save(pedido); - javers.commit(String.valueOf(authService.getActiveUserId()), pedido); + Map properties = new HashMap<>(); + properties.put("TipoDeOperacion", TipoDeOperacion.ACTUALIZACION.name()); + javers.commit(String.valueOf(authService.getActiveUserId()), pedido, properties); this.actualizarCantidadReservadaDeProductosPorModificacion(pedido, renglonesAnteriores); } @@ -811,30 +817,88 @@ private List getChangesDTO(Changes changes) { Usuario usuarioAuthor = usuarioService.getUsuarioNoEliminadoPorId(Long.parseLong(changeByCommit.getCommit().getAuthor())); changesDTO.add(ChangeDTO.builder() .date(changeByCommit.getCommit().getCommitDate()) - .usuarioDTO(UsuarioDTO.builder() - .nombre(usuarioAuthor.getNombre()) - .build()) + .usuario(usuarioAuthor.getApellido() + " " + usuarioAuthor.getNombre() + "(" + usuarioAuthor.getUsername() + ")") .changes(this.getValuesChangesDTO(changeByCommit.get())) + .tipoDeOperacion(changeByCommit.getCommit().getProperties().get(TipoDeOperacion.class.getSimpleName())) .build()); }); return changesDTO; } - private List getValuesChangesDTO(List changes) { - var ValuesChanges = new ArrayList(); + private HashMap> getValuesChangesDTO(List changes) { + var valuesChanges = new HashMap>(); changes.forEach(change -> { - switch (change.getClass().getName()) { // mirar los grupos, en general son 3 grupos que sus subgrupos se llaman diferente, hacer por cada caso - //va a quedar medio feo pero es peor que nada de momento - - }; - //var asdn = change.getc instanceof ValueChange ? ((ValueChange)change) : ((ListChange)change); -// var valueChange = ((change.getClass().)change); -// ValuesChanges.add(ValueChangeDTO.builder() -// .propertyName(valueChange.getPropertyName()) -// .beforeValue(valueChange.getLeft().toString()) -// .afterValue(valueChange.getRight().toString()) -// .build()); + switch (change.getClass().getSimpleName()) { + case "ValueChange" -> { + var valueChange = (ValueChange) change; + valuesChanges.put(valueChange.getPropertyName(), Collections.singletonList(ValueChangeDTO.builder() + .afterValue(valueChange.getRight() == null ? "" : valueChange.getRight().toString()) + .beforeValue(valueChange.getLeft() == null ? "" : valueChange.getLeft().toString()) + .propertyName(valueChange.getPropertyName()) + .build())); + } + case "ObjectRemoved" -> { + var objectRemoved = (ObjectRemoved) change; + valuesChanges.put(objectRemoved.getAffectedObject().getClass().getSimpleName() + + objectRemoved.getAffectedGlobalId(), Collections.singletonList(ValueChangeDTO.builder() + .propertyName(objectRemoved.getAffectedObject().getClass().getSimpleName()) + .build())); + } + case "ReferenceChange" -> { + var referenceChange = (ReferenceChange) change; + valuesChanges.put(referenceChange.getPropertyName(), Collections.singletonList(ValueChangeDTO.builder() + .afterValue(referenceChange.getRight() == null ? "" : referenceChange.getRight().toString()) + .beforeValue(referenceChange.getLeft() == null ? "" : referenceChange.getLeft().toString()) + .propertyName(referenceChange.getPropertyName()) + .build())); + } + case "CollectionChange" -> { + var collectionChange = (CollectionChange) change; + valuesChanges.put(collectionChange.getPropertyName(), Collections.singletonList(ValueChangeDTO.builder() + .afterValue(collectionChange.getRight() == null ? "" : collectionChange.getRight().toString()) + .beforeValue(collectionChange.getLeft() == null ? "" : collectionChange.getLeft().toString()) + .propertyName(collectionChange.getPropertyName()) + .build())); + } + case "ListChange" -> { + var listChange = (ListChange) change; + var listOfChanges = new ArrayList(); + listChange.getChanges().forEach(element -> + { + if (element instanceof ElementValueChange elementValueChange) { + listOfChanges.add(ValueChangeDTO.builder() + .afterValue(elementValueChange.getRightValue() == null ? "" : elementValueChange.getRightValue().toString()) + .beforeValue(elementValueChange.getLeftValue() == null ? "" : elementValueChange.getLeftValue().toString()) + //.propertyName(elementValueChange.) + .build()); + } + if (element instanceof ValueAddOrRemove elementValueChange) { + listOfChanges.add(ValueChangeDTO.builder() + .afterValue(elementValueChange.getValue().toString()) + .build()); + } + } + ); + valuesChanges.put(listChange.getPropertyName(), listOfChanges); + } + case "InitialValueChange" -> { + var initialValueChange = (InitialValueChange) change; + valuesChanges.put(initialValueChange.getAffectedObject().getClass().getSimpleName() + + initialValueChange.getAffectedGlobalId(), Collections.singletonList(ValueChangeDTO.builder() + .propertyName(initialValueChange.getAffectedObject().getClass().getSimpleName()) + .build())); + } + case "NewObject" -> { + var newObject = (NewObject) change; + valuesChanges.put(newObject.getAffectedObject().getClass().getSimpleName() + + newObject.getAffectedGlobalId(), Collections.singletonList(ValueChangeDTO.builder() + .propertyName(newObject.getAffectedObject().getClass().getSimpleName()) + .build())); + } + default -> throw new ServiceException( + messageSource.getMessage("mensaje_error_request", null, Locale.getDefault())); + } }); - return ValuesChanges; + return valuesChanges; } } From 6a604d9be1f5cd2eaacea31f27071098e8390e6c Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Fri, 17 Mar 2023 11:48:21 -0300 Subject: [PATCH 05/32] Change the ListChange treatment --- src/main/java/sic/modelo/dto/ChangeDTO.java | 2 +- .../java/sic/modelo/dto/ValueChangeDTO.java | 7 ++-- .../sic/service/impl/PedidoServiceImpl.java | 34 +++++++------------ 3 files changed, 16 insertions(+), 27 deletions(-) diff --git a/src/main/java/sic/modelo/dto/ChangeDTO.java b/src/main/java/sic/modelo/dto/ChangeDTO.java index ce295e95d..8b8dfcc07 100644 --- a/src/main/java/sic/modelo/dto/ChangeDTO.java +++ b/src/main/java/sic/modelo/dto/ChangeDTO.java @@ -6,7 +6,6 @@ import lombok.Data; import lombok.NoArgsConstructor; import sic.controller.Views; -import sic.modelo.TipoDeOperacion; import java.time.LocalDateTime; import java.util.HashMap; @@ -19,6 +18,7 @@ @JsonView(Views.Encargado.class) public class ChangeDTO { + String nombreDeClase; LocalDateTime date; String usuario; String tipoDeOperacion; diff --git a/src/main/java/sic/modelo/dto/ValueChangeDTO.java b/src/main/java/sic/modelo/dto/ValueChangeDTO.java index 7cb2fcf51..5941be6c5 100644 --- a/src/main/java/sic/modelo/dto/ValueChangeDTO.java +++ b/src/main/java/sic/modelo/dto/ValueChangeDTO.java @@ -15,8 +15,7 @@ @JsonView(Views.Encargado.class) public class ValueChangeDTO { - String propertyName; // renglon producto - String beforeValue; // poxi 4 - String afterValue; // poxi 2 - String prettyPrint; + String propertyName; + String beforeValue; + String afterValue; } diff --git a/src/main/java/sic/service/impl/PedidoServiceImpl.java b/src/main/java/sic/service/impl/PedidoServiceImpl.java index db00378e2..3eae386f3 100644 --- a/src/main/java/sic/service/impl/PedidoServiceImpl.java +++ b/src/main/java/sic/service/impl/PedidoServiceImpl.java @@ -813,13 +813,16 @@ public List getPedidoChanges(long idPedido) { private List getChangesDTO(Changes changes) { var changesDTO = new ArrayList(); + final var nombreDeClase = changes.get(0).getAffectedGlobalId().getTypeName() + .substring(changes.get(0).getAffectedGlobalId().getTypeName().lastIndexOf(".") + 1); changes.groupByCommit().forEach(changeByCommit -> { Usuario usuarioAuthor = usuarioService.getUsuarioNoEliminadoPorId(Long.parseLong(changeByCommit.getCommit().getAuthor())); changesDTO.add(ChangeDTO.builder() - .date(changeByCommit.getCommit().getCommitDate()) - .usuario(usuarioAuthor.getApellido() + " " + usuarioAuthor.getNombre() + "(" + usuarioAuthor.getUsername() + ")") - .changes(this.getValuesChangesDTO(changeByCommit.get())) - .tipoDeOperacion(changeByCommit.getCommit().getProperties().get(TipoDeOperacion.class.getSimpleName())) + .nombreDeClase(nombreDeClase) + .date(changeByCommit.getCommit().getCommitDate()) + .usuario(usuarioAuthor.getApellido() + " " + usuarioAuthor.getNombre() + "(" + usuarioAuthor.getUsername() + ")") + .changes(this.getValuesChangesDTO(changeByCommit.get())) + .tipoDeOperacion(changeByCommit.getCommit().getProperties().get(TipoDeOperacion.class.getSimpleName())) .build()); }); return changesDTO; @@ -862,24 +865,11 @@ private HashMap> getValuesChangesDTO(List c } case "ListChange" -> { var listChange = (ListChange) change; - var listOfChanges = new ArrayList(); - listChange.getChanges().forEach(element -> - { - if (element instanceof ElementValueChange elementValueChange) { - listOfChanges.add(ValueChangeDTO.builder() - .afterValue(elementValueChange.getRightValue() == null ? "" : elementValueChange.getRightValue().toString()) - .beforeValue(elementValueChange.getLeftValue() == null ? "" : elementValueChange.getLeftValue().toString()) - //.propertyName(elementValueChange.) - .build()); - } - if (element instanceof ValueAddOrRemove elementValueChange) { - listOfChanges.add(ValueChangeDTO.builder() - .afterValue(elementValueChange.getValue().toString()) - .build()); - } - } - ); - valuesChanges.put(listChange.getPropertyName(), listOfChanges); + valuesChanges.put(listChange.getPropertyName(), Collections.singletonList(ValueChangeDTO.builder() + .afterValue(String.valueOf(listChange.getRightSize())) + .beforeValue(String.valueOf(listChange.getLeftSize())) + .propertyName(listChange.getPropertyName()) + .build())); } case "InitialValueChange" -> { var initialValueChange = (InitialValueChange) change; From 08f769c97372c4f90afc3d2065c6b689c4f813d6 Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Fri, 17 Mar 2023 12:03:54 -0300 Subject: [PATCH 06/32] Change attributes names --- .../java/sic/controller/PedidoController.java | 2 +- .../{ValueChangeDTO.java => CambioDTO.java} | 8 +-- .../dto/{ChangeDTO.java => CommitDTO.java} | 6 +- src/main/java/sic/service/IPedidoService.java | 4 +- .../sic/service/impl/PedidoServiceImpl.java | 62 +++++++++---------- 5 files changed, 40 insertions(+), 42 deletions(-) rename src/main/java/sic/modelo/dto/{ValueChangeDTO.java => CambioDTO.java} (75%) rename src/main/java/sic/modelo/dto/{ChangeDTO.java => CommitDTO.java} (82%) diff --git a/src/main/java/sic/controller/PedidoController.java b/src/main/java/sic/controller/PedidoController.java index 69c70cb14..f684d5cd1 100644 --- a/src/main/java/sic/controller/PedidoController.java +++ b/src/main/java/sic/controller/PedidoController.java @@ -161,7 +161,7 @@ public Resultados calcularResultadosPedido(@RequestBody NuevosResultadosComproba @GetMapping("/pedidos/{idPedido}/changes") @AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO}) - public List getChanges(@PathVariable long idPedido, HttpServletRequest request) { + public List getChanges(@PathVariable long idPedido, HttpServletRequest request) { return pedidoService.getPedidoChanges(idPedido); } } diff --git a/src/main/java/sic/modelo/dto/ValueChangeDTO.java b/src/main/java/sic/modelo/dto/CambioDTO.java similarity index 75% rename from src/main/java/sic/modelo/dto/ValueChangeDTO.java rename to src/main/java/sic/modelo/dto/CambioDTO.java index 5941be6c5..f9754e736 100644 --- a/src/main/java/sic/modelo/dto/ValueChangeDTO.java +++ b/src/main/java/sic/modelo/dto/CambioDTO.java @@ -13,9 +13,9 @@ @NoArgsConstructor @Builder @JsonView(Views.Encargado.class) -public class ValueChangeDTO { +public class CambioDTO { - String propertyName; - String beforeValue; - String afterValue; + String atributo; + String valorAnterior; + String valorActual; } diff --git a/src/main/java/sic/modelo/dto/ChangeDTO.java b/src/main/java/sic/modelo/dto/CommitDTO.java similarity index 82% rename from src/main/java/sic/modelo/dto/ChangeDTO.java rename to src/main/java/sic/modelo/dto/CommitDTO.java index 8b8dfcc07..4f8b28adc 100644 --- a/src/main/java/sic/modelo/dto/ChangeDTO.java +++ b/src/main/java/sic/modelo/dto/CommitDTO.java @@ -16,12 +16,12 @@ @NoArgsConstructor @Builder @JsonView(Views.Encargado.class) -public class ChangeDTO { +public class CommitDTO { String nombreDeClase; - LocalDateTime date; + LocalDateTime fecha; String usuario; String tipoDeOperacion; - HashMap> changes; + HashMap> cambios; } diff --git a/src/main/java/sic/service/IPedidoService.java b/src/main/java/sic/service/IPedidoService.java index 6dc1089cd..8f0570745 100644 --- a/src/main/java/sic/service/IPedidoService.java +++ b/src/main/java/sic/service/IPedidoService.java @@ -8,7 +8,7 @@ import sic.modelo.*; import sic.modelo.criteria.BusquedaPedidoCriteria; import sic.modelo.dto.CantidadProductoDTO; -import sic.modelo.dto.ChangeDTO; +import sic.modelo.dto.CommitDTO; import sic.modelo.dto.NuevosResultadosComprobanteDTO; import sic.modelo.Resultados; @@ -62,5 +62,5 @@ public interface IPedidoService { RenglonPedido actualizarCantidadRenglonPedido(RenglonPedido renglonPedido, BigDecimal cantidadNueva); - List getPedidoChanges(long idPedido); + List getPedidoChanges(long idPedido); } diff --git a/src/main/java/sic/service/impl/PedidoServiceImpl.java b/src/main/java/sic/service/impl/PedidoServiceImpl.java index 3eae386f3..c144f91c3 100644 --- a/src/main/java/sic/service/impl/PedidoServiceImpl.java +++ b/src/main/java/sic/service/impl/PedidoServiceImpl.java @@ -18,9 +18,7 @@ import org.javers.core.diff.Change; import org.javers.core.diff.changetype.*; import org.javers.core.diff.changetype.container.CollectionChange; -import org.javers.core.diff.changetype.container.ElementValueChange; import org.javers.core.diff.changetype.container.ListChange; -import org.javers.core.diff.changetype.container.ValueAddOrRemove; import org.javers.repository.jql.QueryBuilder; import org.javers.spring.annotation.JaversAuditable; import org.modelmapper.ModelMapper; @@ -805,84 +803,84 @@ public RenglonPedido actualizarCantidadRenglonPedido(RenglonPedido renglonPedido } @Override - public List getPedidoChanges(long idPedido) { + public List getPedidoChanges(long idPedido) { QueryBuilder queryBuilder = QueryBuilder.byInstance(this.getPedidoNoEliminadoPorId(idPedido)); Changes changes = javers.findChanges(queryBuilder.build()); return this.getChangesDTO(changes); } - private List getChangesDTO(Changes changes) { - var changesDTO = new ArrayList(); + private List getChangesDTO(Changes changes) { + var changesDTO = new ArrayList(); final var nombreDeClase = changes.get(0).getAffectedGlobalId().getTypeName() .substring(changes.get(0).getAffectedGlobalId().getTypeName().lastIndexOf(".") + 1); changes.groupByCommit().forEach(changeByCommit -> { Usuario usuarioAuthor = usuarioService.getUsuarioNoEliminadoPorId(Long.parseLong(changeByCommit.getCommit().getAuthor())); - changesDTO.add(ChangeDTO.builder() + changesDTO.add(CommitDTO.builder() .nombreDeClase(nombreDeClase) - .date(changeByCommit.getCommit().getCommitDate()) + .fecha(changeByCommit.getCommit().getCommitDate()) .usuario(usuarioAuthor.getApellido() + " " + usuarioAuthor.getNombre() + "(" + usuarioAuthor.getUsername() + ")") - .changes(this.getValuesChangesDTO(changeByCommit.get())) + .cambios(this.getValuesChangesDTO(changeByCommit.get())) .tipoDeOperacion(changeByCommit.getCommit().getProperties().get(TipoDeOperacion.class.getSimpleName())) .build()); }); return changesDTO; } - private HashMap> getValuesChangesDTO(List changes) { - var valuesChanges = new HashMap>(); + private HashMap> getValuesChangesDTO(List changes) { + var valuesChanges = new HashMap>(); changes.forEach(change -> { switch (change.getClass().getSimpleName()) { case "ValueChange" -> { var valueChange = (ValueChange) change; - valuesChanges.put(valueChange.getPropertyName(), Collections.singletonList(ValueChangeDTO.builder() - .afterValue(valueChange.getRight() == null ? "" : valueChange.getRight().toString()) - .beforeValue(valueChange.getLeft() == null ? "" : valueChange.getLeft().toString()) - .propertyName(valueChange.getPropertyName()) + valuesChanges.put(valueChange.getPropertyName(), Collections.singletonList(CambioDTO.builder() + .valorActual(valueChange.getRight() == null ? "" : valueChange.getRight().toString()) + .valorAnterior(valueChange.getLeft() == null ? "" : valueChange.getLeft().toString()) + .atributo(valueChange.getPropertyName()) .build())); } case "ObjectRemoved" -> { var objectRemoved = (ObjectRemoved) change; valuesChanges.put(objectRemoved.getAffectedObject().getClass().getSimpleName() + - objectRemoved.getAffectedGlobalId(), Collections.singletonList(ValueChangeDTO.builder() - .propertyName(objectRemoved.getAffectedObject().getClass().getSimpleName()) + objectRemoved.getAffectedGlobalId(), Collections.singletonList(CambioDTO.builder() + .atributo(objectRemoved.getAffectedObject().getClass().getSimpleName()) .build())); } case "ReferenceChange" -> { var referenceChange = (ReferenceChange) change; - valuesChanges.put(referenceChange.getPropertyName(), Collections.singletonList(ValueChangeDTO.builder() - .afterValue(referenceChange.getRight() == null ? "" : referenceChange.getRight().toString()) - .beforeValue(referenceChange.getLeft() == null ? "" : referenceChange.getLeft().toString()) - .propertyName(referenceChange.getPropertyName()) + valuesChanges.put(referenceChange.getPropertyName(), Collections.singletonList(CambioDTO.builder() + .valorActual(referenceChange.getRight() == null ? "" : referenceChange.getRight().toString()) + .valorAnterior(referenceChange.getLeft() == null ? "" : referenceChange.getLeft().toString()) + .atributo(referenceChange.getPropertyName()) .build())); } case "CollectionChange" -> { var collectionChange = (CollectionChange) change; - valuesChanges.put(collectionChange.getPropertyName(), Collections.singletonList(ValueChangeDTO.builder() - .afterValue(collectionChange.getRight() == null ? "" : collectionChange.getRight().toString()) - .beforeValue(collectionChange.getLeft() == null ? "" : collectionChange.getLeft().toString()) - .propertyName(collectionChange.getPropertyName()) + valuesChanges.put(collectionChange.getPropertyName(), Collections.singletonList(CambioDTO.builder() + .valorActual(collectionChange.getRight() == null ? "" : collectionChange.getRight().toString()) + .valorAnterior(collectionChange.getLeft() == null ? "" : collectionChange.getLeft().toString()) + .atributo(collectionChange.getPropertyName()) .build())); } case "ListChange" -> { var listChange = (ListChange) change; - valuesChanges.put(listChange.getPropertyName(), Collections.singletonList(ValueChangeDTO.builder() - .afterValue(String.valueOf(listChange.getRightSize())) - .beforeValue(String.valueOf(listChange.getLeftSize())) - .propertyName(listChange.getPropertyName()) + valuesChanges.put(listChange.getPropertyName(), Collections.singletonList(CambioDTO.builder() + .valorActual(String.valueOf(listChange.getRightSize())) + .valorAnterior(String.valueOf(listChange.getLeftSize())) + .atributo(listChange.getPropertyName()) .build())); } case "InitialValueChange" -> { var initialValueChange = (InitialValueChange) change; valuesChanges.put(initialValueChange.getAffectedObject().getClass().getSimpleName() + - initialValueChange.getAffectedGlobalId(), Collections.singletonList(ValueChangeDTO.builder() - .propertyName(initialValueChange.getAffectedObject().getClass().getSimpleName()) + initialValueChange.getAffectedGlobalId(), Collections.singletonList(CambioDTO.builder() + .atributo(initialValueChange.getAffectedObject().getClass().getSimpleName()) .build())); } case "NewObject" -> { var newObject = (NewObject) change; valuesChanges.put(newObject.getAffectedObject().getClass().getSimpleName() + - newObject.getAffectedGlobalId(), Collections.singletonList(ValueChangeDTO.builder() - .propertyName(newObject.getAffectedObject().getClass().getSimpleName()) + newObject.getAffectedGlobalId(), Collections.singletonList(CambioDTO.builder() + .atributo(newObject.getAffectedObject().getClass().getSimpleName()) .build())); } default -> throw new ServiceException( From 519c552cef2b918c390c73a09fe2fbbaea61ee54 Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Fri, 17 Mar 2023 12:43:37 -0300 Subject: [PATCH 07/32] Fixed the obtain data when a new instance is audited --- src/main/java/sic/modelo/dto/CambioDTO.java | 2 +- src/main/java/sic/modelo/dto/CommitDTO.java | 3 +- .../sic/service/impl/PedidoServiceImpl.java | 52 ++++++++----------- 3 files changed, 25 insertions(+), 32 deletions(-) diff --git a/src/main/java/sic/modelo/dto/CambioDTO.java b/src/main/java/sic/modelo/dto/CambioDTO.java index f9754e736..a046c4b9d 100644 --- a/src/main/java/sic/modelo/dto/CambioDTO.java +++ b/src/main/java/sic/modelo/dto/CambioDTO.java @@ -17,5 +17,5 @@ public class CambioDTO { String atributo; String valorAnterior; - String valorActual; + String valorSiguiente; } diff --git a/src/main/java/sic/modelo/dto/CommitDTO.java b/src/main/java/sic/modelo/dto/CommitDTO.java index 4f8b28adc..6fb0342aa 100644 --- a/src/main/java/sic/modelo/dto/CommitDTO.java +++ b/src/main/java/sic/modelo/dto/CommitDTO.java @@ -8,7 +8,6 @@ import sic.controller.Views; import java.time.LocalDateTime; -import java.util.HashMap; import java.util.List; @Data @@ -22,6 +21,6 @@ public class CommitDTO { LocalDateTime fecha; String usuario; String tipoDeOperacion; - HashMap> cambios; + List cambios; } diff --git a/src/main/java/sic/service/impl/PedidoServiceImpl.java b/src/main/java/sic/service/impl/PedidoServiceImpl.java index c144f91c3..ad3a2bdb1 100644 --- a/src/main/java/sic/service/impl/PedidoServiceImpl.java +++ b/src/main/java/sic/service/impl/PedidoServiceImpl.java @@ -826,65 +826,59 @@ private List getChangesDTO(Changes changes) { return changesDTO; } - private HashMap> getValuesChangesDTO(List changes) { - var valuesChanges = new HashMap>(); + private List getValuesChangesDTO(List changes) { + var valuesChanges = new ArrayList(); changes.forEach(change -> { switch (change.getClass().getSimpleName()) { case "ValueChange" -> { var valueChange = (ValueChange) change; - valuesChanges.put(valueChange.getPropertyName(), Collections.singletonList(CambioDTO.builder() - .valorActual(valueChange.getRight() == null ? "" : valueChange.getRight().toString()) + valuesChanges.add(CambioDTO.builder() + .valorSiguiente(valueChange.getRight() == null ? "" : valueChange.getRight().toString()) .valorAnterior(valueChange.getLeft() == null ? "" : valueChange.getLeft().toString()) .atributo(valueChange.getPropertyName()) - .build())); + .build()); } case "ObjectRemoved" -> { var objectRemoved = (ObjectRemoved) change; - valuesChanges.put(objectRemoved.getAffectedObject().getClass().getSimpleName() + - objectRemoved.getAffectedGlobalId(), Collections.singletonList(CambioDTO.builder() + valuesChanges.add(CambioDTO.builder() .atributo(objectRemoved.getAffectedObject().getClass().getSimpleName()) - .build())); + .build()); } case "ReferenceChange" -> { var referenceChange = (ReferenceChange) change; - valuesChanges.put(referenceChange.getPropertyName(), Collections.singletonList(CambioDTO.builder() - .valorActual(referenceChange.getRight() == null ? "" : referenceChange.getRight().toString()) + valuesChanges.add(CambioDTO.builder() + .valorSiguiente(referenceChange.getRight() == null ? "" : referenceChange.getRight().toString()) .valorAnterior(referenceChange.getLeft() == null ? "" : referenceChange.getLeft().toString()) .atributo(referenceChange.getPropertyName()) - .build())); + .build()); } case "CollectionChange" -> { var collectionChange = (CollectionChange) change; - valuesChanges.put(collectionChange.getPropertyName(), Collections.singletonList(CambioDTO.builder() - .valorActual(collectionChange.getRight() == null ? "" : collectionChange.getRight().toString()) + valuesChanges.add(CambioDTO.builder() + .valorSiguiente(collectionChange.getRight() == null ? "" : collectionChange.getRight().toString()) .valorAnterior(collectionChange.getLeft() == null ? "" : collectionChange.getLeft().toString()) .atributo(collectionChange.getPropertyName()) - .build())); + .build()); } case "ListChange" -> { var listChange = (ListChange) change; - valuesChanges.put(listChange.getPropertyName(), Collections.singletonList(CambioDTO.builder() - .valorActual(String.valueOf(listChange.getRightSize())) + valuesChanges.add(CambioDTO.builder() + .valorSiguiente(String.valueOf(listChange.getRightSize())) .valorAnterior(String.valueOf(listChange.getLeftSize())) .atributo(listChange.getPropertyName()) - .build())); + .build()); } case "InitialValueChange" -> { var initialValueChange = (InitialValueChange) change; - valuesChanges.put(initialValueChange.getAffectedObject().getClass().getSimpleName() + - initialValueChange.getAffectedGlobalId(), Collections.singletonList(CambioDTO.builder() - .atributo(initialValueChange.getAffectedObject().getClass().getSimpleName()) - .build())); + valuesChanges.add(CambioDTO.builder() + .atributo(initialValueChange.getPropertyName()) + .valorAnterior("") + .valorSiguiente(initialValueChange.getRight().toString()) + .build()); } - case "NewObject" -> { - var newObject = (NewObject) change; - valuesChanges.put(newObject.getAffectedObject().getClass().getSimpleName() + - newObject.getAffectedGlobalId(), Collections.singletonList(CambioDTO.builder() - .atributo(newObject.getAffectedObject().getClass().getSimpleName()) - .build())); + default -> { + break; } - default -> throw new ServiceException( - messageSource.getMessage("mensaje_error_request", null, Locale.getDefault())); } }); return valuesChanges; From 337bb2d8afb4a195e465801c2d77d973c0e731f7 Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Mon, 3 Apr 2023 18:56:50 -0300 Subject: [PATCH 08/32] =?UTF-8?q?The=20funtion=20to=20add=20or=20update=20?= =?UTF-8?q?a=20pedido=20its=20broken=20because=20the=20test=20DB=20dosen?= =?UTF-8?q?=C2=B4t=20have=20the=20corresponding=20Javers=20tables?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/sic/controller/PedidoController.java | 12 +++-- src/main/java/sic/modelo/Pedido.java | 2 + src/main/java/sic/modelo/dto/CommitDTO.java | 1 + src/main/java/sic/service/IPedidoService.java | 4 +- .../sic/service/impl/PedidoServiceImpl.java | 45 +++++++++++++++---- 5 files changed, 52 insertions(+), 12 deletions(-) diff --git a/src/main/java/sic/controller/PedidoController.java b/src/main/java/sic/controller/PedidoController.java index f684d5cd1..feb627dfa 100644 --- a/src/main/java/sic/controller/PedidoController.java +++ b/src/main/java/sic/controller/PedidoController.java @@ -159,9 +159,15 @@ public Resultados calcularResultadosPedido(@RequestBody NuevosResultadosComproba return pedidoService.calcularResultadosPedido(nuevosResultadosComprobanteDTO); } - @GetMapping("/pedidos/{idPedido}/changes") + @GetMapping("/pedidos/{idPedido}/cambios") @AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO}) - public List getChanges(@PathVariable long idPedido, HttpServletRequest request) { - return pedidoService.getPedidoChanges(idPedido); + public List getCambios(@PathVariable long idPedido, HttpServletRequest request) { + return pedidoService.getCambiosPedido(idPedido); + } + + @GetMapping("/pedidos/commit/{idCommitPedido}/renglones") // traer el grupo de todos los commits de pedidos, juntos, y el commit del pedido + @AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO}) + public List getCambiosRenglones(@PathVariable long idCommitPedido) { + return pedidoService.getCambiosRenglonesPedido(idCommitPedido); } } diff --git a/src/main/java/sic/modelo/Pedido.java b/src/main/java/sic/modelo/Pedido.java index a67190979..5710b2a38 100644 --- a/src/main/java/sic/modelo/Pedido.java +++ b/src/main/java/sic/modelo/Pedido.java @@ -16,6 +16,7 @@ import lombok.NoArgsConstructor; import lombok.ToString; +import org.javers.core.metamodel.annotation.DiffIgnore; import sic.controller.Views; import sic.modelo.dto.UbicacionDTO; @@ -78,6 +79,7 @@ public class Pedido implements Serializable { @JsonProperty(access = Access.WRITE_ONLY) private List facturas; + //@DiffIgnore @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "id_Pedido") @JsonProperty(access = Access.WRITE_ONLY) diff --git a/src/main/java/sic/modelo/dto/CommitDTO.java b/src/main/java/sic/modelo/dto/CommitDTO.java index 6fb0342aa..600e1aea0 100644 --- a/src/main/java/sic/modelo/dto/CommitDTO.java +++ b/src/main/java/sic/modelo/dto/CommitDTO.java @@ -17,6 +17,7 @@ @JsonView(Views.Encargado.class) public class CommitDTO { + String idCommit; String nombreDeClase; LocalDateTime fecha; String usuario; diff --git a/src/main/java/sic/service/IPedidoService.java b/src/main/java/sic/service/IPedidoService.java index 8f0570745..77bc46612 100644 --- a/src/main/java/sic/service/IPedidoService.java +++ b/src/main/java/sic/service/IPedidoService.java @@ -62,5 +62,7 @@ public interface IPedidoService { RenglonPedido actualizarCantidadRenglonPedido(RenglonPedido renglonPedido, BigDecimal cantidadNueva); - List getPedidoChanges(long idPedido); + List getCambiosPedido(long idPedido); + + List getCambiosRenglonesPedido(long idCommitPedido); } diff --git a/src/main/java/sic/service/impl/PedidoServiceImpl.java b/src/main/java/sic/service/impl/PedidoServiceImpl.java index ad3a2bdb1..e1ca94313 100644 --- a/src/main/java/sic/service/impl/PedidoServiceImpl.java +++ b/src/main/java/sic/service/impl/PedidoServiceImpl.java @@ -1,5 +1,6 @@ package sic.service.impl; +import com.google.gson.internal.LinkedTreeMap; import com.querydsl.core.BooleanBuilder; import java.io.IOException; import java.math.BigDecimal; @@ -15,6 +16,8 @@ import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import org.javers.core.Changes; import org.javers.core.Javers; +import org.javers.core.commit.Commit; +import org.javers.core.commit.CommitId; import org.javers.core.diff.Change; import org.javers.core.diff.changetype.*; import org.javers.core.diff.changetype.container.CollectionChange; @@ -246,6 +249,8 @@ public Pedido guardar(Pedido pedido, List recibos) { } Map properties = new HashMap<>(); properties.put("TipoDeOperacion", TipoDeOperacion.ALTA.name()); + Commit commitRenglones = javers.commit(String.valueOf(authService.getActiveUserId()), pedido.getRenglones(), properties); + properties.put("idCommitRenglones", commitRenglones.getId().value()); javers.commit(String.valueOf(authService.getActiveUserId()), pedido, properties); return pedido; } @@ -447,6 +452,8 @@ public void actualizar(Pedido pedido, List renglonesAnterio pedidoRepository.save(pedido); Map properties = new HashMap<>(); properties.put("TipoDeOperacion", TipoDeOperacion.ACTUALIZACION.name()); + Commit commitRenglones = javers.commit(String.valueOf(authService.getActiveUserId()), pedido.getRenglones(), properties); + properties.put("idCommitRenglones", commitRenglones.getId().value()); javers.commit(String.valueOf(authService.getActiveUserId()), pedido, properties); this.actualizarCantidadReservadaDeProductosPorModificacion(pedido, renglonesAnteriores); } @@ -803,12 +810,25 @@ public RenglonPedido actualizarCantidadRenglonPedido(RenglonPedido renglonPedido } @Override - public List getPedidoChanges(long idPedido) { - QueryBuilder queryBuilder = QueryBuilder.byInstance(this.getPedidoNoEliminadoPorId(idPedido)); + public List getCambiosPedido(long idPedido) { + QueryBuilder queryBuilder = QueryBuilder.byInstance(this.getPedidoNoEliminadoPorId(idPedido)) + .withChildValueObjects(true); Changes changes = javers.findChanges(queryBuilder.build()); return this.getChangesDTO(changes); } + @Override + public List getCambiosRenglonesPedido(long idCommitPedido) { + var query = QueryBuilder.byClass(Pedido.class).withCommitId(BigDecimal.valueOf(idCommitPedido)); + var changesPedido = javers.findChanges(query.build()).groupByCommit(); + if (changesPedido.isEmpty()) throw new ServiceException( + messageSource.getMessage("mensaje_producto_error_actualizar_cantidad_reservada", null, Locale.getDefault())); //cambiar mensaje + var idCommitRenglones = changesPedido.get(changesPedido.size() - 1).getCommit().getProperties().get("idCommitRenglones"); + query = QueryBuilder.anyDomainObject().withCommitId(CommitId.valueOf(idCommitRenglones)); + Changes changesRenglones = javers.findChanges(query.build()); + return this.getChangesDTO(changesRenglones); + } + private List getChangesDTO(Changes changes) { var changesDTO = new ArrayList(); final var nombreDeClase = changes.get(0).getAffectedGlobalId().getTypeName() @@ -816,6 +836,7 @@ private List getChangesDTO(Changes changes) { changes.groupByCommit().forEach(changeByCommit -> { Usuario usuarioAuthor = usuarioService.getUsuarioNoEliminadoPorId(Long.parseLong(changeByCommit.getCommit().getAuthor())); changesDTO.add(CommitDTO.builder() + .idCommit(changeByCommit.getCommit().getId().value()) .nombreDeClase(nombreDeClase) .fecha(changeByCommit.getCommit().getCommitDate()) .usuario(usuarioAuthor.getApellido() + " " + usuarioAuthor.getNombre() + "(" + usuarioAuthor.getUsername() + ")") @@ -861,12 +882,20 @@ private List getValuesChangesDTO(List changes) { .build()); } case "ListChange" -> { - var listChange = (ListChange) change; - valuesChanges.add(CambioDTO.builder() - .valorSiguiente(String.valueOf(listChange.getRightSize())) - .valorAnterior(String.valueOf(listChange.getLeftSize())) - .atributo(listChange.getPropertyName()) - .build()); + var listChange = (ListChange) change; // agregar datos renglones + var mapRight = (LinkedTreeMap)listChange.getRight().get(0); + var mapLeft = listChange.getLeft() != null && !listChange.getLeft().isEmpty() ? + (LinkedTreeMap)listChange.getLeft().get(0) : new LinkedTreeMap<>(); + var keySet = mapRight.keySet(); + keySet.stream().forEach(key -> { + var valorSiguiente = mapRight.get(key); + var valorAnterior = mapLeft.get(key); + valuesChanges.add(CambioDTO.builder() + .valorSiguiente(valorSiguiente.toString()) + .valorAnterior(valorAnterior != null ? valorAnterior.toString() : "") + .atributo(key.toString()) + .build()); + }); } case "InitialValueChange" -> { var initialValueChange = (InitialValueChange) change; From 59b2eb65378dc06f43c6cb9df90b249a2305c4df Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Mon, 10 Apr 2023 06:23:41 -0300 Subject: [PATCH 09/32] Adds the Audit Service Interface and a implementation --- src/main/java/sic/service/IAuditService.java | 23 +++ .../sic/service/impl/AuditServiceImpl.java | 139 ++++++++++++++++++ .../sic/service/impl/PedidoServiceImpl.java | 116 ++------------- 3 files changed, 175 insertions(+), 103 deletions(-) create mode 100644 src/main/java/sic/service/IAuditService.java create mode 100644 src/main/java/sic/service/impl/AuditServiceImpl.java diff --git a/src/main/java/sic/service/IAuditService.java b/src/main/java/sic/service/IAuditService.java new file mode 100644 index 000000000..285fdf7d1 --- /dev/null +++ b/src/main/java/sic/service/IAuditService.java @@ -0,0 +1,23 @@ +package sic.service; + +import org.javers.core.Changes; +import org.javers.core.commit.Commit; +import org.javers.core.diff.Change; +import org.javers.repository.jql.JqlQuery; +import sic.modelo.dto.CambioDTO; +import sic.modelo.dto.CommitDTO; + +import java.util.List; +import java.util.Map; + +public interface IAuditService { + + Commit auditar(String string, Object objeto, Map propiedades); + + Commit auditar(String string, Object objeto); + List getCambiosDTO(Changes changes); + + List getValoresCambiadosDTO(List changes); + + Changes getCambios(JqlQuery jqlQuery); +} diff --git a/src/main/java/sic/service/impl/AuditServiceImpl.java b/src/main/java/sic/service/impl/AuditServiceImpl.java new file mode 100644 index 000000000..e5fdf93fd --- /dev/null +++ b/src/main/java/sic/service/impl/AuditServiceImpl.java @@ -0,0 +1,139 @@ +package sic.service.impl; + +import com.google.gson.internal.LinkedTreeMap; +import org.javers.core.Changes; +import org.javers.core.Javers; +import org.javers.core.commit.Commit; +import org.javers.core.diff.Change; +import org.javers.core.diff.changetype.InitialValueChange; +import org.javers.core.diff.changetype.ObjectRemoved; +import org.javers.core.diff.changetype.ReferenceChange; +import org.javers.core.diff.changetype.ValueChange; +import org.javers.core.diff.changetype.container.CollectionChange; +import org.javers.core.diff.changetype.container.ListChange; +import org.javers.repository.jql.JqlQuery; +import org.springframework.beans.factory.annotation.Autowired; +import sic.modelo.TipoDeOperacion; +import sic.modelo.Usuario; +import sic.modelo.dto.CambioDTO; +import sic.modelo.dto.CommitDTO; +import sic.service.IAuditService; +import sic.service.IUsuarioService; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class AuditServiceImpl implements IAuditService { + + private IUsuarioService usuarioService; + + private Javers javers; + + @Autowired + public AuditServiceImpl(IUsuarioService usuarioService, Javers javers) { + this.usuarioService = usuarioService; + this.javers = javers; + } + + @Override + public Commit auditar(String string, Object objeto, Map propiedades) { + return javers.commit(string, objeto, propiedades); + } + + @Override + public Commit auditar(String string, Object objeto) { + return javers.commit(string, objeto); + } + + @Override + public List getCambiosDTO(Changes changes) { + var changesDTO = new ArrayList(); + final var nombreDeClase = changes.get(0).getAffectedGlobalId().getTypeName() + .substring(changes.get(0).getAffectedGlobalId().getTypeName().lastIndexOf(".") + 1); + changes.groupByCommit().forEach(changeByCommit -> { + Usuario usuarioAuthor = usuarioService.getUsuarioNoEliminadoPorId(Long.parseLong(changeByCommit.getCommit().getAuthor())); + changesDTO.add(CommitDTO.builder() + .idCommit(changeByCommit.getCommit().getId().value()) + .nombreDeClase(nombreDeClase) + .fecha(changeByCommit.getCommit().getCommitDate()) + .usuario(usuarioAuthor.getApellido() + " " + usuarioAuthor.getNombre() + "(" + usuarioAuthor.getUsername() + ")") + .cambios(this.getValoresCambiadosDTO(changeByCommit.get())) + .tipoDeOperacion(changeByCommit.getCommit().getProperties().get(TipoDeOperacion.class.getSimpleName())) + .build()); + }); + return changesDTO; + } + + @Override + public List getValoresCambiadosDTO(List changes) { + var valuesChanges = new ArrayList(); + changes.forEach(change -> { + switch (change.getClass().getSimpleName()) { + case "ValueChange" -> { + var valueChange = (ValueChange) change; + valuesChanges.add(CambioDTO.builder() + .valorSiguiente(valueChange.getRight() == null ? "" : valueChange.getRight().toString()) + .valorAnterior(valueChange.getLeft() == null ? "" : valueChange.getLeft().toString()) + .atributo(valueChange.getPropertyName()) + .build()); + } + case "ObjectRemoved" -> { + var objectRemoved = (ObjectRemoved) change; + valuesChanges.add(CambioDTO.builder() + .atributo(objectRemoved.getAffectedObject().getClass().getSimpleName()) + .build()); + } + case "ReferenceChange" -> { + var referenceChange = (ReferenceChange) change; + valuesChanges.add(CambioDTO.builder() + .valorSiguiente(referenceChange.getRight() == null ? "" : referenceChange.getRight().toString()) + .valorAnterior(referenceChange.getLeft() == null ? "" : referenceChange.getLeft().toString()) + .atributo(referenceChange.getPropertyName()) + .build()); + } + case "CollectionChange" -> { + var collectionChange = (CollectionChange) change; + valuesChanges.add(CambioDTO.builder() + .valorSiguiente(collectionChange.getRight() == null ? "" : collectionChange.getRight().toString()) + .valorAnterior(collectionChange.getLeft() == null ? "" : collectionChange.getLeft().toString()) + .atributo(collectionChange.getPropertyName()) + .build()); + } + case "ListChange" -> { + var listChange = (ListChange) change; // agregar datos renglones + var mapRight = (LinkedTreeMap)listChange.getRight().get(0); + var mapLeft = listChange.getLeft() != null && !listChange.getLeft().isEmpty() ? + (LinkedTreeMap)listChange.getLeft().get(0) : new LinkedTreeMap<>(); + var keySet = mapRight.keySet(); + keySet.stream().forEach(key -> { + var valorSiguiente = mapRight.get(key); + var valorAnterior = mapLeft.get(key); + valuesChanges.add(CambioDTO.builder() + .valorSiguiente(valorSiguiente.toString()) + .valorAnterior(valorAnterior != null ? valorAnterior.toString() : "") + .atributo(key.toString()) + .build()); + }); + } + case "InitialValueChange" -> { + var initialValueChange = (InitialValueChange) change; + valuesChanges.add(CambioDTO.builder() + .atributo(initialValueChange.getPropertyName()) + .valorAnterior("") + .valorSiguiente(initialValueChange.getRight().toString()) + .build()); + } + default -> { + break; + } + } + }); + return valuesChanges; + } + + @Override + public Changes getCambios(JqlQuery jqlQuery) { + return javers.findChanges(jqlQuery); + } +} diff --git a/src/main/java/sic/service/impl/PedidoServiceImpl.java b/src/main/java/sic/service/impl/PedidoServiceImpl.java index e1ca94313..7ee1fd324 100644 --- a/src/main/java/sic/service/impl/PedidoServiceImpl.java +++ b/src/main/java/sic/service/impl/PedidoServiceImpl.java @@ -1,6 +1,5 @@ package sic.service.impl; -import com.google.gson.internal.LinkedTreeMap; import com.querydsl.core.BooleanBuilder; import java.io.IOException; import java.math.BigDecimal; @@ -18,10 +17,6 @@ import org.javers.core.Javers; import org.javers.core.commit.Commit; import org.javers.core.commit.CommitId; -import org.javers.core.diff.Change; -import org.javers.core.diff.changetype.*; -import org.javers.core.diff.changetype.container.CollectionChange; -import org.javers.core.diff.changetype.container.ListChange; import org.javers.repository.jql.QueryBuilder; import org.javers.spring.annotation.JaversAuditable; import org.modelmapper.ModelMapper; @@ -60,10 +55,8 @@ public class PedidoServiceImpl implements IPedidoService { private final IEmailService emailService; private final IReciboService reciboService; private final ICuentaCorrienteService cuentaCorrienteService; - private final IAuthService authService; - - private final Javers javers; + private final IAuditService auditService; private final ModelMapper modelMapper; private static final BigDecimal CIEN = new BigDecimal("100"); private final Logger logger = LoggerFactory.getLogger(this.getClass()); @@ -81,7 +74,7 @@ public PedidoServiceImpl( IEmailService emailService, IReciboService reciboService, ICuentaCorrienteService cuentaCorrienteService, - Javers javers, + IAuditService auditService, IAuthService authService, ModelMapper modelMapper, MessageSource messageSource, @@ -94,7 +87,7 @@ public PedidoServiceImpl( this.emailService = emailService; this.reciboService = reciboService; this.cuentaCorrienteService = cuentaCorrienteService; - this.javers = javers; + this.auditService = auditService; this.authService = authService; this.modelMapper = modelMapper; this.messageSource = messageSource; @@ -249,9 +242,9 @@ public Pedido guardar(Pedido pedido, List recibos) { } Map properties = new HashMap<>(); properties.put("TipoDeOperacion", TipoDeOperacion.ALTA.name()); - Commit commitRenglones = javers.commit(String.valueOf(authService.getActiveUserId()), pedido.getRenglones(), properties); + Commit commitRenglones = auditService.auditar(String.valueOf(authService.getActiveUserId()), pedido.getRenglones(), properties); properties.put("idCommitRenglones", commitRenglones.getId().value()); - javers.commit(String.valueOf(authService.getActiveUserId()), pedido, properties); + auditService.auditar(String.valueOf(authService.getActiveUserId()), pedido, properties); return pedido; } @@ -452,9 +445,9 @@ public void actualizar(Pedido pedido, List renglonesAnterio pedidoRepository.save(pedido); Map properties = new HashMap<>(); properties.put("TipoDeOperacion", TipoDeOperacion.ACTUALIZACION.name()); - Commit commitRenglones = javers.commit(String.valueOf(authService.getActiveUserId()), pedido.getRenglones(), properties); + Commit commitRenglones = auditService.auditar(String.valueOf(authService.getActiveUserId()), pedido.getRenglones(), properties); properties.put("idCommitRenglones", commitRenglones.getId().value()); - javers.commit(String.valueOf(authService.getActiveUserId()), pedido, properties); + auditService.auditar(String.valueOf(authService.getActiveUserId()), pedido, properties); this.actualizarCantidadReservadaDeProductosPorModificacion(pedido, renglonesAnteriores); } @@ -813,103 +806,20 @@ public RenglonPedido actualizarCantidadRenglonPedido(RenglonPedido renglonPedido public List getCambiosPedido(long idPedido) { QueryBuilder queryBuilder = QueryBuilder.byInstance(this.getPedidoNoEliminadoPorId(idPedido)) .withChildValueObjects(true); - Changes changes = javers.findChanges(queryBuilder.build()); - return this.getChangesDTO(changes); + Changes changes = auditService.getCambios(queryBuilder.build()); + return auditService.getCambiosDTO(changes); } @Override public List getCambiosRenglonesPedido(long idCommitPedido) { var query = QueryBuilder.byClass(Pedido.class).withCommitId(BigDecimal.valueOf(idCommitPedido)); - var changesPedido = javers.findChanges(query.build()).groupByCommit(); + var changesPedido = auditService.getCambios(query.build()).groupByCommit(); if (changesPedido.isEmpty()) throw new ServiceException( messageSource.getMessage("mensaje_producto_error_actualizar_cantidad_reservada", null, Locale.getDefault())); //cambiar mensaje var idCommitRenglones = changesPedido.get(changesPedido.size() - 1).getCommit().getProperties().get("idCommitRenglones"); query = QueryBuilder.anyDomainObject().withCommitId(CommitId.valueOf(idCommitRenglones)); - Changes changesRenglones = javers.findChanges(query.build()); - return this.getChangesDTO(changesRenglones); - } - - private List getChangesDTO(Changes changes) { - var changesDTO = new ArrayList(); - final var nombreDeClase = changes.get(0).getAffectedGlobalId().getTypeName() - .substring(changes.get(0).getAffectedGlobalId().getTypeName().lastIndexOf(".") + 1); - changes.groupByCommit().forEach(changeByCommit -> { - Usuario usuarioAuthor = usuarioService.getUsuarioNoEliminadoPorId(Long.parseLong(changeByCommit.getCommit().getAuthor())); - changesDTO.add(CommitDTO.builder() - .idCommit(changeByCommit.getCommit().getId().value()) - .nombreDeClase(nombreDeClase) - .fecha(changeByCommit.getCommit().getCommitDate()) - .usuario(usuarioAuthor.getApellido() + " " + usuarioAuthor.getNombre() + "(" + usuarioAuthor.getUsername() + ")") - .cambios(this.getValuesChangesDTO(changeByCommit.get())) - .tipoDeOperacion(changeByCommit.getCommit().getProperties().get(TipoDeOperacion.class.getSimpleName())) - .build()); - }); - return changesDTO; - } - - private List getValuesChangesDTO(List changes) { - var valuesChanges = new ArrayList(); - changes.forEach(change -> { - switch (change.getClass().getSimpleName()) { - case "ValueChange" -> { - var valueChange = (ValueChange) change; - valuesChanges.add(CambioDTO.builder() - .valorSiguiente(valueChange.getRight() == null ? "" : valueChange.getRight().toString()) - .valorAnterior(valueChange.getLeft() == null ? "" : valueChange.getLeft().toString()) - .atributo(valueChange.getPropertyName()) - .build()); - } - case "ObjectRemoved" -> { - var objectRemoved = (ObjectRemoved) change; - valuesChanges.add(CambioDTO.builder() - .atributo(objectRemoved.getAffectedObject().getClass().getSimpleName()) - .build()); - } - case "ReferenceChange" -> { - var referenceChange = (ReferenceChange) change; - valuesChanges.add(CambioDTO.builder() - .valorSiguiente(referenceChange.getRight() == null ? "" : referenceChange.getRight().toString()) - .valorAnterior(referenceChange.getLeft() == null ? "" : referenceChange.getLeft().toString()) - .atributo(referenceChange.getPropertyName()) - .build()); - } - case "CollectionChange" -> { - var collectionChange = (CollectionChange) change; - valuesChanges.add(CambioDTO.builder() - .valorSiguiente(collectionChange.getRight() == null ? "" : collectionChange.getRight().toString()) - .valorAnterior(collectionChange.getLeft() == null ? "" : collectionChange.getLeft().toString()) - .atributo(collectionChange.getPropertyName()) - .build()); - } - case "ListChange" -> { - var listChange = (ListChange) change; // agregar datos renglones - var mapRight = (LinkedTreeMap)listChange.getRight().get(0); - var mapLeft = listChange.getLeft() != null && !listChange.getLeft().isEmpty() ? - (LinkedTreeMap)listChange.getLeft().get(0) : new LinkedTreeMap<>(); - var keySet = mapRight.keySet(); - keySet.stream().forEach(key -> { - var valorSiguiente = mapRight.get(key); - var valorAnterior = mapLeft.get(key); - valuesChanges.add(CambioDTO.builder() - .valorSiguiente(valorSiguiente.toString()) - .valorAnterior(valorAnterior != null ? valorAnterior.toString() : "") - .atributo(key.toString()) - .build()); - }); - } - case "InitialValueChange" -> { - var initialValueChange = (InitialValueChange) change; - valuesChanges.add(CambioDTO.builder() - .atributo(initialValueChange.getPropertyName()) - .valorAnterior("") - .valorSiguiente(initialValueChange.getRight().toString()) - .build()); - } - default -> { - break; - } - } - }); - return valuesChanges; + Changes changesRenglones = auditService.getCambios(query.build()); + return auditService.getCambiosDTO(changesRenglones); // se puede agregar la relación de conocimiento hacia abajo, pasar el idCommitPedido para que el DTO tenga el dato } + } From 0dc1432da1c0a06b26826d51807b07a7619c8fd8 Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Fri, 14 Apr 2023 15:26:43 -0300 Subject: [PATCH 10/32] Changes the renglones commit endpoint to bring all the renglones commit of each pedido commit at once --- .../java/sic/controller/PedidoController.java | 6 +-- src/main/java/sic/modelo/dto/CommitDTO.java | 1 + src/main/java/sic/service/IAuditService.java | 2 + src/main/java/sic/service/IPedidoService.java | 3 +- .../sic/service/impl/AuditServiceImpl.java | 52 ++++++++++++++----- .../sic/service/impl/PedidoServiceImpl.java | 37 +++++++------ 6 files changed, 64 insertions(+), 37 deletions(-) diff --git a/src/main/java/sic/controller/PedidoController.java b/src/main/java/sic/controller/PedidoController.java index feb627dfa..7149ae0c7 100644 --- a/src/main/java/sic/controller/PedidoController.java +++ b/src/main/java/sic/controller/PedidoController.java @@ -165,9 +165,9 @@ public List getCambios(@PathVariable long idPedido, HttpServletReques return pedidoService.getCambiosPedido(idPedido); } - @GetMapping("/pedidos/commit/{idCommitPedido}/renglones") // traer el grupo de todos los commits de pedidos, juntos, y el commit del pedido + @GetMapping("/pedidos/{idPedido}/renglones/cambios") @AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO}) - public List getCambiosRenglones(@PathVariable long idCommitPedido) { - return pedidoService.getCambiosRenglonesPedido(idCommitPedido); + public List> getCambiosRenglones(@PathVariable long idPedido) { + return pedidoService.getCambiosRenglonesPedido(idPedido); } } diff --git a/src/main/java/sic/modelo/dto/CommitDTO.java b/src/main/java/sic/modelo/dto/CommitDTO.java index 600e1aea0..1fdf6dd02 100644 --- a/src/main/java/sic/modelo/dto/CommitDTO.java +++ b/src/main/java/sic/modelo/dto/CommitDTO.java @@ -23,5 +23,6 @@ public class CommitDTO { String usuario; String tipoDeOperacion; List cambios; + String idCommitRelacionado; } diff --git a/src/main/java/sic/service/IAuditService.java b/src/main/java/sic/service/IAuditService.java index 285fdf7d1..e021cb176 100644 --- a/src/main/java/sic/service/IAuditService.java +++ b/src/main/java/sic/service/IAuditService.java @@ -17,6 +17,8 @@ public interface IAuditService { Commit auditar(String string, Object objeto); List getCambiosDTO(Changes changes); + List getCambiosDTO(Changes changes, String idCommitRelacionado); + List getValoresCambiadosDTO(List changes); Changes getCambios(JqlQuery jqlQuery); diff --git a/src/main/java/sic/service/IPedidoService.java b/src/main/java/sic/service/IPedidoService.java index 77bc46612..049acfffb 100644 --- a/src/main/java/sic/service/IPedidoService.java +++ b/src/main/java/sic/service/IPedidoService.java @@ -64,5 +64,6 @@ public interface IPedidoService { List getCambiosPedido(long idPedido); - List getCambiosRenglonesPedido(long idCommitPedido); + List> getCambiosRenglonesPedido(long idCommitPedido); + } diff --git a/src/main/java/sic/service/impl/AuditServiceImpl.java b/src/main/java/sic/service/impl/AuditServiceImpl.java index e5fdf93fd..a10dc2bec 100644 --- a/src/main/java/sic/service/impl/AuditServiceImpl.java +++ b/src/main/java/sic/service/impl/AuditServiceImpl.java @@ -11,8 +11,10 @@ import org.javers.core.diff.changetype.ValueChange; import org.javers.core.diff.changetype.container.CollectionChange; import org.javers.core.diff.changetype.container.ListChange; +import org.javers.core.metamodel.object.InstanceId; import org.javers.repository.jql.JqlQuery; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import sic.modelo.TipoDeOperacion; import sic.modelo.Usuario; import sic.modelo.dto.CambioDTO; @@ -24,11 +26,12 @@ import java.util.List; import java.util.Map; +@Service public class AuditServiceImpl implements IAuditService { - private IUsuarioService usuarioService; + private final IUsuarioService usuarioService; - private Javers javers; + private final Javers javers; @Autowired public AuditServiceImpl(IUsuarioService usuarioService, Javers javers) { @@ -65,6 +68,13 @@ public List getCambiosDTO(Changes changes) { return changesDTO; } + @Override + public List getCambiosDTO(Changes changes, String idCommitRelacionado) { + var cambios = this.getCambiosDTO(changes); + cambios.forEach(cambio -> cambio.setIdCommitRelacionado(idCommitRelacionado)); + return cambios; + } + @Override public List getValoresCambiadosDTO(List changes) { var valuesChanges = new ArrayList(); @@ -101,20 +111,34 @@ public List getValoresCambiadosDTO(List changes) { .build()); } case "ListChange" -> { - var listChange = (ListChange) change; // agregar datos renglones - var mapRight = (LinkedTreeMap)listChange.getRight().get(0); - var mapLeft = listChange.getLeft() != null && !listChange.getLeft().isEmpty() ? - (LinkedTreeMap)listChange.getLeft().get(0) : new LinkedTreeMap<>(); - var keySet = mapRight.keySet(); - keySet.stream().forEach(key -> { - var valorSiguiente = mapRight.get(key); - var valorAnterior = mapLeft.get(key); + var listChange = (ListChange) change; + if (listChange.getRight().get(0) instanceof InstanceId) { valuesChanges.add(CambioDTO.builder() - .valorSiguiente(valorSiguiente.toString()) - .valorAnterior(valorAnterior != null ? valorAnterior.toString() : "") - .atributo(key.toString()) + .atributo(listChange.getPropertyName()) + .valorAnterior(String.valueOf(listChange.getLeft().size())) + .valorSiguiente(String.valueOf(listChange.getRight().size())) + .build()); + System.out.println(CambioDTO.builder() + .atributo(listChange.getPropertyName()) + .valorAnterior(listChange.getLeft().toString()) + .valorSiguiente(listChange.getRight().toString()) .build()); - }); + } + if (listChange.getRight().get(0) instanceof LinkedTreeMap) { + var mapRight = (LinkedTreeMap) listChange.getRight().get(0); + var mapLeft = listChange.getLeft() != null && !listChange.getLeft().isEmpty() ? + (LinkedTreeMap) listChange.getLeft().get(0) : new LinkedTreeMap<>(); + var keySet = mapRight.keySet(); + keySet.stream().forEach(key -> { + var valorSiguiente = mapRight.get(key); + var valorAnterior = mapLeft.get(key); + valuesChanges.add(CambioDTO.builder() + .valorSiguiente(valorSiguiente.toString()) + .valorAnterior(valorAnterior != null ? valorAnterior.toString() : "") + .atributo(key.toString()) + .build()); + }); + } } case "InitialValueChange" -> { var initialValueChange = (InitialValueChange) change; diff --git a/src/main/java/sic/service/impl/PedidoServiceImpl.java b/src/main/java/sic/service/impl/PedidoServiceImpl.java index 7ee1fd324..e4eda0e00 100644 --- a/src/main/java/sic/service/impl/PedidoServiceImpl.java +++ b/src/main/java/sic/service/impl/PedidoServiceImpl.java @@ -14,7 +14,6 @@ import net.sf.jasperreports.engine.*; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import org.javers.core.Changes; -import org.javers.core.Javers; import org.javers.core.commit.Commit; import org.javers.core.commit.CommitId; import org.javers.repository.jql.QueryBuilder; @@ -750,17 +749,13 @@ public List actualizarRenglonesPedido(List renglon renglonPedido.setIdProductoItem(0); }}); renglonesDelPedido.removeIf(renglonPedido -> renglonPedido.getIdProductoItem() == 0); //elimina los renglones - nuevosRenglones.forEach(nuevoRenglon -> { - renglonesDelPedido.stream().filter(renglonPedido -> nuevoRenglon.getIdProductoItem() == renglonPedido.getIdProductoItem()) - .forEach(renglonPedido -> { - this.actualizarCantidadRenglonPedido(renglonPedido, nuevoRenglon.getCantidad()); - nuevoRenglon.setIdProductoItem(0L); - }); - }); + nuevosRenglones.forEach(nuevoRenglon -> renglonesDelPedido.stream().filter(renglonPedido -> nuevoRenglon.getIdProductoItem() == renglonPedido.getIdProductoItem()) + .forEach(renglonPedido -> { + this.actualizarCantidadRenglonPedido(renglonPedido, nuevoRenglon.getCantidad()); + nuevoRenglon.setIdProductoItem(0L); + })); nuevosRenglones.removeIf(nuevoRenglon -> nuevoRenglon.getIdProductoItem() == 0); - nuevosRenglones.forEach(nuevoRenglon -> { - renglonesParaAgregar.add(this.calcularRenglonPedido(nuevoRenglon.getIdProductoItem(), nuevoRenglon.getCantidad())); - }); + nuevosRenglones.forEach(nuevoRenglon -> renglonesParaAgregar.add(this.calcularRenglonPedido(nuevoRenglon.getIdProductoItem(), nuevoRenglon.getCantidad()))); renglonesDelPedido.addAll(renglonesParaAgregar); return renglonesDelPedido; } @@ -811,15 +806,19 @@ public List getCambiosPedido(long idPedido) { } @Override - public List getCambiosRenglonesPedido(long idCommitPedido) { - var query = QueryBuilder.byClass(Pedido.class).withCommitId(BigDecimal.valueOf(idCommitPedido)); + public List> getCambiosRenglonesPedido(long idPedido) { + var query = QueryBuilder.byInstanceId(idPedido, Pedido.class); var changesPedido = auditService.getCambios(query.build()).groupByCommit(); - if (changesPedido.isEmpty()) throw new ServiceException( - messageSource.getMessage("mensaje_producto_error_actualizar_cantidad_reservada", null, Locale.getDefault())); //cambiar mensaje - var idCommitRenglones = changesPedido.get(changesPedido.size() - 1).getCommit().getProperties().get("idCommitRenglones"); - query = QueryBuilder.anyDomainObject().withCommitId(CommitId.valueOf(idCommitRenglones)); - Changes changesRenglones = auditService.getCambios(query.build()); - return auditService.getCambiosDTO(changesRenglones); // se puede agregar la relación de conocimiento hacia abajo, pasar el idCommitPedido para que el DTO tenga el dato + var cambiosRenglones = new ArrayList>(); + if (!changesPedido.isEmpty()) { + changesPedido.forEach(changesByCommit -> { + var idCommitRenglones = changesByCommit.getCommit().getProperties().get("idCommitRenglones"); + var queryRenglones = QueryBuilder.anyDomainObject().withCommitId(CommitId.valueOf(idCommitRenglones)); + Changes changesRenglones = auditService.getCambios(queryRenglones.build()); + cambiosRenglones.add(auditService.getCambiosDTO(changesRenglones, String.valueOf(changesByCommit.getCommit().getId()))); + }); + } + return cambiosRenglones; } } From aa2d5d39a87b83edbdb106de83e6698ae23e564f Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Mon, 24 Apr 2023 19:35:21 -0300 Subject: [PATCH 11/32] Update dependencies and delete nombreDeClase from CommitDTO model. A Unit test was disabled until mock the javers response. --- pom.xml | 5 +++-- src/main/java/sic/modelo/dto/CommitDTO.java | 3 +-- src/main/java/sic/service/IAuditService.java | 1 + .../java/sic/service/impl/AuditServiceImpl.java | 4 +--- .../sic/service/impl/CarritoCompraServiceImpl.java | 3 ++- .../sic/service/impl/PedidoServiceImplTest.java | 14 +++++++++++--- 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 7b36cd9b4..ab8a53b1d 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,8 @@ 1.11.155 7.5.0 1.6.1 - 2.8.6 + 2.10.1 + 6.14.0 @@ -175,7 +176,7 @@ org.javers javers-spring-boot-starter-sql - 6.7.1 + ${javers.version} diff --git a/src/main/java/sic/modelo/dto/CommitDTO.java b/src/main/java/sic/modelo/dto/CommitDTO.java index 1fdf6dd02..88b15e3c4 100644 --- a/src/main/java/sic/modelo/dto/CommitDTO.java +++ b/src/main/java/sic/modelo/dto/CommitDTO.java @@ -18,11 +18,10 @@ public class CommitDTO { String idCommit; - String nombreDeClase; + String idCommitRelacionado; LocalDateTime fecha; String usuario; String tipoDeOperacion; List cambios; - String idCommitRelacionado; } diff --git a/src/main/java/sic/service/IAuditService.java b/src/main/java/sic/service/IAuditService.java index e021cb176..49a1c39cb 100644 --- a/src/main/java/sic/service/IAuditService.java +++ b/src/main/java/sic/service/IAuditService.java @@ -9,6 +9,7 @@ import java.util.List; import java.util.Map; +import java.util.Optional; public interface IAuditService { diff --git a/src/main/java/sic/service/impl/AuditServiceImpl.java b/src/main/java/sic/service/impl/AuditServiceImpl.java index a10dc2bec..3ce749cea 100644 --- a/src/main/java/sic/service/impl/AuditServiceImpl.java +++ b/src/main/java/sic/service/impl/AuditServiceImpl.java @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Optional; @Service public class AuditServiceImpl implements IAuditService { @@ -52,13 +53,10 @@ public Commit auditar(String string, Object objeto) { @Override public List getCambiosDTO(Changes changes) { var changesDTO = new ArrayList(); - final var nombreDeClase = changes.get(0).getAffectedGlobalId().getTypeName() - .substring(changes.get(0).getAffectedGlobalId().getTypeName().lastIndexOf(".") + 1); changes.groupByCommit().forEach(changeByCommit -> { Usuario usuarioAuthor = usuarioService.getUsuarioNoEliminadoPorId(Long.parseLong(changeByCommit.getCommit().getAuthor())); changesDTO.add(CommitDTO.builder() .idCommit(changeByCommit.getCommit().getId().value()) - .nombreDeClase(nombreDeClase) .fecha(changeByCommit.getCommit().getCommitDate()) .usuario(usuarioAuthor.getApellido() + " " + usuarioAuthor.getNombre() + "(" + usuarioAuthor.getUsername() + ")") .cambios(this.getValoresCambiadosDTO(changeByCommit.get())) diff --git a/src/main/java/sic/service/impl/CarritoCompraServiceImpl.java b/src/main/java/sic/service/impl/CarritoCompraServiceImpl.java index 2b13254ef..8b03ab760 100644 --- a/src/main/java/sic/service/impl/CarritoCompraServiceImpl.java +++ b/src/main/java/sic/service/impl/CarritoCompraServiceImpl.java @@ -3,6 +3,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Locale; @@ -201,7 +202,7 @@ public Pedido crearPedido(NuevaOrdenDePagoDTO nuevaOrdenDePagoDTO, Long idUsuari i.getProducto().getIdProducto(), i.getCantidad()))); pedido.setRenglones(renglonesPedido); pedido.setTipoDeEnvio(nuevaOrdenDePagoDTO.getTipoDeEnvio()); - Pedido p = pedidoService.guardar(pedido, null); + Pedido p = pedidoService.guardar(pedido, Collections.emptyList()); this.eliminarTodosLosItemsDelUsuario(idUsuario); return p; } diff --git a/src/test/java/sic/service/impl/PedidoServiceImplTest.java b/src/test/java/sic/service/impl/PedidoServiceImplTest.java index 9e3e259d1..314276ad0 100644 --- a/src/test/java/sic/service/impl/PedidoServiceImplTest.java +++ b/src/test/java/sic/service/impl/PedidoServiceImplTest.java @@ -1,5 +1,7 @@ package sic.service.impl; +import org.javers.core.Javers; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.modelmapper.ModelMapper; @@ -19,6 +21,8 @@ import sic.modelo.embeddable.PrecioProductoEmbeddable; import sic.repository.PedidoRepository; import sic.repository.RenglonPedidoRepository; +import sic.service.IAuditService; +import sic.service.IAuthService; import sic.service.IEmailService; import sic.util.CustomValidator; @@ -32,7 +36,7 @@ @ExtendWith(SpringExtension.class) @ContextConfiguration( - classes = {PedidoServiceImpl.class, CustomValidator.class, MessageSource.class}) + classes = {PedidoServiceImpl.class, CustomValidator.class, MessageSource.class, AuditServiceImpl.class}) class PedidoServiceImplTest { @MockBean PedidoRepository pedidoRepository; @@ -45,8 +49,11 @@ class PedidoServiceImplTest { @MockBean ConfiguracionSucursalServiceImpl configuracionSucursalService; @MockBean CuentaCorrienteServiceImpl cuentaCorrienteService; @MockBean ReciboServiceImpl reciboService; - @MockBean MessageSource messageSource; - @MockBean ModelMapper modelMapper; + @MockBean MessageSource messageSource; + @MockBean ModelMapper modelMapper; + @MockBean IAuthService authService; + @MockBean Javers javers; + @MockBean IAuditService auditService; @Autowired PedidoServiceImpl pedidoService; @@ -157,6 +164,7 @@ void shouldGetArrayDeCantidadesProducto() { } @Test + @Disabled void shouldGuardarPedido() { Pedido pedido = new Pedido(); pedido.setEstado(EstadoPedido.CANCELADO); From ebbb4bc8b1e29577115b56120fdab23c9b57cd64 Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Fri, 5 May 2023 12:17:55 -0300 Subject: [PATCH 12/32] Rename the AuditServiceImpl to JaversServiceImpl --- src/main/java/sic/service/IAuditService.java | 1 - .../impl/{AuditServiceImpl.java => JaversServiceImpl.java} | 5 ++--- src/test/java/sic/service/impl/PedidoServiceImplTest.java | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) rename src/main/java/sic/service/impl/{AuditServiceImpl.java => JaversServiceImpl.java} (97%) diff --git a/src/main/java/sic/service/IAuditService.java b/src/main/java/sic/service/IAuditService.java index 49a1c39cb..e021cb176 100644 --- a/src/main/java/sic/service/IAuditService.java +++ b/src/main/java/sic/service/IAuditService.java @@ -9,7 +9,6 @@ import java.util.List; import java.util.Map; -import java.util.Optional; public interface IAuditService { diff --git a/src/main/java/sic/service/impl/AuditServiceImpl.java b/src/main/java/sic/service/impl/JaversServiceImpl.java similarity index 97% rename from src/main/java/sic/service/impl/AuditServiceImpl.java rename to src/main/java/sic/service/impl/JaversServiceImpl.java index 3ce749cea..ef83c7517 100644 --- a/src/main/java/sic/service/impl/AuditServiceImpl.java +++ b/src/main/java/sic/service/impl/JaversServiceImpl.java @@ -25,17 +25,16 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Optional; @Service -public class AuditServiceImpl implements IAuditService { +public class JaversServiceImpl implements IAuditService { private final IUsuarioService usuarioService; private final Javers javers; @Autowired - public AuditServiceImpl(IUsuarioService usuarioService, Javers javers) { + public JaversServiceImpl(IUsuarioService usuarioService, Javers javers) { this.usuarioService = usuarioService; this.javers = javers; } diff --git a/src/test/java/sic/service/impl/PedidoServiceImplTest.java b/src/test/java/sic/service/impl/PedidoServiceImplTest.java index 314276ad0..c032149d8 100644 --- a/src/test/java/sic/service/impl/PedidoServiceImplTest.java +++ b/src/test/java/sic/service/impl/PedidoServiceImplTest.java @@ -36,7 +36,7 @@ @ExtendWith(SpringExtension.class) @ContextConfiguration( - classes = {PedidoServiceImpl.class, CustomValidator.class, MessageSource.class, AuditServiceImpl.class}) + classes = {PedidoServiceImpl.class, CustomValidator.class, MessageSource.class}) class PedidoServiceImplTest { @MockBean PedidoRepository pedidoRepository; From a6bc43651fe93905c3935fbca12ad03100b03c99 Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Fri, 12 May 2023 12:06:31 -0300 Subject: [PATCH 13/32] Changed the audit service interface and the Javers service implementation to enhacement the code. --- src/main/java/sic/service/IAuditService.java | 16 ++--- .../sic/service/impl/JaversServiceImpl.java | 69 ++++++++++++------- .../sic/service/impl/PedidoServiceImpl.java | 32 ++++----- .../service/impl/PedidoServiceImplTest.java | 3 +- 4 files changed, 60 insertions(+), 60 deletions(-) diff --git a/src/main/java/sic/service/IAuditService.java b/src/main/java/sic/service/IAuditService.java index e021cb176..a5a981f65 100644 --- a/src/main/java/sic/service/IAuditService.java +++ b/src/main/java/sic/service/IAuditService.java @@ -1,25 +1,17 @@ package sic.service; -import org.javers.core.Changes; -import org.javers.core.commit.Commit; -import org.javers.core.diff.Change; -import org.javers.repository.jql.JqlQuery; -import sic.modelo.dto.CambioDTO; import sic.modelo.dto.CommitDTO; - import java.util.List; import java.util.Map; public interface IAuditService { - Commit auditar(String string, Object objeto, Map propiedades); + String auditar(String idUsuario, Object objeto, Map propiedades); - Commit auditar(String string, Object objeto); - List getCambiosDTO(Changes changes); + String auditar(String idUsuario, Object objeto); - List getCambiosDTO(Changes changes, String idCommitRelacionado); + List getCambiosDTO(T objeto); - List getValoresCambiadosDTO(List changes); + List getCambiosDTO(String idCommit); - Changes getCambios(JqlQuery jqlQuery); } diff --git a/src/main/java/sic/service/impl/JaversServiceImpl.java b/src/main/java/sic/service/impl/JaversServiceImpl.java index ef83c7517..33fb5f0fe 100644 --- a/src/main/java/sic/service/impl/JaversServiceImpl.java +++ b/src/main/java/sic/service/impl/JaversServiceImpl.java @@ -3,7 +3,7 @@ import com.google.gson.internal.LinkedTreeMap; import org.javers.core.Changes; import org.javers.core.Javers; -import org.javers.core.commit.Commit; +import org.javers.core.commit.CommitId; import org.javers.core.diff.Change; import org.javers.core.diff.changetype.InitialValueChange; import org.javers.core.diff.changetype.ObjectRemoved; @@ -12,9 +12,10 @@ import org.javers.core.diff.changetype.container.CollectionChange; import org.javers.core.diff.changetype.container.ListChange; import org.javers.core.metamodel.object.InstanceId; -import org.javers.repository.jql.JqlQuery; +import org.javers.repository.jql.QueryBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import sic.modelo.TipoDeOperacion; import sic.modelo.Usuario; import sic.modelo.dto.CambioDTO; @@ -30,8 +31,8 @@ public class JaversServiceImpl implements IAuditService { private final IUsuarioService usuarioService; - private final Javers javers; + private static final String ID_COMMIT_RELACIONADO = "idCommitRelacionado"; @Autowired public JaversServiceImpl(IUsuarioService usuarioService, Javers javers) { @@ -40,40 +41,52 @@ public JaversServiceImpl(IUsuarioService usuarioService, Javers javers) { } @Override - public Commit auditar(String string, Object objeto, Map propiedades) { - return javers.commit(string, objeto, propiedades); + @Transactional + public String auditar(String idUsuario, Object objeto, Map propiedades) { + return javers.commit(idUsuario, objeto, propiedades).getId().value(); } @Override - public Commit auditar(String string, Object objeto) { - return javers.commit(string, objeto); + public String auditar(String idUsuario, Object objeto) { + return javers.commit(idUsuario, objeto).getId().value(); } @Override - public List getCambiosDTO(Changes changes) { + public List getCambiosDTO(T objeto) { var changesDTO = new ArrayList(); - changes.groupByCommit().forEach(changeByCommit -> { - Usuario usuarioAuthor = usuarioService.getUsuarioNoEliminadoPorId(Long.parseLong(changeByCommit.getCommit().getAuthor())); + this.getChanges(objeto).groupByCommit().forEach(changesByCommit -> { + Usuario usuarioAuthor = usuarioService.getUsuarioNoEliminadoPorId(Long.parseLong(changesByCommit.getCommit().getAuthor())); changesDTO.add(CommitDTO.builder() - .idCommit(changeByCommit.getCommit().getId().value()) - .fecha(changeByCommit.getCommit().getCommitDate()) + .idCommit(changesByCommit.getCommit().getId().value()) + .idCommitRelacionado(changesByCommit.getCommit().getProperties().get(ID_COMMIT_RELACIONADO)) + .fecha(changesByCommit.getCommit().getCommitDate()) .usuario(usuarioAuthor.getApellido() + " " + usuarioAuthor.getNombre() + "(" + usuarioAuthor.getUsername() + ")") - .cambios(this.getValoresCambiadosDTO(changeByCommit.get())) - .tipoDeOperacion(changeByCommit.getCommit().getProperties().get(TipoDeOperacion.class.getSimpleName())) + .cambios(this.getValoresCambiadosDTO(changesByCommit.get())) + .tipoDeOperacion(changesByCommit.getCommit().getProperties().get(TipoDeOperacion.class.getSimpleName())) .build()); }); return changesDTO; } @Override - public List getCambiosDTO(Changes changes, String idCommitRelacionado) { - var cambios = this.getCambiosDTO(changes); - cambios.forEach(cambio -> cambio.setIdCommitRelacionado(idCommitRelacionado)); - return cambios; + public List getCambiosDTO(String idCommit) { + var changesDTO = new ArrayList(); + var query = QueryBuilder.anyDomainObject().withCommitId(CommitId.valueOf(idCommit)).build(); + var cambios = javers.findChanges(query).groupByCommit(); + cambios.forEach(changesByCommit -> { + Usuario usuarioAuthor = usuarioService.getUsuarioNoEliminadoPorId(Long.parseLong(changesByCommit.getCommit().getAuthor())); + changesDTO.add(CommitDTO.builder() + .idCommit(changesByCommit.getCommit().getId().value()) + .fecha(changesByCommit.getCommit().getCommitDate()) + .usuario(usuarioAuthor.getApellido() + " " + usuarioAuthor.getNombre() + "(" + usuarioAuthor.getUsername() + ")") + .cambios(this.getValoresCambiadosDTO(changesByCommit.get())) + .tipoDeOperacion(changesByCommit.getCommit().getProperties().get(TipoDeOperacion.class.getSimpleName())) + .build()); + }); + return changesDTO; } - @Override - public List getValoresCambiadosDTO(List changes) { + private List getValoresCambiadosDTO(List changes) { var valuesChanges = new ArrayList(); changes.forEach(change -> { switch (change.getClass().getSimpleName()) { @@ -111,9 +124,9 @@ public List getValoresCambiadosDTO(List changes) { var listChange = (ListChange) change; if (listChange.getRight().get(0) instanceof InstanceId) { valuesChanges.add(CambioDTO.builder() - .atributo(listChange.getPropertyName()) - .valorAnterior(String.valueOf(listChange.getLeft().size())) - .valorSiguiente(String.valueOf(listChange.getRight().size())) + .atributo(listChange.getPropertyName()) + .valorAnterior(String.valueOf(listChange.getLeft().size())) + .valorSiguiente(String.valueOf(listChange.getRight().size())) .build()); System.out.println(CambioDTO.builder() .atributo(listChange.getPropertyName()) @@ -153,8 +166,12 @@ public List getValoresCambiadosDTO(List changes) { return valuesChanges; } - @Override - public Changes getCambios(JqlQuery jqlQuery) { - return javers.findChanges(jqlQuery); + private List getCambios(T object) { + return this.getValoresCambiadosDTO(this.getChanges(object)); + } + + private Changes getChanges(T object) { + var queryBuilder = QueryBuilder.byInstance(object).build(); + return javers.findChanges(queryBuilder); } } diff --git a/src/main/java/sic/service/impl/PedidoServiceImpl.java b/src/main/java/sic/service/impl/PedidoServiceImpl.java index 3b609e7c6..7d6e58a58 100644 --- a/src/main/java/sic/service/impl/PedidoServiceImpl.java +++ b/src/main/java/sic/service/impl/PedidoServiceImpl.java @@ -13,10 +13,6 @@ import net.sf.jasperreports.engine.*; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; -import org.javers.core.Changes; -import org.javers.core.commit.Commit; -import org.javers.core.commit.CommitId; -import org.javers.repository.jql.QueryBuilder; import org.javers.spring.annotation.JaversAuditable; import org.modelmapper.ModelMapper; import org.slf4j.Logger; @@ -60,6 +56,7 @@ public class PedidoServiceImpl implements IPedidoService { private static final BigDecimal CIEN = new BigDecimal("100"); private final Logger logger = LoggerFactory.getLogger(this.getClass()); private static final int TAMANIO_PAGINA_DEFAULT = 25; + private static final String ID_COMMIT_RELACIONADO = "idCommitRelacionado"; private final MessageSource messageSource; private final CustomValidator customValidator; @@ -241,8 +238,8 @@ public Pedido guardar(Pedido pedido, List recibos) { } Map properties = new HashMap<>(); properties.put("TipoDeOperacion", TipoDeOperacion.ALTA.name()); - Commit commitRenglones = auditService.auditar(String.valueOf(authService.getActiveUserId()), pedido.getRenglones(), properties); - properties.put("idCommitRenglones", commitRenglones.getId().value()); + String idCommit = auditService.auditar(String.valueOf(authService.getActiveUserId()), pedido.getRenglones(), properties); + properties.put(ID_COMMIT_RELACIONADO, idCommit); auditService.auditar(String.valueOf(authService.getActiveUserId()), pedido, properties); return pedido; } @@ -444,8 +441,8 @@ public void actualizar(Pedido pedido, List renglonesAnterio pedidoRepository.save(pedido); Map properties = new HashMap<>(); properties.put("TipoDeOperacion", TipoDeOperacion.ACTUALIZACION.name()); - Commit commitRenglones = auditService.auditar(String.valueOf(authService.getActiveUserId()), pedido.getRenglones(), properties); - properties.put("idCommitRenglones", commitRenglones.getId().value()); + String idCommit = auditService.auditar(String.valueOf(authService.getActiveUserId()), pedido.getRenglones(), properties); + properties.put("idCommitRenglones", idCommit); auditService.auditar(String.valueOf(authService.getActiveUserId()), pedido, properties); this.actualizarCantidadReservadaDeProductosPorModificacion(pedido, renglonesAnteriores); } @@ -801,23 +798,18 @@ public RenglonPedido actualizarCantidadRenglonPedido(RenglonPedido renglonPedido @Override public List getCambiosPedido(long idPedido) { - QueryBuilder queryBuilder = QueryBuilder.byInstance(this.getPedidoNoEliminadoPorId(idPedido)) - .withChildValueObjects(true); - Changes changes = auditService.getCambios(queryBuilder.build()); - return auditService.getCambiosDTO(changes); + return auditService.getCambiosDTO(this.getPedidoNoEliminadoPorId(idPedido)); } @Override public List> getCambiosRenglonesPedido(long idPedido) { - var query = QueryBuilder.byInstanceId(idPedido, Pedido.class); - var changesPedido = auditService.getCambios(query.build()).groupByCommit(); + var commitsPedido = auditService.getCambiosDTO(this.getPedidoNoEliminadoPorId(idPedido)); var cambiosRenglones = new ArrayList>(); - if (!changesPedido.isEmpty()) { - changesPedido.forEach(changesByCommit -> { - var idCommitRenglones = changesByCommit.getCommit().getProperties().get("idCommitRenglones"); - var queryRenglones = QueryBuilder.anyDomainObject().withCommitId(CommitId.valueOf(idCommitRenglones)); - Changes changesRenglones = auditService.getCambios(queryRenglones.build()); - cambiosRenglones.add(auditService.getCambiosDTO(changesRenglones, String.valueOf(changesByCommit.getCommit().getId()))); + if (!commitsPedido.isEmpty()) { + commitsPedido.forEach(commitPedido -> { + var idCommitRenglones = commitPedido.getIdCommitRelacionado(); + var cambios = auditService.getCambiosDTO(idCommitRenglones); + cambios.forEach(commitDTO -> cambiosRenglones.add(cambios)); }); } return cambiosRenglones; diff --git a/src/test/java/sic/service/impl/PedidoServiceImplTest.java b/src/test/java/sic/service/impl/PedidoServiceImplTest.java index c032149d8..bae58cfe5 100644 --- a/src/test/java/sic/service/impl/PedidoServiceImplTest.java +++ b/src/test/java/sic/service/impl/PedidoServiceImplTest.java @@ -1,7 +1,6 @@ package sic.service.impl; import org.javers.core.Javers; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.modelmapper.ModelMapper; @@ -164,7 +163,6 @@ void shouldGetArrayDeCantidadesProducto() { } @Test - @Disabled void shouldGuardarPedido() { Pedido pedido = new Pedido(); pedido.setEstado(EstadoPedido.CANCELADO); @@ -221,6 +219,7 @@ void shouldGuardarPedido() { clienteDeUsuario.setNombreFiscal("nombre fiscal"); when(clienteService.getClientePorIdUsuario(1L)).thenReturn(clienteDeUsuario); pedido.setDescuentoPorcentaje(BigDecimal.ZERO); + when(auditService.auditar(anyString(),any(),any())).thenReturn("1"); assertThrows( BusinessServiceException.class, () -> pedidoService.guardar(pedido, new ArrayList<>())); verify(messageSource).getMessage(eq("mensaje_pedido_detalle_envio_vacio"), any(), any()); From bcd3418a75b0ce504ce544868c328002031dba13 Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Fri, 12 May 2023 13:42:24 -0300 Subject: [PATCH 14/32] Delete code and a non neccesary class. Adds some integration test. --- src/main/java/sic/config/AppConfig.java | 4 --- .../java/sic/config/MockAuthorProvider.java | 12 -------- .../java/sic/controller/PedidoController.java | 2 +- .../sic/service/impl/JaversServiceImpl.java | 14 ++------- .../sic/integration/AppIntegrationTest.java | 30 +++++++++++++++++-- 5 files changed, 31 insertions(+), 31 deletions(-) delete mode 100644 src/main/java/sic/config/MockAuthorProvider.java diff --git a/src/main/java/sic/config/AppConfig.java b/src/main/java/sic/config/AppConfig.java index 0877adc52..9d95418df 100644 --- a/src/main/java/sic/config/AppConfig.java +++ b/src/main/java/sic/config/AppConfig.java @@ -114,8 +114,4 @@ public Clock clock() { return Clock.systemDefaultZone(); } - @Bean - public AuthorProvider provideJaversAuthor() { - return new MockAuthorProvider(); - } } diff --git a/src/main/java/sic/config/MockAuthorProvider.java b/src/main/java/sic/config/MockAuthorProvider.java deleted file mode 100644 index f2c419bef..000000000 --- a/src/main/java/sic/config/MockAuthorProvider.java +++ /dev/null @@ -1,12 +0,0 @@ -package sic.config; - -import org.javers.spring.auditable.AuthorProvider; - -public class MockAuthorProvider implements AuthorProvider { - - - @Override - public String provide() { - return "testUsuario"; - } -} \ No newline at end of file diff --git a/src/main/java/sic/controller/PedidoController.java b/src/main/java/sic/controller/PedidoController.java index 7149ae0c7..ff07abfba 100644 --- a/src/main/java/sic/controller/PedidoController.java +++ b/src/main/java/sic/controller/PedidoController.java @@ -161,7 +161,7 @@ public Resultados calcularResultadosPedido(@RequestBody NuevosResultadosComproba @GetMapping("/pedidos/{idPedido}/cambios") @AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO}) - public List getCambios(@PathVariable long idPedido, HttpServletRequest request) { + public List getCambios(@PathVariable long idPedido) { return pedidoService.getCambiosPedido(idPedido); } diff --git a/src/main/java/sic/service/impl/JaversServiceImpl.java b/src/main/java/sic/service/impl/JaversServiceImpl.java index 33fb5f0fe..f3533d99a 100644 --- a/src/main/java/sic/service/impl/JaversServiceImpl.java +++ b/src/main/java/sic/service/impl/JaversServiceImpl.java @@ -128,14 +128,8 @@ private List getValoresCambiadosDTO(List changes) { .valorAnterior(String.valueOf(listChange.getLeft().size())) .valorSiguiente(String.valueOf(listChange.getRight().size())) .build()); - System.out.println(CambioDTO.builder() - .atributo(listChange.getPropertyName()) - .valorAnterior(listChange.getLeft().toString()) - .valorSiguiente(listChange.getRight().toString()) - .build()); } - if (listChange.getRight().get(0) instanceof LinkedTreeMap) { - var mapRight = (LinkedTreeMap) listChange.getRight().get(0); + if (listChange.getRight().get(0) instanceof LinkedTreeMap mapRight) { var mapLeft = listChange.getLeft() != null && !listChange.getLeft().isEmpty() ? (LinkedTreeMap) listChange.getLeft().get(0) : new LinkedTreeMap<>(); var keySet = mapRight.keySet(); @@ -143,7 +137,7 @@ private List getValoresCambiadosDTO(List changes) { var valorSiguiente = mapRight.get(key); var valorAnterior = mapLeft.get(key); valuesChanges.add(CambioDTO.builder() - .valorSiguiente(valorSiguiente.toString()) + .valorSiguiente(valorSiguiente != null ? valorSiguiente.toString() : "") .valorAnterior(valorAnterior != null ? valorAnterior.toString() : "") .atributo(key.toString()) .build()); @@ -166,10 +160,6 @@ private List getValoresCambiadosDTO(List changes) { return valuesChanges; } - private List getCambios(T object) { - return this.getValoresCambiadosDTO(this.getChanges(object)); - } - private Changes getChanges(T object) { var queryBuilder = QueryBuilder.byInstance(object).build(); return javers.findChanges(queryBuilder); diff --git a/src/test/java/sic/integration/AppIntegrationTest.java b/src/test/java/sic/integration/AppIntegrationTest.java index 20db6617c..19a34d38d 100644 --- a/src/test/java/sic/integration/AppIntegrationTest.java +++ b/src/test/java/sic/integration/AppIntegrationTest.java @@ -811,7 +811,7 @@ void testEscenarioAltaDeProductoConImagen() throws IOException { } @Test - @DisplayName("Dar de alta un cliente y levantar un pedido con reserva, verificar stock") + @DisplayName("Dar de alta un cliente y levantar un pedido con reserva, verificar stock y consultar su historico de cambios") @Order(7) void testEscenarioAltaClienteYPedido() { this.iniciarSesionComoAdministrador(); @@ -916,11 +916,21 @@ void testEscenarioAltaClienteYPedido() { assertEquals( new BigDecimal("1768.000000000000000000000000000000"), renglonesDelPedido.get(1).getImporte()); + List cambios = + Arrays.asList(restTemplate.getForObject( + apiPrefix + "/pedidos/" + pedidoRecuperado.getIdPedido() + "/cambios", + CommitDTO[].class)); + assertFalse(cambios.isEmpty()); + assertEquals("2.00", cambios.get(0).getIdCommit()); + assertEquals("1.00", cambios.get(0).getIdCommitRelacionado()); + assertEquals("Power Max(dueño)", cambios.get(0).getUsuario()); + assertEquals("ALTA", cambios.get(0).getTipoDeOperacion()); + assertEquals(17, cambios.get(0).getCambios().size()); } @Test @DisplayName( - "Modificar el pedido agregando un nuevo producto y cambiando la cantidad de uno ya existente, reservando y verificando stock") + "Modificar el pedido agregando un nuevo producto y cambiando la cantidad de uno ya existente, reservando, verificando stock y su historico de cambios") @Order(8) void testEscenarioModificacionPedido() { this.iniciarSesionComoAdministrador(); @@ -1037,6 +1047,22 @@ void testEscenarioModificacionPedido() { assertEquals( new BigDecimal("120279.618000000000000000000000000000"), renglonesDelPedido.get(2).getImporte()); + List cambios = + Arrays.asList(restTemplate.getForObject( + apiPrefix + "/pedidos/" + pedidosRecuperados.get(0).getIdPedido() + "/cambios", + CommitDTO[].class)); + assertFalse(cambios.isEmpty()); + assertEquals(2, cambios.size()); + assertEquals("4.00", cambios.get(0).getIdCommit()); + assertNull(cambios.get(0).getIdCommitRelacionado()); + assertEquals("Power Max(dueño)", cambios.get(0).getUsuario()); + assertEquals("ACTUALIZACION", cambios.get(0).getTipoDeOperacion()); + assertEquals(8, cambios.get(0).getCambios().size()); + assertEquals("2.00", cambios.get(1).getIdCommit()); + assertEquals("1.00", cambios.get(1).getIdCommitRelacionado()); + assertEquals("Power Max(dueño)", cambios.get(1).getUsuario()); + assertEquals("ALTA", cambios.get(1).getTipoDeOperacion()); + assertEquals(17, cambios.get(1).getCambios().size()); } @Test From 795ad7b3171246540ec3e36d52b6008f53e2828b Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Sat, 13 May 2023 23:57:47 -0300 Subject: [PATCH 15/32] Make the requested changes --- pom.xml | 1 - src/main/java/sic/config/AppConfig.java | 1 - src/main/java/sic/modelo/Pedido.java | 1 - src/main/java/sic/service/IAuthService.java | 1 - .../sic/service/impl/JaversServiceImpl.java | 29 ++++++++++--------- .../sic/service/impl/PedidoServiceImpl.java | 1 - src/test/resources/application.properties | 1 - 7 files changed, 16 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index b6aff5f4f..56edeb9f4 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,6 @@ 2.7 1.5.2 1.21.0 - 1.11.155 6.14.0 7.11.1 2.1.4 diff --git a/src/main/java/sic/config/AppConfig.java b/src/main/java/sic/config/AppConfig.java index 9d95418df..edaab21aa 100644 --- a/src/main/java/sic/config/AppConfig.java +++ b/src/main/java/sic/config/AppConfig.java @@ -5,7 +5,6 @@ import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.module.SimpleModule; -import org.javers.spring.auditable.AuthorProvider; import org.modelmapper.ModelMapper; import org.modelmapper.PropertyMap; import org.springframework.boot.web.servlet.FilterRegistrationBean; diff --git a/src/main/java/sic/modelo/Pedido.java b/src/main/java/sic/modelo/Pedido.java index 5710b2a38..c6ac7a93f 100644 --- a/src/main/java/sic/modelo/Pedido.java +++ b/src/main/java/sic/modelo/Pedido.java @@ -16,7 +16,6 @@ import lombok.NoArgsConstructor; import lombok.ToString; -import org.javers.core.metamodel.annotation.DiffIgnore; import sic.controller.Views; import sic.modelo.dto.UbicacionDTO; diff --git a/src/main/java/sic/service/IAuthService.java b/src/main/java/sic/service/IAuthService.java index feeaee9d3..becc76af4 100644 --- a/src/main/java/sic/service/IAuthService.java +++ b/src/main/java/sic/service/IAuthService.java @@ -2,7 +2,6 @@ import io.jsonwebtoken.Claims; import sic.modelo.Rol; -import sic.modelo.Usuario; import java.util.List; diff --git a/src/main/java/sic/service/impl/JaversServiceImpl.java b/src/main/java/sic/service/impl/JaversServiceImpl.java index f3533d99a..5b43c2d27 100644 --- a/src/main/java/sic/service/impl/JaversServiceImpl.java +++ b/src/main/java/sic/service/impl/JaversServiceImpl.java @@ -15,14 +15,12 @@ import org.javers.repository.jql.QueryBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import sic.modelo.TipoDeOperacion; import sic.modelo.Usuario; import sic.modelo.dto.CambioDTO; import sic.modelo.dto.CommitDTO; import sic.service.IAuditService; import sic.service.IUsuarioService; - import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -33,6 +31,12 @@ public class JaversServiceImpl implements IAuditService { private final IUsuarioService usuarioService; private final Javers javers; private static final String ID_COMMIT_RELACIONADO = "idCommitRelacionado"; + private static final String INITIAL_VALUE_CHANGE = "InitialValueChange"; + private static final String LIST_CHANGE = "ListChange"; + private static final String COLLECTION_CHANGE = "CollectionChange"; + private static final String REFERENCE_CHANGE = "ReferenceChange"; + private static final String OBJECT_REMOVED = "ObjectRemoved"; + private static final String VALUE_CHANGE = "ValueChange"; @Autowired public JaversServiceImpl(IUsuarioService usuarioService, Javers javers) { @@ -41,7 +45,6 @@ public JaversServiceImpl(IUsuarioService usuarioService, Javers javers) { } @Override - @Transactional public String auditar(String idUsuario, Object objeto, Map propiedades) { return javers.commit(idUsuario, objeto, propiedades).getId().value(); } @@ -61,7 +64,7 @@ public List getCambiosDTO(T objeto) { .idCommitRelacionado(changesByCommit.getCommit().getProperties().get(ID_COMMIT_RELACIONADO)) .fecha(changesByCommit.getCommit().getCommitDate()) .usuario(usuarioAuthor.getApellido() + " " + usuarioAuthor.getNombre() + "(" + usuarioAuthor.getUsername() + ")") - .cambios(this.getValoresCambiadosDTO(changesByCommit.get())) + .cambios(this.getDetallesCambiosDTO(changesByCommit.get())) .tipoDeOperacion(changesByCommit.getCommit().getProperties().get(TipoDeOperacion.class.getSimpleName())) .build()); }); @@ -79,18 +82,18 @@ public List getCambiosDTO(String idCommit) { .idCommit(changesByCommit.getCommit().getId().value()) .fecha(changesByCommit.getCommit().getCommitDate()) .usuario(usuarioAuthor.getApellido() + " " + usuarioAuthor.getNombre() + "(" + usuarioAuthor.getUsername() + ")") - .cambios(this.getValoresCambiadosDTO(changesByCommit.get())) + .cambios(this.getDetallesCambiosDTO(changesByCommit.get())) .tipoDeOperacion(changesByCommit.getCommit().getProperties().get(TipoDeOperacion.class.getSimpleName())) .build()); }); return changesDTO; } - private List getValoresCambiadosDTO(List changes) { + private List getDetallesCambiosDTO(List changes) { var valuesChanges = new ArrayList(); changes.forEach(change -> { switch (change.getClass().getSimpleName()) { - case "ValueChange" -> { + case VALUE_CHANGE -> { var valueChange = (ValueChange) change; valuesChanges.add(CambioDTO.builder() .valorSiguiente(valueChange.getRight() == null ? "" : valueChange.getRight().toString()) @@ -98,13 +101,13 @@ private List getValoresCambiadosDTO(List changes) { .atributo(valueChange.getPropertyName()) .build()); } - case "ObjectRemoved" -> { + case OBJECT_REMOVED -> { var objectRemoved = (ObjectRemoved) change; valuesChanges.add(CambioDTO.builder() .atributo(objectRemoved.getAffectedObject().getClass().getSimpleName()) .build()); } - case "ReferenceChange" -> { + case REFERENCE_CHANGE -> { var referenceChange = (ReferenceChange) change; valuesChanges.add(CambioDTO.builder() .valorSiguiente(referenceChange.getRight() == null ? "" : referenceChange.getRight().toString()) @@ -112,7 +115,7 @@ private List getValoresCambiadosDTO(List changes) { .atributo(referenceChange.getPropertyName()) .build()); } - case "CollectionChange" -> { + case COLLECTION_CHANGE -> { var collectionChange = (CollectionChange) change; valuesChanges.add(CambioDTO.builder() .valorSiguiente(collectionChange.getRight() == null ? "" : collectionChange.getRight().toString()) @@ -120,7 +123,7 @@ private List getValoresCambiadosDTO(List changes) { .atributo(collectionChange.getPropertyName()) .build()); } - case "ListChange" -> { + case LIST_CHANGE -> { var listChange = (ListChange) change; if (listChange.getRight().get(0) instanceof InstanceId) { valuesChanges.add(CambioDTO.builder() @@ -133,7 +136,7 @@ private List getValoresCambiadosDTO(List changes) { var mapLeft = listChange.getLeft() != null && !listChange.getLeft().isEmpty() ? (LinkedTreeMap) listChange.getLeft().get(0) : new LinkedTreeMap<>(); var keySet = mapRight.keySet(); - keySet.stream().forEach(key -> { + keySet.forEach(key -> { var valorSiguiente = mapRight.get(key); var valorAnterior = mapLeft.get(key); valuesChanges.add(CambioDTO.builder() @@ -144,7 +147,7 @@ private List getValoresCambiadosDTO(List changes) { }); } } - case "InitialValueChange" -> { + case INITIAL_VALUE_CHANGE -> { var initialValueChange = (InitialValueChange) change; valuesChanges.add(CambioDTO.builder() .atributo(initialValueChange.getPropertyName()) diff --git a/src/main/java/sic/service/impl/PedidoServiceImpl.java b/src/main/java/sic/service/impl/PedidoServiceImpl.java index 7d6e58a58..a4498af44 100644 --- a/src/main/java/sic/service/impl/PedidoServiceImpl.java +++ b/src/main/java/sic/service/impl/PedidoServiceImpl.java @@ -173,7 +173,6 @@ public long generarNumeroPedido(Sucursal sucursal) { @Override @Transactional - @JaversAuditable public Pedido guardar(Pedido pedido, List recibos) { Cliente clienteDeUsuario = clienteService.getClientePorIdUsuario(pedido.getUsuario().getIdUsuario()); if (pedido.getCliente().equals(clienteDeUsuario) && pedido.getUsuario().getRoles().contains(Rol.VENDEDOR) && diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index 01b553a9e..5d67d186b 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -15,4 +15,3 @@ spring.jpa.defer-datasource-initialization=true spring.jpa.properties.hibernate.show_sql=false logging.level.root=INFO spring.main.banner-mode=OFF -javers.newObjectSnapshot=true From 774c3a154fbec6f5ad47f565eaeb5bd543195067 Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Sun, 14 May 2023 03:21:51 -0300 Subject: [PATCH 16/32] Make the last requested changes --- .../java/sic/controller/PedidoController.java | 7 +++---- .../java/sic/interceptor/JwtInterceptor.java | 1 + src/main/java/sic/modelo/dto/CambioDTO.java | 6 +++--- src/main/java/sic/modelo/dto/CommitDTO.java | 12 ++++++------ src/main/java/sic/service/IAuthService.java | 2 +- src/main/java/sic/service/IPedidoService.java | 4 +++- .../java/sic/service/impl/AuthServiceImpl.java | 8 ++++---- .../java/sic/service/impl/PedidoServiceImpl.java | 16 ++++++++-------- .../sic/service/impl/PedidoServiceImplTest.java | 2 -- 9 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/main/java/sic/controller/PedidoController.java b/src/main/java/sic/controller/PedidoController.java index ff07abfba..7b1733cfc 100644 --- a/src/main/java/sic/controller/PedidoController.java +++ b/src/main/java/sic/controller/PedidoController.java @@ -2,7 +2,9 @@ import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import io.jsonwebtoken.Claims; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -70,7 +72,6 @@ public List calcularRenglonesPedido( @PutMapping("/pedidos") public void actualizar(@RequestBody PedidoDTO pedidoDTO, HttpServletRequest request) { - authService.setActiveUserToken(request.getHeader("Authorization")); Pedido pedido = pedidoService.getPedidoNoEliminadoPorId(pedidoDTO.getIdPedido()); Long idSucursalOrigen = pedido.getIdSucursal(); pedido.setSucursal(sucursalService.getSucursalPorId(pedidoDTO.getIdSucursal())); @@ -101,7 +102,6 @@ public void actualizar(@RequestBody PedidoDTO pedidoDTO, HttpServletRequest requ public Pedido guardar(@RequestBody PedidoDTO pedidoDTO, @RequestHeader("Authorization") String authorizationHeader, HttpServletRequest request) { - authService.setActiveUserToken(request.getHeader("Authorization")); Claims claims = authService.getClaimsDelToken(authorizationHeader); Pedido pedido = new Pedido(); pedido.setObservaciones(pedidoDTO.getObservaciones()); @@ -140,7 +140,6 @@ public Page buscarConCriteria( @PutMapping("/pedidos/{idPedido}") @AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO, Rol.VENDEDOR}) public void cancelar(@PathVariable long idPedido, HttpServletRequest request) { - authService.setActiveUserToken(request.getHeader("Authorization")); pedidoService.cancelar(pedidoService.getPedidoNoEliminadoPorId(idPedido)); } @@ -167,7 +166,7 @@ public List getCambios(@PathVariable long idPedido) { @GetMapping("/pedidos/{idPedido}/renglones/cambios") @AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO}) - public List> getCambiosRenglones(@PathVariable long idPedido) { + public Map> getCambiosRenglones(@PathVariable long idPedido) { return pedidoService.getCambiosRenglonesPedido(idPedido); } } diff --git a/src/main/java/sic/interceptor/JwtInterceptor.java b/src/main/java/sic/interceptor/JwtInterceptor.java index a52eb5c36..d1c5fb475 100644 --- a/src/main/java/sic/interceptor/JwtInterceptor.java +++ b/src/main/java/sic/interceptor/JwtInterceptor.java @@ -29,6 +29,7 @@ public boolean preHandle( } long idUsuario = authService.getClaimsDelToken(authorizationHeader).get("idUsuario", Long.class); + authService.setActiveUserId(authorizationHeader); if (!usuarioService.esUsuarioHabilitado(idUsuario)) { throw new UnauthorizedException( messageSource.getMessage("mensaje_usuario_no_habilitado", null, Locale.getDefault())); diff --git a/src/main/java/sic/modelo/dto/CambioDTO.java b/src/main/java/sic/modelo/dto/CambioDTO.java index a046c4b9d..5dba9d8a7 100644 --- a/src/main/java/sic/modelo/dto/CambioDTO.java +++ b/src/main/java/sic/modelo/dto/CambioDTO.java @@ -15,7 +15,7 @@ @JsonView(Views.Encargado.class) public class CambioDTO { - String atributo; - String valorAnterior; - String valorSiguiente; + private String atributo; + private String valorAnterior; + private String valorSiguiente; } diff --git a/src/main/java/sic/modelo/dto/CommitDTO.java b/src/main/java/sic/modelo/dto/CommitDTO.java index 88b15e3c4..aa5a67ab6 100644 --- a/src/main/java/sic/modelo/dto/CommitDTO.java +++ b/src/main/java/sic/modelo/dto/CommitDTO.java @@ -17,11 +17,11 @@ @JsonView(Views.Encargado.class) public class CommitDTO { - String idCommit; - String idCommitRelacionado; - LocalDateTime fecha; - String usuario; - String tipoDeOperacion; - List cambios; + private String idCommit; + private String idCommitRelacionado; + private LocalDateTime fecha; + private String usuario; + private String tipoDeOperacion; + private List cambios; } diff --git a/src/main/java/sic/service/IAuthService.java b/src/main/java/sic/service/IAuthService.java index becc76af4..c98e31345 100644 --- a/src/main/java/sic/service/IAuthService.java +++ b/src/main/java/sic/service/IAuthService.java @@ -21,7 +21,7 @@ public interface IAuthService { void excluirTokenAcceso(String authorizationHeader); - void setActiveUserToken(String token); + void setActiveUserId(String token); long getActiveUserId(); } diff --git a/src/main/java/sic/service/IPedidoService.java b/src/main/java/sic/service/IPedidoService.java index d479e8d1f..6f79c1f12 100644 --- a/src/main/java/sic/service/IPedidoService.java +++ b/src/main/java/sic/service/IPedidoService.java @@ -1,7 +1,9 @@ package sic.service; import java.math.BigDecimal; +import java.util.HashMap; import java.util.List; +import java.util.Map; import com.querydsl.core.BooleanBuilder; import org.springframework.data.domain.Page; @@ -65,6 +67,6 @@ public interface IPedidoService { List getCambiosPedido(long idPedido); - List> getCambiosRenglonesPedido(long idCommitPedido); + Map> getCambiosRenglonesPedido(long idCommitPedido); } diff --git a/src/main/java/sic/service/impl/AuthServiceImpl.java b/src/main/java/sic/service/impl/AuthServiceImpl.java index 0d53f1260..d72d85bb1 100644 --- a/src/main/java/sic/service/impl/AuthServiceImpl.java +++ b/src/main/java/sic/service/impl/AuthServiceImpl.java @@ -32,7 +32,7 @@ public class AuthServiceImpl implements IAuthService { private static final String URL_RECAPTCHA = "https://www.google.com/recaptcha/api/siteverify"; private static final String BEARER_TOKEN_PREFIX = "Bearer"; - private long activeUserID; + private long activeUserId; private final MessageSource messageSource; @Value("${RECAPTCHA_SECRET_KEY}") @@ -135,12 +135,12 @@ public void excluirTokenAcceso(String authorizationHeader) { } @Override - public void setActiveUserToken(String token) { - activeUserID = this.getClaimsDelToken(token).get("idUsuario", Integer.class); + public void setActiveUserId(String token) { + activeUserId = this.getClaimsDelToken(token).get("idUsuario", Integer.class); } @Override public long getActiveUserId() { - return activeUserID; + return activeUserId; } } diff --git a/src/main/java/sic/service/impl/PedidoServiceImpl.java b/src/main/java/sic/service/impl/PedidoServiceImpl.java index a4498af44..e08188836 100644 --- a/src/main/java/sic/service/impl/PedidoServiceImpl.java +++ b/src/main/java/sic/service/impl/PedidoServiceImpl.java @@ -235,9 +235,9 @@ public Pedido guardar(Pedido pedido, List recibos) { "Reporte.pdf"); logger.warn("El mail del pedido nro {} se envió.", pedido.getNroPedido()); } - Map properties = new HashMap<>(); + var properties = new HashMap(); properties.put("TipoDeOperacion", TipoDeOperacion.ALTA.name()); - String idCommit = auditService.auditar(String.valueOf(authService.getActiveUserId()), pedido.getRenglones(), properties); + var idCommit = auditService.auditar(String.valueOf(authService.getActiveUserId()), pedido.getRenglones(), properties); properties.put(ID_COMMIT_RELACIONADO, idCommit); auditService.auditar(String.valueOf(authService.getActiveUserId()), pedido, properties); return pedido; @@ -438,10 +438,10 @@ public void actualizar(Pedido pedido, List renglonesAnterio productoService.devolverStockPedido(pedido, TipoDeOperacion.ACTUALIZACION, renglonesAnteriores, idSucursalOrigen); productoService.actualizarStockPedido(pedido, TipoDeOperacion.ACTUALIZACION); pedidoRepository.save(pedido); - Map properties = new HashMap<>(); + var properties = new HashMap(); properties.put("TipoDeOperacion", TipoDeOperacion.ACTUALIZACION.name()); - String idCommit = auditService.auditar(String.valueOf(authService.getActiveUserId()), pedido.getRenglones(), properties); - properties.put("idCommitRenglones", idCommit); + var idCommit = auditService.auditar(String.valueOf(authService.getActiveUserId()), pedido.getRenglones(), properties); + properties.put(ID_COMMIT_RELACIONADO, idCommit); auditService.auditar(String.valueOf(authService.getActiveUserId()), pedido, properties); this.actualizarCantidadReservadaDeProductosPorModificacion(pedido, renglonesAnteriores); } @@ -801,14 +801,14 @@ public List getCambiosPedido(long idPedido) { } @Override - public List> getCambiosRenglonesPedido(long idPedido) { + public HashMap> getCambiosRenglonesPedido(long idPedido) { var commitsPedido = auditService.getCambiosDTO(this.getPedidoNoEliminadoPorId(idPedido)); - var cambiosRenglones = new ArrayList>(); + var cambiosRenglones = new HashMap>(); if (!commitsPedido.isEmpty()) { commitsPedido.forEach(commitPedido -> { var idCommitRenglones = commitPedido.getIdCommitRelacionado(); var cambios = auditService.getCambiosDTO(idCommitRenglones); - cambios.forEach(commitDTO -> cambiosRenglones.add(cambios)); + cambios.forEach(commitDTO -> cambiosRenglones.put(idCommitRenglones,cambios)); }); } return cambiosRenglones; diff --git a/src/test/java/sic/service/impl/PedidoServiceImplTest.java b/src/test/java/sic/service/impl/PedidoServiceImplTest.java index bae58cfe5..a639614dd 100644 --- a/src/test/java/sic/service/impl/PedidoServiceImplTest.java +++ b/src/test/java/sic/service/impl/PedidoServiceImplTest.java @@ -53,10 +53,8 @@ class PedidoServiceImplTest { @MockBean IAuthService authService; @MockBean Javers javers; @MockBean IAuditService auditService; - @Autowired PedidoServiceImpl pedidoService; - private Producto construirProducto() { Producto producto = new Producto(); producto.setIdProducto(1L); From 400cb6cf19aa9934177df299f44ef6a264eab570 Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Sun, 14 May 2023 03:41:12 -0300 Subject: [PATCH 17/32] Fixed the integration test --- src/test/java/sic/integration/AppIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/sic/integration/AppIntegrationTest.java b/src/test/java/sic/integration/AppIntegrationTest.java index 19a34d38d..de1af6948 100644 --- a/src/test/java/sic/integration/AppIntegrationTest.java +++ b/src/test/java/sic/integration/AppIntegrationTest.java @@ -1054,7 +1054,7 @@ void testEscenarioModificacionPedido() { assertFalse(cambios.isEmpty()); assertEquals(2, cambios.size()); assertEquals("4.00", cambios.get(0).getIdCommit()); - assertNull(cambios.get(0).getIdCommitRelacionado()); + assertEquals("3.00", cambios.get(0).getIdCommitRelacionado()); assertEquals("Power Max(dueño)", cambios.get(0).getUsuario()); assertEquals("ACTUALIZACION", cambios.get(0).getTipoDeOperacion()); assertEquals(8, cambios.get(0).getCambios().size()); From 2ff8edaec963432c0160333f59dd347485805026 Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Sun, 14 May 2023 07:32:26 -0300 Subject: [PATCH 18/32] First approach to test the audited pedido details --- .../sic/integration/AppIntegrationTest.java | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/test/java/sic/integration/AppIntegrationTest.java b/src/test/java/sic/integration/AppIntegrationTest.java index de1af6948..b3cf363b3 100644 --- a/src/test/java/sic/integration/AppIntegrationTest.java +++ b/src/test/java/sic/integration/AppIntegrationTest.java @@ -9,10 +9,7 @@ import org.springframework.context.MessageSource; import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.io.ClassPathResource; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpRequest; -import org.springframework.http.HttpStatus; +import org.springframework.http.*; import org.springframework.http.client.ClientHttpRequestExecution; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; @@ -926,6 +923,16 @@ void testEscenarioAltaClienteYPedido() { assertEquals("Power Max(dueño)", cambios.get(0).getUsuario()); assertEquals("ALTA", cambios.get(0).getTipoDeOperacion()); assertEquals(17, cambios.get(0).getCambios().size()); + Map>> cambiosRenglones = + restTemplate.getForObject( + apiPrefix + "/pedidos/" + pedidoRecuperado.getIdPedido() + "/renglones/cambios", + Map.class); + assertFalse(cambiosRenglones.isEmpty()); + assertEquals("1.00", cambiosRenglones.get("1.00").get(0).get("idCommit")); + assertNull(cambiosRenglones.get("1.00").get(0).get("idCommitRelacionado")); + assertEquals("Power Max(dueño)", cambiosRenglones.get("1.00").get(0).get("usuario")); + assertEquals(TipoDeOperacion.ALTA.name() ,cambiosRenglones.get("1.00").get(0).get("tipoDeOperacion")); + assertNotNull(cambiosRenglones.get("1.00").get(0).get("cambios")); } @Test @@ -1063,6 +1070,21 @@ void testEscenarioModificacionPedido() { assertEquals("Power Max(dueño)", cambios.get(1).getUsuario()); assertEquals("ALTA", cambios.get(1).getTipoDeOperacion()); assertEquals(17, cambios.get(1).getCambios().size()); + Map>> cambiosRenglones = + restTemplate.getForObject( + apiPrefix + "/pedidos/" + pedidosRecuperados.get(0).getIdPedido() + "/renglones/cambios", + Map.class); + assertFalse(cambiosRenglones.isEmpty()); + assertEquals("1.00", cambiosRenglones.get("1.00").get(0).get("idCommit")); + assertNull(cambiosRenglones.get("1.00").get(0).get("idCommitRelacionado")); + assertEquals("Power Max(dueño)", cambiosRenglones.get("1.00").get(0).get("usuario")); + assertEquals(TipoDeOperacion.ALTA.name() ,cambiosRenglones.get("1.00").get(0).get("tipoDeOperacion")); + assertNotNull(cambiosRenglones.get("1.00").get(0).get("cambios")); + assertEquals("3.00", cambiosRenglones.get("3.00").get(0).get("idCommit")); + assertNull(cambiosRenglones.get("3.00").get(0).get("idCommitRelacionado")); + assertEquals("Power Max(dueño)", cambiosRenglones.get("3.00").get(0).get("usuario")); + assertEquals(TipoDeOperacion.ACTUALIZACION.name() ,cambiosRenglones.get("3.00").get(0).get("tipoDeOperacion")); + assertNotNull(cambiosRenglones.get("3.00").get(0).get("cambios")); } @Test From 8cbf7599eeadfe40bdd0a64ba67efcce40437e46 Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Sun, 14 May 2023 08:02:14 -0300 Subject: [PATCH 19/32] Adds Test to prove the builders --- src/test/java/sic/model/BuildersTest.java | 56 +++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/test/java/sic/model/BuildersTest.java diff --git a/src/test/java/sic/model/BuildersTest.java b/src/test/java/sic/model/BuildersTest.java new file mode 100644 index 000000000..8fc88b9c3 --- /dev/null +++ b/src/test/java/sic/model/BuildersTest.java @@ -0,0 +1,56 @@ +package sic.model; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import sic.modelo.dto.CambioDTO; +import sic.modelo.dto.CommitDTO; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +@ExtendWith(SpringExtension.class) +class BuildersTest { + + @Test + void shouldTestCommitDTOBuilder() { + String idCommit = "1.00"; + String idCommitRelacionado = "2.00"; + LocalDateTime fecha = LocalDateTime.now(); + String usuario = "Usuario Test(test)"; + String tipoDeOperacion = "ACTUALIZACION"; + List cambios = new ArrayList<>(); + CommitDTO commitDTO = CommitDTO.builder() + .idCommit(idCommit) + .idCommitRelacionado(idCommitRelacionado) + .fecha(fecha) + .usuario(usuario) + .tipoDeOperacion(tipoDeOperacion) + .cambios(cambios) + .build(); + Assertions.assertNotNull(commitDTO); + Assertions.assertEquals(idCommit, commitDTO.getIdCommit()); + Assertions.assertEquals(idCommitRelacionado, commitDTO.getIdCommitRelacionado()); + Assertions.assertEquals(fecha, commitDTO.getFecha()); + Assertions.assertEquals(usuario, commitDTO.getUsuario()); + Assertions.assertEquals(tipoDeOperacion, commitDTO.getTipoDeOperacion()); + Assertions.assertEquals(cambios, commitDTO.getCambios()); + } + + @Test + void shouldTestCambioDTOBuilder() { + String atributo = "total"; + String valorAnterior = "100"; + String valorSiguiente = "20000"; + CambioDTO cambioDTO = new CambioDTO(atributo, valorAnterior, valorSiguiente); + Assertions.assertNotNull(cambioDTO); + Assertions.assertEquals(atributo, cambioDTO.getAtributo()); + Assertions.assertEquals(valorAnterior, cambioDTO.getValorAnterior()); + Assertions.assertEquals(valorSiguiente, cambioDTO.getValorSiguiente()); + } +} From 5297c99b339087da822b5fb0aeb31b7830c9b9d9 Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Sun, 14 May 2023 08:13:31 -0300 Subject: [PATCH 20/32] Deleted unnecesary test --- src/test/java/sic/model/BuildersTest.java | 56 ----------------------- 1 file changed, 56 deletions(-) delete mode 100644 src/test/java/sic/model/BuildersTest.java diff --git a/src/test/java/sic/model/BuildersTest.java b/src/test/java/sic/model/BuildersTest.java deleted file mode 100644 index 8fc88b9c3..000000000 --- a/src/test/java/sic/model/BuildersTest.java +++ /dev/null @@ -1,56 +0,0 @@ -package sic.model; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import sic.modelo.dto.CambioDTO; -import sic.modelo.dto.CommitDTO; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -@ExtendWith(SpringExtension.class) -class BuildersTest { - - @Test - void shouldTestCommitDTOBuilder() { - String idCommit = "1.00"; - String idCommitRelacionado = "2.00"; - LocalDateTime fecha = LocalDateTime.now(); - String usuario = "Usuario Test(test)"; - String tipoDeOperacion = "ACTUALIZACION"; - List cambios = new ArrayList<>(); - CommitDTO commitDTO = CommitDTO.builder() - .idCommit(idCommit) - .idCommitRelacionado(idCommitRelacionado) - .fecha(fecha) - .usuario(usuario) - .tipoDeOperacion(tipoDeOperacion) - .cambios(cambios) - .build(); - Assertions.assertNotNull(commitDTO); - Assertions.assertEquals(idCommit, commitDTO.getIdCommit()); - Assertions.assertEquals(idCommitRelacionado, commitDTO.getIdCommitRelacionado()); - Assertions.assertEquals(fecha, commitDTO.getFecha()); - Assertions.assertEquals(usuario, commitDTO.getUsuario()); - Assertions.assertEquals(tipoDeOperacion, commitDTO.getTipoDeOperacion()); - Assertions.assertEquals(cambios, commitDTO.getCambios()); - } - - @Test - void shouldTestCambioDTOBuilder() { - String atributo = "total"; - String valorAnterior = "100"; - String valorSiguiente = "20000"; - CambioDTO cambioDTO = new CambioDTO(atributo, valorAnterior, valorSiguiente); - Assertions.assertNotNull(cambioDTO); - Assertions.assertEquals(atributo, cambioDTO.getAtributo()); - Assertions.assertEquals(valorAnterior, cambioDTO.getValorAnterior()); - Assertions.assertEquals(valorSiguiente, cambioDTO.getValorSiguiente()); - } -} From bd9b83abdb08fd6d0622e8da57210b6d4ed86874 Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Sun, 14 May 2023 08:43:48 -0300 Subject: [PATCH 21/32] Resolve code smell --- src/main/java/sic/service/IPedidoService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/sic/service/IPedidoService.java b/src/main/java/sic/service/IPedidoService.java index 6f79c1f12..5dfd62a11 100644 --- a/src/main/java/sic/service/IPedidoService.java +++ b/src/main/java/sic/service/IPedidoService.java @@ -1,7 +1,6 @@ package sic.service; import java.math.BigDecimal; -import java.util.HashMap; import java.util.List; import java.util.Map; From fb400e5549efec5b2433ed1d5cea3014a3aba1bb Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Mon, 15 May 2023 09:44:19 -0300 Subject: [PATCH 22/32] Fixed the raw use of parameterized class error --- src/main/java/sic/service/impl/JaversServiceImpl.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/sic/service/impl/JaversServiceImpl.java b/src/main/java/sic/service/impl/JaversServiceImpl.java index 5b43c2d27..917327c36 100644 --- a/src/main/java/sic/service/impl/JaversServiceImpl.java +++ b/src/main/java/sic/service/impl/JaversServiceImpl.java @@ -9,7 +9,6 @@ import org.javers.core.diff.changetype.ObjectRemoved; import org.javers.core.diff.changetype.ReferenceChange; import org.javers.core.diff.changetype.ValueChange; -import org.javers.core.diff.changetype.container.CollectionChange; import org.javers.core.diff.changetype.container.ListChange; import org.javers.core.metamodel.object.InstanceId; import org.javers.repository.jql.QueryBuilder; @@ -116,7 +115,7 @@ private List getDetallesCambiosDTO(List changes) { .build()); } case COLLECTION_CHANGE -> { - var collectionChange = (CollectionChange) change; + var collectionChange = (ListChange) change; valuesChanges.add(CambioDTO.builder() .valorSiguiente(collectionChange.getRight() == null ? "" : collectionChange.getRight().toString()) .valorAnterior(collectionChange.getLeft() == null ? "" : collectionChange.getLeft().toString()) @@ -132,9 +131,9 @@ private List getDetallesCambiosDTO(List changes) { .valorSiguiente(String.valueOf(listChange.getRight().size())) .build()); } - if (listChange.getRight().get(0) instanceof LinkedTreeMap mapRight) { + if (listChange.getRight().get(0) instanceof LinkedTreeMap mapRight) { var mapLeft = listChange.getLeft() != null && !listChange.getLeft().isEmpty() ? - (LinkedTreeMap) listChange.getLeft().get(0) : new LinkedTreeMap<>(); + (LinkedTreeMap) listChange.getLeft().get(0) : new LinkedTreeMap<>(); var keySet = mapRight.keySet(); keySet.forEach(key -> { var valorSiguiente = mapRight.get(key); From 477e98bbbe842b31470505c10712c669c097fc3d Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Mon, 15 May 2023 19:13:03 -0300 Subject: [PATCH 23/32] Deleted unnesesary coment --- src/main/java/sic/modelo/Pedido.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/sic/modelo/Pedido.java b/src/main/java/sic/modelo/Pedido.java index c6ac7a93f..a67190979 100644 --- a/src/main/java/sic/modelo/Pedido.java +++ b/src/main/java/sic/modelo/Pedido.java @@ -78,7 +78,6 @@ public class Pedido implements Serializable { @JsonProperty(access = Access.WRITE_ONLY) private List facturas; - //@DiffIgnore @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "id_Pedido") @JsonProperty(access = Access.WRITE_ONLY) From 2fe525bb53094416b794190361f43ae1020fcad8 Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Tue, 16 May 2023 18:52:25 -0300 Subject: [PATCH 24/32] Deleted unused code --- src/main/java/sic/controller/PedidoController.java | 8 +++----- src/main/java/sic/service/impl/PedidoServiceImpl.java | 1 - 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/sic/controller/PedidoController.java b/src/main/java/sic/controller/PedidoController.java index 7b1733cfc..257ea9e7f 100644 --- a/src/main/java/sic/controller/PedidoController.java +++ b/src/main/java/sic/controller/PedidoController.java @@ -2,7 +2,6 @@ import java.time.LocalDateTime; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; import io.jsonwebtoken.Claims; @@ -71,7 +70,7 @@ public List calcularRenglonesPedido( } @PutMapping("/pedidos") - public void actualizar(@RequestBody PedidoDTO pedidoDTO, HttpServletRequest request) { + public void actualizar(@RequestBody PedidoDTO pedidoDTO) { Pedido pedido = pedidoService.getPedidoNoEliminadoPorId(pedidoDTO.getIdPedido()); Long idSucursalOrigen = pedido.getIdSucursal(); pedido.setSucursal(sucursalService.getSucursalPorId(pedidoDTO.getIdSucursal())); @@ -100,8 +99,7 @@ public void actualizar(@RequestBody PedidoDTO pedidoDTO, HttpServletRequest requ @PostMapping("/pedidos") public Pedido guardar(@RequestBody PedidoDTO pedidoDTO, - @RequestHeader("Authorization") String authorizationHeader, - HttpServletRequest request) { + @RequestHeader("Authorization") String authorizationHeader) { Claims claims = authService.getClaimsDelToken(authorizationHeader); Pedido pedido = new Pedido(); pedido.setObservaciones(pedidoDTO.getObservaciones()); @@ -139,7 +137,7 @@ public Page buscarConCriteria( @PutMapping("/pedidos/{idPedido}") @AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO, Rol.VENDEDOR}) - public void cancelar(@PathVariable long idPedido, HttpServletRequest request) { + public void cancelar(@PathVariable long idPedido) { pedidoService.cancelar(pedidoService.getPedidoNoEliminadoPorId(idPedido)); } diff --git a/src/main/java/sic/service/impl/PedidoServiceImpl.java b/src/main/java/sic/service/impl/PedidoServiceImpl.java index e08188836..1984f1510 100644 --- a/src/main/java/sic/service/impl/PedidoServiceImpl.java +++ b/src/main/java/sic/service/impl/PedidoServiceImpl.java @@ -13,7 +13,6 @@ import net.sf.jasperreports.engine.*; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; -import org.javers.spring.annotation.JaversAuditable; import org.modelmapper.ModelMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; From a8e0a045ea8cb1f0a8c5a1df1d1ca8a48058348f Mon Sep 17 00:00:00 2001 From: Franco Bellucci Date: Sat, 20 May 2023 20:32:46 +0200 Subject: [PATCH 25/32] Remove unused import and apply format --- .../java/sic/controller/PedidoController.java | 55 +++++++++---------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/src/main/java/sic/controller/PedidoController.java b/src/main/java/sic/controller/PedidoController.java index 257ea9e7f..b972dd544 100644 --- a/src/main/java/sic/controller/PedidoController.java +++ b/src/main/java/sic/controller/PedidoController.java @@ -19,19 +19,17 @@ import sic.modelo.Resultados; import sic.service.*; -import javax.servlet.http.HttpServletRequest; - @RestController @RequestMapping("/api/v1") public class PedidoController { - private final IPedidoService pedidoService; - private final IUsuarioService usuarioService; - private final ISucursalService sucursalService; - private final IClienteService clienteService; - private final IReciboService reciboService; - private final IAuthService authService; - private static final String ID_USUARIO = "idUsuario"; + private final IPedidoService pedidoService; + private final IUsuarioService usuarioService; + private final ISucursalService sucursalService; + private final IClienteService clienteService; + private final IReciboService reciboService; + private final IAuthService authService; + private static final String ID_USUARIO = "idUsuario"; @Autowired public PedidoController( @@ -49,21 +47,20 @@ public PedidoController( this.authService = authService; } - @GetMapping("/pedidos/{idPedido}") - public Pedido getPedidoPorId(@PathVariable long idPedido) { - return pedidoService.getPedidoNoEliminadoPorId(idPedido); - } + @GetMapping("/pedidos/{idPedido}") + public Pedido getPedidoPorId(@PathVariable long idPedido) { + return pedidoService.getPedidoNoEliminadoPorId(idPedido); + } - @GetMapping("/pedidos/{idPedido}/renglones") - public List getRenglonesDelPedido(@PathVariable long idPedido, - @RequestParam(required = false) boolean clonar) { - return pedidoService.getRenglonesDelPedidoOrdenadorPorIdRenglonSegunEstadoOrClonar(idPedido, clonar); - } + @GetMapping("/pedidos/{idPedido}/renglones") + public List getRenglonesDelPedido(@PathVariable long idPedido, + @RequestParam(required = false) boolean clonar) { + return pedidoService.getRenglonesDelPedidoOrdenadorPorIdRenglonSegunEstadoOrClonar(idPedido, clonar); + } @PostMapping("/pedidos/renglones/clientes/{idCliente}") @AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO, Rol.VENDEDOR, Rol.VIAJANTE}) - public List calcularRenglonesPedido( - @RequestBody List nuevosRenglonesPedidoDTO) { + public List calcularRenglonesPedido(@RequestBody List nuevosRenglonesPedidoDTO) { return pedidoService.calcularRenglonesPedido( pedidoService.getArrayDeIdProducto(nuevosRenglonesPedidoDTO), pedidoService.getArrayDeCantidadesProducto(nuevosRenglonesPedidoDTO)); @@ -141,15 +138,15 @@ public void cancelar(@PathVariable long idPedido) { pedidoService.cancelar(pedidoService.getPedidoNoEliminadoPorId(idPedido)); } - @GetMapping("/pedidos/{idPedido}/reporte") - public ResponseEntity getReportePedido(@PathVariable long idPedido) { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_PDF); - headers.add("content-disposition", "inline; filename=Pedido.pdf"); - headers.setCacheControl("must-revalidate, post-check=0, pre-check=0"); - byte[] reportePDF = pedidoService.getReportePedido(idPedido); - return new ResponseEntity<>(reportePDF, headers, HttpStatus.OK); - } + @GetMapping("/pedidos/{idPedido}/reporte") + public ResponseEntity getReportePedido(@PathVariable long idPedido) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_PDF); + headers.add("content-disposition", "inline; filename=Pedido.pdf"); + headers.setCacheControl("must-revalidate, post-check=0, pre-check=0"); + byte[] reportePDF = pedidoService.getReportePedido(idPedido); + return new ResponseEntity<>(reportePDF, headers, HttpStatus.OK); + } @PostMapping("/pedidos/calculo-pedido") public Resultados calcularResultadosPedido(@RequestBody NuevosResultadosComprobanteDTO nuevosResultadosComprobanteDTO) { From 2765ad31e272574f67b8134807298a5d113b567f Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Thu, 1 Jun 2023 19:18:31 -0300 Subject: [PATCH 26/32] Renamed the JaversAuditServiceImpl --- src/main/java/sic/config/AppConfig.java | 1 - .../{JaversServiceImpl.java => JaversAuditServiceImpl.java} | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) rename src/main/java/sic/service/impl/{JaversServiceImpl.java => JaversAuditServiceImpl.java} (98%) diff --git a/src/main/java/sic/config/AppConfig.java b/src/main/java/sic/config/AppConfig.java index edaab21aa..459a9414c 100644 --- a/src/main/java/sic/config/AppConfig.java +++ b/src/main/java/sic/config/AppConfig.java @@ -112,5 +112,4 @@ public RestTemplate restTemplate() { public Clock clock() { return Clock.systemDefaultZone(); } - } diff --git a/src/main/java/sic/service/impl/JaversServiceImpl.java b/src/main/java/sic/service/impl/JaversAuditServiceImpl.java similarity index 98% rename from src/main/java/sic/service/impl/JaversServiceImpl.java rename to src/main/java/sic/service/impl/JaversAuditServiceImpl.java index 917327c36..9f0a7847d 100644 --- a/src/main/java/sic/service/impl/JaversServiceImpl.java +++ b/src/main/java/sic/service/impl/JaversAuditServiceImpl.java @@ -25,7 +25,7 @@ import java.util.Map; @Service -public class JaversServiceImpl implements IAuditService { +public class JaversAuditServiceImpl implements IAuditService { private final IUsuarioService usuarioService; private final Javers javers; @@ -38,7 +38,7 @@ public class JaversServiceImpl implements IAuditService { private static final String VALUE_CHANGE = "ValueChange"; @Autowired - public JaversServiceImpl(IUsuarioService usuarioService, Javers javers) { + public JaversAuditServiceImpl(IUsuarioService usuarioService, Javers javers) { this.usuarioService = usuarioService; this.javers = javers; } From c17f36b2820a987b21eb91d9309552ffdbd5920b Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Fri, 2 Jun 2023 18:09:43 -0300 Subject: [PATCH 27/32] Remove unnecessary code --- src/main/java/sic/service/IAuditService.java | 2 -- .../java/sic/service/impl/JaversAuditServiceImpl.java | 8 -------- 2 files changed, 10 deletions(-) diff --git a/src/main/java/sic/service/IAuditService.java b/src/main/java/sic/service/IAuditService.java index a5a981f65..095985c24 100644 --- a/src/main/java/sic/service/IAuditService.java +++ b/src/main/java/sic/service/IAuditService.java @@ -8,8 +8,6 @@ public interface IAuditService { String auditar(String idUsuario, Object objeto, Map propiedades); - String auditar(String idUsuario, Object objeto); - List getCambiosDTO(T objeto); List getCambiosDTO(String idCommit); diff --git a/src/main/java/sic/service/impl/JaversAuditServiceImpl.java b/src/main/java/sic/service/impl/JaversAuditServiceImpl.java index 9f0a7847d..4c775ec13 100644 --- a/src/main/java/sic/service/impl/JaversAuditServiceImpl.java +++ b/src/main/java/sic/service/impl/JaversAuditServiceImpl.java @@ -48,11 +48,6 @@ public String auditar(String idUsuario, Object objeto, Map propi return javers.commit(idUsuario, objeto, propiedades).getId().value(); } - @Override - public String auditar(String idUsuario, Object objeto) { - return javers.commit(idUsuario, objeto).getId().value(); - } - @Override public List getCambiosDTO(T objeto) { var changesDTO = new ArrayList(); @@ -154,9 +149,6 @@ private List getDetallesCambiosDTO(List changes) { .valorSiguiente(initialValueChange.getRight().toString()) .build()); } - default -> { - break; - } } }); return valuesChanges; From 6d89624cf46815b2999afc6f99dc8b4d9f3d59f9 Mon Sep 17 00:00:00 2001 From: Franco Bellucci Date: Thu, 6 Jul 2023 19:51:14 +0200 Subject: [PATCH 28/32] Remove whitespaces --- .../sic/service/impl/PedidoServiceImplTest.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/test/java/sic/service/impl/PedidoServiceImplTest.java b/src/test/java/sic/service/impl/PedidoServiceImplTest.java index a639614dd..87082eb2b 100644 --- a/src/test/java/sic/service/impl/PedidoServiceImplTest.java +++ b/src/test/java/sic/service/impl/PedidoServiceImplTest.java @@ -34,8 +34,7 @@ import static org.mockito.Mockito.*; @ExtendWith(SpringExtension.class) -@ContextConfiguration( - classes = {PedidoServiceImpl.class, CustomValidator.class, MessageSource.class}) +@ContextConfiguration(classes = {PedidoServiceImpl.class, CustomValidator.class, MessageSource.class}) class PedidoServiceImplTest { @MockBean PedidoRepository pedidoRepository; @@ -48,11 +47,12 @@ class PedidoServiceImplTest { @MockBean ConfiguracionSucursalServiceImpl configuracionSucursalService; @MockBean CuentaCorrienteServiceImpl cuentaCorrienteService; @MockBean ReciboServiceImpl reciboService; - @MockBean MessageSource messageSource; - @MockBean ModelMapper modelMapper; - @MockBean IAuthService authService; - @MockBean Javers javers; - @MockBean IAuditService auditService; + @MockBean MessageSource messageSource; + @MockBean ModelMapper modelMapper; + @MockBean IAuthService authService; + @MockBean Javers javers; + @MockBean IAuditService auditService; + @Autowired PedidoServiceImpl pedidoService; private Producto construirProducto() { From 404776a71629d44147404b597b78fc8a19270922 Mon Sep 17 00:00:00 2001 From: Franco Bellucci Date: Thu, 6 Jul 2023 22:39:09 +0200 Subject: [PATCH 29/32] Apply refactoring in javers impl --- src/main/java/sic/service/IAuditService.java | 4 +- .../service/impl/JaversAuditServiceImpl.java | 40 ++++++++++--------- .../sic/service/impl/PedidoServiceImpl.java | 6 +-- src/main/resources/messages.properties | 1 + 4 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/main/java/sic/service/IAuditService.java b/src/main/java/sic/service/IAuditService.java index 095985c24..3f0d5cef4 100644 --- a/src/main/java/sic/service/IAuditService.java +++ b/src/main/java/sic/service/IAuditService.java @@ -8,8 +8,8 @@ public interface IAuditService { String auditar(String idUsuario, Object objeto, Map propiedades); - List getCambiosDTO(T objeto); + List getCambios(T objeto); - List getCambiosDTO(String idCommit); + List getCambios(String idCommit); } diff --git a/src/main/java/sic/service/impl/JaversAuditServiceImpl.java b/src/main/java/sic/service/impl/JaversAuditServiceImpl.java index 4c775ec13..c3e0a1cf9 100644 --- a/src/main/java/sic/service/impl/JaversAuditServiceImpl.java +++ b/src/main/java/sic/service/impl/JaversAuditServiceImpl.java @@ -1,7 +1,6 @@ package sic.service.impl; import com.google.gson.internal.LinkedTreeMap; -import org.javers.core.Changes; import org.javers.core.Javers; import org.javers.core.commit.CommitId; import org.javers.core.diff.Change; @@ -13,15 +12,17 @@ import org.javers.core.metamodel.object.InstanceId; import org.javers.repository.jql.QueryBuilder; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; import org.springframework.stereotype.Service; +import sic.exception.BusinessServiceException; import sic.modelo.TipoDeOperacion; -import sic.modelo.Usuario; import sic.modelo.dto.CambioDTO; import sic.modelo.dto.CommitDTO; import sic.service.IAuditService; import sic.service.IUsuarioService; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.Map; @Service @@ -29,6 +30,7 @@ public class JaversAuditServiceImpl implements IAuditService { private final IUsuarioService usuarioService; private final Javers javers; + private final MessageSource messageSource; private static final String ID_COMMIT_RELACIONADO = "idCommitRelacionado"; private static final String INITIAL_VALUE_CHANGE = "InitialValueChange"; private static final String LIST_CHANGE = "ListChange"; @@ -38,9 +40,10 @@ public class JaversAuditServiceImpl implements IAuditService { private static final String VALUE_CHANGE = "ValueChange"; @Autowired - public JaversAuditServiceImpl(IUsuarioService usuarioService, Javers javers) { + public JaversAuditServiceImpl(IUsuarioService usuarioService, Javers javers, MessageSource messageSource) { this.usuarioService = usuarioService; this.javers = javers; + this.messageSource = messageSource; } @Override @@ -49,16 +52,17 @@ public String auditar(String idUsuario, Object objeto, Map propi } @Override - public List getCambiosDTO(T objeto) { + public List getCambios(T objeto) { var changesDTO = new ArrayList(); - this.getChanges(objeto).groupByCommit().forEach(changesByCommit -> { - Usuario usuarioAuthor = usuarioService.getUsuarioNoEliminadoPorId(Long.parseLong(changesByCommit.getCommit().getAuthor())); + var changes = javers.findChanges(QueryBuilder.byInstance(objeto).build()); + changes.groupByCommit().forEach(changesByCommit -> { + var author = usuarioService.getUsuarioNoEliminadoPorId(Long.parseLong(changesByCommit.getCommit().getAuthor())); changesDTO.add(CommitDTO.builder() .idCommit(changesByCommit.getCommit().getId().value()) .idCommitRelacionado(changesByCommit.getCommit().getProperties().get(ID_COMMIT_RELACIONADO)) .fecha(changesByCommit.getCommit().getCommitDate()) - .usuario(usuarioAuthor.getApellido() + " " + usuarioAuthor.getNombre() + "(" + usuarioAuthor.getUsername() + ")") - .cambios(this.getDetallesCambiosDTO(changesByCommit.get())) + .usuario(author.getApellido() + " " + author.getNombre() + "(" + author.getUsername() + ")") + .cambios(this.getDetallesCambios(changesByCommit.get())) .tipoDeOperacion(changesByCommit.getCommit().getProperties().get(TipoDeOperacion.class.getSimpleName())) .build()); }); @@ -66,24 +70,24 @@ public List getCambiosDTO(T objeto) { } @Override - public List getCambiosDTO(String idCommit) { + public List getCambios(String idCommit) { var changesDTO = new ArrayList(); var query = QueryBuilder.anyDomainObject().withCommitId(CommitId.valueOf(idCommit)).build(); - var cambios = javers.findChanges(query).groupByCommit(); - cambios.forEach(changesByCommit -> { - Usuario usuarioAuthor = usuarioService.getUsuarioNoEliminadoPorId(Long.parseLong(changesByCommit.getCommit().getAuthor())); + var changes = javers.findChanges(query).groupByCommit(); + changes.forEach(changesByCommit -> { + var author = usuarioService.getUsuarioNoEliminadoPorId(Long.parseLong(changesByCommit.getCommit().getAuthor())); changesDTO.add(CommitDTO.builder() .idCommit(changesByCommit.getCommit().getId().value()) .fecha(changesByCommit.getCommit().getCommitDate()) - .usuario(usuarioAuthor.getApellido() + " " + usuarioAuthor.getNombre() + "(" + usuarioAuthor.getUsername() + ")") - .cambios(this.getDetallesCambiosDTO(changesByCommit.get())) + .usuario(author.getApellido() + " " + author.getNombre() + "(" + author.getUsername() + ")") + .cambios(this.getDetallesCambios(changesByCommit.get())) .tipoDeOperacion(changesByCommit.getCommit().getProperties().get(TipoDeOperacion.class.getSimpleName())) .build()); }); return changesDTO; } - private List getDetallesCambiosDTO(List changes) { + private List getDetallesCambios(List changes) { var valuesChanges = new ArrayList(); changes.forEach(change -> { switch (change.getClass().getSimpleName()) { @@ -149,13 +153,11 @@ private List getDetallesCambiosDTO(List changes) { .valorSiguiente(initialValueChange.getRight().toString()) .build()); } + //default -> throw new BusinessServiceException( + // messageSource.getMessage("mensaje_tipo_de_cambio_no_valido", null, Locale.getDefault())); } }); return valuesChanges; } - private Changes getChanges(T object) { - var queryBuilder = QueryBuilder.byInstance(object).build(); - return javers.findChanges(queryBuilder); - } } diff --git a/src/main/java/sic/service/impl/PedidoServiceImpl.java b/src/main/java/sic/service/impl/PedidoServiceImpl.java index 1984f1510..e4ca118e1 100644 --- a/src/main/java/sic/service/impl/PedidoServiceImpl.java +++ b/src/main/java/sic/service/impl/PedidoServiceImpl.java @@ -796,17 +796,17 @@ public RenglonPedido actualizarCantidadRenglonPedido(RenglonPedido renglonPedido @Override public List getCambiosPedido(long idPedido) { - return auditService.getCambiosDTO(this.getPedidoNoEliminadoPorId(idPedido)); + return auditService.getCambios(this.getPedidoNoEliminadoPorId(idPedido)); } @Override public HashMap> getCambiosRenglonesPedido(long idPedido) { - var commitsPedido = auditService.getCambiosDTO(this.getPedidoNoEliminadoPorId(idPedido)); + var commitsPedido = auditService.getCambios(this.getPedidoNoEliminadoPorId(idPedido)); var cambiosRenglones = new HashMap>(); if (!commitsPedido.isEmpty()) { commitsPedido.forEach(commitPedido -> { var idCommitRenglones = commitPedido.getIdCommitRelacionado(); - var cambios = auditService.getCambiosDTO(idCommitRenglones); + var cambios = auditService.getCambios(idCommitRenglones); cambios.forEach(commitDTO -> cambiosRenglones.put(idCommitRenglones,cambios)); }); } diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index 1f6e98a85..de9234e68 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -21,6 +21,7 @@ mensaje_error_al_encriptar=Ocurrio un error al encriptar mensaje_error_al_desencriptar=Ocurrio un error al desencriptar mensaje_operacion_no_soportada=El tipo de operación solicitado no está disponible mensaje_recurso_no_encontrado=No se pudo obtener el recurso solicitado +mensaje_tipo_de_cambio_no_valido=El tipo de cambio no es valido #AFIP mensaje_no_es_comprobanteAFIP=No es un comprobante autorizable de AFIP From 740408df4071d980b21169b15ce2f91685bfed3a Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Sun, 23 Jul 2023 23:49:25 -0300 Subject: [PATCH 30/32] Added the renglones special case to fix the missings details. Changed the return of ../renglones/cambios to use list instead map. --- .../java/sic/controller/PedidoController.java | 2 +- src/main/java/sic/service/IPedidoService.java | 2 +- .../service/impl/JaversAuditServiceImpl.java | 71 +++++++++++-------- .../sic/service/impl/PedidoServiceImpl.java | 8 +-- 4 files changed, 48 insertions(+), 35 deletions(-) diff --git a/src/main/java/sic/controller/PedidoController.java b/src/main/java/sic/controller/PedidoController.java index b972dd544..44365b399 100644 --- a/src/main/java/sic/controller/PedidoController.java +++ b/src/main/java/sic/controller/PedidoController.java @@ -161,7 +161,7 @@ public List getCambios(@PathVariable long idPedido) { @GetMapping("/pedidos/{idPedido}/renglones/cambios") @AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO}) - public Map> getCambiosRenglones(@PathVariable long idPedido) { + public List getCambiosRenglones(@PathVariable long idPedido) { return pedidoService.getCambiosRenglonesPedido(idPedido); } } diff --git a/src/main/java/sic/service/IPedidoService.java b/src/main/java/sic/service/IPedidoService.java index 5dfd62a11..1ca5ffe6d 100644 --- a/src/main/java/sic/service/IPedidoService.java +++ b/src/main/java/sic/service/IPedidoService.java @@ -66,6 +66,6 @@ public interface IPedidoService { List getCambiosPedido(long idPedido); - Map> getCambiosRenglonesPedido(long idCommitPedido); + List getCambiosRenglonesPedido(long idCommitPedido); } diff --git a/src/main/java/sic/service/impl/JaversAuditServiceImpl.java b/src/main/java/sic/service/impl/JaversAuditServiceImpl.java index c3e0a1cf9..5a0da95f1 100644 --- a/src/main/java/sic/service/impl/JaversAuditServiceImpl.java +++ b/src/main/java/sic/service/impl/JaversAuditServiceImpl.java @@ -14,7 +14,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.stereotype.Service; -import sic.exception.BusinessServiceException; import sic.modelo.TipoDeOperacion; import sic.modelo.dto.CambioDTO; import sic.modelo.dto.CommitDTO; @@ -22,8 +21,8 @@ import sic.service.IUsuarioService; import java.util.ArrayList; import java.util.List; -import java.util.Locale; import java.util.Map; +import java.util.Objects; @Service public class JaversAuditServiceImpl implements IAuditService { @@ -38,6 +37,7 @@ public class JaversAuditServiceImpl implements IAuditService { private static final String REFERENCE_CHANGE = "ReferenceChange"; private static final String OBJECT_REMOVED = "ObjectRemoved"; private static final String VALUE_CHANGE = "ValueChange"; + private static final String PROPERTY_RENGLONES="renglones"; @Autowired public JaversAuditServiceImpl(IUsuarioService usuarioService, Javers javers, MessageSource messageSource) { @@ -61,7 +61,7 @@ public List getCambios(T objeto) { .idCommit(changesByCommit.getCommit().getId().value()) .idCommitRelacionado(changesByCommit.getCommit().getProperties().get(ID_COMMIT_RELACIONADO)) .fecha(changesByCommit.getCommit().getCommitDate()) - .usuario(author.getApellido() + " " + author.getNombre() + "(" + author.getUsername() + ")") + .usuario(author.getApellido() + " " + author.getNombre() + " (" + author.getUsername() + ")") .cambios(this.getDetallesCambios(changesByCommit.get())) .tipoDeOperacion(changesByCommit.getCommit().getProperties().get(TipoDeOperacion.class.getSimpleName())) .build()); @@ -79,7 +79,7 @@ public List getCambios(String idCommit) { changesDTO.add(CommitDTO.builder() .idCommit(changesByCommit.getCommit().getId().value()) .fecha(changesByCommit.getCommit().getCommitDate()) - .usuario(author.getApellido() + " " + author.getNombre() + "(" + author.getUsername() + ")") + .usuario(author.getApellido() + " " + author.getNombre() + " (" + author.getUsername() + ")") .cambios(this.getDetallesCambios(changesByCommit.get())) .tipoDeOperacion(changesByCommit.getCommit().getProperties().get(TipoDeOperacion.class.getSimpleName())) .build()); @@ -121,30 +121,7 @@ private List getDetallesCambios(List changes) { .atributo(collectionChange.getPropertyName()) .build()); } - case LIST_CHANGE -> { - var listChange = (ListChange) change; - if (listChange.getRight().get(0) instanceof InstanceId) { - valuesChanges.add(CambioDTO.builder() - .atributo(listChange.getPropertyName()) - .valorAnterior(String.valueOf(listChange.getLeft().size())) - .valorSiguiente(String.valueOf(listChange.getRight().size())) - .build()); - } - if (listChange.getRight().get(0) instanceof LinkedTreeMap mapRight) { - var mapLeft = listChange.getLeft() != null && !listChange.getLeft().isEmpty() ? - (LinkedTreeMap) listChange.getLeft().get(0) : new LinkedTreeMap<>(); - var keySet = mapRight.keySet(); - keySet.forEach(key -> { - var valorSiguiente = mapRight.get(key); - var valorAnterior = mapLeft.get(key); - valuesChanges.add(CambioDTO.builder() - .valorSiguiente(valorSiguiente != null ? valorSiguiente.toString() : "") - .valorAnterior(valorAnterior != null ? valorAnterior.toString() : "") - .atributo(key.toString()) - .build()); - }); - } - } + case LIST_CHANGE -> valuesChanges.addAll(this.procesarCambiosDeListas((ListChange) change)); case INITIAL_VALUE_CHANGE -> { var initialValueChange = (InitialValueChange) change; valuesChanges.add(CambioDTO.builder() @@ -160,4 +137,42 @@ private List getDetallesCambios(List changes) { return valuesChanges; } + + private CambioDTO buildCambioDTO(String atributo, String valorAnterior, String valorSiguiente) { + return CambioDTO.builder() + .atributo(atributo) + .valorAnterior(valorAnterior) + .valorSiguiente(valorSiguiente) + .build(); + } + + public List procesarCambiosDeListas(ListChange listChange) { + List valuesChanges = new ArrayList<>(); + if (Objects.equals(listChange.getPropertyName(), PROPERTY_RENGLONES)) { + this.procesarElementoDeLista(listChange.getRight().get(0), listChange, valuesChanges); + } else { + listChange.getRight().forEach(right -> this.procesarElementoDeLista(right, listChange, valuesChanges)); + } + return valuesChanges; + } + + public void procesarElementoDeLista(Object right, ListChange listChange, List valuesChanges) { + if (right instanceof InstanceId) { + valuesChanges.add(this.buildCambioDTO(listChange.getPropertyName(), + String.valueOf(listChange.getLeft().size()), String.valueOf(listChange.getRight().size()))); + } + if (right instanceof LinkedTreeMap mapRight) { + var mapLeft = listChange.getLeft() != null && !listChange.getLeft().isEmpty() ? + (LinkedTreeMap) listChange.getLeft().get(0) : new LinkedTreeMap<>(); + var keySet = mapRight.keySet(); + keySet.forEach(key -> { + var valorSiguiente = mapRight.get(key); + var valorAnterior = mapLeft.get(key); + valuesChanges.add(this.buildCambioDTO(key.toString(), + valorAnterior != null ? valorAnterior.toString() : "", + valorSiguiente != null ? valorSiguiente.toString() : "")); + }); + } + } + } diff --git a/src/main/java/sic/service/impl/PedidoServiceImpl.java b/src/main/java/sic/service/impl/PedidoServiceImpl.java index e4ca118e1..3c044a810 100644 --- a/src/main/java/sic/service/impl/PedidoServiceImpl.java +++ b/src/main/java/sic/service/impl/PedidoServiceImpl.java @@ -27,8 +27,6 @@ import org.springframework.transaction.annotation.Transactional; import sic.modelo.*; import sic.modelo.criteria.BusquedaPedidoCriteria; -import sic.modelo.dto.NuevosResultadosComprobanteDTO; -import sic.modelo.Resultados; import sic.modelo.dto.*; import sic.repository.RenglonPedidoRepository; import sic.service.*; @@ -800,14 +798,14 @@ public List getCambiosPedido(long idPedido) { } @Override - public HashMap> getCambiosRenglonesPedido(long idPedido) { + public List getCambiosRenglonesPedido(long idPedido) { var commitsPedido = auditService.getCambios(this.getPedidoNoEliminadoPorId(idPedido)); - var cambiosRenglones = new HashMap>(); + var cambiosRenglones = new ArrayList(); if (!commitsPedido.isEmpty()) { commitsPedido.forEach(commitPedido -> { var idCommitRenglones = commitPedido.getIdCommitRelacionado(); var cambios = auditService.getCambios(idCommitRenglones); - cambios.forEach(commitDTO -> cambiosRenglones.put(idCommitRenglones,cambios)); + cambiosRenglones.addAll(cambios); }); } return cambiosRenglones; From ebc6b7d9aea5a74750031bac3dad5378dc5d49b6 Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Sun, 23 Jul 2023 23:57:33 -0300 Subject: [PATCH 31/32] Fixed the integration test --- src/test/java/sic/integration/AppIntegrationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/sic/integration/AppIntegrationTest.java b/src/test/java/sic/integration/AppIntegrationTest.java index c5d044d99..e3a9e35f0 100644 --- a/src/test/java/sic/integration/AppIntegrationTest.java +++ b/src/test/java/sic/integration/AppIntegrationTest.java @@ -916,7 +916,7 @@ void testEscenarioAltaClienteYPedido() { assertFalse(cambios.isEmpty()); assertEquals("2.00", cambios.get(0).getIdCommit()); assertEquals("1.00", cambios.get(0).getIdCommitRelacionado()); - assertEquals("Power Max(dueño)", cambios.get(0).getUsuario()); + assertEquals("Power Max (dueño)", cambios.get(0).getUsuario()); assertEquals("ALTA", cambios.get(0).getTipoDeOperacion()); assertEquals(17, cambios.get(0).getCambios().size()); Map>> cambiosRenglones = @@ -1057,7 +1057,7 @@ void testEscenarioModificacionPedido() { assertEquals(2, cambios.size()); assertEquals("4.00", cambios.get(0).getIdCommit()); assertEquals("3.00", cambios.get(0).getIdCommitRelacionado()); - assertEquals("Power Max(dueño)", cambios.get(0).getUsuario()); + assertEquals("Power Max (dueño)", cambios.get(0).getUsuario()); assertEquals("ACTUALIZACION", cambios.get(0).getTipoDeOperacion()); assertEquals(8, cambios.get(0).getCambios().size()); assertEquals("2.00", cambios.get(1).getIdCommit()); From 0948fb8d8fae38678ec8188bff46c2163b69c0af Mon Sep 17 00:00:00 2001 From: Mayol Jose Date: Mon, 24 Jul 2023 00:10:37 -0300 Subject: [PATCH 32/32] Changed the instegration test to use list instead map --- .../sic/integration/AppIntegrationTest.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/test/java/sic/integration/AppIntegrationTest.java b/src/test/java/sic/integration/AppIntegrationTest.java index e3a9e35f0..ad0993131 100644 --- a/src/test/java/sic/integration/AppIntegrationTest.java +++ b/src/test/java/sic/integration/AppIntegrationTest.java @@ -919,16 +919,16 @@ void testEscenarioAltaClienteYPedido() { assertEquals("Power Max (dueño)", cambios.get(0).getUsuario()); assertEquals("ALTA", cambios.get(0).getTipoDeOperacion()); assertEquals(17, cambios.get(0).getCambios().size()); - Map>> cambiosRenglones = + List> cambiosRenglones = restTemplate.getForObject( apiPrefix + "/pedidos/" + pedidoRecuperado.getIdPedido() + "/renglones/cambios", - Map.class); + List.class); assertFalse(cambiosRenglones.isEmpty()); - assertEquals("1.00", cambiosRenglones.get("1.00").get(0).get("idCommit")); - assertNull(cambiosRenglones.get("1.00").get(0).get("idCommitRelacionado")); - assertEquals("Power Max(dueño)", cambiosRenglones.get("1.00").get(0).get("usuario")); - assertEquals(TipoDeOperacion.ALTA.name() ,cambiosRenglones.get("1.00").get(0).get("tipoDeOperacion")); - assertNotNull(cambiosRenglones.get("1.00").get(0).get("cambios")); + assertEquals("1.00", cambiosRenglones.get(0).get("idCommit")); + assertNull(cambiosRenglones.get(0).get("idCommitRelacionado")); + assertEquals("Power Max (dueño)", cambiosRenglones.get(0).get("usuario")); + assertEquals(TipoDeOperacion.ALTA.name() ,cambiosRenglones.get(0).get("tipoDeOperacion")); + assertNotNull(cambiosRenglones.get(0).get("cambios")); } @Test @@ -1062,24 +1062,24 @@ void testEscenarioModificacionPedido() { assertEquals(8, cambios.get(0).getCambios().size()); assertEquals("2.00", cambios.get(1).getIdCommit()); assertEquals("1.00", cambios.get(1).getIdCommitRelacionado()); - assertEquals("Power Max(dueño)", cambios.get(1).getUsuario()); + assertEquals("Power Max (dueño)", cambios.get(1).getUsuario()); assertEquals("ALTA", cambios.get(1).getTipoDeOperacion()); assertEquals(17, cambios.get(1).getCambios().size()); - Map>> cambiosRenglones = + List> cambiosRenglones = restTemplate.getForObject( apiPrefix + "/pedidos/" + pedidosRecuperados.get(0).getIdPedido() + "/renglones/cambios", - Map.class); + List.class); assertFalse(cambiosRenglones.isEmpty()); - assertEquals("1.00", cambiosRenglones.get("1.00").get(0).get("idCommit")); - assertNull(cambiosRenglones.get("1.00").get(0).get("idCommitRelacionado")); - assertEquals("Power Max(dueño)", cambiosRenglones.get("1.00").get(0).get("usuario")); - assertEquals(TipoDeOperacion.ALTA.name() ,cambiosRenglones.get("1.00").get(0).get("tipoDeOperacion")); - assertNotNull(cambiosRenglones.get("1.00").get(0).get("cambios")); - assertEquals("3.00", cambiosRenglones.get("3.00").get(0).get("idCommit")); - assertNull(cambiosRenglones.get("3.00").get(0).get("idCommitRelacionado")); - assertEquals("Power Max(dueño)", cambiosRenglones.get("3.00").get(0).get("usuario")); - assertEquals(TipoDeOperacion.ACTUALIZACION.name() ,cambiosRenglones.get("3.00").get(0).get("tipoDeOperacion")); - assertNotNull(cambiosRenglones.get("3.00").get(0).get("cambios")); + assertEquals("3.00", cambiosRenglones.get(0).get("idCommit")); + assertNull(cambiosRenglones.get(0).get("idCommitRelacionado")); + assertEquals("Power Max (dueño)", cambiosRenglones.get(0).get("usuario")); + assertEquals(TipoDeOperacion.ACTUALIZACION.name() ,cambiosRenglones.get(0).get("tipoDeOperacion")); + assertNotNull(cambiosRenglones.get(0).get("cambios")); + assertEquals("1.00", cambiosRenglones.get(1).get("idCommit")); + assertNull(cambiosRenglones.get(1).get("idCommitRelacionado")); + assertEquals("Power Max (dueño)", cambiosRenglones.get(1).get("usuario")); + assertEquals(TipoDeOperacion.ALTA.name() ,cambiosRenglones.get(1).get("tipoDeOperacion")); + assertNotNull(cambiosRenglones.get(1).get("cambios")); } @Test