FINERACT-1981: Loan schedule handling of tranche disbursement charges

This commit is contained in:
budaidev
2025-05-29 15:01:23 +02:00
committed by Adam Saghy
parent 96d6099cc1
commit 6e77b0702a
9 changed files with 888 additions and 31 deletions
@@ -967,8 +967,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom<Long> {
}
private boolean hasDisbursementTransaction() {
return this.loanTransactions.stream()
.anyMatch(loanTransaction -> loanTransaction.isDisbursement() && loanTransaction.isNotReversed());
return this.loanTransactions.stream().anyMatch(LoanTransaction::isDisbursement);
}
@@ -95,25 +95,29 @@ public class LoanBalanceService {
}
loan.setTotalOverpaid(null);
} else {
final Money overpaidBy = calculateTotalOverpayment(loan);
loan.setTotalOverpaid(null);
if (!overpaidBy.isLessThanZero()) {
loan.setTotalOverpaid(overpaidBy.getAmountDefaultedToNullIfZero());
}
final Money recoveredAmount = loan.calculateTotalRecoveredPayments();
loan.setTotalRecovered(recoveredAmount.getAmountDefaultedToNullIfZero());
final Money principal = loan.getLoanRepaymentScheduleDetail().getPrincipal();
final Money capitalizedIncome = capitalizedIncomeBalanceService.calculateCapitalizedIncome(loan);
final Money capitalizedIncomeAdjustment = capitalizedIncomeBalanceService.calculateCapitalizedIncomeAdjustment(loan);
loan.getSummary().updateSummary(loan.getCurrency(), principal, loan.getRepaymentScheduleInstallments(),
loan.getLoanCharges(), capitalizedIncome, capitalizedIncomeAdjustment);
loan.updateLoanOutstandingBalances();
refreshSummaryAndBalancesForDisbursedLoan(loan);
}
});
}
public void refreshSummaryAndBalancesForDisbursedLoan(final Loan loan) {
final Money overpaidBy = calculateTotalOverpayment(loan);
loan.setTotalOverpaid(null);
if (!overpaidBy.isLessThanZero()) {
loan.setTotalOverpaid(overpaidBy.getAmountDefaultedToNullIfZero());
}
final Money recoveredAmount = loan.calculateTotalRecoveredPayments();
loan.setTotalRecovered(recoveredAmount.getAmountDefaultedToNullIfZero());
final Money principal = loan.getLoanRepaymentScheduleDetail().getPrincipal();
final Money capitalizedIncome = capitalizedIncomeBalanceService.calculateCapitalizedIncome(loan);
final Money capitalizedIncomeAdjustment = capitalizedIncomeBalanceService.calculateCapitalizedIncomeAdjustment(loan);
loan.getSummary().updateSummary(loan.getCurrency(), principal, loan.getRepaymentScheduleInstallments(), loan.getLoanCharges(),
capitalizedIncome, capitalizedIncomeAdjustment);
loan.updateLoanOutstandingBalances();
}
public void updateLoanToLastDisbursalState(final Loan loan, final LoanDisbursementDetails disbursementDetail) {
for (final LoanCharge charge : loan.getActiveCharges()) {
if (charge.isOverdueInstallmentCharge()) {