Adjusted validation of loss provisiong configuration. Steps are no longer
forced to 100%, but they should now be unique by daysLate.
diff --git a/api/src/main/java/io/mifos/portfolio/api/v1/validation/CheckValidLossProvisionList.java b/api/src/main/java/io/mifos/portfolio/api/v1/validation/CheckValidLossProvisionList.java
index 3085033..adf9988 100644
--- a/api/src/main/java/io/mifos/portfolio/api/v1/validation/CheckValidLossProvisionList.java
+++ b/api/src/main/java/io/mifos/portfolio/api/v1/validation/CheckValidLossProvisionList.java
@@ -19,8 +19,9 @@
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
-import java.math.BigDecimal;
import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
/**
* @author Myrle Krantz
@@ -35,10 +36,11 @@
public boolean isValid(
final List<LossProvisionStep> value,
final ConstraintValidatorContext context) {
- final BigDecimal sum = value.stream()
- .map(LossProvisionStep::getPercentProvision)
- .map(x -> x.setScale(2, BigDecimal.ROUND_HALF_EVEN))
- .reduce(BigDecimal.ZERO, BigDecimal::add);
- return sum.compareTo(BigDecimal.valueOf(100_00, 2)) == 0;
+ if (value == null) return false;
+ final Map<Integer, Long> configurationsPerDay = value.stream()
+ .collect(Collectors.groupingBy(LossProvisionStep::getDaysLate, Collectors.counting()));
+ final boolean moreThanOneConfigurationForAtLeastOneDay = configurationsPerDay.values().stream()
+ .anyMatch(x -> x > 1);
+ return !moreThanOneConfigurationForAtLeastOneDay;
}
}
\ No newline at end of file
diff --git a/api/src/test/java/io/mifos/individuallending/api/v1/domain/product/LossProvisionConfigurationTest.java b/api/src/test/java/io/mifos/individuallending/api/v1/domain/product/LossProvisionConfigurationTest.java
index ba6e24b..5139310 100644
--- a/api/src/test/java/io/mifos/individuallending/api/v1/domain/product/LossProvisionConfigurationTest.java
+++ b/api/src/test/java/io/mifos/individuallending/api/v1/domain/product/LossProvisionConfigurationTest.java
@@ -36,7 +36,7 @@
final LossProvisionConfiguration ret = new LossProvisionConfiguration();
final List<LossProvisionStep> lossProvisionSteps = new ArrayList<>();
lossProvisionSteps.add(new LossProvisionStep(0, BigDecimal.ONE));
- lossProvisionSteps.add(new LossProvisionStep(1, BigDecimal.valueOf(9)));
+ lossProvisionSteps.add(new LossProvisionStep(1, BigDecimal.valueOf(10)));
lossProvisionSteps.add(new LossProvisionStep(10, BigDecimal.valueOf(20)));
lossProvisionSteps.add(new LossProvisionStep(50, BigDecimal.valueOf(70)));
ret.setLossProvisionSteps(lossProvisionSteps);
@@ -50,15 +50,12 @@
ret.add(new ValidationTestCase<LossProvisionConfiguration>("valid"));
ret.add(new ValidationTestCase<LossProvisionConfiguration>("emptyList")
.adjustment(x -> x.setLossProvisionSteps(Collections.emptyList()))
- .valid(false));
+ .valid(true));
ret.add(new ValidationTestCase<LossProvisionConfiguration>("nullList")
- .adjustment(x -> x.setLossProvisionSteps(Collections.emptyList()))
+ .adjustment(x -> x.setLossProvisionSteps(null))
.valid(false));
- ret.add(new ValidationTestCase<LossProvisionConfiguration>("sumTooSmall")
- .adjustment(x -> x.getLossProvisionSteps().get(0).setPercentProvision(BigDecimal.valueOf(0.1)))
- .valid(false));
- ret.add(new ValidationTestCase<LossProvisionConfiguration>("sumTooLarge")
- .adjustment(x -> x.getLossProvisionSteps().get(3).setPercentProvision(BigDecimal.valueOf(71)))
+ ret.add(new ValidationTestCase<LossProvisionConfiguration>("moreThanOneValuesForOneDay")
+ .adjustment(x -> x.getLossProvisionSteps().add(new LossProvisionStep(0, BigDecimal.valueOf(0.1))))
.valid(false));
return ret;