in service/src/main/java/org/apache/fineract/cn/portfolio/service/internal/util/AccountingAdapter.java [145:198]
static JournalEntry getJournalEntry(
final Map<String, BigDecimal> balanceAdjustments,
final DesignatorToAccountIdentifierMapper designatorToAccountIdentifierMapper,
final String note,
final String transactionDate,
final String message,
final String transactionType,
final String user) {
final JournalEntry journalEntry = new JournalEntry();
final Set<Creditor> creditors = new HashSet<>();
journalEntry.setCreditors(creditors);
final Set<Debtor> debtors = new HashSet<>();
journalEntry.setDebtors(debtors);
final Map<String, BigDecimal> summedBalanceAdjustments = balanceAdjustments.entrySet().stream()
.map(entry -> {
final String accountIdentifier = designatorToAccountIdentifierMapper.mapOrThrow(entry.getKey());
return new BalanceAdjustment(accountIdentifier, entry.getValue());
})
.collect(Collectors.groupingBy(BalanceAdjustment::getAccountIdentifier,
Collectors.mapping(BalanceAdjustment::getAdjustment,
Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
summedBalanceAdjustments.forEach((accountIdentifier, balanceAdjustment) -> {
final int sign = balanceAdjustment.compareTo(BigDecimal.ZERO);
if (sign == 0)
return;
if (sign < 0) {
final Debtor debtor = new Debtor();
debtor.setAccountNumber(accountIdentifier);
debtor.setAmount(balanceAdjustment.negate().toPlainString());
debtors.add(debtor);
} else {
final Creditor creditor = new Creditor();
creditor.setAccountNumber(accountIdentifier);
creditor.setAmount(balanceAdjustment.toPlainString());
creditors.add(creditor);
}
});
if (creditors.isEmpty() && !debtors.isEmpty() ||
debtors.isEmpty() && !creditors.isEmpty())
throw ServiceException.internalError("either only creditors or only debtors were provided.");
journalEntry.setCreditors(creditors);
journalEntry.setDebtors(debtors);
journalEntry.setClerk(user);
journalEntry.setTransactionDate(transactionDate);
journalEntry.setMessage(message);
journalEntry.setTransactionType(transactionType);
journalEntry.setNote(note);
return journalEntry;
}