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

commit aad7756bf5acddb0d98b7117cd393b604e6a1eec
Author: mariiaKraievska <[email protected]>
AuthorDate: Fri Jul 11 14:37:07 2025 +0300

    FINERACT-2325: Disable automatic Interest Refund calculation
---
 .../fineract/test/stepdef/loan/LoanStepDef.java    |  28 +++++
 .../features/LoanMerchantIssuedRefund.feature      | 122 ++++++++++++++++++++
 .../resources/features/LoanPayoutRefund.feature    | 123 +++++++++++++++++++++
 .../api/LoanTransactionsApiResourceSwagger.java    |   2 +
 .../domain/LoanAccountDomainService.java           |   2 +-
 .../domain/LoanAccountDomainServiceJpa.java        |  10 +-
 .../LoanTransactionValidatorImpl.java              |   6 +-
 .../LoanWritePlatformServiceJpaRepositoryImpl.java |   3 +-
 8 files changed, 287 insertions(+), 9 deletions(-)

diff --git 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanStepDef.java
 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanStepDef.java
index 24fb9f425a..348287030b 100644
--- 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanStepDef.java
+++ 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanStepDef.java
@@ -402,6 +402,34 @@ public class LoanStepDef extends AbstractStepDef {
                 transactionAmount, transferExternalOwnerId);
     }
 
+    @When("Customer makes {string} transaction with {string} payment type on 
{string} with {double} EUR transaction amount and system-generated Idempotency 
key and interestRefundCalculation {booleanValue}")
+    public void 
createTransactionWithAutoIdempotencyKeyAndWithInterestRefundCalculationFlagProvided(final
 String transactionTypeInput,
+            final String transactionPaymentType, final String transactionDate, 
final double transactionAmount,
+            final boolean interestRefundCalculation) throws IOException {
+        eventStore.reset();
+        final Response<PostLoansResponse> loanResponse = 
testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
+        assert loanResponse.body() != null;
+        final long loanId = loanResponse.body().getLoanId();
+
+        final TransactionType transactionType = 
TransactionType.valueOf(transactionTypeInput);
+        final String transactionTypeValue = transactionType.getValue();
+        final DefaultPaymentType paymentType = 
DefaultPaymentType.valueOf(transactionPaymentType);
+        final Long paymentTypeValue = paymentTypeResolver.resolve(paymentType);
+
+        final PostLoansLoanIdTransactionsRequest paymentTransactionRequest = 
LoanRequestFactory.defaultPaymentTransactionRequest()
+                
.transactionDate(transactionDate).transactionAmount(transactionAmount).paymentTypeId(paymentTypeValue)
+                .interestRefundCalculation(interestRefundCalculation);
+
+        final Response<PostLoansLoanIdTransactionsResponse> 
paymentTransactionResponse = loanTransactionsApi
+                .executeLoanTransaction(loanId, paymentTransactionRequest, 
transactionTypeValue).execute();
+        testContext().set(TestContextKey.LOAN_PAYMENT_TRANSACTION_RESPONSE, 
paymentTransactionResponse);
+        testContext().set(TestContextKey.LOAN_REPAYMENT_RESPONSE, 
paymentTransactionResponse);
+        ErrorHelper.checkSuccessfulApiCall(paymentTransactionResponse);
+
+        eventCheckHelper.transactionEventCheck(paymentTransactionResponse, 
transactionType, null);
+        eventCheckHelper.loanBalanceChangedEventCheck(loanId);
+    }
+
     private void 
createTransactionWithAutoIdempotencyKeyAndWithExternalOwner(String 
transactionTypeInput, String transactionPaymentType,
             String transactionDate, double transactionAmount, String 
externalOwnerId) throws IOException {
         eventStore.reset();
diff --git 
a/fineract-e2e-tests-runner/src/test/resources/features/LoanMerchantIssuedRefund.feature
 
b/fineract-e2e-tests-runner/src/test/resources/features/LoanMerchantIssuedRefund.feature
index ca6b93a490..4113ca2e9c 100644
--- 
a/fineract-e2e-tests-runner/src/test/resources/features/LoanMerchantIssuedRefund.feature
+++ 
b/fineract-e2e-tests-runner/src/test/resources/features/LoanMerchantIssuedRefund.feature
@@ -67,3 +67,125 @@ Feature: MerchantIssuedRefund
     And Customer makes "AUTOPAY" repayment on "09 June 2025" with 187.68 EUR 
transaction amount
     Then Customer makes "MERCHANT_ISSUED_REFUND" transaction with "AUTOPAY" 
payment type on "10 June 2025" with 100 EUR transaction amount and 
system-generated Idempotency key
     And Admin set 
"LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF" 
loan product "MERCHANT_ISSUED_REFUND" transaction type to "NEXT_INSTALLMENT" 
future installment allocation rule
+
+  @TestRailId:C3842
+  Scenario: Merchant Issued Refund with interestRefundCalculation = false 
(Interest Refund transaction should NOT be created)
+    When Admin sets the business date to "01 July 2024"
+    And Admin creates a client with random data
+    And Admin creates a fully customized loan with the following data:
+      | LoanProduct                                                   | 
submitted on date | with Principal | ANNUAL interest rate % | interest type     
| interest calculation period | amortization type  | loanTermFrequency | 
loanTermFrequencyType | repaymentEvery | repaymentFrequencyType | 
numberOfRepayments | graceOnPrincipalPayment | graceOnInterestPayment | 
interest free period | Payment strategy            |
+      | LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL | 01 
July 2024      | 1000           | 10                     | DECLINING_BALANCE | 
DAILY                       | EQUAL_INSTALLMENTS | 3                 | MONTHS   
             | 1              | MONTHS                 | 3                  | 0 
                      | 0                      | 0                    | 
ADVANCED_PAYMENT_ALLOCATION |
+    And Admin successfully approves the loan on "01 July 2024" with "1000" 
amount and expected disbursement date on "01 July 2024"
+    And Admin successfully disburse the loan on "01 July 2024" with "1000" EUR 
transaction amount
+    Then Loan Repayment schedule has 3 periods, with the following data for 
periods:
+      | Nr | Days | Date              | Paid date | Balance of loan | 
Principal due | Interest | Fees | Penalties | Due    | Paid | In advance | Late 
| Outstanding |
+      |    |      | 01 July 2024      |           | 1000.0          |          
     |          | 0.0  |           | 0.0    | 0.0  |            |      |        
     |
+      | 1  | 31   | 01 August 2024    |           | 669.43          | 330.57   
     | 8.33     | 0.0  | 0.0       | 338.9  | 0.0  | 0.0        | 0.0  | 338.9  
     |
+      | 2  | 31   | 01 September 2024 |           | 336.11          | 333.32   
     | 5.58     | 0.0  | 0.0       | 338.9  | 0.0  | 0.0        | 0.0  | 338.9  
     |
+      | 3  | 30   | 01 October 2024   |           | 0.0             | 336.11   
     | 2.8      | 0.0  | 0.0       | 338.91 | 0.0  | 0.0        | 0.0  | 338.91 
     |
+    And Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due     | Paid | In 
advance | Late | Outstanding |
+      | 1000.0        | 16.71    | 0.0  | 0.0       | 1016.71 | 0.0  | 0.0     
   | 0.0  | 1016.71     |
+    And Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type | Amount | Principal | Interest | 
Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 01 July 2024     | Disbursement     | 1000.0 | 0.0       | 0.0      | 
0.0  | 0.0       | 1000.0       | false    | false    |
+    When Admin sets the business date to "10 July 2024"
+    And Customer makes "REPAYMENT" transaction with "AUTOPAY" payment type on 
"10 July 2024" with 338.9 EUR transaction amount and system-generated 
Idempotency key
+    When Admin sets the business date to "15 July 2024"
+    And Customer makes "MERCHANT_ISSUED_REFUND" transaction with "AUTOPAY" 
payment type on "15 July 2024" with 50 EUR transaction amount and 
system-generated Idempotency key and interestRefundCalculation false
+    Then Loan Repayment schedule has 3 periods, with the following data for 
periods:
+      | Nr | Days | Date              | Paid date    | Balance of loan | 
Principal due | Interest | Fees | Penalties | Due    | Paid  | In advance | 
Late | Outstanding |
+      |    |      | 01 July 2024      |              | 1000.0          |       
        |          | 0.0  |           | 0.0    | 0.0   |            |      |    
         |
+      | 1  | 31   | 01 August 2024    | 10 July 2024 | 663.52          | 
336.48        | 2.42     | 0.0  | 0.0       | 338.9  | 338.9 | 338.9      | 0.0 
 | 0.0         |
+      | 2  | 31   | 01 September 2024 |              | 333.42          | 330.1 
        | 8.8      | 0.0  | 0.0       | 338.9  | 0.0   | 0.0        | 0.0  | 
338.9       |
+      | 3  | 30   | 01 October 2024   |              | 0.0             | 
333.42        | 2.36     | 0.0  | 0.0       | 335.78 | 50.0  | 50.0       | 0.0 
 | 285.78      |
+    And Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due     | Paid   | In 
advance | Late | Outstanding |
+      | 1000.0        | 13.58    | 0.0  | 0.0       | 1013.58 | 388.9  | 388.9 
     | 0.0  | 624.68      |
+    And Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type       | Amount | Principal | 
Interest | Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 01 July 2024     | Disbursement           | 1000.0 | 0.0       | 0.0   
   | 0.0  | 0.0       | 1000.0       | false    | false    |
+      | 10 July 2024     | Repayment              | 338.9  | 336.48    | 2.42  
   | 0.0  | 0.0       | 663.52       | false    | false    |
+      | 15 July 2024     | Merchant Issued Refund | 50.0   | 50.0      | 0.0   
   | 0.0  | 0.0       | 613.52       | false    | false    |
+
+  @TestRailId:C3843
+  Scenario: Merchant Issued Refund with interestRefundCalculation = true 
(Interest Refund transaction SHOULD be created)
+    When Admin sets the business date to "01 July 2024"
+    And Admin creates a client with random data
+    And Admin creates a fully customized loan with the following data:
+      | LoanProduct                                                   | 
submitted on date | with Principal | ANNUAL interest rate % | interest type     
| interest calculation period | amortization type  | loanTermFrequency | 
loanTermFrequencyType | repaymentEvery | repaymentFrequencyType | 
numberOfRepayments | graceOnPrincipalPayment | graceOnInterestPayment | 
interest free period | Payment strategy            |
+      | LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL | 01 
July 2024      | 1000           | 10                     | DECLINING_BALANCE | 
DAILY                       | EQUAL_INSTALLMENTS | 3                 | MONTHS   
             | 1              | MONTHS                 | 3                  | 0 
                      | 0                      | 0                    | 
ADVANCED_PAYMENT_ALLOCATION |
+    And Admin successfully approves the loan on "01 July 2024" with "1000" 
amount and expected disbursement date on "01 July 2024"
+    And Admin successfully disburse the loan on "01 July 2024" with "1000" EUR 
transaction amount
+    Then Loan Repayment schedule has 3 periods, with the following data for 
periods:
+      | Nr | Days | Date              | Paid date | Balance of loan | 
Principal due | Interest | Fees | Penalties | Due    | Paid | In advance | Late 
| Outstanding |
+      |    |      | 01 July 2024      |           | 1000.0          |          
     |          | 0.0  |           | 0.0    | 0.0  |            |      |        
     |
+      | 1  | 31   | 01 August 2024    |           | 669.43          | 330.57   
     | 8.33     | 0.0  | 0.0       | 338.9  | 0.0  | 0.0        | 0.0  | 338.9  
     |
+      | 2  | 31   | 01 September 2024 |           | 336.11          | 333.32   
     | 5.58     | 0.0  | 0.0       | 338.9  | 0.0  | 0.0        | 0.0  | 338.9  
     |
+      | 3  | 30   | 01 October 2024   |           | 0.0             | 336.11   
     | 2.8      | 0.0  | 0.0       | 338.91 | 0.0  | 0.0        | 0.0  | 338.91 
     |
+    And Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due     | Paid | In 
advance | Late | Outstanding |
+      | 1000.0        | 16.71    | 0.0  | 0.0       | 1016.71 | 0.0  | 0.0     
   | 0.0  | 1016.71     |
+    And Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type | Amount | Principal | Interest | 
Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 01 July 2024     | Disbursement     | 1000.0 | 0.0       | 0.0      | 
0.0  | 0.0       | 1000.0       | false    | false    |
+    When Admin sets the business date to "10 July 2024"
+    And Customer makes "REPAYMENT" transaction with "AUTOPAY" payment type on 
"10 July 2024" with 338.9 EUR transaction amount and system-generated 
Idempotency key
+    When Admin sets the business date to "15 July 2024"
+    And Customer makes "MERCHANT_ISSUED_REFUND" transaction with "AUTOPAY" 
payment type on "15 July 2024" with 50 EUR transaction amount and 
system-generated Idempotency key and interestRefundCalculation true
+    Then Loan Repayment schedule has 3 periods, with the following data for 
periods:
+      | Nr | Days | Date              | Paid date    | Balance of loan | 
Principal due | Interest | Fees | Penalties | Due    | Paid  | In advance | 
Late | Outstanding |
+      |    |      | 01 July 2024      |              | 1000.0          |       
        |          | 0.0  |           | 0.0    | 0.0   |            |      |    
         |
+      | 1  | 31   | 01 August 2024    | 10 July 2024 | 663.52          | 
336.48        | 2.42     | 0.0  | 0.0       | 338.9  | 338.9 | 338.9      | 0.0 
 | 0.0         |
+      | 2  | 31   | 01 September 2024 |              | 333.42          | 330.1 
        | 8.8      | 0.0  | 0.0       | 338.9  | 0.19  | 0.19       | 0.0  | 
338.71      |
+      | 3  | 30   | 01 October 2024   |              | 0.0             | 
333.42        | 2.36     | 0.0  | 0.0       | 335.78 | 50.0  | 50.0       | 0.0 
 | 285.78      |
+    And Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due     | Paid   | In 
advance | Late | Outstanding |
+      | 1000.0        | 13.58    | 0.0  | 0.0       | 1013.58 | 389.09 | 
389.09     | 0.0  | 624.49      |
+    And Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type       | Amount | Principal | 
Interest | Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 01 July 2024     | Disbursement           | 1000.0 | 0.0       | 0.0   
   | 0.0  | 0.0       | 1000.0       | false    | false    |
+      | 10 July 2024     | Repayment              | 338.9  | 336.48    | 2.42  
   | 0.0  | 0.0       | 663.52       | false    | false    |
+      | 15 July 2024     | Merchant Issued Refund | 50.0   | 50.0      | 0.0   
   | 0.0  | 0.0       | 613.52       | false    | false    |
+      | 15 July 2024     | Interest Refund        | 0.19   | 0.0       | 0.19  
   | 0.0  | 0.0       | 613.52       | false    | false    |
+
+  @TestRailId:C3844
+  Scenario: Merchant Issued Refund without interestRefundCalculation (should 
fallback to loan product config)
+    When Admin sets the business date to "01 July 2024"
+    And Admin creates a client with random data
+    And Admin creates a fully customized loan with the following data:
+      | LoanProduct                                                   | 
submitted on date | with Principal | ANNUAL interest rate % | interest type     
| interest calculation period | amortization type  | loanTermFrequency | 
loanTermFrequencyType | repaymentEvery | repaymentFrequencyType | 
numberOfRepayments | graceOnPrincipalPayment | graceOnInterestPayment | 
interest free period | Payment strategy            |
+      | LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL | 01 
July 2024      | 1000           | 10                     | DECLINING_BALANCE | 
DAILY                       | EQUAL_INSTALLMENTS | 3                 | MONTHS   
             | 1              | MONTHS                 | 3                  | 0 
                      | 0                      | 0                    | 
ADVANCED_PAYMENT_ALLOCATION |
+    And Admin successfully approves the loan on "01 July 2024" with "1000" 
amount and expected disbursement date on "01 July 2024"
+    And Admin successfully disburse the loan on "01 July 2024" with "1000" EUR 
transaction amount
+    Then Loan Repayment schedule has 3 periods, with the following data for 
periods:
+      | Nr | Days | Date              | Paid date | Balance of loan | 
Principal due | Interest | Fees | Penalties | Due    | Paid | In advance | Late 
| Outstanding |
+      |    |      | 01 July 2024      |           | 1000.0          |          
     |          | 0.0  |           | 0.0    | 0.0  |            |      |        
     |
+      | 1  | 31   | 01 August 2024    |           | 669.43          | 330.57   
     | 8.33     | 0.0  | 0.0       | 338.9  | 0.0  | 0.0        | 0.0  | 338.9  
     |
+      | 2  | 31   | 01 September 2024 |           | 336.11          | 333.32   
     | 5.58     | 0.0  | 0.0       | 338.9  | 0.0  | 0.0        | 0.0  | 338.9  
     |
+      | 3  | 30   | 01 October 2024   |           | 0.0             | 336.11   
     | 2.8      | 0.0  | 0.0       | 338.91 | 0.0  | 0.0        | 0.0  | 338.91 
     |
+    And Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due     | Paid | In 
advance | Late | Outstanding |
+      | 1000.0        | 16.71    | 0.0  | 0.0       | 1016.71 | 0.0  | 0.0     
   | 0.0  | 1016.71     |
+    And Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type | Amount | Principal | Interest | 
Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 01 July 2024     | Disbursement     | 1000.0 | 0.0       | 0.0      | 
0.0  | 0.0       | 1000.0       | false    | false    |
+    When Admin sets the business date to "10 July 2024"
+    And Customer makes "REPAYMENT" transaction with "AUTOPAY" payment type on 
"10 July 2024" with 338.9 EUR transaction amount and system-generated 
Idempotency key
+    When Admin sets the business date to "15 July 2024"
+    And Customer makes "MERCHANT_ISSUED_REFUND" transaction with "AUTOPAY" 
payment type on "15 July 2024" with 50 EUR transaction amount and 
system-generated Idempotency key
+    Then Loan Repayment schedule has 3 periods, with the following data for 
periods:
+      | Nr | Days | Date              | Paid date    | Balance of loan | 
Principal due | Interest | Fees | Penalties | Due    | Paid  | In advance | 
Late | Outstanding |
+      |    |      | 01 July 2024      |              | 1000.0          |       
        |          | 0.0  |           | 0.0    | 0.0   |            |      |    
         |
+      | 1  | 31   | 01 August 2024    | 10 July 2024 | 663.52          | 
336.48        | 2.42     | 0.0  | 0.0       | 338.9  | 338.9 | 338.9      | 0.0 
 | 0.0         |
+      | 2  | 31   | 01 September 2024 |              | 333.42          | 330.1 
        | 8.8      | 0.0  | 0.0       | 338.9  | 0.19  | 0.19       | 0.0  | 
338.71      |
+      | 3  | 30   | 01 October 2024   |              | 0.0             | 
333.42        | 2.36     | 0.0  | 0.0       | 335.78 | 50.0  | 50.0       | 0.0 
 | 285.78      |
+    And Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due     | Paid   | In 
advance | Late | Outstanding |
+      | 1000.0        | 13.58    | 0.0  | 0.0       | 1013.58 | 389.09 | 
389.09     | 0.0  | 624.49      |
+    And Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type       | Amount | Principal | 
Interest | Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 01 July 2024     | Disbursement           | 1000.0 | 0.0       | 0.0   
   | 0.0  | 0.0       | 1000.0       | false    | false    |
+      | 10 July 2024     | Repayment              | 338.9  | 336.48    | 2.42  
   | 0.0  | 0.0       | 663.52       | false    | false    |
+      | 15 July 2024     | Merchant Issued Refund | 50.0   | 50.0      | 0.0   
   | 0.0  | 0.0       | 613.52       | false    | false    |
+      | 15 July 2024     | Interest Refund        | 0.19   | 0.0       | 0.19  
   | 0.0  | 0.0       | 613.52       | false    | false    |
diff --git 
a/fineract-e2e-tests-runner/src/test/resources/features/LoanPayoutRefund.feature
 
b/fineract-e2e-tests-runner/src/test/resources/features/LoanPayoutRefund.feature
new file mode 100644
index 0000000000..9316d8a63b
--- /dev/null
+++ 
b/fineract-e2e-tests-runner/src/test/resources/features/LoanPayoutRefund.feature
@@ -0,0 +1,123 @@
+Feature: PayoutRefund
+
+  @TestRailId:C3845
+  Scenario: Payout Refund with interestRefundCalculation = false (Interest 
Refund transaction should NOT be created)
+    When Admin sets the business date to "01 July 2024"
+    And Admin creates a client with random data
+    And Admin creates a fully customized loan with the following data:
+      | LoanProduct                                                   | 
submitted on date | with Principal | ANNUAL interest rate % | interest type     
| interest calculation period | amortization type  | loanTermFrequency | 
loanTermFrequencyType | repaymentEvery | repaymentFrequencyType | 
numberOfRepayments | graceOnPrincipalPayment | graceOnInterestPayment | 
interest free period | Payment strategy            |
+      | LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL | 01 
July 2024      | 1000           | 10                     | DECLINING_BALANCE | 
DAILY                       | EQUAL_INSTALLMENTS | 3                 | MONTHS   
             | 1              | MONTHS                 | 3                  | 0 
                      | 0                      | 0                    | 
ADVANCED_PAYMENT_ALLOCATION |
+    And Admin successfully approves the loan on "01 July 2024" with "1000" 
amount and expected disbursement date on "01 July 2024"
+    And Admin successfully disburse the loan on "01 July 2024" with "1000" EUR 
transaction amount
+    Then Loan Repayment schedule has 3 periods, with the following data for 
periods:
+      | Nr | Days | Date              | Paid date | Balance of loan | 
Principal due | Interest | Fees | Penalties | Due    | Paid | In advance | Late 
| Outstanding |
+      |    |      | 01 July 2024      |           | 1000.0          |          
     |          | 0.0  |           | 0.0    | 0.0  |            |      |        
     |
+      | 1  | 31   | 01 August 2024    |           | 669.43          | 330.57   
     | 8.33     | 0.0  | 0.0       | 338.9  | 0.0  | 0.0        | 0.0  | 338.9  
     |
+      | 2  | 31   | 01 September 2024 |           | 336.11          | 333.32   
     | 5.58     | 0.0  | 0.0       | 338.9  | 0.0  | 0.0        | 0.0  | 338.9  
     |
+      | 3  | 30   | 01 October 2024   |           | 0.0             | 336.11   
     | 2.8      | 0.0  | 0.0       | 338.91 | 0.0  | 0.0        | 0.0  | 338.91 
     |
+    And Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due     | Paid | In 
advance | Late | Outstanding |
+      | 1000.0        | 16.71    | 0.0  | 0.0       | 1016.71 | 0.0  | 0.0     
   | 0.0  | 1016.71     |
+    And Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type | Amount | Principal | Interest | 
Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 01 July 2024     | Disbursement     | 1000.0 | 0.0       | 0.0      | 
0.0  | 0.0       | 1000.0       | false    | false    |
+    When Admin sets the business date to "10 July 2024"
+    And Customer makes "REPAYMENT" transaction with "AUTOPAY" payment type on 
"10 July 2024" with 338.9 EUR transaction amount and system-generated 
Idempotency key
+    When Admin sets the business date to "15 July 2024"
+    And Customer makes "PAYOUT_REFUND" transaction with "AUTOPAY" payment type 
on "15 July 2024" with 50 EUR transaction amount and system-generated 
Idempotency key and interestRefundCalculation false
+    Then Loan Repayment schedule has 3 periods, with the following data for 
periods:
+      | Nr | Days | Date              | Paid date    | Balance of loan | 
Principal due | Interest | Fees | Penalties | Due   | Paid  | In advance | Late 
| Outstanding |
+      |    |      | 01 July 2024      |              | 1000.0          |       
        |          | 0.0  |           | 0.0   | 0.0   |            |      |     
        |
+      | 1  | 31   | 01 August 2024    | 10 July 2024 | 663.52          | 
336.48        | 2.42     | 0.0  | 0.0       | 338.9 | 338.9 | 338.9      | 0.0  
| 0.0         |
+      | 2  | 31   | 01 September 2024 |              | 333.42          | 330.1 
        | 8.8      | 0.0  | 0.0       | 338.9 | 50.0  | 50.0       | 0.0  | 
288.9       |
+      | 3  | 30   | 01 October 2024   |              | 0.0             | 
333.42        | 2.78     | 0.0  | 0.0       | 336.2 | 0.0   | 0.0        | 0.0  
| 336.2       |
+    And Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due    | Paid   | In 
advance | Late | Outstanding |
+      | 1000.0        | 14.0     | 0.0  | 0.0       | 1014.0 | 388.9  | 388.9  
    | 0.0  | 625.1       |
+    And Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type | Amount | Principal | Interest | 
Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 01 July 2024     | Disbursement     | 1000.0 | 0.0       | 0.0      | 
0.0  | 0.0       | 1000.0       | false    | false    |
+      | 10 July 2024     | Repayment        | 338.9  | 336.48    | 2.42     | 
0.0  | 0.0       | 663.52       | false    | false    |
+      | 15 July 2024     | Payout Refund    | 50.0   | 50.0      | 0.0      | 
0.0  | 0.0       | 613.52       | false    | false    |
+
+  @TestRailId:C3846
+  Scenario: Payout Refund with interestRefundCalculation = true (Interest 
Refund transaction SHOULD be created)
+    When Admin sets the business date to "01 July 2024"
+    And Admin creates a client with random data
+    And Admin creates a fully customized loan with the following data:
+      | LoanProduct                                                   | 
submitted on date | with Principal | ANNUAL interest rate % | interest type     
| interest calculation period | amortization type  | loanTermFrequency | 
loanTermFrequencyType | repaymentEvery | repaymentFrequencyType | 
numberOfRepayments | graceOnPrincipalPayment | graceOnInterestPayment | 
interest free period | Payment strategy            |
+      | LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL | 01 
July 2024      | 1000           | 10                     | DECLINING_BALANCE | 
DAILY                       | EQUAL_INSTALLMENTS | 3                 | MONTHS   
             | 1              | MONTHS                 | 3                  | 0 
                      | 0                      | 0                    | 
ADVANCED_PAYMENT_ALLOCATION |
+    And Admin successfully approves the loan on "01 July 2024" with "1000" 
amount and expected disbursement date on "01 July 2024"
+    And Admin successfully disburse the loan on "01 July 2024" with "1000" EUR 
transaction amount
+    Then Loan Repayment schedule has 3 periods, with the following data for 
periods:
+      | Nr | Days | Date              | Paid date | Balance of loan | 
Principal due | Interest | Fees | Penalties | Due    | Paid | In advance | Late 
| Outstanding |
+      |    |      | 01 July 2024      |           | 1000.0          |          
     |          | 0.0  |           | 0.0    | 0.0  |            |      |        
     |
+      | 1  | 31   | 01 August 2024    |           | 669.43          | 330.57   
     | 8.33     | 0.0  | 0.0       | 338.9  | 0.0  | 0.0        | 0.0  | 338.9  
     |
+      | 2  | 31   | 01 September 2024 |           | 336.11          | 333.32   
     | 5.58     | 0.0  | 0.0       | 338.9  | 0.0  | 0.0        | 0.0  | 338.9  
     |
+      | 3  | 30   | 01 October 2024   |           | 0.0             | 336.11   
     | 2.8      | 0.0  | 0.0       | 338.91 | 0.0  | 0.0        | 0.0  | 338.91 
     |
+    And Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due     | Paid | In 
advance | Late | Outstanding |
+      | 1000.0        | 16.71    | 0.0  | 0.0       | 1016.71 | 0.0  | 0.0     
   | 0.0  | 1016.71     |
+    And Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type | Amount | Principal | Interest | 
Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 01 July 2024     | Disbursement     | 1000.0 | 0.0       | 0.0      | 
0.0  | 0.0       | 1000.0       | false    | false    |
+    When Admin sets the business date to "10 July 2024"
+    And Customer makes "REPAYMENT" transaction with "AUTOPAY" payment type on 
"10 July 2024" with 338.9 EUR transaction amount and system-generated 
Idempotency key
+    When Admin sets the business date to "15 July 2024"
+    And Customer makes "PAYOUT_REFUND" transaction with "AUTOPAY" payment type 
on "15 July 2024" with 50 EUR transaction amount and system-generated 
Idempotency key and interestRefundCalculation true
+    Then Loan Repayment schedule has 3 periods, with the following data for 
periods:
+      | Nr | Days | Date              | Paid date    | Balance of loan | 
Principal due | Interest | Fees | Penalties | Due   | Paid  | In advance | Late 
| Outstanding |
+      |    |      | 01 July 2024      |              | 1000.0          |       
        |          | 0.0  |           | 0.0   | 0.0   |            |      |     
        |
+      | 1  | 31   | 01 August 2024    | 10 July 2024 | 663.52          | 
336.48        | 2.42     | 0.0  | 0.0       | 338.9 | 338.9 | 338.9      | 0.0  
| 0.0         |
+      | 2  | 31   | 01 September 2024 |              | 333.42          | 330.1 
        | 8.8      | 0.0  | 0.0       | 338.9 | 50.19 | 50.19      | 0.0  | 
288.71      |
+      | 3  | 30   | 01 October 2024   |              | 0.0             | 
333.42        | 2.78     | 0.0  | 0.0       | 336.2 | 0.0   | 0.0        | 0.0  
| 336.2       |
+    And Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due    | Paid   | In 
advance | Late | Outstanding |
+      | 1000.0        | 14.0     | 0.0  | 0.0       | 1014.0 | 389.09 | 389.09 
    | 0.0  | 624.91      |
+    And Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type | Amount | Principal | Interest | 
Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 01 July 2024     | Disbursement     | 1000.0 | 0.0       | 0.0      | 
0.0  | 0.0       | 1000.0       | false    | false    |
+      | 10 July 2024     | Repayment        | 338.9  | 336.48    | 2.42     | 
0.0  | 0.0       | 663.52       | false    | false    |
+      | 15 July 2024     | Payout Refund    | 50.0   | 50.0      | 0.0      | 
0.0  | 0.0       | 613.52       | false    | false    |
+      | 15 July 2024     | Interest Refund  | 0.19   | 0.0       | 0.19     | 
0.0  | 0.0       | 613.52       | false    | false    |
+
+  @TestRailId:C3847
+  Scenario: Payout Refund without interestRefundCalculation (should fallback 
to loan product config)
+    When Admin sets the business date to "01 July 2024"
+    And Admin creates a client with random data
+    And Admin creates a fully customized loan with the following data:
+      | LoanProduct                                                   | 
submitted on date | with Principal | ANNUAL interest rate % | interest type     
| interest calculation period | amortization type  | loanTermFrequency | 
loanTermFrequencyType | repaymentEvery | repaymentFrequencyType | 
numberOfRepayments | graceOnPrincipalPayment | graceOnInterestPayment | 
interest free period | Payment strategy            |
+      | LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL | 01 
July 2024      | 1000           | 10                     | DECLINING_BALANCE | 
DAILY                       | EQUAL_INSTALLMENTS | 3                 | MONTHS   
             | 1              | MONTHS                 | 3                  | 0 
                      | 0                      | 0                    | 
ADVANCED_PAYMENT_ALLOCATION |
+    And Admin successfully approves the loan on "01 July 2024" with "1000" 
amount and expected disbursement date on "01 July 2024"
+    And Admin successfully disburse the loan on "01 July 2024" with "1000" EUR 
transaction amount
+    Then Loan Repayment schedule has 3 periods, with the following data for 
periods:
+      | Nr | Days | Date              | Paid date | Balance of loan | 
Principal due | Interest | Fees | Penalties | Due    | Paid | In advance | Late 
| Outstanding |
+      |    |      | 01 July 2024      |           | 1000.0          |          
     |          | 0.0  |           | 0.0    | 0.0  |            |      |        
     |
+      | 1  | 31   | 01 August 2024    |           | 669.43          | 330.57   
     | 8.33     | 0.0  | 0.0       | 338.9  | 0.0  | 0.0        | 0.0  | 338.9  
     |
+      | 2  | 31   | 01 September 2024 |           | 336.11          | 333.32   
     | 5.58     | 0.0  | 0.0       | 338.9  | 0.0  | 0.0        | 0.0  | 338.9  
     |
+      | 3  | 30   | 01 October 2024   |           | 0.0             | 336.11   
     | 2.8      | 0.0  | 0.0       | 338.91 | 0.0  | 0.0        | 0.0  | 338.91 
     |
+    And Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due     | Paid | In 
advance | Late | Outstanding |
+      | 1000.0        | 16.71    | 0.0  | 0.0       | 1016.71 | 0.0  | 0.0     
   | 0.0  | 1016.71     |
+    And Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type | Amount | Principal | Interest | 
Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 01 July 2024     | Disbursement     | 1000.0 | 0.0       | 0.0      | 
0.0  | 0.0       | 1000.0       | false    | false    |
+    When Admin sets the business date to "10 July 2024"
+    And Customer makes "REPAYMENT" transaction with "AUTOPAY" payment type on 
"10 July 2024" with 338.9 EUR transaction amount and system-generated 
Idempotency key
+    When Admin sets the business date to "15 July 2024"
+    And Customer makes "PAYOUT_REFUND" transaction with "AUTOPAY" payment type 
on "15 July 2024" with 50 EUR transaction amount and system-generated 
Idempotency key
+    Then Loan Repayment schedule has 3 periods, with the following data for 
periods:
+      | Nr | Days | Date              | Paid date    | Balance of loan | 
Principal due | Interest | Fees | Penalties | Due   | Paid  | In advance | Late 
| Outstanding |
+      |    |      | 01 July 2024      |              | 1000.0          |       
        |          | 0.0  |           | 0.0   | 0.0   |            |      |     
        |
+      | 1  | 31   | 01 August 2024    | 10 July 2024 | 663.52          | 
336.48        | 2.42     | 0.0  | 0.0       | 338.9 | 338.9 | 338.9      | 0.0  
| 0.0         |
+      | 2  | 31   | 01 September 2024 |              | 333.42          | 330.1 
        | 8.8      | 0.0  | 0.0       | 338.9 | 50.19 | 50.19      | 0.0  | 
288.71      |
+      | 3  | 30   | 01 October 2024   |              | 0.0             | 
333.42        | 2.78     | 0.0  | 0.0       | 336.2 | 0.0   | 0.0        | 0.0  
| 336.2       |
+    And Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due    | Paid   | In 
advance | Late | Outstanding |
+      | 1000.0        | 14.0     | 0.0  | 0.0       | 1014.0 | 389.09 | 389.09 
    | 0.0  | 624.91      |
+    And Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type | Amount | Principal | Interest | 
Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 01 July 2024     | Disbursement     | 1000.0 | 0.0       | 0.0      | 
0.0  | 0.0       | 1000.0       | false    | false    |
+      | 10 July 2024     | Repayment        | 338.9  | 336.48    | 2.42     | 
0.0  | 0.0       | 663.52       | false    | false    |
+      | 15 July 2024     | Payout Refund    | 50.0   | 50.0      | 0.0      | 
0.0  | 0.0       | 613.52       | false    | false    |
+      | 15 July 2024     | Interest Refund  | 0.19   | 0.0       | 0.19     | 
0.0  | 0.0       | 613.52       | false    | false    |
diff --git 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResourceSwagger.java
 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResourceSwagger.java
index 9014fd8c92..8929d7b430 100644
--- 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResourceSwagger.java
+++ 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResourceSwagger.java
@@ -352,6 +352,8 @@ final class LoanTransactionsApiResourceSwagger {
         @Schema(example = "numberOfInstallments")
         public Integer numberOfInstallments;
         // command=reAge END
+        @Schema(description = "Optional. Controls whether Interest Refund 
transaction should be created for this refund. If not provided, loan product 
config is used.", example = "false")
+        public Boolean interestRefundCalculation;
     }
 
     @Schema(description = "PostLoansLoanIdTransactionsResponse")
diff --git 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainService.java
 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainService.java
index 8c42b51258..1cc87f2b16 100644
--- 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainService.java
+++ 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainService.java
@@ -90,7 +90,7 @@ public interface LoanAccountDomainService {
 
     Pair<LoanTransaction, LoanTransaction> makeRefund(Loan loan, 
ScheduleGeneratorDTO scheduleGeneratorDTO,
             LoanTransactionType loanTransactionType, LocalDate 
transactionDate, BigDecimal transactionAmount, PaymentDetail paymentDetail,
-            ExternalId txnExternalId);
+            ExternalId txnExternalId, Boolean 
interestRefundCalculationOverride);
 
     void updateAndSavePostDatedChecksForIndividualAccount(Loan loan, 
LoanTransaction transaction);
 
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java
index 3ba2f187c1..20cf3535af 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java
@@ -25,6 +25,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -871,7 +872,7 @@ public class LoanAccountDomainServiceJpa implements 
LoanAccountDomainService {
     @Override
     public Pair<LoanTransaction, LoanTransaction> makeRefund(final Loan loan, 
final ScheduleGeneratorDTO scheduleGeneratorDTO,
             final LoanTransactionType loanTransactionType, final LocalDate 
transactionDate, final BigDecimal transactionAmount,
-            final PaymentDetail paymentDetail, final ExternalId txnExternalId) 
{
+            final PaymentDetail paymentDetail, final ExternalId txnExternalId, 
final Boolean interestRefundCalculationOverride) {
         // Pre-processing business event
         switch (loanTransactionType) {
             case MERCHANT_ISSUED_REFUND ->
@@ -887,9 +888,10 @@ public class LoanAccountDomainServiceJpa implements 
LoanAccountDomainService {
         final boolean isTransactionChronologicallyLatest = 
loanTransactionService.isChronologicallyLatestRepaymentOrWaiver(loan,
                 refundTransaction);
 
-        boolean shouldCreateInterestRefundTransaction = 
loan.getLoanProductRelatedDetail().getSupportedInterestRefundTypes().stream()
-                .map(LoanSupportedInterestRefundTypes::getTransactionType)
-                .anyMatch(transactionType -> 
transactionType.equals(loanTransactionType));
+        final boolean shouldCreateInterestRefundTransaction = 
Objects.requireNonNullElseGet(interestRefundCalculationOverride,
+                () -> 
loan.getLoanProductRelatedDetail().getSupportedInterestRefundTypes().stream()
+                        
.map(LoanSupportedInterestRefundTypes::getTransactionType)
+                        .anyMatch(transactionType -> 
transactionType.equals(loanTransactionType)));
         LoanTransaction interestRefundTransaction = null;
 
         if (shouldCreateInterestRefundTransaction) {
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanTransactionValidatorImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanTransactionValidatorImpl.java
index 4f635b98de..00716c1ee8 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanTransactionValidatorImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanTransactionValidatorImpl.java
@@ -948,9 +948,9 @@ public final class LoanTransactionValidatorImpl implements 
LoanTransactionValida
             throw new InvalidJsonException();
         }
 
-        final Set<String> transactionParameters = new HashSet<>(
-                Arrays.asList("transactionDate", "transactionAmount", 
"externalId", "note", "locale", "dateFormat", "paymentTypeId",
-                        "accountNumber", "checkNumber", "routingCode", 
"receiptNumber", "bankNumber", "loanId", "numberOfRepayments"));
+        final Set<String> transactionParameters = new 
HashSet<>(Arrays.asList("transactionDate", "transactionAmount", "externalId", 
"note",
+                "locale", "dateFormat", "paymentTypeId", "accountNumber", 
"checkNumber", "routingCode", "receiptNumber", "bankNumber",
+                "loanId", "numberOfRepayments", "interestRefundCalculation"));
 
         final Type typeOfMap = new TypeToken<Map<String, Object>>() 
{}.getType();
         this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, 
transactionParameters);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
index 40284de5ca..af8ee32567 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
@@ -2957,8 +2957,9 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
         final List<Long> existingTransactionIds = 
loanTransactionRepository.findTransactionIdsByLoan(loan);
         final List<Long> existingReversedTransactionIds = 
loanTransactionRepository.findReversedTransactionIdsByLoan(loan);
         // Create refund transaction(s)
+        final Boolean interestRefundCalculation = 
command.booleanObjectValueOfParameterNamed("interestRefundCalculation");
         Pair<LoanTransaction, LoanTransaction> refundTransactions = 
loanAccountDomainService.makeRefund(loan, scheduleGeneratorDTO,
-                loanTransactionType, transactionDate, transactionAmount, 
paymentDetail, txnExternalId);
+                loanTransactionType, transactionDate, transactionAmount, 
paymentDetail, txnExternalId, interestRefundCalculation);
         LoanTransaction refundTransaction = refundTransactions.getLeft();
         LoanTransaction interestRefundTransaction = 
refundTransactions.getRight();
         // Accrual reprocessing


Reply via email to