package org.mifos.accounts.loan.business.service.validators; import java.math.BigDecimal; import java.util.List; import org.mifos.accounts.loan.util.helpers.RepaymentScheduleInstallment; import org.mifos.platform.validations.Errors; public class InstallmentsValidatorImpl implements InstallmentsValidator { private InstallmentFormatValidator installmentFormatValidator; private ListOfInstallmentsValidator listOfInstallmentsValidator; private InstallmentRulesValidator installmentRulesValidator; public InstallmentsValidatorImpl() { this(new InstallmentFormatValidatorImpl(), new ListOfInstallmentsValidatorImpl(), new InstallmentRulesValidatorImpl()); } public InstallmentsValidatorImpl(InstallmentFormatValidator installmentFormatValidator, ListOfInstallmentsValidator listOfInstallmentsValidator, InstallmentRulesValidator installmentRulesValidator) { this.installmentFormatValidator = installmentFormatValidator; this.listOfInstallmentsValidator = listOfInstallmentsValidator; this.installmentRulesValidator = installmentRulesValidator; } @Override public Errors validateInputInstallments(List<RepaymentScheduleInstallment> installments, InstallmentValidationContext installmentValidationContext) { Errors errors = new Errors(); validateInstallmentFormat(installments, errors); validateListOfInstallments(installments, errors); validateBusinessRulesForInstallments(installments, installmentValidationContext, errors); return errors; } @Override public Errors validateInstallmentSchedule(List<RepaymentScheduleInstallment> installments, BigDecimal minInstallmentAmountAllowed) { Errors errors = new Errors(); errors.addErrors(installmentRulesValidator.validateForMinimumInstallmentAmount(installments, minInstallmentAmountAllowed)); return errors; } private void validateInstallmentFormat(List<RepaymentScheduleInstallment> installments, Errors errors) { for (RepaymentScheduleInstallment installment : installments) { errors.addErrors(installmentFormatValidator.validateTotalAmountFormat(installment)); errors.addErrors(installmentFormatValidator.validateDueDateFormat(installment)); } } private void validateListOfInstallments(List<RepaymentScheduleInstallment> installments, Errors errors) { errors.addErrors(listOfInstallmentsValidator.validateDuplicateDueDates(installments)); errors.addErrors(listOfInstallmentsValidator.validateOrderingOfDueDates(installments)); } private void validateBusinessRulesForInstallments(List<RepaymentScheduleInstallment> installments, InstallmentValidationContext context, Errors errors) { errors.addErrors(installmentRulesValidator.validateForDisbursementDate(installments, context.getDisbursementDate())); errors.addErrors(installmentRulesValidator.validateDueDatesForVariableInstallments(installments, context.getVariableInstallmentDetails(), context.getDisbursementDate())); errors.addErrors(installmentRulesValidator.validateForHolidays(installments, context.getHolidayServiceFacade(), context.getOfficeId())); } }