diff --git a/src/main/java/com/prismamp/todopago/calculator/CargoCalculator.java b/src/main/java/com/prismamp/todopago/calculator/CargoCalculator.java index 2efd057..010c777 100644 --- a/src/main/java/com/prismamp/todopago/calculator/CargoCalculator.java +++ b/src/main/java/com/prismamp/todopago/calculator/CargoCalculator.java @@ -1,15 +1,12 @@ package com.prismamp.todopago.calculator; -import java.util.Date; - import org.springframework.stereotype.Service; import com.prismamp.todopago.exceptions.BusinessException; import com.prismamp.todopago.model.Cargo; import com.prismamp.todopago.model.CargoCuenta; import com.prismamp.todopago.model.CargoTransaccion; -import com.prismamp.todopago.model.ReglaBonificacion; -import com.prismamp.todopago.model.Valor; +import com.prismamp.todopago.model.PromocionResponse; @Service public class CargoCalculator { @@ -22,93 +19,67 @@ public Boolean isCostoFinanciero(Cargo cargo) { } } - public CargoTransaccion calculateRelacionVigente(CargoCuenta cargoCuenta, Cargo cargo, - CargoTransaccion cargoTransaccion) { - - if (null != cargoCuenta && null != cargo) { - cargoTransaccion = checkCargoTransaccion(cargoTransaccion); - if (isRelacionVigente(cargoCuenta)) { - cargoTransaccion.setValorAplicado(cargoCuenta.getValor()); - cargoTransaccion.setIdTipoAplicacion(cargoCuenta.getIdTipoAplicacion()); - } else { - Valor valor = cargo.getValor(); - - if (null != valor) { - cargoTransaccion.setValorAplicado(valor.getValor()); - cargoTransaccion.setIdTipoAplicacion(valor.getTipo().getId()); - } else { - throw new BusinessException("No se puede calcular el Valor a partir del Cargo."); - } - } - - return cargoTransaccion; - } else { - throw new BusinessException("No se puede calcular si el CargoCuenta tiene relación vigente."); - } - } - public CargoTransaccion calculateMonto(CargoTransaccion cargoTransaccion, Cargo cargo, Double importe) { - if (null != cargo && null != cargo.getValor()) { - - cargoTransaccion = checkCargoTransaccion(cargoTransaccion); - - if ("AP_PORCENTAJE".equalsIgnoreCase(cargo.getValor().getTipo().getCodigo())) { - cargoTransaccion.setMontoCalculado(importe * (cargo.getValor().getValor() / 100)); - } else if ("AP_FIJO".equalsIgnoreCase(cargo.getValor().getTipo().getCodigo())) { - cargoTransaccion.setMontoCalculado(cargo.getValor().getValor()); - } else { - throw new BusinessException("No se puede calcular el monto, el código de aplicación no es válido."); - } + if (null == cargo || null == cargo.getValor()) { + throw new BusinessException("No se puede calcular el monto ya que el cargo no es válido."); + } else if (null == importe) { + throw new BusinessException("No se puede calcular el monto ya que el cargo no es válido."); + } + cargoTransaccion = checkCargoTransaccion(cargoTransaccion); + if ("AP_PORCENTAJE".equalsIgnoreCase(cargoTransaccion.getCodigoAplicacion())) { + cargoTransaccion.setMontoCalculado(importe * (cargo.getValor().getValor() / 100)); + } else if ("AP_FIJO".equalsIgnoreCase(cargoTransaccion.getCodigoAplicacion())) { + cargoTransaccion.setMontoCalculado(cargo.getValor().getValor()); } else { - throw new BusinessException("No se puede calcular el monto ya que el código de aplicación no es válido."); + cargoTransaccion.setMontoCalculado(0d); } return cargoTransaccion; } - public CargoTransaccion calculateCostoFinanciero(CargoTransaccion cargoTransaccion, Double importe, Double tasa, - Double bonificacion, Double monto) { - - if (importe < 0 || tasa < 0 || bonificacion < 0) { - throw new BusinessException("No se puede calcular el costo financiero con valores negativos."); - } - if (null == monto) { - monto = 0d; + public CargoTransaccion calculateMonto(CargoTransaccion cargoTransaccion, Double importe, PromocionResponse promocion) { + if (null == promocion || null == promocion.getTasaDirecta()) { + throw new BusinessException("No se puede calcular el monto sin tasa directa."); + } else if (null == promocion.getBonificacionCFVendedor()) { + promocion.setBonificacionCFVendedor(0d); } cargoTransaccion = checkCargoTransaccion(cargoTransaccion); + importe = checkDouble(importe); - Double montoCalculado = importe * tasa * ((100 - bonificacion) / 100); - cargoTransaccion.setMontoCalculado(montoCalculado + monto); + Double monto = importe * (promocion.getTasaDirecta() / 100) * ((100 - promocion.getBonificacionCFVendedor()) / 100); + cargoTransaccion.setMontoCalculado(monto); return cargoTransaccion; } - public CargoTransaccion calculateCostoFinanciero(CargoTransaccion cargoTransaccion, Double importe, Double tasa, Double monto) { - if (importe < 0 || tasa < 0) { - throw new BusinessException("No se puede calcular el costo financiero con valores negativos."); - } - if (null == monto) { - monto = 0d; - } + public CargoTransaccion calculateMontoTasaDirecta(CargoTransaccion cargoTransaccion, Double importe, Double tasaDirecta) { cargoTransaccion = checkCargoTransaccion(cargoTransaccion); + importe = checkDouble(importe); + tasaDirecta = checkDouble(tasaDirecta); - Double montoCalculado = importe * (tasa / 100); - cargoTransaccion.setMontoCalculado(montoCalculado + monto); + Double montoCalculado = importe * (tasaDirecta / 100); + cargoTransaccion.setMontoCalculado(montoCalculado); return cargoTransaccion; } - public CargoTransaccion calculateValorAplicado(CargoTransaccion cargoTransaccion, ReglaBonificacion regla) { - if (null == regla) { - throw new BusinessException("No se puede calcular el valor aplicado para una Regla de Bonificación nula."); + public PromocionResponse setCodigoTipoPromocion(PromocionResponse promocion) { + if (null != promocion && null == promocion.getIdPromocion()) { + promocion.setCodigo("PROMO_CTAS"); + } + return promocion; + } + + public CargoTransaccion calculateValorAplicado(CargoTransaccion cargoTransaccion, PromocionResponse promocion) { + if (null == promocion) { + throw new BusinessException("No se puede calcular el valor aplicado para una promoción nula."); } cargoTransaccion = checkCargoTransaccion(cargoTransaccion); - if (null == regla.getBonificacionCFVendedor()) { + if (null == promocion.getBonificacionCFVendedor()) { cargoTransaccion.setValorAplicado(0d); } else { - // TODO Tiene sentido validar el rango de valores para "BonificacionCFVendedor"? - Double bonificacion = regla.getBonificacionCFVendedor(); + Double bonificacion = promocion.getBonificacionCFVendedor(); if (bonificacion < 0 || bonificacion > 100) { throw new BusinessException("No se puede calcular el valor aplicado para una bonificacion menor que cero o mayor que 100."); } @@ -117,6 +88,35 @@ public CargoTransaccion calculateValorAplicado(CargoTransaccion cargoTransaccion return cargoTransaccion; } + public CargoTransaccion mapCargo(Cargo cargo, String idTransaccion) { + if (null == cargo) { + throw new BusinessException("No se puede mapear un cargo nulo."); + } + CargoTransaccion result = new CargoTransaccion(); + result.setIdCargo(cargo.getId()); + result.setValorAplicado(cargo.getValor().getValor()); + result.setIdTipoAplicacion(cargo.getValor().getIdTipoAplicacion()); + if (null != cargo.getTipoAplicacion()) { + result.setCodigoAplicacion(cargo.getTipoAplicacion().getCodigo()); + } + result.setCodigoTipoCargo(cargo.getTipoCargo().getCodigo()); + result.setIdTransaccion(idTransaccion); + + return result; + } + + public CargoTransaccion mapCargoCuenta(CargoCuenta cargoCuenta, CargoTransaccion cargoTransaccion) { + if (null == cargoCuenta) { + return cargoTransaccion; + } else { + cargoTransaccion.setValorAplicado(cargoCuenta.getValor()); + cargoTransaccion.setIdTipoAplicacion(cargoCuenta.getIdTipoAplicacion()); + cargoTransaccion.setCodigoAplicacion(cargoCuenta.getCodigo()); + + return cargoTransaccion; + } + } + private CargoTransaccion checkCargoTransaccion(CargoTransaccion cargoTransaccion) { if (null == cargoTransaccion) { cargoTransaccion = new CargoTransaccion(); @@ -124,11 +124,10 @@ private CargoTransaccion checkCargoTransaccion(CargoTransaccion cargoTransaccion return cargoTransaccion; } - private boolean isRelacionVigente(CargoCuenta cargoCuenta) { - Date inicioVigencia = cargoCuenta.getInicioVigencia(); - Date finVigencia = cargoCuenta.getFinVigencia(); - Date now = new Date(); - - return null != inicioVigencia && null != finVigencia && inicioVigencia.before(now) && finVigencia.after(now); + private Double checkDouble(Double value) { + if (null == value) { + value = 0d; + } + return value; } } diff --git a/src/main/java/com/prismamp/todopago/controller/CargoController.java b/src/main/java/com/prismamp/todopago/controller/CargoController.java deleted file mode 100644 index 3c26cbc..0000000 --- a/src/main/java/com/prismamp/todopago/controller/CargoController.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.prismamp.todopago.controller; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -import com.prismamp.todopago.model.Cargo; -import com.prismamp.todopago.service.CargoService; - -@RestController -public class CargoController { - - @Autowired - private CargoService service; - - @RequestMapping(method = RequestMethod.GET, value = "cargo") - public List findAll() { - - return service.findAll(); - } -} diff --git a/src/main/java/com/prismamp/todopago/model/CanalAdhesion.java b/src/main/java/com/prismamp/todopago/model/CanalAdhesion.java deleted file mode 100644 index c126917..0000000 --- a/src/main/java/com/prismamp/todopago/model/CanalAdhesion.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.prismamp.todopago.model; - -public class CanalAdhesion { - - private Long id; - - private String nombre; - - private String nivelRiesgo; - - private Boolean permitePromocion; - - private Boolean permiteDevolucion; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getNombre() { - return nombre; - } - - public void setNombre(String nombre) { - this.nombre = nombre; - } - - public String getNivelRiesgo() { - return nivelRiesgo; - } - - public void setNivelRiesgo(String nivelRiesgo) { - this.nivelRiesgo = nivelRiesgo; - } - - public Boolean getPermitePromocion() { - return permitePromocion; - } - - public void setPermitePromocion(Boolean permitePromocion) { - this.permitePromocion = permitePromocion; - } - - public Boolean getPermiteDevolucion() { - return permiteDevolucion; - } - - public void setPermiteDevolucion(Boolean permiteDevolucion) { - this.permiteDevolucion = permiteDevolucion; - } -} diff --git a/src/main/java/com/prismamp/todopago/model/Cargo.java b/src/main/java/com/prismamp/todopago/model/Cargo.java index 12eedfa..573067a 100644 --- a/src/main/java/com/prismamp/todopago/model/Cargo.java +++ b/src/main/java/com/prismamp/todopago/model/Cargo.java @@ -6,15 +6,19 @@ public class Cargo { private TipoCargo tipoCargo; - private TipoMedioPago tipoMedioPago; + private MedioPago medioPago; + + private Long idCuenta; private Long idTipoCuenta; private Long idBaseCalculo; - private CanalAdhesion canalAdhesion; + private Long idCanal; private Valor valor; + + private Tipo tipoAplicacion; public Long getId() { return id; @@ -32,12 +36,20 @@ public void setTipoCargo(TipoCargo tipoCargo) { this.tipoCargo = tipoCargo; } - public TipoMedioPago getTipoMedioPago() { - return tipoMedioPago; + public MedioPago getMedioPago() { + return medioPago; + } + + public void setMedioPago(MedioPago medioPago) { + this.medioPago = medioPago; + } + + public Long getIdCuenta() { + return idCuenta; } - public void setTipoMedioPago(TipoMedioPago tipoMedioPago) { - this.tipoMedioPago = tipoMedioPago; + public void setIdCuenta(Long idCuenta) { + this.idCuenta = idCuenta; } public Long getIdTipoCuenta() { @@ -56,12 +68,12 @@ public void setIdBaseCalculo(Long idBaseCalculo) { this.idBaseCalculo = idBaseCalculo; } - public CanalAdhesion getCanalAdhesion() { - return canalAdhesion; + public Long getIdCanal() { + return idCanal; } - public void setCanalAdhesion(CanalAdhesion canalAdhesion) { - this.canalAdhesion = canalAdhesion; + public void setIdCanal(Long idCanal) { + this.idCanal = idCanal; } public Valor getValor() { @@ -71,4 +83,13 @@ public Valor getValor() { public void setValor(Valor valor) { this.valor = valor; } + + public Tipo getTipoAplicacion() { + return tipoAplicacion; + } + + public void setTipoAplicacion(Tipo tipoAplicacion) { + this.tipoAplicacion = tipoAplicacion; + } + } diff --git a/src/main/java/com/prismamp/todopago/model/CargoCuenta.java b/src/main/java/com/prismamp/todopago/model/CargoCuenta.java index 6e55f2b..de1100e 100644 --- a/src/main/java/com/prismamp/todopago/model/CargoCuenta.java +++ b/src/main/java/com/prismamp/todopago/model/CargoCuenta.java @@ -1,16 +1,12 @@ package com.prismamp.todopago.model; -import java.util.Date; - public class CargoCuenta { private Double valor; - + private Long idTipoAplicacion; - - private Date inicioVigencia; - - private Date finVigencia; + + private String codigo; public Double getValor() { return valor; @@ -28,19 +24,12 @@ public void setIdTipoAplicacion(Long idTipoAplicacion) { this.idTipoAplicacion = idTipoAplicacion; } - public Date getInicioVigencia() { - return inicioVigencia; + public String getCodigo() { + return codigo; } - public void setInicioVigencia(Date inicioVigencia) { - this.inicioVigencia = inicioVigencia; + public void setCodigo(String codigo) { + this.codigo = codigo; } - public Date getFinVigencia() { - return finVigencia; - } - - public void setFinVigencia(Date finVigencia) { - this.finVigencia = finVigencia; - } } diff --git a/src/main/java/com/prismamp/todopago/model/CargoRequest.java b/src/main/java/com/prismamp/todopago/model/CargoRequest.java new file mode 100644 index 0000000..0f43322 --- /dev/null +++ b/src/main/java/com/prismamp/todopago/model/CargoRequest.java @@ -0,0 +1,86 @@ +package com.prismamp.todopago.model; + +import java.util.Date; + +public class CargoRequest { + + private Long facilitiesPayments; + + private Long idCuenta; + + private Long idMedioPago; + + private String canal; + + private Double importe; + + private String idTransaccion; + + private Long idPromotion; + + private Date created; + + public Long getFacilitiesPayments() { + return facilitiesPayments; + } + + public void setFacilitiesPayments(Long facilitiesPayments) { + this.facilitiesPayments = facilitiesPayments; + } + + public Long getIdCuenta() { + return idCuenta; + } + + public void setIdCuenta(Long idCuenta) { + this.idCuenta = idCuenta; + } + + public Long getIdMedioPago() { + return idMedioPago; + } + + public void setIdMedioPago(Long idMedioPago) { + this.idMedioPago = idMedioPago; + } + + public String getCanal() { + return canal; + } + + public void setCanal(String canal) { + this.canal = canal; + } + + public Double getImporte() { + return importe; + } + + public void setImporte(Double importe) { + this.importe = importe; + } + + public String getIdTransaccion() { + return idTransaccion; + } + + public void setIdTransaccion(String idTransaccion) { + this.idTransaccion = idTransaccion; + } + + public Long getIdPromotion() { + return idPromotion; + } + + public void setIdPromotion(Long idPromotion) { + this.idPromotion = idPromotion; + } + + public Date getCreated() { + return created; + } + + public void setCreated(Date created) { + this.created = created; + } +} diff --git a/src/main/java/com/prismamp/todopago/model/CargoTransaccion.java b/src/main/java/com/prismamp/todopago/model/CargoTransaccion.java index 9bfa088..5044fa8 100644 --- a/src/main/java/com/prismamp/todopago/model/CargoTransaccion.java +++ b/src/main/java/com/prismamp/todopago/model/CargoTransaccion.java @@ -4,14 +4,18 @@ public class CargoTransaccion { private Long idCargo; - private Long idTransaccion; - private Double montoCalculado; private Double valorAplicado; private Long idTipoAplicacion; + private String codigoAplicacion; + + private String codigoTipoCargo; + + private String idTransaccion; + public Long getIdCargo() { return idCargo; } @@ -20,14 +24,6 @@ public void setIdCargo(Long idCargo) { this.idCargo = idCargo; } - public Long getIdTransaccion() { - return idTransaccion; - } - - public void setIdTransaccion(Long idTransaccion) { - this.idTransaccion = idTransaccion; - } - public Double getMontoCalculado() { return montoCalculado; } @@ -51,4 +47,29 @@ public Long getIdTipoAplicacion() { public void setIdTipoAplicacion(Long idTipoAplicacion) { this.idTipoAplicacion = idTipoAplicacion; } + + public String getCodigoAplicacion() { + return codigoAplicacion; + } + + public void setCodigoAplicacion(String codigoAplicacion) { + this.codigoAplicacion = codigoAplicacion; + } + + public String getCodigoTipoCargo() { + return codigoTipoCargo; + } + + public void setCodigoTipoCargo(String codigoTipoCargo) { + this.codigoTipoCargo = codigoTipoCargo; + } + + public String getIdTransaccion() { + return idTransaccion; + } + + public void setIdTransaccion(String idTransaccion) { + this.idTransaccion = idTransaccion; + } + } diff --git a/src/main/java/com/prismamp/todopago/model/PromocionResponse.java b/src/main/java/com/prismamp/todopago/model/PromocionResponse.java new file mode 100644 index 0000000..783f669 --- /dev/null +++ b/src/main/java/com/prismamp/todopago/model/PromocionResponse.java @@ -0,0 +1,45 @@ +package com.prismamp.todopago.model; + +public class PromocionResponse { + + private Double bonificacionCFVendedor; + + private Double tasaDirecta; + + private String codigo; + + private Long idPromocion; + + public Double getBonificacionCFVendedor() { + return bonificacionCFVendedor; + } + + public void setBonificacionCFVendedor(Double bonificacionCFVendedor) { + this.bonificacionCFVendedor = bonificacionCFVendedor; + } + + public Double getTasaDirecta() { + return tasaDirecta; + } + + public void setTasaDirecta(Double tasaDirecta) { + this.tasaDirecta = tasaDirecta; + } + + public String getCodigo() { + return codigo; + } + + public void setCodigo(String codigo) { + this.codigo = codigo; + } + + public Long getIdPromocion() { + return idPromocion; + } + + public void setIdPromocion(Long idPromocion) { + this.idPromocion = idPromocion; + } + +} diff --git a/src/main/java/com/prismamp/todopago/model/ReglaBonificacion.java b/src/main/java/com/prismamp/todopago/model/ReglaBonificacion.java index 68c6c82..f3cfba2 100644 --- a/src/main/java/com/prismamp/todopago/model/ReglaBonificacion.java +++ b/src/main/java/com/prismamp/todopago/model/ReglaBonificacion.java @@ -4,8 +4,6 @@ public class ReglaBonificacion { private Boolean tasaDirecta; - private Double bonificacionCFVendedor; - private TasaMedioPago tasaMedioPago; private Double tasaDirectaIngresada; @@ -18,14 +16,6 @@ public void setTasaDirecta(Boolean tasaDirecta) { this.tasaDirecta = tasaDirecta; } - public Double getBonificacionCFVendedor() { - return bonificacionCFVendedor; - } - - public void setBonificacionCFVendedor(Double bonificacionCFVendedor) { - this.bonificacionCFVendedor = bonificacionCFVendedor; - } - public TasaMedioPago getTasaMedioPago() { return tasaMedioPago; } diff --git a/src/main/java/com/prismamp/todopago/model/TipoMedioPago.java b/src/main/java/com/prismamp/todopago/model/TipoMedioPago.java deleted file mode 100644 index fcfc4d9..0000000 --- a/src/main/java/com/prismamp/todopago/model/TipoMedioPago.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.prismamp.todopago.model; - -public class TipoMedioPago { - - public Long id; - - private String codigo; - - private String nombre; - - private Boolean permiteAnulacion; - - private Boolean permiteDevolucion; - - private Integer plazoDevolucion; - - private Boolean operaCuotas; - - private Boolean permiteContracargo; - - private Boolean permitidoBilletera; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getCodigo() { - return codigo; - } - - public void setCodigo(String codigo) { - this.codigo = codigo; - } - - public String getNombre() { - return nombre; - } - - public void setNombre(String nombre) { - this.nombre = nombre; - } - - public Boolean getPermiteAnulacion() { - return permiteAnulacion; - } - - public void setPermiteAnulacion(Boolean permiteAnulacion) { - this.permiteAnulacion = permiteAnulacion; - } - - public Boolean getPermiteDevolucion() { - return permiteDevolucion; - } - - public void setPermiteDevolucion(Boolean permiteDevolucion) { - this.permiteDevolucion = permiteDevolucion; - } - - public Integer getPlazoDevolucion() { - return plazoDevolucion; - } - - public void setPlazoDevolucion(Integer plazoDevolucion) { - this.plazoDevolucion = plazoDevolucion; - } - - public Boolean getOperaCuotas() { - return operaCuotas; - } - - public void setOperaCuotas(Boolean operaCuotas) { - this.operaCuotas = operaCuotas; - } - - public Boolean getPermiteContracargo() { - return permiteContracargo; - } - - public void setPermiteContracargo(Boolean permiteContracargo) { - this.permiteContracargo = permiteContracargo; - } - - public Boolean getPermitidoBilletera() { - return permitidoBilletera; - } - - public void setPermitidoBilletera(Boolean permitidoBilletera) { - this.permitidoBilletera = permitidoBilletera; - } -} diff --git a/src/main/java/com/prismamp/todopago/model/Transaccion.java b/src/main/java/com/prismamp/todopago/model/Transaccion.java deleted file mode 100644 index 3a5591f..0000000 --- a/src/main/java/com/prismamp/todopago/model/Transaccion.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.prismamp.todopago.model; - -import java.util.ArrayList; -import java.util.List; - -public class Transaccion { - - private Long id; - - private Long cuentaId; - - private Long idTipoCuenta; - - private Long idTipoMedioPago; - - private Long idBaseCalculo; - - private Double importe; - - private List cargos; - - private Long idPromotion; - - public Transaccion() { - this.cargos = new ArrayList(); - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public Long getCuentaId() { - return cuentaId; - } - - public void setCuentaId(Long cuentaId) { - this.cuentaId = cuentaId; - } - - public Long getIdTipoCuenta() { - return idTipoCuenta; - } - - public void setIdTipoCuenta(Long idTipoCuenta) { - this.idTipoCuenta = idTipoCuenta; - } - - public Long getIdTipoMedioPago() { - return idTipoMedioPago; - } - - public void setIdTipoMedioPago(Long idTipoMedioPago) { - this.idTipoMedioPago = idTipoMedioPago; - } - - public Long getIdBaseCalculo() { - return idBaseCalculo; - } - - public void setIdBaseCalculo(Long idBaseCalculo) { - this.idBaseCalculo = idBaseCalculo; - } - - public Double getImporte() { - return importe; - } - - public void setImporte(Double importe) { - this.importe = importe; - } - - public List getCargos() { - return cargos; - } - - public void setCargos(List cargos) { - this.cargos = cargos; - } - - public void addCargo(CargoTransaccion cargo) { - this.cargos.add(cargo); - } - - public Long getIdPromotion() { - return idPromotion; - } - - public void setIdPromotion(Long idPromotion) { - this.idPromotion = idPromotion; - } -} diff --git a/src/main/java/com/prismamp/todopago/model/Valor.java b/src/main/java/com/prismamp/todopago/model/Valor.java index 804c670..41cc996 100644 --- a/src/main/java/com/prismamp/todopago/model/Valor.java +++ b/src/main/java/com/prismamp/todopago/model/Valor.java @@ -1,10 +1,16 @@ package com.prismamp.todopago.model; +import java.util.Date; + public class Valor { private Double valor; - private Tipo tipo; + private Long idTipoAplicacion; + + private Date inicioVigencia; + + private Date finVigencia; public Double getValor() { return valor; @@ -14,11 +20,27 @@ public void setValor(Double valor) { this.valor = valor; } - public Tipo getTipo() { - return tipo; + public Long getIdTipoAplicacion() { + return idTipoAplicacion; + } + + public void setIdTipoAplicacion(Long idTipoAplicacion) { + this.idTipoAplicacion = idTipoAplicacion; + } + + public Date getInicioVigencia() { + return inicioVigencia; + } + + public void setInicioVigencia(Date inicioVigencia) { + this.inicioVigencia = inicioVigencia; + } + + public Date getFinVigencia() { + return finVigencia; } - public void setTipo(Tipo tipo) { - this.tipo = tipo; + public void setFinVigencia(Date finVigencia) { + this.finVigencia = finVigencia; } } diff --git a/src/main/java/com/prismamp/todopago/repository/CargoRepository.java b/src/main/java/com/prismamp/todopago/repository/CargoRepository.java index bf4d30e..94d2052 100644 --- a/src/main/java/com/prismamp/todopago/repository/CargoRepository.java +++ b/src/main/java/com/prismamp/todopago/repository/CargoRepository.java @@ -1,5 +1,6 @@ package com.prismamp.todopago.repository; +import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -11,6 +12,7 @@ import com.prismamp.todopago.model.Cargo; import com.prismamp.todopago.model.CargoCuenta; +import com.prismamp.todopago.model.PromocionResponse; import com.prismamp.todopago.model.ReglaBonificacion; @Repository @@ -27,29 +29,66 @@ public List updateAll() { throw new NotImplementedException(); } - public List findByBaseCalculoTransaccion(Long tipoCuenta, Long tipoMedioPago, Long baseCalculo) { - return findAll().stream().filter(p -> p.getIdTipoCuenta().equals(tipoCuenta)) - .filter(p -> p.getTipoMedioPago().getId().equals(tipoMedioPago)) - .filter(p -> p.getIdBaseCalculo().equals(baseCalculo)).collect(Collectors.toList()); + public List findByDefault(Long idCuenta, Long idMedioPago, Long idCanal, Date created, Long idBaseCalculo) { + return findAll().stream().filter(p -> idBaseCalculo == p.getIdBaseCalculo()) + .filter(p -> idCuenta.equals(p.getIdCuenta())) + .filter(p -> idMedioPago.equals(Long.parseLong(p.getMedioPago().getId()))) + .filter(p -> idCanal == null || idCanal.equals(p.getIdCanal()) || idCanal.equals(0)) + .filter(p -> p.getValor().getInicioVigencia().before(created)) + .filter(p -> null == p.getValor().getFinVigencia() || p.getValor().getFinVigencia().after(created)) + .collect(Collectors.toList()); } - public CargoCuenta findCargoCuenta(Long cargo, Long cuenta) { + public Long findIdTipoByCodigo(String codigo) { throw new NotImplementedException(); } - public ReglaBonificacion findReglaBonificacion(Long idPromotion) { + public Long findIdCanalByNombre(String nombre) { throw new NotImplementedException(); } - public Double findVolumenReglaPromocionBonificacion(Long idPromotion) { + public CargoCuenta findCargoCuenta(Long cargoId, Long cuentaId, Date created) { + throw new NotImplementedException(); + } + + public PromocionResponse findPromocion(Long idGrupoTipo, Long idPromotion) { + throw new NotImplementedException(); + } + + public PromocionResponse findPromocionTasaDirecta(Long idGrupoTipo, Long idPromotion) { throw new NotImplementedException(); } - public Double findVolumenReglaPromocionTasa(Long idPromotion) { + public Double findAcumuladorPromocionesMonto(Date created, Long idCuenta, Long idPromotion) { + throw new NotImplementedException(); + } + + public Double findAcumuladorPromocionesMonto(Long idCuenta, Long idPromotion) { throw new NotImplementedException(); } public Double findAcumuladorPromocionesMonto(Long idPromotion) { throw new NotImplementedException(); } + + public PromocionResponse findPromocionNotTasaDirecta(Double importe, Long idPromotion) { + throw new NotImplementedException(); + } + + public Long findIdTipoMedioPago(Long medioPago) { + throw new NotImplementedException(); + } + + public ReglaBonificacion findReglaBonificacion(Long idPromotion) { + throw new NotImplementedException(); + } + + public Double findVolumenReglaPromocionBonificacion(Long idPromotion) { + throw new NotImplementedException(); + } + + public Double findVolumenReglaPromocionTasa(Long idPromotion, Double importe) { + throw new NotImplementedException(); + } + } diff --git a/src/main/java/com/prismamp/todopago/service/CargoService.java b/src/main/java/com/prismamp/todopago/service/CargoService.java index 651de4c..a68912e 100644 --- a/src/main/java/com/prismamp/todopago/service/CargoService.java +++ b/src/main/java/com/prismamp/todopago/service/CargoService.java @@ -1,5 +1,6 @@ package com.prismamp.todopago.service; +import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; @@ -9,9 +10,10 @@ import com.prismamp.todopago.exceptions.BusinessException; import com.prismamp.todopago.model.Cargo; import com.prismamp.todopago.model.CargoCuenta; +import com.prismamp.todopago.model.CargoRequest; import com.prismamp.todopago.model.CargoTransaccion; +import com.prismamp.todopago.model.PromocionResponse; import com.prismamp.todopago.model.ReglaBonificacion; -import com.prismamp.todopago.model.Transaccion; import com.prismamp.todopago.repository.CargoRepository; @Service @@ -23,70 +25,94 @@ public class CargoService { @Autowired private CargoCalculator calculator; - public Transaccion calculateCargos(Transaccion transaccion) { - if (null == transaccion) { + public List calculateCargos(CargoRequest request) { + if (null == request) { throw new BusinessException(""); } - List cargos = repository.findByBaseCalculoTransaccion(transaccion.getIdTipoCuenta(), - transaccion.getIdTipoMedioPago(), transaccion.getIdBaseCalculo()); + Long idCanal = repository.findIdCanalByNombre(request.getCanal()); + Long idBaseCalculo = findIdBaseCalculo(request.getFacilitiesPayments()); - for (Cargo cargo : cargos) { - CargoTransaccion cargoTransaccion = new CargoTransaccion(); - CargoCuenta cargoCuenta = repository.findCargoCuenta(cargo.getId(), transaccion.getCuentaId()); + List defaultCargos = repository.findByDefault(request.getIdCuenta(), + request.getIdMedioPago(), idCanal, request.getCreated(), idBaseCalculo); + + List cargosTransaccion = new ArrayList<>(); + + for (Cargo cargo : defaultCargos) { + CargoTransaccion cargoTransaccion = calculator.mapCargo(cargo, request.getIdTransaccion()); + CargoCuenta cargoCuenta = repository.findCargoCuenta(cargo.getId(), request.getIdCuenta(), request.getCreated()); + cargoTransaccion = calculator.mapCargoCuenta(cargoCuenta, cargoTransaccion); if (!calculator.isCostoFinanciero(cargo)) { - cargoTransaccion = calculator.calculateRelacionVigente(cargoCuenta, cargo, cargoTransaccion); - cargoTransaccion = calculator.calculateMonto(cargoTransaccion, cargo, transaccion.getImporte()); + cargoTransaccion = calculator.calculateMonto(cargoTransaccion, cargo, request.getImporte()); } else { - Long idPromotion = transaccion.getIdPromotion(); + Long idPromotion = request.getIdPromotion(); ReglaBonificacion regla = repository.findReglaBonificacion(idPromotion); - Double monto = repository.findAcumuladorPromocionesMonto(idPromotion); + PromocionResponse promocion; if (!regla.isTasaDirecta()) { - cargoTransaccion = getCostoFinanciero(transaccion, cargoTransaccion, idPromotion, regla, monto); + promocion = repository.findPromocion(25L, idPromotion); } else { - cargoTransaccion = getCostoFinancieroTasaDirecta(transaccion, cargoTransaccion, idPromotion, regla, monto); + promocion = repository.findPromocionTasaDirecta(25L, idPromotion); + } + promocion = calculator.setCodigoTipoPromocion(promocion); + + if (null == idPromotion || 0 == idPromotion || 100 == promocion.getBonificacionCFVendedor()) { + cargoTransaccion.setMontoCalculado(0d); + cargoTransaccion.setValorAplicado(0d); + } else if (!"PROMO_CTAS".equals(promocion.getCodigo())) { + + if (!regla.isTasaDirecta()) { + Double montoTotal = getMontoTotal(promocion.getCodigo(), request); + PromocionResponse promocionNotTasaDirecta = repository.findPromocionNotTasaDirecta(montoTotal, idPromotion); + + promocion.setBonificacionCFVendedor(promocionNotTasaDirecta.getBonificacionCFVendedor()); + promocion.setTasaDirecta(promocionNotTasaDirecta.getTasaDirecta()); + + cargoTransaccion = calculator.calculateMonto(cargoTransaccion, request.getImporte(), promocion); + cargoTransaccion = calculator.calculateValorAplicado(cargoTransaccion, promocion); + } else { + if (null == regla.getTasaDirectaIngresada()) { + Double tasaDirecta = repository.findVolumenReglaPromocionTasa(idPromotion, request.getImporte()); + promocion.setTasaDirecta(tasaDirecta); + } + + cargoTransaccion = calculator.calculateMontoTasaDirecta(cargoTransaccion, request.getImporte(), promocion.getTasaDirecta()); + cargoTransaccion.setValorAplicado(promocion.getTasaDirecta()); + } } - cargoTransaccion.setIdTipoAplicacion(cargoCuenta.getIdTipoAplicacion()); - cargoTransaccion = calculator.calculateValorAplicado(cargoTransaccion, regla); } - - cargoTransaccion.setIdCargo(cargo.getId()); - cargoTransaccion.setIdTransaccion(transaccion.getId()); - transaccion.addCargo(cargoTransaccion); + cargosTransaccion.add(cargoTransaccion); } - return transaccion; + return cargosTransaccion; } - private CargoTransaccion getCostoFinancieroTasaDirecta(Transaccion transaccion, CargoTransaccion cargoTransaccion, - Long idPromotion, ReglaBonificacion regla, Double monto) { - Double tasa; - if (null == regla.getTasaDirectaIngresada()) { - tasa = repository.findVolumenReglaPromocionTasa(idPromotion); - } else { - tasa = regla.getTasaDirectaIngresada(); + private Double getMontoTotal(String codigo, CargoRequest request) { + Double result; + + switch (codigo) { + case "PROMO_VTA_MES_CTA": + result = repository.findAcumuladorPromocionesMonto(request.getCreated(), request.getIdCuenta(), request.getIdPromotion()); + break; + case "PROMO_VTA_TOTAL_CTA": + result = repository.findAcumuladorPromocionesMonto(request.getIdCuenta(), request.getIdPromotion()); + break; + case "PROMO_VTA_TOTAL": + result = repository.findAcumuladorPromocionesMonto(request.getIdPromotion()); + break; + default: + throw new BusinessException("No se puede reconocer el código del tipo de promoción."); } - cargoTransaccion = calculator.calculateCostoFinanciero(cargoTransaccion, transaccion.getImporte(), tasa, monto); - return cargoTransaccion; + return result; } - private CargoTransaccion getCostoFinanciero(Transaccion transaccion, CargoTransaccion cargoTransaccion, - Long idPromotion, ReglaBonificacion regla, Double monto) { - Double tasa; - Double bonificacion; - tasa = regla.getTasaMedioPago().getTasaDirecta(); - - if (null == regla.getBonificacionCFVendedor()) { - bonificacion = repository.findVolumenReglaPromocionBonificacion(idPromotion); + private Long findIdBaseCalculo(Long facilitiesPayments) { + String codigo; + if (1 == facilitiesPayments) { + codigo = "BC_TX_PAGO"; } else { - bonificacion = regla.getBonificacionCFVendedor(); + codigo = "BC_TX_CUOTAS"; } - cargoTransaccion = calculator.calculateCostoFinanciero(cargoTransaccion, transaccion.getImporte(), tasa, bonificacion, monto); - return cargoTransaccion; - } - - public List findAll() { - return repository.findAll(); + return repository.findIdTipoByCodigo(codigo); } } diff --git a/src/test/java/com/prismamp/todopago/calculator/CargoCalculatorSpec.groovy b/src/test/java/com/prismamp/todopago/calculator/CargoCalculatorSpec.groovy index b419348..319f3b1 100644 --- a/src/test/java/com/prismamp/todopago/calculator/CargoCalculatorSpec.groovy +++ b/src/test/java/com/prismamp/todopago/calculator/CargoCalculatorSpec.groovy @@ -4,6 +4,7 @@ import com.prismamp.todopago.exceptions.BusinessException import com.prismamp.todopago.model.Cargo import com.prismamp.todopago.model.CargoCuenta import com.prismamp.todopago.model.CargoTransaccion +import com.prismamp.todopago.model.PromocionResponse import com.prismamp.todopago.model.ReglaBonificacion import com.prismamp.todopago.model.Tipo import com.prismamp.todopago.model.TipoCargo @@ -39,151 +40,107 @@ class CargoCalculatorSpec extends Specification { new Cargo(tipoCargo: new TipoCargo(codigo: "")) || false } - def "Se calcula la vigencia de una relación con un Cargo o un CargoCuenta con valor null"() { - - when: "Se quiere calcular la vigencia de una relación" - calculator.calculateRelacionVigente(cargoCuenta, cargo, null) - - then: "Se tira BusinessException" - thrown(expectedException) - - where: - cargoCuenta | cargo | expectedException - null | new Cargo() | BusinessException - new CargoCuenta()| null | BusinessException - } - - def "Se calcula la vigencia de una relación con fechas vigentes y no vigentes"() { - - given: "Un Cargo con Valor" - Cargo cargo = new Cargo(valor: new Valor(valor: 100, tipo: new Tipo(id: 666))) - - when: "Se calcula la relación para una fecha vigente" - Date inicio = new Date(System.currentTimeMillis() - 3600 * 1000) - Date fin = new Date(System.currentTimeMillis() + 3600 * 1000) - CargoCuenta cargoCuenta = new CargoCuenta(valor: 50, idTipoAplicacion: 333, inicioVigencia: inicio, finVigencia: fin) - - CargoTransaccion cargoTransaccion = calculator.calculateRelacionVigente(cargoCuenta, cargo, null) - - then: "El Valor y el ID del tipo de aplicación se toman del CargoCuenta" - cargoTransaccion.idTipoAplicacion == 333 && cargoTransaccion.valorAplicado == 50 - - when: "Se calcula la relación para una fecha no vigente" - inicio = new Date(System.currentTimeMillis() + 3600 * 1000) - fin = new Date(System.currentTimeMillis() - 3600 * 1000) - cargoCuenta = new CargoCuenta(valor: 50, idTipoAplicacion: 333, inicioVigencia: inicio, finVigencia: fin) - - cargoTransaccion = calculator.calculateRelacionVigente(cargoCuenta, cargo, null) - - then: "El Valor y el ID del tipo de aplicación se toman del Cargo" - cargoTransaccion.idTipoAplicacion == 666 && cargoTransaccion.valorAplicado == 100 - } - - def "Se calcula el monto de un Cargo con valores null y se tira una BusinessException"() { + def "Se calcula el monto de un Cargo con valores inválidos y se tira una BusinessException"() { when: "Se calcula el monto de un Cargo" - calculator.calculateMonto(null, cargo, 0) + calculator.calculateMonto(null, cargo, importe) then: "Se tira BusinessException" thrown(expectedException) where: - cargo | expectedException - null | BusinessException - new Cargo(valor: null) | BusinessException - new Cargo(valor: new Valor(tipo: new Tipo(codigo: "XXX")))| BusinessException + cargo | importe | expectedException + null | 100 | BusinessException + new Cargo() | 100 | BusinessException + new Cargo(valor: new Valor()) | null | BusinessException } def "Se calcula el monto de un Cargo fijo y por porcentaje"() { - given: "Un Cargo con Valor con Tipo sin código" - Cargo cargo = new Cargo(valor: new Valor(valor: 300, tipo: new Tipo())) + given: "Un Cargo con Valor" + Cargo cargo = new Cargo(valor: new Valor(valor: 100)) when: "Se calcula el monto de un cargo fijo" - cargo.valor.tipo.codigo = "AP_FIJO" - CargoTransaccion cargoTransaccion = calculator.calculateMonto(null, cargo, 200) + CargoTransaccion cargoTransaccion = new CargoTransaccion(codigoAplicacion: "AP_FIJO") + cargoTransaccion = calculator.calculateMonto(cargoTransaccion, cargo, 50) then: "El monto se obtiene directamente del Valor" - cargoTransaccion.montoCalculado == 300 + cargoTransaccion.montoCalculado == 100 when: "Se calcula el monto de un cargo por porcentaje" - cargo.valor.tipo.codigo = "AP_PORCENTAJE" - cargoTransaccion = calculator.calculateMonto(null, cargo, 200) + cargoTransaccion = new CargoTransaccion(codigoAplicacion: "AP_PORCENTAJE") + cargoTransaccion = calculator.calculateMonto(cargoTransaccion, cargo, 50) then: "El monto se obtiene a través de la fórmula importe * (valor/100)" - cargoTransaccion.montoCalculado == 600 + cargoTransaccion.montoCalculado == 50 + + when: "Se calcula el monto de un cargo sin código de aplicación" + cargoTransaccion = new CargoTransaccion(codigoAplicacion: null) + cargoTransaccion = calculator.calculateMonto(cargoTransaccion, cargo, 50) + + then: "El monto es 0" + cargoTransaccion.montoCalculado == 0 } - def "Se calcular un costo financiero para tasa no directa con valores negativos y se tira una BusinessException"() { + def "Se calcula el monto de un CargoTransaccion no de Tasa Directa con valores inválidos y se tira una BusinessException"() { - when: "Se costo financiero" - calculator.calculateCostoFinanciero(null, importe, tasa, bonificacion, null) + when: "Se calcula el monto de un CargoTransaccion" + calculator.calculateMonto(null, 50, promocion) then: "Se tira BusinessException" thrown(expectedException) where: - importe | tasa | bonificacion | expectedException - 2 | 5 | -5 | BusinessException - -2 | 5 | 5 | BusinessException - 2 | -5 | 5 | BusinessException - -2 | -5 | -5 | BusinessException + promocion | expectedException + null | BusinessException + new PromocionResponse() | BusinessException } - def "Se calcula un costo financiero para tasa no directa con valores válidos y se obtiene un resultado válido"() { - - expect: - CargoTransaccion cargo = calculator.calculateCostoFinanciero(null, a, b, c, null) - result == cargo.montoCalculado + def "Se calcula el monto de un CargoTransaccion no de Tasa Directa"() { - where: - a | b | c || result - 1 | 1 | 0 || 1 - 50 | 50 | 0 || 2500 - 1 | 50 | 0 || 50 - 50 | 1 | 0 || 50 - } + given: "Una PromocionResponse válida" + PromocionResponse promocion = new PromocionResponse(bonificacionCFVendedor: 50, tasaDirecta: 50) - def "Se calcula un costo financiero para tasa directa con valores negativos y se tira una BusinessException"() { + when: "Se calcula el monto con importe null" + CargoTransaccion cargoTransaccion = calculator.calculateMonto(null, null, promocion) - when: "Se calcula el costo financiero" - calculator.calculateCostoFinanciero(null, importe, tasa, null) + then: "El monto se obtiene para un importe 0" + cargoTransaccion.montoCalculado == 0 - then: "Se tira BusinessException" - thrown(expectedException) + when: "Se calcula el monto con importe 50" + cargoTransaccion = calculator.calculateMonto(null, 50, promocion) - where: - importe | tasa | expectedException - -2 | 5 | BusinessException - 2 | -5 | BusinessException - -2 | -5 | BusinessException + then: "El monto se obtiene para un importe 50" + cargoTransaccion.montoCalculado == 12.5 } - def "Se calcula un costo financiero para tasa directa con valores válidos y se obtiene un resultado válido"() { + def "Se calcula el monto de un CargoTransaccion de Tasa Directa"() { expect: - CargoTransaccion cargo = calculator.calculateCostoFinanciero(null, a, b, null) + CargoTransaccion cargo = calculator.calculateMontoTasaDirecta(null, a, b) result == cargo.montoCalculado where: - a | b || result - 100 | 1 || 1 - 1 | 100 || 1 - 100 | 100 || 100 + a | b || result + 0 | 50 || 0 + null | 50 || 0 + 50 | 0 || 0 + 50 | null || 0 + 50 | 50 || 25 } - def "Se calcula el valor aplicado con una regla de bonificación inválida y se tira una BusinessException"() { + def "Se calcula el valor aplicado con una promocion inválida y se tira una BusinessException"() { when: "Se calcula el valos aplicado" - calculator.calculateValorAplicado(cargoTransaccion, regla) + calculator.calculateValorAplicado(cargoTransaccion, promocion) then: "Se tira BusinessException" thrown(expectedException) where: - cargoTransaccion | regla | expectedException - new CargoTransaccion() | new ReglaBonificacion(bonificacionCFVendedor: 101) | BusinessException - new CargoTransaccion() | new ReglaBonificacion(bonificacionCFVendedor: -1) | BusinessException + cargoTransaccion | promocion | expectedException + new CargoTransaccion() | new PromocionResponse(bonificacionCFVendedor: -1) | BusinessException + new CargoTransaccion() | new PromocionResponse(bonificacionCFVendedor: 101) | BusinessException new CargoTransaccion() | null | BusinessException } @@ -195,8 +152,8 @@ class CargoCalculatorSpec extends Specification { where: a | b || result - new CargoTransaccion() | new ReglaBonificacion(bonificacionCFVendedor: 100) || 0 - new CargoTransaccion() | new ReglaBonificacion(bonificacionCFVendedor: 50) || 50 - new CargoTransaccion() | new ReglaBonificacion(bonificacionCFVendedor: 0) || 100 + new CargoTransaccion() | new PromocionResponse(bonificacionCFVendedor: 100) || 0 + new CargoTransaccion() | new PromocionResponse(bonificacionCFVendedor: 50) || 50 + new CargoTransaccion() | new PromocionResponse(bonificacionCFVendedor: 0) || 100 } } \ No newline at end of file diff --git a/src/test/java/com/prismamp/todopago/helper/EntityBuilder.groovy b/src/test/java/com/prismamp/todopago/helper/EntityBuilder.groovy new file mode 100644 index 0000000..ceaa458 --- /dev/null +++ b/src/test/java/com/prismamp/todopago/helper/EntityBuilder.groovy @@ -0,0 +1,50 @@ +package com.prismamp.todopago.helper + +import com.prismamp.todopago.model.Cargo +import com.prismamp.todopago.model.MedioPago +import com.prismamp.todopago.model.Tipo +import com.prismamp.todopago.model.TipoCargo +import com.prismamp.todopago.model.Valor + +import java.text.SimpleDateFormat + +class EntityBuilder { + + static List createCargos() { + + SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH:mm:ss") + + MedioPago medio1 = new MedioPago(id: 42) + Valor valor1 = new Valor(inicioVigencia: sdf.parse("2015-08-12 12:20:24"), finVigencia: sdf.parse("2017-08-12 12:20:24"), valor: 3.99) + Valor valor2 = new Valor(inicioVigencia: sdf.parse("2015-06-05 16:23:46"), finVigencia: sdf.parse("2016-08-09 23:59:59"), valor: 4.90) + Valor valor3 = new Valor(inicioVigencia: sdf.parse("2015-07-09 12:44:59")) + Tipo tipoPorcentaje = new Tipo(id: 44, codigo: "AP_PORCENTAJE") + TipoCargo tipoComision = new TipoCargo(id: 1, codigo: "COMISION") + TipoCargo tipoCostoFinanciero = new TipoCargo(id: 2, codigo: "COSTO_FIN_V") + + Cargo cargo1 = new Cargo(id: 31, + idBaseCalculo: 37, + idCuenta: 30487, + medioPago: medio1, + valor: valor1, + tipoAplicacion: tipoPorcentaje, + tipoCargo: tipoComision) + + Cargo cargo2 = new Cargo(id: 17, + idBaseCalculo: 38, + idCuenta: 5205, + medioPago: medio1, + valor: valor2, + tipoAplicacion: tipoPorcentaje, + tipoCargo: tipoComision) + + Cargo cargo3 = new Cargo(id: 26, + idBaseCalculo: 38, + idCuenta: 5205, + medioPago: medio1, + valor: valor3, + tipoCargo: tipoCostoFinanciero) + + [cargo1, cargo2, cargo3] + } +} diff --git a/src/test/java/com/prismamp/todopago/repository/CargoRepositorySpec.groovy b/src/test/java/com/prismamp/todopago/repository/CargoRepositorySpec.groovy index 450f3c5..573472d 100644 --- a/src/test/java/com/prismamp/todopago/repository/CargoRepositorySpec.groovy +++ b/src/test/java/com/prismamp/todopago/repository/CargoRepositorySpec.groovy @@ -1,46 +1,28 @@ package com.prismamp.todopago.repository -import com.prismamp.todopago.model.Cargo -import com.prismamp.todopago.model.TipoMedioPago +import com.prismamp.todopago.helper.EntityBuilder import spock.lang.Specification +import java.text.SimpleDateFormat + class CargoRepositorySpec extends Specification { + SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH:mm:ss") + CargoRepository repository = Spy(CargoRepository) { - findAll() >> createCargos() + findAll() >> EntityBuilder.createCargos() } def "Búsqueda de Cargos por Base de Cálculo Transaccion"() { expect: - x == repository.findByBaseCalculoTransaccion(a, b, c).size() + x == repository.findByDefault(a, b, c, sdf.parse("2016-08-12 12:20:24"), d).size() where: - a | b | c || x - 27 | 1 | 37 || 1 - 29 | 1 | 37 || 0 - 29 | 4 | 38 || 1 - } - - List createCargos() { - - TipoMedioPago credito = new TipoMedioPago(id: 1, codigo: "CREDITO", nombre: "Crédito", permiteAnulacion: false, - permiteDevolucion: true, plazoDevolucion: 60, operaCuotas: true, permiteContracargo: false, permitidoBilletera: true) - TipoMedioPago debito = new TipoMedioPago(id: 2, codigo: "DEBITO", nombre: "Débito", permiteAnulacion: false, - permiteDevolucion: true, plazoDevolucion: 60, operaCuotas: true, permiteContracargo: false, permitidoBilletera: true) - TipoMedioPago efectivo = new TipoMedioPago(id: 3, codigo: "CREDITO", nombre: "Crédito", permiteAnulacion: false, - permiteDevolucion: false, operaCuotas: false, permiteContracargo: false, permitidoBilletera: false) - TipoMedioPago recargable = new TipoMedioPago(id: 4, codigo: "CREDITO", nombre: "Crédito", permiteAnulacion: false, - permiteDevolucion: false, operaCuotas: false, permiteContracargo: false, permitidoBilletera: false) - TipoMedioPago regalo = new TipoMedioPago(id: 5, codigo: "CREDITO", nombre: "Crédito", permiteAnulacion: false, - permiteDevolucion: false, operaCuotas: false, permiteContracargo: false, permitidoBilletera: false) - - Cargo cargo1 = new Cargo(id: 1, tipoMedioPago: credito, idTipoCuenta: 27, idBaseCalculo: 37) - Cargo cargo7 = new Cargo(id: 7, tipoMedioPago: debito, idTipoCuenta: 27, idBaseCalculo: 37) - Cargo cargo22 = new Cargo(id: 22, tipoMedioPago: efectivo, idTipoCuenta: 27, idBaseCalculo: 37) - Cargo cargo28 = new Cargo(id: 28, tipoMedioPago: recargable, idTipoCuenta: 29, idBaseCalculo: 38) - Cargo cargo138 = new Cargo(id: 138, tipoMedioPago: regalo, idTipoCuenta: 27, idBaseCalculo: 37) - - [cargo1, cargo7, cargo22, cargo28, cargo138] + a | b | c | d || x + 30487 | 42 | null | 37 || 1 + 30486 | 42 | null | 37 || 0 + 30487 | 41 | null | 37 || 0 + 30487 | 42 | null | 36 || 0 } } diff --git a/src/test/java/com/prismamp/todopago/service/CargoServiceSpec.groovy b/src/test/java/com/prismamp/todopago/service/CargoServiceSpec.groovy new file mode 100644 index 0000000..b5ef82c --- /dev/null +++ b/src/test/java/com/prismamp/todopago/service/CargoServiceSpec.groovy @@ -0,0 +1,91 @@ +package com.prismamp.todopago.service + +import com.prismamp.todopago.calculator.CargoCalculator +import com.prismamp.todopago.helper.EntityBuilder +import com.prismamp.todopago.model.CargoRequest +import com.prismamp.todopago.model.CargoTransaccion +import com.prismamp.todopago.model.PromocionResponse +import com.prismamp.todopago.model.ReglaBonificacion +import com.prismamp.todopago.model.TasaMedioPago +import com.prismamp.todopago.repository.CargoRepository +import spock.lang.Specification + +import java.text.SimpleDateFormat + +class CargoServiceSpec extends Specification { + + SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH:mm:ss") + + ReglaBonificacion reglaTasaIndirecta = new ReglaBonificacion( + tasaDirecta: false, + tasaMedioPago: new TasaMedioPago(tasaDirecta: 10)) + + PromocionResponse promocion = new PromocionResponse( + bonificacionCFVendedor: 15, + codigo: "PROMO_CTAS", + idPromocion: 252) + + CargoRepository repository = Spy(CargoRepository) { + findAll() >> EntityBuilder.createCargos() + findIdCanalByNombre("EmbeddedForm") >> null + findIdTipoByCodigo("BC_TX_PAGO") >> 37 + findIdTipoByCodigo("BC_TX_CUOTAS") >> 38 + findCargoCuenta(_, _, _) >> null + findReglaBonificacion(5432) >> reglaTasaIndirecta + findPromocion(25L, 5432) >> promocion +// findIdTipoMedioPago(42) >> 1 +// findIdTipoMedioPago(43) >> 2 +// findCargoCuenta(_, _) >> null +// findReglaBonificacion(2) >> reglaTasaIndirecta +// findAcumuladorPromocionesMonto(_) >> 100 +// findVolumenReglaPromocionTasa(_) >> 50 +// findVolumenReglaPromocionBonificacion(_) >> 50 + } + + CargoCalculator calculator = new CargoCalculator() + + CargoService service = new CargoService(repository: repository, calculator: calculator) + + def "Calculo cargos para un request válido no de costo financiero"() { + + given: "Un request válido no de costo financiero" + CargoRequest request = new CargoRequest( + facilitiesPayments: 1, + idCuenta: 30487, + idMedioPago: 42, + canal: "EmbeddedForm", + importe: 55, + idTransaccion: "001e28fe-ab5a-ebfa-125b-ca4f0900c86a", + idPromotion: 5427, + created: sdf.parse("2016-08-12 12:20:24")) + + when: "Se calculan los cargos" + List cargosCalculados = service.calculateCargos(request) + + then: "Los cargos calculados son 1 y sus valores correctos" + cargosCalculados.size() == 1 + cargosCalculados[0].montoCalculado.trunc(3) == 2.194 + } + + def "Calculo cargos para un request válido de costo financiero"() { + + given: "Un request válido de costo financiero" + CargoRequest request = new CargoRequest( + facilitiesPayments: 6, + idCuenta: 5205, + idMedioPago: 42, + canal: "EmbeddedForm", + importe: 3, + idTransaccion: "000943b5-156a-7da7-91e6-2f042da1b741", + idPromotion: 5432, + created: sdf.parse("2015-12-28 05:13:16")) + + when: "Se calculan los cargos" + List cargosCalculados = service.calculateCargos(request) + + then: "Los cargos calculados son 2 y sus valores correctos" + cargosCalculados.size() == 2 + cargosCalculados[0].montoCalculado.trunc(3) == 0.147 + cargosCalculados[1].montoCalculado == null + } +}