use of org.mifos.accounts.business.AccountActionDateEntity 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);
}
use of org.mifos.accounts.business.AccountActionDateEntity in project head by mifos.
the class LoanBO method rescheduleRemainingUnpaidInstallments.
public void rescheduleRemainingUnpaidInstallments(LoanSchedule loanSchedule, LocalDate asOf) {
int index = 0;
for (AccountActionDateEntity entity : this.getDetailsOfUnpaidInstallmentsOn(asOf)) {
LoanScheduleEntity installment = (LoanScheduleEntity) entity;
LoanScheduleEntity recalculatedInstallment = loanSchedule.getRoundedLoanSchedules().get(index);
index++;
installment.setInterest(recalculatedInstallment.getInterest());
installment.setPrincipal(recalculatedInstallment.getPrincipal());
}
this.loanSummary.setOriginalInterest(getTotalInterestToBePaid());
}
use of org.mifos.accounts.business.AccountActionDateEntity in project head by mifos.
the class LoanBO method makeEarlyRepaymentForNextInstallment.
private void makeEarlyRepaymentForNextInstallment(PersonnelBO currentUser, AccountPaymentEntity accountPaymentEntity, boolean waiveInterest, Money interestDue) {
AccountActionDateEntity nextInstallment = getDetailsOfNextInstallment();
if (nextInstallment != null && nextInstallment.isNotPaid()) {
if (waiveInterest) {
repayInstallmentWithInterestWaiver(nextInstallment, accountPaymentEntity, AccountConstants.PAYMENT_RCVD, AccountActionTypes.LOAN_REPAYMENT, currentUser);
} else {
LoanScheduleEntity loanScheduleEntity = (LoanScheduleEntity) nextInstallment;
Money originalInterestDue = loanScheduleEntity.getInterestDue();
repayInstallment(loanScheduleEntity, accountPaymentEntity, AccountActionTypes.LOAN_REPAYMENT, currentUser, AccountConstants.PAYMENT_RCVD, interestDue);
if (isDecliningBalanceInterestRecalculation()) {
loanSummary.decreaseBy(null, originalInterestDue.subtract(interestDue), null, null);
}
}
}
}
use of org.mifos.accounts.business.AccountActionDateEntity 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);
}
}
use of org.mifos.accounts.business.AccountActionDateEntity in project head by mifos.
the class LoanBO method getTotalPrincipalAmount.
public Money getTotalPrincipalAmount() {
Money amount = new Money(getCurrency());
List<AccountActionDateEntity> installments = getAllInstallments();
for (AccountActionDateEntity accountActionDateEntity : installments) {
amount = amount.add(((LoanScheduleEntity) accountActionDateEntity).getPrincipal());
}
return amount;
}
Aggregations