Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Apply auditing to entity Pedido and Renglon Pedido #465

Open
wants to merge 36 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
20d8563
Cambia la forma de guardar un Pedido
k31kur0n0 Oct 12, 2022
3942843
First approach of Javer's use
k31kur0n0 Nov 9, 2022
faebe83
First approach to use switch
k31kur0n0 Jan 19, 2023
208b8a5
Implements the changeDTO and ValueChangeDTO models.
k31kur0n0 Feb 3, 2023
6a604d9
Change the ListChange treatment
k31kur0n0 Mar 17, 2023
08f769c
Change attributes names
k31kur0n0 Mar 17, 2023
519c552
Fixed the obtain data when a new instance is audited
k31kur0n0 Mar 17, 2023
337bb2d
The funtion to add or update a pedido its broken because the test DB …
k31kur0n0 Apr 3, 2023
59b2eb6
Adds the Audit Service Interface and a implementation
k31kur0n0 Apr 10, 2023
0dc1432
Changes the renglones commit endpoint to bring all the renglones comm…
k31kur0n0 Apr 14, 2023
aa2d5d3
Update dependencies and delete nombreDeClase from CommitDTO model. A …
k31kur0n0 Apr 24, 2023
ebbb4bc
Rename the AuditServiceImpl to JaversServiceImpl
k31kur0n0 May 5, 2023
4f627dc
Merge branch 'master' into issue442JaVers
k31kur0n0 May 5, 2023
a6bc436
Changed the audit service interface and the Javers service implementa…
k31kur0n0 May 12, 2023
bcd3418
Delete code and a non neccesary class. Adds some integration test.
k31kur0n0 May 12, 2023
795ad7b
Make the requested changes
k31kur0n0 May 14, 2023
774c3a1
Make the last requested changes
k31kur0n0 May 14, 2023
400cb6c
Fixed the integration test
k31kur0n0 May 14, 2023
2ff8eda
First approach to test the audited pedido details
k31kur0n0 May 14, 2023
8cbf759
Adds Test to prove the builders
k31kur0n0 May 14, 2023
5297c99
Deleted unnecesary test
k31kur0n0 May 14, 2023
bd9b83a
Resolve code smell
k31kur0n0 May 14, 2023
fb400e5
Fixed the raw use of parameterized class error
k31kur0n0 May 15, 2023
477e98b
Deleted unnesesary coment
k31kur0n0 May 15, 2023
2fe525b
Deleted unused code
k31kur0n0 May 16, 2023
a8e0a04
Remove unused import and apply format
belluccifranco May 20, 2023
2765ad3
Renamed the JaversAuditServiceImpl
k31kur0n0 Jun 1, 2023
7bb8215
Merge branch 'master' into issue442JaVers
belluccifranco Jun 2, 2023
c17f36b
Remove unnecessary code
k31kur0n0 Jun 2, 2023
6d89624
Remove whitespaces
belluccifranco Jul 6, 2023
404776a
Apply refactoring in javers impl
belluccifranco Jul 6, 2023
740408d
Added the renglones special case to fix the missings details. Changed…
k31kur0n0 Jul 24, 2023
ebc6b7d
Fixed the integration test
k31kur0n0 Jul 24, 2023
0948fb8
Changed the instegration test to use list instead map
k31kur0n0 Jul 24, 2023
248d597
Merge pull request #470 from open-commercial/master
belluccifranco Oct 20, 2023
2d88cab
Merge branch 'master' into issue442JaVers
belluccifranco Dec 14, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
<bouncycastle-bcmail.version>1.46</bouncycastle-bcmail.version>
<commons-io.version>2.7</commons-io.version>
<messaging.saaj.version>1.5.2</messaging.saaj.version>
<javers.version>6.14.0</javers.version>
belluccifranco marked this conversation as resolved.
Show resolved Hide resolved
<cloudinary.version>1.33.0</cloudinary.version>
<newrelic-agent.version>8.5.0</newrelic-agent.version>
<mercadopago.version>2.1.4</mercadopago.version>
Expand Down Expand Up @@ -169,6 +170,11 @@
<artifactId>gson</artifactId>
<version>${google-gson.version}</version>
</dependency>
<dependency>
<groupId>org.javers</groupId>
<artifactId>javers-spring-boot-starter-sql</artifactId>
<version>${javers.version}</version>
</dependency>
</dependencies>

<build>
Expand Down
82 changes: 44 additions & 38 deletions src/main/java/sic/controller/PedidoController.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.time.LocalDateTime;
import java.util.ArrayList;
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;
Expand All @@ -14,23 +15,21 @@
import sic.aspect.AccesoRolesPermitidos;
import sic.modelo.*;
import sic.modelo.criteria.BusquedaPedidoCriteria;
import sic.modelo.dto.NuevosResultadosComprobanteDTO;
import sic.modelo.dto.*;
import sic.modelo.Resultados;
import sic.modelo.dto.PedidoDTO;
import sic.modelo.dto.NuevoRenglonPedidoDTO;
import sic.service.*;

@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(
Expand All @@ -48,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<RenglonPedido> getRenglonesDelPedido(@PathVariable long idPedido,
@RequestParam(required = false) boolean clonar) {
return pedidoService.getRenglonesDelPedidoOrdenadorPorIdRenglonSegunEstadoOrClonar(idPedido, clonar);
}
@GetMapping("/pedidos/{idPedido}/renglones")
public List<RenglonPedido> 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<RenglonPedido> calcularRenglonesPedido(
@RequestBody List<NuevoRenglonPedidoDTO> nuevosRenglonesPedidoDTO) {
public List<RenglonPedido> calcularRenglonesPedido(@RequestBody List<CantidadProductoDTO> nuevosRenglonesPedidoDTO) {
return pedidoService.calcularRenglonesPedido(
pedidoService.getArrayDeIdProducto(nuevosRenglonesPedidoDTO),
pedidoService.getArrayDeCantidadesProducto(nuevosRenglonesPedidoDTO));
Expand All @@ -79,14 +77,10 @@ public void actualizar(@RequestBody PedidoDTO pedidoDTO) {
pedido.setRecargoPorcentaje(pedidoDTO.getRecargoPorcentaje());
if (pedidoDTO.getDescuentoPorcentaje() != null)
pedido.setDescuentoPorcentaje(pedidoDTO.getDescuentoPorcentaje());
List<RenglonPedido> renglonesAnteriores = new ArrayList<>(pedido.getRenglones());
pedido.getRenglones().clear();
pedido
.getRenglones()
.addAll(
pedidoService.calcularRenglonesPedido(
pedidoService.getArrayDeIdProducto(pedidoDTO.getRenglones()),
pedidoService.getArrayDeCantidadesProducto(pedidoDTO.getRenglones())));
List<CantidadProductoDTO> 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,
Expand Down Expand Up @@ -144,18 +138,30 @@ public void cancelar(@PathVariable long idPedido) {
pedidoService.cancelar(pedidoService.getPedidoNoEliminadoPorId(idPedido));
}

@GetMapping("/pedidos/{idPedido}/reporte")
public ResponseEntity<byte[]> 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<byte[]> 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) {
return pedidoService.calcularResultadosPedido(nuevosResultadosComprobanteDTO);
}

@GetMapping("/pedidos/{idPedido}/cambios")
@AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO})
public List<CommitDTO> getCambios(@PathVariable long idPedido) {
return pedidoService.getCambiosPedido(idPedido);
}

@GetMapping("/pedidos/{idPedido}/renglones/cambios")
@AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO})
public List<CommitDTO> getCambiosRenglones(@PathVariable long idPedido) {
return pedidoService.getCambiosRenglonesPedido(idPedido);
}
}
1 change: 1 addition & 0 deletions src/main/java/sic/interceptor/JwtInterceptor.java
Original file line number Diff line number Diff line change
Expand Up @@ -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()));
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/sic/modelo/dto/CambioDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
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 CambioDTO {

private String atributo;
private String valorAnterior;
private String valorSiguiente;
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class NuevoRenglonPedidoDTO {
public class CantidadProductoDTO {

private long idProductoItem;
private BigDecimal cantidad;
Expand Down
27 changes: 27 additions & 0 deletions src/main/java/sic/modelo/dto/CommitDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +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 java.time.LocalDateTime;
import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@JsonView(Views.Encargado.class)
public class CommitDTO {

private String idCommit;
private String idCommitRelacionado;
private LocalDateTime fecha;
private String usuario;
private String tipoDeOperacion;
private List<CambioDTO> cambios;

}
2 changes: 1 addition & 1 deletion src/main/java/sic/modelo/dto/PedidoDTO.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public class PedidoDTO {
private String observaciones;
private Long idCliente;
private TipoDeEnvio tipoDeEnvio;
private List<NuevoRenglonPedidoDTO> renglones;
private List<CantidadProductoDTO> renglones;
private Long[] idsFormaDePago;
private BigDecimal[] montos;
private BigDecimal recargoPorcentaje;
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/sic/service/IAuditService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package sic.service;

import sic.modelo.dto.CommitDTO;
import java.util.List;
import java.util.Map;

public interface IAuditService {

String auditar(String idUsuario, Object objeto, Map<String, String> propiedades);

<T> List<CommitDTO> getCambios(T objeto);

List<CommitDTO> getCambios(String idCommit);

}
5 changes: 5 additions & 0 deletions src/main/java/sic/service/IAuthService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import io.jsonwebtoken.Claims;
import sic.modelo.Rol;

import java.util.List;

public interface IAuthService {
Expand All @@ -19,4 +20,8 @@ public interface IAuthService {
void validarRecaptcha(String recaptcha);

void excluirTokenAcceso(String authorizationHeader);

void setActiveUserId(String token);

long getActiveUserId();
}
24 changes: 18 additions & 6 deletions src/main/java/sic/service/IPedidoService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import com.querydsl.core.BooleanBuilder;
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.CommitDTO;
import sic.modelo.dto.NuevosResultadosComprobanteDTO;
import sic.modelo.Resultados;

Expand All @@ -19,7 +21,8 @@ public interface IPedidoService {

Pedido getPedidoPorNumeroAndSucursal(long nroPedido, Sucursal sucursal);

void actualizar(Pedido pedido, List<RenglonPedido> renglonesAnteriores, Long idSucursal, List<Recibo> recibos);
void actualizar(Pedido pedido, List<CantidadProductoDTO> renglonesAnteriores, Long idSucursal, List<Recibo> recibos);


void actualizarFacturasDelPedido(Pedido pedido, List<Factura> facturas);

Expand Down Expand Up @@ -49,11 +52,20 @@ public interface IPedidoService {

Resultados calcularResultadosPedido(NuevosResultadosComprobanteDTO calculoPedido);

long[] getArrayDeIdProducto(List<NuevoRenglonPedidoDTO> nuevosRenglones);
long[] getArrayDeIdProducto(List<CantidadProductoDTO> nuevosRenglones);

BigDecimal[] getArrayDeCantidadesProducto(List<CantidadProductoDTO> nuevosRenglones);

void actualizarCantidadReservadaDeProductosPorCambioDeEstado(Pedido pedido);

void actualizarCantidadReservadaDeProductosPorModificacion(Pedido pedido, List<CantidadProductoDTO> renglonesAnteriores);

List<RenglonPedido> actualizarRenglonesPedido(List<RenglonPedido> renglonesDelPedido, List<CantidadProductoDTO> renglonesParaActualizar);

RenglonPedido actualizarCantidadRenglonPedido(RenglonPedido renglonPedido, BigDecimal cantidadNueva);

BigDecimal[] getArrayDeCantidadesProducto(List<NuevoRenglonPedidoDTO> nuevosRenglones);
List<CommitDTO> getCambiosPedido(long idPedido);

void actualizarCantidadReservadaDeProductosPorCambioDeEstado(Pedido pedido);
List<CommitDTO> getCambiosRenglonesPedido(long idCommitPedido);

void actualizarCantidadReservadaDeProductosPorModificacion(Pedido pedido, List<RenglonPedido> renglonesAnteriores);
}
2 changes: 1 addition & 1 deletion src/main/java/sic/service/IProductoService.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public interface IProductoService {
void actualizar(Producto productoPorActualizar, Producto productoPersistido, byte[] imagen);

void devolverStockPedido(
Pedido pedido, TipoDeOperacion tipoDeOperacion, List<RenglonPedido> renglonesAnteriores, Long idSucursalOrigen);
Pedido pedido, TipoDeOperacion tipoDeOperacion, List<CantidadProductoDTO> renglonesAnteriores, Long idSucursalOrigen);

void actualizarStockPedido(Pedido pedido, TipoDeOperacion tipoDeOperacion);

Expand Down
12 changes: 12 additions & 0 deletions src/main/java/sic/service/impl/AuthServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -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}")
Expand Down Expand Up @@ -131,4 +133,14 @@ public void excluirTokenAcceso(String authorizationHeader) {
tokenAccesoExcluidoRepository.save(new TokenAccesoExcluido(0, token));
}
}

@Override
public void setActiveUserId(String token) {
activeUserId = this.getClaimsDelToken(token).get("idUsuario", Integer.class);
}

@Override
public long getActiveUserId() {
return activeUserId;
}
}
3 changes: 2 additions & 1 deletion src/main/java/sic/service/impl/CarritoCompraServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;
}
Expand Down
Loading
Loading