Skip to content

Commit e2cfafe

Browse files
FINERACT-2455: Add accounting configuration support for Working Capital loan products
1 parent 23c67f7 commit e2cfafe

22 files changed

Lines changed: 1069 additions & 37 deletions

File tree

fineract-core/src/main/java/org/apache/fineract/portfolio/PortfolioProductType.java

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,17 @@
1818
*/
1919
package org.apache.fineract.portfolio;
2020

21+
import lombok.Getter;
22+
23+
@Getter
2124
public enum PortfolioProductType {
2225

2326
LOAN(1, "productType.loan"), //
2427
SAVING(2, "productType.saving"), //
2528
CLIENT(5, "productType.client"), //
2629
PROVISIONING(3, "productType.provisioning"), //
27-
SHARES(4, "productType.shares"); //
30+
SHARES(4, "productType.shares"), //
31+
WORKING_CAPITAL_LOAN(6, "productType.workingCapitalLoan"); //
2832

2933
private final Integer value;
3034
private final String code;
@@ -39,33 +43,20 @@ public String toString() {
3943
return name().replace("_", " ");
4044
}
4145

42-
public Integer getValue() {
43-
return this.value;
44-
}
45-
46-
public String getCode() {
47-
return this.code;
48-
}
49-
5046
public static PortfolioProductType fromInt(final Integer v) {
5147
if (v == null) {
5248
return null;
5349
}
5450

55-
switch (v) {
56-
case 1:
57-
return LOAN;
58-
case 2:
59-
return SAVING;
60-
case 3:
61-
return CLIENT;
62-
case 4:
63-
return PROVISIONING;
64-
case 5:
65-
return SHARES;
66-
default:
67-
return null;
68-
}
51+
return switch (v) {
52+
case 1 -> LOAN;
53+
case 2 -> SAVING;
54+
case 3 -> CLIENT;
55+
case 4 -> PROVISIONING;
56+
case 5 -> SHARES;
57+
case 6 -> WORKING_CAPITAL_LOAN;
58+
default -> null;
59+
};
6960
}
7061

7162
public boolean isSavingProduct() {
@@ -84,4 +75,8 @@ public boolean isShareProduct() {
8475
return this.equals(SHARES);
8576
}
8677

78+
public boolean isWorkingCapitalLoanProduct() {
79+
return this.equals(WORKING_CAPITAL_LOAN);
80+
}
81+
8782
}

fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/WorkingCapitalRequestFactory.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,10 @@
3838
import org.apache.fineract.client.models.PostAllowAttributeOverrides;
3939
import org.apache.fineract.client.models.PostPaymentAllocation;
4040
import org.apache.fineract.client.models.PostWorkingCapitalLoanProductsRequest;
41+
import org.apache.fineract.client.models.PostWorkingCapitalLoanProductsRequest.AccountingRuleEnum;
4142
import org.apache.fineract.client.models.PutWorkingCapitalLoanProductsProductIdRequest;
43+
import org.apache.fineract.test.data.accounttype.AccountTypeResolver;
44+
import org.apache.fineract.test.data.accounttype.DefaultAccountType;
4245
import org.apache.fineract.test.data.delinquency.DelinquencyBucketType;
4346
import org.apache.fineract.test.data.delinquency.DelinquencyFrequencyType;
4447
import org.apache.fineract.test.data.delinquency.DelinquencyMinimumPayment;
@@ -50,13 +53,37 @@
5053
public class WorkingCapitalRequestFactory {
5154

5255
private final LoanProductsRequestFactory loanProductsRequestFactory;
56+
private final AccountTypeResolver accountTypeResolver;
5357

5458
public static final String WCLP_NAME_PREFIX = "WCLP-";
5559
public static final String WCLP_DESCRIPTION = "Working Capital Loan Product";
5660
public static final String PENALTY = "PENALTY";
5761
public static final String FEE = "FEE";
5862
public static final String PRINCIPAL = "PRINCIPAL";
5963

64+
public PostWorkingCapitalLoanProductsRequest defaultWorkingCapitalLoanProductRequestWithCashAccounting() {
65+
return defaultWorkingCapitalLoanProductRequest()//
66+
.accountingRule(AccountingRuleEnum.CASH_BASED)//
67+
.fundSourceAccountId(accountTypeResolver.resolve(DefaultAccountType.SUSPENSE_CLEARING_ACCOUNT))//
68+
.loanPortfolioAccountId(accountTypeResolver.resolve(DefaultAccountType.LOANS_RECEIVABLE))//
69+
.transfersInSuspenseAccountId(accountTypeResolver.resolve(DefaultAccountType.TRANSFER_IN_SUSPENSE_ACCOUNT))//
70+
.interestOnLoanAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME))//
71+
.incomeFromFeeAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_INCOME))//
72+
.incomeFromPenaltyAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_INCOME))//
73+
.incomeFromRecoveryAccountId(accountTypeResolver.resolve(DefaultAccountType.RECOVERIES))//
74+
.writeOffAccountId(accountTypeResolver.resolve(DefaultAccountType.WRITTEN_OFF))//
75+
.overpaymentLiabilityAccountId(accountTypeResolver.resolve(DefaultAccountType.OVERPAYMENT_ACCOUNT))//
76+
.goodwillCreditAccountId(accountTypeResolver.resolve(DefaultAccountType.GOODWILL_EXPENSE_ACCOUNT))//
77+
.incomeFromGoodwillCreditInterestAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME_CHARGE_OFF))//
78+
.incomeFromGoodwillCreditFeesAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
79+
.incomeFromGoodwillCreditPenaltyAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
80+
.incomeFromChargeOffInterestAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME_CHARGE_OFF))//
81+
.incomeFromChargeOffFeesAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
82+
.incomeFromChargeOffPenaltyAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
83+
.chargeOffExpenseAccountId(accountTypeResolver.resolve(DefaultAccountType.CREDIT_LOSS_BAD_DEBT))//
84+
.chargeOffFraudExpenseAccountId(accountTypeResolver.resolve(DefaultAccountType.CREDIT_LOSS_BAD_DEBT_FRAUD));//
85+
}
86+
6087
public PostWorkingCapitalLoanProductsRequest defaultWorkingCapitalLoanProductRequest() {
6188
String name = Utils.randomStringGenerator(WCLP_NAME_PREFIX, 10);
6289
String shortName = loanProductsRequestFactory.generateShortNameSafely();
@@ -82,6 +109,7 @@ public PostWorkingCapitalLoanProductsRequest defaultWorkingCapitalLoanProductReq
82109
.delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
83110
.dateFormat(DATE_FORMAT)//
84111
.locale(LOCALE_EN)//
112+
.accountingRule(AccountingRuleEnum.NONE)//
85113
.paymentAllocation(List.of(//
86114
createPaymentAllocation(PostPaymentAllocation.TransactionTypeEnum.DEFAULT.getValue(),
87115
List.of(PENALTY, FEE, PRINCIPAL))));//

0 commit comments

Comments
 (0)