FINERACT-1981: Fix principal due during disbursement on overpaid loan
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 56e9dc9..297f4ef 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 @@
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();
+ 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);
+ 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,