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 205b39ddf0 FINERACT-2232: Loan account capitalized income transaction 
template
205b39ddf0 is described below

commit 205b39ddf0912601bb05dda044b671f5f18a2a2b
Author: Jose Alberto Hernandez <[email protected]>
AuthorDate: Tue Apr 22 22:29:00 2025 -0500

    FINERACT-2232: Loan account capitalized income transaction template
---
 .../loanaccount/api/LoanApiConstants.java          |  1 +
 .../api/LoanTransactionsApiResourceSwagger.java    | 16 ++++++++++++-
 .../loanaccount/data/LoanTransactionData.java      |  9 +++++++
 .../loanaccount/data/LoanTransactionEnumData.java  |  2 ++
 .../loanaccount/domain/LoanTransactionType.java    |  6 +++++
 .../loanproduct/service/LoanEnumerations.java      |  2 ++
 .../api/LoanTransactionsApiResource.java           |  3 +++
 .../service/LoanReadPlatformService.java           |  2 ++
 .../service/LoanReadPlatformServiceImpl.java       |  9 ++++---
 .../starter/LoanAccountConfiguration.java          | 10 ++++----
 .../integrationtests/LoanTransactionTest.java      | 28 ++++++++++++++++++++++
 11 files changed, 78 insertions(+), 10 deletions(-)

diff --git 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanApiConstants.java
 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanApiConstants.java
index db722dddee..62dfbd146e 100644
--- 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanApiConstants.java
+++ 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanApiConstants.java
@@ -174,6 +174,7 @@ public interface LoanApiConstants {
     // Commands
     String CHARGEBACK_TRANSACTION_COMMAND = "chargeback";
     String MARK_AS_FRAUD_COMMAND = "markAsFraud";
+    String CAPITALIZED_INCOME_TRANSACTION_COMMAND = "capitalizedIncome";
 
     // Data Validator names
     String LOAN_FRAUD_DATAVALIDATOR_PREFIX = "loans.fraud";
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 ac724097e5..1ee205ae80 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
@@ -75,7 +75,19 @@ final class LoanTransactionsApiResourceSwagger {
             public String displaySymbolValue;
         }
 
-        public GetLoansTransactionType transactionType;
+        static final class GetPaymentTypeOptions {
+
+            private GetPaymentTypeOptions() {}
+
+            @Schema(example = "10")
+            public Long id;
+            @Schema(example = "check")
+            public String name;
+            @Schema(example = "1")
+            public Integer position;
+        }
+
+        public GetLoansTransactionType type;
         @Schema(example = "[2009, 8, 1]")
         public LocalDate date;
         public GetLoansTotal total;
@@ -94,6 +106,8 @@ final class LoanTransactionsApiResourceSwagger {
         public GetLoanCurrency currency;
 
         public List<GetLoanProductsChargeOffReasonOptions> 
chargeOffReasonOptions;
+
+        public List<GetPaymentTypeOptions> paymentTypeOptions;
     }
 
     public static final class GetLoanCurrency {
diff --git 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionData.java
 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionData.java
index 8ca3d78089..c9a9ced865 100644
--- 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionData.java
+++ 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionData.java
@@ -216,7 +216,16 @@ public class LoanTransactionData implements Serializable {
                 loanTransactionData.externalId, loanTransactionData.transfer, 
loanTransactionData.fixedEmiAmount,
                 loanTransactionData.outstandingLoanBalance, 
loanTransactionData.manuallyReversed, loanTransactionData.loanId,
                 loanTransactionData.externalLoanId);
+    }
 
+    public static LoanTransactionData templateOnTop(final LoanTransactionData 
loanTransactionData, final LoanTransactionEnumData typeOf) {
+        return new LoanTransactionData(loanTransactionData.id, 
loanTransactionData.officeId, loanTransactionData.officeName, typeOf,
+                loanTransactionData.paymentDetailData, 
loanTransactionData.currency, loanTransactionData.date, 
loanTransactionData.amount,
+                loanTransactionData.netDisbursalAmount, 
loanTransactionData.principalPortion, loanTransactionData.interestPortion,
+                loanTransactionData.feeChargesPortion, 
loanTransactionData.penaltyChargesPortion, 
loanTransactionData.overpaymentPortion,
+                loanTransactionData.unrecognizedIncomePortion, 
loanTransactionData.paymentTypeOptions, loanTransactionData.externalId,
+                loanTransactionData.transfer, 
loanTransactionData.fixedEmiAmount, loanTransactionData.outstandingLoanBalance,
+                loanTransactionData.manuallyReversed, 
loanTransactionData.loanId, loanTransactionData.externalLoanId);
     }
 
     @Default // Default constructor for mapper
diff --git 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionEnumData.java
 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionEnumData.java
index ddfa5538a2..bc0aa9a307 100644
--- 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionEnumData.java
+++ 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionEnumData.java
@@ -67,6 +67,7 @@ public class LoanTransactionEnumData implements Serializable {
     private final boolean accrualActivity;
     private final boolean interestRefund;
     private final boolean accrualAdjustment;
+    private final boolean capitalizedIncome;
 
     public LoanTransactionEnumData(final Long id, final String code, final 
String value) {
         this.id = id;
@@ -103,6 +104,7 @@ public class LoanTransactionEnumData implements 
Serializable {
         this.reAmortize = 
Long.valueOf(LoanTransactionType.REAMORTIZE.getValue()).equals(this.id);
         this.interestRefund = 
Long.valueOf(LoanTransactionType.INTEREST_REFUND.getValue()).equals(this.id);
         this.accrualAdjustment = 
Long.valueOf(LoanTransactionType.ACCRUAL_ADJUSTMENT.getValue()).equals(this.id);
+        this.capitalizedIncome = 
Long.valueOf(LoanTransactionType.CAPITALIZED_INCOME.getValue()).equals(this.id);
     }
 
     public boolean isRepaymentType() {
diff --git 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionType.java
 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionType.java
index 967f24a2f7..709d3cf0ec 100644
--- 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionType.java
+++ 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionType.java
@@ -67,6 +67,7 @@ public enum LoanTransactionType {
     ACCRUAL_ACTIVITY(32, "loanTransactionType.accrualActivity"), //
     INTEREST_REFUND(33, "loanTransactionType.interestRefund"), //
     ACCRUAL_ADJUSTMENT(34, "loanTransactionType.accrualAdjustment"), //
+    CAPITALIZED_INCOME(35, "loanTransactionType.capitalizedIncome"), //
     ;
 
     private final Integer value;
@@ -117,6 +118,7 @@ public enum LoanTransactionType {
             case 32 -> LoanTransactionType.ACCRUAL_ACTIVITY;
             case 33 -> LoanTransactionType.INTEREST_REFUND;
             case 34 -> LoanTransactionType.ACCRUAL_ADJUSTMENT;
+            case 35 -> LoanTransactionType.CAPITALIZED_INCOME;
             default -> LoanTransactionType.INVALID;
         };
     }
@@ -233,4 +235,8 @@ public enum LoanTransactionType {
     public boolean isAccrualAdjustment() {
         return this == LoanTransactionType.ACCRUAL_ADJUSTMENT;
     }
+
+    public boolean isCapitalizedIncome() {
+        return this == LoanTransactionType.CAPITALIZED_INCOME;
+    }
 }
diff --git 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanEnumerations.java
 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanEnumerations.java
index 2ae4d3fa80..9093c8642b 100644
--- 
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanEnumerations.java
+++ 
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanEnumerations.java
@@ -325,6 +325,8 @@ public final class LoanEnumerations {
                     LoanTransactionType.INTEREST_REFUND.getCode(), "Interest 
Refund");
             case ACCRUAL_ADJUSTMENT -> new 
LoanTransactionEnumData(LoanTransactionType.ACCRUAL_ADJUSTMENT.getValue().longValue(),
                     LoanTransactionType.ACCRUAL_ADJUSTMENT.getCode(), "Accrual 
Adjustment");
+            case CAPITALIZED_INCOME -> new 
LoanTransactionEnumData(LoanTransactionType.CAPITALIZED_INCOME.getValue().longValue(),
+                    LoanTransactionType.CAPITALIZED_INCOME.getCode(), 
"Capitalized Income");
         };
     }
 
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResource.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResource.java
index 1a94ef27d3..386ed322da 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResource.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResource.java
@@ -664,6 +664,9 @@ public class LoanTransactionsApiResource {
             transactionData = 
this.loanReadPlatformService.retrieveLoanChargeOffTemplate(resolvedLoanId);
         } else if (CommandParameterUtil.is(commandParam, DOWN_PAYMENT)) {
             transactionData = 
this.loanReadPlatformService.retrieveLoanTransactionTemplate(resolvedLoanId);
+        } else if (CommandParameterUtil.is(commandParam, 
LoanApiConstants.CAPITALIZED_INCOME_TRANSACTION_COMMAND)) {
+            transactionData = 
this.loanReadPlatformService.retrieveLoanTransactionTemplate(resolvedLoanId,
+                    LoanTransactionType.CAPITALIZED_INCOME);
         } else {
             throw new UnrecognizedQueryParamException("command", commandParam);
         }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformService.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformService.java
index 02eddf3276..c81a5d73f0 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformService.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformService.java
@@ -63,6 +63,8 @@ public interface LoanReadPlatformService {
 
     LoanTransactionData retrieveLoanTransactionTemplate(Long loanId);
 
+    LoanTransactionData retrieveLoanTransactionTemplate(Long loanId, 
LoanTransactionType transactionType);
+
     LoanTransactionData retrieveWaiveInterestDetails(Long loanId);
 
     LoanTransactionData retrieveLoanTransaction(Long loanId, Long 
transactionId);
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 908a657a94..f853b38d57 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
@@ -111,7 +111,6 @@ import 
org.apache.fineract.portfolio.loanaccount.domain.LoanCapitalizedIncomeCal
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanCapitalizedIncomeStrategy;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanChargeOffBehaviour;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment;
-import 
org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleTransactionProcessorFactory;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanSubStatus;
@@ -166,7 +165,6 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService, Loa
     private final StaffReadPlatformService staffReadPlatformService;
     private final PaginationHelper paginationHelper;
     private final PaymentTypeReadPlatformService 
paymentTypeReadPlatformService;
-    private final LoanRepaymentScheduleTransactionProcessorFactory 
loanRepaymentScheduleTransactionProcessorFactory;
     private final FloatingRatesReadPlatformService 
floatingRatesReadPlatformService;
     private final LoanUtilService loanUtilService;
     private final ConfigurationDomainService configurationDomainService;
@@ -179,7 +177,6 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService, Loa
     private final LoanTransactionRelationReadService 
loanTransactionRelationReadService;
     private final LoanForeclosureValidator loanForeclosureValidator;
     private final LoanTransactionMapper loanTransactionMapper;
-    private final org.apache.fineract.portfolio.loanaccount.mapper.LoanMapper 
loanMapper;
     private final LoanTransactionProcessingService 
loadTransactionProcessingService;
 
     @Override
@@ -452,6 +449,12 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService, Loa
         return loanDetails;
     }
 
+    @Override
+    public LoanTransactionData retrieveLoanTransactionTemplate(final Long 
loanId, LoanTransactionType transactionType) {
+        return 
LoanTransactionData.templateOnTop(retrieveLoanTransactionTemplate(loanId),
+                LoanEnumerations.transactionType(transactionType));
+    }
+
     @Override
     public LoanTransactionData retrieveLoanTransactionTemplate(final Long 
loanId) {
 
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/LoanAccountConfiguration.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/LoanAccountConfiguration.java
index 21423934a0..10f65716c0 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/LoanAccountConfiguration.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/LoanAccountConfiguration.java
@@ -323,22 +323,20 @@ public class LoanAccountConfiguration {
             CodeValueReadPlatformService codeValueReadPlatformService, 
CalendarReadPlatformService calendarReadPlatformService,
             StaffReadPlatformService staffReadPlatformService, 
PaginationHelper paginationHelper,
             PaymentTypeReadPlatformService paymentTypeReadPlatformService,
-            LoanRepaymentScheduleTransactionProcessorFactory 
loanRepaymentScheduleTransactionProcessorFactory,
             FloatingRatesReadPlatformService floatingRatesReadPlatformService, 
LoanUtilService loanUtilService,
             ConfigurationDomainService configurationDomainService, 
AccountDetailsReadPlatformService accountDetailsReadPlatformService,
             ColumnValidator columnValidator, DatabaseSpecificSQLGenerator 
sqlGenerator,
             DelinquencyReadPlatformService delinquencyReadPlatformService, 
LoanTransactionRepository loanTransactionRepository,
             LoanChargePaidByReadService loanChargePaidByReadService, 
LoanTransactionRelationReadService loanTransactionRelationReadService,
-            LoanForeclosureValidator loanForeclosureValidator, 
LoanTransactionMapper loanTransactionMapper, LoanMapper loanMapper,
+            LoanForeclosureValidator loanForeclosureValidator, 
LoanTransactionMapper loanTransactionMapper,
             LoanTransactionProcessingService loanTransactionProcessingService) 
{
         return new LoanReadPlatformServiceImpl(jdbcTemplate, context, 
loanRepositoryWrapper, applicationCurrencyRepository,
                 loanProductReadPlatformService, clientReadPlatformService, 
groupReadPlatformService, loanDropdownReadPlatformService,
                 fundReadPlatformService, chargeReadPlatformService, 
codeValueReadPlatformService, calendarReadPlatformService,
-                staffReadPlatformService, paginationHelper, 
paymentTypeReadPlatformService,
-                loanRepaymentScheduleTransactionProcessorFactory, 
floatingRatesReadPlatformService, loanUtilService,
-                configurationDomainService, accountDetailsReadPlatformService, 
columnValidator, sqlGenerator,
+                staffReadPlatformService, paginationHelper, 
paymentTypeReadPlatformService, floatingRatesReadPlatformService,
+                loanUtilService, configurationDomainService, 
accountDetailsReadPlatformService, columnValidator, sqlGenerator,
                 delinquencyReadPlatformService, loanTransactionRepository, 
loanChargePaidByReadService, loanTransactionRelationReadService,
-                loanForeclosureValidator, loanTransactionMapper, loanMapper, 
loanTransactionProcessingService);
+                loanForeclosureValidator, loanTransactionMapper, 
loanTransactionProcessingService);
     }
 
     @Bean
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionTest.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionTest.java
index 4500bb14bb..63b0c6cb64 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionTest.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionTest.java
@@ -18,11 +18,15 @@
  */
 package org.apache.fineract.integrationtests;
 
+import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicReference;
 import org.apache.fineract.client.models.GetLoansLoanIdTransactionsResponse;
+import 
org.apache.fineract.client.models.GetLoansLoanIdTransactionsTemplateResponse;
 import org.apache.fineract.client.models.PostClientsResponse;
 import org.apache.fineract.client.models.PostLoanProductsResponse;
 import org.apache.fineract.client.models.TransactionType;
@@ -86,4 +90,28 @@ public class LoanTransactionTest extends 
BaseLoanIntegrationTest {
         });
     }
 
+    @Test
+    public void testGetLoanTransactionTemplateForCapitalizedIncome() {
+        final PostClientsResponse client = 
clientHelper.createClient(ClientHelper.defaultClientCreationRequest());
+
+        final PostLoanProductsResponse loanProductsResponse = 
loanProductHelper.createLoanProduct(create4IProgressive());
+
+        final String loanExternalIdStr = UUID.randomUUID().toString();
+
+        final String command = "capitalizedIncome";
+        runAt("20 December 2024", () -> {
+            Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), 
loanProductsResponse.getResourceId(), "20 December 2024",
+                    430.0, 7.0, 6, (request) -> 
request.externalId(loanExternalIdStr));
+
+            disburseLoan(loanId, BigDecimal.valueOf(430), "20 December 2024");
+
+            final GetLoansLoanIdTransactionsTemplateResponse 
transactionTemplate = loanTransactionHelper.retrieveTransactionTemplate(loanId,
+                    command, null, null, null);
+
+            assertNotNull(transactionTemplate);
+            assertEquals("loanTransactionType." + command, 
transactionTemplate.getType().getCode());
+            assertThat(transactionTemplate.getPaymentTypeOptions().size() > 0);
+        });
+    }
+
 }

Reply via email to