Skip to content

Commit c518d86

Browse files
Jose Alberto Hernandezgalovics
authored andcommitted
FINERACT-2358: Advanced accounting rules based on write-off reason
1 parent bef931c commit c518d86

File tree

9 files changed

+50
-111
lines changed

9 files changed

+50
-111
lines changed

fineract-accounting/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/ProductToGLAccountMappingReadPlatformService.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,10 @@
2121
import java.util.List;
2222
import java.util.Map;
2323
import org.apache.fineract.accounting.common.AccountingConstants.LoanProductAccountingParams;
24-
import org.apache.fineract.accounting.producttoaccountmapping.data.ChargeOffReasonToGLAccountMapper;
24+
import org.apache.fineract.accounting.producttoaccountmapping.data.AdvancedMappingToExpenseAccountData;
2525
import org.apache.fineract.accounting.producttoaccountmapping.data.ChargeToGLAccountMapper;
2626
import org.apache.fineract.accounting.producttoaccountmapping.data.ClassificationToGLAccountData;
2727
import org.apache.fineract.accounting.producttoaccountmapping.data.PaymentTypeToGLAccountMapper;
28-
import org.apache.fineract.accounting.producttoaccountmapping.data.WriteOffReasonsToExpenseAccountMapper;
2928

3029
public interface ProductToGLAccountMappingReadPlatformService {
3130

@@ -51,9 +50,9 @@ public interface ProductToGLAccountMappingReadPlatformService {
5150

5251
List<ChargeToGLAccountMapper> fetchFeeToIncomeAccountMappingsForShareProduct(Long productId);
5352

54-
List<ChargeOffReasonToGLAccountMapper> fetchChargeOffReasonMappingsForLoanProduct(Long loanProductId);
53+
List<AdvancedMappingToExpenseAccountData> fetchChargeOffReasonMappingsForLoanProduct(Long loanProductId);
5554

56-
List<WriteOffReasonsToExpenseAccountMapper> fetchWriteOffReasonMappingsForLoanProduct(Long loanProductId);
55+
List<AdvancedMappingToExpenseAccountData> fetchWriteOffReasonMappingsForLoanProduct(Long loanProductId);
5756

5857
List<ClassificationToGLAccountData> fetchClassificationMappingsForLoanProduct(Long loanProductId,
5958
LoanProductAccountingParams classificationParameter);

fineract-accounting/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/ProductToGLAccountMappingReadPlatformServiceImpl.java

Lines changed: 23 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,10 @@
3636
import org.apache.fineract.accounting.common.AccountingRuleType;
3737
import org.apache.fineract.accounting.common.AccountingValidations;
3838
import org.apache.fineract.accounting.glaccount.data.GLAccountData;
39-
import org.apache.fineract.accounting.producttoaccountmapping.data.ChargeOffReasonToGLAccountMapper;
39+
import org.apache.fineract.accounting.producttoaccountmapping.data.AdvancedMappingToExpenseAccountData;
4040
import org.apache.fineract.accounting.producttoaccountmapping.data.ChargeToGLAccountMapper;
4141
import org.apache.fineract.accounting.producttoaccountmapping.data.ClassificationToGLAccountData;
4242
import org.apache.fineract.accounting.producttoaccountmapping.data.PaymentTypeToGLAccountMapper;
43-
import org.apache.fineract.accounting.producttoaccountmapping.data.WriteOffReasonsToExpenseAccountMapper;
4443
import org.apache.fineract.accounting.producttoaccountmapping.domain.ProductToGLAccountMapping;
4544
import org.apache.fineract.accounting.producttoaccountmapping.domain.ProductToGLAccountMappingRepository;
4645
import org.apache.fineract.infrastructure.codes.data.CodeValueData;
@@ -275,39 +274,33 @@ private List<ChargeToGLAccountMapper> fetchChargeToIncomeAccountMappings(final P
275274
return chargeToGLAccountMappers;
276275
}
277276

278-
private List<ChargeOffReasonToGLAccountMapper> fetchChargeOffReasonMappings(final PortfolioProductType portfolioProductType,
277+
private List<AdvancedMappingToExpenseAccountData> fetchChargeOffReasonMappings(final PortfolioProductType portfolioProductType,
279278
final Long loanProductId) {
280-
final List<ProductToGLAccountMapping> mappings = productToGLAccountMappingRepository.findAllChargeOffReasonsMappings(loanProductId,
281-
portfolioProductType.getValue());
282-
List<ChargeOffReasonToGLAccountMapper> chargeOffReasonToGLAccountMappers = mappings.isEmpty() ? null : new ArrayList<>();
283-
for (final ProductToGLAccountMapping mapping : mappings) {
284-
final Long glAccountId = mapping.getGlAccount().getId();
285-
final String glAccountName = mapping.getGlAccount().getName();
286-
final String glCode = mapping.getGlAccount().getGlCode();
287-
final GLAccountData chargeOffExpenseAccount = new GLAccountData().setId(glAccountId).setName(glAccountName).setGlCode(glCode);
288-
final CodeValueData chargeOffReasonsCodeValue = codeValueMapper.map(mapping.getChargeOffReason());
289-
290-
final ChargeOffReasonToGLAccountMapper chargeOffReasonToGLAccountMapper = new ChargeOffReasonToGLAccountMapper()
291-
.setChargeOffReasonCodeValue(chargeOffReasonsCodeValue).setExpenseAccount(chargeOffExpenseAccount);
292-
chargeOffReasonToGLAccountMappers.add(chargeOffReasonToGLAccountMapper);
293-
}
294-
return chargeOffReasonToGLAccountMappers;
279+
return fetchAdvancedMappingToExpenseAccountData(
280+
productToGLAccountMappingRepository.findAllChargeOffReasonsMappings(loanProductId, portfolioProductType.getValue()));
295281
}
296282

297-
private List<WriteOffReasonsToExpenseAccountMapper> fetchWriteOffReasonMappings(final PortfolioProductType portfolioProductType,
283+
private List<AdvancedMappingToExpenseAccountData> fetchWriteOffReasonMappings(final PortfolioProductType portfolioProductType,
298284
final Long loanProductId) {
299-
final List<ProductToGLAccountMapping> mappings = productToGLAccountMappingRepository.findAllWriteOffReasonsMappings(loanProductId,
300-
portfolioProductType.getValue());
301-
List<WriteOffReasonsToExpenseAccountMapper> writeOffReasonsToExpenseAccountMappers = mappings.isEmpty() ? null : new ArrayList<>();
285+
return fetchAdvancedMappingToExpenseAccountData(
286+
productToGLAccountMappingRepository.findAllWriteOffReasonsMappings(loanProductId, portfolioProductType.getValue()));
287+
}
288+
289+
private List<AdvancedMappingToExpenseAccountData> fetchAdvancedMappingToExpenseAccountData(
290+
final List<ProductToGLAccountMapping> mappings) {
291+
List<AdvancedMappingToExpenseAccountData> advancedMappingToExpenseAccountData = mappings.isEmpty() ? null : new ArrayList<>();
302292
for (final ProductToGLAccountMapping mapping : mappings) {
303-
final String glCode = String.valueOf(mapping.getGlAccount().getId());
304-
final String writeOffReasonId = String.valueOf(mapping.getWriteOffReason().getId());
293+
final Long glAccountId = mapping.getGlAccount().getId();
294+
final String glAccountName = mapping.getGlAccount().getName();
295+
final String glCode = mapping.getGlAccount().getGlCode();
296+
final GLAccountData expenseAccount = new GLAccountData().setId(glAccountId).setName(glAccountName).setGlCode(glCode);
297+
final CodeValueData codeValue = (mapping.getChargeOffReason() != null) ? codeValueMapper.map(mapping.getChargeOffReason())
298+
: codeValueMapper.map(mapping.getWriteOffReason());
305299

306-
final WriteOffReasonsToExpenseAccountMapper writeOffReasonToGLAccountMapper = new WriteOffReasonsToExpenseAccountMapper()
307-
.setWriteOffReasonCodeValueId(writeOffReasonId).setExpenseAccountId(glCode);
308-
writeOffReasonsToExpenseAccountMappers.add(writeOffReasonToGLAccountMapper);
300+
advancedMappingToExpenseAccountData
301+
.add(new AdvancedMappingToExpenseAccountData().setReasonCodeValue(codeValue).setExpenseAccount(expenseAccount));
309302
}
310-
return writeOffReasonsToExpenseAccountMappers;
303+
return advancedMappingToExpenseAccountData;
311304
}
312305

313306
private List<ClassificationToGLAccountData> fetchClassificationMappings(final PortfolioProductType portfolioProductType,
@@ -380,12 +373,12 @@ public List<ChargeToGLAccountMapper> fetchFeeToIncomeAccountMappingsForShareProd
380373
}
381374

382375
@Override
383-
public List<ChargeOffReasonToGLAccountMapper> fetchChargeOffReasonMappingsForLoanProduct(Long loanProductId) {
376+
public List<AdvancedMappingToExpenseAccountData> fetchChargeOffReasonMappingsForLoanProduct(Long loanProductId) {
384377
return fetchChargeOffReasonMappings(PortfolioProductType.LOAN, loanProductId);
385378
}
386379

387380
@Override
388-
public List<WriteOffReasonsToExpenseAccountMapper> fetchWriteOffReasonMappingsForLoanProduct(Long loanProductId) {
381+
public List<AdvancedMappingToExpenseAccountData> fetchWriteOffReasonMappingsForLoanProduct(Long loanProductId) {
389382
return fetchWriteOffReasonMappings(PortfolioProductType.LOAN, loanProductId);
390383
}
391384

fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/ChargeOffReasonToGLAccountMapper.java renamed to fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/AdvancedMappingToExpenseAccountData.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@
2828
@Data
2929
@NoArgsConstructor
3030
@Accessors(chain = true)
31-
public class ChargeOffReasonToGLAccountMapper implements Serializable {
31+
public class AdvancedMappingToExpenseAccountData implements Serializable {
3232

3333
private static final long serialVersionUID = 1L;
34-
private CodeValueData chargeOffReasonCodeValue;
34+
private CodeValueData reasonCodeValue;
3535
private GLAccountData expenseAccount;
3636
}

fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/WriteOffReasonsToExpenseAccountMapper.java

Lines changed: 0 additions & 36 deletions
This file was deleted.

fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResourceSwagger.java

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1346,25 +1346,9 @@ static final class GetChargeOffReasonToExpenseAccountMappings {
13461346

13471347
private GetChargeOffReasonToExpenseAccountMappings() {}
13481348

1349-
public GetCodeValueData chargeOffReasonCodeValue;
1349+
public GetCodeValuesDataResponse reasonCodeValue;
13501350
public GetGLAccountData expenseAccount;
13511351

1352-
static final class GetCodeValueData {
1353-
1354-
private GetCodeValueData() {}
1355-
1356-
@Schema(example = "1")
1357-
public Long id;
1358-
@Schema(example = "ChargeOffReasons")
1359-
public String name;
1360-
@Schema(example = "1")
1361-
public Integer position;
1362-
public String description;
1363-
@Schema(example = "true")
1364-
public Boolean active;
1365-
@Schema(example = "false")
1366-
public Boolean mandatory;
1367-
}
13681352
}
13691353

13701354
static final class GetLoanFeeToIncomeAccountMappings {
@@ -1492,7 +1476,7 @@ private GetWriteOffReasonToExpenseAccountMappings() {}
14921476
public Set<GetLoanPaymentChannelToFundSourceMappings> paymentChannelToFundSourceMappings;
14931477
public Set<GetLoanFeeToIncomeAccountMappings> feeToIncomeAccountMappings;
14941478
public List<GetChargeOffReasonToExpenseAccountMappings> chargeOffReasonToExpenseAccountMappings;
1495-
public List<PostLoanProductsRequest.PostWriteOffReasonToExpenseAccountMappings> writeOffReasonsToExpenseMappings;
1479+
public List<GetChargeOffReasonToExpenseAccountMappings> writeOffReasonsToExpenseMappings;
14961480
@Schema(example = "false")
14971481
public Boolean isRatesEnabled;
14981482
@Schema(example = "true")

fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/data/LoanProductData.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,10 @@
3030
import org.apache.fineract.accounting.common.AccountingEnumerations;
3131
import org.apache.fineract.accounting.common.AccountingRuleType;
3232
import org.apache.fineract.accounting.glaccount.data.GLAccountData;
33-
import org.apache.fineract.accounting.producttoaccountmapping.data.ChargeOffReasonToGLAccountMapper;
33+
import org.apache.fineract.accounting.producttoaccountmapping.data.AdvancedMappingToExpenseAccountData;
3434
import org.apache.fineract.accounting.producttoaccountmapping.data.ChargeToGLAccountMapper;
3535
import org.apache.fineract.accounting.producttoaccountmapping.data.ClassificationToGLAccountData;
3636
import org.apache.fineract.accounting.producttoaccountmapping.data.PaymentTypeToGLAccountMapper;
37-
import org.apache.fineract.accounting.producttoaccountmapping.data.WriteOffReasonsToExpenseAccountMapper;
3837
import org.apache.fineract.infrastructure.codes.data.CodeValueData;
3938
import org.apache.fineract.infrastructure.core.api.ApiFacingEnum;
4039
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
@@ -164,9 +163,9 @@ public class LoanProductData implements Serializable {
164163
private Collection<PaymentTypeToGLAccountMapper> paymentChannelToFundSourceMappings;
165164
private Collection<ChargeToGLAccountMapper> feeToIncomeAccountMappings;
166165
private Collection<ChargeToGLAccountMapper> penaltyToIncomeAccountMappings;
167-
private List<ChargeOffReasonToGLAccountMapper> chargeOffReasonToExpenseAccountMappings;
166+
private List<AdvancedMappingToExpenseAccountData> chargeOffReasonToExpenseAccountMappings;
168167
private final boolean enableAccrualActivityPosting;
169-
private List<WriteOffReasonsToExpenseAccountMapper> writeOffReasonsToExpenseMappings;
168+
private List<AdvancedMappingToExpenseAccountData> writeOffReasonsToExpenseMappings;
170169
private final List<CodeValueData> writeOffReasonOptions;
171170
// rates
172171
private final boolean isRatesEnabled;
@@ -381,7 +380,7 @@ public static LoanProductData lookup(final Long id, final String name, final Boo
381380
final StringEnumOptionData buyDownFeeStrategy = null;
382381
final StringEnumOptionData buyDownFeeIncomeType = null;
383382
final boolean merchantBuyDownFee = false;
384-
final List<WriteOffReasonsToExpenseAccountMapper> writeOffReasonsToExpenseMappings = null;
383+
final List<AdvancedMappingToExpenseAccountData> writeOffReasonsToExpenseMappings = null;
385384
final List<CodeValueData> writeOffReasonOptions = null;
386385

387386
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
521520
final StringEnumOptionData buyDownFeeStrategy = null;
522521
final StringEnumOptionData buyDownFeeIncomeType = null;
523522
final boolean merchantBuyDownFee = false;
524-
final List<WriteOffReasonsToExpenseAccountMapper> writeOffReasonsToExpenseMappings = null;
523+
final List<AdvancedMappingToExpenseAccountData> writeOffReasonsToExpenseMappings = null;
525524
final List<CodeValueData> writeOffReasonOptions = null;
526525

527526
return new LoanProductData(id, name, shortName, description, currency, principal, minPrincipal, maxPrincipal, tolerance,
@@ -668,7 +667,7 @@ public static LoanProductData sensibleDefaultsForNewLoanProductCreation() {
668667
final StringEnumOptionData buyDownFeeStrategy = null;
669668
final StringEnumOptionData buyDownFeeIncomeType = null;
670669
final boolean merchantBuyDownFee = false;
671-
final List<WriteOffReasonsToExpenseAccountMapper> writeOffReasonsToExpenseMappings = null;
670+
final List<AdvancedMappingToExpenseAccountData> writeOffReasonsToExpenseMappings = null;
672671
final List<CodeValueData> writeOffReasonOptions = null;
673672

674673
return new LoanProductData(id, name, shortName, description, currency, principal, minPrincipal, maxPrincipal, tolerance,
@@ -809,7 +808,7 @@ public static LoanProductData loanProductWithFloatingRates(final Long id, final
809808
final StringEnumOptionData buyDownFeeStrategy = null;
810809
final StringEnumOptionData buyDownFeeIncomeType = null;
811810
final boolean merchantBuyDownFee = false;
812-
final List<WriteOffReasonsToExpenseAccountMapper> writeOffReasonsToExpenseMappings = null;
811+
final List<AdvancedMappingToExpenseAccountData> writeOffReasonsToExpenseMappings = null;
813812
final List<CodeValueData> writeOffReasonOptions = null;
814813

815814
return new LoanProductData(id, name, shortName, description, currency, principal, minPrincipal, maxPrincipal, tolerance,
@@ -842,8 +841,8 @@ public static LoanProductData withAccountingDetails(final LoanProductData produc
842841
final Collection<PaymentTypeToGLAccountMapper> paymentChannelToFundSourceMappings,
843842
final Collection<ChargeToGLAccountMapper> feeToGLAccountMappings,
844843
final Collection<ChargeToGLAccountMapper> penaltyToGLAccountMappings,
845-
final List<ChargeOffReasonToGLAccountMapper> chargeOffReasonToGLAccountMappings,
846-
final List<WriteOffReasonsToExpenseAccountMapper> writeOffReasonToGLAccountMappings,
844+
final List<AdvancedMappingToExpenseAccountData> chargeOffReasonToGLAccountMappings,
845+
final List<AdvancedMappingToExpenseAccountData> writeOffReasonToGLAccountMappings,
847846
final List<ClassificationToGLAccountData> capitalizedIncomeClassificationToIncomeAccountMappings,
848847
final List<ClassificationToGLAccountData> buydownFeeClassificationToIncomeAccountMappings) {
849848
productData.accountingMappings = accountingMappings;
@@ -901,7 +900,7 @@ public LoanProductData(final Long id, final String name, final String shortName,
901900
final StringEnumOptionData capitalizedIncomeType, final boolean enableBuyDownFee,
902901
final StringEnumOptionData buyDownFeeCalculationType, final StringEnumOptionData buyDownFeeStrategy,
903902
final StringEnumOptionData buyDownFeeIncomeType, final boolean merchantBuyDownFee,
904-
final List<WriteOffReasonsToExpenseAccountMapper> writeOffReasonsToExpenseMappings,
903+
final List<AdvancedMappingToExpenseAccountData> writeOffReasonsToExpenseMappings,
905904
final List<CodeValueData> writeOffReasonOptions) {
906905
this.id = id;
907906
this.name = name;

fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResource.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,10 @@
4949
import org.apache.fineract.accounting.common.AccountingConstants.LoanProductAccountingParams;
5050
import org.apache.fineract.accounting.common.AccountingDropdownReadPlatformService;
5151
import org.apache.fineract.accounting.glaccount.data.GLAccountData;
52-
import org.apache.fineract.accounting.producttoaccountmapping.data.ChargeOffReasonToGLAccountMapper;
52+
import org.apache.fineract.accounting.producttoaccountmapping.data.AdvancedMappingToExpenseAccountData;
5353
import org.apache.fineract.accounting.producttoaccountmapping.data.ChargeToGLAccountMapper;
5454
import org.apache.fineract.accounting.producttoaccountmapping.data.ClassificationToGLAccountData;
5555
import org.apache.fineract.accounting.producttoaccountmapping.data.PaymentTypeToGLAccountMapper;
56-
import org.apache.fineract.accounting.producttoaccountmapping.data.WriteOffReasonsToExpenseAccountMapper;
5756
import org.apache.fineract.accounting.producttoaccountmapping.service.ProductToGLAccountMappingReadPlatformService;
5857
import org.apache.fineract.commands.domain.CommandWrapper;
5958
import org.apache.fineract.commands.service.CommandWrapperBuilder;
@@ -355,8 +354,8 @@ private String getLoanProductDetails(Long productId, UriInfo uriInfo) {
355354
Collection<PaymentTypeToGLAccountMapper> paymentChannelToFundSourceMappings;
356355
Collection<ChargeToGLAccountMapper> feeToGLAccountMappings;
357356
Collection<ChargeToGLAccountMapper> penaltyToGLAccountMappings;
358-
List<ChargeOffReasonToGLAccountMapper> chargeOffReasonToGLAccountMappings;
359-
List<WriteOffReasonsToExpenseAccountMapper> writeOffReasonsToExpenseAccountMappings;
357+
List<AdvancedMappingToExpenseAccountData> chargeOffReasonToGLAccountMappings;
358+
List<AdvancedMappingToExpenseAccountData> writeOffReasonsToExpenseAccountMappings;
360359
List<ClassificationToGLAccountData> capitalizedIncomeClassificationToGLAccountMappings;
361360
List<ClassificationToGLAccountData> buydowFeeClassificationToGLAccountMappings;
362361
if (loanProduct.hasAccountingEnabled()) {

0 commit comments

Comments
 (0)