Merge pull request #1543 from rajuan/MIFOSX-2350

MIFOSX-2350 : Added additional validations
This commit is contained in:
Shaik Nazeer Hussain
2015-11-16 13:27:22 +05:30
10 changed files with 138 additions and 44 deletions
@@ -5,6 +5,8 @@
*/
package org.mifosplatform.portfolio.floatingrates.domain;
import java.util.Collection;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
@@ -15,5 +17,12 @@ public interface FloatingRateRepository extends
@Query("from FloatingRate floatingRate where floatingRate.isBaseLendingRate = 1 and floatingRate.isActive = 1")
FloatingRate retrieveBaseLendingRate();
@Query("from FloatingRate floatingRate " +
" inner join floatingRate.floatingRatePeriods as periods" +
" where floatingRate.isActive = 1 " +
" and periods.isActive = 1 " +
" and periods.isDifferentialToBaseLendingRate = 1")
Collection<FloatingRate> retrieveFloatingRatesLinkedToBLR();
}
@@ -9,6 +9,7 @@ import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -66,9 +67,10 @@ public class FloatingRateDataValidator {
baseDataValidator.reset().parameter("name").value(name).notBlank()
.notExceedingLengthOf(200);
Boolean isBaseLendingRate = null;
if (this.fromApiJsonHelper
.parameterExists("isBaseLendingRate", element)) {
final Boolean isBaseLendingRate = this.fromApiJsonHelper
isBaseLendingRate = this.fromApiJsonHelper
.extractBooleanNamed("isBaseLendingRate", element);
baseDataValidator.reset().parameter("isBaseLendingRate")
@@ -99,13 +101,16 @@ public class FloatingRateDataValidator {
}
}
validateRatePeriods(baseDataValidator, element);
if(isBaseLendingRate == null){
isBaseLendingRate = false;
}
validateRatePeriods(baseDataValidator, element, isBaseLendingRate, false);
throwExceptionIfValidationWarningsExist(dataValidationErrors);
}
private void validateRatePeriods(DataValidatorBuilder baseDataValidator,
JsonElement element) {
JsonElement element, boolean isBaseLendingRate, boolean isBLRModifiedAsNonBLR) {
if (this.fromApiJsonHelper.parameterExists("ratePeriods", element)) {
final JsonArray ratePeriods = this.fromApiJsonHelper
.extractJsonArrayNamed("ratePeriods", element);
@@ -161,7 +166,7 @@ public class FloatingRateDataValidator {
} else if (isDifferentialToBaseLendingRate) {
FloatingRate baseLendingRate = this.floatingRateRepository
.retrieveBaseLendingRate();
if (baseLendingRate == null) {
if (baseLendingRate == null || isBLRModifiedAsNonBLR) {
baseDataValidator
.reset()
.parameter(
@@ -174,6 +179,20 @@ public class FloatingRateDataValidator {
"no.baselending.rate.defined",
"Base Lending Rate doesn't exists");
}
if(isBaseLendingRate){
baseDataValidator
.reset()
.parameter(
"isDifferentialToBaseLendingRate")
.parameterAtIndexArray(
"isDifferentialToBaseLendingRate",
i + 1)
.value(isDifferentialToBaseLendingRate)
.failWithCode(
"cannot.be.true.for.baselendingrate",
"isDifferentialToBaseLendingRate cannot be true for floating rate marked as Base Lending Rate.");
}
}
}
@@ -211,9 +230,13 @@ public class FloatingRateDataValidator {
.notExceedingLengthOf(200);
}
Boolean isBaseLendingRate = null;
Boolean isBLRModifiedAsNonBLR = false;
FloatingRate baseLendingRate = this.floatingRateRepository
.retrieveBaseLendingRate();
if (this.fromApiJsonHelper
.parameterExists("isBaseLendingRate", element)) {
final Boolean isBaseLendingRate = this.fromApiJsonHelper
isBaseLendingRate = this.fromApiJsonHelper
.extractBooleanNamed("isBaseLendingRate", element);
baseDataValidator.reset().parameter("isBaseLendingRate")
@@ -222,8 +245,6 @@ public class FloatingRateDataValidator {
baseDataValidator.reset().parameter("isBaseLendingRate")
.trueOrFalseRequired(false);
} else if (isBaseLendingRate) {
FloatingRate baseLendingRate = this.floatingRateRepository
.retrieveBaseLendingRate();
if (baseLendingRate != null
&& baseLendingRate.getId() != floatingRateForUpdate
.getId()) {
@@ -237,8 +258,9 @@ public class FloatingRateDataValidator {
}
}
Boolean isActive = null;
if (this.fromApiJsonHelper.parameterExists("isActive", element)) {
final Boolean isActive = this.fromApiJsonHelper
isActive = this.fromApiJsonHelper
.extractBooleanNamed("isActive", element);
if (isActive == null) {
baseDataValidator.reset().parameter("isActive")
@@ -246,7 +268,36 @@ public class FloatingRateDataValidator {
}
}
validateRatePeriods(baseDataValidator, element);
if(isBaseLendingRate == null){
isBaseLendingRate = floatingRateForUpdate.isBaseLendingRate();
}
if(isActive == null){
isActive = floatingRateForUpdate.isActive();
}
if(baseLendingRate != null
&& baseLendingRate.getId() == floatingRateForUpdate
.getId()){
if(!isBaseLendingRate || !isActive){
isBLRModifiedAsNonBLR = true;
}
}
if(isBLRModifiedAsNonBLR){
Collection<FloatingRate> floatingRates = this.floatingRateRepository.retrieveFloatingRatesLinkedToBLR();
if(floatingRates != null && floatingRates.size() > 0){
baseDataValidator
.reset()
.parameter("isBaseLendingRate")
.value(isBaseLendingRate)
.failWithCode("cannot.be.marked.non.baselendingrate",
"There are floating rates linked to this Base Lending Rate, cannot be marked as non-Base Lending Rate.");
}
}
validateRatePeriods(baseDataValidator, element, isBaseLendingRate, isBLRModifiedAsNonBLR);
throwExceptionIfValidationWarningsExist(dataValidationErrors);
}
@@ -51,6 +51,7 @@ import org.mifosplatform.portfolio.common.domain.PeriodFrequencyType;
import org.mifosplatform.portfolio.common.service.BusinessEventNotifierService;
import org.mifosplatform.portfolio.floatingrates.data.FloatingRateDTO;
import org.mifosplatform.portfolio.floatingrates.data.FloatingRatePeriodData;
import org.mifosplatform.portfolio.floatingrates.exception.FloatingRateNotFoundException;
import org.mifosplatform.portfolio.floatingrates.service.FloatingRatesReadPlatformService;
import org.mifosplatform.portfolio.group.domain.Group;
import org.mifosplatform.portfolio.group.exception.GroupNotActiveException;
@@ -252,8 +253,14 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService {
if (loan.loanProduct().isLinkedToFloatingInterestRate()) {
boolean isFloatingInterestRate = loan.getIsFloatingInterestRate();
BigDecimal interestRateDiff = loan.getInterestRateDifferential();
List<FloatingRatePeriodData> baseLendingRatePeriods = this.floatingRatesReadPlatformService.retrieveBaseLendingRate()
.getRatePeriods();
List<FloatingRatePeriodData> baseLendingRatePeriods = null;
try{
baseLendingRatePeriods = this.floatingRatesReadPlatformService.retrieveBaseLendingRate()
.getRatePeriods();
}catch(final FloatingRateNotFoundException ex){
// Do not do anything
}
floatingRateDTO = new FloatingRateDTO(isFloatingInterestRate, loan.getDisbursementDate(), interestRateDiff,
baseLendingRatePeriods);
}
@@ -49,6 +49,7 @@ import org.mifosplatform.portfolio.common.domain.DaysInYearType;
import org.mifosplatform.portfolio.common.domain.PeriodFrequencyType;
import org.mifosplatform.portfolio.floatingrates.data.FloatingRateDTO;
import org.mifosplatform.portfolio.floatingrates.data.FloatingRatePeriodData;
import org.mifosplatform.portfolio.floatingrates.exception.FloatingRateNotFoundException;
import org.mifosplatform.portfolio.floatingrates.service.FloatingRatesReadPlatformService;
import org.mifosplatform.portfolio.group.domain.Group;
import org.mifosplatform.portfolio.group.domain.GroupRepositoryWrapper;
@@ -312,8 +313,13 @@ public class LoanScheduleAssembler {
LoanApiConstants.interestRateDifferentialParameterName, element);
final Boolean isFloatingInterestRate = this.fromApiJsonHelper.extractBooleanNamed(
LoanApiConstants.isFloatingInterestRateParameterName, element);
List<FloatingRatePeriodData> baseLendingRatePeriods = this.floatingRatesReadPlatformService.retrieveBaseLendingRate()
.getRatePeriods();
List<FloatingRatePeriodData> baseLendingRatePeriods = null;
try{
baseLendingRatePeriods = this.floatingRatesReadPlatformService.retrieveBaseLendingRate()
.getRatePeriods();
}catch(final FloatingRateNotFoundException ex){
// Do not do anything
}
FloatingRateDTO floatingRateDTO = new FloatingRateDTO(isFloatingInterestRate, expectedDisbursementDate, interestRateDiff,
baseLendingRatePeriods);
Collection<FloatingRatePeriodData> applicableRates = loanProduct.fetchInterestRates(floatingRateDTO);
@@ -28,6 +28,7 @@ import org.mifosplatform.portfolio.calendar.domain.CalendarInstance;
import org.mifosplatform.portfolio.calendar.domain.CalendarInstanceRepository;
import org.mifosplatform.portfolio.floatingrates.data.FloatingRateDTO;
import org.mifosplatform.portfolio.floatingrates.data.FloatingRatePeriodData;
import org.mifosplatform.portfolio.floatingrates.exception.FloatingRateNotFoundException;
import org.mifosplatform.portfolio.floatingrates.service.FloatingRatesReadPlatformService;
import org.mifosplatform.portfolio.loanaccount.domain.Loan;
import org.mifosplatform.portfolio.loanaccount.domain.LoanAccountDomainService;
@@ -222,8 +223,13 @@ public class LoanScheduleCalculationPlatformServiceImpl implements LoanScheduleC
if (loan.loanProduct().isLinkedToFloatingInterestRate()) {
boolean isFloatingInterestRate = loan.getIsFloatingInterestRate();
BigDecimal interestRateDiff = loan.getInterestRateDifferential();
List<FloatingRatePeriodData> baseLendingRatePeriods = this.floatingRatesReadPlatformService.retrieveBaseLendingRate()
.getRatePeriods();
List<FloatingRatePeriodData> baseLendingRatePeriods = null;
try{
baseLendingRatePeriods = this.floatingRatesReadPlatformService.retrieveBaseLendingRate()
.getRatePeriods();
}catch(final FloatingRateNotFoundException ex){
// Do not do anything
}
floatingRateDTO = new FloatingRateDTO(isFloatingInterestRate, loan.getDisbursementDate(), interestRateDiff,
baseLendingRatePeriods);
}
@@ -26,6 +26,7 @@ import org.mifosplatform.portfolio.calendar.domain.CalendarInstance;
import org.mifosplatform.portfolio.calendar.domain.CalendarInstanceRepository;
import org.mifosplatform.portfolio.floatingrates.data.FloatingRateDTO;
import org.mifosplatform.portfolio.floatingrates.data.FloatingRatePeriodData;
import org.mifosplatform.portfolio.floatingrates.exception.FloatingRateNotFoundException;
import org.mifosplatform.portfolio.floatingrates.service.FloatingRatesReadPlatformService;
import org.mifosplatform.portfolio.loanaccount.data.HolidayDetailDTO;
import org.mifosplatform.portfolio.loanaccount.domain.Loan;
@@ -121,8 +122,13 @@ public class LoanReschedulePreviewPlatformServiceImpl implements LoanRescheduleP
if (loan.loanProduct().isLinkedToFloatingInterestRate()) {
boolean isFloatingInterestRate = loan.getIsFloatingInterestRate();
BigDecimal interestRateDiff = loan.getInterestRateDifferential();
List<FloatingRatePeriodData> baseLendingRatePeriods = this.floatingRatesReadPlatformService.retrieveBaseLendingRate()
.getRatePeriods();
List<FloatingRatePeriodData> baseLendingRatePeriods = null;
try{
baseLendingRatePeriods = this.floatingRatesReadPlatformService.retrieveBaseLendingRate()
.getRatePeriods();
}catch(final FloatingRateNotFoundException ex){
// Do not do anything
}
floatingRateDTO = new FloatingRateDTO(isFloatingInterestRate, loan.getDisbursementDate(), interestRateDiff,
baseLendingRatePeriods);
}
@@ -38,6 +38,7 @@ import org.mifosplatform.portfolio.calendar.domain.CalendarInstance;
import org.mifosplatform.portfolio.calendar.domain.CalendarInstanceRepository;
import org.mifosplatform.portfolio.floatingrates.data.FloatingRateDTO;
import org.mifosplatform.portfolio.floatingrates.data.FloatingRatePeriodData;
import org.mifosplatform.portfolio.floatingrates.exception.FloatingRateNotFoundException;
import org.mifosplatform.portfolio.floatingrates.service.FloatingRatesReadPlatformService;
import org.mifosplatform.portfolio.loanaccount.data.HolidayDetailDTO;
import org.mifosplatform.portfolio.loanaccount.data.LoanChargePaidByData;
@@ -581,8 +582,13 @@ public class LoanRescheduleRequestWritePlatformServiceImpl implements LoanResche
if (loan.loanProduct().isLinkedToFloatingInterestRate()) {
boolean isFloatingInterestRate = loan.getIsFloatingInterestRate();
BigDecimal interestRateDiff = loan.getInterestRateDifferential();
List<FloatingRatePeriodData> baseLendingRatePeriods = this.floatingRatesReadPlatformService.retrieveBaseLendingRate()
.getRatePeriods();
List<FloatingRatePeriodData> baseLendingRatePeriods = null;
try{
baseLendingRatePeriods = this.floatingRatesReadPlatformService.retrieveBaseLendingRate()
.getRatePeriods();
}catch(final FloatingRateNotFoundException ex){
// Do not do anything
}
floatingRateDTO = new FloatingRateDTO(isFloatingInterestRate, loan.getDisbursementDate(), interestRateDiff,
baseLendingRatePeriods);
}
@@ -66,6 +66,7 @@ import org.mifosplatform.portfolio.common.service.CommonEnumerations;
import org.mifosplatform.portfolio.floatingrates.data.InterestRatePeriodData;
import org.mifosplatform.portfolio.floatingrates.data.FloatingRateDTO;
import org.mifosplatform.portfolio.floatingrates.data.FloatingRatePeriodData;
import org.mifosplatform.portfolio.floatingrates.exception.FloatingRateNotFoundException;
import org.mifosplatform.portfolio.floatingrates.service.FloatingRatesReadPlatformService;
import org.mifosplatform.portfolio.fund.data.FundData;
import org.mifosplatform.portfolio.fund.service.FundReadPlatformService;
@@ -1969,8 +1970,13 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService {
if (loan.loanProduct().isLinkedToFloatingInterestRate()) {
boolean isFloatingInterestRate = loan.getIsFloatingInterestRate();
BigDecimal interestRateDiff = loan.getInterestRateDifferential();
List<FloatingRatePeriodData> baseLendingRatePeriods = this.floatingRatesReadPlatformService.retrieveBaseLendingRate()
.getRatePeriods();
List<FloatingRatePeriodData> baseLendingRatePeriods = null;
try{
baseLendingRatePeriods = this.floatingRatesReadPlatformService.retrieveBaseLendingRate()
.getRatePeriods();
}catch(final FloatingRateNotFoundException ex){
// Do not do anything
}
floatingRateDTO = new FloatingRateDTO(isFloatingInterestRate, loan.getDisbursementDate(), interestRateDiff,
baseLendingRatePeriods);
}
@@ -99,6 +99,7 @@ import org.mifosplatform.portfolio.common.domain.PeriodFrequencyType;
import org.mifosplatform.portfolio.common.service.BusinessEventNotifierService;
import org.mifosplatform.portfolio.floatingrates.data.FloatingRateDTO;
import org.mifosplatform.portfolio.floatingrates.data.FloatingRatePeriodData;
import org.mifosplatform.portfolio.floatingrates.exception.FloatingRateNotFoundException;
import org.mifosplatform.portfolio.floatingrates.service.FloatingRatesReadPlatformService;
import org.mifosplatform.portfolio.group.domain.Group;
import org.mifosplatform.portfolio.group.exception.GroupNotActiveException;
@@ -3053,8 +3054,13 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
if (loan.loanProduct().isLinkedToFloatingInterestRate()) {
boolean isFloatingInterestRate = loan.getIsFloatingInterestRate();
BigDecimal interestRateDiff = loan.getInterestRateDifferential();
List<FloatingRatePeriodData> baseLendingRatePeriods = this.floatingRatesReadPlatformService.retrieveBaseLendingRate()
.getRatePeriods();
List<FloatingRatePeriodData> baseLendingRatePeriods = null;
try{
baseLendingRatePeriods = this.floatingRatesReadPlatformService.retrieveBaseLendingRate()
.getRatePeriods();
}catch(final FloatingRateNotFoundException ex){
// Do not do anything
}
floatingRateDTO = new FloatingRateDTO(isFloatingInterestRate, loan.getDisbursementDate(), interestRateDiff,
baseLendingRatePeriods);
}
@@ -326,31 +326,22 @@ public final class LoanProductDataValidator {
baseDataValidator.reset().parameter("interestRateDifferential").value(interestRateDifferential).notNull().zeroOrPositiveAmount();
final String minDifferentialLendingRateParameterName = "minDifferentialLendingRate";
BigDecimal minDifferentialLendingRate = null;
if (this.fromApiJsonHelper.parameterExists(minDifferentialLendingRateParameterName, element)) {
minDifferentialLendingRate = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(minDifferentialLendingRateParameterName,
element);
baseDataValidator.reset().parameter(minDifferentialLendingRateParameterName).value(minDifferentialLendingRate).ignoreIfNull()
BigDecimal minDifferentialLendingRate = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(minDifferentialLendingRateParameterName,
element);
baseDataValidator.reset().parameter(minDifferentialLendingRateParameterName).value(minDifferentialLendingRate).notNull()
.zeroOrPositiveAmount();
}
final String defaultDifferentialLendingRateParameterName = "defaultDifferentialLendingRate";
BigDecimal defaultDifferentialLendingRate = null;
if (this.fromApiJsonHelper.parameterExists(defaultDifferentialLendingRateParameterName, element)) {
defaultDifferentialLendingRate = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(defaultDifferentialLendingRateParameterName,
element);
baseDataValidator.reset().parameter(defaultDifferentialLendingRateParameterName).value(defaultDifferentialLendingRate).ignoreIfNull()
BigDecimal defaultDifferentialLendingRate = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(defaultDifferentialLendingRateParameterName,
element);
baseDataValidator.reset().parameter(defaultDifferentialLendingRateParameterName).value(defaultDifferentialLendingRate).notNull()
.zeroOrPositiveAmount();
}
final String maxDifferentialLendingRateParameterName = "maxDifferentialLendingRate";
BigDecimal maxDifferentialLendingRate = null;
if (this.fromApiJsonHelper.parameterExists(maxDifferentialLendingRateParameterName, element)) {
maxDifferentialLendingRate = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(maxDifferentialLendingRateParameterName,
element);
baseDataValidator.reset().parameter(maxDifferentialLendingRateParameterName).value(maxDifferentialLendingRate).ignoreIfNull()
BigDecimal maxDifferentialLendingRate = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(maxDifferentialLendingRateParameterName,
element);
baseDataValidator.reset().parameter(maxDifferentialLendingRateParameterName).value(maxDifferentialLendingRate).notNull()
.zeroOrPositiveAmount();
}
if (defaultDifferentialLendingRate != null && defaultDifferentialLendingRate.compareTo(BigDecimal.ZERO) != -1) {
if (minDifferentialLendingRate != null && minDifferentialLendingRate.compareTo(BigDecimal.ZERO) != -1) {
@@ -1052,7 +1043,7 @@ public final class LoanProductDataValidator {
minDifferentialLendingRate = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(minDifferentialLendingRateParameterName,
element);
}
baseDataValidator.reset().parameter(minDifferentialLendingRateParameterName).value(minDifferentialLendingRate).ignoreIfNull()
baseDataValidator.reset().parameter(minDifferentialLendingRateParameterName).value(minDifferentialLendingRate).notNull()
.zeroOrPositiveAmount();
final String defaultDifferentialLendingRateParameterName = "defaultDifferentialLendingRate";
@@ -1062,7 +1053,7 @@ public final class LoanProductDataValidator {
defaultDifferentialLendingRate = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(defaultDifferentialLendingRateParameterName,
element);
}
baseDataValidator.reset().parameter(defaultDifferentialLendingRateParameterName).value(defaultDifferentialLendingRate).ignoreIfNull()
baseDataValidator.reset().parameter(defaultDifferentialLendingRateParameterName).value(defaultDifferentialLendingRate).notNull()
.zeroOrPositiveAmount();
final String maxDifferentialLendingRateParameterName = "maxDifferentialLendingRate";
@@ -1072,7 +1063,7 @@ public final class LoanProductDataValidator {
maxDifferentialLendingRate = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(maxDifferentialLendingRateParameterName,
element);
}
baseDataValidator.reset().parameter(maxDifferentialLendingRateParameterName).value(maxDifferentialLendingRate).ignoreIfNull()
baseDataValidator.reset().parameter(maxDifferentialLendingRateParameterName).value(maxDifferentialLendingRate).notNull()
.zeroOrPositiveAmount();
if (defaultDifferentialLendingRate != null && defaultDifferentialLendingRate.compareTo(BigDecimal.ZERO) != -1) {