From adea7be21441345509650d78e230060ece7054b8 Mon Sep 17 00:00:00 2001 From: Adam Saghy Date: Tue, 13 Feb 2024 10:36:25 +0100 Subject: [PATCH] FINERACT-1981: Fix principal due during disbursement on overpaid loan --- ...edPaymentScheduleTransactionProcessor.java | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessor.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessor.java index 56e9dc90c..297f4efca 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessor.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/impl/AdvancedPaymentScheduleTransactionProcessor.java @@ -547,27 +547,29 @@ public class AdvancedPaymentScheduleTransactionProcessor extends AbstractLoanRep private void allocateOverpayment(LoanTransaction loanTransaction, MonetaryCurrency currency, List installments, MoneyHolder overpaymentHolder) { - List transactionMappings = new ArrayList<>(); - List paymentAllocationRules = loanTransaction.getLoan().getPaymentAllocationRules(); - LoanPaymentAllocationRule defaultPaymentAllocationRule = paymentAllocationRules.stream() - .filter(e -> PaymentAllocationTransactionType.DEFAULT.equals(e.getTransactionType())).findFirst().orElseThrow(); + if (overpaymentHolder.getMoneyObject().isGreaterThanZero()) { + List transactionMappings = new ArrayList<>(); + List paymentAllocationRules = loanTransaction.getLoan().getPaymentAllocationRules(); + LoanPaymentAllocationRule defaultPaymentAllocationRule = paymentAllocationRules.stream() + .filter(e -> PaymentAllocationTransactionType.DEFAULT.equals(e.getTransactionType())).findFirst().orElseThrow(); - Money transactionAmountUnprocessed = null; - Money zero = Money.zero(currency); - Balances balances = new Balances(zero, zero, zero, zero); - if (LoanScheduleProcessingType.HORIZONTAL - .equals(loanTransaction.getLoan().getLoanProductRelatedDetail().getLoanScheduleProcessingType())) { - transactionAmountUnprocessed = processPeriodsHorizontally(loanTransaction, currency, installments, - overpaymentHolder.getMoneyObject(), defaultPaymentAllocationRule, transactionMappings, Set.of(), balances); - } else if (LoanScheduleProcessingType.VERTICAL - .equals(loanTransaction.getLoan().getLoanProductRelatedDetail().getLoanScheduleProcessingType())) { - transactionAmountUnprocessed = processPeriodsVertically(loanTransaction, currency, installments, - overpaymentHolder.getMoneyObject(), defaultPaymentAllocationRule, transactionMappings, Set.of(), balances); + Money transactionAmountUnprocessed = null; + Money zero = Money.zero(currency); + Balances balances = new Balances(zero, zero, zero, zero); + if (LoanScheduleProcessingType.HORIZONTAL + .equals(loanTransaction.getLoan().getLoanProductRelatedDetail().getLoanScheduleProcessingType())) { + transactionAmountUnprocessed = processPeriodsHorizontally(loanTransaction, currency, installments, + overpaymentHolder.getMoneyObject(), defaultPaymentAllocationRule, transactionMappings, Set.of(), balances); + } else if (LoanScheduleProcessingType.VERTICAL + .equals(loanTransaction.getLoan().getLoanProductRelatedDetail().getLoanScheduleProcessingType())) { + transactionAmountUnprocessed = processPeriodsVertically(loanTransaction, currency, installments, + overpaymentHolder.getMoneyObject(), defaultPaymentAllocationRule, transactionMappings, Set.of(), balances); + } + if (transactionAmountUnprocessed != null && transactionAmountUnprocessed.isGreaterThanZero()) { + overpaymentHolder.setMoneyObject(transactionAmountUnprocessed); + } + loanTransaction.updateLoanTransactionToRepaymentScheduleMappings(transactionMappings); } - if (transactionAmountUnprocessed != null && transactionAmountUnprocessed.isGreaterThanZero()) { - overpaymentHolder.setMoneyObject(transactionAmountUnprocessed); - } - loanTransaction.updateLoanTransactionToRepaymentScheduleMappings(transactionMappings); } private void handleRepayment(LoanTransaction loanTransaction, MonetaryCurrency currency,