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,