Advanced accounting - Charge-off reason mapping
This commit is contained in:
+3
-3
@@ -934,17 +934,17 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div *ngIf="chargeOffReasonsToExpenseMappings.length" fxFlexFill fxLayout="row wrap"
|
<div *ngIf="chargeOffReasonToExpenseAccountMappings.length" fxFlexFill fxLayout="row wrap"
|
||||||
fxLayout.lt-md="column">
|
fxLayout.lt-md="column">
|
||||||
|
|
||||||
<h4 class="mat-h4" fxFlexFill>{{'labels.heading.Map Charge-off reasons to Expense accounts' | translate}}</h4>
|
<h4 class="mat-h4" fxFlexFill>{{'labels.heading.Map Charge-off reasons to Expense accounts' | translate}}</h4>
|
||||||
|
|
||||||
<table fxFlexFill class="mat-elevation-z1" mat-table [dataSource]="chargeOffReasonsToExpenseMappings">
|
<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 chargeOffReasonsToExpenseMapping">
|
||||||
{{ chargeOffReasonsToExpenseMapping.chargeOffReasonsCodeValue.name }}
|
{{ chargeOffReasonsToExpenseMapping.chargeOffReasonCodeValue.name }}
|
||||||
</td>
|
</td>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
|
|||||||
+8
-8
@@ -1,6 +1,6 @@
|
|||||||
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, ChargeOffReasonsToGLAccountMapping, ChargeToIncomeAccountMapping, GLAccount, PaymentChannelToFundSourceMapping, PaymentType, PaymentTypeOption} from '../../../../shared/models/general.model';
|
import {AccountingMapping, Charge, 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';
|
||||||
@@ -36,7 +36,7 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
|
|||||||
paymentChannelToFundSourceMappings: PaymentChannelToFundSourceMapping[] = [];
|
paymentChannelToFundSourceMappings: PaymentChannelToFundSourceMapping[] = [];
|
||||||
feeToIncomeAccountMappings: ChargeToIncomeAccountMapping[] = [];
|
feeToIncomeAccountMappings: ChargeToIncomeAccountMapping[] = [];
|
||||||
penaltyToIncomeAccountMappings: ChargeToIncomeAccountMapping[] = [];
|
penaltyToIncomeAccountMappings: ChargeToIncomeAccountMapping[] = [];
|
||||||
chargeOffReasonsToExpenseMappings: ChargeOffReasonsToGLAccountMapping[] = [];
|
chargeOffReasonToExpenseAccountMappings: ChargeOffReasonToExpenseAccountMapping[] = [];
|
||||||
|
|
||||||
constructor(private accounting: Accounting) { }
|
constructor(private accounting: Accounting) { }
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
|
|||||||
this.paymentChannelToFundSourceMappings = this.loanProduct.paymentChannelToFundSourceMappings || [];
|
this.paymentChannelToFundSourceMappings = this.loanProduct.paymentChannelToFundSourceMappings || [];
|
||||||
this.feeToIncomeAccountMappings = this.loanProduct.feeToIncomeAccountMappings || [];
|
this.feeToIncomeAccountMappings = this.loanProduct.feeToIncomeAccountMappings || [];
|
||||||
this.penaltyToIncomeAccountMappings = this.loanProduct.penaltyToIncomeAccountMappings || [];
|
this.penaltyToIncomeAccountMappings = this.loanProduct.penaltyToIncomeAccountMappings || [];
|
||||||
this.chargeOffReasonsToExpenseMappings = this.loanProduct.chargeOffReasonToGLAccountMappings || [];
|
this.chargeOffReasonToExpenseAccountMappings = this.loanProduct.chargeOffReasonToExpenseAccountMappings || [];
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
this.accountingMappings = {};
|
this.accountingMappings = {};
|
||||||
@@ -132,10 +132,10 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this.chargeOffReasonsToExpenseMappings = [];
|
this.chargeOffReasonToExpenseAccountMappings = [];
|
||||||
if (this.loanProduct.chargeOffReasonToGLAccountMappings?.length > 0) {
|
if (this.loanProduct.chargeOffReasonToExpenseAccountMappings?.length > 0) {
|
||||||
this.loanProduct.chargeOffReasonToGLAccountMappings.forEach((m: ChargeOffReasonsToGLAccountMapping) => {
|
this.loanProduct.chargeOffReasonToExpenseAccountMappings.forEach((m: ChargeOffReasonToExpenseAccountMapping) => {
|
||||||
this.chargeOffReasonsToExpenseMappings.push(m);
|
this.chargeOffReasonToExpenseAccountMappings.push(m);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -355,7 +355,7 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
|
|||||||
return (this.loanProduct.paymentChannelToFundSourceMappings?.length > 0
|
return (this.loanProduct.paymentChannelToFundSourceMappings?.length > 0
|
||||||
|| this.loanProduct.feeToIncomeAccountMappings?.length > 0
|
|| this.loanProduct.feeToIncomeAccountMappings?.length > 0
|
||||||
|| this.loanProduct.penaltyToIncomeAccountMappings?.length > 0
|
|| this.loanProduct.penaltyToIncomeAccountMappings?.length > 0
|
||||||
|| this.loanProduct.chargeOffReasonToGLAccountMappings?.length > 0);
|
|| this.loanProduct.chargeOffReasonToExpenseAccountMappings?.length > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
getAccountingRuleName(value: string): string {
|
getAccountingRuleName(value: string): string {
|
||||||
|
|||||||
+4
-4
@@ -337,12 +337,12 @@
|
|||||||
<h4 fxFlex="33%" class="mat-h4">{{'labels.heading.Map Charge-off reasons to Expense accounts' | translate}}</h4>
|
<h4 fxFlex="33%" class="mat-h4">{{'labels.heading.Map Charge-off reasons to Expense accounts' | translate}}</h4>
|
||||||
|
|
||||||
<div fxFlex="63%">
|
<div fxFlex="63%">
|
||||||
<button type="button" mat-raised-button color="primary" (click)="add('ChargeOffReasonExpense', chargeOffReasonsToExpenseMappings)">
|
<button type="button" mat-raised-button color="primary" (click)="add('ChargeOffReasonExpense', chargeOffReasonToExpenseAccountMappings)">
|
||||||
<fa-icon icon="plus" class="m-r-10"></fa-icon>
|
<fa-icon icon="plus" class="m-r-10"></fa-icon>
|
||||||
{{'labels.buttons.Add' | translate}}
|
{{'labels.buttons.Add' | translate}}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<table fxFlex="98%" class="mat-elevation-z1" mat-table [dataSource]="chargeOffReasonsToExpenseMappings.value" *ngIf="chargeOffReasonsToExpenseMappings.value.length !== 0">
|
<table fxFlex="98%" class="mat-elevation-z1" mat-table [dataSource]="chargeOffReasonToExpenseAccountMappings.value" *ngIf="chargeOffReasonToExpenseAccountMappings.value.length !== 0">
|
||||||
|
|
||||||
<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>
|
||||||
@@ -361,10 +361,10 @@
|
|||||||
<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 chargeOffReasonsToExpenseMapping; let i = index">
|
||||||
<button mat-icon-button color="primary" (click)="edit('ChargeOffReasonExpense', chargeOffReasonsToExpenseMappings, i)">
|
<button mat-icon-button color="primary" (click)="edit('ChargeOffReasonExpense', chargeOffReasonToExpenseAccountMappings, i)">
|
||||||
<fa-icon icon="edit"></fa-icon>
|
<fa-icon icon="edit"></fa-icon>
|
||||||
</button>
|
</button>
|
||||||
<button mat-icon-button color="warn" (click)="delete(chargeOffReasonsToExpenseMappings, i)">
|
<button mat-icon-button color="warn" (click)="delete(chargeOffReasonToExpenseAccountMappings, i)">
|
||||||
<fa-icon icon="trash"></fa-icon>
|
<fa-icon icon="trash"></fa-icon>
|
||||||
</button>
|
</button>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
+9
-9
@@ -8,7 +8,7 @@ import { FormDialogComponent } from 'app/shared/form-dialog/form-dialog.componen
|
|||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
import { FormfieldBase } from 'app/shared/form-dialog/formfield/model/formfield-base';
|
import { FormfieldBase } from 'app/shared/form-dialog/formfield/model/formfield-base';
|
||||||
import { SelectBase } from 'app/shared/form-dialog/formfield/model/select-base';
|
import { SelectBase } from 'app/shared/form-dialog/formfield/model/select-base';
|
||||||
import { ChargeOffReasonsToGLAccountMapping } from 'app/shared/models/general.model';
|
import { ChargeOffReasonToExpenseAccountMapping } from 'app/shared/models/general.model';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'mifosx-loan-product-accounting-step',
|
selector: 'mifosx-loan-product-accounting-step',
|
||||||
@@ -94,7 +94,7 @@ export class LoanProductAccountingStepComponent implements OnInit {
|
|||||||
'incomeFromGoodwillCreditInterestAccountId': accountingMappings.incomeFromGoodwillCreditInterestAccount ? accountingMappings.incomeFromGoodwillCreditInterestAccount.id : '',
|
'incomeFromGoodwillCreditInterestAccountId': accountingMappings.incomeFromGoodwillCreditInterestAccount ? accountingMappings.incomeFromGoodwillCreditInterestAccount.id : '',
|
||||||
'incomeFromGoodwillCreditFeesAccountId': accountingMappings.incomeFromGoodwillCreditFeesAccount ? accountingMappings.incomeFromGoodwillCreditFeesAccount.id : '',
|
'incomeFromGoodwillCreditFeesAccountId': accountingMappings.incomeFromGoodwillCreditFeesAccount ? accountingMappings.incomeFromGoodwillCreditFeesAccount.id : '',
|
||||||
'incomeFromGoodwillCreditPenaltyAccountId': accountingMappings.incomeFromGoodwillCreditPenaltyAccount ? accountingMappings.incomeFromGoodwillCreditPenaltyAccount.id : '',
|
'incomeFromGoodwillCreditPenaltyAccountId': accountingMappings.incomeFromGoodwillCreditPenaltyAccount ? accountingMappings.incomeFromGoodwillCreditPenaltyAccount.id : '',
|
||||||
'advancedAccountingRules': (this.loanProductsTemplate.paymentChannelToFundSourceMappings || this.loanProductsTemplate.feeToIncomeAccountMappings || this.loanProductsTemplate.penaltyToIncomeAccountMappings || this.loanProductsTemplate.chargeOffReasonsToExpenseMappings) ? true : false
|
'advancedAccountingRules': (this.loanProductsTemplate.paymentChannelToFundSourceMappings || this.loanProductsTemplate.feeToIncomeAccountMappings || this.loanProductsTemplate.penaltyToIncomeAccountMappings || this.loanProductsTemplate.chargeOffReasonToExpenseAccountMappings) ? true : false
|
||||||
});
|
});
|
||||||
|
|
||||||
this.loanProductAccountingForm.setControl('paymentChannelToFundSourceMappings',
|
this.loanProductAccountingForm.setControl('paymentChannelToFundSourceMappings',
|
||||||
@@ -106,9 +106,9 @@ export class LoanProductAccountingStepComponent implements OnInit {
|
|||||||
this.loanProductAccountingForm.setControl('penaltyToIncomeAccountMappings',
|
this.loanProductAccountingForm.setControl('penaltyToIncomeAccountMappings',
|
||||||
this.formBuilder.array((this.loanProductsTemplate.penaltyToIncomeAccountMappings || []).map((penaltyIncome: any) =>
|
this.formBuilder.array((this.loanProductsTemplate.penaltyToIncomeAccountMappings || []).map((penaltyIncome: any) =>
|
||||||
({ chargeId: penaltyIncome.charge.id, incomeAccountId: penaltyIncome.incomeAccount.id }))));
|
({ chargeId: penaltyIncome.charge.id, incomeAccountId: penaltyIncome.incomeAccount.id }))));
|
||||||
this.loanProductAccountingForm.setControl('chargeOffReasonsToExpenseMappings',
|
this.loanProductAccountingForm.setControl('chargeOffReasonToExpenseAccountMappings',
|
||||||
this.formBuilder.array((this.loanProductsTemplate.chargeOffReasonToGLAccountMappings || []).map((m: ChargeOffReasonsToGLAccountMapping) =>
|
this.formBuilder.array((this.loanProductsTemplate.chargeOffReasonToExpenseAccountMappings || []).map((m: ChargeOffReasonToExpenseAccountMapping) =>
|
||||||
({ chargeOffReasonCodeValueId: m.chargeOffReasonsCodeValue.id, expenseGLAccountId: m.chargeOffExpenseAccount.id }))));
|
({ chargeOffReasonCodeValueId: m.chargeOffReasonCodeValue.id, expenseGLAccountId: m.chargeOffExpenseAccount.id }))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,12 +148,12 @@ export class LoanProductAccountingStepComponent implements OnInit {
|
|||||||
this.loanProductAccountingForm.addControl('paymentChannelToFundSourceMappings', this.formBuilder.array([]));
|
this.loanProductAccountingForm.addControl('paymentChannelToFundSourceMappings', this.formBuilder.array([]));
|
||||||
this.loanProductAccountingForm.addControl('feeToIncomeAccountMappings', this.formBuilder.array([]));
|
this.loanProductAccountingForm.addControl('feeToIncomeAccountMappings', this.formBuilder.array([]));
|
||||||
this.loanProductAccountingForm.addControl('penaltyToIncomeAccountMappings', this.formBuilder.array([]));
|
this.loanProductAccountingForm.addControl('penaltyToIncomeAccountMappings', this.formBuilder.array([]));
|
||||||
this.loanProductAccountingForm.addControl('chargeOffReasonsToExpenseMappings', this.formBuilder.array([]));
|
this.loanProductAccountingForm.addControl('chargeOffReasonToExpenseAccountMappings', this.formBuilder.array([]));
|
||||||
} else {
|
} else {
|
||||||
this.loanProductAccountingForm.removeControl('paymentChannelToFundSourceMappings');
|
this.loanProductAccountingForm.removeControl('paymentChannelToFundSourceMappings');
|
||||||
this.loanProductAccountingForm.removeControl('feeToIncomeAccountMappings');
|
this.loanProductAccountingForm.removeControl('feeToIncomeAccountMappings');
|
||||||
this.loanProductAccountingForm.removeControl('penaltyToIncomeAccountMappings');
|
this.loanProductAccountingForm.removeControl('penaltyToIncomeAccountMappings');
|
||||||
this.loanProductAccountingForm.removeControl('chargeOffReasonsToExpenseMappings');
|
this.loanProductAccountingForm.removeControl('chargeOffReasonToExpenseAccountMappings');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@@ -204,8 +204,8 @@ export class LoanProductAccountingStepComponent implements OnInit {
|
|||||||
return this.loanProductAccountingForm.get('penaltyToIncomeAccountMappings') as UntypedFormArray;
|
return this.loanProductAccountingForm.get('penaltyToIncomeAccountMappings') as UntypedFormArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
get chargeOffReasonsToExpenseMappings(): UntypedFormArray {
|
get chargeOffReasonToExpenseAccountMappings(): UntypedFormArray {
|
||||||
return this.loanProductAccountingForm.get('chargeOffReasonsToExpenseMappings') as UntypedFormArray;
|
return this.loanProductAccountingForm.get('chargeOffReasonToExpenseAccountMappings') as UntypedFormArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
setLoanProductAccountingFormDirty() {
|
setLoanProductAccountingFormDirty() {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import {AccountingMapping, ChargeOffReasonsToGLAccountMapping, ChargeToIncomeAccountMapping, Currency, PaymentChannelToFundSourceMapping} from 'app/shared/models/general.model';
|
import {AccountingMapping, ChargeOffReasonToExpenseAccountMapping, ChargeToIncomeAccountMapping, Currency, PaymentChannelToFundSourceMapping} from 'app/shared/models/general.model';
|
||||||
import { OptionData, StringEnumOptionData } from 'app/shared/models/option-data.model';
|
import { OptionData, StringEnumOptionData } from 'app/shared/models/option-data.model';
|
||||||
import { CreditAllocation, PaymentAllocation } from '../loan-product-stepper/loan-product-payment-strategy-step/payment-allocation-model';
|
import { CreditAllocation, PaymentAllocation } from '../loan-product-stepper/loan-product-payment-strategy-step/payment-allocation-model';
|
||||||
|
|
||||||
@@ -125,7 +125,7 @@ export interface LoanProduct {
|
|||||||
paymentChannelToFundSourceMappings?: PaymentChannelToFundSourceMapping[];
|
paymentChannelToFundSourceMappings?: PaymentChannelToFundSourceMapping[];
|
||||||
feeToIncomeAccountMappings?: ChargeToIncomeAccountMapping[];
|
feeToIncomeAccountMappings?: ChargeToIncomeAccountMapping[];
|
||||||
penaltyToIncomeAccountMappings?: ChargeToIncomeAccountMapping[];
|
penaltyToIncomeAccountMappings?: ChargeToIncomeAccountMapping[];
|
||||||
chargeOffReasonToGLAccountMappings?: ChargeOffReasonsToGLAccountMapping[];
|
chargeOffReasonToExpenseAccountMappings?: ChargeOffReasonToExpenseAccountMapping[];
|
||||||
enableAccrualActivityPosting?: boolean;
|
enableAccrualActivityPosting?: boolean;
|
||||||
supportedInterestRefundTypes?: StringEnumOptionData[];
|
supportedInterestRefundTypes?: StringEnumOptionData[];
|
||||||
chargeOffBehaviour?: StringEnumOptionData;
|
chargeOffBehaviour?: StringEnumOptionData;
|
||||||
|
|||||||
@@ -39,14 +39,14 @@ export interface PaymentChannelToFundSourceMapping {
|
|||||||
fundSourceAccount: AccountingMapping;
|
fundSourceAccount: AccountingMapping;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ChargeOffReasonsToGLAccountMapping {
|
export interface ChargeOffReasonToExpenseAccountMapping {
|
||||||
chargeOffReasonCodeValueId?: number;
|
chargeOffReasonCodeValueId?: number;
|
||||||
chargeOffReason? : OptionData;
|
chargeOffReason? : OptionData;
|
||||||
chargeOffReasonsCodeValue?: ChargeOffReasonsCodeValue;
|
chargeOffReasonCodeValue?: ChargeOffReasonCodeValue;
|
||||||
chargeOffExpenseAccount?: AccountingMapping;
|
chargeOffExpenseAccount?: AccountingMapping;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ChargeOffReasonsCodeValue {
|
export interface ChargeOffReasonCodeValue {
|
||||||
active: boolean;
|
active: boolean;
|
||||||
description: string;
|
description: string;
|
||||||
id: number;
|
id: number;
|
||||||
|
|||||||
Reference in New Issue
Block a user