From d0fe6ba7204cf164381590c26b66c13ce58989fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=ADn=20Dib?= Date: Thu, 30 Nov 2017 12:18:06 -0300 Subject: [PATCH 1/4] Updates en los tests --- .../todopago/calculator/CargoCalculator.java | 5 +- .../com/prismamp/todopago/model/Cargo.java | 10 +++ .../prismamp/todopago/model/CargoRequest.java | 64 +++++++++++++++++++ .../todopago/model/CargoTransaccion.java | 6 +- .../prismamp/todopago/model/Transaccion.java | 16 +---- .../todopago/repository/CargoRepository.java | 12 +++- .../todopago/service/CargoService.java | 55 +++++++++------- .../todopago/helper/EntityBuilder.groovy | 45 +++++++++++++ .../repository/CargoRepositorySpec.groovy | 37 ++--------- .../todopago/service/CargoServiceSpec.groovy | 38 +++++++++++ 10 files changed, 215 insertions(+), 73 deletions(-) create mode 100644 src/main/java/com/prismamp/todopago/model/CargoRequest.java create mode 100644 src/test/java/com/prismamp/todopago/helper/EntityBuilder.groovy create mode 100644 src/test/java/com/prismamp/todopago/service/CargoServiceSpec.groovy diff --git a/src/main/java/com/prismamp/todopago/calculator/CargoCalculator.java b/src/main/java/com/prismamp/todopago/calculator/CargoCalculator.java index 2efd057..23a985f 100644 --- a/src/main/java/com/prismamp/todopago/calculator/CargoCalculator.java +++ b/src/main/java/com/prismamp/todopago/calculator/CargoCalculator.java @@ -25,7 +25,7 @@ public Boolean isCostoFinanciero(Cargo cargo) { public CargoTransaccion calculateRelacionVigente(CargoCuenta cargoCuenta, Cargo cargo, CargoTransaccion cargoTransaccion) { - if (null != cargoCuenta && null != cargo) { + if (null != cargo) { cargoTransaccion = checkCargoTransaccion(cargoTransaccion); if (isRelacionVigente(cargoCuenta)) { cargoTransaccion.setValorAplicado(cargoCuenta.getValor()); @@ -125,6 +125,9 @@ private CargoTransaccion checkCargoTransaccion(CargoTransaccion cargoTransaccion } private boolean isRelacionVigente(CargoCuenta cargoCuenta) { + if (null == cargoCuenta) { + return false; + } Date inicioVigencia = cargoCuenta.getInicioVigencia(); Date finVigencia = cargoCuenta.getFinVigencia(); Date now = new Date(); diff --git a/src/main/java/com/prismamp/todopago/model/Cargo.java b/src/main/java/com/prismamp/todopago/model/Cargo.java index 12eedfa..f39f0c1 100644 --- a/src/main/java/com/prismamp/todopago/model/Cargo.java +++ b/src/main/java/com/prismamp/todopago/model/Cargo.java @@ -8,6 +8,8 @@ public class Cargo { private TipoMedioPago tipoMedioPago; + private Long idCuenta; + private Long idTipoCuenta; private Long idBaseCalculo; @@ -40,6 +42,14 @@ public void setTipoMedioPago(TipoMedioPago tipoMedioPago) { this.tipoMedioPago = tipoMedioPago; } + public Long getIdCuenta() { + return idCuenta; + } + + public void setIdCuenta(Long idCuenta) { + this.idCuenta = idCuenta; + } + public Long getIdTipoCuenta() { return idTipoCuenta; } 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..e34153f --- /dev/null +++ b/src/main/java/com/prismamp/todopago/model/CargoRequest.java @@ -0,0 +1,64 @@ +package com.prismamp.todopago.model; + +public class CargoRequest { + + private Long idBaseCalculo; + + private Long idCuenta; + + private Long idMedioPago; + + private Long idCanal; + + private Double importe; + + private String idTransaccion; + + public Long getIdBaseCalculo() { + return idBaseCalculo; + } + + public void setIdBaseCalculo(Long idBaseCalculo) { + this.idBaseCalculo = idBaseCalculo; + } + + 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 Long getIdCanal() { + return idCanal; + } + + public void setIdCanal(Long idCanal) { + this.idCanal = idCanal; + } + + 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; + } +} diff --git a/src/main/java/com/prismamp/todopago/model/CargoTransaccion.java b/src/main/java/com/prismamp/todopago/model/CargoTransaccion.java index 9bfa088..17626f1 100644 --- a/src/main/java/com/prismamp/todopago/model/CargoTransaccion.java +++ b/src/main/java/com/prismamp/todopago/model/CargoTransaccion.java @@ -4,7 +4,7 @@ public class CargoTransaccion { private Long idCargo; - private Long idTransaccion; + private String idTransaccion; private Double montoCalculado; @@ -20,11 +20,11 @@ public void setIdCargo(Long idCargo) { this.idCargo = idCargo; } - public Long getIdTransaccion() { + public String getIdTransaccion() { return idTransaccion; } - public void setIdTransaccion(Long idTransaccion) { + public void setIdTransaccion(String idTransaccion) { this.idTransaccion = idTransaccion; } diff --git a/src/main/java/com/prismamp/todopago/model/Transaccion.java b/src/main/java/com/prismamp/todopago/model/Transaccion.java index 3a5591f..779d112 100644 --- a/src/main/java/com/prismamp/todopago/model/Transaccion.java +++ b/src/main/java/com/prismamp/todopago/model/Transaccion.java @@ -5,12 +5,10 @@ public class Transaccion { - private Long id; + private String id; private Long cuentaId; - private Long idTipoCuenta; - private Long idTipoMedioPago; private Long idBaseCalculo; @@ -25,11 +23,11 @@ public Transaccion() { this.cargos = new ArrayList(); } - public Long getId() { + public String getId() { return id; } - public void setId(Long id) { + public void setId(String id) { this.id = id; } @@ -41,14 +39,6 @@ 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; } diff --git a/src/main/java/com/prismamp/todopago/repository/CargoRepository.java b/src/main/java/com/prismamp/todopago/repository/CargoRepository.java index bf4d30e..80466c6 100644 --- a/src/main/java/com/prismamp/todopago/repository/CargoRepository.java +++ b/src/main/java/com/prismamp/todopago/repository/CargoRepository.java @@ -27,10 +27,16 @@ public List updateAll() { throw new NotImplementedException(); } - public List findByBaseCalculoTransaccion(Long tipoCuenta, Long tipoMedioPago, Long baseCalculo) { - return findAll().stream().filter(p -> p.getIdTipoCuenta().equals(tipoCuenta)) + public List findByBaseCalculoTransaccion(Long baseCalculo, Long cuenta, Long tipoMedioPago, Long canal) { + return findAll().stream().filter(p -> p.getIdBaseCalculo().equals(baseCalculo)) + .filter(p -> p.getIdCuenta().equals(cuenta)) .filter(p -> p.getTipoMedioPago().getId().equals(tipoMedioPago)) - .filter(p -> p.getIdBaseCalculo().equals(baseCalculo)).collect(Collectors.toList()); + .filter(p -> null == p.getCanalAdhesion().getId() || p.getCanalAdhesion().getId().equals(canal)) + .collect(Collectors.toList()); + } + + public Long findIdTipoMedioPago(Long medioPago) { + throw new NotImplementedException(); } public CargoCuenta findCargoCuenta(Long cargo, Long cuenta) { diff --git a/src/main/java/com/prismamp/todopago/service/CargoService.java b/src/main/java/com/prismamp/todopago/service/CargoService.java index 651de4c..1928305 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,6 +10,7 @@ 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.ReglaBonificacion; import com.prismamp.todopago.model.Transaccion; @@ -23,40 +25,46 @@ 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()); + + List cargosTransaccion = new ArrayList(); + + Long idTipoMedioPago = repository.findIdTipoMedioPago(request.getIdMedioPago()); + + List cargos = repository.findByBaseCalculoTransaccion(request.getIdBaseCalculo(), request.getIdCuenta(), + idTipoMedioPago, request.getIdCanal()); for (Cargo cargo : cargos) { CargoTransaccion cargoTransaccion = new CargoTransaccion(); - CargoCuenta cargoCuenta = repository.findCargoCuenta(cargo.getId(), transaccion.getCuentaId()); + CargoCuenta cargoCuenta = repository.findCargoCuenta(cargo.getId(), request.getIdCuenta()); 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(); - - ReglaBonificacion regla = repository.findReglaBonificacion(idPromotion); - Double monto = repository.findAcumuladorPromocionesMonto(idPromotion); - - if (!regla.isTasaDirecta()) { - cargoTransaccion = getCostoFinanciero(transaccion, cargoTransaccion, idPromotion, regla, monto); - } else { - cargoTransaccion = getCostoFinancieroTasaDirecta(transaccion, cargoTransaccion, idPromotion, regla, monto); - } - cargoTransaccion.setIdTipoAplicacion(cargoCuenta.getIdTipoAplicacion()); - cargoTransaccion = calculator.calculateValorAplicado(cargoTransaccion, regla); +// Long idPromotion = transaccion.getIdPromotion(); +// +// ReglaBonificacion regla = repository.findReglaBonificacion(idPromotion); +// Double monto = repository.findAcumuladorPromocionesMonto(idPromotion); +// +// if (!regla.isTasaDirecta()) { +// cargoTransaccion = getCostoFinanciero(transaccion, cargoTransaccion, idPromotion, regla, monto); +// } else { +// cargoTransaccion = getCostoFinancieroTasaDirecta(transaccion, cargoTransaccion, idPromotion, regla, +// monto); +// } +// cargoTransaccion.setIdTipoAplicacion(cargoCuenta.getIdTipoAplicacion()); +// cargoTransaccion = calculator.calculateValorAplicado(cargoTransaccion, regla); } - +// cargoTransaccion.setIdCargo(cargo.getId()); - cargoTransaccion.setIdTransaccion(transaccion.getId()); - transaccion.addCargo(cargoTransaccion); + cargoTransaccion.setIdTransaccion(request.getIdTransaccion()); + cargosTransaccion.add(cargoTransaccion); } - return transaccion; + return cargosTransaccion; } private CargoTransaccion getCostoFinancieroTasaDirecta(Transaccion transaccion, CargoTransaccion cargoTransaccion, @@ -82,7 +90,8 @@ private CargoTransaccion getCostoFinanciero(Transaccion transaccion, CargoTransa } else { bonificacion = regla.getBonificacionCFVendedor(); } - cargoTransaccion = calculator.calculateCostoFinanciero(cargoTransaccion, transaccion.getImporte(), tasa, bonificacion, monto); + cargoTransaccion = calculator.calculateCostoFinanciero(cargoTransaccion, transaccion.getImporte(), tasa, + bonificacion, monto); return cargoTransaccion; } 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..af02270 --- /dev/null +++ b/src/test/java/com/prismamp/todopago/helper/EntityBuilder.groovy @@ -0,0 +1,45 @@ +package com.prismamp.todopago.helper + +import com.prismamp.todopago.model.CanalAdhesion +import com.prismamp.todopago.model.Cargo +import com.prismamp.todopago.model.Tipo +import com.prismamp.todopago.model.TipoCargo +import com.prismamp.todopago.model.TipoMedioPago +import com.prismamp.todopago.model.Valor + +class EntityBuilder { + + static 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) + + CanalAdhesion canal = new CanalAdhesion() + + Valor valor9 = new Valor(valor: 0.00, tipo: new Tipo(id: 44, codigo: "AP_PORCENTAJE")) + Valor valor21 = new Valor(valor: 4.90, tipo: new Tipo(id: 44, codigo: "AP_PORCENTAJE")) + Valor valor36 = new Valor(valor: 3.99, tipo: new Tipo(id: 44, codigo: "AP_PORCENTAJE")) + Valor valor54 = new Valor(valor: 1.50, tipo: new Tipo(id: 44, codigo: "AP_PORCENTAJE")) + + TipoCargo tipoComision = new TipoCargo(id: 1, codigo: "COMISION") + + Cargo cargo7 = new Cargo(id: 7, tipoMedioPago: credito, idTipoCuenta: 27, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 1) + Cargo cargo9 = new Cargo(id: 9, tipoMedioPago: debito, idTipoCuenta: 29, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 40488, valor: valor9, tipoCargo: tipoComision) + Cargo cargo21 = new Cargo(id: 21, tipoMedioPago: debito, idTipoCuenta: 29, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 40488, valor: valor21, tipoCargo: tipoComision) + Cargo cargo22 = new Cargo(id: 22, tipoMedioPago: efectivo, idTipoCuenta: 27, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 2) + Cargo cargo28 = new Cargo(id: 28, tipoMedioPago: recargable, idTipoCuenta: 27, idBaseCalculo: 38, canalAdhesion: canal, idCuenta: 3) + Cargo cargo36 = new Cargo(id: 36, tipoMedioPago: debito, idTipoCuenta: 29, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 40488, valor: valor36, tipoCargo: tipoComision) + Cargo cargo54 = new Cargo(id: 54, tipoMedioPago: debito, idTipoCuenta: 29, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 40488, valor: valor54, tipoCargo: tipoComision) + Cargo cargo138 = new Cargo(id: 138, tipoMedioPago: regalo, idTipoCuenta: 27, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 4) + + [cargo7, cargo9, cargo21, cargo22, cargo28, cargo36, cargo54, cargo138] + } +} diff --git a/src/test/java/com/prismamp/todopago/repository/CargoRepositorySpec.groovy b/src/test/java/com/prismamp/todopago/repository/CargoRepositorySpec.groovy index 450f3c5..abd3a80 100644 --- a/src/test/java/com/prismamp/todopago/repository/CargoRepositorySpec.groovy +++ b/src/test/java/com/prismamp/todopago/repository/CargoRepositorySpec.groovy @@ -1,46 +1,23 @@ 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 class CargoRepositorySpec extends Specification { 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.findByBaseCalculoTransaccion(a, b, c, 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 + 37 | 40488 | 2 | 7 || 4 + 37 | 40488 | 2 | null || 4 + 37 | 40488 | 1 | null || 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..c1746a7 --- /dev/null +++ b/src/test/java/com/prismamp/todopago/service/CargoServiceSpec.groovy @@ -0,0 +1,38 @@ +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.repository.CargoRepository +import spock.lang.Specification + +class CargoServiceSpec extends Specification { + + CargoRepository repository = Spy(CargoRepository) { + findAll() >> EntityBuilder.createCargos() + findIdTipoMedioPago(43) >> 2 + findCargoCuenta(_, _) >> null + } + + CargoCalculator calculator = new CargoCalculator() + + CargoService service = new CargoService(repository: repository, calculator: calculator) + + def "Calculo cargos para un request válido"() { + + given: "Un request válido" + CargoRequest request = new CargoRequest(idBaseCalculo: 37, + idCuenta: 40488, + idMedioPago: 43, + idCanal: 7, + importe: 2.87, + idTransaccion: "0001b0d7-2acf-5e2f-1acd-c84511eftest") + + when: "Se calculan los cargos" + List cargosCalculados = service.calculateCargos(request) + + then: "Los cargos calculados son 4 y sus valores correctos" + null == cargosCalculados + } +} From 8bbb8267ec96aacba0c497ccbe8e77fdc79f21a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=ADn=20Dib?= Date: Fri, 1 Dec 2017 11:55:37 -0300 Subject: [PATCH 2/4] Se agrega test para CargoService --- .../prismamp/todopago/model/CargoRequest.java | 22 +++++ .../com/prismamp/todopago/model/Valor.java | 22 +++++ .../todopago/repository/CargoRepository.java | 5 +- .../todopago/service/CargoService.java | 45 ++++----- .../todopago/helper/EntityBuilder.groovy | 33 +++---- .../repository/CargoRepositorySpec.groovy | 14 ++- .../todopago/service/CargoServiceSpec.groovy | 94 +++++++++++++++++-- 7 files changed, 180 insertions(+), 55 deletions(-) diff --git a/src/main/java/com/prismamp/todopago/model/CargoRequest.java b/src/main/java/com/prismamp/todopago/model/CargoRequest.java index e34153f..9215105 100644 --- a/src/main/java/com/prismamp/todopago/model/CargoRequest.java +++ b/src/main/java/com/prismamp/todopago/model/CargoRequest.java @@ -1,5 +1,7 @@ package com.prismamp.todopago.model; +import java.util.Date; + public class CargoRequest { private Long idBaseCalculo; @@ -14,6 +16,10 @@ public class CargoRequest { private String idTransaccion; + private Long idPromotion; + + private Date created; + public Long getIdBaseCalculo() { return idBaseCalculo; } @@ -61,4 +67,20 @@ public String getIdTransaccion() { 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/Valor.java b/src/main/java/com/prismamp/todopago/model/Valor.java index 804c670..4fb1e22 100644 --- a/src/main/java/com/prismamp/todopago/model/Valor.java +++ b/src/main/java/com/prismamp/todopago/model/Valor.java @@ -1,11 +1,17 @@ package com.prismamp.todopago.model; +import java.util.Date; + public class Valor { private Double valor; private Tipo tipo; + private Date inicioVigencia; + + private Date finVigencia; + public Double getValor() { return valor; } @@ -21,4 +27,20 @@ public Tipo getTipo() { public void setTipo(Tipo tipo) { this.tipo = tipo; } + + public Date getInicioVigencia() { + return inicioVigencia; + } + + public void setInicioVigencia(Date inicioVigencia) { + this.inicioVigencia = inicioVigencia; + } + + public Date getFinVigencia() { + return finVigencia; + } + + 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 80466c6..7e9ddaf 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; @@ -27,11 +28,13 @@ public List updateAll() { throw new NotImplementedException(); } - public List findByBaseCalculoTransaccion(Long baseCalculo, Long cuenta, Long tipoMedioPago, Long canal) { + public List findByBaseCalculoTransaccion(Long baseCalculo, Long cuenta, Long tipoMedioPago, Long canal, Date created) { return findAll().stream().filter(p -> p.getIdBaseCalculo().equals(baseCalculo)) .filter(p -> p.getIdCuenta().equals(cuenta)) .filter(p -> p.getTipoMedioPago().getId().equals(tipoMedioPago)) .filter(p -> null == p.getCanalAdhesion().getId() || p.getCanalAdhesion().getId().equals(canal)) + .filter(p -> p.getValor().getInicioVigencia().before(created)) + .filter(p -> null == p.getValor().getFinVigencia() || p.getValor().getFinVigencia().after(created)) .collect(Collectors.toList()); } diff --git a/src/main/java/com/prismamp/todopago/service/CargoService.java b/src/main/java/com/prismamp/todopago/service/CargoService.java index 1928305..01fe380 100644 --- a/src/main/java/com/prismamp/todopago/service/CargoService.java +++ b/src/main/java/com/prismamp/todopago/service/CargoService.java @@ -13,7 +13,6 @@ import com.prismamp.todopago.model.CargoRequest; import com.prismamp.todopago.model.CargoTransaccion; import com.prismamp.todopago.model.ReglaBonificacion; -import com.prismamp.todopago.model.Transaccion; import com.prismamp.todopago.repository.CargoRepository; @Service @@ -35,7 +34,7 @@ public List calculateCargos(CargoRequest request) { Long idTipoMedioPago = repository.findIdTipoMedioPago(request.getIdMedioPago()); List cargos = repository.findByBaseCalculoTransaccion(request.getIdBaseCalculo(), request.getIdCuenta(), - idTipoMedioPago, request.getIdCanal()); + idTipoMedioPago, request.getIdCanal(), request.getCreated()); for (Cargo cargo : cargos) { CargoTransaccion cargoTransaccion = new CargoTransaccion(); @@ -45,21 +44,23 @@ public List calculateCargos(CargoRequest request) { cargoTransaccion = calculator.calculateRelacionVigente(cargoCuenta, cargo, cargoTransaccion); cargoTransaccion = calculator.calculateMonto(cargoTransaccion, cargo, request.getImporte()); } else { -// Long idPromotion = transaccion.getIdPromotion(); -// -// ReglaBonificacion regla = repository.findReglaBonificacion(idPromotion); -// Double monto = repository.findAcumuladorPromocionesMonto(idPromotion); -// -// if (!regla.isTasaDirecta()) { -// cargoTransaccion = getCostoFinanciero(transaccion, cargoTransaccion, idPromotion, regla, monto); -// } else { -// cargoTransaccion = getCostoFinancieroTasaDirecta(transaccion, cargoTransaccion, idPromotion, regla, -// monto); -// } -// cargoTransaccion.setIdTipoAplicacion(cargoCuenta.getIdTipoAplicacion()); -// cargoTransaccion = calculator.calculateValorAplicado(cargoTransaccion, regla); + Long idPromotion = request.getIdPromotion(); + + ReglaBonificacion regla = repository.findReglaBonificacion(idPromotion); + Double monto = repository.findAcumuladorPromocionesMonto(idPromotion); + + if (!regla.isTasaDirecta()) { + cargoTransaccion = getCostoFinanciero(request.getImporte(), cargoTransaccion, idPromotion, regla, monto); + } else { + cargoTransaccion = getCostoFinancieroTasaDirecta(request.getImporte(), cargoTransaccion, idPromotion, regla, + monto); + } + if (null != cargoCuenta) { + cargoTransaccion.setIdTipoAplicacion(cargoCuenta.getIdTipoAplicacion()); + } + cargoTransaccion = calculator.calculateValorAplicado(cargoTransaccion, regla); } -// + cargoTransaccion.setIdCargo(cargo.getId()); cargoTransaccion.setIdTransaccion(request.getIdTransaccion()); cargosTransaccion.add(cargoTransaccion); @@ -67,20 +68,21 @@ public List calculateCargos(CargoRequest request) { return cargosTransaccion; } - private CargoTransaccion getCostoFinancieroTasaDirecta(Transaccion transaccion, CargoTransaccion cargoTransaccion, + private CargoTransaccion getCostoFinancieroTasaDirecta(Double importe, CargoTransaccion cargoTransaccion, Long idPromotion, ReglaBonificacion regla, Double monto) { Double tasa; + if (null == regla.getTasaDirectaIngresada()) { tasa = repository.findVolumenReglaPromocionTasa(idPromotion); } else { tasa = regla.getTasaDirectaIngresada(); } - cargoTransaccion = calculator.calculateCostoFinanciero(cargoTransaccion, transaccion.getImporte(), tasa, monto); + cargoTransaccion = calculator.calculateCostoFinanciero(cargoTransaccion, importe, tasa, monto); return cargoTransaccion; } - private CargoTransaccion getCostoFinanciero(Transaccion transaccion, CargoTransaccion cargoTransaccion, - Long idPromotion, ReglaBonificacion regla, Double monto) { + private CargoTransaccion getCostoFinanciero(Double importe, CargoTransaccion cargoTransaccion, Long idPromotion, + ReglaBonificacion regla, Double monto) { Double tasa; Double bonificacion; tasa = regla.getTasaMedioPago().getTasaDirecta(); @@ -90,8 +92,7 @@ private CargoTransaccion getCostoFinanciero(Transaccion transaccion, CargoTransa } else { bonificacion = regla.getBonificacionCFVendedor(); } - cargoTransaccion = calculator.calculateCostoFinanciero(cargoTransaccion, transaccion.getImporte(), tasa, - bonificacion, monto); + cargoTransaccion = calculator.calculateCostoFinanciero(cargoTransaccion, importe, tasa, bonificacion, monto); return cargoTransaccion; } diff --git a/src/test/java/com/prismamp/todopago/helper/EntityBuilder.groovy b/src/test/java/com/prismamp/todopago/helper/EntityBuilder.groovy index af02270..42ec2f6 100644 --- a/src/test/java/com/prismamp/todopago/helper/EntityBuilder.groovy +++ b/src/test/java/com/prismamp/todopago/helper/EntityBuilder.groovy @@ -7,6 +7,8 @@ import com.prismamp.todopago.model.TipoCargo import com.prismamp.todopago.model.TipoMedioPago import com.prismamp.todopago.model.Valor +import java.text.SimpleDateFormat + class EntityBuilder { static List createCargos() { @@ -15,31 +17,24 @@ class EntityBuilder { 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) CanalAdhesion canal = new CanalAdhesion() - Valor valor9 = new Valor(valor: 0.00, tipo: new Tipo(id: 44, codigo: "AP_PORCENTAJE")) - Valor valor21 = new Valor(valor: 4.90, tipo: new Tipo(id: 44, codigo: "AP_PORCENTAJE")) - Valor valor36 = new Valor(valor: 3.99, tipo: new Tipo(id: 44, codigo: "AP_PORCENTAJE")) - Valor valor54 = new Valor(valor: 1.50, tipo: new Tipo(id: 44, codigo: "AP_PORCENTAJE")) + SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH:mm:ss") + + Valor valor1 = new Valor(valor: 1.50, tipo: new Tipo(id: 43, codigo: "AP_FIJO"), inicioVigencia: sdf.parse("2011-10-10 10:10:10"), finVigencia: sdf.parse("2013-10-10 10:10:10")) + Valor valor2 = new Valor(valor: 3.00, tipo: new Tipo(id: 43, codigo: "AP_FIJO"), inicioVigencia: sdf.parse("2014-10-10 10:10:10"), finVigencia: sdf.parse("2016-10-10 10:10:10")) + Valor valor3 = new Valor(valor: 2.00, tipo: new Tipo(id: 44, codigo: "AP_PORCENTAJE"), inicioVigencia: sdf.parse("2011-10-10 10:10:10"), finVigencia: sdf.parse("2013-10-10 10:10:10")) + Valor valor4 = new Valor(valor: 4.00, tipo: new Tipo(id: 44, codigo: "AP_PORCENTAJE"), inicioVigencia: sdf.parse("2014-10-10 10:10:10"), finVigencia: sdf.parse("2016-10-10 10:10:10")) TipoCargo tipoComision = new TipoCargo(id: 1, codigo: "COMISION") + TipoCargo tipoCostoFinanciero = new TipoCargo(id: 2, codigo: "COSTO_FIN_V") - Cargo cargo7 = new Cargo(id: 7, tipoMedioPago: credito, idTipoCuenta: 27, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 1) - Cargo cargo9 = new Cargo(id: 9, tipoMedioPago: debito, idTipoCuenta: 29, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 40488, valor: valor9, tipoCargo: tipoComision) - Cargo cargo21 = new Cargo(id: 21, tipoMedioPago: debito, idTipoCuenta: 29, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 40488, valor: valor21, tipoCargo: tipoComision) - Cargo cargo22 = new Cargo(id: 22, tipoMedioPago: efectivo, idTipoCuenta: 27, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 2) - Cargo cargo28 = new Cargo(id: 28, tipoMedioPago: recargable, idTipoCuenta: 27, idBaseCalculo: 38, canalAdhesion: canal, idCuenta: 3) - Cargo cargo36 = new Cargo(id: 36, tipoMedioPago: debito, idTipoCuenta: 29, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 40488, valor: valor36, tipoCargo: tipoComision) - Cargo cargo54 = new Cargo(id: 54, tipoMedioPago: debito, idTipoCuenta: 29, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 40488, valor: valor54, tipoCargo: tipoComision) - Cargo cargo138 = new Cargo(id: 138, tipoMedioPago: regalo, idTipoCuenta: 27, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 4) + Cargo cargo1 = new Cargo(tipoMedioPago: debito, idTipoCuenta: 37, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 1, valor: valor1, tipoCargo: tipoComision) + Cargo cargo2 = new Cargo(tipoMedioPago: credito, idTipoCuenta: 37, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 1, valor: valor2, tipoCargo: tipoCostoFinanciero) + Cargo cargo3 = new Cargo(tipoMedioPago: debito, idTipoCuenta: 37, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 1, valor: valor3, tipoCargo: tipoComision) + Cargo cargo4 = new Cargo(tipoMedioPago: credito, idTipoCuenta: 37, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 1, valor: valor4, tipoCargo: tipoCostoFinanciero) - [cargo7, cargo9, cargo21, cargo22, cargo28, cargo36, cargo54, cargo138] + [cargo1, cargo2, cargo3, cargo4] } } diff --git a/src/test/java/com/prismamp/todopago/repository/CargoRepositorySpec.groovy b/src/test/java/com/prismamp/todopago/repository/CargoRepositorySpec.groovy index abd3a80..0d34113 100644 --- a/src/test/java/com/prismamp/todopago/repository/CargoRepositorySpec.groovy +++ b/src/test/java/com/prismamp/todopago/repository/CargoRepositorySpec.groovy @@ -3,8 +3,12 @@ package com.prismamp.todopago.repository 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() >> EntityBuilder.createCargos() } @@ -12,12 +16,12 @@ class CargoRepositorySpec extends Specification { def "Búsqueda de Cargos por Base de Cálculo Transaccion"() { expect: - x == repository.findByBaseCalculoTransaccion(a, b, c, d).size() + x == repository.findByBaseCalculoTransaccion(a, b, c, d, sdf.parse("2012-10-10 10:10:10")).size() where: - a | b | c | d || x - 37 | 40488 | 2 | 7 || 4 - 37 | 40488 | 2 | null || 4 - 37 | 40488 | 1 | null || 0 + a | b | c | d || x + 37 | 1 | 2 | 7 || 2 + 37 | 1 | 1 | 7 || 0 + 36 | 1 | 1 | 7 || 0 } } diff --git a/src/test/java/com/prismamp/todopago/service/CargoServiceSpec.groovy b/src/test/java/com/prismamp/todopago/service/CargoServiceSpec.groovy index c1746a7..801dc92 100644 --- a/src/test/java/com/prismamp/todopago/service/CargoServiceSpec.groovy +++ b/src/test/java/com/prismamp/todopago/service/CargoServiceSpec.groovy @@ -4,35 +4,113 @@ 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.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 reglaTasaDirecta = new ReglaBonificacion( + tasaDirecta: true, + bonificacionCFVendedor: 10, + tasaDirectaIngresada: 10, + tasaMedioPago: new TasaMedioPago(tasaDirecta: 100)) + + ReglaBonificacion reglaTasaIndirecta = new ReglaBonificacion( + tasaDirecta: false, + bonificacionCFVendedor: 10, + tasaDirectaIngresada: 10, + tasaMedioPago: new TasaMedioPago(tasaDirecta: 100)) + CargoRepository repository = Spy(CargoRepository) { findAll() >> EntityBuilder.createCargos() + findIdTipoMedioPago(42) >> 1 findIdTipoMedioPago(43) >> 2 findCargoCuenta(_, _) >> null + findReglaBonificacion(1) >> reglaTasaDirecta + 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"() { + def "Calculo cargos para un request válido con cargos no de costo financiero y valores de tipo comisión y fijo"() { - given: "Un request válido" - CargoRequest request = new CargoRequest(idBaseCalculo: 37, - idCuenta: 40488, + given: "Un request válido con cargos no de costo financiero y valores de tipo comisión y fijo" + CargoRequest request = new CargoRequest( + idBaseCalculo: 37, + idCuenta: 1, idMedioPago: 43, idCanal: 7, - importe: 2.87, - idTransaccion: "0001b0d7-2acf-5e2f-1acd-c84511eftest") + importe: 3.00, + idTransaccion: "0001b0d7-2acf-5e2f-1acd-c84511eftest", + created: sdf.parse("2012-10-10 10:10:10")) + + 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].valorAplicado.trunc(2) == 1.5 + cargosCalculados[0].montoCalculado.trunc(2) == 1.5 + cargosCalculados[1].valorAplicado.trunc(2) == 2 + cargosCalculados[1].montoCalculado.trunc(2) == 0.06 + } + + def "Calculo cargos para un request válido con cargos de costo financiero y regla de bonificación con tasa directa"() { + + given: "Un request válido con cargos de costo financiero y valores de tipo comisión y fijo" + CargoRequest request = new CargoRequest( + idBaseCalculo: 37, + idCuenta: 1, + idMedioPago: 42, + idCanal: 7, + importe: 3.00, + idTransaccion: "0001b0d7-2acf-5e2f-1acd-c84511eftest", + created: sdf.parse("2015-10-10 10:10:10"), + idPromotion: 1) + + 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].valorAplicado.trunc(2) == 90 + cargosCalculados[0].montoCalculado.trunc(2) == 100.3 + cargosCalculados[1].valorAplicado.trunc(2) == 90 + cargosCalculados[1].montoCalculado.trunc(2) == 100.3 + } + + def "Calculo cargos para un request válido con cargos de costo financiero y regla de bonificación con tasa indirecta"() { + + given: "Un request válido con cargos de costo financiero y regla de bonificación con tasa indirecta" + CargoRequest request = new CargoRequest( + idBaseCalculo: 37, + idCuenta: 1, + idMedioPago: 42, + idCanal: 7, + importe: 3.00, + idTransaccion: "0001b0d7-2acf-5e2f-1acd-c84511eftest", + created: sdf.parse("2015-10-10 10:10:10"), + idPromotion: 2) when: "Se calculan los cargos" List cargosCalculados = service.calculateCargos(request) - then: "Los cargos calculados son 4 y sus valores correctos" - null == cargosCalculados + then: "Los cargos calculados son 2 y sus valores correctos" + cargosCalculados.size() == 2 + cargosCalculados[0].valorAplicado.trunc(2) == 90 + cargosCalculados[0].montoCalculado.trunc(2) == 370 + cargosCalculados[1].valorAplicado.trunc(2) == 90 + cargosCalculados[1].montoCalculado.trunc(2) == 370 } } From 744e40be9bc208d0f3b96f0d55d5433f81d27cf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=ADn=20Dib?= Date: Tue, 5 Dec 2017 11:47:33 -0300 Subject: [PATCH 3/4] =?UTF-8?q?Se=20codea=20el=20service=20de=20Cargos=20s?= =?UTF-8?q?eg=C3=BAn=20el=20SP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../todopago/calculator/CargoCalculator.java | 116 ++++++++++-------- .../todopago/model/CanalAdhesion.java | 54 -------- .../com/prismamp/todopago/model/Cargo.java | 31 +++-- .../prismamp/todopago/model/CargoCuenta.java | 25 ++-- .../prismamp/todopago/model/CargoRequest.java | 20 +-- .../todopago/model/CargoTransaccion.java | 41 +++++-- .../todopago/model/PromocionResponse.java | 45 +++++++ .../todopago/model/ReglaBonificacion.java | 10 -- .../todopago/model/TipoMedioPago.java | 94 -------------- .../prismamp/todopago/model/Transaccion.java | 85 ------------- .../com/prismamp/todopago/model/Valor.java | 10 +- .../todopago/repository/CargoRepository.java | 50 ++++++-- .../todopago/service/CargoService.java | 103 +++++++++------- 13 files changed, 285 insertions(+), 399 deletions(-) delete mode 100644 src/main/java/com/prismamp/todopago/model/CanalAdhesion.java create mode 100644 src/main/java/com/prismamp/todopago/model/PromocionResponse.java delete mode 100644 src/main/java/com/prismamp/todopago/model/TipoMedioPago.java delete mode 100644 src/main/java/com/prismamp/todopago/model/Transaccion.java diff --git a/src/main/java/com/prismamp/todopago/calculator/CargoCalculator.java b/src/main/java/com/prismamp/todopago/calculator/CargoCalculator.java index 23a985f..9b117ee 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,42 +19,17 @@ public Boolean isCostoFinanciero(Cargo cargo) { } } - public CargoTransaccion calculateRelacionVigente(CargoCuenta cargoCuenta, Cargo cargo, - CargoTransaccion cargoTransaccion) { - - if (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())) { + if ("AP_PORCENTAJE".equalsIgnoreCase(cargoTransaccion.getCodigoAplicacion())) { cargoTransaccion.setMontoCalculado(importe * (cargo.getValor().getValor() / 100)); - } else if ("AP_FIJO".equalsIgnoreCase(cargo.getValor().getTipo().getCodigo())) { + } else if ("AP_FIJO".equalsIgnoreCase(cargoTransaccion.getCodigoAplicacion())) { 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."); + cargoTransaccion.setMontoCalculado(0d); } } else { @@ -66,8 +38,36 @@ public CargoTransaccion calculateMonto(CargoTransaccion cargoTransaccion, Cargo return cargoTransaccion; } - public CargoTransaccion calculateCostoFinanciero(CargoTransaccion cargoTransaccion, Double importe, Double tasa, - Double bonificacion, Double monto) { + 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."); + } + cargoTransaccion = checkCargoTransaccion(cargoTransaccion); + + Double montoCalculado = importe * (promocion.getTasaDirecta() / 100) + * (100 - promocion.getBonificacionCFVendedor() / 100); + cargoTransaccion.setMontoCalculado(montoCalculado); + + return cargoTransaccion; + } + + public CargoTransaccion calculateMontoTasaDirecta(CargoTransaccion cargoTransaccion, Double importe, Double tasaDirecta) { + cargoTransaccion = checkCargoTransaccion(cargoTransaccion); + + Double montoCalculado = importe * (tasaDirecta / 100); + cargoTransaccion.setMontoCalculado(montoCalculado); + + return cargoTransaccion; + } + + public PromocionResponse setCodigoTipoPromocion(PromocionResponse promocion) { + if (null != promocion && null == promocion.getIdPromocion()) { + promocion.setCodigo("PROMO_CTAS"); + } + return promocion; + } + + 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."); @@ -98,17 +98,16 @@ public CargoTransaccion calculateCostoFinanciero(CargoTransaccion cargoTransacci 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 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,21 +116,38 @@ public CargoTransaccion calculateValorAplicado(CargoTransaccion cargoTransaccion return cargoTransaccion; } - private CargoTransaccion checkCargoTransaccion(CargoTransaccion cargoTransaccion) { - if (null == cargoTransaccion) { - cargoTransaccion = new CargoTransaccion(); + public CargoTransaccion mapCargo(Cargo cargo, String idTransaccion) { + if (null == cargo) { + throw new BusinessException("No se puede mapear un cargo nulo."); } - return cargoTransaccion; + CargoTransaccion result = new CargoTransaccion(); + result.setIdCargo(cargo.getId()); + result.setValorAplicado(cargo.getValor().getValor()); + result.setIdTipoAplicacion(cargo.getValor().getIdTipoAplicacion()); + result.setCodigoAplicacion(cargo.getTipoAplicacion().getCodigo()); + result.setCodigoTipoCargo(cargo.getTipoCargo().getCodigo()); + result.setIdTransaccion(idTransaccion); + + return result; } - private boolean isRelacionVigente(CargoCuenta cargoCuenta) { + public CargoTransaccion mapCargoCuenta(CargoCuenta cargoCuenta, CargoTransaccion cargoTransaccion) { if (null == cargoCuenta) { - return false; + return cargoTransaccion; + } else { + cargoTransaccion.setValorAplicado(cargoCuenta.getValor()); + cargoTransaccion.setIdTipoAplicacion(cargoCuenta.getIdTipoAplicacion()); + cargoTransaccion.setCodigoAplicacion(cargoCuenta.getCodigo()); + + return cargoTransaccion; } - Date inicioVigencia = cargoCuenta.getInicioVigencia(); - Date finVigencia = cargoCuenta.getFinVigencia(); - Date now = new Date(); + } - return null != inicioVigencia && null != finVigencia && inicioVigencia.before(now) && finVigencia.after(now); + private CargoTransaccion checkCargoTransaccion(CargoTransaccion cargoTransaccion) { + if (null == cargoTransaccion) { + cargoTransaccion = new CargoTransaccion(); + } + return cargoTransaccion; } + } 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 f39f0c1..573067a 100644 --- a/src/main/java/com/prismamp/todopago/model/Cargo.java +++ b/src/main/java/com/prismamp/todopago/model/Cargo.java @@ -6,7 +6,7 @@ public class Cargo { private TipoCargo tipoCargo; - private TipoMedioPago tipoMedioPago; + private MedioPago medioPago; private Long idCuenta; @@ -14,9 +14,11 @@ public class Cargo { private Long idBaseCalculo; - private CanalAdhesion canalAdhesion; + private Long idCanal; private Valor valor; + + private Tipo tipoAplicacion; public Long getId() { return id; @@ -34,12 +36,12 @@ public void setTipoCargo(TipoCargo tipoCargo) { this.tipoCargo = tipoCargo; } - public TipoMedioPago getTipoMedioPago() { - return tipoMedioPago; + public MedioPago getMedioPago() { + return medioPago; } - public void setTipoMedioPago(TipoMedioPago tipoMedioPago) { - this.tipoMedioPago = tipoMedioPago; + public void setMedioPago(MedioPago medioPago) { + this.medioPago = medioPago; } public Long getIdCuenta() { @@ -66,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() { @@ -81,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 index 9215105..0f43322 100644 --- a/src/main/java/com/prismamp/todopago/model/CargoRequest.java +++ b/src/main/java/com/prismamp/todopago/model/CargoRequest.java @@ -4,13 +4,13 @@ public class CargoRequest { - private Long idBaseCalculo; + private Long facilitiesPayments; private Long idCuenta; private Long idMedioPago; - private Long idCanal; + private String canal; private Double importe; @@ -20,12 +20,12 @@ public class CargoRequest { private Date created; - public Long getIdBaseCalculo() { - return idBaseCalculo; + public Long getFacilitiesPayments() { + return facilitiesPayments; } - public void setIdBaseCalculo(Long idBaseCalculo) { - this.idBaseCalculo = idBaseCalculo; + public void setFacilitiesPayments(Long facilitiesPayments) { + this.facilitiesPayments = facilitiesPayments; } public Long getIdCuenta() { @@ -44,12 +44,12 @@ public void setIdMedioPago(Long idMedioPago) { this.idMedioPago = idMedioPago; } - public Long getIdCanal() { - return idCanal; + public String getCanal() { + return canal; } - public void setIdCanal(Long idCanal) { - this.idCanal = idCanal; + public void setCanal(String canal) { + this.canal = canal; } public Double getImporte() { diff --git a/src/main/java/com/prismamp/todopago/model/CargoTransaccion.java b/src/main/java/com/prismamp/todopago/model/CargoTransaccion.java index 17626f1..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 String 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 String getIdTransaccion() { - return idTransaccion; - } - - public void setIdTransaccion(String 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 779d112..0000000 --- a/src/main/java/com/prismamp/todopago/model/Transaccion.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.prismamp.todopago.model; - -import java.util.ArrayList; -import java.util.List; - -public class Transaccion { - - private String id; - - private Long cuentaId; - - private Long idTipoMedioPago; - - private Long idBaseCalculo; - - private Double importe; - - private List cargos; - - private Long idPromotion; - - public Transaccion() { - this.cargos = new ArrayList(); - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public Long getCuentaId() { - return cuentaId; - } - - public void setCuentaId(Long cuentaId) { - this.cuentaId = cuentaId; - } - - 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 4fb1e22..41cc996 100644 --- a/src/main/java/com/prismamp/todopago/model/Valor.java +++ b/src/main/java/com/prismamp/todopago/model/Valor.java @@ -6,7 +6,7 @@ public class Valor { private Double valor; - private Tipo tipo; + private Long idTipoAplicacion; private Date inicioVigencia; @@ -20,12 +20,12 @@ public void setValor(Double valor) { this.valor = valor; } - public Tipo getTipo() { - return tipo; + public Long getIdTipoAplicacion() { + return idTipoAplicacion; } - public void setTipo(Tipo tipo) { - this.tipo = tipo; + public void setIdTipoAplicacion(Long idTipoAplicacion) { + this.idTipoAplicacion = idTipoAplicacion; } public Date getInicioVigencia() { diff --git a/src/main/java/com/prismamp/todopago/repository/CargoRepository.java b/src/main/java/com/prismamp/todopago/repository/CargoRepository.java index 7e9ddaf..b956d07 100644 --- a/src/main/java/com/prismamp/todopago/repository/CargoRepository.java +++ b/src/main/java/com/prismamp/todopago/repository/CargoRepository.java @@ -12,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 @@ -28,37 +29,66 @@ public List updateAll() { throw new NotImplementedException(); } - public List findByBaseCalculoTransaccion(Long baseCalculo, Long cuenta, Long tipoMedioPago, Long canal, Date created) { - return findAll().stream().filter(p -> p.getIdBaseCalculo().equals(baseCalculo)) - .filter(p -> p.getIdCuenta().equals(cuenta)) - .filter(p -> p.getTipoMedioPago().getId().equals(tipoMedioPago)) - .filter(p -> null == p.getCanalAdhesion().getId() || p.getCanalAdhesion().getId().equals(canal)) + public List findByDefault(Long facilitiesPayments, Long idCuenta, Long idMedioPago, Long idCanal, Date created, Long idBaseCalculo) { + return findAll().stream().filter(p -> idBaseCalculo == p.getIdBaseCalculo()) + .filter(p -> idCuenta == p.getIdCuenta()) + .filter(p -> idMedioPago == Long.parseLong(p.getMedioPago().getId())) + .filter(p -> idCanal == p.getIdCanal() || idCanal == 0 || idCanal == null) .filter(p -> p.getValor().getInicioVigencia().before(created)) .filter(p -> null == p.getValor().getFinVigencia() || p.getValor().getFinVigencia().after(created)) .collect(Collectors.toList()); } - public Long findIdTipoMedioPago(Long medioPago) { + public Long findIdTipoByCodigo(String codigo) { throw new NotImplementedException(); } - public CargoCuenta findCargoCuenta(Long cargo, Long cuenta) { + public Long findIdCanalByNombre(String nombre) { throw new NotImplementedException(); } - public ReglaBonificacion findReglaBonificacion(Long idPromotion) { + public CargoCuenta findCargoCuenta(Long cargoId, Long cuentaId, Date created) { throw new NotImplementedException(); } - public Double findVolumenReglaPromocionBonificacion(Long idPromotion) { + public PromocionResponse findPromocion(Long idGrupoTipo, Long idPromotion) { + throw new NotImplementedException(); + } + + public PromocionResponse findPromocionTasaDirecta(Long idGrupoTipo, Long idPromotion) { + throw new NotImplementedException(); + } + + public Double findAcumuladorPromocionesMonto(Date created, Long idCuenta, Long idPromotion) { throw new NotImplementedException(); } - public Double findVolumenReglaPromocionTasa(Long idPromotion) { + 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 01fe380..dda8965 100644 --- a/src/main/java/com/prismamp/todopago/service/CargoService.java +++ b/src/main/java/com/prismamp/todopago/service/CargoService.java @@ -12,6 +12,7 @@ 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.repository.CargoRepository; @@ -28,75 +29,91 @@ public List calculateCargos(CargoRequest request) { if (null == request) { throw new BusinessException(""); } + Long idCanal = repository.findIdCanalByNombre(request.getCanal()); + Long idBaseCalculo = findIdBaseCalculo(request.getFacilitiesPayments()); - List cargosTransaccion = new ArrayList(); - - Long idTipoMedioPago = repository.findIdTipoMedioPago(request.getIdMedioPago()); + List defaultCargos = repository.findByDefault(request.getFacilitiesPayments(), request.getIdCuenta(), + request.getIdMedioPago(), idCanal, request.getCreated(), idBaseCalculo); - List cargos = repository.findByBaseCalculoTransaccion(request.getIdBaseCalculo(), request.getIdCuenta(), - idTipoMedioPago, request.getIdCanal(), request.getCreated()); + List cargosTransaccion = new ArrayList(); - for (Cargo cargo : cargos) { - CargoTransaccion cargoTransaccion = new CargoTransaccion(); - CargoCuenta cargoCuenta = repository.findCargoCuenta(cargo.getId(), request.getIdCuenta()); + 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, request.getImporte()); } else { Long idPromotion = request.getIdPromotion(); ReglaBonificacion regla = repository.findReglaBonificacion(idPromotion); - Double monto = repository.findAcumuladorPromocionesMonto(idPromotion); + PromocionResponse promocion; if (!regla.isTasaDirecta()) { - cargoTransaccion = getCostoFinanciero(request.getImporte(), cargoTransaccion, idPromotion, regla, monto); + promocion = repository.findPromocion(25l, idPromotion); } else { - cargoTransaccion = getCostoFinancieroTasaDirecta(request.getImporte(), cargoTransaccion, idPromotion, regla, - monto); + promocion = repository.findPromocionTasaDirecta(25l, idPromotion); } - if (null != cargoCuenta) { - cargoTransaccion.setIdTipoAplicacion(cargoCuenta.getIdTipoAplicacion()); + 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())) { + Double montoTotal = getMontoTotal(promocion.getCodigo(), request); + + if (!regla.isTasaDirecta()) { + PromocionResponse promocionNotTasaDirecta = repository.findPromocionNotTasaDirecta(montoTotal, idPromotion); + + promocion.setBonificacionCFVendedor(promocionNotTasaDirecta.getBonificacionCFVendedor()); + promocion.setTasaDirecta(promocionNotTasaDirecta.getTasaDirecta()); + + cargoTransaccion = calculator.calculateMonto(cargoTransaccion, montoTotal, 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, montoTotal, promocion.getTasaDirecta()); + cargoTransaccion.setValorAplicado(promocion.getTasaDirecta()); + } } - cargoTransaccion = calculator.calculateValorAplicado(cargoTransaccion, regla); } - - cargoTransaccion.setIdCargo(cargo.getId()); - cargoTransaccion.setIdTransaccion(request.getIdTransaccion()); cargosTransaccion.add(cargoTransaccion); } return cargosTransaccion; } - private CargoTransaccion getCostoFinancieroTasaDirecta(Double importe, 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, importe, tasa, monto); - return cargoTransaccion; + return result; } - private CargoTransaccion getCostoFinanciero(Double importe, 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, importe, tasa, bonificacion, monto); - return cargoTransaccion; + return repository.findIdTipoByCodigo(codigo); } - public List findAll() { - return repository.findAll(); - } } From 0ef5f26cabed6be2cc91c3d96946e066f5d210c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=ADn=20Dib?= Date: Wed, 6 Dec 2017 14:25:59 -0300 Subject: [PATCH 4/4] Test de CargoService --- .../todopago/calculator/CargoCalculator.java | 74 ++++----- .../todopago/controller/CargoController.java | 24 --- .../todopago/repository/CargoRepository.java | 8 +- .../todopago/service/CargoService.java | 15 +- .../calculator/CargoCalculatorSpec.groovy | 153 +++++++----------- .../todopago/helper/EntityBuilder.groovy | 50 +++--- .../repository/CargoRepositorySpec.groovy | 11 +- .../todopago/service/CargoServiceSpec.groovy | 111 +++++-------- 8 files changed, 172 insertions(+), 274 deletions(-) delete mode 100644 src/main/java/com/prismamp/todopago/controller/CargoController.java diff --git a/src/main/java/com/prismamp/todopago/calculator/CargoCalculator.java b/src/main/java/com/prismamp/todopago/calculator/CargoCalculator.java index 9b117ee..010c777 100644 --- a/src/main/java/com/prismamp/todopago/calculator/CargoCalculator.java +++ b/src/main/java/com/prismamp/todopago/calculator/CargoCalculator.java @@ -20,20 +20,19 @@ public Boolean isCostoFinanciero(Cargo cargo) { } public CargoTransaccion calculateMonto(CargoTransaccion cargoTransaccion, Cargo cargo, Double importe) { - if (null != cargo && null != cargo.getValor()) { - - 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 { - cargoTransaccion.setMontoCalculado(0d); - } + 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; } @@ -41,18 +40,22 @@ public CargoTransaccion calculateMonto(CargoTransaccion cargoTransaccion, Cargo 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 * (promocion.getTasaDirecta() / 100) - * (100 - promocion.getBonificacionCFVendedor() / 100); - cargoTransaccion.setMontoCalculado(montoCalculado); + Double monto = importe * (promocion.getTasaDirecta() / 100) * ((100 - promocion.getBonificacionCFVendedor()) / 100); + cargoTransaccion.setMontoCalculado(monto); return cargoTransaccion; } public CargoTransaccion calculateMontoTasaDirecta(CargoTransaccion cargoTransaccion, Double importe, Double tasaDirecta) { cargoTransaccion = checkCargoTransaccion(cargoTransaccion); + importe = checkDouble(importe); + tasaDirecta = checkDouble(tasaDirecta); Double montoCalculado = importe * (tasaDirecta / 100); cargoTransaccion.setMontoCalculado(montoCalculado); @@ -67,37 +70,6 @@ public PromocionResponse setCodigoTipoPromocion(PromocionResponse promocion) { return promocion; } - 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; - } - cargoTransaccion = checkCargoTransaccion(cargoTransaccion); - - Double montoCalculado = importe * tasa * ((100 - bonificacion) / 100); - cargoTransaccion.setMontoCalculado(montoCalculado + 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; - } - cargoTransaccion = checkCargoTransaccion(cargoTransaccion); - - Double montoCalculado = importe * (tasa / 100); - cargoTransaccion.setMontoCalculado(montoCalculado + monto); - - return cargoTransaccion; - } - 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."); @@ -124,7 +96,9 @@ public CargoTransaccion mapCargo(Cargo cargo, String idTransaccion) { result.setIdCargo(cargo.getId()); result.setValorAplicado(cargo.getValor().getValor()); result.setIdTipoAplicacion(cargo.getValor().getIdTipoAplicacion()); - result.setCodigoAplicacion(cargo.getTipoAplicacion().getCodigo()); + if (null != cargo.getTipoAplicacion()) { + result.setCodigoAplicacion(cargo.getTipoAplicacion().getCodigo()); + } result.setCodigoTipoCargo(cargo.getTipoCargo().getCodigo()); result.setIdTransaccion(idTransaccion); @@ -150,4 +124,10 @@ private CargoTransaccion checkCargoTransaccion(CargoTransaccion cargoTransaccion return cargoTransaccion; } + 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/repository/CargoRepository.java b/src/main/java/com/prismamp/todopago/repository/CargoRepository.java index b956d07..94d2052 100644 --- a/src/main/java/com/prismamp/todopago/repository/CargoRepository.java +++ b/src/main/java/com/prismamp/todopago/repository/CargoRepository.java @@ -29,11 +29,11 @@ public List updateAll() { throw new NotImplementedException(); } - public List findByDefault(Long facilitiesPayments, Long idCuenta, Long idMedioPago, Long idCanal, Date created, Long idBaseCalculo) { + public List findByDefault(Long idCuenta, Long idMedioPago, Long idCanal, Date created, Long idBaseCalculo) { return findAll().stream().filter(p -> idBaseCalculo == p.getIdBaseCalculo()) - .filter(p -> idCuenta == p.getIdCuenta()) - .filter(p -> idMedioPago == Long.parseLong(p.getMedioPago().getId())) - .filter(p -> idCanal == p.getIdCanal() || idCanal == 0 || idCanal == null) + .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()); diff --git a/src/main/java/com/prismamp/todopago/service/CargoService.java b/src/main/java/com/prismamp/todopago/service/CargoService.java index dda8965..a68912e 100644 --- a/src/main/java/com/prismamp/todopago/service/CargoService.java +++ b/src/main/java/com/prismamp/todopago/service/CargoService.java @@ -32,10 +32,10 @@ public List calculateCargos(CargoRequest request) { Long idCanal = repository.findIdCanalByNombre(request.getCanal()); Long idBaseCalculo = findIdBaseCalculo(request.getFacilitiesPayments()); - List defaultCargos = repository.findByDefault(request.getFacilitiesPayments(), request.getIdCuenta(), + List defaultCargos = repository.findByDefault(request.getIdCuenta(), request.getIdMedioPago(), idCanal, request.getCreated(), idBaseCalculo); - List cargosTransaccion = new ArrayList(); + List cargosTransaccion = new ArrayList<>(); for (Cargo cargo : defaultCargos) { CargoTransaccion cargoTransaccion = calculator.mapCargo(cargo, request.getIdTransaccion()); @@ -51,9 +51,9 @@ public List calculateCargos(CargoRequest request) { PromocionResponse promocion; if (!regla.isTasaDirecta()) { - promocion = repository.findPromocion(25l, idPromotion); + promocion = repository.findPromocion(25L, idPromotion); } else { - promocion = repository.findPromocionTasaDirecta(25l, idPromotion); + promocion = repository.findPromocionTasaDirecta(25L, idPromotion); } promocion = calculator.setCodigoTipoPromocion(promocion); @@ -61,15 +61,15 @@ public List calculateCargos(CargoRequest request) { cargoTransaccion.setMontoCalculado(0d); cargoTransaccion.setValorAplicado(0d); } else if (!"PROMO_CTAS".equals(promocion.getCodigo())) { - Double montoTotal = getMontoTotal(promocion.getCodigo(), request); 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, montoTotal, promocion); + cargoTransaccion = calculator.calculateMonto(cargoTransaccion, request.getImporte(), promocion); cargoTransaccion = calculator.calculateValorAplicado(cargoTransaccion, promocion); } else { if (null == regla.getTasaDirectaIngresada()) { @@ -77,7 +77,7 @@ public List calculateCargos(CargoRequest request) { promocion.setTasaDirecta(tasaDirecta); } - cargoTransaccion = calculator.calculateMontoTasaDirecta(cargoTransaccion, montoTotal, promocion.getTasaDirecta()); + cargoTransaccion = calculator.calculateMontoTasaDirecta(cargoTransaccion, request.getImporte(), promocion.getTasaDirecta()); cargoTransaccion.setValorAplicado(promocion.getTasaDirecta()); } } @@ -115,5 +115,4 @@ private Long findIdBaseCalculo(Long facilitiesPayments) { } 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 index 42ec2f6..ceaa458 100644 --- a/src/test/java/com/prismamp/todopago/helper/EntityBuilder.groovy +++ b/src/test/java/com/prismamp/todopago/helper/EntityBuilder.groovy @@ -1,10 +1,9 @@ package com.prismamp.todopago.helper -import com.prismamp.todopago.model.CanalAdhesion 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.TipoMedioPago import com.prismamp.todopago.model.Valor import java.text.SimpleDateFormat @@ -13,28 +12,39 @@ class EntityBuilder { static 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) - - CanalAdhesion canal = new CanalAdhesion() - SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH:mm:ss") - Valor valor1 = new Valor(valor: 1.50, tipo: new Tipo(id: 43, codigo: "AP_FIJO"), inicioVigencia: sdf.parse("2011-10-10 10:10:10"), finVigencia: sdf.parse("2013-10-10 10:10:10")) - Valor valor2 = new Valor(valor: 3.00, tipo: new Tipo(id: 43, codigo: "AP_FIJO"), inicioVigencia: sdf.parse("2014-10-10 10:10:10"), finVigencia: sdf.parse("2016-10-10 10:10:10")) - Valor valor3 = new Valor(valor: 2.00, tipo: new Tipo(id: 44, codigo: "AP_PORCENTAJE"), inicioVigencia: sdf.parse("2011-10-10 10:10:10"), finVigencia: sdf.parse("2013-10-10 10:10:10")) - Valor valor4 = new Valor(valor: 4.00, tipo: new Tipo(id: 44, codigo: "AP_PORCENTAJE"), inicioVigencia: sdf.parse("2014-10-10 10:10:10"), finVigencia: sdf.parse("2016-10-10 10:10:10")) - + 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(tipoMedioPago: debito, idTipoCuenta: 37, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 1, valor: valor1, tipoCargo: tipoComision) - Cargo cargo2 = new Cargo(tipoMedioPago: credito, idTipoCuenta: 37, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 1, valor: valor2, tipoCargo: tipoCostoFinanciero) - Cargo cargo3 = new Cargo(tipoMedioPago: debito, idTipoCuenta: 37, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 1, valor: valor3, tipoCargo: tipoComision) - Cargo cargo4 = new Cargo(tipoMedioPago: credito, idTipoCuenta: 37, idBaseCalculo: 37, canalAdhesion: canal, idCuenta: 1, valor: valor4, tipoCargo: tipoCostoFinanciero) - - [cargo1, cargo2, cargo3, cargo4] + 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 0d34113..573472d 100644 --- a/src/test/java/com/prismamp/todopago/repository/CargoRepositorySpec.groovy +++ b/src/test/java/com/prismamp/todopago/repository/CargoRepositorySpec.groovy @@ -16,12 +16,13 @@ class CargoRepositorySpec extends Specification { def "Búsqueda de Cargos por Base de Cálculo Transaccion"() { expect: - x == repository.findByBaseCalculoTransaccion(a, b, c, d, sdf.parse("2012-10-10 10:10:10")).size() + x == repository.findByDefault(a, b, c, sdf.parse("2016-08-12 12:20:24"), d).size() where: - a | b | c | d || x - 37 | 1 | 2 | 7 || 2 - 37 | 1 | 1 | 7 || 0 - 36 | 1 | 1 | 7 || 0 + 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 index 801dc92..b5ef82c 100644 --- a/src/test/java/com/prismamp/todopago/service/CargoServiceSpec.groovy +++ b/src/test/java/com/prismamp/todopago/service/CargoServiceSpec.groovy @@ -4,6 +4,7 @@ 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 @@ -15,102 +16,76 @@ class CargoServiceSpec extends Specification { SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH:mm:ss") - ReglaBonificacion reglaTasaDirecta = new ReglaBonificacion( - tasaDirecta: true, - bonificacionCFVendedor: 10, - tasaDirectaIngresada: 10, - tasaMedioPago: new TasaMedioPago(tasaDirecta: 100)) - ReglaBonificacion reglaTasaIndirecta = new ReglaBonificacion( tasaDirecta: false, - bonificacionCFVendedor: 10, - tasaDirectaIngresada: 10, - tasaMedioPago: new TasaMedioPago(tasaDirecta: 100)) + tasaMedioPago: new TasaMedioPago(tasaDirecta: 10)) + + PromocionResponse promocion = new PromocionResponse( + bonificacionCFVendedor: 15, + codigo: "PROMO_CTAS", + idPromocion: 252) CargoRepository repository = Spy(CargoRepository) { findAll() >> EntityBuilder.createCargos() - findIdTipoMedioPago(42) >> 1 - findIdTipoMedioPago(43) >> 2 - findCargoCuenta(_, _) >> null - findReglaBonificacion(1) >> reglaTasaDirecta - findReglaBonificacion(2) >> reglaTasaIndirecta - findAcumuladorPromocionesMonto(_) >> 100 - findVolumenReglaPromocionTasa(_) >> 50 - findVolumenReglaPromocionBonificacion(_) >> 50 + 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 con cargos no de costo financiero y valores de tipo comisión y fijo"() { - - given: "Un request válido con cargos no de costo financiero y valores de tipo comisión y fijo" - CargoRequest request = new CargoRequest( - idBaseCalculo: 37, - idCuenta: 1, - idMedioPago: 43, - idCanal: 7, - importe: 3.00, - idTransaccion: "0001b0d7-2acf-5e2f-1acd-c84511eftest", - created: sdf.parse("2012-10-10 10:10:10")) - - 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].valorAplicado.trunc(2) == 1.5 - cargosCalculados[0].montoCalculado.trunc(2) == 1.5 - cargosCalculados[1].valorAplicado.trunc(2) == 2 - cargosCalculados[1].montoCalculado.trunc(2) == 0.06 - } + def "Calculo cargos para un request válido no de costo financiero"() { - def "Calculo cargos para un request válido con cargos de costo financiero y regla de bonificación con tasa directa"() { - - given: "Un request válido con cargos de costo financiero y valores de tipo comisión y fijo" + given: "Un request válido no de costo financiero" CargoRequest request = new CargoRequest( - idBaseCalculo: 37, - idCuenta: 1, + facilitiesPayments: 1, + idCuenta: 30487, idMedioPago: 42, - idCanal: 7, - importe: 3.00, - idTransaccion: "0001b0d7-2acf-5e2f-1acd-c84511eftest", - created: sdf.parse("2015-10-10 10:10:10"), - idPromotion: 1) + 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 2 y sus valores correctos" - cargosCalculados.size() == 2 - cargosCalculados[0].valorAplicado.trunc(2) == 90 - cargosCalculados[0].montoCalculado.trunc(2) == 100.3 - cargosCalculados[1].valorAplicado.trunc(2) == 90 - cargosCalculados[1].montoCalculado.trunc(2) == 100.3 + 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 con cargos de costo financiero y regla de bonificación con tasa indirecta"() { + def "Calculo cargos para un request válido de costo financiero"() { - given: "Un request válido con cargos de costo financiero y regla de bonificación con tasa indirecta" + given: "Un request válido de costo financiero" CargoRequest request = new CargoRequest( - idBaseCalculo: 37, - idCuenta: 1, + facilitiesPayments: 6, + idCuenta: 5205, idMedioPago: 42, - idCanal: 7, - importe: 3.00, - idTransaccion: "0001b0d7-2acf-5e2f-1acd-c84511eftest", - created: sdf.parse("2015-10-10 10:10:10"), - idPromotion: 2) + 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].valorAplicado.trunc(2) == 90 - cargosCalculados[0].montoCalculado.trunc(2) == 370 - cargosCalculados[1].valorAplicado.trunc(2) == 90 - cargosCalculados[1].montoCalculado.trunc(2) == 370 + cargosCalculados[0].montoCalculado.trunc(3) == 0.147 + cargosCalculados[1].montoCalculado == null } }