From 0a9fb0fe53354f4aec4df02be6bf2bbf172cc29a Mon Sep 17 00:00:00 2001 From: Jose Alberto Hernandez Date: Wed, 1 Oct 2025 17:58:49 -0500 Subject: [PATCH] FINERACT-2358: Advanced accounting rules based on write-off reason --- ...ToGLAccountMappingReadPlatformService.java | 7 ++- ...AccountMappingReadPlatformServiceImpl.java | 53 ++++++++----------- ... AdvancedMappingToExpenseAccountData.java} | 4 +- ...WriteOffReasonsToExpenseAccountMapper.java | 36 ------------- .../api/LoanProductsApiResourceSwagger.java | 20 +------ .../loanproduct/data/LoanProductData.java | 21 ++++---- .../api/LoanProductsApiResource.java | 7 ++- ...oanProductChargeOffReasonMappingsTest.java | 4 +- .../integrationtests/LoanProductTest.java | 9 ++-- 9 files changed, 50 insertions(+), 111 deletions(-) rename fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/{ChargeOffReasonToGLAccountMapper.java => AdvancedMappingToExpenseAccountData.java} (91%) delete mode 100644 fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/WriteOffReasonsToExpenseAccountMapper.java diff --git a/fineract-accounting/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/ProductToGLAccountMappingReadPlatformService.java b/fineract-accounting/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/ProductToGLAccountMappingReadPlatformService.java index d7af51f08cf..1cfba6559ff 100644 --- a/fineract-accounting/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/ProductToGLAccountMappingReadPlatformService.java +++ b/fineract-accounting/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/ProductToGLAccountMappingReadPlatformService.java @@ -21,11 +21,10 @@ import java.util.List; import java.util.Map; import org.apache.fineract.accounting.common.AccountingConstants.LoanProductAccountingParams; -import org.apache.fineract.accounting.producttoaccountmapping.data.ChargeOffReasonToGLAccountMapper; +import org.apache.fineract.accounting.producttoaccountmapping.data.AdvancedMappingToExpenseAccountData; import org.apache.fineract.accounting.producttoaccountmapping.data.ChargeToGLAccountMapper; import org.apache.fineract.accounting.producttoaccountmapping.data.ClassificationToGLAccountData; import org.apache.fineract.accounting.producttoaccountmapping.data.PaymentTypeToGLAccountMapper; -import org.apache.fineract.accounting.producttoaccountmapping.data.WriteOffReasonsToExpenseAccountMapper; public interface ProductToGLAccountMappingReadPlatformService { @@ -51,9 +50,9 @@ public interface ProductToGLAccountMappingReadPlatformService { List fetchFeeToIncomeAccountMappingsForShareProduct(Long productId); - List fetchChargeOffReasonMappingsForLoanProduct(Long loanProductId); + List fetchChargeOffReasonMappingsForLoanProduct(Long loanProductId); - List fetchWriteOffReasonMappingsForLoanProduct(Long loanProductId); + List fetchWriteOffReasonMappingsForLoanProduct(Long loanProductId); List fetchClassificationMappingsForLoanProduct(Long loanProductId, LoanProductAccountingParams classificationParameter); diff --git a/fineract-accounting/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/ProductToGLAccountMappingReadPlatformServiceImpl.java b/fineract-accounting/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/ProductToGLAccountMappingReadPlatformServiceImpl.java index 078b2b8104a..0e243f5f504 100644 --- a/fineract-accounting/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/ProductToGLAccountMappingReadPlatformServiceImpl.java +++ b/fineract-accounting/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/ProductToGLAccountMappingReadPlatformServiceImpl.java @@ -36,11 +36,10 @@ import org.apache.fineract.accounting.common.AccountingRuleType; import org.apache.fineract.accounting.common.AccountingValidations; import org.apache.fineract.accounting.glaccount.data.GLAccountData; -import org.apache.fineract.accounting.producttoaccountmapping.data.ChargeOffReasonToGLAccountMapper; +import org.apache.fineract.accounting.producttoaccountmapping.data.AdvancedMappingToExpenseAccountData; import org.apache.fineract.accounting.producttoaccountmapping.data.ChargeToGLAccountMapper; import org.apache.fineract.accounting.producttoaccountmapping.data.ClassificationToGLAccountData; import org.apache.fineract.accounting.producttoaccountmapping.data.PaymentTypeToGLAccountMapper; -import org.apache.fineract.accounting.producttoaccountmapping.data.WriteOffReasonsToExpenseAccountMapper; import org.apache.fineract.accounting.producttoaccountmapping.domain.ProductToGLAccountMapping; import org.apache.fineract.accounting.producttoaccountmapping.domain.ProductToGLAccountMappingRepository; import org.apache.fineract.infrastructure.codes.data.CodeValueData; @@ -275,39 +274,33 @@ private List fetchChargeToIncomeAccountMappings(final P return chargeToGLAccountMappers; } - private List fetchChargeOffReasonMappings(final PortfolioProductType portfolioProductType, + private List fetchChargeOffReasonMappings(final PortfolioProductType portfolioProductType, final Long loanProductId) { - final List mappings = productToGLAccountMappingRepository.findAllChargeOffReasonsMappings(loanProductId, - portfolioProductType.getValue()); - List chargeOffReasonToGLAccountMappers = mappings.isEmpty() ? null : new ArrayList<>(); - for (final ProductToGLAccountMapping mapping : mappings) { - final Long glAccountId = mapping.getGlAccount().getId(); - final String glAccountName = mapping.getGlAccount().getName(); - final String glCode = mapping.getGlAccount().getGlCode(); - final GLAccountData chargeOffExpenseAccount = new GLAccountData().setId(glAccountId).setName(glAccountName).setGlCode(glCode); - final CodeValueData chargeOffReasonsCodeValue = codeValueMapper.map(mapping.getChargeOffReason()); - - final ChargeOffReasonToGLAccountMapper chargeOffReasonToGLAccountMapper = new ChargeOffReasonToGLAccountMapper() - .setChargeOffReasonCodeValue(chargeOffReasonsCodeValue).setExpenseAccount(chargeOffExpenseAccount); - chargeOffReasonToGLAccountMappers.add(chargeOffReasonToGLAccountMapper); - } - return chargeOffReasonToGLAccountMappers; + return fetchAdvancedMappingToExpenseAccountData( + productToGLAccountMappingRepository.findAllChargeOffReasonsMappings(loanProductId, portfolioProductType.getValue())); } - private List fetchWriteOffReasonMappings(final PortfolioProductType portfolioProductType, + private List fetchWriteOffReasonMappings(final PortfolioProductType portfolioProductType, final Long loanProductId) { - final List mappings = productToGLAccountMappingRepository.findAllWriteOffReasonsMappings(loanProductId, - portfolioProductType.getValue()); - List writeOffReasonsToExpenseAccountMappers = mappings.isEmpty() ? null : new ArrayList<>(); + return fetchAdvancedMappingToExpenseAccountData( + productToGLAccountMappingRepository.findAllWriteOffReasonsMappings(loanProductId, portfolioProductType.getValue())); + } + + private List fetchAdvancedMappingToExpenseAccountData( + final List mappings) { + List advancedMappingToExpenseAccountData = mappings.isEmpty() ? null : new ArrayList<>(); for (final ProductToGLAccountMapping mapping : mappings) { - final String glCode = String.valueOf(mapping.getGlAccount().getId()); - final String writeOffReasonId = String.valueOf(mapping.getWriteOffReason().getId()); + final Long glAccountId = mapping.getGlAccount().getId(); + final String glAccountName = mapping.getGlAccount().getName(); + final String glCode = mapping.getGlAccount().getGlCode(); + final GLAccountData expenseAccount = new GLAccountData().setId(glAccountId).setName(glAccountName).setGlCode(glCode); + final CodeValueData codeValue = (mapping.getChargeOffReason() != null) ? codeValueMapper.map(mapping.getChargeOffReason()) + : codeValueMapper.map(mapping.getWriteOffReason()); - final WriteOffReasonsToExpenseAccountMapper writeOffReasonToGLAccountMapper = new WriteOffReasonsToExpenseAccountMapper() - .setWriteOffReasonCodeValueId(writeOffReasonId).setExpenseAccountId(glCode); - writeOffReasonsToExpenseAccountMappers.add(writeOffReasonToGLAccountMapper); + advancedMappingToExpenseAccountData + .add(new AdvancedMappingToExpenseAccountData().setReasonCodeValue(codeValue).setExpenseAccount(expenseAccount)); } - return writeOffReasonsToExpenseAccountMappers; + return advancedMappingToExpenseAccountData; } private List fetchClassificationMappings(final PortfolioProductType portfolioProductType, @@ -380,12 +373,12 @@ public List fetchFeeToIncomeAccountMappingsForShareProd } @Override - public List fetchChargeOffReasonMappingsForLoanProduct(Long loanProductId) { + public List fetchChargeOffReasonMappingsForLoanProduct(Long loanProductId) { return fetchChargeOffReasonMappings(PortfolioProductType.LOAN, loanProductId); } @Override - public List fetchWriteOffReasonMappingsForLoanProduct(Long loanProductId) { + public List fetchWriteOffReasonMappingsForLoanProduct(Long loanProductId) { return fetchWriteOffReasonMappings(PortfolioProductType.LOAN, loanProductId); } diff --git a/fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/ChargeOffReasonToGLAccountMapper.java b/fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/AdvancedMappingToExpenseAccountData.java similarity index 91% rename from fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/ChargeOffReasonToGLAccountMapper.java rename to fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/AdvancedMappingToExpenseAccountData.java index 05f61f5b492..0bfa3ca1ba5 100644 --- a/fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/ChargeOffReasonToGLAccountMapper.java +++ b/fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/AdvancedMappingToExpenseAccountData.java @@ -28,9 +28,9 @@ @Data @NoArgsConstructor @Accessors(chain = true) -public class ChargeOffReasonToGLAccountMapper implements Serializable { +public class AdvancedMappingToExpenseAccountData implements Serializable { private static final long serialVersionUID = 1L; - private CodeValueData chargeOffReasonCodeValue; + private CodeValueData reasonCodeValue; private GLAccountData expenseAccount; } diff --git a/fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/WriteOffReasonsToExpenseAccountMapper.java b/fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/WriteOffReasonsToExpenseAccountMapper.java deleted file mode 100644 index df49b8e1b7e..00000000000 --- a/fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/WriteOffReasonsToExpenseAccountMapper.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.fineract.accounting.producttoaccountmapping.data; - -import java.io.Serial; -import java.io.Serializable; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -@Data -@NoArgsConstructor -@Accessors(chain = true) -public class WriteOffReasonsToExpenseAccountMapper implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - private String writeOffReasonCodeValueId; - private String expenseAccountId; -} diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResourceSwagger.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResourceSwagger.java index 79c007bb597..7dc3a16c34d 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResourceSwagger.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResourceSwagger.java @@ -1346,25 +1346,9 @@ static final class GetChargeOffReasonToExpenseAccountMappings { private GetChargeOffReasonToExpenseAccountMappings() {} - public GetCodeValueData chargeOffReasonCodeValue; + public GetCodeValuesDataResponse reasonCodeValue; public GetGLAccountData expenseAccount; - static final class GetCodeValueData { - - private GetCodeValueData() {} - - @Schema(example = "1") - public Long id; - @Schema(example = "ChargeOffReasons") - public String name; - @Schema(example = "1") - public Integer position; - public String description; - @Schema(example = "true") - public Boolean active; - @Schema(example = "false") - public Boolean mandatory; - } } static final class GetLoanFeeToIncomeAccountMappings { @@ -1492,7 +1476,7 @@ private GetWriteOffReasonToExpenseAccountMappings() {} public Set paymentChannelToFundSourceMappings; public Set feeToIncomeAccountMappings; public List chargeOffReasonToExpenseAccountMappings; - public List writeOffReasonsToExpenseMappings; + public List writeOffReasonsToExpenseMappings; @Schema(example = "false") public Boolean isRatesEnabled; @Schema(example = "true") diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/data/LoanProductData.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/data/LoanProductData.java index 23066f3afc5..cb6edc56cc8 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/data/LoanProductData.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/data/LoanProductData.java @@ -30,11 +30,10 @@ import org.apache.fineract.accounting.common.AccountingEnumerations; import org.apache.fineract.accounting.common.AccountingRuleType; import org.apache.fineract.accounting.glaccount.data.GLAccountData; -import org.apache.fineract.accounting.producttoaccountmapping.data.ChargeOffReasonToGLAccountMapper; +import org.apache.fineract.accounting.producttoaccountmapping.data.AdvancedMappingToExpenseAccountData; import org.apache.fineract.accounting.producttoaccountmapping.data.ChargeToGLAccountMapper; import org.apache.fineract.accounting.producttoaccountmapping.data.ClassificationToGLAccountData; import org.apache.fineract.accounting.producttoaccountmapping.data.PaymentTypeToGLAccountMapper; -import org.apache.fineract.accounting.producttoaccountmapping.data.WriteOffReasonsToExpenseAccountMapper; import org.apache.fineract.infrastructure.codes.data.CodeValueData; import org.apache.fineract.infrastructure.core.api.ApiFacingEnum; import org.apache.fineract.infrastructure.core.data.EnumOptionData; @@ -164,9 +163,9 @@ public class LoanProductData implements Serializable { private Collection paymentChannelToFundSourceMappings; private Collection feeToIncomeAccountMappings; private Collection penaltyToIncomeAccountMappings; - private List chargeOffReasonToExpenseAccountMappings; + private List chargeOffReasonToExpenseAccountMappings; private final boolean enableAccrualActivityPosting; - private List writeOffReasonsToExpenseMappings; + private List writeOffReasonsToExpenseMappings; private final List writeOffReasonOptions; // rates private final boolean isRatesEnabled; @@ -381,7 +380,7 @@ public static LoanProductData lookup(final Long id, final String name, final Boo final StringEnumOptionData buyDownFeeStrategy = null; final StringEnumOptionData buyDownFeeIncomeType = null; final boolean merchantBuyDownFee = false; - final List writeOffReasonsToExpenseMappings = null; + final List writeOffReasonsToExpenseMappings = null; final List writeOffReasonOptions = null; return new LoanProductData(id, name, shortName, description, currency, principal, minPrincipal, maxPrincipal, tolerance, @@ -521,7 +520,7 @@ public static LoanProductData lookupWithCurrency(final Long id, final String nam final StringEnumOptionData buyDownFeeStrategy = null; final StringEnumOptionData buyDownFeeIncomeType = null; final boolean merchantBuyDownFee = false; - final List writeOffReasonsToExpenseMappings = null; + final List writeOffReasonsToExpenseMappings = null; final List writeOffReasonOptions = null; return new LoanProductData(id, name, shortName, description, currency, principal, minPrincipal, maxPrincipal, tolerance, @@ -668,7 +667,7 @@ public static LoanProductData sensibleDefaultsForNewLoanProductCreation() { final StringEnumOptionData buyDownFeeStrategy = null; final StringEnumOptionData buyDownFeeIncomeType = null; final boolean merchantBuyDownFee = false; - final List writeOffReasonsToExpenseMappings = null; + final List writeOffReasonsToExpenseMappings = null; final List writeOffReasonOptions = null; return new LoanProductData(id, name, shortName, description, currency, principal, minPrincipal, maxPrincipal, tolerance, @@ -809,7 +808,7 @@ public static LoanProductData loanProductWithFloatingRates(final Long id, final final StringEnumOptionData buyDownFeeStrategy = null; final StringEnumOptionData buyDownFeeIncomeType = null; final boolean merchantBuyDownFee = false; - final List writeOffReasonsToExpenseMappings = null; + final List writeOffReasonsToExpenseMappings = null; final List writeOffReasonOptions = null; return new LoanProductData(id, name, shortName, description, currency, principal, minPrincipal, maxPrincipal, tolerance, @@ -842,8 +841,8 @@ public static LoanProductData withAccountingDetails(final LoanProductData produc final Collection paymentChannelToFundSourceMappings, final Collection feeToGLAccountMappings, final Collection penaltyToGLAccountMappings, - final List chargeOffReasonToGLAccountMappings, - final List writeOffReasonToGLAccountMappings, + final List chargeOffReasonToGLAccountMappings, + final List writeOffReasonToGLAccountMappings, final List capitalizedIncomeClassificationToIncomeAccountMappings, final List buydownFeeClassificationToIncomeAccountMappings) { productData.accountingMappings = accountingMappings; @@ -901,7 +900,7 @@ public LoanProductData(final Long id, final String name, final String shortName, final StringEnumOptionData capitalizedIncomeType, final boolean enableBuyDownFee, final StringEnumOptionData buyDownFeeCalculationType, final StringEnumOptionData buyDownFeeStrategy, final StringEnumOptionData buyDownFeeIncomeType, final boolean merchantBuyDownFee, - final List writeOffReasonsToExpenseMappings, + final List writeOffReasonsToExpenseMappings, final List writeOffReasonOptions) { this.id = id; this.name = name; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResource.java index 70afeda88ec..a81a775506c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResource.java @@ -49,11 +49,10 @@ import org.apache.fineract.accounting.common.AccountingConstants.LoanProductAccountingParams; import org.apache.fineract.accounting.common.AccountingDropdownReadPlatformService; import org.apache.fineract.accounting.glaccount.data.GLAccountData; -import org.apache.fineract.accounting.producttoaccountmapping.data.ChargeOffReasonToGLAccountMapper; +import org.apache.fineract.accounting.producttoaccountmapping.data.AdvancedMappingToExpenseAccountData; import org.apache.fineract.accounting.producttoaccountmapping.data.ChargeToGLAccountMapper; import org.apache.fineract.accounting.producttoaccountmapping.data.ClassificationToGLAccountData; import org.apache.fineract.accounting.producttoaccountmapping.data.PaymentTypeToGLAccountMapper; -import org.apache.fineract.accounting.producttoaccountmapping.data.WriteOffReasonsToExpenseAccountMapper; import org.apache.fineract.accounting.producttoaccountmapping.service.ProductToGLAccountMappingReadPlatformService; import org.apache.fineract.commands.domain.CommandWrapper; import org.apache.fineract.commands.service.CommandWrapperBuilder; @@ -355,8 +354,8 @@ private String getLoanProductDetails(Long productId, UriInfo uriInfo) { Collection paymentChannelToFundSourceMappings; Collection feeToGLAccountMappings; Collection penaltyToGLAccountMappings; - List chargeOffReasonToGLAccountMappings; - List writeOffReasonsToExpenseAccountMappings; + List chargeOffReasonToGLAccountMappings; + List writeOffReasonsToExpenseAccountMappings; List capitalizedIncomeClassificationToGLAccountMappings; List buydowFeeClassificationToGLAccountMappings; if (loanProduct.hasAccountingEnabled()) { diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanProductChargeOffReasonMappingsTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanProductChargeOffReasonMappingsTest.java index ffd257a1831..73b525a0511 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanProductChargeOffReasonMappingsTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanProductChargeOffReasonMappingsTest.java @@ -60,7 +60,7 @@ public void testCreateAndUpdateLoanProductWithValidChargeOffReason() { Assertions.assertEquals(expenseAccount.getAccountID().longValue(), loanProductDetails.getChargeOffReasonToExpenseAccountMappings().get(0).getExpenseAccount().getId()); Assertions.assertEquals(Long.valueOf(chargeOffReasons), - loanProductDetails.getChargeOffReasonToExpenseAccountMappings().get(0).getChargeOffReasonCodeValue().getId()); + loanProductDetails.getChargeOffReasonToExpenseAccountMappings().get(0).getReasonCodeValue().getId()); List chargeOffReasonToExpenseAccountMappings = createPostChargeOffReasonToExpenseAccountMappings( Long.valueOf(chargeOffReasons), otherExpenseAccount.getAccountID().longValue()); @@ -72,7 +72,7 @@ public void testCreateAndUpdateLoanProductWithValidChargeOffReason() { Assertions.assertEquals(otherExpenseAccount.getAccountID().longValue(), loanProductDetails.getChargeOffReasonToExpenseAccountMappings().get(0).getExpenseAccount().getId()); Assertions.assertEquals(Long.valueOf(chargeOffReasons), - loanProductDetails.getChargeOffReasonToExpenseAccountMappings().get(0).getChargeOffReasonCodeValue().getId()); + loanProductDetails.getChargeOffReasonToExpenseAccountMappings().get(0).getReasonCodeValue().getId()); }); } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanProductTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanProductTest.java index 060da1bc635..66574a46ce4 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanProductTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanProductTest.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Objects; import lombok.extern.slf4j.Slf4j; +import org.apache.fineract.client.models.GetChargeOffReasonToExpenseAccountMappings; import org.apache.fineract.client.models.GetLoanProductsProductIdResponse; import org.apache.fineract.client.models.GetLoanProductsTemplateResponse; import org.apache.fineract.client.models.GetLoanProductsWriteOffReasonOptions; @@ -546,14 +547,14 @@ public void testWriteOffReasonsToExpenseMappings() { // Verify that get loan product API has the corresponding fields GetLoanProductsProductIdResponse getLoanProductsProductIdResponse = loanProductHelper.retrieveLoanProductById(loanProductId); - List writeOffReasonToExpenseAccountMappings = getLoanProductsProductIdResponse + List writeOffReasonToExpenseAccountMappings = getLoanProductsProductIdResponse .getWriteOffReasonsToExpenseMappings(); Assertions.assertNotNull(writeOffReasonToExpenseAccountMappings); Assertions.assertEquals(1, writeOffReasonToExpenseAccountMappings.size()); - PostWriteOffReasonToExpenseAccountMappings writeOffMapping = writeOffReasonToExpenseAccountMappings.getFirst(); + GetChargeOffReasonToExpenseAccountMappings writeOffMapping = writeOffReasonToExpenseAccountMappings.getFirst(); Assertions.assertNotNull(writeOffMapping); - Assertions.assertEquals(expenseAccountId, writeOffMapping.getExpenseAccountId()); - Assertions.assertEquals(reasonCodeId, writeOffMapping.getWriteOffReasonCodeValueId()); + Assertions.assertEquals(expenseAccountId, writeOffMapping.getExpenseAccount().getId().toString()); + Assertions.assertEquals(reasonCodeId, writeOffMapping.getReasonCodeValue().getId().toString()); List writeOffReasonOptionsResultNonTemplate = getLoanProductsProductIdResponse .getWriteOffReasonOptions();