in service/src/main/java/org/apache/fineract/cn/deposit/service/internal/command/handler/InterestCalculator.java [183:238]
public String process(final PayInterestCommand payInterestCommand) {
final List<ProductDefinitionEntity> productDefinitionEntities = this.productDefinitionRepository.findAll();
productDefinitionEntities.forEach(productDefinitionEntity -> {
if (productDefinitionEntity.getActive()
&& !productDefinitionEntity.getType().equals(Type.SHARE.name())) {
final TermEntity term = this.termRepository.findByProductDefinition(productDefinitionEntity);
if (this.shouldPayInterest(term.getInterestPayable(), payInterestCommand.date())) {
final List<ProductInstanceEntity> productInstanceEntities =
this.productInstanceRepository.findByProductDefinition(productDefinitionEntity);
productInstanceEntities.forEach(productInstanceEntity -> {
final Optional<AccruedInterestEntity> optionalAccruedInterestEntity =
this.accruedInterestRepository.findByCustomerAccountIdentifier(productInstanceEntity.getAccountIdentifier());
if (optionalAccruedInterestEntity.isPresent()) {
final AccruedInterestEntity accruedInterestEntity = optionalAccruedInterestEntity.get();
final String roundedAmount =
BigDecimal.valueOf(accruedInterestEntity.getAmount())
.setScale(2, BigDecimal.ROUND_HALF_EVEN).toString();
final JournalEntry accrueToExpenseJournalEntry = new JournalEntry();
accrueToExpenseJournalEntry.setTransactionIdentifier(RandomStringUtils.randomAlphanumeric(32));
accrueToExpenseJournalEntry.setTransactionDate(DateConverter.toIsoString(LocalDateTime.now(Clock.systemUTC())));
accrueToExpenseJournalEntry.setTransactionType("INTR");
accrueToExpenseJournalEntry.setClerk(UserContextHolder.checkedGetUser());
accrueToExpenseJournalEntry.setNote("Interest paid.");
final Debtor accrueDebtor = new Debtor();
accrueDebtor.setAccountNumber(accruedInterestEntity.getAccrueAccountIdentifier());
accrueDebtor.setAmount(roundedAmount);
accrueToExpenseJournalEntry.setDebtors(Sets.newHashSet(accrueDebtor));
final Creditor expenseCreditor = new Creditor();
expenseCreditor.setAccountNumber(productDefinitionEntity.getExpenseAccountIdentifier());
expenseCreditor.setAmount(roundedAmount);
accrueToExpenseJournalEntry.setCreditors(Sets.newHashSet(expenseCreditor));
this.accruedInterestRepository.delete(accruedInterestEntity);
this.accountingService.post(accrueToExpenseJournalEntry);
this.payoutInterest(
productDefinitionEntity.getExpenseAccountIdentifier(),
accruedInterestEntity.getCustomerAccountIdentifier(),
roundedAmount
);
}
});
}
}
});
return EventConstants.INTEREST_PAYED;
}