Search in sources :

Example 21 with ScheduledEvent

use of org.mifos.schedule.ScheduledEvent in project head by mifos.

the class TestObjectFactory method getMeetingDatesThroughTo.

public static List<Date> getMeetingDatesThroughTo(short officeId, final MeetingBO meeting, Date endDate) {
    List<Days> workingDays = new FiscalCalendarRules().getWorkingDaysAsJodaTimeDays();
    List<Holiday> upcomingHolidays = ApplicationContextProvider.getBean(HolidayDao.class).findAllHolidaysThisYearAndNext(officeId);
    ScheduledEvent scheduledEvent = ScheduledEventFactory.createScheduledEventFrom(meeting);
    DateTime meetingStartDate = new DateTime(meeting.getMeetingStartDate());
    DateTime endDateTime = new DateTime(endDate);
    ScheduledDateGeneration dateGeneration = new HolidayAndWorkingDaysAndMoratoriaScheduledDateGeneration(workingDays, upcomingHolidays);
    List<DateTime> allDates = dateGeneration.generateScheduledDatesThrough(meetingStartDate, endDateTime, scheduledEvent, false);
    List<Date> dates = new ArrayList<Date>();
    for (DateTime dateTime : allDates) {
        dates.add(dateTime.toDate());
    }
    return dates;
}
Also used : ScheduledEvent(org.mifos.schedule.ScheduledEvent) ArrayList(java.util.ArrayList) HolidayDao(org.mifos.application.holiday.persistence.HolidayDao) DateTime(org.joda.time.DateTime) Date(java.util.Date) LocalDate(org.joda.time.LocalDate) HolidayAndWorkingDaysAndMoratoriaScheduledDateGeneration(org.mifos.schedule.internal.HolidayAndWorkingDaysAndMoratoriaScheduledDateGeneration) ScheduledDateGeneration(org.mifos.schedule.ScheduledDateGeneration) Holiday(org.mifos.application.holiday.business.Holiday) Days(org.joda.time.Days) FiscalCalendarRules(org.mifos.config.FiscalCalendarRules) HolidayAndWorkingDaysAndMoratoriaScheduledDateGeneration(org.mifos.schedule.internal.HolidayAndWorkingDaysAndMoratoriaScheduledDateGeneration)

Example 22 with ScheduledEvent

use of org.mifos.schedule.ScheduledEvent in project head by mifos.

the class TestObjectFactory method getMeetingDates.

public static List<Date> getMeetingDates(short officeId, final MeetingBO meeting, final int occurrences) {
    List<Days> workingDays = new FiscalCalendarRules().getWorkingDaysAsJodaTimeDays();
    List<Holiday> upcomingHolidays = ApplicationContextProvider.getBean(HolidayDao.class).findAllHolidaysThisYearAndNext(officeId);
    ScheduledEvent scheduledEvent = ScheduledEventFactory.createScheduledEventFrom(meeting);
    DateTime meetingStartDate = new DateTime(meeting.getMeetingStartDate());
    ScheduledDateGeneration dateGeneration = new HolidayAndWorkingDaysAndMoratoriaScheduledDateGeneration(workingDays, upcomingHolidays);
    List<DateTime> allDates = dateGeneration.generateScheduledDates(occurrences, meetingStartDate, scheduledEvent, false);
    List<Date> dates = new ArrayList<Date>();
    for (DateTime dateTime : allDates) {
        dates.add(dateTime.toDate());
    }
    return dates;
}
Also used : ScheduledEvent(org.mifos.schedule.ScheduledEvent) ArrayList(java.util.ArrayList) HolidayDao(org.mifos.application.holiday.persistence.HolidayDao) DateTime(org.joda.time.DateTime) Date(java.util.Date) LocalDate(org.joda.time.LocalDate) HolidayAndWorkingDaysAndMoratoriaScheduledDateGeneration(org.mifos.schedule.internal.HolidayAndWorkingDaysAndMoratoriaScheduledDateGeneration) ScheduledDateGeneration(org.mifos.schedule.ScheduledDateGeneration) Holiday(org.mifos.application.holiday.business.Holiday) Days(org.joda.time.Days) FiscalCalendarRules(org.mifos.config.FiscalCalendarRules) HolidayAndWorkingDaysAndMoratoriaScheduledDateGeneration(org.mifos.schedule.internal.HolidayAndWorkingDaysAndMoratoriaScheduledDateGeneration)

Example 23 with ScheduledEvent

use of org.mifos.schedule.ScheduledEvent in project head by mifos.

the class LoanBO method regeneratePaymentSchedule.

/**
     * pull this logic out of LoanBO entity and reuse LoanSchedule behaviour used from service facades at a service level
     */
@Deprecated
private void regeneratePaymentSchedule(final boolean isRepaymentIndepOfMeetingEnabled, final MeetingBO newMeetingForRepaymentDay) throws AccountException {
    Money miscFee = getMiscFee();
    Money miscPenalty = getMiscPenalty();
    try {
        getlegacyLoanDao().deleteInstallments(this.getAccountActionDates());
    } catch (PersistenceException e) {
        throw new AccountException(e);
    }
    // Delete previous loan meeting if loan is parent account and set individual loans(if any) loanMeeting same as parent 
    if (isRepaymentIndepOfMeetingEnabled && newMeetingForRepaymentDay != null && !this.getLoanMeeting().equals(newMeetingForRepaymentDay)) {
        if (null != this.getLoanMeeting() && !this.isIndividualLoan()) {
            this.delete(this.getLoanMeeting());
        }
        setLoanMeeting(newMeetingForRepaymentDay);
        if (this.hasMemberAccounts()) {
            for (LoanBO individualLoanBO : this.getMemberAccounts()) {
                individualLoanBO.setLoanMeeting(newMeetingForRepaymentDay);
            }
        }
    }
    this.resetAccountActionDates();
    loanMeeting.setMeetingStartDate(disbursementDate);
    RecurringScheduledEventFactory scheduledEventFactory = new RecurringScheduledEventFactoryImpl();
    ScheduledEvent meetingScheduledEvent = scheduledEventFactory.createScheduledEventFrom(this.loanMeeting);
    LoanInstallmentFactory loanInstallmentFactory = new LoanInstallmentFactoryImpl(scheduledEventFactory);
    LoanInstallmentGenerator loanInstallmentGenerator = loanInstallmentFactory.create(this.getLoanMeeting(), isRepaymentIndepOfMeetingEnabled);
    LocalDate actualDisbursementDate = new LocalDate(this.disbursementDate);
    List<InstallmentDate> installmentDates = loanInstallmentGenerator.generate(actualDisbursementDate, this.noOfInstallments, this.gracePeriodType.asEnum(), this.gracePeriodDuration, this.office.getOfficeId());
    Integer numberOfInstallments = installmentDates.size();
    GraceType graceType = this.gracePeriodType.asEnum();
    InterestType interestType = InterestType.fromInt(this.interestType.getId());
    Integer interestDays = AccountingRules.getNumberOfInterestDays().intValue();
    LoanDecliningInterestAnnualPeriodCalculator decliningInterestAnnualPeriodCalculator = new LoanDecliningInterestAnnualPeriodCalculatorFactory().create(loanMeeting.getRecurrenceType());
    Double decliningInterestAnnualPeriod = decliningInterestAnnualPeriodCalculator.calculate(loanMeeting.getRecurAfter().intValue(), interestDays);
    Double interestFractionalRatePerInstallment = interestRate / decliningInterestAnnualPeriod / 100;
    LoanDurationInAccountingYearsCalculator loanDurationInAccountingYearsCalculator = new LoanDurationInAccountingYearsCalculatorFactory().create(loanMeeting.getRecurrenceType());
    Double durationInYears = loanDurationInAccountingYearsCalculator.calculate(loanMeeting.getRecurAfter().intValue(), numberOfInstallments, interestDays);
    List<DateTime> scheduledInstallments = new ArrayList<DateTime>();
    for (InstallmentDate installmentDate : installmentDates) {
        scheduledInstallments.add(new DateTime(installmentDate.getInstallmentDueDate()));
    }
    LoanInterestCalculationDetails loanInterestCalculationDetails = new LoanInterestCalculationDetails(loanAmount, interestRate, graceType, gracePeriodDuration.intValue(), numberOfInstallments, durationInYears, interestFractionalRatePerInstallment, actualDisbursementDate, scheduledInstallments);
    LoanInterestCalculatorFactory loanInterestCalculatorFactory = new LoanInterestCalculatorFactoryImpl();
    LoanInterestCalculator loanInterestCalculator = loanInterestCalculatorFactory.create(interestType, this.loanOffering.isVariableInstallmentsAllowed());
    Money loanInterest = loanInterestCalculator.calculate(loanInterestCalculationDetails);
    EqualInstallmentGeneratorFactory equalInstallmentGeneratorFactory = new EqualInstallmentGeneratorFactoryImpl();
    PrincipalWithInterestGenerator equalInstallmentGenerator = equalInstallmentGeneratorFactory.create(interestType, loanInterest, this.loanOffering.isVariableInstallmentsAllowed());
    List<InstallmentPrincipalAndInterest> principalWithInterestInstallments = equalInstallmentGenerator.generateEqualInstallments(loanInterestCalculationDetails);
    List<LoanScheduleEntity> unroundedLoanSchedules = createUnroundedLoanSchedulesFromInstallments(installmentDates, loanInterest, this.loanAmount, meetingScheduledEvent, principalWithInterestInstallments, this.getAccountFees());
    Money rawAmount = calculateTotalFeesAndInterestForLoanSchedules(unroundedLoanSchedules);
    if (loanSummary == null) {
        // save it to LoanBO first and when loan summary is created it will
        // be retrieved and save to loan summary
        setRawAmountTotal(rawAmount);
    } else {
        loanSummary.setRawAmountTotal(rawAmount);
    }
    List<LoanScheduleEntity> allExistingLoanSchedules = new ArrayList<LoanScheduleEntity>();
    LoanScheduleRounderHelper loanScheduleRounderHelper = new DefaultLoanScheduleRounderHelper();
    LoanScheduleRounder loanScheduleInstallmentRounder = getLoanScheduleRounder(loanScheduleRounderHelper);
    List<LoanScheduleEntity> roundedLoanSchedules = loanScheduleInstallmentRounder.round(graceType, gracePeriodDuration, loanAmount, interestType, unroundedLoanSchedules, allExistingLoanSchedules);
    for (LoanScheduleEntity roundedLoanSchedule : roundedLoanSchedules) {
        addAccountActionDate(roundedLoanSchedule);
    }
    LoanScheduleEntity loanScheduleEntity = (LoanScheduleEntity) getAccountActionDate((short) 1);
    loanScheduleEntity.setMiscFee(miscFee);
    loanScheduleEntity.setMiscPenalty(miscPenalty);
    Money interest = new Money(getCurrency());
    Money fees = new Money(getCurrency());
    Money penalty = new Money(getCurrency());
    Money principal = new Money(getCurrency());
    Set<AccountActionDateEntity> actionDates = getAccountActionDates();
    if (actionDates != null && actionDates.size() > 0) {
        for (AccountActionDateEntity accountActionDate : actionDates) {
            LoanScheduleEntity loanSchedule = (LoanScheduleEntity) accountActionDate;
            principal = principal.add(loanSchedule.getPrincipal());
            interest = interest.add(loanSchedule.getInterest());
            fees = fees.add(loanSchedule.getTotalFeesDueWithMiscFee());
            penalty = penalty.add(loanSchedule.getTotalPenalty());
        }
    }
    fees = fees.add(getDisbursementFeeAmount());
    loanSummary.setOriginalInterest(interest);
    loanSummary.setOriginalFees(fees);
    loanSummary.setOriginalPenalty(penalty);
}
Also used : PrincipalWithInterestGenerator(org.mifos.clientportfolio.newloan.domain.PrincipalWithInterestGenerator) EqualInstallmentGeneratorFactoryImpl(org.mifos.clientportfolio.newloan.domain.EqualInstallmentGeneratorFactoryImpl) LoanInstallmentFactory(org.mifos.clientportfolio.newloan.domain.LoanInstallmentFactory) ArrayList(java.util.ArrayList) LoanDecliningInterestAnnualPeriodCalculatorFactory(org.mifos.clientportfolio.newloan.domain.LoanDecliningInterestAnnualPeriodCalculatorFactory) DefaultLoanScheduleRounderHelper(org.mifos.clientportfolio.newloan.domain.DefaultLoanScheduleRounderHelper) LoanInterestCalculatorFactory(org.mifos.clientportfolio.newloan.domain.LoanInterestCalculatorFactory) LocalDate(org.joda.time.LocalDate) DateTime(org.joda.time.DateTime) InstallmentDate(org.mifos.accounts.util.helpers.InstallmentDate) LoanInstallmentGenerator(org.mifos.clientportfolio.newloan.domain.LoanInstallmentGenerator) Money(org.mifos.framework.util.helpers.Money) AccountActionDateEntity(org.mifos.accounts.business.AccountActionDateEntity) GraceType(org.mifos.accounts.productdefinition.util.helpers.GraceType) LoanInstallmentFactoryImpl(org.mifos.clientportfolio.newloan.domain.LoanInstallmentFactoryImpl) LoanInterestCalculator(org.mifos.clientportfolio.newloan.domain.LoanInterestCalculator) DefaultLoanScheduleRounderHelper(org.mifos.clientportfolio.newloan.domain.DefaultLoanScheduleRounderHelper) LoanScheduleRounderHelper(org.mifos.clientportfolio.newloan.domain.LoanScheduleRounderHelper) RecurringScheduledEventFactoryImpl(org.mifos.clientportfolio.newloan.domain.RecurringScheduledEventFactoryImpl) ScheduledEvent(org.mifos.schedule.ScheduledEvent) LoanDurationInAccountingYearsCalculator(org.mifos.clientportfolio.newloan.domain.LoanDurationInAccountingYearsCalculator) LoanInterestCalculationDetails(org.mifos.clientportfolio.newloan.domain.LoanInterestCalculationDetails) EqualInstallmentGeneratorFactory(org.mifos.clientportfolio.newloan.domain.EqualInstallmentGeneratorFactory) RecurringScheduledEventFactory(org.mifos.clientportfolio.newloan.domain.RecurringScheduledEventFactory) InterestType(org.mifos.accounts.productdefinition.util.helpers.InterestType) LoanDecliningInterestAnnualPeriodCalculator(org.mifos.clientportfolio.newloan.domain.LoanDecliningInterestAnnualPeriodCalculator) AccountException(org.mifos.accounts.exceptions.AccountException) FirstInstallmentRoudingDifferenceLoanScheduleRounder(org.mifos.clientportfolio.newloan.domain.FirstInstallmentRoudingDifferenceLoanScheduleRounder) LoanScheduleRounder(org.mifos.clientportfolio.newloan.domain.LoanScheduleRounder) DefaultLoanScheduleRounder(org.mifos.clientportfolio.newloan.domain.DefaultLoanScheduleRounder) PersistenceException(org.mifos.framework.exceptions.PersistenceException) LoanInterestCalculatorFactoryImpl(org.mifos.clientportfolio.newloan.domain.LoanInterestCalculatorFactoryImpl) InstallmentPrincipalAndInterest(org.mifos.accounts.loan.util.helpers.InstallmentPrincipalAndInterest) LoanDurationInAccountingYearsCalculatorFactory(org.mifos.clientportfolio.newloan.domain.LoanDurationInAccountingYearsCalculatorFactory)

Example 24 with ScheduledEvent

use of org.mifos.schedule.ScheduledEvent in project head by mifos.

the class CustomerAccountBO method applyOnePeriodicFeeToInstallments.

private void applyOnePeriodicFeeToInstallments(AccountFeesEntity accountFee, List<AccountActionDateEntity> actionDateEntities) {
    if (actionDateEntities.size() > 0) {
        ScheduledEvent scheduledEvent = ScheduledEventFactory.createScheduledEventFrom(this.getMeetingForAccount());
        List<FeeInstallment> feeInstallmentList = FeeInstallment.createMergedFeeInstallmentsForOneFee(scheduledEvent, accountFee, getAccountActionDates().size());
        applyFeeToInstallments(feeInstallmentList, actionDateEntities);
    }
}
Also used : DailyScheduledEvent(org.mifos.schedule.internal.DailyScheduledEvent) ScheduledEvent(org.mifos.schedule.ScheduledEvent) FeeInstallment(org.mifos.accounts.util.helpers.FeeInstallment)

Example 25 with ScheduledEvent

use of org.mifos.schedule.ScheduledEvent in project head by mifos.

the class AccountBO method getInstallmentDates.

/**
     * @deprecated - used to create installment dates based on 'loan meeting' and working das, holidays, moratoria etc
     *
     * better to pull capability of creating 'installments' out of loan into something more reuseable and isolated
     */
@Deprecated
public final List<InstallmentDate> getInstallmentDates(final MeetingBO meeting, final Short noOfInstallments, final Short installmentToSkip, final boolean isRepaymentIndepOfMeetingEnabled, final boolean adjustForHolidays) {
    logger.debug("Generating intallment dates");
    List<InstallmentDate> dueInstallmentDates = new ArrayList<InstallmentDate>();
    if (noOfInstallments > 0) {
        List<Days> workingDays = new FiscalCalendarRules().getWorkingDaysAsJodaTimeDays();
        List<Holiday> holidays = new ArrayList<Holiday>();
        DateTime startFromMeetingDate = new DateTime(meeting.getMeetingStartDate());
        if (adjustForHolidays) {
            HolidayDao holidayDao = ApplicationContextProvider.getBean(HolidayDao.class);
            holidays = holidayDao.findAllHolidaysFromDateAndNext(getOffice().getOfficeId(), startFromMeetingDate.toLocalDate().toString());
        }
        final int occurrences = noOfInstallments + installmentToSkip;
        ScheduledEvent scheduledEvent = ScheduledEventFactory.createScheduledEventFrom(meeting);
        ScheduledDateGeneration dateGeneration = new HolidayAndWorkingDaysAndMoratoriaScheduledDateGeneration(workingDays, holidays);
        List<Date> dueDates = new ArrayList<Date>();
        // FIXME - keithw - this whole area of installment creation should be pulled out of domain
        DateTime startFromDayAfterAssignedMeetingDateRatherThanSkippingInstallments = startFromMeetingDate;
        if (this.isLoanAccount()) {
            // ensure loans that are created or disbursed on a meeting date start on next valid meeting date and not todays meeting
            // ensure loans that are created or disbursed before a meeting date start on next valid meeting date
            startFromDayAfterAssignedMeetingDateRatherThanSkippingInstallments = startFromMeetingDate.plusDays(1);
        }
        List<DateTime> installmentDates = dateGeneration.generateScheduledDates(occurrences, startFromDayAfterAssignedMeetingDateRatherThanSkippingInstallments, scheduledEvent, false);
        for (DateTime installmentDate : installmentDates) {
            dueDates.add(installmentDate.toDate());
        }
        dueInstallmentDates = createInstallmentDates(installmentToSkip, dueDates);
    }
    return dueInstallmentDates;
}
Also used : ScheduledEvent(org.mifos.schedule.ScheduledEvent) ArrayList(java.util.ArrayList) DateTime(org.joda.time.DateTime) HolidayDao(org.mifos.application.holiday.persistence.HolidayDao) Date(java.util.Date) InstallmentDate(org.mifos.accounts.util.helpers.InstallmentDate) LocalDate(org.joda.time.LocalDate) InstallmentDate(org.mifos.accounts.util.helpers.InstallmentDate) HolidayAndWorkingDaysAndMoratoriaScheduledDateGeneration(org.mifos.schedule.internal.HolidayAndWorkingDaysAndMoratoriaScheduledDateGeneration) ScheduledDateGeneration(org.mifos.schedule.ScheduledDateGeneration) Holiday(org.mifos.application.holiday.business.Holiday) Days(org.joda.time.Days) FiscalCalendarRules(org.mifos.config.FiscalCalendarRules) HolidayAndWorkingDaysAndMoratoriaScheduledDateGeneration(org.mifos.schedule.internal.HolidayAndWorkingDaysAndMoratoriaScheduledDateGeneration)

Aggregations

ScheduledEvent (org.mifos.schedule.ScheduledEvent)38 DateTime (org.joda.time.DateTime)23 LocalDate (org.joda.time.LocalDate)16 ArrayList (java.util.ArrayList)14 AccountFeesEntity (org.mifos.accounts.business.AccountFeesEntity)13 Test (org.junit.Test)12 FeeInstallment (org.mifos.accounts.util.helpers.FeeInstallment)12 ScheduledDateGeneration (org.mifos.schedule.ScheduledDateGeneration)12 HolidayAndWorkingDaysAndMoratoriaScheduledDateGeneration (org.mifos.schedule.internal.HolidayAndWorkingDaysAndMoratoriaScheduledDateGeneration)12 Date (java.util.Date)11 AccountActionDateEntity (org.mifos.accounts.business.AccountActionDateEntity)11 AmountFeeBO (org.mifos.accounts.fees.business.AmountFeeBO)10 FeeBO (org.mifos.accounts.fees.business.FeeBO)9 ScheduledEventBuilder (org.mifos.domain.builders.ScheduledEventBuilder)9 InstallmentDate (org.mifos.accounts.util.helpers.InstallmentDate)8 MeetingBO (org.mifos.application.meeting.business.MeetingBO)7 InterestScheduledEvent (org.mifos.accounts.savings.interest.schedule.InterestScheduledEvent)6 HolidayDao (org.mifos.application.holiday.persistence.HolidayDao)5 Days (org.joda.time.Days)4 Holiday (org.mifos.application.holiday.business.Holiday)4