Adjusting case parameters -- Balance range made no sense, and neither did initial balance.
diff --git a/api/src/main/java/io/mifos/individuallending/api/v1/domain/caseinstance/CaseParameters.java b/api/src/main/java/io/mifos/individuallending/api/v1/domain/caseinstance/CaseParameters.java
index c2c1eef..a9ffe6d 100644
--- a/api/src/main/java/io/mifos/individuallending/api/v1/domain/caseinstance/CaseParameters.java
+++ b/api/src/main/java/io/mifos/individuallending/api/v1/domain/caseinstance/CaseParameters.java
@@ -15,10 +15,9 @@
*/
package io.mifos.individuallending.api.v1.domain.caseinstance;
-import io.mifos.portfolio.api.v1.domain.BalanceRange;
+import io.mifos.core.lang.validation.constraints.ValidIdentifier;
import io.mifos.portfolio.api.v1.domain.PaymentCycle;
import io.mifos.portfolio.api.v1.domain.TermRange;
-import io.mifos.core.lang.validation.constraints.ValidIdentifier;
import org.hibernate.validator.constraints.Range;
import org.hibernate.validator.constraints.ScriptAssert;
@@ -31,20 +30,17 @@
* @author Myrle Krantz
*/
@SuppressWarnings({"WeakerAccess", "unused"})
-@ScriptAssert(lang = "javascript", script = "_this.initialBalance.scale() == 4")
+@ScriptAssert(lang = "javascript", script = "_this.maximumBalance !== null && _this.maximumBalance.scale() == 4")
public final class CaseParameters {
@ValidIdentifier
private String customerIdentifier;
@Range(min = 0)
- private BigDecimal initialBalance;
+ private BigDecimal maximumBalance;
@NotNull
@Valid
private TermRange termRange;
@NotNull
@Valid
- private BalanceRange balanceRange;
- @NotNull
- @Valid
private PaymentCycle paymentCycle;
public CaseParameters() {
@@ -62,12 +58,12 @@
this.customerIdentifier = customerIdentifier;
}
- public BigDecimal getInitialBalance() {
- return initialBalance;
+ public BigDecimal getMaximumBalance() {
+ return maximumBalance;
}
- public void setInitialBalance(BigDecimal initialBalance) {
- this.initialBalance = initialBalance;
+ public void setMaximumBalance(BigDecimal maximumBalance) {
+ this.maximumBalance = maximumBalance;
}
public TermRange getTermRange() {
@@ -78,14 +74,6 @@
this.termRange = termRange;
}
- public BalanceRange getBalanceRange() {
- return balanceRange;
- }
-
- public void setBalanceRange(BalanceRange balanceRange) {
- this.balanceRange = balanceRange;
- }
-
public PaymentCycle getPaymentCycle() {
return paymentCycle;
}
@@ -100,24 +88,22 @@
if (o == null || getClass() != o.getClass()) return false;
CaseParameters that = (CaseParameters) o;
return Objects.equals(customerIdentifier, that.customerIdentifier) &&
- Objects.equals(initialBalance, that.initialBalance) &&
+ Objects.equals(maximumBalance, that.maximumBalance) &&
Objects.equals(termRange, that.termRange) &&
- Objects.equals(balanceRange, that.balanceRange) &&
Objects.equals(paymentCycle, that.paymentCycle);
}
@Override
public int hashCode() {
- return Objects.hash(customerIdentifier, initialBalance, termRange, balanceRange, paymentCycle);
+ return Objects.hash(customerIdentifier, maximumBalance, termRange, paymentCycle);
}
@Override
public String toString() {
return "CaseParameters{" +
"customerIdentifier='" + customerIdentifier + '\'' +
- ", initialBalance=" + initialBalance +
+ ", maximumBalance=" + maximumBalance +
", termRange=" + termRange +
- ", balanceRange=" + balanceRange +
", paymentCycle=" + paymentCycle +
'}';
}
diff --git a/api/src/main/java/io/mifos/individuallending/api/v1/domain/product/ProductParameters.java b/api/src/main/java/io/mifos/individuallending/api/v1/domain/product/ProductParameters.java
index f7ffb00..cca93f4 100644
--- a/api/src/main/java/io/mifos/individuallending/api/v1/domain/product/ProductParameters.java
+++ b/api/src/main/java/io/mifos/individuallending/api/v1/domain/product/ProductParameters.java
@@ -35,6 +35,9 @@
@Range(min = 0)
private BigDecimal maximumDispersalAmount;
+ @Range(min = 0)
+ private BigDecimal minimumDispersalAmount;
+
public ProductParameters() {
}
@@ -68,6 +71,14 @@
this.maximumDispersalAmount = maximumDispersalAmount;
}
+ public BigDecimal getMinimumDispersalAmount() {
+ return minimumDispersalAmount;
+ }
+
+ public void setMinimumDispersalAmount(BigDecimal minimumDispersalAmount) {
+ this.minimumDispersalAmount = minimumDispersalAmount;
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
@@ -75,12 +86,13 @@
ProductParameters that = (ProductParameters) o;
return Objects.equals(moratoriums, that.moratoriums) &&
Objects.equals(maximumDispersalCount, that.maximumDispersalCount) &&
- Objects.equals(maximumDispersalAmount, that.maximumDispersalAmount);
+ Objects.equals(maximumDispersalAmount, that.maximumDispersalAmount) &&
+ Objects.equals(minimumDispersalAmount, that.minimumDispersalAmount);
}
@Override
public int hashCode() {
- return Objects.hash(moratoriums, maximumDispersalCount, maximumDispersalAmount);
+ return Objects.hash(moratoriums, maximumDispersalCount, maximumDispersalAmount, minimumDispersalAmount);
}
@Override
@@ -89,6 +101,7 @@
"moratoriums=" + moratoriums +
", maximumDispersalCount=" + maximumDispersalCount +
", maximumDispersalAmount=" + maximumDispersalAmount +
+ ", minimumDispersalAmount=" + minimumDispersalAmount +
'}';
}
}
diff --git a/api/src/test/java/io/mifos/Fixture.java b/api/src/test/java/io/mifos/Fixture.java
index 7cdf1e1..ac4f35c 100644
--- a/api/src/test/java/io/mifos/Fixture.java
+++ b/api/src/test/java/io/mifos/Fixture.java
@@ -120,9 +120,8 @@
final CaseParameters ret = new CaseParameters(generateUniqueIdentifer("fred"));
ret.setCustomerIdentifier("alice");
- ret.setInitialBalance(fixScale(BigDecimal.valueOf(2000L)));
+ ret.setMaximumBalance(fixScale(BigDecimal.valueOf(2000L)));
ret.setTermRange(new TermRange(ChronoUnit.MONTHS, 18));
- ret.setBalanceRange(new BalanceRange(fixScale(BigDecimal.ZERO), fixScale(BigDecimal.valueOf(2000L))));
ret.setPaymentCycle(new PaymentCycle(ChronoUnit.MONTHS, 1, 1, null, null));
return ret;
diff --git a/api/src/test/java/io/mifos/individuallending/api/v1/domain/caseinstance/CaseParametersTest.java b/api/src/test/java/io/mifos/individuallending/api/v1/domain/caseinstance/CaseParametersTest.java
index bb900e0..480cf56 100644
--- a/api/src/test/java/io/mifos/individuallending/api/v1/domain/caseinstance/CaseParametersTest.java
+++ b/api/src/test/java/io/mifos/individuallending/api/v1/domain/caseinstance/CaseParametersTest.java
@@ -16,8 +16,9 @@
package io.mifos.individuallending.api.v1.domain.caseinstance;
import io.mifos.Fixture;
+import io.mifos.core.test.domain.ValidationTest;
import io.mifos.core.test.domain.ValidationTestCase;
-import io.mifos.portfolio.api.v1.domain.BalanceRange;
+import io.mifos.portfolio.api.v1.domain.AccountAssignment;
import io.mifos.portfolio.api.v1.domain.TermRange;
import org.junit.Assert;
import org.junit.Test;
@@ -34,7 +35,18 @@
* @author Myrle Krantz
*/
@RunWith(Parameterized.class)
-public class CaseParametersTest {
+public class CaseParametersTest extends ValidationTest<CaseParameters> {
+
+ public CaseParametersTest(final ValidationTestCase<CaseParameters> testCase)
+ {
+ super(testCase);
+ }
+
+ @Override
+ protected CaseParameters createValidTestSubject() {
+ return Fixture.getTestCaseParameters();
+ }
+
@Parameterized.Parameters
public static Collection testCases() {
final Collection<ValidationTestCase> ret = new ArrayList<>();
@@ -46,13 +58,10 @@
.adjustment(x -> x.setTermRange(new TermRange(ChronoUnit.CENTURIES, -1)))
.valid(false));
ret.add(new ValidationTestCase<CaseParameters>("nullBalanceRange")
- .adjustment(x -> x.setBalanceRange(null))
+ .adjustment(x -> x.setMaximumBalance(null))
.valid(false));
ret.add(new ValidationTestCase<CaseParameters>("badBalanceRangeScale")
- .adjustment(x -> x.setBalanceRange(new BalanceRange(BigDecimal.ZERO, BigDecimal.TEN.setScale(5, BigDecimal.ROUND_FLOOR))))
- .valid(false));
- ret.add(new ValidationTestCase<CaseParameters>("switchedBalanceRangeMinMax")
- .adjustment(x -> x.setBalanceRange(new BalanceRange(Fixture.fixScale(BigDecimal.TEN), Fixture.fixScale(BigDecimal.ZERO))))
+ .adjustment(x -> x.setMaximumBalance(BigDecimal.TEN.setScale(5, BigDecimal.ROUND_FLOOR)))
.valid(false));
ret.add(new ValidationTestCase<CaseParameters>("invalid payment cycle unit")
.adjustment(x -> x.getPaymentCycle().setTemporalUnit(ChronoUnit.SECONDS))
@@ -60,18 +69,4 @@
return ret;
}
-
- private final ValidationTestCase<CaseParameters> testCase;
-
- public CaseParametersTest(final ValidationTestCase<CaseParameters> testCase)
- {
- this.testCase = testCase;
- }
-
- @Test()
- public void test(){
- final CaseParameters testSubject = Fixture.createAdjustedCaseParameters(testCase.getAdjustment());
- Assert.assertTrue(testCase.toString(), testCase.check(testSubject));
- }
-
}
\ No newline at end of file
diff --git a/component-test/src/main/java/io/mifos/portfolio/Fixture.java b/component-test/src/main/java/io/mifos/portfolio/Fixture.java
index 055a9e3..d11aa34 100644
--- a/component-test/src/main/java/io/mifos/portfolio/Fixture.java
+++ b/component-test/src/main/java/io/mifos/portfolio/Fixture.java
@@ -124,9 +124,8 @@
final CaseParameters ret = new CaseParameters(generateUniqueIdentifer("fred"));
ret.setCustomerIdentifier("alice");
- ret.setInitialBalance(fixScale(BigDecimal.valueOf(2000L)));
+ ret.setMaximumBalance(fixScale(BigDecimal.valueOf(2000L)));
ret.setTermRange(new TermRange(ChronoUnit.MONTHS, 18));
- ret.setBalanceRange(new BalanceRange(fixScale(BigDecimal.ZERO), fixScale(BigDecimal.valueOf(2000L))));
ret.setPaymentCycle(new PaymentCycle(ChronoUnit.MONTHS, 1, 1, null, null));
return ret;
diff --git a/component-test/src/main/java/io/mifos/portfolio/TestCases.java b/component-test/src/main/java/io/mifos/portfolio/TestCases.java
index 5580a08..e897070 100644
--- a/component-test/src/main/java/io/mifos/portfolio/TestCases.java
+++ b/component-test/src/main/java/io/mifos/portfolio/TestCases.java
@@ -75,7 +75,7 @@
accountAssignments.add(new AccountAssignment(ENTRY, "002-012"));
caseInstance.setAccountAssignments(accountAssignments);
- newCaseParameters.setInitialBalance(Fixture.fixScale(BigDecimal.TEN));
+ newCaseParameters.setMaximumBalance(Fixture.fixScale(BigDecimal.TEN));
newCaseParameters.getPaymentCycle().setAlignmentDay(1);
newCaseParameters.getPaymentCycle().setAlignmentWeek(2);
final String changedParameters = new Gson().toJson(newCaseParameters);
diff --git a/service/src/main/java/io/mifos/individuallending/IndividualLendingPatternFactory.java b/service/src/main/java/io/mifos/individuallending/IndividualLendingPatternFactory.java
index 7b61f30..1359c67 100644
--- a/service/src/main/java/io/mifos/individuallending/IndividualLendingPatternFactory.java
+++ b/service/src/main/java/io/mifos/individuallending/IndividualLendingPatternFactory.java
@@ -178,12 +178,10 @@
.orElseThrow(() -> new IllegalArgumentException("Case id does not represent an individual loan: " + caseId));
oldCaseParameters.setCustomerIdentifier(caseParameters.getCustomerIdentifier());
- oldCaseParameters.setInitialBalance(caseParameters.getInitialBalance());
+ oldCaseParameters.setBalanceRangeMaximum(caseParameters.getMaximumBalance());
oldCaseParameters.setTermRangeTemporalUnit(caseParameters.getTermRange().getTemporalUnit());
oldCaseParameters.setTermRangeMinimum(0);
oldCaseParameters.setTermRangeMaximum(caseParameters.getTermRange().getMaximum());
- oldCaseParameters.setBalanceRangeMinimum(caseParameters.getBalanceRange().getMinimum());
- oldCaseParameters.setBalanceRangeMaximum(caseParameters.getBalanceRange().getMaximum());
oldCaseParameters.setPaymentCycleTemporalUnit(caseParameters.getPaymentCycle().getTemporalUnit());
oldCaseParameters.setPaymentCyclePeriod(caseParameters.getPaymentCycle().getPeriod());
oldCaseParameters.setPaymentCycleAlignmentDay(caseParameters.getPaymentCycle().getAlignmentDay());
diff --git a/service/src/main/java/io/mifos/individuallending/internal/mapper/CaseParametersMapper.java b/service/src/main/java/io/mifos/individuallending/internal/mapper/CaseParametersMapper.java
index 8fa3692..e549cea 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/mapper/CaseParametersMapper.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/mapper/CaseParametersMapper.java
@@ -17,7 +17,6 @@
import io.mifos.individuallending.internal.repository.CaseParametersEntity;
import io.mifos.individuallending.api.v1.domain.caseinstance.CaseParameters;
-import io.mifos.portfolio.api.v1.domain.BalanceRange;
import io.mifos.portfolio.api.v1.domain.PaymentCycle;
import io.mifos.portfolio.api.v1.domain.TermRange;
@@ -31,12 +30,10 @@
ret.setCaseId(caseId);
ret.setCustomerIdentifier(instance.getCustomerIdentifier());
- ret.setInitialBalance(instance.getInitialBalance());
ret.setTermRangeTemporalUnit(instance.getTermRange().getTemporalUnit());
ret.setTermRangeMinimum(0);
ret.setTermRangeMaximum(instance.getTermRange().getMaximum());
- ret.setBalanceRangeMinimum(instance.getBalanceRange().getMinimum());
- ret.setBalanceRangeMaximum(instance.getBalanceRange().getMaximum());
+ ret.setBalanceRangeMaximum(instance.getMaximumBalance());
ret.setPaymentCycleTemporalUnit(instance.getPaymentCycle().getTemporalUnit());
ret.setPaymentCyclePeriod(instance.getPaymentCycle().getPeriod());
ret.setPaymentCycleAlignmentDay(instance.getPaymentCycle().getAlignmentDay());
@@ -55,15 +52,6 @@
return ret;
}
- private static BalanceRange getBalanceRange(final CaseParametersEntity instance) {
- final BalanceRange ret = new BalanceRange();
-
- ret.setMinimum(instance.getBalanceRangeMinimum());
- ret.setMaximum(instance.getBalanceRangeMaximum());
-
- return ret;
- }
-
private static PaymentCycle getPaymentCycle(final CaseParametersEntity instance) {
final PaymentCycle ret = new PaymentCycle();
@@ -76,12 +64,11 @@
return ret;
}
- public static CaseParameters mapEntity(CaseParametersEntity caseParametersEntity) {
+ public static CaseParameters mapEntity(final CaseParametersEntity caseParametersEntity) {
final CaseParameters ret = new CaseParameters();
ret.setCustomerIdentifier(caseParametersEntity.getCustomerIdentifier());
- ret.setInitialBalance(caseParametersEntity.getInitialBalance());
ret.setTermRange(getTermRange(caseParametersEntity));
- ret.setBalanceRange(getBalanceRange(caseParametersEntity));
+ ret.setMaximumBalance(caseParametersEntity.getBalanceRangeMaximum());
ret.setPaymentCycle(getPaymentCycle(caseParametersEntity));
return ret;
}
diff --git a/service/src/main/java/io/mifos/individuallending/internal/repository/CaseParametersEntity.java b/service/src/main/java/io/mifos/individuallending/internal/repository/CaseParametersEntity.java
index 07fe9c9..053d6db 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/repository/CaseParametersEntity.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/repository/CaseParametersEntity.java
@@ -36,9 +36,6 @@
@Column(name = "customer_identifier")
private String customerIdentifier;
- @Column(name = "initial_balance")
- private BigDecimal initialBalance;
-
@Enumerated(EnumType.STRING)
@Column(name = "term_range_temporal_unit")
private ChronoUnit termRangeTemporalUnit;
@@ -49,9 +46,6 @@
@Column(name = "term_range_maximum")
private Integer termRangeMaximum;
- @Column(name = "balance_range_minimum")
- private BigDecimal balanceRangeMinimum;
-
@Column(name = "balance_range_maximum")
private BigDecimal balanceRangeMaximum;
@@ -98,14 +92,6 @@
this.customerIdentifier = customerIdentifier;
}
- public BigDecimal getInitialBalance() {
- return initialBalance;
- }
-
- public void setInitialBalance(BigDecimal initialBalance) {
- this.initialBalance = initialBalance;
- }
-
public ChronoUnit getTermRangeTemporalUnit() {
return termRangeTemporalUnit;
}
@@ -130,14 +116,6 @@
this.termRangeMaximum = termRangeMaximum;
}
- public BigDecimal getBalanceRangeMinimum() {
- return balanceRangeMinimum;
- }
-
- public void setBalanceRangeMinimum(BigDecimal balanceRangeMinimum) {
- this.balanceRangeMinimum = balanceRangeMinimum;
- }
-
public BigDecimal getBalanceRangeMaximum() {
return balanceRangeMaximum;
}
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/IndividualLoanService.java b/service/src/main/java/io/mifos/individuallending/internal/service/IndividualLoanService.java
index 55ee47a..8f5a0b7 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/service/IndividualLoanService.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/IndividualLoanService.java
@@ -81,9 +81,9 @@
final List<ScheduledAction> scheduledActions = scheduledActionService.getScheduledActions(initialDisbursalDate, caseParameters);
- final List<ScheduledCharge> scheduledCharges = getScheduledCharges(productIdentifier, minorCurrencyUnitDigits, caseParameters.getInitialBalance(), scheduledActions);
+ final List<ScheduledCharge> scheduledCharges = getScheduledCharges(productIdentifier, minorCurrencyUnitDigits, caseParameters.getMaximumBalance(), scheduledActions);
- final List<PlannedPayment> plannedPaymentsElements = getPlannedPaymentsElements(caseParameters.getInitialBalance(), minorCurrencyUnitDigits, scheduledCharges);
+ final List<PlannedPayment> plannedPaymentsElements = getPlannedPaymentsElements(caseParameters.getMaximumBalance(), minorCurrencyUnitDigits, scheduledCharges);
final Set<ChargeName> chargeNames = scheduledCharges.stream()
.map(IndividualLoanService::chargeNameFromChargeDefinition)
diff --git a/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql b/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql
index dd85779..57f544d 100644
--- a/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql
+++ b/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql
@@ -113,11 +113,9 @@
id BIGINT NOT NULL AUTO_INCREMENT,
case_id BIGINT NOT NULL,
customer_identifier VARCHAR(32) NOT NULL,
- initial_balance DECIMAL(19,4) NOT NULL,
term_range_temporal_unit VARCHAR(128) NOT NULL,
term_range_minimum INT NOT NULL,
term_range_maximum INT NOT NULL,
- balance_range_minimum DECIMAL(19,4) NOT NULL,
balance_range_maximum DECIMAL(19,4) NOT NULL,
pay_cycle_temporal_unit VARCHAR(128) NOT NULL,
pay_cycle_period INT NOT NULL,