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 loanRepaymentScheduleInstallments; // Reverse Data - private String reversalExternalId; + private final ExternalId reversalExternalId; private LocalDate reversedOnDate; private List 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 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 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 { 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)); }