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);
}
}
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);
}
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;
}
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);
}
}
}
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;
}
Aggregations