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,