This is an automated email from the ASF dual-hosted git repository.

adamsaghy pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new adea7be21 FINERACT-1981: Fix principal due during disbursement on 
overpaid loan
adea7be21 is described below

commit adea7be21441345509650d78e230060ece7054b8
Author: Adam Saghy <[email protected]>
AuthorDate: Tue Feb 13 10:36:25 2024 +0100

    FINERACT-1981: Fix principal due during disbursement on overpaid loan
---
 ...dvancedPaymentScheduleTransactionProcessor.java | 42 +++++++++++-----------
 1 file changed, 22 insertions(+), 20 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<LoanRepaymentScheduleInstallment> installments, MoneyHolder 
overpaymentHolder) {
-        List<LoanTransactionToRepaymentScheduleMapping> transactionMappings = 
new ArrayList<>();
-        List<LoanPaymentAllocationRule> 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);
-        }
-        if (transactionAmountUnprocessed != null && 
transactionAmountUnprocessed.isGreaterThanZero()) {
-            overpaymentHolder.setMoneyObject(transactionAmountUnprocessed);
+        if (overpaymentHolder.getMoneyObject().isGreaterThanZero()) {
+            List<LoanTransactionToRepaymentScheduleMapping> 
transactionMappings = new ArrayList<>();
+            List<LoanPaymentAllocationRule> 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);
+            }
+            if (transactionAmountUnprocessed != null && 
transactionAmountUnprocessed.isGreaterThanZero()) {
+                overpaymentHolder.setMoneyObject(transactionAmountUnprocessed);
+            }
+            
loanTransaction.updateLoanTransactionToRepaymentScheduleMappings(transactionMappings);
         }
-        
loanTransaction.updateLoanTransactionToRepaymentScheduleMappings(transactionMappings);
     }
 
     private void handleRepayment(LoanTransaction loanTransaction, 
MonetaryCurrency currency,

Reply via email to