Advanced accounting - Charge-off reason mapping fix

This commit is contained in:
Adam Saghy
2024-12-19 18:24:32 +01:00
parent f693318c2e
commit bf1d99f494
5 changed files with 41 additions and 26 deletions
@@ -1117,16 +1117,16 @@
<table fxFlexFill class="mat-elevation-z1" mat-table [dataSource]="chargeOffReasonToExpenseAccountMappings"> <table fxFlexFill class="mat-elevation-z1" mat-table [dataSource]="chargeOffReasonToExpenseAccountMappings">
<ng-container matColumnDef="chargeOffReasonCodeValueId"> <ng-container matColumnDef="chargeOffReasonCodeValueId">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Charge-off reason' | translate }}</th> <th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Charge-off reason' | translate }}</th>
<td mat-cell *matCellDef="let chargeOffReasonsToExpenseMapping"> <td mat-cell *matCellDef="let chargeOffReasonToExpenseAccountMapping">
{{ chargeOffReasonsToExpenseMapping.chargeOffReasonCodeValue.name }} {{ chargeOffReasonToExpenseAccountMapping.chargeOffReasonCodeValue.name }}
</td> </td>
</ng-container> </ng-container>
<ng-container matColumnDef="expenseGLAccountId"> <ng-container matColumnDef="expenseAccountId">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Expense Account' | translate }}</th> <th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Expense Account' | translate }}</th>
<td mat-cell *matCellDef="let chargeOffReasonsToExpenseMapping"> <td mat-cell *matCellDef="let chargeOffReasonToExpenseAccountMapping">
({{ chargeOffReasonsToExpenseMapping.chargeOffExpenseAccount.glCode }}) ({{ chargeOffReasonToExpenseAccountMapping.expenseAccount.glCode }})
{{ chargeOffReasonsToExpenseMapping.chargeOffExpenseAccount.name }} {{ chargeOffReasonToExpenseAccountMapping.expenseAccount.name }}
</td> </td>
</ng-container> </ng-container>
@@ -1,6 +1,16 @@
import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';
import { DelinquencyBucket, LoanProduct } from '../../models/loan-product.model'; import { DelinquencyBucket, LoanProduct } from '../../models/loan-product.model';
import {AccountingMapping, Charge, ChargeOffReasonToExpenseAccountMapping, ChargeToIncomeAccountMapping, GLAccount, PaymentChannelToFundSourceMapping, PaymentType, PaymentTypeOption} from '../../../../shared/models/general.model'; import {
AccountingMapping,
Charge,
ChargeOffReasonCodeValue,
ChargeOffReasonToExpenseAccountMapping,
ChargeToIncomeAccountMapping,
GLAccount,
PaymentChannelToFundSourceMapping,
PaymentType,
PaymentTypeOption
} from '../../../../shared/models/general.model';
import { AdvancePaymentAllocationData, CreditAllocation, PaymentAllocation } from '../../loan-product-stepper/loan-product-payment-strategy-step/payment-allocation-model'; import { AdvancePaymentAllocationData, CreditAllocation, PaymentAllocation } from '../../loan-product-stepper/loan-product-payment-strategy-step/payment-allocation-model';
import { LoanProducts } from '../../loan-products'; import { LoanProducts } from '../../loan-products';
import { CodeName, OptionData, StringEnumOptionData } from '../../../../shared/models/option-data.model'; import { CodeName, OptionData, StringEnumOptionData } from '../../../../shared/models/option-data.model';
@@ -25,7 +35,7 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
chargesDisplayedColumns: string[] = ['name', 'chargeCalculationType', 'amount', 'chargeTimeType']; chargesDisplayedColumns: string[] = ['name', 'chargeCalculationType', 'amount', 'chargeTimeType'];
paymentFundSourceDisplayedColumns: string[] = ['paymentTypeId', 'fundSourceAccountId']; paymentFundSourceDisplayedColumns: string[] = ['paymentTypeId', 'fundSourceAccountId'];
feesPenaltyIncomeDisplayedColumns: string[] = ['chargeId', 'incomeAccountId']; feesPenaltyIncomeDisplayedColumns: string[] = ['chargeId', 'incomeAccountId'];
chargeOffReasonExpenseDisplayedColumns: string[] = ['chargeOffReasonCodeValueId', 'expenseGLAccountId']; chargeOffReasonExpenseDisplayedColumns: string[] = ['chargeOffReasonCodeValueId', 'expenseAccountId'];
accountingRuleData: string[] = []; accountingRuleData: string[] = [];
isAdvancedPaymentAllocation = false; isAdvancedPaymentAllocation = false;
@@ -76,6 +86,7 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
const expenseAccountData = this.loanProductsTemplate.accountingMappingOptions.expenseAccountOptions || []; const expenseAccountData = this.loanProductsTemplate.accountingMappingOptions.expenseAccountOptions || [];
const liabilityAccountData = this.loanProductsTemplate.accountingMappingOptions.liabilityAccountOptions || []; const liabilityAccountData = this.loanProductsTemplate.accountingMappingOptions.liabilityAccountOptions || [];
const assetAndLiabilityAccountData = this.loanProductsTemplate.accountingMappingOptions.assetAndLiabilityAccountOptions || []; const assetAndLiabilityAccountData = this.loanProductsTemplate.accountingMappingOptions.assetAndLiabilityAccountOptions || [];
const chargeOffReasonOptions: any = this.loanProductsTemplate.chargeOffReasonOptions || [];
this.accountingMappings = { this.accountingMappings = {
'fundSourceAccount': this.glAccountLookUp(this.loanProduct.fundSourceAccountId, assetAndLiabilityAccountData), 'fundSourceAccount': this.glAccountLookUp(this.loanProduct.fundSourceAccountId, assetAndLiabilityAccountData),
@@ -135,7 +146,14 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
this.chargeOffReasonToExpenseAccountMappings = []; this.chargeOffReasonToExpenseAccountMappings = [];
if (this.loanProduct.chargeOffReasonToExpenseAccountMappings?.length > 0) { if (this.loanProduct.chargeOffReasonToExpenseAccountMappings?.length > 0) {
this.loanProduct.chargeOffReasonToExpenseAccountMappings.forEach((m: ChargeOffReasonToExpenseAccountMapping) => { this.loanProduct.chargeOffReasonToExpenseAccountMappings.forEach((m: ChargeOffReasonToExpenseAccountMapping) => {
this.chargeOffReasonToExpenseAccountMappings.push(m); let optionData = this.optionDataLookUp(m.chargeOffReasonCodeValueId, chargeOffReasonOptions);
this.chargeOffReasonToExpenseAccountMappings.push({
expenseAccount: this.glAccountLookUp(m.expenseAccountId, expenseAccountData),
chargeOffReasonCodeValue: {
id: optionData.id,
name: optionData.value
} as ChargeOffReasonCodeValue
});
}); });
} }
} }
@@ -444,24 +444,21 @@
> >
<ng-container matColumnDef="chargeOffReasonCodeValueId"> <ng-container matColumnDef="chargeOffReasonCodeValueId">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Charge-off reason' | translate }}</th> <th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Charge-off reason' | translate }}</th>
<td mat-cell *matCellDef="let chargeOffReasonsToExpenseMapping"> <td mat-cell *matCellDef="let chargeOffReasonExpense">
{{ {{ chargeOffReasonExpense.chargeOffReasonCodeValueId | find: chargeOffReasonOptions : 'id' : 'name' }}
chargeOffReasonsToExpenseMapping.chargeOffReasonCodeValueId
| find: chargeOffReasonOptions : 'id' : 'name'
}}
</td> </td>
</ng-container> </ng-container>
<ng-container matColumnDef="expenseGLAccountId"> <ng-container matColumnDef="expenseAccountId">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Expense Account' | translate }}</th> <th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Expense Account' | translate }}</th>
<td mat-cell *matCellDef="let chargeOffReasonsToExpenseMapping"> <td mat-cell *matCellDef="let chargeOffReasonExpense">
{{ chargeOffReasonsToExpenseMapping.expenseGLAccountId | find: expenseAccountData : 'id' : 'name' }} {{ chargeOffReasonExpense.expenseAccountId | find: expenseAccountData : 'id' : 'name' }}
</td> </td>
</ng-container> </ng-container>
<ng-container matColumnDef="actions"> <ng-container matColumnDef="actions">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Actions' | translate }}</th> <th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Actions' | translate }}</th>
<td mat-cell *matCellDef="let chargeOffReasonsToExpenseMapping; let i = index"> <td mat-cell *matCellDef="let chargeOffReasonExpense; let i = index">
<button <button
mat-icon-button mat-icon-button
color="primary" color="primary"
@@ -36,7 +36,7 @@ export class LoanProductAccountingStepComponent implements OnInit {
paymentFundSourceDisplayedColumns: string[] = ['paymentTypeId', 'fundSourceAccountId', 'actions']; paymentFundSourceDisplayedColumns: string[] = ['paymentTypeId', 'fundSourceAccountId', 'actions'];
feesPenaltyIncomeDisplayedColumns: string[] = ['chargeId', 'incomeAccountId', 'actions']; feesPenaltyIncomeDisplayedColumns: string[] = ['chargeId', 'incomeAccountId', 'actions'];
chargeOffReasonExpenseDisplayedColumns: string[] = ['chargeOffReasonCodeValueId', 'expenseGLAccountId', 'actions']; chargeOffReasonExpenseDisplayedColumns: string[] = ['chargeOffReasonCodeValueId', 'expenseAccountId', 'actions'];
constructor(private formBuilder: UntypedFormBuilder, constructor(private formBuilder: UntypedFormBuilder,
public dialog: MatDialog, public dialog: MatDialog,
@@ -108,7 +108,7 @@ export class LoanProductAccountingStepComponent implements OnInit {
({ chargeId: penaltyIncome.charge.id, incomeAccountId: penaltyIncome.incomeAccount.id })))); ({ chargeId: penaltyIncome.charge.id, incomeAccountId: penaltyIncome.incomeAccount.id }))));
this.loanProductAccountingForm.setControl('chargeOffReasonToExpenseAccountMappings', this.loanProductAccountingForm.setControl('chargeOffReasonToExpenseAccountMappings',
this.formBuilder.array((this.loanProductsTemplate.chargeOffReasonToExpenseAccountMappings || []).map((m: ChargeOffReasonToExpenseAccountMapping) => this.formBuilder.array((this.loanProductsTemplate.chargeOffReasonToExpenseAccountMappings || []).map((m: ChargeOffReasonToExpenseAccountMapping) =>
({ chargeOffReasonCodeValueId: m.chargeOffReasonCodeValue.id, expenseGLAccountId: m.chargeOffExpenseAccount.id })))); ({ chargeOffReasonCodeValueId: m.chargeOffReasonCodeValue.id, expenseAccountId: m.expenseAccount.id }))));
} }
} }
@@ -134,7 +134,7 @@ export class LoanProductAccountingStepComponent implements OnInit {
this.loanProductAccountingForm.addControl('overpaymentLiabilityAccountId', new UntypedFormControl('', Validators.required)); this.loanProductAccountingForm.addControl('overpaymentLiabilityAccountId', new UntypedFormControl('', Validators.required));
this.loanProductAccountingForm.addControl('advancedAccountingRules', new UntypedFormControl(false)); this.loanProductAccountingForm.addControl('advancedAccountingRules', new UntypedFormControl(false));
this.loanProductAccountingForm.addControl('chargeOffFraudExpenseAccountId', new UntypedFormControl('', Validators.required)); this.loanProductAccountingForm.addControl('chargeOffFraudExpenseAccountId', new UntypedFormControl('', Validators.required));
this.loanProductAccountingForm.addControl('chargeOffExpenseAccountId', new UntypedFormControl('', Validators.required)); this.loanProductAccountingForm.addControl('expenseAccountId', new UntypedFormControl('', Validators.required));
this.loanProductAccountingForm.addControl('incomeFromChargeOffPenaltyAccountId', new UntypedFormControl('', Validators.required)); this.loanProductAccountingForm.addControl('incomeFromChargeOffPenaltyAccountId', new UntypedFormControl('', Validators.required));
this.loanProductAccountingForm.addControl('incomeFromChargeOffFeesAccountId', new UntypedFormControl('', Validators.required)); this.loanProductAccountingForm.addControl('incomeFromChargeOffFeesAccountId', new UntypedFormControl('', Validators.required));
this.loanProductAccountingForm.addControl('incomeFromChargeOffInterestAccountId', new UntypedFormControl('', Validators.required)); this.loanProductAccountingForm.addControl('incomeFromChargeOffInterestAccountId', new UntypedFormControl('', Validators.required));
@@ -168,7 +168,7 @@ export class LoanProductAccountingStepComponent implements OnInit {
this.loanProductAccountingForm.removeControl('goodwillCreditAccountId'); this.loanProductAccountingForm.removeControl('goodwillCreditAccountId');
this.loanProductAccountingForm.removeControl('overpaymentLiabilityAccountId'); this.loanProductAccountingForm.removeControl('overpaymentLiabilityAccountId');
this.loanProductAccountingForm.removeControl('advancedAccountingRules'); this.loanProductAccountingForm.removeControl('advancedAccountingRules');
this.loanProductAccountingForm.removeControl('chargeOffExpenseAccountId'); this.loanProductAccountingForm.removeControl('expenseAccountId');
this.loanProductAccountingForm.removeControl('chargeOffFraudExpenseAccountId'); this.loanProductAccountingForm.removeControl('chargeOffFraudExpenseAccountId');
this.loanProductAccountingForm.removeControl('incomeFromChargeOffPenaltyAccountId'); this.loanProductAccountingForm.removeControl('incomeFromChargeOffPenaltyAccountId');
this.loanProductAccountingForm.removeControl('incomeFromChargeOffFeesAccountId'); this.loanProductAccountingForm.removeControl('incomeFromChargeOffFeesAccountId');
@@ -334,9 +334,9 @@ export class LoanProductAccountingStepComponent implements OnInit {
order: 1 order: 1
}), }),
new SelectBase({ new SelectBase({
controlName: 'expenseGLAccountId', controlName: 'expenseAccountId',
label: 'Expense Account', label: 'Expense Account',
value: values ? values.expenseGLAccountId : this.expenseAccountData[0].id, value: values ? values.expenseAccountId : this.expenseAccountData[0].id,
options: { label: 'name', value: 'id', data: this.expenseAccountData }, options: { label: 'name', value: 'id', data: this.expenseAccountData },
required: true, required: true,
order: 2 order: 2
+2 -2
View File
@@ -41,9 +41,9 @@ export interface PaymentChannelToFundSourceMapping {
export interface ChargeOffReasonToExpenseAccountMapping { export interface ChargeOffReasonToExpenseAccountMapping {
chargeOffReasonCodeValueId?: number; chargeOffReasonCodeValueId?: number;
chargeOffReason? : OptionData; expenseAccountId? : number;
chargeOffReasonCodeValue?: ChargeOffReasonCodeValue; chargeOffReasonCodeValue?: ChargeOffReasonCodeValue;
chargeOffExpenseAccount?: AccountingMapping; expenseAccount?: AccountingMapping;
} }
export interface ChargeOffReasonCodeValue { export interface ChargeOffReasonCodeValue {