FINERACT-2113: Advanced Charge-off Expense Accounting - Add new "Advanced Accounting Rule"

This commit is contained in:
Andrii Kulminskyi
2024-11-21 17:18:06 +01:00
committed by Adam Saghy
parent 75fa740ff6
commit 4ccb33a95e
18 changed files with 621 additions and 14 deletions
@@ -33,6 +33,7 @@ import org.apache.fineract.accounting.glaccount.domain.GLAccountType;
import org.apache.fineract.accounting.producttoaccountmapping.domain.ProductToGLAccountMappingRepository;
import org.apache.fineract.accounting.producttoaccountmapping.exception.ProductToGLAccountMappingInvalidException;
import org.apache.fineract.accounting.producttoaccountmapping.service.ProductToGLAccountMappingHelper;
import org.apache.fineract.infrastructure.codes.domain.CodeValueRepository;
import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
import org.apache.fineract.portfolio.PortfolioProductType;
@@ -46,9 +47,9 @@ public class LoanProductToGLAccountMappingHelper extends ProductToGLAccountMappi
public LoanProductToGLAccountMappingHelper(final GLAccountRepository glAccountRepository,
final ProductToGLAccountMappingRepository glAccountMappingRepository, final FromJsonHelper fromApiJsonHelper,
final ChargeRepositoryWrapper chargeRepositoryWrapper, final GLAccountRepositoryWrapper accountRepositoryWrapper,
final PaymentTypeRepositoryWrapper paymentTypeRepositoryWrapper) {
final PaymentTypeRepositoryWrapper paymentTypeRepositoryWrapper, final CodeValueRepository codeValueRepository) {
super(glAccountRepository, glAccountMappingRepository, fromApiJsonHelper, chargeRepositoryWrapper, accountRepositoryWrapper,
paymentTypeRepositoryWrapper);
paymentTypeRepositoryWrapper, codeValueRepository);
}
/***
@@ -138,6 +139,16 @@ public class LoanProductToGLAccountMappingHelper extends ProductToGLAccountMappi
saveChargesToGLAccountMappings(command, element, productId, changes, PortfolioProductType.LOAN, false);
}
public void saveChargeOffReasonToExpenseAccountMappings(final JsonCommand command, final JsonElement element, final Long productId,
final Map<String, Object> changes) {
saveChargeOffReasonToGLAccountMappings(command, element, productId, changes, PortfolioProductType.LOAN);
}
public void updateChargeOffReasonToExpenseAccountMappings(final JsonCommand command, final JsonElement element, final Long productId,
final Map<String, Object> changes) {
updateChargeOffReasonToGLAccountMappings(command, element, productId, changes, PortfolioProductType.LOAN);
}
public void updateChargesToIncomeAccountMappings(final JsonCommand command, final JsonElement element, final Long productId,
final Map<String, Object> changes) {
// update both fee and penalty charges
@@ -387,5 +398,4 @@ public class LoanProductToGLAccountMappingHelper extends ProductToGLAccountMappi
}
return gLAccountType;
}
}
@@ -246,6 +246,7 @@ final class LoanProductsApiResourceSwagger {
public Long incomeFromGoodwillCreditPenaltyAccountId;
public List<GetLoanProductsProductIdResponse.GetLoanPaymentChannelToFundSourceMappings> paymentChannelToFundSourceMappings;
public List<GetLoanProductsProductIdResponse.GetLoanFeeToIncomeAccountMappings> feeToIncomeAccountMappings;
public List<GetLoanProductsProductIdResponse.GetChargeOffReasonsToExpenseMappings> chargeOffReasonsToExpenseMappings;
public List<ChargeToGLAccountMapper> penaltyToIncomeAccountMappings;
// Multi Disburse
@@ -1209,6 +1210,16 @@ final class LoanProductsApiResourceSwagger {
public Long fundSourceAccountId;
}
static final class GetChargeOffReasonsToExpenseMappings {
private GetChargeOffReasonsToExpenseMappings() {}
@Schema(example = "1")
public Long chargeOffReasonCodeValueId;
@Schema(example = "12")
public Long expenseGLAccountId;
}
static final class GetLoanFeeToIncomeAccountMappings {
private GetLoanFeeToIncomeAccountMappings() {}
@@ -1319,6 +1330,7 @@ final class LoanProductsApiResourceSwagger {
public GetLoanAccountingMappings accountingMappings;
public Set<GetLoanPaymentChannelToFundSourceMappings> paymentChannelToFundSourceMappings;
public Set<GetLoanFeeToIncomeAccountMappings> feeToIncomeAccountMappings;
public Set<GetChargeOffReasonsToExpenseMappings> chargeOffReasonsToExpenseMappings;
@Schema(example = "false")
public Boolean isRatesEnabled;
@Schema(example = "true")
@@ -1577,6 +1589,7 @@ final class LoanProductsApiResourceSwagger {
public Long incomeFromChargeOffPenaltyAccountId;
public List<GetLoanProductsProductIdResponse.GetLoanPaymentChannelToFundSourceMappings> paymentChannelToFundSourceMappings;
public List<GetLoanProductsProductIdResponse.GetLoanFeeToIncomeAccountMappings> feeToIncomeAccountMappings;
public List<GetLoanProductsProductIdResponse.GetChargeOffReasonsToExpenseMappings> chargeOffReasonsToExpenseMappings;
public List<ChargeToGLAccountMapper> penaltyToIncomeAccountMappings;
@Schema(example = "false")
public Boolean enableAccrualActivityPosting;
@@ -151,6 +151,7 @@ public class LoanProductData implements Serializable {
private Collection<PaymentTypeToGLAccountMapper> paymentChannelToFundSourceMappings;
private Collection<ChargeToGLAccountMapper> feeToIncomeAccountMappings;
private Collection<ChargeToGLAccountMapper> penaltyToIncomeAccountMappings;
private List<ChargeToGLAccountMapper> chargeOffReasonsToExpenseMappings;
private final boolean enableAccrualActivityPosting;
// rates
@@ -853,6 +854,7 @@ public class LoanProductData implements Serializable {
this.paymentChannelToFundSourceMappings = null;
this.feeToIncomeAccountMappings = null;
this.penaltyToIncomeAccountMappings = null;
this.chargeOffReasonsToExpenseMappings = null;
this.valueConditionTypeOptions = null;
this.principalVariationsForBorrowerCycle = principalVariations;
this.interestRateVariationsForBorrowerCycle = interestRateVariations;
@@ -992,6 +994,7 @@ public class LoanProductData implements Serializable {
this.paymentChannelToFundSourceMappings = productData.paymentChannelToFundSourceMappings;
this.feeToIncomeAccountMappings = productData.feeToIncomeAccountMappings;
this.penaltyToIncomeAccountMappings = productData.penaltyToIncomeAccountMappings;
this.chargeOffReasonsToExpenseMappings = productData.chargeOffReasonsToExpenseMappings;
this.chargeOptions = chargeOptions;
this.penaltyOptions = penaltyOptions;