in component-test/src/main/java/org/apache/fineract/cn/portfolio/TestAccountingInteractionInLoanWorkflow.java [1104:1210]
private void step6ICalculateInterestAndLossAllowancesForLateLoan(
final LocalDateTime forDateTime,
final int daysLate,
final @Nullable BigDecimal percentProvision) throws InterruptedException
{
logger.info("step6ICalculateInterestAndLossAllowancesForLateLoan '{}'", forDateTime);
final String beatIdentifier = "alignment0";
final String midnightTimeStamp = DateConverter.toIsoString(forDateTime);
final BigDecimal dailyInterestRate = Fixture.INTEREST_RATE
.divide(BigDecimal.valueOf(100), 8, BigDecimal.ROUND_HALF_EVEN)
.divide(Fixture.ACCRUAL_PERIODS, 8, BigDecimal.ROUND_HALF_EVEN);
final BigDecimal calculatedInterest = expectedCurrentPrincipal
.multiply(dailyInterestRate)
.setScale(MINOR_CURRENCY_UNIT_DIGITS, BigDecimal.ROUND_HALF_EVEN);
final BigDecimal provisionForLosses = percentProvision == null ?
BigDecimal.ZERO :
expectedCurrentPrincipal.multiply(percentProvision.divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_HALF_EVEN))
.setScale(MINOR_CURRENCY_UNIT_DIGITS, BigDecimal.ROUND_HALF_EVEN);
logger.info("calculatedInterest '{}'", calculatedInterest);
logger.info("percentProvision '{}'", percentProvision);
logger.info("provisionForLosses '{}'", provisionForLosses);
checkCostComponentForActionCorrect(
product.getIdentifier(),
customerCase.getIdentifier(),
Action.APPLY_INTEREST,
null,
null,
forDateTime,
MINOR_CURRENCY_UNIT_DIGITS);
checkCostComponentForActionCorrect(
product.getIdentifier(),
customerCase.getIdentifier(),
Action.MARK_IN_ARREARS,
null,
BigDecimal.valueOf(daysLate),
forDateTime,
MINOR_CURRENCY_UNIT_DIGITS,
new CostComponent(ChargeIdentifiers.PROVISION_FOR_LOSSES_ID, provisionForLosses.negate()));
final BeatPublish interestBeat = new BeatPublish(beatIdentifier, midnightTimeStamp);
portfolioBeatListener.publishBeat(interestBeat);
Assert.assertTrue(this.eventRecorder.wait(org.apache.fineract.cn.rhythm.spi.v1.events.EventConstants.POST_PUBLISHEDBEAT,
new BeatPublishEvent(EventConstants.DESTINATION, beatIdentifier, midnightTimeStamp)));
Assert.assertTrue(this.eventRecorder.wait(IndividualLoanEventConstants.CHECK_LATE_INDIVIDUALLOAN_CASE,
new IndividualLoanCommandEvent(product.getIdentifier(), customerCase.getIdentifier(), midnightTimeStamp)));
Assert.assertTrue(eventRecorder.wait(IndividualLoanEventConstants.APPLY_INTEREST_INDIVIDUALLOAN_CASE,
new IndividualLoanCommandEvent(product.getIdentifier(), customerCase.getIdentifier(), midnightTimeStamp)));
if (percentProvision != null) {
Assert.assertTrue(eventRecorder.wait(IndividualLoanEventConstants.MARK_IN_ARREARS_INDIVIDUALLOAN_CASE,
new IndividualLoanCommandEvent(product.getIdentifier(), customerCase.getIdentifier(), midnightTimeStamp)));
}
final Case customerCaseAfterStateChange = portfolioManager.getCase(product.getIdentifier(), customerCase.getIdentifier());
Assert.assertEquals(customerCaseAfterStateChange.getCurrentState(), Case.State.ACTIVE.name());
final Set<Debtor> debtors = new HashSet<>();
debtors.add(new Debtor(
customerLoanInterestIdentifier,
calculatedInterest.toPlainString()));
final Set<Creditor> creditors = new HashSet<>();
creditors.add(new Creditor(
AccountingFixture.LOAN_INTEREST_ACCRUAL_ACCOUNT_IDENTIFIER,
calculatedInterest.toPlainString()));
AccountingFixture.verifyTransfer(
ledgerManager,
debtors,
creditors,
product.getIdentifier(),
customerCase.getIdentifier(), Action.APPLY_INTEREST);
if (percentProvision != null) {
final Set<Debtor> lateFeeDebtors = new HashSet<>();
lateFeeDebtors.add(new Debtor(
AccountingFixture.GENERAL_LOSS_ALLOWANCE_ACCOUNT_IDENTIFIER,
provisionForLosses.toPlainString()));
final Set<Creditor> lateFeeCreditors = new HashSet<>();
lateFeeCreditors.add(new Creditor(
AccountingFixture.PRODUCT_LOSS_ALLOWANCE_ACCOUNT_IDENTIFIER,
provisionForLosses.toPlainString()));
AccountingFixture.verifyTransfer(
ledgerManager,
lateFeeDebtors,
lateFeeCreditors,
product.getIdentifier(),
customerCase.getIdentifier(),
Action.MARK_IN_ARREARS);
productLossAllowance = productLossAllowance.add(provisionForLosses);
}
interestAccrued = interestAccrued.add(calculatedInterest);
updateBalanceMock();
logger.info("Completed step6ICalculateInterestAndLossAllowancesForLateLoan");
}