diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java index 738ad04a1..331fd8878 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java @@ -726,6 +726,11 @@ public abstract class AbstractLoanRepaymentScheduleTransactionProcessor implemen processCreditTransaction(loanTransaction, overpaidAmount, currency, installments); } + protected void handleCreditBalanceRefund(LoanTransaction loanTransaction, MonetaryCurrency currency, Money overpaidAmount, + List installments) { + processCreditTransaction(loanTransaction, overpaidAmount, currency, installments); + } + protected void handleRefund(LoanTransaction loanTransaction, MonetaryCurrency currency, List installments, final Set charges) { List transactionMappings = new ArrayList<>(); 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 91bb6094b..071d2f73e 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 @@ -150,6 +150,7 @@ public class AdvancedPaymentScheduleTransactionProcessor extends AbstractLoanRep case WRITEOFF -> handleWriteOff(loanTransaction, currency, installments); case REFUND_FOR_ACTIVE_LOAN -> handleRefund(loanTransaction, currency, installments, charges); case CHARGEBACK -> handleChargeback(loanTransaction, currency, overpaidAmount, installments); + case CREDIT_BALANCE_REFUND -> handleCreditBalanceRefund(loanTransaction, currency, overpaidAmount, installments); case REPAYMENT, MERCHANT_ISSUED_REFUND, PAYOUT_REFUND, GOODWILL_CREDIT, CHARGE_REFUND, CHARGE_ADJUSTMENT, DOWN_PAYMENT, WAIVE_INTEREST, RECOVERY_REPAYMENT -> handleRepayment(loanTransaction, currency, installments, charges); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/AdvancedPaymentAllocationLoanRepaymentScheduleTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/AdvancedPaymentAllocationLoanRepaymentScheduleTest.java index d11694170..b6ca9e83c 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/AdvancedPaymentAllocationLoanRepaymentScheduleTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/AdvancedPaymentAllocationLoanRepaymentScheduleTest.java @@ -71,7 +71,6 @@ import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanSchedul import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleType; import org.apache.fineract.portfolio.loanproduct.domain.PaymentAllocationType; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; @@ -1545,7 +1544,6 @@ public class AdvancedPaymentAllocationLoanRepaymentScheduleTest { // 6. Merchant issued credit - reversal // 7. Payments @Test - @Disabled("Till the CBR support got implemented") public void uc24() { try { GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE); @@ -1624,20 +1622,20 @@ public class AdvancedPaymentAllocationLoanRepaymentScheduleTest { new PostLoansLoanIdTransactionsTransactionIdRequest().dateFormat(DATETIME_PATTERN).transactionDate("20 January 2023") .transactionAmount(0.0).locale("en")); loanDetails = loanTransactionHelper.getLoanDetails(loanResponse.getLoanId()); - validateLoanSummaryBalances(loanDetails, 400.0, 100.0, 400.0, 100.0, null); - validateRepaymentPeriod(loanDetails, 1, 125.0, 100.0, 25.0, 0.0, 100.0); - validateRepaymentPeriod(loanDetails, 2, 125.0, 0.0, 125.0, 0.0, 0.0); - validateRepaymentPeriod(loanDetails, 3, 125.0, 0.0, 125.0, 0.0, 0.0); + validateLoanSummaryBalances(loanDetails, 400.0, 175.0, 400.0, 175.0, null); + validateRepaymentPeriod(loanDetails, 1, 125.0, 125.0, 0.0, 0.0, 125.0); + validateRepaymentPeriod(loanDetails, 2, 125.0, 50.0, 75.0, 0.0, 0.0); + validateRepaymentPeriod(loanDetails, 3, 200.0, 0.0, 200.0, 0.0, 0.0); validateRepaymentPeriod(loanDetails, 4, 125.0, 0.0, 125.0, 0.0, 0.0); assertTrue(loanDetails.getStatus().getActive()); loanTransactionHelper.makeLoanRepayment(loanResponse.getLoanId(), new PostLoansLoanIdTransactionsRequest() .dateFormat(DATETIME_PATTERN).transactionDate("31 January 2023").locale("en").transactionAmount(275.0)); loanDetails = loanTransactionHelper.getLoanDetails(loanResponse.getLoanId()); - validateLoanSummaryBalances(loanDetails, 125.0, 375.0, 125.0, 375.0, null); + validateLoanSummaryBalances(loanDetails, 125.0, 450.0, 125.0, 450.0, null); validateRepaymentPeriod(loanDetails, 1, 125.0, 125.0, 0.0, 0.0, 125.0); - validateRepaymentPeriod(loanDetails, 2, 125.0, 125.0, 0.0, 0.0, 125.0); - validateRepaymentPeriod(loanDetails, 3, 125.0, 125.0, 0.0, 0.0, 0.0); + validateRepaymentPeriod(loanDetails, 2, 125.0, 125.0, 0.0, 0.0, 75.0); + validateRepaymentPeriod(loanDetails, 3, 200.0, 200.0, 0.0, 0.0, 0.0); validateRepaymentPeriod(loanDetails, 4, 125.0, 0.0, 125.0, 0.0, 0.0); validateLoanTransaction(loanDetails, 6, 275.0, 275.0, 0.0, 125.0); assertTrue(loanDetails.getStatus().getActive()); @@ -1645,12 +1643,12 @@ public class AdvancedPaymentAllocationLoanRepaymentScheduleTest { loanTransactionHelper.makeLoanRepayment(loanResponse.getLoanId(), new PostLoansLoanIdTransactionsRequest() .dateFormat(DATETIME_PATTERN).transactionDate("15 February 2023").locale("en").transactionAmount(125.0)); loanDetails = loanTransactionHelper.getLoanDetails(loanResponse.getLoanId()); - validateLoanSummaryBalances(loanDetails, 0.0, 500.0, 0.0, 500.0, null); + validateLoanSummaryBalances(loanDetails, 0.0, 575.0, 0.0, 575.0, null); validateRepaymentPeriod(loanDetails, 1, 125.0, 125.0, 0.0, 0.0, 125.0); - validateRepaymentPeriod(loanDetails, 2, 125.0, 125.0, 0.0, 0.0, 125.0); - validateRepaymentPeriod(loanDetails, 3, 125.0, 125.0, 0.0, 0.0, 0.0); + validateRepaymentPeriod(loanDetails, 2, 125.0, 125.0, 0.0, 0.0, 75.0); + validateRepaymentPeriod(loanDetails, 3, 200.0, 200.0, 0.0, 0.0, 0.0); validateRepaymentPeriod(loanDetails, 4, 125.0, 125.0, 0.0, 0.0, 0.0); - validateLoanTransaction(loanDetails, 5, 125.0, 125.0, 0.0, 0.0); + validateLoanTransaction(loanDetails, 7, 125.0, 125.0, 0.0, 0.0); assertTrue(loanDetails.getStatus().getClosedObligationsMet()); } finally { GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE);