use of org.mifos.accounts.loan.business.LoanScheduleEntity in project head by mifos.
the class LoanAccountActionStrutsTest method modifyActionDateForFirstInstallment.
private void modifyActionDateForFirstInstallment() throws Exception {
LoanScheduleEntity installment = (LoanScheduleEntity) accountBO.getAccountActionDate((short) 1);
LoanBOTestUtils.modifyData(installment, new Money(getCurrency(), "5.0"), installment.getPenaltyPaid(), installment.getMiscPenalty(), installment.getMiscPenaltyPaid(), installment.getMiscFee(), installment.getMiscFeePaid(), new Money(getCurrency(), "20.0"), installment.getPrincipalPaid(), new Money(getCurrency(), "10.0"), installment.getInterestPaid());
LoanBOTestUtils.setActionDate(installment, offSetCurrentDate(1));
accountBO = saveAndFetch(accountBO);
}
use of org.mifos.accounts.loan.business.LoanScheduleEntity in project head by mifos.
the class LegacyLoanDaoIntegrationTest method testSaveAndGetOriginalLoanScheduleEntityWithFees.
@Test
public void testSaveAndGetOriginalLoanScheduleEntityWithFees() throws PersistenceException {
ArrayList<OriginalLoanScheduleEntity> originalLoanScheduleEntities = new ArrayList<OriginalLoanScheduleEntity>();
Date date = new Date(new java.util.Date().getTime());
Short installmentId = new Short("1");
FeeBO upfrontFee = TestObjectFactory.createOneTimeRateFee("Upfront Fee", FeeCategory.LOAN, Double.valueOf("20"), FeeFormula.AMOUNT, FeePayment.UPFRONT, null);
AccountFeesEntity accountUpfrontFee = new AccountFeesEntity(goodAccount, upfrontFee, new Double("20.0"), FeeStatus.ACTIVE.getValue(), null, date);
AccountTestUtils.addAccountFees(accountUpfrontFee, goodAccount);
TestObjectFactory.updateObject(goodAccount);
goodAccount = (LoanBO) TestObjectFactory.getObject(AccountBO.class, goodAccount.getAccountId());
LoanScheduleEntity loanScheduleEntity = new LoanScheduleEntity(goodAccount, group, installmentId, date, PaymentStatus.UNPAID, Money.zero(), Money.zero());
LoanFeeScheduleEntity feesEntity = new LoanFeeScheduleEntity(loanScheduleEntity, upfrontFee, accountUpfrontFee, Money.zero());
loanScheduleEntity.addAccountFeesAction(feesEntity);
OriginalLoanScheduleEntity originalLoanScheduleEntity = new OriginalLoanScheduleEntity(loanScheduleEntity);
OriginalLoanFeeScheduleEntity scheduleEntityFee = new OriginalLoanFeeScheduleEntity(feesEntity, originalLoanScheduleEntity);
originalLoanScheduleEntities.add(originalLoanScheduleEntity);
legacyLoanDao.saveOriginalSchedule(originalLoanScheduleEntities);
List<OriginalLoanScheduleEntity> actual = legacyLoanDao.getOriginalLoanScheduleEntity(goodAccount.getAccountId());
List<OriginalLoanFeeScheduleEntity> fees = new ArrayList<OriginalLoanFeeScheduleEntity>(actual.get(0).getAccountFeesActionDetails());
Assert.assertEquals(1, actual.size());
Assert.assertEquals(1, fees.size());
assertThat(actual, is(new OriginalLoanScheduleEntitiesMatcher(originalLoanScheduleEntities)));
assertThat(fees.get(0), is(new OriginalLoanFeeScheduleEntityMatcher(scheduleEntityFee)));
}
use of org.mifos.accounts.loan.business.LoanScheduleEntity in project head by mifos.
the class IndividualLoanScheduleFactory method calculateTotalFeesAndInterestForLoanSchedules.
private Money calculateTotalFeesAndInterestForLoanSchedules(List<LoanScheduleEntity> unroundedLoanSchedules, MifosCurrency currencyInUse, List<AccountFeesEntity> accountFees) {
Money zero = new Money(currencyInUse);
Money interest = zero;
Money fees = zero;
for (LoanScheduleEntity unroundedLoanSchedule : unroundedLoanSchedules) {
interest = interest.add(unroundedLoanSchedule.getInterest());
fees = fees.add(unroundedLoanSchedule.getTotalFeesDueWithMiscFee());
}
Money feeDisbursementAmount = zero;
for (AccountFeesEntity accountFeesEntity : accountFees) {
if (accountFeesEntity.getFees().isTimeOfDisbursement()) {
feeDisbursementAmount = fees.add(accountFeesEntity.getAccountFeeAmount());
}
}
fees = fees.add(feeDisbursementAmount);
fees = MoneyUtils.currencyRound(fees);
interest = MoneyUtils.currencyRound(interest);
Money rawAmount = interest.add(fees);
return rawAmount;
}
use of org.mifos.accounts.loan.business.LoanScheduleEntity in project head by mifos.
the class DefaultLoanScheduleRounderHelper method roundAndAdjustGraceInstallment_v2.
/**
* For principal-only grace installments, adjust the interest to account for rounding discrepancies.
*/
@Override
public LoanScheduleEntity roundAndAdjustGraceInstallment_v2(final LoanScheduleEntity installment) {
Money roundedInstallmentTotalPaymentDue = MoneyUtils.initialRound(installment.getTotalPaymentDue());
LoanScheduleEntity roundedInstallment = roundInstallmentAccountFeesDue_v2(installment);
roundedInstallment.setInterest(roundedInstallmentTotalPaymentDue.subtract(roundedInstallment.getTotalFeeDueWithMiscFeeDue()).subtract(roundedInstallment.getPenaltyDue()));
return roundedInstallment;
}
use of org.mifos.accounts.loan.business.LoanScheduleEntity in project head by mifos.
the class FirstInstallmentRoudingDifferenceLoanScheduleRounder method round.
@Override
public List<LoanScheduleEntity> round(GraceType graceType, Short gracePeriodDuration, Money loanAmount, InterestType interestType, List<LoanScheduleEntity> unroundedLoanSchedules, List<LoanScheduleEntity> allExistingLoanSchedules) {
if (!interestType.equals(InterestType.FLAT)) {
return super.round(graceType, gracePeriodDuration, loanAmount, interestType, unroundedLoanSchedules, allExistingLoanSchedules);
}
Collections.sort(unroundedLoanSchedules);
List<LoanScheduleEntity> roundedLoanSchedules = new ArrayList<LoanScheduleEntity>();
RepaymentTotals totals = loanScheduleInstallmentRounder.calculateInitialTotals_v2(unroundedLoanSchedules, loanAmount, allExistingLoanSchedules);
Integer gracePeriodInstallmentsCount = countGracePeriodInstallments(unroundedLoanSchedules, graceType, gracePeriodDuration);
roundGracePeriodInstallments(gracePeriodInstallmentsCount, graceType, gracePeriodDuration, unroundedLoanSchedules, roundedLoanSchedules, totals);
roundNonGracePeriodInstallments(gracePeriodInstallmentsCount, unroundedLoanSchedules, roundedLoanSchedules, totals);
Collections.sort(roundedLoanSchedules);
return roundedLoanSchedules;
}
Aggregations