public String process()

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