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 a370875ce FINERACT-1760: Enhanced external id support for loan 
transactions
a370875ce is described below

commit a370875ce815e9384b008b68c51f74693cd5db84
Author: Adam Saghy <[email protected]>
AuthorDate: Fri Nov 25 18:45:18 2022 +0100

    FINERACT-1760: Enhanced external id support for loan transactions
---
 .../loanaccount/data/LoanTransactionData.java      |  23 ++--
 .../service/LoanReadPlatformServiceImpl.java       |  31 +++--
 .../ExternalIdSupportIntegrationTest.java          | 138 ++++++++++++++++++++-
 .../common/loans/LoanTransactionHelper.java        |  16 +++
 4 files changed, 183 insertions(+), 25 deletions(-)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionData.java
index b5d4205be..d4d876ad1 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionData.java
@@ -91,7 +91,7 @@ public class LoanTransactionData {
     private List<LoanRepaymentScheduleInstallmentData> 
loanRepaymentScheduleInstallments;
 
     // Reverse Data
-    private String reversalExternalId;
+    private final ExternalId reversalExternalId;
     private LocalDate reversedOnDate;
 
     private List<LoanTransactionRelationData> transactionRelations;
@@ -126,7 +126,7 @@ public class LoanTransactionData {
         this.penaltyChargesPortion = null;
         this.overpaymentPortion = null;
         this.unrecognizedIncomePortion = null;
-        this.externalId = null;
+        this.externalId = ExternalId.empty();
         this.transfer = null;
         this.fixedEmiAmount = null;
         this.outstandingLoanBalance = null;
@@ -135,6 +135,7 @@ public class LoanTransactionData {
         this.possibleNextRepaymentDate = null;
         this.paymentTypeOptions = null;
         this.writeOffReasonOptions = null;
+        this.reversalExternalId = ExternalId.empty();
     }
 
     public static LoanTransactionData importInstance(BigDecimal 
repaymentAmount, LocalDate repaymentDate, Long repaymentTypeId,
@@ -177,7 +178,7 @@ public class LoanTransactionData {
         this.penaltyChargesPortion = null;
         this.overpaymentPortion = null;
         this.unrecognizedIncomePortion = null;
-        this.externalId = null;
+        this.externalId = ExternalId.empty();
         this.transfer = null;
         this.fixedEmiAmount = null;
         this.outstandingLoanBalance = null;
@@ -186,6 +187,7 @@ public class LoanTransactionData {
         this.possibleNextRepaymentDate = null;
         this.paymentTypeOptions = null;
         this.writeOffReasonOptions = null;
+        this.reversalExternalId = ExternalId.empty();
     }
 
     public void setNumberOfRepayments(Integer numberOfRepayments) {
@@ -229,8 +231,8 @@ public class LoanTransactionData {
             boolean manuallyReversed, Long loanId, String externalLoanId) {
         this(id, externalLoanId, officeId, officeName, transactionType, 
paymentDetailData, currency, date, amount, netDisbursalAmount,
                 principalPortion, interestPortion, feeChargesPortion, 
penaltyChargesPortion, overpaymentPortion, unrecognizedIncomePortion,
-                paymentTypeOptions, externalId, transfer, fixedEmiAmount, 
outstandingLoanBalance, null, manuallyReversed, null, null,
-                loanId);
+                paymentTypeOptions, externalId, transfer, fixedEmiAmount, 
outstandingLoanBalance, null, manuallyReversed,
+                ExternalId.empty(), null, loanId);
     }
 
     public LoanTransactionData(final Long id, final Long officeId, final 
String officeName, final LoanTransactionEnumData transactionType,
@@ -239,7 +241,7 @@ public class LoanTransactionData {
             final BigDecimal feeChargesPortion, final BigDecimal 
penaltyChargesPortion, final BigDecimal overpaymentPortion,
             final BigDecimal unrecognizedIncomePortion, final ExternalId 
externalId, final AccountTransferData transfer,
             BigDecimal fixedEmiAmount, BigDecimal outstandingLoanBalance, 
LocalDate submittedOnDate, final boolean manuallyReversed,
-            final String reversalExternalId, final LocalDate reversedOnDate, 
Long loanId, String externalLoanId) {
+            final ExternalId reversalExternalId, final LocalDate 
reversedOnDate, Long loanId, String externalLoanId) {
         this(id, externalLoanId, officeId, officeName, transactionType, 
paymentDetailData, currency, date, amount, netDisbursalAmount,
                 principalPortion, interestPortion, feeChargesPortion, 
penaltyChargesPortion, overpaymentPortion, unrecognizedIncomePortion,
                 null, externalId, transfer, fixedEmiAmount, 
outstandingLoanBalance, submittedOnDate, manuallyReversed, reversalExternalId,
@@ -253,7 +255,7 @@ public class LoanTransactionData {
             final BigDecimal overpaymentPortion, final BigDecimal 
unrecognizedIncomePortion,
             final Collection<PaymentTypeData> paymentTypeOptions, final 
ExternalId externalId, final AccountTransferData transfer,
             final BigDecimal fixedEmiAmount, BigDecimal 
outstandingLoanBalance, final LocalDate submittedOnDate,
-            final boolean manuallyReversed, final String reversalExternalId, 
final LocalDate reversedOnDate, Long loanId) {
+            final boolean manuallyReversed, final ExternalId 
reversalExternalId, final LocalDate reversedOnDate, Long loanId) {
         this.id = id;
         this.loanId = loanId;
         this.externalLoanId = externalLoanId;
@@ -286,10 +288,10 @@ public class LoanTransactionData {
     public LoanTransactionData(Long id, LoanTransactionEnumData 
transactionType, LocalDate date, BigDecimal totalAmount,
             BigDecimal netDisbursalAmount, BigDecimal principalPortion, 
BigDecimal interestPortion, BigDecimal feeChargesPortion,
             BigDecimal penaltyChargesPortion, BigDecimal overpaymentPortion, 
BigDecimal unrecognizedIncomePortion,
-            BigDecimal outstandingLoanBalance, final boolean manuallyReversed, 
Long loanId, String externalLoanId) {
+            BigDecimal outstandingLoanBalance, final boolean manuallyReversed, 
ExternalId externalId, Long loanId, String externalLoanId) {
         this(id, externalLoanId, null, null, transactionType, null, null, 
date, totalAmount, netDisbursalAmount, principalPortion,
-                interestPortion, feeChargesPortion, penaltyChargesPortion, 
overpaymentPortion, unrecognizedIncomePortion, null, null, null,
-                null, outstandingLoanBalance, null, manuallyReversed, null, 
null, loanId);
+                interestPortion, feeChargesPortion, penaltyChargesPortion, 
overpaymentPortion, unrecognizedIncomePortion, null, externalId,
+                null, null, outstandingLoanBalance, null, manuallyReversed, 
ExternalId.empty(), null, loanId);
     }
 
     public static LoanTransactionData 
loanTransactionDataForDisbursalTemplate(final LoanTransactionEnumData 
transactionType,
@@ -355,6 +357,7 @@ public class LoanTransactionData {
         this.submittedOnDate = submittedOnDate;
         this.manuallyReversed = manuallyReversed;
         this.possibleNextRepaymentDate = possibleNextRepaymentDate;
+        this.reversalExternalId = ExternalId.empty();
     }
 
     public boolean isNotDisbursement() {
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java
index 9ad07d2fe..b8ae00ea8 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java
@@ -44,6 +44,7 @@ import 
org.apache.fineract.infrastructure.core.data.EnumOptionData;
 import org.apache.fineract.infrastructure.core.domain.ExternalId;
 import org.apache.fineract.infrastructure.core.domain.JdbcSupport;
 import org.apache.fineract.infrastructure.core.service.DateUtils;
+import org.apache.fineract.infrastructure.core.service.ExternalIdFactory;
 import org.apache.fineract.infrastructure.core.service.Page;
 import org.apache.fineract.infrastructure.core.service.PaginationHelper;
 import org.apache.fineract.infrastructure.core.service.SearchParameters;
@@ -459,7 +460,7 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService {
                 
loanRepaymentScheduleInstallment.getInterestOutstanding(currency).getAmount(),
                 
loanRepaymentScheduleInstallment.getFeeChargesOutstanding(currency).getAmount().subtract(adjustedChargeAmount),
                 
loanRepaymentScheduleInstallment.getPenaltyChargesOutstanding(currency).getAmount(),
 null, unrecognizedIncomePortion,
-                paymentOptions, null, null, null, outstandingLoanBalance, 
false, loanId, loan.getExternalId());
+                paymentOptions, ExternalId.empty(), null, null, 
outstandingLoanBalance, false, loanId, loan.getExternalId());
     }
 
     private BigDecimal adjustPrepayInstallmentCharge(Loan loan, final 
LocalDate onDate) {
@@ -496,7 +497,7 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService {
         final BigDecimal outstandingLoanBalance = null;
         final BigDecimal unrecognizedIncomePortion = null;
         return new LoanTransactionData(null, null, null, transactionType, 
null, currencyData, waiveOfInterest.getTransactionDate(), amount,
-                loan.getNetDisbursalAmount(), null, null, null, null, null, 
null, null, null, outstandingLoanBalance,
+                loan.getNetDisbursalAmount(), null, null, null, null, null, 
ExternalId.empty(), null, null, outstandingLoanBalance,
                 unrecognizedIncomePortion, false, loanId, 
loan.getExternalId());
     }
 
@@ -508,7 +509,8 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService {
         final LoanTransactionEnumData transactionType = 
LoanEnumerations.transactionType(LoanTransactionType.WRITEOFF);
         final BigDecimal unrecognizedIncomePortion = null;
         return new LoanTransactionData(null, null, null, transactionType, 
null, null, DateUtils.getBusinessLocalDate(), null, null, null,
-                null, null, null, null, null, null, null, 
outstandingLoanBalance, unrecognizedIncomePortion, false, null, null);
+                null, null, null, null, ExternalId.empty(), null, null, 
outstandingLoanBalance, unrecognizedIncomePortion, false, null,
+                null);
 
     }
 
@@ -1374,8 +1376,9 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService {
             final BigDecimal unrecognizedIncomePortion = 
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "unrecognizedIncome");
             final BigDecimal outstandingLoanBalance = 
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "outstandingLoanBalance");
             final String externalIdStr = rs.getString("externalId");
-            final ExternalId externalId = StringUtils.isBlank(externalIdStr) ? 
ExternalId.empty() : new ExternalId(externalIdStr);
-            final String reversalExternalId = 
rs.getString("reversalExternalId");
+            final ExternalId externalId = 
ExternalIdFactory.produce(externalIdStr);
+            final String reversalExternalIdStr = 
rs.getString("reversalExternalId");
+            final ExternalId reversalExternalId = 
ExternalIdFactory.produce(reversalExternalIdStr);
             final LocalDate reversedOnDate = JdbcSupport.getLocalDate(rs, 
"reversedOnDate");
 
             final BigDecimal netDisbursalAmount = 
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "netDisbursalAmount");
@@ -1873,8 +1876,8 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService {
         BigDecimal outstandingLoanBalance = null;
         final BigDecimal unrecognizedIncomePortion = null;
         return new LoanTransactionData(null, null, null, transactionType, 
null, null, null, loan.getTotalWrittenOff(),
-                loan.getNetDisbursalAmount(), null, null, null, null, null, 
unrecognizedIncomePortion, paymentOptions, null, null, null,
-                outstandingLoanBalance, false, loanId, loan.getExternalId());
+                loan.getNetDisbursalAmount(), null, null, null, null, null, 
unrecognizedIncomePortion, paymentOptions, ExternalId.empty(),
+                null, null, outstandingLoanBalance, false, loanId, 
loan.getExternalId());
 
     }
 
@@ -1887,8 +1890,8 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService {
         final List<CodeValueData> writeOffReasonOptions = new ArrayList<>(
                 
this.codeValueReadPlatformService.retrieveCodeValuesByCode(LoanApiConstants.WRITEOFFREASONS));
         LoanTransactionData loanTransactionData = new 
LoanTransactionData(null, null, null, transactionType, null, loan.getCurrency(),
-                DateUtils.getBusinessLocalDate(), totalOutstanding, 
loan.getNetDisbursalAmount(), null, null, null, null, null, null, null,
-                null, null, null, false, loanId, loan.getExternalId());
+                DateUtils.getBusinessLocalDate(), totalOutstanding, 
loan.getNetDisbursalAmount(), null, null, null, null, null,
+                ExternalId.empty(), null, null, null, null, false, loanId, 
loan.getExternalId());
         loanTransactionData.setWriteOffReasonOptions(writeOffReasonOptions);
         return loanTransactionData;
     }
@@ -2018,8 +2021,8 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService {
                     + ", tr.amount as total, tr.principal_portion_derived as 
principal, tr.interest_portion_derived as interest, "
                     + " tr.fee_charges_portion_derived as fees, 
tr.penalty_charges_portion_derived as penalties, "
                     + " tr.overpayment_portion_derived as overpayment, 
tr.outstanding_loan_balance_derived as outstandingLoanBalance, "
-                    + " tr.unrecognized_income_portion as unrecognizedIncome, 
tr.loan_id as loanId, l.external_id as externalLoanId from m_loan_transaction 
tr "
-                    + " left join m_loan l on tr.loan_id = l.id";
+                    + " tr.unrecognized_income_portion as unrecognizedIncome, 
tr.loan_id as loanId, l.external_id as externalLoanId, "
+                    + " tr.external_id as externalId from m_loan_transaction 
tr " + " left join m_loan l on tr.loan_id = l.id";
         }
 
         @Override
@@ -2040,10 +2043,12 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService {
             final BigDecimal overPaymentPortion = 
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "overpayment");
             final BigDecimal unrecognizedIncomePortion = 
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "unrecognizedIncome");
             final BigDecimal outstandingLoanBalance = 
JdbcSupport.getBigDecimalDefaultToZeroIfNull(rs, "outstandingLoanBalance");
+            final String externalIdStr = rs.getString("externalId");
+            final ExternalId externalId = 
ExternalIdFactory.produce(externalIdStr);
 
             return new LoanTransactionData(id, transactionType, date, 
totalAmount, null, principalPortion, interestPortion,
                     feeChargesPortion, penaltyChargesPortion, 
overPaymentPortion, unrecognizedIncomePortion, outstandingLoanBalance, false,
-                    loanId, externalLoanId);
+                    externalId, loanId, externalLoanId);
         }
     }
 
@@ -2283,7 +2288,7 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService {
                 
loanRepaymentScheduleInstallment.getInterestOutstanding(currency).getAmount(),
                 
loanRepaymentScheduleInstallment.getFeeChargesOutstanding(currency).getAmount(),
                 
loanRepaymentScheduleInstallment.getPenaltyChargesOutstanding(currency).getAmount(),
 null, unrecognizedIncomePortion,
-                paymentTypeOptions, null, null, null, outstandingLoanBalance, 
isReversed, loanId, loan.getExternalId());
+                paymentTypeOptions, ExternalId.empty(), null, null, 
outstandingLoanBalance, isReversed, loanId, loan.getExternalId());
     }
 
     private static final class CurrencyMapper implements 
RowMapper<CurrencyData> {
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ExternalIdSupportIntegrationTest.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ExternalIdSupportIntegrationTest.java
index 5b3e5e814..cf8b3ab81 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ExternalIdSupportIntegrationTest.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ExternalIdSupportIntegrationTest.java
@@ -31,6 +31,7 @@ import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatterBuilder;
 import java.util.HashMap;
 import java.util.UUID;
+import 
org.apache.fineract.client.models.GetLoansLoanIdTransactionsTransactionIdResponse;
 import org.apache.fineract.client.models.PostClientsResponse;
 import org.apache.fineract.client.models.PostLoansLoanIdChargesChargeIdRequest;
 import 
org.apache.fineract.client.models.PostLoansLoanIdChargesChargeIdResponse;
@@ -135,10 +136,26 @@ public class ExternalIdSupportIntegrationTest extends 
IntegrationTest {
                 (long) penalty1LoanChargeId, new 
PostLoansLoanIdChargesChargeIdRequest().externalId(waiveChargeExternalIdStr));
         assertEquals(waiveChargeExternalIdStr, 
waiveLoanChargeResult.getSubResourceExternalId());
 
+        GetLoansLoanIdTransactionsTransactionIdResponse response = 
loanTransactionHelper.getLoanTransactionDetails((long) loanId,
+                waiveChargeExternalIdStr);
+        assertEquals(waiveChargeExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
waiveLoanChargeResult.getSubResourceExternalId());
+        assertEquals(waiveChargeExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
waiveChargeExternalIdStr);
+        assertEquals(waiveChargeExternalIdStr, response.getExternalId());
+
         // Check whether an external id was generated
         HashMap undoWaiveLoanChargeResult = 
loanTransactionHelper.undoWaiveLoanCharge((long) loanId, 
waiveChargeExternalIdStr);
         assertEquals(waiveChargeExternalIdStr, 
undoWaiveLoanChargeResult.get("subResourceExternalId"));
 
+        response = loanTransactionHelper.getLoanTransactionDetails((long) 
loanId, waiveChargeExternalIdStr);
+        assertEquals(waiveChargeExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr,
+                
Long.valueOf(undoWaiveLoanChargeResult.get("subResourceId").toString()));
+        assertEquals(waiveChargeExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
waiveChargeExternalIdStr);
+        assertEquals(waiveChargeExternalIdStr, response.getExternalId());
+
         // Check whether an external id was generated
         waiveLoanChargeResult = loanTransactionHelper.waiveLoanCharge((long) 
loanId, (long) penalty1LoanChargeId,
                 new PostLoansLoanIdChargesChargeIdRequest());
@@ -165,6 +182,14 @@ public class ExternalIdSupportIntegrationTest extends 
IntegrationTest {
                         .transactionAmount(5.0));
         assertNotNull(repaymentResult.getResourceExternalId());
 
+        String repaymentExternalId = repaymentResult.getResourceExternalId();
+        response = loanTransactionHelper.getLoanTransactionDetails((long) 
loanId, repaymentExternalId);
+        assertEquals(repaymentExternalId, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
repaymentResult.getResourceId());
+        assertEquals(repaymentExternalId, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
repaymentExternalId);
+        assertEquals(repaymentExternalId, response.getExternalId());
+
         // Check whether the provided external id was retrieved
         String transactionExternalIdStr = UUID.randomUUID().toString();
         final PostLoansLoanIdTransactionsResponse 
repaymentResultWithExternalId = 
loanTransactionHelper.makeLoanRepayment(loanExternalIdStr,
@@ -185,6 +210,14 @@ public class ExternalIdSupportIntegrationTest extends 
IntegrationTest {
                         .transactionDate("06 September 
2022").locale("en").transactionAmount(5.0).externalId(transactionExternalIdStr));
         assertEquals(transactionExternalIdStr, 
merchantIssuedRefundResultWithExternalId.getResourceExternalId());
 
+        response = loanTransactionHelper.getLoanTransactionDetails((long) 
loanId, transactionExternalIdStr);
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr,
+                merchantIssuedRefundResultWithExternalId.getResourceId());
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
transactionExternalIdStr);
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+
         // Check whether an external id was generated
         final PostLoansLoanIdTransactionsResponse payoutRefundResult = 
loanTransactionHelper.makePayoutRefund(loanExternalIdStr,
                 new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM 
yyyy").transactionDate("06 September 2022").locale("en")
@@ -198,6 +231,13 @@ public class ExternalIdSupportIntegrationTest extends 
IntegrationTest {
                         .transactionDate("06 September 
2022").locale("en").transactionAmount(5.0).externalId(transactionExternalIdStr));
         assertEquals(transactionExternalIdStr, 
payoutRefundResultWithExternalId.getResourceExternalId());
 
+        response = loanTransactionHelper.getLoanTransactionDetails((long) 
loanId, transactionExternalIdStr);
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
payoutRefundResultWithExternalId.getResourceId());
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
transactionExternalIdStr);
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+
         // Check whether an external id was generated
         final PostLoansLoanIdTransactionsResponse goodWillCreditResult = 
loanTransactionHelper.makeGoodwillCredit(loanExternalIdStr,
                 new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM 
yyyy").transactionDate("06 September 2022").locale("en")
@@ -211,11 +251,26 @@ public class ExternalIdSupportIntegrationTest extends 
IntegrationTest {
                         .transactionDate("06 September 
2022").locale("en").transactionAmount(5.0).externalId(transactionExternalIdStr));
         assertEquals(transactionExternalIdStr, 
goodWillCreditResultWithExternalId.getResourceExternalId());
 
+        response = loanTransactionHelper.getLoanTransactionDetails((long) 
loanId, transactionExternalIdStr);
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
goodWillCreditResultWithExternalId.getResourceId());
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
transactionExternalIdStr);
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+
         // Check whether an external id was generated
         final PostLoansLoanIdTransactionsResponse writeoffResult = 
loanTransactionHelper.makeWriteoff(loanExternalIdStr,
                 new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM 
yyyy").transactionDate("06 September 2022").locale("en"));
         assertNotNull(writeoffResult.getResourceExternalId());
 
+        transactionExternalIdStr = writeoffResult.getResourceExternalId();
+        response = loanTransactionHelper.getLoanTransactionDetails((long) 
loanId, transactionExternalIdStr);
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
writeoffResult.getResourceId());
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
transactionExternalIdStr);
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+
         // Check whether an external id was generated
         final PostLoansLoanIdTransactionsResponse makeRecoveryPaymentResult = 
loanTransactionHelper.makeRecoveryPayment(loanExternalIdStr,
                 new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM 
yyyy").transactionDate("06 September 2022").locale("en")
@@ -229,10 +284,17 @@ public class ExternalIdSupportIntegrationTest extends 
IntegrationTest {
                         .transactionDate("06 September 
2022").locale("en").transactionAmount(5.0).externalId(transactionExternalIdStr));
         assertEquals(transactionExternalIdStr, 
makeRecoveryPaymentResultWithExternalId.getResourceExternalId());
 
+        response = loanTransactionHelper.getLoanTransactionDetails((long) 
loanId, transactionExternalIdStr);
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr,
+                makeRecoveryPaymentResultWithExternalId.getResourceId());
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
transactionExternalIdStr);
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+
         // Check whether an external id was generated
         final PostLoansLoanIdTransactionsResponse undoWriteoffResult = 
loanTransactionHelper.makeUndoWriteoff(loanExternalIdStr,
-                new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM 
yyyy").transactionDate("06 September 2022").locale("en")
-                        .transactionAmount(5.0));
+                new PostLoansLoanIdTransactionsRequest());
         assertNotNull(undoWriteoffResult.getResourceExternalId());
 
         // Check whether the provided external id was retrieved
@@ -247,6 +309,13 @@ public class ExternalIdSupportIntegrationTest extends 
IntegrationTest {
                 .makeUndoWriteoff(loanExternalIdStr, new 
PostLoansLoanIdTransactionsRequest());
         assertEquals(transactionExternalIdStr, 
undoWriteoffResultWithExternalId.getResourceExternalId());
 
+        response = loanTransactionHelper.getLoanTransactionDetails((long) 
loanId, transactionExternalIdStr);
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
undoWriteoffResultWithExternalId.getResourceId());
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
transactionExternalIdStr);
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+
         // Overpay the account
         transactionExternalIdStr = UUID.randomUUID().toString();
         final PostLoansLoanIdTransactionsResponse 
overpaymentResultWithExternalId = loanTransactionHelper
@@ -267,6 +336,14 @@ public class ExternalIdSupportIntegrationTest extends 
IntegrationTest {
                         .transactionDate("06 September 
2022").locale("en").transactionAmount(5.0).externalId(transactionExternalIdStr));
         assertEquals(transactionExternalIdStr, 
makeCreditBalanceRefundResultWithExternalId.getResourceExternalId());
 
+        response = loanTransactionHelper.getLoanTransactionDetails((long) 
loanId, transactionExternalIdStr);
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr,
+                makeCreditBalanceRefundResultWithExternalId.getResourceId());
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
transactionExternalIdStr);
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+
         // Check whether an external id was generated
         final PostLoansLoanIdTransactionsResponse chargeRefundResult = 
loanTransactionHelper.makeChargeRefund(loanExternalIdStr,
                 new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM 
yyyy").locale("en").loanChargeId(penalty1LoanChargeId)
@@ -280,6 +357,13 @@ public class ExternalIdSupportIntegrationTest extends 
IntegrationTest {
                         
.loanChargeId(penalty1LoanChargeId).transactionAmount(1.0).externalId(transactionExternalIdStr));
         assertEquals(transactionExternalIdStr, 
chargeRefundResultWithExternalId.getResourceExternalId());
 
+        response = loanTransactionHelper.getLoanTransactionDetails((long) 
loanId, transactionExternalIdStr);
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
chargeRefundResultWithExternalId.getResourceId());
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
transactionExternalIdStr);
+        assertEquals(transactionExternalIdStr, response.getExternalId());
+
         // Create a loan with interest and test the rest of the transactions
 
         final String loanProductWithInterestJSON = new 
LoanProductTestBuilder().withPrincipal("10000.0").withRepaymentTypeAsMonth()
@@ -335,6 +419,13 @@ public class ExternalIdSupportIntegrationTest extends 
IntegrationTest {
                         
.transactionDate(formattedDate).locale("en").transactionAmount(1.0).externalId(waiveInterestTxnExternalIdStr));
         assertEquals(waiveInterestTxnExternalIdStr, 
waiveInterestResultWithExternalId.getResourceExternalId());
 
+        response = loanTransactionHelper.getLoanTransactionDetails((long) 
loanWithInterestId, waiveInterestTxnExternalIdStr);
+        assertEquals(waiveInterestTxnExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
waiveInterestResultWithExternalId.getResourceId());
+        assertEquals(waiveInterestTxnExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
waiveInterestTxnExternalIdStr);
+        assertEquals(waiveInterestTxnExternalIdStr, response.getExternalId());
+
         String inAdvanceRepaymentTxnExternalIdStr = 
UUID.randomUUID().toString();
         final PostLoansLoanIdTransactionsResponse inAdvanceRepaymentResult = 
loanTransactionHelper.makeLoanRepayment(loanExternalIdStr,
                 new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM 
yyyy").transactionDate(formattedDate).locale("en")
@@ -358,11 +449,25 @@ public class ExternalIdSupportIntegrationTest extends 
IntegrationTest {
                         
.transactionDate(formattedDate).locale("en").transactionAmount(5.0).externalId(makeRefundTxnExternalIdStr));
         assertEquals(makeRefundTxnExternalIdStr, 
makeRefundByCashResultWithExternalId.getResourceExternalId());
 
+        response = loanTransactionHelper.getLoanTransactionDetails((long) 
loanWithInterestId, makeRefundTxnExternalIdStr);
+        assertEquals(makeRefundTxnExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
makeRefundByCashResultWithExternalId.getResourceId());
+        assertEquals(makeRefundTxnExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
makeRefundTxnExternalIdStr);
+        assertEquals(makeRefundTxnExternalIdStr, response.getExternalId());
+
         PostLoansLoanIdTransactionsResponse adjustmentResult = 
loanTransactionHelper.reverseLoanTransaction((long) loanWithInterestId,
                 inAdvanceRepayment2TxnExternalIdStr, new 
PostLoansLoanIdTransactionsTransactionIdRequest().transactionDate(formattedDate)
                         .locale("en").dateFormat("dd MMMM 
yyyy").transactionAmount(0.0));
         assertEquals(inAdvanceRepayment2TxnExternalIdStr, 
adjustmentResult.getResourceExternalId());
 
+        response = loanTransactionHelper.getLoanTransactionDetails((long) 
loanWithInterestId, inAdvanceRepayment2TxnExternalIdStr);
+        assertEquals(inAdvanceRepayment2TxnExternalIdStr, 
response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
adjustmentResult.getResourceId());
+        assertEquals(inAdvanceRepayment2TxnExternalIdStr, 
response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
inAdvanceRepayment2TxnExternalIdStr);
+        assertEquals(inAdvanceRepayment2TxnExternalIdStr, 
response.getExternalId());
+
         adjustmentResult = 
loanTransactionHelper.reverseLoanTransaction(loanExternalIdStr, 
inAdvanceRepaymentResult.getResourceId(),
                 new 
PostLoansLoanIdTransactionsTransactionIdRequest().transactionDate(formattedDate).locale("en").dateFormat("dd
 MMMM yyyy")
                         .transactionAmount(0.0));
@@ -374,6 +479,13 @@ public class ExternalIdSupportIntegrationTest extends 
IntegrationTest {
                         
.transactionAmount(2.0).externalId(adjustTransactionExternalId));
         assertEquals(adjustTransactionExternalId, 
adjustmentResult.getResourceExternalId());
 
+        response = loanTransactionHelper.getLoanTransactionDetails((long) 
loanWithInterestId, adjustTransactionExternalId);
+        assertEquals(adjustTransactionExternalId, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
adjustmentResult.getResourceId());
+        assertEquals(adjustTransactionExternalId, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
adjustTransactionExternalId);
+        assertEquals(adjustTransactionExternalId, response.getExternalId());
+
         adjustmentResult = 
loanTransactionHelper.adjustLoanTransaction(loanExternalIdStr, 
adjustmentResult.getResourceExternalId(),
                 new 
PostLoansLoanIdTransactionsTransactionIdRequest().transactionDate(formattedDate).locale("en").dateFormat("dd
 MMMM yyyy")
                         .transactionAmount(1.0));
@@ -390,6 +502,13 @@ public class ExternalIdSupportIntegrationTest extends 
IntegrationTest {
                         
.transactionAmount(2.0).externalId(chargebackTransactionExternalId).paymentTypeId(1L));
         assertEquals(chargebackTransactionExternalId, 
chargebackResult.getResourceExternalId());
 
+        response = loanTransactionHelper.getLoanTransactionDetails((long) 
loanWithInterestId, chargebackTransactionExternalId);
+        assertEquals(chargebackTransactionExternalId, 
response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
chargebackResult.getResourceId());
+        assertEquals(chargebackTransactionExternalId, 
response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
chargebackTransactionExternalId);
+        assertEquals(chargebackTransactionExternalId, 
response.getExternalId());
+
         chargebackResult = 
loanTransactionHelper.chargebackLoanTransaction(loanExternalIdStr,
                 repaymentForChargebackResult.getResourceExternalId(),
                 new 
PostLoansLoanIdTransactionsTransactionIdRequest().locale("en").transactionAmount(2.0).paymentTypeId(2L));
@@ -402,6 +521,13 @@ public class ExternalIdSupportIntegrationTest extends 
IntegrationTest {
                 new 
PostLoansLoanIdChargesChargeIdRequest().externalId(chargeAdjustmentExternalIdStr).amount(1.0).locale("en"));
         assertEquals(chargeAdjustmentExternalIdStr, 
chargeAdjustmentResult.getSubResourceExternalId());
 
+        response = loanTransactionHelper.getLoanTransactionDetails((long) 
loanWithInterestId, chargeAdjustmentExternalIdStr);
+        assertEquals(chargeAdjustmentExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
chargeAdjustmentResult.getSubResourceExternalId());
+        assertEquals(chargeAdjustmentExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
chargeAdjustmentExternalIdStr);
+        assertEquals(chargeAdjustmentExternalIdStr, response.getExternalId());
+
         // Check whether an external id was generated
         chargeAdjustmentResult = loanTransactionHelper.chargeAdjustment((long) 
loanWithInterestId, (long) penalty3LoanChargeId,
                 new 
PostLoansLoanIdChargesChargeIdRequest().amount(1.0).locale("en"));
@@ -416,6 +542,14 @@ public class ExternalIdSupportIntegrationTest extends 
IntegrationTest {
                 LoanTransactionHelper.getPayChargeJSON(formattedDate, null, 
payChargeExternalIdStr), "");
         assertEquals(payChargeExternalIdStr, 
payChargeResult.get("subResourceExternalId"));
 
+        response = loanTransactionHelper.getLoanTransactionDetails((long) 
loanWithInterestId, payChargeExternalIdStr);
+        assertEquals(payChargeExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr,
+                Long.valueOf(payChargeResult.get("subResourceId").toString()));
+        assertEquals(payChargeExternalIdStr, response.getExternalId());
+        response = 
loanTransactionHelper.getLoanTransactionDetails(loanExternalIdStr, 
payChargeExternalIdStr);
+        assertEquals(payChargeExternalIdStr, response.getExternalId());
+
         
GlobalConfigurationHelper.updateEnabledFlagForGlobalConfiguration(requestSpec, 
responseSpec, 50, false);
     }
 
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
index d499bfc14..71e99cc91 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
@@ -784,6 +784,22 @@ public class LoanTransactionHelper extends IntegrationTest 
{
         return ok(fineract().loanTransactions.retrieveTransaction(loanId, 
transactionId, null));
     }
 
+    public GetLoansLoanIdTransactionsTransactionIdResponse 
getLoanTransactionDetails(final String loanExternalId,
+            final Long transactionId) {
+        return 
ok(fineract().loanTransactions.retrieveTransactionByLoanExternalIdAndTransactionId(loanExternalId,
 transactionId, null));
+    }
+
+    public GetLoansLoanIdTransactionsTransactionIdResponse 
getLoanTransactionDetails(final Long loanId,
+            final String transactionExternalId) {
+        return 
ok(fineract().loanTransactions.retrieveTransactionByTransactionExternalId(loanId,
 transactionExternalId, null));
+    }
+
+    public GetLoansLoanIdTransactionsTransactionIdResponse 
getLoanTransactionDetails(final String loanExternalId,
+            final String transactionExternalId) {
+        return 
ok(fineract().loanTransactions.retrieveTransactionByLoanExternalIdAndTransactionExternalId(loanExternalId,
+                transactionExternalId, null));
+    }
+
     public GetLoansLoanIdResponse getLoanDetails(final Long loanId) {
         return ok(fineract().loans.retrieveLoan(loanId, false, "all", null, 
null));
     }


Reply via email to