Search in sources :

Example 51 with AccountException

use of org.mifos.accounts.exceptions.AccountException 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 52 with AccountException

use of org.mifos.accounts.exceptions.AccountException in project head by mifos.

the class LoanBO method waiveFeeAmountOverDue.

private void waiveFeeAmountOverDue() throws AccountException {
    Money chargeWaived = new Money(getCurrency());
    Money principal = new Money(getCurrency());
    Money interest = new Money(getCurrency());
    Money penalty = new Money(getCurrency());
    List<AccountActionDateEntity> accountActionDateList = getApplicableIdsForNextInstallmentAndArrears();
    // installment.
    if (getDetailsOfNextInstallment() != null) {
        accountActionDateList.remove(accountActionDateList.size() - 1);
    }
    for (AccountActionDateEntity accountActionDateEntity : accountActionDateList) {
        chargeWaived = chargeWaived.add(((LoanScheduleEntity) accountActionDateEntity).waiveFeeCharges());
    }
    if (chargeWaived != null && chargeWaived.isGreaterThanZero()) {
        updateTotalFeeAmount(chargeWaived);
        updateAccountActivity(principal, interest, chargeWaived, penalty, userContext.getId(), AccountConstants.AMOUNT + chargeWaived + AccountConstants.WAIVED);
        waiveOverdueChargesFromMemberAccounts(LoanConstants.FEE_WAIVED);
    }
    try {
        getlegacyLoanDao().createOrUpdate(this);
    } catch (PersistenceException e) {
        throw new AccountException(e);
    }
}
Also used : Money(org.mifos.framework.util.helpers.Money) AccountActionDateEntity(org.mifos.accounts.business.AccountActionDateEntity) AccountException(org.mifos.accounts.exceptions.AccountException) PersistenceException(org.mifos.framework.exceptions.PersistenceException)

Example 53 with AccountException

use of org.mifos.accounts.exceptions.AccountException in project head by mifos.

the class LoanBO method save.

/**
     * use service/dao for saving and creating loans
     */
@Deprecated
public void save() throws AccountException {
    try {
        this.addAccountStatusChangeHistory(new AccountStatusChangeHistoryEntity(this.getAccountState(), this.getAccountState(), legacyPersonnelDao.getPersonnel(userContext.getId()), this));
        getlegacyLoanDao().createOrUpdate(this);
        this.globalAccountNum = generateId(userContext.getBranchGlobalNum());
        getlegacyLoanDao().createOrUpdate(this);
    } catch (PersistenceException e) {
        throw new AccountException(AccountExceptionConstants.CREATEEXCEPTION, e);
    }
}
Also used : AccountException(org.mifos.accounts.exceptions.AccountException) PersistenceException(org.mifos.framework.exceptions.PersistenceException) AccountStatusChangeHistoryEntity(org.mifos.accounts.business.AccountStatusChangeHistoryEntity)

Example 54 with AccountException

use of org.mifos.accounts.exceptions.AccountException in project head by mifos.

the class LoanBO method applyMifos4948FixPayment.

/*
 * Mifos-4948 specific code
 */
public void applyMifos4948FixPayment(Money totalMissedPayment) throws AccountException {
    String comment = "MIFOS-4948 - Loan: " + this.getGlobalAccountNum() + " - Adding payment: " + totalMissedPayment;
    try {
        PersonnelBO currentUser = legacyPersonnelDao.getPersonnel((short) 1);
        Date transactionDate = new DateTimeService().getCurrentJavaDateTime();
        AccountPaymentEntity accountPaymentEntity = new AccountPaymentEntity(this, totalMissedPayment, null, null, getPaymentTypeEntity(Short.valueOf("1")), transactionDate);
        addAccountPayment(accountPaymentEntity);
        accountPaymentEntity.setComment(comment);
        AccountActionTypes accountActionTypes;
        String accountConstants;
        if (this.getAccountState().getId().equals(AccountState.LOAN_CLOSED_WRITTEN_OFF.getValue())) {
            accountActionTypes = AccountActionTypes.WRITEOFF;
            accountConstants = AccountConstants.LOAN_WRITTEN_OFF;
        } else {
            accountActionTypes = AccountActionTypes.LOAN_RESCHEDULED;
            accountConstants = AccountConstants.LOAN_RESCHEDULED;
        }
        makeWriteOffOrReschedulePaymentForMifos4948(accountPaymentEntity, accountConstants, accountActionTypes, currentUser);
        addLoanActivity(buildLoanActivity(accountPaymentEntity.getAccountTrxns(), currentUser, accountConstants, transactionDate));
        buildFinancialEntries(accountPaymentEntity.getAccountTrxns());
    } catch (PersistenceException e) {
        throw new AccountException(e);
    }
}
Also used : AccountActionTypes(org.mifos.accounts.util.helpers.AccountActionTypes) AccountException(org.mifos.accounts.exceptions.AccountException) PersonnelBO(org.mifos.customers.personnel.business.PersonnelBO) AccountPaymentEntity(org.mifos.accounts.business.AccountPaymentEntity) PersistenceException(org.mifos.framework.exceptions.PersistenceException) DateTimeService(org.mifos.framework.util.DateTimeService) Date(java.util.Date) InstallmentDate(org.mifos.accounts.util.helpers.InstallmentDate) LocalDate(org.joda.time.LocalDate)

Example 55 with AccountException

use of org.mifos.accounts.exceptions.AccountException in project head by mifos.

the class LoanBO method waivePenaltyAmountDue.

private void waivePenaltyAmountDue() throws AccountException {
    List<AccountActionDateEntity> accountActionDateList = getApplicableIdsForNextInstallmentAndArrears();
    LoanScheduleEntity accountActionDateEntity = (LoanScheduleEntity) accountActionDateList.get(accountActionDateList.size() - 1);
    Money principal = new Money(getCurrency());
    Money interest = new Money(getCurrency());
    Money fee = new Money(getCurrency());
    Money chargeWaived = accountActionDateEntity.waivePenaltyCharges();
    if (chargeWaived != null && chargeWaived.isGreaterThanZero()) {
        updateTotalPenaltyAmount(chargeWaived);
        updateAccountActivity(principal, interest, fee, chargeWaived, userContext.getId(), LoanConstants.PENALTY_WAIVED);
        waiveChargesFromMemberAccounts(LoanConstants.PENALTY_WAIVED);
    }
    try {
        getlegacyLoanDao().createOrUpdate(this);
    } catch (PersistenceException e) {
        throw new AccountException(e);
    }
}
Also used : AccountActionDateEntity(org.mifos.accounts.business.AccountActionDateEntity) Money(org.mifos.framework.util.helpers.Money) AccountException(org.mifos.accounts.exceptions.AccountException) PersistenceException(org.mifos.framework.exceptions.PersistenceException)

Aggregations

AccountException (org.mifos.accounts.exceptions.AccountException)115 MifosRuntimeException (org.mifos.core.MifosRuntimeException)47 UserContext (org.mifos.security.util.UserContext)43 PersistenceException (org.mifos.framework.exceptions.PersistenceException)42 Money (org.mifos.framework.util.helpers.Money)42 MifosUser (org.mifos.security.MifosUser)38 LoanBO (org.mifos.accounts.loan.business.LoanBO)31 ArrayList (java.util.ArrayList)30 LocalDate (org.joda.time.LocalDate)30 BusinessRuleException (org.mifos.service.BusinessRuleException)29 AccountPaymentEntity (org.mifos.accounts.business.AccountPaymentEntity)26 PersonnelBO (org.mifos.customers.personnel.business.PersonnelBO)25 Date (java.util.Date)22 AccountActionDateEntity (org.mifos.accounts.business.AccountActionDateEntity)21 CustomerBO (org.mifos.customers.business.CustomerBO)19 UserContextFactory (org.mifos.accounts.servicefacade.UserContextFactory)17 PaymentData (org.mifos.accounts.util.helpers.PaymentData)17 SavingsBO (org.mifos.accounts.savings.business.SavingsBO)16 ServiceException (org.mifos.framework.exceptions.ServiceException)16 BigDecimal (java.math.BigDecimal)14