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 8a5300ef23 FINERACT-2311: Buy Down fee adjustment - Template API
8a5300ef23 is described below

commit 8a5300ef23ccad6e38846783bef5a64a0303d81a
Author: Jose Alberto Hernandez <[email protected]>
AuthorDate: Thu Jul 3 07:37:21 2025 -0500

    FINERACT-2311: Buy Down fee adjustment - Template API
---
 ...y.java => LoanBuyDownFeeBalanceRepository.java} | 24 ++++++-------
 .../BuyDownFeeWritePlatformServiceImpl.java        | 10 +++---
 .../ProgressiveLoanTransactionValidatorImpl.java   |  4 +--
 .../ProgressiveLoanAccountConfiguration.java       |  6 ++--
 .../api/LoanTransactionsApiResource.java           |  3 ++
 .../service/LoanReadPlatformServiceImpl.java       | 13 +++++++
 .../starter/LoanAccountConfiguration.java          | 11 +++---
 .../integrationtests/LoanTransactionTest.java      | 42 ++++++++++++++++++++++
 8 files changed, 86 insertions(+), 27 deletions(-)

diff --git 
a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/repository/LoanBuyDownFeesBalanceRepository.java
 
b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/repository/LoanBuyDownFeeBalanceRepository.java
similarity index 52%
rename from 
fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/repository/LoanBuyDownFeesBalanceRepository.java
rename to 
fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/repository/LoanBuyDownFeeBalanceRepository.java
index 88dceec5d8..519e50fbc4 100644
--- 
a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/repository/LoanBuyDownFeesBalanceRepository.java
+++ 
b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/repository/LoanBuyDownFeeBalanceRepository.java
@@ -21,29 +21,29 @@ package 
org.apache.fineract.portfolio.loanaccount.repository;
 import java.math.BigDecimal;
 import java.util.List;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanBuyDownFeeBalance;
-import 
org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepaymentPeriodData;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
 
-public interface LoanBuyDownFeesBalanceRepository
+@Repository
+public interface LoanBuyDownFeeBalanceRepository
         extends JpaRepository<LoanBuyDownFeeBalance, Long>, 
JpaSpecificationExecutor<LoanBuyDownFeeBalance> {
 
-    String FIND_BALANCE_REPAYMENT_SCHEDULE_DATA = "SELECT new 
org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepaymentPeriodData(lbfb.loanTransaction.id,
 lbfb.loan.id, lbfb.loanTransaction.dateOf, lbfb.loanTransaction.reversed, 
lbfb.amount, lbfb.unrecognizedAmount, lbfb.loanTransaction.feeChargesPortion) 
FROM LoanBuyDownFeeBalance lbfb ";
-
     List<LoanBuyDownFeeBalance> findAllByLoanId(Long loanId);
 
     LoanBuyDownFeeBalance findByLoanIdAndLoanTransactionId(Long loanId, Long 
transactionId);
 
-    @Query(FIND_BALANCE_REPAYMENT_SCHEDULE_DATA + " WHERE lbfb.loan.id = 
:loanId")
-    List<LoanTransactionRepaymentPeriodData> 
findRepaymentPeriodDataByLoanId(Long loanId);
+    @Query("SELECT lbfb FROM LoanBuyDownFeeBalance lbfb WHERE lbfb.loan.id = 
:loanId ORDER BY lbfb.date ASC")
+    List<LoanBuyDownFeeBalance> 
findRepaymentPeriodDataByLoanId(@Param("loanId") Long loanId);
 
-    @Query("SELECT SUM(lbfb.amount) FROM LoanBuyDownFeeBalance lbfb WHERE 
lbfb.loan.id = :loanId")
-    BigDecimal calculateBuydownFeeAmount(Long loanId);
+    @Query("SELECT COALESCE(SUM(lbfb.amount), 0) FROM LoanBuyDownFeeBalance 
lbfb WHERE lbfb.loan.id = :loanId")
+    BigDecimal calculateBuyDownFee(@Param("loanId") Long loanId);
 
-    @Query("SELECT SUM(lbfb.amountAdjustment) FROM LoanBuyDownFeeBalance lbfb 
WHERE lbfb.loan.id = :loanId")
-    BigDecimal calculateBuydownFeeAdjustment(Long loanId);
+    @Query("SELECT COALESCE(SUM(lbfb.amountAdjustment), 0) FROM 
LoanBuyDownFeeBalance lbfb WHERE lbfb.loan.id = :loanId")
+    BigDecimal calculateBuyDownFeeAdjustment(@Param("loanId") Long loanId);
 
-    @Query("SELECT lbfb FROM LoanBuyDownFeeBalance lbfb, LoanTransaction lt, 
LoanTransactionRelation ltr WHERE lt.loan.id = lbfb.loan.id AND 
ltr.fromTransaction.id =:transactionId AND ltr.toTransaction.id=lt.id AND 
lbfb.loanTransaction.id = lt.id")
-    LoanBuyDownFeeBalance findBalanceForAdjustment(Long transactionId);
+    @Query("SELECT lbfb FROM LoanBuyDownFeeBalance lbfb WHERE lbfb.loan.id = 
:loanId AND lbfb.amountAdjustment IS NULL ORDER BY lbfb.date DESC")
+    List<LoanBuyDownFeeBalance> findBalanceForAdjustment(@Param("loanId") Long 
loanId);
 }
diff --git 
a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/BuyDownFeeWritePlatformServiceImpl.java
 
b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/BuyDownFeeWritePlatformServiceImpl.java
index 902b0a46d1..e02b18ae9e 100644
--- 
a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/BuyDownFeeWritePlatformServiceImpl.java
+++ 
b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/BuyDownFeeWritePlatformServiceImpl.java
@@ -51,7 +51,7 @@ import 
org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRelation;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRelationTypeEnum;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
-import 
org.apache.fineract.portfolio.loanaccount.repository.LoanBuyDownFeesBalanceRepository;
+import 
org.apache.fineract.portfolio.loanaccount.repository.LoanBuyDownFeeBalanceRepository;
 import org.apache.fineract.portfolio.note.service.NoteWritePlatformService;
 import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail;
 import 
org.apache.fineract.portfolio.paymentdetail.service.PaymentDetailWritePlatformService;
@@ -68,7 +68,7 @@ public class BuyDownFeeWritePlatformServiceImpl implements 
BuyDownFeePlatformSer
     private final LoanJournalEntryPoster loanJournalEntryPoster;
     private final NoteWritePlatformService noteWritePlatformService;
     private final ExternalIdFactory externalIdFactory;
-    private final LoanBuyDownFeesBalanceRepository 
loanBuyDownFeesBalanceRepository;
+    private final LoanBuyDownFeeBalanceRepository 
loanBuyDownFeeBalanceRepository;
     private final ReprocessLoanTransactionsService 
reprocessLoanTransactionsService;
     private final LoanBalanceService loanBalanceService;
     private final LoanLifecycleStateMachine loanLifecycleStateMachine;
@@ -177,13 +177,13 @@ public class BuyDownFeeWritePlatformServiceImpl 
implements BuyDownFeePlatformSer
         LoanTransaction savedBuyDownFeeAdjustment = 
loanTransactionRepository.saveAndFlush(buyDownFeeAdjustment);
 
         // Update buy down fee balance
-        LoanBuyDownFeeBalance buydownFeeBalance = 
loanBuyDownFeesBalanceRepository.findByLoanIdAndLoanTransactionId(loanId,
+        LoanBuyDownFeeBalance buydownFeeBalance = 
loanBuyDownFeeBalanceRepository.findByLoanIdAndLoanTransactionId(loanId,
                 buyDownFeeTransactionId);
         if (buydownFeeBalance != null) {
             
buydownFeeBalance.setAmountAdjustment(MathUtil.nullToZero(buydownFeeBalance.getAmountAdjustment()).add(transactionAmount));
             buydownFeeBalance
                     
.setUnrecognizedAmount(MathUtil.negativeToZero(buydownFeeBalance.getUnrecognizedAmount().subtract(transactionAmount)));
-            loanBuyDownFeesBalanceRepository.save(buydownFeeBalance);
+            loanBuyDownFeeBalanceRepository.save(buydownFeeBalance);
         }
 
         // Update outstanding loan balances
@@ -236,6 +236,6 @@ public class BuyDownFeeWritePlatformServiceImpl implements 
BuyDownFeePlatformSer
         buyDownFeeBalance.setDate(buyDownFeeTransaction.getTransactionDate());
         buyDownFeeBalance.setAmount(buyDownFeeTransaction.getAmount());
         
buyDownFeeBalance.setUnrecognizedAmount(buyDownFeeTransaction.getAmount());
-        loanBuyDownFeesBalanceRepository.saveAndFlush(buyDownFeeBalance);
+        loanBuyDownFeeBalanceRepository.saveAndFlush(buyDownFeeBalance);
     }
 }
diff --git 
a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/ProgressiveLoanTransactionValidatorImpl.java
 
b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/ProgressiveLoanTransactionValidatorImpl.java
index 46bf83fdd1..a1a0155afc 100644
--- 
a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/ProgressiveLoanTransactionValidatorImpl.java
+++ 
b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/ProgressiveLoanTransactionValidatorImpl.java
@@ -58,7 +58,7 @@ import 
org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType;
 import 
org.apache.fineract.portfolio.loanaccount.exception.LoanTransactionProcessingException;
-import 
org.apache.fineract.portfolio.loanaccount.repository.LoanBuyDownFeesBalanceRepository;
+import 
org.apache.fineract.portfolio.loanaccount.repository.LoanBuyDownFeeBalanceRepository;
 import 
org.apache.fineract.portfolio.loanaccount.repository.LoanCapitalizedIncomeBalanceRepository;
 import 
org.apache.fineract.portfolio.loanaccount.serialization.LoanTransactionValidator;
 import org.apache.fineract.portfolio.loanproduct.domain.LoanProduct;
@@ -71,7 +71,7 @@ public class ProgressiveLoanTransactionValidatorImpl 
implements ProgressiveLoanT
     private final LoanTransactionValidator loanTransactionValidator;
     private final LoanRepositoryWrapper loanRepositoryWrapper;
     private final LoanCapitalizedIncomeBalanceRepository 
loanCapitalizedIncomeBalanceRepository;
-    private final LoanBuyDownFeesBalanceRepository 
loanBuydownFeeBalanceRepository;
+    private final LoanBuyDownFeeBalanceRepository 
loanBuydownFeeBalanceRepository;
     private final LoanTransactionRepository loanTransactionRepository;
 
     @Override
diff --git 
a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/ProgressiveLoanAccountConfiguration.java
 
b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/ProgressiveLoanAccountConfiguration.java
index 6e6665ed6c..e0e44f49b8 100644
--- 
a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/ProgressiveLoanAccountConfiguration.java
+++ 
b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/starter/ProgressiveLoanAccountConfiguration.java
@@ -24,7 +24,7 @@ import 
org.apache.fineract.infrastructure.event.business.service.BusinessEventNo
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanLifecycleStateMachine;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
-import 
org.apache.fineract.portfolio.loanaccount.repository.LoanBuyDownFeesBalanceRepository;
+import 
org.apache.fineract.portfolio.loanaccount.repository.LoanBuyDownFeeBalanceRepository;
 import 
org.apache.fineract.portfolio.loanaccount.repository.LoanCapitalizedIncomeBalanceRepository;
 import 
org.apache.fineract.portfolio.loanaccount.serialization.LoanTransactionValidator;
 import 
org.apache.fineract.portfolio.loanaccount.service.CapitalizedIncomeBalanceService;
@@ -66,9 +66,9 @@ public class ProgressiveLoanAccountConfiguration {
     public ProgressiveLoanTransactionValidator 
progressiveLoanTransactionValidator(FromJsonHelper fromApiJsonHelper,
             LoanTransactionValidator loanTransactionValidator, 
LoanRepositoryWrapper loanRepositoryWrapper,
             LoanCapitalizedIncomeBalanceRepository 
loanCapitalizedIncomeBalanceRepository,
-            LoanBuyDownFeesBalanceRepository loanBuydownFeesBalanceRepository, 
LoanTransactionRepository loanTransactionRepository) {
+            LoanBuyDownFeeBalanceRepository loanBuydownFeeBalanceRepository, 
LoanTransactionRepository loanTransactionRepository) {
         return new ProgressiveLoanTransactionValidatorImpl(fromApiJsonHelper, 
loanTransactionValidator, loanRepositoryWrapper,
-                loanCapitalizedIncomeBalanceRepository, 
loanBuydownFeesBalanceRepository, loanTransactionRepository);
+                loanCapitalizedIncomeBalanceRepository, 
loanBuydownFeeBalanceRepository, loanTransactionRepository);
     }
 
     @Bean
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 e5f503de9c..039f7a70e4 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
@@ -688,6 +688,9 @@ public class LoanTransactionsApiResource {
                     LoanTransactionType.CAPITALIZED_INCOME_ADJUSTMENT, 
transactionId);
         } else if (CommandParameterUtil.is(commandParam, 
LoanApiConstants.BUY_DOWN_FEE_COMMAND)) {
             transactionData = 
this.loanReadPlatformService.retrieveLoanTransactionTemplate(resolvedLoanId);
+        } else if (CommandParameterUtil.is(commandParam, 
LoanApiConstants.BUY_DOWN_FEE_ADJUSTMENT_COMMAND)) {
+            transactionData = 
this.loanReadPlatformService.retrieveLoanTransactionTemplate(resolvedLoanId,
+                    LoanTransactionType.BUY_DOWN_FEE_ADJUSTMENT, 
transactionId);
         } else {
             throw new UnrecognizedQueryParamException("command", commandParam);
         }
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 3bff93be07..a409e09912 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
@@ -109,6 +109,7 @@ import 
org.apache.fineract.portfolio.loanaccount.data.PaidInAdvanceData;
 import 
org.apache.fineract.portfolio.loanaccount.data.RepaymentScheduleRelatedLoanData;
 import org.apache.fineract.portfolio.loanaccount.data.ScheduleGeneratorDTO;
 import org.apache.fineract.portfolio.loanaccount.domain.Loan;
+import org.apache.fineract.portfolio.loanaccount.domain.LoanBuyDownFeeBalance;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanBuyDownFeeCalculationType;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanBuyDownFeeIncomeType;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanBuyDownFeeStrategy;
@@ -133,6 +134,7 @@ import 
org.apache.fineract.portfolio.loanaccount.loanschedule.data.OverdueLoanSc
 import 
org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleProcessingType;
 import 
org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleType;
 import org.apache.fineract.portfolio.loanaccount.mapper.LoanTransactionMapper;
+import 
org.apache.fineract.portfolio.loanaccount.repository.LoanBuyDownFeeBalanceRepository;
 import 
org.apache.fineract.portfolio.loanaccount.repository.LoanCapitalizedIncomeBalanceRepository;
 import 
org.apache.fineract.portfolio.loanaccount.serialization.LoanForeclosureValidator;
 import org.apache.fineract.portfolio.loanproduct.data.LoanProductData;
@@ -189,6 +191,7 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService, Loa
     private final LoanTransactionProcessingService 
loadTransactionProcessingService;
     private final LoanBalanceService loanBalanceService;
     private final LoanCapitalizedIncomeBalanceRepository 
loanCapitalizedIncomeBalanceRepository;
+    private final LoanBuyDownFeeBalanceRepository 
loanBuyDownFeeBalanceRepository;
 
     @Override
     public LoanAccountData retrieveOne(final Long loanId) {
@@ -503,6 +506,16 @@ public class LoanReadPlatformServiceImpl implements 
LoanReadPlatformService, Loa
                         LoanEnumerations.transactionType(transactionType), 
DateUtils.getBusinessLocalDate(), transactionAmount,
                         paymentOptions, retriveLoanCurrencyData(loanId));
             break;
+            case BUY_DOWN_FEE_ADJUSTMENT:
+                final LoanBuyDownFeeBalance loanBuyDownFeeBalance = 
loanBuyDownFeeBalanceRepository.findByLoanIdAndLoanTransactionId(loanId,
+                        transactionId);
+
+                transactionAmount = (loanBuyDownFeeBalance == null) ? 
BigDecimal.ZERO
+                        : 
loanBuyDownFeeBalance.getAmount().subtract(MathUtil.nullToZero(loanBuyDownFeeBalance.getAmountAdjustment()));
+                loanTransactionData = 
LoanTransactionData.loanTransactionDataForCreditTemplate(
+                        LoanEnumerations.transactionType(transactionType), 
DateUtils.getBusinessLocalDate(), transactionAmount,
+                        paymentOptions, retriveLoanCurrencyData(loanId));
+            break;
             default:
                 loanTransactionData = 
LoanTransactionData.templateOnTop(retrieveLoanTransactionTemplate(loanId),
                         LoanEnumerations.transactionType(transactionType));
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 1f94fa781c..00609a9999 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
@@ -88,7 +88,7 @@ import 
org.apache.fineract.portfolio.loanaccount.mapper.LoanChargeMapper;
 import 
org.apache.fineract.portfolio.loanaccount.mapper.LoanCollateralManagementMapper;
 import org.apache.fineract.portfolio.loanaccount.mapper.LoanMapper;
 import org.apache.fineract.portfolio.loanaccount.mapper.LoanTransactionMapper;
-import 
org.apache.fineract.portfolio.loanaccount.repository.LoanBuyDownFeesBalanceRepository;
+import 
org.apache.fineract.portfolio.loanaccount.repository.LoanBuyDownFeeBalanceRepository;
 import 
org.apache.fineract.portfolio.loanaccount.repository.LoanCapitalizedIncomeBalanceRepository;
 import 
org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanTermVariationsRepository;
 import 
org.apache.fineract.portfolio.loanaccount.serialization.LoanApplicationTransitionValidator;
@@ -339,7 +339,8 @@ public class LoanAccountConfiguration {
             LoanChargePaidByReadService loanChargePaidByReadService, 
LoanTransactionRelationReadService loanTransactionRelationReadService,
             LoanForeclosureValidator loanForeclosureValidator, 
LoanTransactionMapper loanTransactionMapper,
             LoanTransactionProcessingService loanTransactionProcessingService, 
LoanBalanceService loanBalanceService,
-            LoanCapitalizedIncomeBalanceRepository 
loanCapitalizedIncomeBalanceRepository) {
+            LoanCapitalizedIncomeBalanceRepository 
loanCapitalizedIncomeBalanceRepository,
+            LoanBuyDownFeeBalanceRepository loanBuyDownFeeBalanceRepository) {
         return new LoanReadPlatformServiceImpl(jdbcTemplate, context, 
loanRepositoryWrapper, applicationCurrencyRepository,
                 loanProductReadPlatformService, clientReadPlatformService, 
groupReadPlatformService, loanDropdownReadPlatformService,
                 fundReadPlatformService, chargeReadPlatformService, 
codeValueReadPlatformService, calendarReadPlatformService,
@@ -347,7 +348,7 @@ public class LoanAccountConfiguration {
                 loanUtilService, configurationDomainService, 
accountDetailsReadPlatformService, columnValidator, sqlGenerator,
                 delinquencyReadPlatformService, loanTransactionRepository, 
loanChargePaidByReadService, loanTransactionRelationReadService,
                 loanForeclosureValidator, loanTransactionMapper, 
loanTransactionProcessingService, loanBalanceService,
-                loanCapitalizedIncomeBalanceRepository);
+                loanCapitalizedIncomeBalanceRepository, 
loanBuyDownFeeBalanceRepository);
     }
 
     @Bean
@@ -383,12 +384,12 @@ public class LoanAccountConfiguration {
             LoanAssembler loanAssembler, LoanTransactionRepository 
loanTransactionRepository,
             PaymentDetailWritePlatformService 
paymentDetailWritePlatformService, LoanJournalEntryPoster 
loanJournalEntryPoster,
             NoteWritePlatformService noteWritePlatformService, 
ExternalIdFactory externalIdFactory,
-            LoanBuyDownFeesBalanceRepository loanBuyDownFeesBalanceRepository,
+            LoanBuyDownFeeBalanceRepository loanBuyDownFeeBalanceRepository,
             ReprocessLoanTransactionsService reprocessLoanTransactionsService, 
LoanBalanceService loanBalanceService,
             LoanLifecycleStateMachine loanLifecycleStateMachine, 
BusinessEventNotifierService businessEventNotifierService) {
         return new 
BuyDownFeeWritePlatformServiceImpl(loanTransactionValidator, loanAssembler, 
loanTransactionRepository,
                 paymentDetailWritePlatformService, loanJournalEntryPoster, 
noteWritePlatformService, externalIdFactory,
-                loanBuyDownFeesBalanceRepository, 
reprocessLoanTransactionsService, loanBalanceService, loanLifecycleStateMachine,
+                loanBuyDownFeeBalanceRepository, 
reprocessLoanTransactionsService, loanBalanceService, loanLifecycleStateMachine,
                 businessEventNotifierService);
     }
 
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 838ad1180a..16db6e0e90 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
@@ -43,6 +43,8 @@ public class LoanTransactionTest extends 
BaseLoanIntegrationTest {
 
     private final String capitalizedIncomeCommand = "capitalizedIncome";
     private final String capitalizedIncomeAdjustmentCommand = 
"capitalizedIncomeAdjustment";
+    private final String buyDownFeeCommand = "buyDownFee";
+    private final String buyDownFeeAdjustmentCommand = "buyDownFeeAdjustment";
 
     @Test
     public void testGetLoanTransactionsFiltering() {
@@ -166,4 +168,44 @@ public class LoanTransactionTest extends 
BaseLoanIntegrationTest {
         });
     }
 
+    @Test
+    public void testGetLoanTransactionTemplateForBuyDownFeeAdjustment() {
+        final PostClientsResponse client = 
clientHelper.createClient(ClientHelper.defaultClientCreationRequest());
+
+        final PostLoanProductsResponse loanProductsResponse = 
loanProductHelper.createLoanProduct(create4IProgressive()
+                
.enableBuyDownFee(true).buyDownFeeStrategy(PostLoanProductsRequest.BuyDownFeeStrategyEnum.EQUAL_AMORTIZATION)//
+                
.buyDownFeeCalculationType(PostLoanProductsRequest.BuyDownFeeCalculationTypeEnum.FLAT)//
+                
.buyDownFeeIncomeType(PostLoanProductsRequest.BuyDownFeeIncomeTypeEnum.INTEREST)//
+                
.deferredIncomeLiabilityAccountId(deferredIncomeLiabilityAccount.getAccountID().longValue())
 //
+                
.incomeFromCapitalizationAccountId(feeIncomeAccount.getAccountID().longValue()) 
//
+                
.capitalizedIncomeType(PostLoanProductsRequest.CapitalizedIncomeTypeEnum.FEE) //
+                
.buyDownExpenseAccountId(buyDownExpenseAccount.getAccountID().longValue())//
+                
.incomeFromBuyDownAccountId(feeIncomeAccount.getAccountID().longValue()));
+
+        final String loanExternalIdStr = UUID.randomUUID().toString();
+
+        runAt("20 December 2024", () -> {
+            final Long loanId = 
applyAndApproveProgressiveLoan(client.getClientId(), 
loanProductsResponse.getResourceId(),
+                    "20 December 2024", 430.0, 7.0, 6, (request) -> 
request.externalId(loanExternalIdStr));
+
+            disburseLoan(loanId, BigDecimal.valueOf(230), "20 December 2024");
+
+            PostLoansLoanIdTransactionsResponse loanTransactionResponse = 
loanTransactionHelper.executeLoanTransaction(loanId,
+                    new 
PostLoansLoanIdTransactionsRequest().dateFormat(DATETIME_PATTERN).transactionDate("20
 December 2024").locale("en")
+                            .transactionAmount(150.0),
+                    buyDownFeeCommand);
+            assertNotNull(loanTransactionResponse);
+            final Long transactionId = loanTransactionResponse.getResourceId();
+            assertNotNull(transactionId);
+            log.info("Loan Id {} with transaction id {}", loanId, 
transactionId);
+
+            final GetLoansLoanIdTransactionsTemplateResponse 
transactionTemplate = loanTransactionHelper.retrieveTransactionTemplate(loanId,
+                    buyDownFeeAdjustmentCommand, null, null, null, 
transactionId);
+
+            assertNotNull(transactionTemplate);
+            assertEquals("loanTransactionType." + buyDownFeeAdjustmentCommand, 
transactionTemplate.getType().getCode());
+            assertEquals(transactionTemplate.getAmount(), 150);
+        });
+    }
+
 }

Reply via email to