Example usage for org.joda.time LocalDate isBefore

List of usage examples for org.joda.time LocalDate isBefore

Introduction

In this page you can find the example usage for org.joda.time LocalDate isBefore.

Prototype

public boolean isBefore(ReadablePartial partial) 

Source Link

Document

Is this partial earlier than the specified partial.

Usage

From source file:org.mifos.accounts.savings.business.SavingsBO.java

License:Open Source License

public AccountPaymentEntity findMostRecentDepositOrWithdrawalByDate() {
    AccountPaymentEntity mostRecentPayment = null;
    if (!this.accountPayments.isEmpty()) {
        for (AccountPaymentEntity accountPaymentEntity : this.accountPayments) {
            if (mostRecentPayment == null && accountPaymentEntity.isSavingsDepositOrWithdrawal()) {
                mostRecentPayment = accountPaymentEntity;
            } else if (mostRecentPayment != null) {
                LocalDate paymentDate = new LocalDate(accountPaymentEntity.getPaymentDate());
                if ((paymentDate.isAfter(new LocalDate(mostRecentPayment.getPaymentDate()))
                        && paymentDate.isBefore(new LocalDate().plusDays(1)))
                        || (paymentDate.isEqual(new LocalDate(mostRecentPayment.getPaymentDate()))
                                && accountPaymentEntity.getPaymentId() != null
                                && mostRecentPayment.getPaymentId() != null
                                && accountPaymentEntity.getPaymentId() > mostRecentPayment.getPaymentId())
                                && accountPaymentEntity.isSavingsDepositOrWithdrawal()) {
                    mostRecentPayment = accountPaymentEntity;
                }/*from w ww.j av a  2 s  .com*/
            }
        }
    }
    return mostRecentPayment;
}

From source file:org.mifos.accounts.savings.business.SavingsBO.java

License:Open Source License

@Override
public boolean isTrxnDateValid(Date trxnDate, Date lastMeetingDate,
        boolean repaymentIndependentOfMeetingEnabled) {
    LocalDate transactionLocalDate = new LocalDate(trxnDate);
    LocalDate today = new LocalDate();

    if (AccountingRules.isBackDatedTxnAllowed()) {

        if (repaymentIndependentOfMeetingEnabled) {
            Date activationDate = this.getActivationDate();
            return trxnDate.compareTo(DateUtils.getDateWithoutTimeStamp(activationDate)) >= 0;
        }/*  w ww .j av a  2s .  com*/

        InterestScheduledEvent postingEvent = new SavingsInterestScheduledEventFactory()
                .createScheduledEventFrom(this.getInterestPostingMeeting());
        LocalDate nextPostingDate = new LocalDate(this.nextIntPostDate);
        LocalDate currentPostingPeriodStartDate = postingEvent
                .findFirstDateOfPeriodForMatchingDate(nextPostingDate);

        if (getInterestPostingMeeting().isDaily()) {
            if (lastIntPostDate == null) {
                currentPostingPeriodStartDate = new LocalDate(activationDate);
            } else {
                currentPostingPeriodStartDate = new LocalDate(lastIntPostDate).plusDays(1);
            }
        }

        // FIXME throw an exception with the correct reason instead of returning false
        if (transactionLocalDate.isBefore(currentPostingPeriodStartDate)) {
            return false;
        }

        LocalDate activationDate = new LocalDate(this.activationDate);

        if (lastMeetingDate != null) {
            LocalDate meetingDate = new LocalDate(lastMeetingDate);
            return (transactionLocalDate.isAfter(meetingDate) || transactionLocalDate.isEqual(meetingDate))
                    && (transactionLocalDate.isAfter(activationDate)
                            || transactionLocalDate.isEqual(activationDate));
        }

        return (transactionLocalDate.isAfter(activationDate) || transactionLocalDate.isEqual(activationDate))
                && (transactionLocalDate.isBefore(today) || transactionLocalDate.isEqual(today));
    }
    return transactionLocalDate.isEqual(today);
}

From source file:org.mifos.accounts.savings.interest.CalendarPeriod.java

License:Open Source License

/**
 * checks that <code>date</code> occurs within the {@link CalendarPeriod} with startDate and endDate inclusive.
 *///w  ww.  jav  a 2s .c  om
public boolean contains(LocalDate date) {
    return (date.isEqual(this.startDate) || date.isAfter(this.startDate))
            && (date.isEqual(this.endDate) || date.isBefore(endDate));
}

From source file:org.mifos.accounts.savings.interest.CalendarPeriodHelper.java

License:Open Source License

/**
 * determines all possible periods from the start of the fiscal year of the accounts first activity date.
 *//*from w  w w  .java2s  . c o m*/
public List<CalendarPeriod> determineAllPossiblePeriods(LocalDate firstActivityDate,
        InterestScheduledEvent interestCalculationEvent, LocalDate endDateOfLastPeriod) {

    List<CalendarPeriod> validIntervals = new ArrayList<CalendarPeriod>();

    // fiscal start of year is jan-01 so begin at jan-01 of first deposit.
    LocalDate startOfFiscalYearOfFirstDeposit = new LocalDate(
            new DateTime().withYearOfEra(firstActivityDate.getYear()).withMonthOfYear(1).withDayOfMonth(1));

    List<LocalDate> allMatchingDates = interestCalculationEvent
            .findAllMatchingDatesFromBaseDateUpToAndIncludingNearestMatchingEndDate(
                    startOfFiscalYearOfFirstDeposit, endDateOfLastPeriod);
    for (LocalDate matchingDate : allMatchingDates) {
        LocalDate firstDayofInterval = interestCalculationEvent
                .findFirstDateOfPeriodForMatchingDate(matchingDate);

        CalendarPeriod interval = new CalendarPeriod(firstDayofInterval, matchingDate);
        if (interval.contains(firstActivityDate)) {
            if (matchingDate.isAfter(endDateOfLastPeriod)) {
                interval = new CalendarPeriod(firstActivityDate, endDateOfLastPeriod);
            } else {
                interval = new CalendarPeriod(firstActivityDate, matchingDate);
            }
            validIntervals.add(interval);
        } else if (matchingDate.isAfter(firstActivityDate) && matchingDate.isBefore(endDateOfLastPeriod)
                || matchingDate.isEqual(endDateOfLastPeriod)) {
            validIntervals.add(interval);
        } else if (matchingDate.isAfter(endDateOfLastPeriod)
                && (firstDayofInterval.isBefore(endDateOfLastPeriod)
                        || firstDayofInterval.isEqual(endDateOfLastPeriod))) {
            interval = new CalendarPeriod(firstDayofInterval, endDateOfLastPeriod);
            validIntervals.add(interval);
        }
    }

    return validIntervals;
}

From source file:org.mifos.accounts.savings.interest.schedule.internal.DailyInterestScheduledEvent.java

License:Open Source License

@Override
public List<LocalDate> findAllMatchingDatesFromBaseDateUpToAndIncludingNearestMatchingEndDate(
        LocalDate baseDate, LocalDate cutOffDate) {

    List<LocalDate> allMatchingDates = new ArrayList<LocalDate>();

    LocalDate previousMatchingDate = baseDate.minusDays(1);
    LocalDate matchingDate = nextMatchingDateFromAlreadyMatchingDate(previousMatchingDate);
    while (matchingDate.isEqual(cutOffDate) || matchingDate.isBefore(cutOffDate)) {
        allMatchingDates.add(matchingDate);
        matchingDate = nextMatchingDateFromAlreadyMatchingDate(matchingDate);
    }/*from w ww.  j ava2 s  .  c  o  m*/

    if (!allMatchingDates.contains(matchingDate)) {
        allMatchingDates.add(matchingDate);
    }

    return allMatchingDates;
}

From source file:org.mifos.accounts.savings.interest.schedule.internal.MonthlyOnLastDayOfMonthInterestScheduledEvent.java

License:Open Source License

@Override
public List<LocalDate> findAllMatchingDatesFromBaseDateUpToAndIncludingNearestMatchingEndDate(
        LocalDate baseDate, LocalDate cutOffDate) {
    List<LocalDate> allMatchingDates = new ArrayList<LocalDate>();

    LocalDate previousMatchingDate = baseDate.minusDays(1);
    LocalDate matchingDate = nextMatchingDateFromAlreadyMatchingDate(previousMatchingDate);
    while (matchingDate.isEqual(cutOffDate) || matchingDate.isBefore(cutOffDate)) {
        allMatchingDates.add(matchingDate);
        matchingDate = nextMatchingDateFromAlreadyMatchingDate(matchingDate);
    }//www.  j a  va  2s .c om

    if (!allMatchingDates.contains(matchingDate)) {
        allMatchingDates.add(matchingDate);
    }

    return allMatchingDates;
}

From source file:org.mifos.application.holiday.business.HolidayBO.java

License:Open Source License

@Override
public boolean encloses(final Date date) {

    LocalDate dateToCheck = new LocalDate(date);

    LocalDate fromDate = new LocalDate(getHolidayFromDate());
    LocalDate thruDate = new LocalDate(getHolidayThruDate());

    return ((dateToCheck.isEqual(fromDate) || dateToCheck.isAfter(fromDate))
            && (dateToCheck.isBefore(thruDate) || dateToCheck.isEqual(thruDate)));
}

From source file:org.mifos.application.meeting.business.MeetingBO.java

License:Open Source License

public boolean queryDateIsInMeetingIntervalForFixedDate(LocalDate queryDate, LocalDate fixedDate) {
    LocalDate startOfMeetingInterval = startDateForMeetingInterval(fixedDate);
    LocalDate endOfMeetingInterval;
    if (isWeekly()) {
        endOfMeetingInterval = startOfMeetingInterval.plusWeeks(getRecurAfter());
    } else if (isMonthly()) {
        endOfMeetingInterval = startOfMeetingInterval.plusMonths(getRecurAfter());
    } else {/*from  ww  w. j  a v a  2  s.c om*/
        // we don't handle meeting intervals in days
        return false;
    }
    return (queryDate.isEqual(startOfMeetingInterval) || queryDate.isAfter(startOfMeetingInterval))
            && queryDate.isBefore(endOfMeetingInterval);
}

From source file:org.mifos.application.servicefacade.LoanAccountServiceFacadeWebTier.java

License:Open Source License

@Override
public LoanCreationLoanDetailsDto retrieveLoanDetailsForLoanAccountCreation(Integer customerId, Short productId,
        boolean isLoanWithBackdatedPayments) {

    try {/*from   w w  w. j a  v a2 s  . c o m*/
        List<org.mifos.dto.domain.FeeDto> additionalFees = new ArrayList<org.mifos.dto.domain.FeeDto>();
        List<org.mifos.dto.domain.FeeDto> defaultFees = new ArrayList<org.mifos.dto.domain.FeeDto>();
        List<PenaltyDto> defaultPenalties = new ArrayList<PenaltyDto>();

        LoanOfferingBO loanProduct = this.loanProductDao.findById(productId.intValue());

        MeetingBO loanProductMeeting = loanProduct.getLoanOfferingMeetingValue();
        MeetingDto loanOfferingMeetingDto = loanProductMeeting.toDto();

        List<FeeBO> fees = this.feeDao.getAllAppllicableFeeForLoanCreation();

        for (FeeBO fee : fees) {
            if (!fee.isPeriodic() || (MeetingBO.isMeetingMatched(fee.getFeeFrequency().getFeeMeetingFrequency(),
                    loanProductMeeting))) {

                org.mifos.dto.domain.FeeDto feeDto = fee.toDto();

                FeeFrequencyType feeFrequencyType = FeeFrequencyType
                        .getFeeFrequencyType(fee.getFeeFrequency().getFeeFrequencyType().getId());

                FeeFrequencyTypeEntity feeFrequencyEntity = this.loanProductDao
                        .retrieveFeeFrequencyType(feeFrequencyType);
                String feeFrequencyTypeName = ApplicationContextProvider.getBean(MessageLookup.class)
                        .lookup(feeFrequencyEntity.getLookUpValue());
                feeDto.setFeeFrequencyType(feeFrequencyTypeName);

                if (feeDto.getFeeFrequency().isOneTime()) {
                    FeePayment feePayment = FeePayment
                            .getFeePayment(fee.getFeeFrequency().getFeePayment().getId());
                    FeePaymentEntity feePaymentEntity = this.loanProductDao.retrieveFeePaymentType(feePayment);
                    String feePaymentName = ApplicationContextProvider.getBean(MessageLookup.class)
                            .lookup(feePaymentEntity.getLookUpValue());
                    feeDto.getFeeFrequency().setPayment(feePaymentName);
                }

                if (loanProduct.isFeePresent(fee)) {
                    defaultFees.add(feeDto);
                } else {
                    additionalFees.add(feeDto);
                }
            }
        }

        List<PenaltyBO> penalties = this.penaltyDao.getAllAppllicablePenaltyForLoanCreation();

        for (PenaltyBO penalty : penalties) {
            if (loanProduct.isPenaltyPresent(penalty)) {
                defaultPenalties.add(penalty.toDto());
            }
        }

        if (AccountingRules.isMultiCurrencyEnabled()) {
            defaultFees = getFilteredFeesByCurrency(defaultFees, loanProduct.getCurrency().getCurrencyId());
            additionalFees = getFilteredFeesByCurrency(additionalFees,
                    loanProduct.getCurrency().getCurrencyId());
        }

        Map<String, String> defaultFeeOptions = new LinkedHashMap<String, String>();
        for (org.mifos.dto.domain.FeeDto feeDto : defaultFees) {
            defaultFeeOptions.put(feeDto.getId(), feeDto.getName());
        }

        Map<String, String> additionalFeeOptions = new LinkedHashMap<String, String>();
        for (org.mifos.dto.domain.FeeDto feeDto : additionalFees) {
            additionalFeeOptions.put(feeDto.getId(), feeDto.getName());
        }

        CustomerBO customer = this.customerDao.findCustomerById(customerId);
        boolean isRepaymentIndependentOfMeetingEnabled = new ConfigurationBusinessService()
                .isRepaymentIndepOfMeetingEnabled();

        LoanDisbursementDateFactory loanDisbursementDateFactory = new LoanDisbursmentDateFactoryImpl();
        LoanDisbursementDateFinder loanDisbursementDateFinder = null;
        LocalDate nextPossibleDisbursementDate = null;
        MeetingBO customerMeeting = customer.getCustomerMeetingValue();
        LocalDate dateToStart = new LocalDate();

        if (customerMeeting.isWeekly()) {

            LocalDate meetingStartDate = new LocalDate(customerMeeting.getMeetingStartDate());

            if (dateToStart.isBefore(meetingStartDate)) {
                dateToStart = meetingStartDate;
                loanDisbursementDateFinder = loanDisbursementDateFactory.create(customer, loanProduct, false,
                        isLoanWithBackdatedPayments);
            } else {
                loanDisbursementDateFinder = loanDisbursementDateFactory.create(customer, loanProduct,
                        isRepaymentIndependentOfMeetingEnabled, isLoanWithBackdatedPayments);
            }

            nextPossibleDisbursementDate = loanDisbursementDateFinder
                    .findClosestMatchingDateFromAndInclusiveOf(dateToStart);
        } else {
            loanDisbursementDateFinder = loanDisbursementDateFactory.create(customer, loanProduct,
                    isRepaymentIndependentOfMeetingEnabled, isLoanWithBackdatedPayments);
            nextPossibleDisbursementDate = loanDisbursementDateFinder
                    .findClosestMatchingDateFromAndInclusiveOf(dateToStart);
        }

        LoanAmountOption eligibleLoanAmount = loanProduct.eligibleLoanAmount(
                customer.getMaxLoanAmount(loanProduct), customer.getMaxLoanCycleForProduct(loanProduct));
        LoanOfferingInstallmentRange eligibleNoOfInstall = loanProduct.eligibleNoOfInstall(
                customer.getMaxLoanAmount(loanProduct), customer.getMaxLoanCycleForProduct(loanProduct));

        Double defaultInterestRate = loanProduct.getDefInterestRate();
        Double maxInterestRate = loanProduct.getMaxInterestRate();
        Double minInterestRate = loanProduct.getMinInterestRate();

        LinkedHashMap<String, String> collateralOptions = new LinkedHashMap<String, String>();
        LinkedHashMap<String, String> purposeOfLoanOptions = new LinkedHashMap<String, String>();

        CustomValueDto customValueDto = legacyMasterDao.getLookUpEntity(MasterConstants.COLLATERAL_TYPES);
        List<CustomValueListElementDto> collateralTypes = customValueDto.getCustomValueListElements();
        for (CustomValueListElementDto element : collateralTypes) {
            collateralOptions.put(element.getId().toString(), element.getName());
        }

        // Business activities got in getPrdOfferings also but only for glim.
        List<ValueListElement> loanPurposes = legacyMasterDao
                .findValueListElements(MasterConstants.LOAN_PURPOSES);
        for (ValueListElement element : loanPurposes) {
            purposeOfLoanOptions.put(element.getId().toString(), element.getName());
        }

        List<FundDto> fundDtos = new ArrayList<FundDto>();
        List<FundBO> funds = getFunds(loanProduct);
        for (FundBO fund : funds) {
            FundDto fundDto = new FundDto();
            fundDto.setId(Short.toString(fund.getFundId()));
            fundDto.setCode(translateFundCodeToDto(fund.getFundCode()));
            fundDto.setName(fund.getFundName());

            fundDtos.add(fundDto);
        }

        ProductDetailsDto productDto = loanProduct.toDetailsDto();
        CustomerDetailDto customerDetailDto = customer.toCustomerDetailDto();

        Integer gracePeriodInInstallments = loanProduct.getGracePeriodDuration().intValue();

        final List<PrdOfferingDto> loanProductDtos = retrieveActiveLoanProductsApplicableForCustomer(customer,
                isRepaymentIndependentOfMeetingEnabled);

        InterestType interestType = InterestType.fromInt(loanProduct.getInterestTypes().getId().intValue());
        InterestTypesEntity productInterestType = this.loanProductDao.findInterestType(interestType);
        String interestTypeName = ApplicationContextProvider.getBean(MessageLookup.class)
                .lookup(productInterestType.getLookUpValue());

        LinkedHashMap<String, String> daysOfTheWeekOptions = new LinkedHashMap<String, String>();
        List<WeekDay> workingDays = new FiscalCalendarRules().getWorkingDays();
        for (WeekDay workDay : workingDays) {
            String weekdayName = ApplicationContextProvider.getBean(MessageLookup.class)
                    .lookup(workDay.getPropertiesKey());
            workDay.setWeekdayName(weekdayName);
            daysOfTheWeekOptions.put(workDay.getValue().toString(), weekdayName);
        }

        LinkedHashMap<String, String> weeksOfTheMonthOptions = new LinkedHashMap<String, String>();
        for (RankOfDay weekOfMonth : RankOfDay.values()) {
            String weekOfMonthName = ApplicationContextProvider.getBean(MessageLookup.class)
                    .lookup(weekOfMonth.getPropertiesKey());
            weeksOfTheMonthOptions.put(weekOfMonth.getValue().toString(), weekOfMonthName);
        }

        boolean variableInstallmentsAllowed = loanProduct.isVariableInstallmentsAllowed();
        boolean fixedRepaymentSchedule = loanProduct.isFixedRepaymentSchedule();
        Integer minGapInDays = Integer.valueOf(0);
        Integer maxGapInDays = Integer.valueOf(0);
        BigDecimal minInstallmentAmount = BigDecimal.ZERO;
        if (variableInstallmentsAllowed) {
            VariableInstallmentDetailsBO variableInstallmentsDetails = loanProduct
                    .getVariableInstallmentDetails();
            minGapInDays = variableInstallmentsDetails.getMinGapInDays();
            maxGapInDays = variableInstallmentsDetails.getMaxGapInDays();
            minInstallmentAmount = variableInstallmentsDetails.getMinInstallmentAmount().getAmount();
        }

        boolean compareCashflowEnabled = loanProduct.isCashFlowCheckEnabled();

        // GLIM specific
        final boolean isGroup = customer.isGroup();
        final boolean isGlimEnabled = configurationPersistence.isGlimEnabled();

        //Group Loan Account with members specific
        final boolean isGroupLoanWithMembersEnabled = AccountingRules.isGroupLoanWithMembers();

        List<LoanAccountDetailsDto> clientDetails = new ArrayList<LoanAccountDetailsDto>();

        if (isGroup && (isGlimEnabled || isGroupLoanWithMembersEnabled)) {
            final List<ClientBO> activeClientsOfGroup = customerDao.findActiveClientsUnderGroup(customer);

            if (activeClientsOfGroup == null || activeClientsOfGroup.isEmpty()) {
                throw new BusinessRuleException(GroupConstants.IMPOSSIBLE_TO_CREATE_GROUP_LOAN);
            }

            for (ClientBO client : activeClientsOfGroup) {
                LoanAccountDetailsDto clientDetail = new LoanAccountDetailsDto();
                clientDetail.setClientId(client.getGlobalCustNum());
                clientDetail.setClientName(client.getDisplayName());
                clientDetails.add(clientDetail);
            }
        }
        // end of GLIM specific

        int digitsAfterDecimalForInterest = AccountingRules.getDigitsAfterDecimalForInterest().intValue();
        int digitsBeforeDecimalForInterest = AccountingRules.getDigitsBeforeDecimalForInterest().intValue();
        int digitsAfterDecimalForMonetaryAmounts = AccountingRules.getDigitsAfterDecimal().intValue();
        int digitsBeforeDecimalForMonetaryAmounts = AccountingRules.getDigitsBeforeDecimal().intValue();

        ApplicationConfigurationDto appConfig = new ApplicationConfigurationDto(digitsAfterDecimalForInterest,
                digitsBeforeDecimalForInterest, digitsAfterDecimalForMonetaryAmounts,
                digitsBeforeDecimalForMonetaryAmounts);

        Map<String, String> disbursalPaymentTypes = new LinkedHashMap<String, String>();
        try {
            for (PaymentTypeDto paymentTypeDto : accountService.getLoanDisbursementTypes()) {
                disbursalPaymentTypes.put(paymentTypeDto.getValue().toString(), paymentTypeDto.getName());
            }
        } catch (Exception e) {
            throw new SystemException(e);
        }
        Map<String, String> repaymentpaymentTypes = new LinkedHashMap<String, String>();
        try {
            for (PaymentTypeDto paymentTypeDto : accountService.getLoanPaymentTypes()) {
                repaymentpaymentTypes.put(paymentTypeDto.getValue().toString(), paymentTypeDto.getName());
            }
        } catch (Exception e) {
            throw new SystemException(e);
        }

        return new LoanCreationLoanDetailsDto(isRepaymentIndependentOfMeetingEnabled, loanOfferingMeetingDto,
                customer.getCustomerMeetingValue().toDto(), loanPurposes, productDto, gracePeriodInInstallments,
                customerDetailDto, loanProductDtos, interestTypeName, fundDtos, collateralOptions,
                purposeOfLoanOptions, defaultFeeOptions, additionalFeeOptions, defaultFees, additionalFees,
                BigDecimal.valueOf(eligibleLoanAmount.getDefaultLoanAmount()),
                BigDecimal.valueOf(eligibleLoanAmount.getMaxLoanAmount()),
                BigDecimal.valueOf(eligibleLoanAmount.getMinLoanAmount()), defaultInterestRate, maxInterestRate,
                minInterestRate, eligibleNoOfInstall.getDefaultNoOfInstall().intValue(),
                eligibleNoOfInstall.getMaxNoOfInstall().intValue(),
                eligibleNoOfInstall.getMinNoOfInstall().intValue(), nextPossibleDisbursementDate,
                daysOfTheWeekOptions, weeksOfTheMonthOptions, variableInstallmentsAllowed,
                fixedRepaymentSchedule, minGapInDays, maxGapInDays, minInstallmentAmount,
                compareCashflowEnabled, isGlimEnabled, isGroup, clientDetails, appConfig, defaultPenalties,
                disbursalPaymentTypes, repaymentpaymentTypes, isGroupLoanWithMembersEnabled);

    } catch (SystemException e) {
        throw new MifosRuntimeException(e);
    }
}

From source file:org.mifos.application.servicefacade.LoanAccountServiceFacadeWebTier.java

License:Open Source License

@Override
public Errors validateLoanDisbursementDate(LocalDate loanDisbursementDate, Integer customerId,
        Integer productId) {//from   w  w  w  . j  ava  2  s . c  om

    Errors errors = new Errors();

    if (loanDisbursementDate.isBefore(new LocalDate())) {
        String[] args = { "" };
        errors.addError("dibursementdate.cannot.be.before.todays.date", args);
    }

    CustomerBO customer = this.customerDao.findCustomerById(customerId);
    LocalDate customerActivationDate = new LocalDate(customer.getCustomerActivationDate());
    if (loanDisbursementDate.isBefore(customerActivationDate)) {
        String[] args = { customerActivationDate.toString("dd-MMM-yyyy") };
        errors.addError("dibursementdate.before.customer.activation.date", args);
    }

    LoanOfferingBO loanProduct = this.loanProductDao.findById(productId);
    LocalDate productStartDate = new LocalDate(loanProduct.getStartDate());
    if (loanDisbursementDate.isBefore(productStartDate)) {
        String[] args = { productStartDate.toString("dd-MMM-yyyy") };
        errors.addError("dibursementdate.before.product.startDate", args);
    }

    try {
        this.holidayServiceFacade.validateDisbursementDateForNewLoan(customer.getOfficeId(),
                loanDisbursementDate.toDateMidnight().toDateTime());
    } catch (BusinessRuleException e) {
        String[] args = { "" };
        errors.addError("dibursementdate.falls.on.holiday", args);
    }

    boolean isRepaymentIndependentOfMeetingEnabled = new ConfigurationBusinessService()
            .isRepaymentIndepOfMeetingEnabled();

    LoanDisbursementDateFactory loanDisbursementDateFactory = new LoanDisbursmentDateFactoryImpl();
    LoanDisbursementDateValidator loanDisbursementDateFinder = loanDisbursementDateFactory.create(customer,
            loanProduct, isRepaymentIndependentOfMeetingEnabled, false);

    boolean isValid = loanDisbursementDateFinder
            .isDisbursementDateValidInRelationToSchedule(loanDisbursementDate);
    if (!isValid) {
        String[] args = { "" };
        errors.addError("dibursementdate.invalid.in.relation.to.meeting.schedule", args);
    }

    return errors;
}