Search in sources :

Example 1 with AccountActionDateEntity

use of org.mifos.accounts.business.AccountActionDateEntity in project head by mifos.

the class LoanBO method waiveFeeAmountDue.

private void waiveFeeAmountDue() throws AccountException {
    List<AccountActionDateEntity> accountActionDateList = getApplicableIdsForNextInstallmentAndArrears();
    LoanScheduleEntity accountActionDateEntity = (LoanScheduleEntity) accountActionDateList.get(accountActionDateList.size() - 1);
    Money chargeWaived = accountActionDateEntity.waiveFeeCharges();
    Money principal = new Money(getCurrency());
    Money interest = new Money(getCurrency());
    Money penalty = new Money(getCurrency());
    if (chargeWaived != null && chargeWaived.isGreaterThanZero()) {
        updateTotalFeeAmount(chargeWaived);
        updateAccountActivity(principal, interest, chargeWaived, penalty, userContext.getId(), LoanConstants.FEE_WAIVED);
        waiveChargesFromMemberAccounts(LoanConstants.FEE_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)

Example 2 with AccountActionDateEntity

use of org.mifos.accounts.business.AccountActionDateEntity in project head by mifos.

the class LoanBO method getLastUnpaidInstallment.

private AccountActionDateEntity getLastUnpaidInstallment() throws AccountException {
    Set<AccountActionDateEntity> accountActionDateSet = getAccountActionDates();
    List<AccountActionDateEntity> objectList = Arrays.asList(accountActionDateSet.toArray(new AccountActionDateEntity[accountActionDateSet.size()]));
    for (int i = objectList.size() - 1; i >= 0; i--) {
        AccountActionDateEntity accountActionDateEntity = objectList.get(i);
        if (accountActionDateEntity.isNotPaid()) {
            return accountActionDateEntity;
        }
    }
    throw new AccountException(AccountConstants.NOMOREINSTALLMENTS);
}
Also used : AccountActionDateEntity(org.mifos.accounts.business.AccountActionDateEntity) AccountException(org.mifos.accounts.exceptions.AccountException)

Example 3 with AccountActionDateEntity

use of org.mifos.accounts.business.AccountActionDateEntity in project head by mifos.

the class LoanBO method principleOfFutureInstallments.

private Money principleOfFutureInstallments() {
    Money amount = new Money(getCurrency());
    List<AccountActionDateEntity> futureInstallments = getApplicableIdsForFutureInstallments();
    for (AccountActionDateEntity futureInstallment : futureInstallments) {
        amount = amount.add(((LoanScheduleEntity) futureInstallment).getPrincipalDue());
    }
    return amount;
}
Also used : Money(org.mifos.framework.util.helpers.Money) AccountActionDateEntity(org.mifos.accounts.business.AccountActionDateEntity)

Example 4 with AccountActionDateEntity

use of org.mifos.accounts.business.AccountActionDateEntity in project head by mifos.

the class LoanBO method updateInstallmentAfterAdjustment.

@Override
protected void updateInstallmentAfterAdjustment(final List<AccountTrxnEntity> reversedTrxns, PersonnelBO loggedInUser) throws AccountException {
    Money increaseInterest = new Money(this.getCurrency());
    Money increaseFees = new Money(this.getCurrency());
    Money increasePenalty = new Money(this.getCurrency());
    int numberOfFullPayments = 0;
    short numberOfInstalments = (short) reversedTrxns.size();
    List<AccountActionDateEntity> allInstallments = this.getAllInstallments();
    if (isNotEmpty(reversedTrxns)) {
        for (AccountTrxnEntity reversedTrxn : reversedTrxns) {
            Short prevInstallmentId = null;
            Short currentInstallmentId = reversedTrxn.getInstallmentId();
            numberOfFullPayments = getIncrementedNumberOfFullPaymentsIfPaid(numberOfFullPayments, allInstallments, prevInstallmentId, currentInstallmentId);
            if (!reversedTrxn.isTrxnForReversalOfLoanDisbursal()) {
                LoanTrxnDetailEntity loanReverseTrxn = (LoanTrxnDetailEntity) reversedTrxn;
                loanSummary.updatePaymentDetails(loanReverseTrxn);
                if (loanReverseTrxn.isNotEmptyTransaction()) {
                    LoanScheduleEntity installment = (LoanScheduleEntity) getAccountActionDate(loanReverseTrxn.getInstallmentId());
                    installment.updatePaymentDetailsForAdjustment(loanReverseTrxn);
                    if (installment.isPaid()) {
                        increaseInterest = increaseInterest.add(installment.getInterestDue().add(installment.getExtraInterestDue())).add(loanReverseTrxn.getInterestAmount());
                        increaseFees = increaseFees.add(installment.getTotalFeesDue());
                        if (!this.noOfInstallments.equals(numberOfInstalments)) {
                            increaseFees = increaseFees.add(installment.getMiscFeeDue()).add(loanReverseTrxn.getMiscFeeAmount());
                            increasePenalty = increasePenalty.add(installment.getPenaltyDue()).add(loanReverseTrxn.getPenaltyAmount());
                        }
                    }
                    installment.recordForAdjustment();
                    if (installment.hasFees()) {
                        for (AccountFeesActionDetailEntity accntFeesAction : installment.getAccountFeesActionDetails()) {
                            loanReverseTrxn.adjustFees(accntFeesAction);
                        }
                    }
                    if (installment.hasPenalties()) {
                        for (LoanPenaltyScheduleEntity entity : installment.getLoanPenaltyScheduleEntities()) {
                            loanReverseTrxn.adjustPenalties(entity);
                        }
                    }
                }
            }
        }
        AccountStateEntity currentAccountState = this.getAccountState();
        AccountStateEntity newAccountState = currentAccountState;
        boolean statusChangeNeeded = false;
        if (isLoanActiveWithStatusChangeHistory()) {
            AccountStatusChangeHistoryEntity lastAccountStatusChange = getLastAccountStatusChange();
            if (lastAccountStatusChange.isLoanActive()) {
                statusChangeNeeded = true;
            } else if (currentAccountState.isLoanClosedObligationsMet()) {
                statusChangeNeeded = true;
                newAccountState = lastAccountStatusChange.getOldStatus();
            }
        }
        boolean accountReOpened = isAccountReOpened(currentAccountState, newAccountState);
        updatePerformanceHistory(accountReOpened);
        /*
             * John W - mifos-1986 - see related comment above
             */
        if (accountReOpened) {
            loanSummary.increaseBy(null, increaseInterest, increasePenalty, increaseFees);
            // fix for MIFOS-3287
            this.setClosedDate(null);
        }
        // Else reverse payments equal to number of transactions reversed.
        if (accountReOpened) {
            updatePerformanceHistoryOnAdjustment(1);
        } else if (reversedTrxns.size() > 0) {
            updatePerformanceHistoryOnAdjustment(numberOfFullPayments);
        }
        if (statusChangeNeeded) {
            Short daysInArrears = getDaysInArrears(accountReOpened);
            if (currentAccountState.isLoanClosedObligationsMet()) {
                AccountState newStatus = AccountState.LOAN_ACTIVE_IN_BAD_STANDING;
                if (daysInArrears == 0) {
                    newStatus = AccountState.LOAN_ACTIVE_IN_GOOD_STANDING;
                }
                changeStatus(newStatus, null, "Account Reopened", loggedInUser);
            } else {
                if (daysInArrears == 0) {
                    if (!currentAccountState.isLoanActiveInGoodStanding()) {
                        changeStatus(AccountState.LOAN_ACTIVE_IN_GOOD_STANDING, null, "Account Adjusted", loggedInUser);
                    }
                } else {
                    if (!currentAccountState.isLoanActiveInBadStanding()) {
                        changeStatus(AccountState.LOAN_ACTIVE_IN_BAD_STANDING, null, "Account Adjusted", loggedInUser);
                        handleArrearsAging();
                    }
                }
            }
        }
        try {
            PersonnelBO personnel = legacyPersonnelDao.getPersonnel(getUserContext().getId());
            addLoanActivity(buildLoanActivity(reversedTrxns, personnel, AccountConstants.LOAN_ADJUSTED, DateUtils.getCurrentDateWithoutTimeStamp()));
        } catch (PersistenceException e) {
            throw new AccountException(e);
        }
    }
}
Also used : AccountFeesActionDetailEntity(org.mifos.accounts.business.AccountFeesActionDetailEntity) AccountState(org.mifos.accounts.util.helpers.AccountState) AccountStateEntity(org.mifos.accounts.business.AccountStateEntity) Money(org.mifos.framework.util.helpers.Money) AccountActionDateEntity(org.mifos.accounts.business.AccountActionDateEntity) AccountTrxnEntity(org.mifos.accounts.business.AccountTrxnEntity) AccountException(org.mifos.accounts.exceptions.AccountException) PersonnelBO(org.mifos.customers.personnel.business.PersonnelBO) PersistenceException(org.mifos.framework.exceptions.PersistenceException) AccountStatusChangeHistoryEntity(org.mifos.accounts.business.AccountStatusChangeHistoryEntity)

Example 5 with AccountActionDateEntity

use of org.mifos.accounts.business.AccountActionDateEntity in project head by mifos.

the class LoanBO method getDaysInArrears.

public Short getDaysInArrears(boolean accountReOpened) {
    Short daysInArrears = 0;
    if (isAccountActive() || accountReOpened) {
        if (!getDetailsOfInstallmentsInArrears().isEmpty()) {
            AccountActionDateEntity accountActionDateEntity = getDetailsOfInstallmentsInArrears().get(0);
            daysInArrears = Short.valueOf(Long.valueOf(calculateDays(accountActionDateEntity.getActionDate(), DateUtils.getCurrentDateWithoutTimeStamp())).toString());
        }
    }
    return daysInArrears;
}
Also used : AccountActionDateEntity(org.mifos.accounts.business.AccountActionDateEntity)

Aggregations

AccountActionDateEntity (org.mifos.accounts.business.AccountActionDateEntity)211 Money (org.mifos.framework.util.helpers.Money)80 Test (org.junit.Test)69 ArrayList (java.util.ArrayList)58 LocalDate (org.joda.time.LocalDate)42 Date (java.util.Date)39 DateTime (org.joda.time.DateTime)33 MeetingBO (org.mifos.application.meeting.business.MeetingBO)33 AccountException (org.mifos.accounts.exceptions.AccountException)24 PaymentData (org.mifos.accounts.util.helpers.PaymentData)24 AccountFeesEntity (org.mifos.accounts.business.AccountFeesEntity)21 Date (java.sql.Date)19 SavingsScheduleEntity (org.mifos.accounts.savings.business.SavingsScheduleEntity)19 LoanBO (org.mifos.accounts.loan.business.LoanBO)17 SavingsBO (org.mifos.accounts.savings.business.SavingsBO)15 LoanScheduleEntity (org.mifos.accounts.loan.business.LoanScheduleEntity)14 UserContext (org.mifos.security.util.UserContext)14 Calendar (java.util.Calendar)13 GregorianCalendar (java.util.GregorianCalendar)13 CenterBuilder (org.mifos.domain.builders.CenterBuilder)13