Skip to content
Open
13 changes: 13 additions & 0 deletions scripts/issues/issue417.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
ALTER TABLE recibo
ADD estado varchar(255) AFTER idPagoMercadoPago;

ALTER TABLE recibo
ADD urlImagen varchar(255) AFTER estado;

SET SQL_SAFE_UPDATES = 0;

update recibo
set recibo.estado = 'APROBADO';

SET SQL_SAFE_UPDATES = 1;

67 changes: 46 additions & 21 deletions src/main/java/sic/controller/ReciboController.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package sic.controller;

import io.jsonwebtoken.Claims;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.http.HttpHeaders;
Expand All @@ -10,10 +8,13 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import sic.aspect.AccesoRolesPermitidos;
import sic.modelo.EstadoRecibo;
import sic.modelo.criteria.BusquedaReciboCriteria;
import sic.modelo.Recibo;
import sic.modelo.Rol;
import sic.modelo.dto.ReciboDTO;
import sic.modelo.dto.NuevoReciboClienteDTO;
import sic.modelo.dto.NuevoReciboDepositoDTO;
import sic.modelo.dto.NuevoReciboProveedorDTO;
import sic.service.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
Expand All @@ -29,8 +30,6 @@ public class ReciboController {
private final IProveedorService proveedorService;
private final IFormaDePagoService formaDePagoService;
private final IAuthService authService;
private final ModelMapper modelMapper;

@Autowired
public ReciboController(
IReciboService reciboService,
Expand All @@ -39,16 +38,14 @@ public ReciboController(
IClienteService clienteService,
IProveedorService proveedorService,
IFormaDePagoService formaDePagoService,
IAuthService authService,
ModelMapper modelMapper) {
IAuthService authService) {
this.reciboService = reciboService;
this.sucursalService = sucursalService;
this.usuarioService = usuarioService;
this.clienteService = clienteService;
this.formaDePagoService = formaDePagoService;
this.proveedorService = proveedorService;
this.authService = authService;
this.modelMapper = modelMapper;
}

@GetMapping("/recibos/{idRecibo}")
Expand All @@ -71,35 +68,57 @@ public BigDecimal getTotalRecibos(@RequestBody BusquedaReciboCriteria criteria)
@PostMapping("/recibos/clientes")
@AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO})
public Recibo guardarReciboCliente(
@RequestBody ReciboDTO reciboDTO,
@RequestBody NuevoReciboClienteDTO nuevoReciboClienteDTO,
@RequestHeader("Authorization") String authorizationHeader) {
Recibo recibo = modelMapper.map(reciboDTO, Recibo.class);
recibo.setSucursal(sucursalService.getSucursalPorId(reciboDTO.getIdSucursal()));
recibo.setCliente(clienteService.getClienteNoEliminadoPorId(reciboDTO.getIdCliente()));
recibo.setFormaDePago(formaDePagoService.getFormasDePagoNoEliminadoPorId(reciboDTO.getIdFormaDePago()));
Claims claims = authService.getClaimsDelToken(authorizationHeader);
var recibo = new Recibo();
recibo.setConcepto(nuevoReciboClienteDTO.getConcepto());
recibo.setSucursal(sucursalService.getSucursalPorId(nuevoReciboClienteDTO.getIdSucursal()));
recibo.setCliente(
clienteService.getClienteNoEliminadoPorId(nuevoReciboClienteDTO.getIdCliente()));
recibo.setFormaDePago(
formaDePagoService.getFormasDePagoNoEliminadoPorId(
nuevoReciboClienteDTO.getIdFormaDePago()));
var claims = authService.getClaimsDelToken(authorizationHeader);
recibo.setUsuario(
usuarioService.getUsuarioNoEliminadoPorId(((Integer) claims.get("idUsuario")).longValue()));
recibo.setFecha(LocalDateTime.now());
recibo.setEstado(EstadoRecibo.APROBADO);
recibo.setMonto(nuevoReciboClienteDTO.getMonto());
return reciboService.guardar(recibo);
}

@PostMapping("/recibos/proveedores")
@AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO})
public Recibo guardarReciboProveedor(
@RequestBody ReciboDTO reciboDTO,
@RequestBody NuevoReciboProveedorDTO nuevoReciboProveedorDTO,
@RequestHeader("Authorization") String authorizationHeader) {
Recibo recibo = modelMapper.map(reciboDTO, Recibo.class);
recibo.setSucursal(sucursalService.getSucursalPorId(reciboDTO.getIdSucursal()));
recibo.setProveedor(proveedorService.getProveedorNoEliminadoPorId(reciboDTO.getIdProveedor()));
recibo.setFormaDePago(formaDePagoService.getFormasDePagoNoEliminadoPorId(reciboDTO.getIdFormaDePago()));
Claims claims = authService.getClaimsDelToken(authorizationHeader);
var recibo = new Recibo();
recibo.setConcepto(nuevoReciboProveedorDTO.getConcepto());
recibo.setSucursal(sucursalService.getSucursalPorId(nuevoReciboProveedorDTO.getIdSucursal()));
recibo.setProveedor(
proveedorService.getProveedorNoEliminadoPorId(nuevoReciboProveedorDTO.getIdProveedor()));
recibo.setFormaDePago(
formaDePagoService.getFormasDePagoNoEliminadoPorId(
nuevoReciboProveedorDTO.getIdFormaDePago()));
var claims = authService.getClaimsDelToken(authorizationHeader);
recibo.setUsuario(
usuarioService.getUsuarioNoEliminadoPorId(((Integer) claims.get("idUsuario")).longValue()));
recibo.setFecha(LocalDateTime.now());
recibo.setMonto(nuevoReciboProveedorDTO.getMonto());
recibo.setEstado(EstadoRecibo.APROBADO);
return reciboService.guardar(recibo);
}

@PostMapping("/recibos/clientes/depositos")
@AccesoRolesPermitidos({Rol.COMPRADOR})
public Recibo guardarReciboPorDeposito(
@RequestBody NuevoReciboDepositoDTO nuevoReciboDepositoDTO,
@RequestHeader("Authorization") String authorizationHeader) {
return reciboService.guardarReciboPorDeposito(
nuevoReciboDepositoDTO,
(Integer) authService.getClaimsDelToken(authorizationHeader).get("idUsuario"));
}

@DeleteMapping("/recibos/{idRecibo}")
@AccesoRolesPermitidos({Rol.ADMINISTRADOR})
public void eliminar(@PathVariable long idRecibo) {
Expand All @@ -108,11 +127,17 @@ public void eliminar(@PathVariable long idRecibo) {

@GetMapping("/recibos/{idRecibo}/reporte")
public ResponseEntity<byte[]> getReporteRecibo(@PathVariable long idRecibo) {
HttpHeaders headers = new HttpHeaders();
var headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_PDF);
headers.add("content-disposition", "inline; filename=Recibo.pdf");
headers.setCacheControl("must-revalidate, post-check=0, pre-check=0");
byte[] reportePDF = reciboService.getReporteRecibo(reciboService.getReciboNoEliminadoPorId(idRecibo));
return new ResponseEntity<>(reportePDF, headers, HttpStatus.OK);
}

@PutMapping("/recibos/{idRecibo}/aprobar")
@AccesoRolesPermitidos({Rol.ADMINISTRADOR, Rol.ENCARGADO})
public void aprobarRecibo(@PathVariable long idRecibo) {
reciboService.aprobarRecibo(idRecibo);
}
}
7 changes: 7 additions & 0 deletions src/main/java/sic/modelo/EstadoRecibo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package sic.modelo;

public enum EstadoRecibo {
SIN_CHEQUEAR,
APROBADO,
RECHAZADO
}
10 changes: 10 additions & 0 deletions src/main/java/sic/modelo/Recibo.java
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,18 @@ public class Recibo implements Serializable {

@Column(precision = 25, scale = 15)
@Positive(message = "{mensaje_recibo_monto_igual_menor_cero}")
@NotNull(message = "{mensaje_recibo_sin_monto}")
private BigDecimal monto;

@Pattern(
regexp = "^https:\\/\\/res.cloudinary.com\\/.*",
message = "{mensaje_url_imagen_no_valida}")
@JsonView(Views.Comprador.class)
private String urlImagen;

@Enumerated(EnumType.STRING)
private EstadoRecibo estado;

@JsonGetter("idFormaDePago")
public long getIdFormaDePago() {
return formaDePago.getIdFormaDePago();
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/sic/modelo/dto/NuevoReciboClienteDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package sic.modelo.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class NuevoReciboClienteDTO {

private long idCliente;
private long idSucursal;
private long idFormaDePago;
private String concepto;
private BigDecimal monto;
}
21 changes: 21 additions & 0 deletions src/main/java/sic/modelo/dto/NuevoReciboDepositoDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package sic.modelo.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class NuevoReciboDepositoDTO {

private Long idPedido;
private Long idSucursal;
private String concepto;
private byte[] imagen;
private BigDecimal monto;
}
21 changes: 21 additions & 0 deletions src/main/java/sic/modelo/dto/NuevoReciboProveedorDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package sic.modelo.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class NuevoReciboProveedorDTO {

private long idProveedor;
private long idSucursal;
private long idFormaDePago;
private String concepto;
private BigDecimal monto;
}
9 changes: 8 additions & 1 deletion src/main/java/sic/repository/ReciboRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.util.List;
import java.util.Optional;

import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
Expand All @@ -26,7 +27,8 @@ Optional<Recibo> findReciboByIdPagoMercadoPagoAndEliminado(
"SELECT r FROM Recibo r "
+ "WHERE r.sucursal.idSucursal = :idSucursal "
+ "AND r.formaDePago.idFormaDePago = :idFormaDePago "
+ "AND r.fecha BETWEEN :desde AND :hasta AND r.eliminado = false")
+ "AND r.fecha BETWEEN :desde AND :hasta AND r.eliminado = false "
+ "AND r.estado = sic.modelo.EstadoRecibo.APROBADO")
List<Recibo> getRecibosEntreFechasPorFormaDePago(
@Param("idSucursal") long idSucursal,
@Param("idFormaDePago") long idFormaDePago,
Expand Down Expand Up @@ -98,4 +100,9 @@ BigDecimal getTotalRecibosProveedoresEntreFechas(
@Param("idSucursal") long idSucursal,
@Param("desde") LocalDateTime desde,
@Param("hasta") LocalDateTime hasta);

@Modifying
@Query("UPDATE Recibo r SET r.urlImagen = :urlImagen WHERE r.idRecibo = :idRecibo")
int actualizarUrlImagen(@Param("idRecibo") long idRecibo, @Param("urlImagen") String urlImagen);

}
7 changes: 7 additions & 0 deletions src/main/java/sic/service/IReciboService.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.springframework.data.domain.Page;
import sic.modelo.*;
import sic.modelo.criteria.BusquedaReciboCriteria;
import sic.modelo.dto.NuevoReciboDepositoDTO;

public interface IReciboService {

Expand Down Expand Up @@ -38,6 +39,10 @@ List<Recibo> construirRecibos(
Recibo construirReciboPorPayment(
Sucursal sucursal, Usuario usuario, Cliente cliente, Payment payment);

Recibo guardarReciboPorDeposito(NuevoReciboDepositoDTO nuevoReciboDepositoDTO, long idUsuario);

void aprobarRecibo(long idRecibo);

long getSiguienteNumeroRecibo(long idSucursal, long serie);

void eliminar(long idRecibo);
Expand All @@ -62,4 +67,6 @@ BigDecimal getTotalRecibosProveedoresQueAfectanCajaEntreFechas(
BigDecimal getTotalRecibosClientesEntreFechas(long idSucursal, LocalDateTime desde, LocalDateTime hasta);

BigDecimal getTotalRecibosProveedoresEntreFechas(long idSucursal, LocalDateTime desde, LocalDateTime hasta);

String subirImagenRecibo(long idRecibo, byte[] imagen);
}
Loading