WEB-204: Loan product config - buy down fees

This commit is contained in:
adam.magyari
2025-06-23 14:38:50 +02:00
parent d657048b55
commit 6fbdd949f9
29 changed files with 601 additions and 245 deletions
@@ -101,6 +101,28 @@
<span class="flex-50"> {{ loanDetails.capitalizedIncomeType?.value | translateKey: 'catalogs' }} </span>
</div>
<div class="flex-fill layout-row">
<span class="flex-50"> {{ 'labels.inputs.Enable Buy down fee' | translate }}</span>
<span class="flex-50"> {{ loanDetails.enableBuyDownFee | yesNo }} </span>
</div>
<div class="flex-fill layout-row" *ngIf="loanDetails.enableBuyDownFee">
<span class="flex-50"> {{ 'labels.inputs.Buy down fee calculation type' | translate }}</span>
<span class="flex-50">
{{ loanDetails.buyDownFeeCalculationType?.value | translateKey: 'catalogs' }}
</span>
</div>
<div class="flex-fill layout-row" *ngIf="loanDetails.enableBuyDownFee">
<span class="flex-50"> {{ 'labels.inputs.Buy down fee strategy' | translate }}</span>
<span class="flex-50"> {{ loanDetails.buyDownFeeStrategy?.value | translateKey: 'catalogs' }} </span>
</div>
<div class="flex-fill layout-row" *ngIf="loanDetails.enableBuyDownFee">
<span class="flex-50"> {{ 'labels.inputs.Buy down fee income type' | translate }}</span>
<span class="flex-50"> {{ loanDetails.buyDownFeeIncomeType?.value | translateKey: 'catalogs' }} </span>
</div>
<div class="flex-fill layout-row">
<span class="flex-50"> {{ 'labels.inputs.Grace: On Principal Payment' | translate }}</span>
<span class="flex-50"> {{ loanDetails.graceOnPrincipalPayment }} </span>
@@ -875,10 +875,31 @@
<span class="flex-47">{{ 'labels.inputs.Income type' | translate }}:</span>
<span class="flex-53">{{ loanProduct.capitalizedIncomeType?.value | translateKey: 'catalogs' }}</span>
</div>
</div>
<div fxFlexFill *ngIf="loanProduct.enableIncomeCapitalization">
<span fxFlex="47%">{{ 'labels.inputs.Income type' | translate }}:</span>
<span fxFlex="53%">{{ loanProduct.capitalizedIncomeType?.value | translateKey: 'catalogs' }}</span>
<div class="flex-100 layout-row-wrap responsive-column" *ngIf="isAdvancedPaymentAllocation">
<h3 class="mat-h3 flex-100">{{ 'labels.inputs.Buy down fees' | translate }}</h3>
<mat-divider [inset]="true"></mat-divider>
<div class="flex-100 layout-row">
<span class="flex-47">{{ 'labels.inputs.Enable Buy down fee' | translate }}:</span>
<span class="flex-53">{{ loanProduct.enableBuyDownFee | yesNo }}</span>
</div>
<div class="flex-100 layout-row" *ngIf="loanProduct.enableBuyDownFee">
<span class="flex-47">{{ 'labels.inputs.Buy down fee calculation type' | translate }}:</span>
<span class="flex-53">{{ loanProduct.buyDownFeeCalculationType?.value | translateKey: 'catalogs' }}</span>
</div>
<div class="flex-100 layout-row" *ngIf="loanProduct.enableBuyDownFee">
<span class="flex-47">{{ 'labels.inputs.Buy down fee strategy' | translate }}:</span>
<span class="flex-53">{{ loanProduct.buyDownFeeStrategy?.value | translateKey: 'catalogs' }}</span>
</div>
<div class="flex-100 layout-row" *ngIf="loanProduct.enableBuyDownFee">
<span class="flex-47">{{ 'labels.inputs.Buy down fee income type' | translate }}:</span>
<span class="flex-53">{{ loanProduct.buyDownFeeIncomeType?.value | translateKey: 'catalogs' }}</span>
</div>
</div>
@@ -353,6 +353,23 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
);
this.loanProduct.capitalizedIncomeType = optionValue;
}
if (this.isAdvancedPaymentAllocation && this.loanProduct.enableBuyDownFee) {
optionValue = this.optionDataLookUp(
this.loanProduct.buyDownFeeCalculationType,
this.loanProductsTemplate.buyDownFeeCalculationTypeOptions
);
this.loanProduct.buyDownFeeCalculationType = optionValue;
optionValue = this.optionDataLookUp(
this.loanProduct.buyDownFeeStrategy,
this.loanProductsTemplate.buyDownFeeStrategyOptions
);
this.loanProduct.buyDownFeeStrategy = optionValue;
optionValue = this.optionDataLookUp(
this.loanProduct.buyDownFeeIncomeType,
this.loanProductsTemplate.buyDownFeeIncomeTypeOptions
);
this.loanProduct.buyDownFeeIncomeType = optionValue;
}
optionValue = this.optionDataLookUp(
this.loanProduct.interestRateFrequencyType,
this.loanProductsTemplate.interestRateFrequencyTypeOptions
@@ -54,6 +54,8 @@
(supportedInterestRefundTypes)="setSupportedInterestRefundTypes($event)"
>
</mifosx-loan-product-interest-refund-step>
<mifosx-stepper-buttons></mifosx-stepper-buttons>
</mat-step>
<mat-step *ngIf="isAdvancedPaymentStrategy">
@@ -91,15 +93,18 @@
</mifosx-loan-product-charges-step>
</mat-step>
<mat-step *ngIf="isAdvancedPaymentStrategy" [stepControl]="loanIncomeCapitalizationForm" completed>
<ng-template matStepLabel>{{ 'labels.inputs.INCOME CAPITALIZATION' | translate }}</ng-template>
<mat-step *ngIf="isAdvancedPaymentStrategy" [stepControl]="loanDeferredIncomeRecognitionForm" completed>
<ng-template matStepLabel>{{ 'labels.inputs.DEFERRED INCOME RECOGNITION' | translate }}</ng-template>
<mifosx-loan-product-capitalized-income-step
[capitalizedIncome]="capitalizedIncome"
[deferredIncomeRecognition]="deferredIncomeRecognition"
[capitalizedIncomeCalculationTypeOptions]="loanProductsTemplate.capitalizedIncomeCalculationTypeOptions"
[capitalizedIncomeStrategyOptions]="loanProductsTemplate.capitalizedIncomeStrategyOptions"
[capitalizedIncomeTypeOptions]="loanProductsTemplate.capitalizedIncomeTypeOptions"
(setCapitalizedIncome)="setCapitalizedIncome($event)"
[buyDownFeeCalculationTypeOptions]="loanProductsTemplate.buyDownFeeCalculationTypeOptions"
[buyDownFeeStrategyOptions]="loanProductsTemplate.buyDownFeeStrategyOptions"
[buyDownFeeIncomeTypeOptions]="loanProductsTemplate.buyDownFeeIncomeTypeOptions"
(setDeferredIncomeRecognition)="setDeferredIncomeRecognition($event)"
(setViewChildForm)="setViewChildForm($event)"
>
</mifosx-loan-product-capitalized-income-step>
@@ -114,7 +119,7 @@
[loanProductsTemplate]="loanProductsTemplate"
[accountingRuleData]="accountingRuleData"
[loanProductFormValid]="loanProductFormValid"
[capitalizedIncome]="capitalizedIncome"
[deferredIncomeRecognition]="deferredIncomeRecognition"
>
</mifosx-loan-product-accounting-step>
</mat-step>
@@ -17,12 +17,12 @@ import { LoanProducts } from '../loan-products';
import {
AdvancedPaymentAllocation,
AdvancedPaymentStrategy,
CapitalizedIncome,
DeferredIncomeRecognition,
PaymentAllocation
} from '../loan-product-stepper/loan-product-payment-strategy-step/payment-allocation-model';
import { Accounting } from 'app/core/utils/accounting';
import { StringEnumOptionData } from '../../../shared/models/option-data.model';
import { LoanProductCapitalizedIncomeStepComponent } from '../loan-product-stepper/loan-product-capitalized-income-step/loan-product-capitalized-income-step.component';
import { LoanProductDeferredIncomeRecognitionStepComponent } from '../loan-product-stepper/loan-product-capitalized-income-step/loan-product-deferred-income-recognition-step.component';
import { UntypedFormGroup } from '@angular/forms';
import { MatStepper, MatStepperIcon, MatStep, MatStepLabel } from '@angular/material/stepper';
import { FaIconComponent } from '@fortawesome/angular-fontawesome';
@@ -50,7 +50,7 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
StepperButtonsComponent,
LoanProductTermsStepComponent,
LoanProductChargesStepComponent,
LoanProductCapitalizedIncomeStepComponent,
LoanProductDeferredIncomeRecognitionStepComponent,
LoanProductAccountingStepComponent,
LoanProductPreviewStepComponent
]
@@ -61,8 +61,8 @@ export class CreateLoanProductComponent implements OnInit {
loanProductCurrencyStep: LoanProductCurrencyStepComponent;
@ViewChild(LoanProductInterestRefundStepComponent, { static: true })
loanProductInterestRefundStep: LoanProductInterestRefundStepComponent;
@ViewChild(LoanProductCapitalizedIncomeStepComponent, { static: true })
loanProductCapitalizedIncomeStep: LoanProductCapitalizedIncomeStepComponent;
@ViewChild(LoanProductDeferredIncomeRecognitionStepComponent, { static: true })
loanProductDeferredIncomeRecognitionStep: LoanProductDeferredIncomeRecognitionStepComponent;
@ViewChild(LoanProductTermsStepComponent, { static: true }) loanProductTermsStep: LoanProductTermsStepComponent;
@ViewChild(LoanProductSettingsStepComponent, { static: true })
loanProductSettingsStep: LoanProductSettingsStepComponent;
@@ -81,8 +81,8 @@ export class CreateLoanProductComponent implements OnInit {
advancedPaymentAllocations: AdvancedPaymentAllocation[] = [];
advancedCreditAllocations: AdvancedPaymentAllocation[] = [];
capitalizedIncome: CapitalizedIncome | null = null;
loanIncomeCapitalizationForm: UntypedFormGroup;
deferredIncomeRecognition: DeferredIncomeRecognition | null = null;
loanDeferredIncomeRecognitionForm: UntypedFormGroup;
/**
* @param {ActivatedRoute} route Activated Route.
@@ -139,18 +139,33 @@ export class CreateLoanProductComponent implements OnInit {
advancePaymentStrategy(value: string) {
this.isAdvancedPaymentStrategy = LoanProducts.isAdvancedPaymentAllocationStrategy(value);
if (this.isAdvancedPaymentStrategy) {
if (this.deferredIncomeRecognition == null) {
this.deferredIncomeRecognition = {};
}
if (this.loanProductsTemplate.enableIncomeCapitalization) {
this.capitalizedIncome = {
this.deferredIncomeRecognition.capitalizedIncome = {
enableIncomeCapitalization: true,
capitalizedIncomeCalculationType: this.loanProductsTemplate.capitalizedIncomeCalculationTypeOptions[0],
capitalizedIncomeStrategy: this.loanProductsTemplate.capitalizedIncomeStrategyOptions[0],
capitalizedIncomeType: this.loanProductsTemplate.capitalizedIncomeTypeOptions[0]
};
} else {
this.capitalizedIncome = {
this.deferredIncomeRecognition.capitalizedIncome = {
enableIncomeCapitalization: false
};
}
if (this.loanProductsTemplate.enableBuyDownFee) {
this.deferredIncomeRecognition.buyDownFee = {
enableBuyDownFee: true,
buyDownFeeCalculationType: this.loanProductsTemplate.buyDownFeeCalculationTypeOptions[0],
buyDownFeeStrategy: this.loanProductsTemplate.buyDownFeeStrategyOptions[0],
buyDownFeeIncomeType: this.loanProductsTemplate.buyDownFeeIncomeTypeOptions[0]
};
} else {
this.deferredIncomeRecognition.buyDownFee = {
enableBuyDownFee: false
};
}
}
}
@@ -172,14 +187,14 @@ export class CreateLoanProductComponent implements OnInit {
this.supportedInterestRefundTypes = supportedInterestRefundTypes;
}
setCapitalizedIncome(capitalizedIncome: CapitalizedIncome): void {
setDeferredIncomeRecognition(deferredIncomeRecognition: DeferredIncomeRecognition): void {
if (this.isAdvancedPaymentStrategy) {
this.capitalizedIncome = capitalizedIncome;
this.deferredIncomeRecognition = deferredIncomeRecognition;
}
}
setViewChildForm(viewChildForm: UntypedFormGroup): void {
this.loanIncomeCapitalizationForm = viewChildForm;
this.loanDeferredIncomeRecognitionForm = viewChildForm;
}
get loanProductSettingsForm() {
@@ -197,7 +212,7 @@ export class CreateLoanProductComponent implements OnInit {
this.loanProductCurrencyForm.valid &&
this.loanProductTermsForm.valid &&
this.loanProductSettingsForm.valid &&
this.loanIncomeCapitalizationForm.valid &&
this.loanDeferredIncomeRecognitionForm.valid &&
this.loanProductAccountingForm.valid
);
} else {
@@ -224,12 +239,24 @@ export class CreateLoanProductComponent implements OnInit {
loanProduct['paymentAllocation'] = this.paymentAllocation;
loanProduct['creditAllocation'] = this.creditAllocation;
loanProduct['supportedInterestRefundTypes'] = this.supportedInterestRefundTypes;
if (this.capitalizedIncome != null) {
loanProduct['enableIncomeCapitalization'] = this.capitalizedIncome.enableIncomeCapitalization;
if (this.capitalizedIncome.enableIncomeCapitalization) {
loanProduct['capitalizedIncomeCalculationType'] = this.capitalizedIncome.capitalizedIncomeCalculationType;
loanProduct['capitalizedIncomeStrategy'] = this.capitalizedIncome.capitalizedIncomeStrategy;
loanProduct['capitalizedIncomeType'] = this.capitalizedIncome.capitalizedIncomeType;
if (this.deferredIncomeRecognition.capitalizedIncome != null) {
loanProduct['enableIncomeCapitalization'] =
this.deferredIncomeRecognition.capitalizedIncome.enableIncomeCapitalization;
if (this.deferredIncomeRecognition.capitalizedIncome.enableIncomeCapitalization) {
loanProduct['capitalizedIncomeCalculationType'] =
this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeCalculationType;
loanProduct['capitalizedIncomeStrategy'] =
this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeStrategy;
loanProduct['capitalizedIncomeType'] = this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeType;
}
}
if (this.deferredIncomeRecognition.buyDownFee != null) {
loanProduct['enableBuyDownFee'] = this.deferredIncomeRecognition.buyDownFee.enableBuyDownFee;
if (this.deferredIncomeRecognition.buyDownFee.enableBuyDownFee) {
loanProduct['buyDownFeeCalculationType'] =
this.deferredIncomeRecognition.buyDownFee.buyDownFeeCalculationType;
loanProduct['buyDownFeeStrategy'] = this.deferredIncomeRecognition.buyDownFee.buyDownFeeStrategy;
loanProduct['buyDownFeeIncomeType'] = this.deferredIncomeRecognition.buyDownFee.buyDownFeeIncomeType;
}
}
}
@@ -94,14 +94,17 @@
</mat-step>
<mat-step *ngIf="isAdvancedPaymentStrategy" [stepControl]="loanIncomeCapitalizationForm" completed>
<ng-template matStepLabel>{{ 'labels.inputs.INCOME CAPITALIZATION' | translate }}</ng-template>
<ng-template matStepLabel>{{ 'labels.inputs.DEFERRED INCOME RECOGNITION' | translate }}</ng-template>
<mifosx-loan-product-capitalized-income-step
[capitalizedIncome]="capitalizedIncome"
[deferredIncomeRecognition]="deferredIncomeRecognition"
[capitalizedIncomeCalculationTypeOptions]="loanProductAndTemplate.capitalizedIncomeCalculationTypeOptions"
[capitalizedIncomeStrategyOptions]="loanProductAndTemplate.capitalizedIncomeStrategyOptions"
[capitalizedIncomeTypeOptions]="loanProductAndTemplate.capitalizedIncomeTypeOptions"
(setCapitalizedIncome)="setCapitalizedIncome($event)"
[buyDownFeeCalculationTypeOptions]="loanProductAndTemplate.buyDownFeeCalculationTypeOptions"
[buyDownFeeStrategyOptions]="loanProductAndTemplate.buyDownFeeStrategyOptions"
[buyDownFeeIncomeTypeOptions]="loanProductAndTemplate.buyDownFeeIncomeTypeOptions"
(setDeferredIncomeRecognition)="setDeferredIncomeRecognition($event)"
(setViewChildForm)="setViewChildForm($event)"
>
</mifosx-loan-product-capitalized-income-step>
@@ -116,7 +119,7 @@
[loanProductsTemplate]="loanProductAndTemplate"
[accountingRuleData]="accountingRuleData"
[loanProductFormValid]="loanProductFormValidAndNotPristine"
[capitalizedIncome]="capitalizedIncome"
[deferredIncomeRecognition]="deferredIncomeRecognition"
>
</mifosx-loan-product-accounting-step>
</mat-step>
@@ -18,14 +18,14 @@ import {
AdvancedCreditAllocation,
AdvancedPaymentAllocation,
AdvancedPaymentStrategy,
CapitalizedIncome,
DeferredIncomeRecognition,
CreditAllocation,
PaymentAllocation
} from '../loan-product-stepper/loan-product-payment-strategy-step/payment-allocation-model';
import { Accounting } from 'app/core/utils/accounting';
import { LoanProductInterestRefundStepComponent } from '../loan-product-stepper/loan-product-interest-refund-step/loan-product-interest-refund-step.component';
import { StringEnumOptionData } from '../../../shared/models/option-data.model';
import { LoanProductCapitalizedIncomeStepComponent } from '../loan-product-stepper/loan-product-capitalized-income-step/loan-product-capitalized-income-step.component';
import { LoanProductDeferredIncomeRecognitionStepComponent } from '../loan-product-stepper/loan-product-capitalized-income-step/loan-product-deferred-income-recognition-step.component';
import { UntypedFormGroup } from '@angular/forms';
import { MatStepper, MatStepperIcon, MatStep, MatStepLabel } from '@angular/material/stepper';
import { FaIconComponent } from '@fortawesome/angular-fontawesome';
@@ -53,7 +53,7 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
LoanProductPaymentStrategyStepComponent,
LoanProductTermsStepComponent,
LoanProductChargesStepComponent,
LoanProductCapitalizedIncomeStepComponent,
LoanProductDeferredIncomeRecognitionStepComponent,
LoanProductAccountingStepComponent,
LoanProductPreviewStepComponent
]
@@ -64,8 +64,8 @@ export class EditLoanProductComponent implements OnInit {
loanProductCurrencyStep: LoanProductCurrencyStepComponent;
@ViewChild(LoanProductInterestRefundStepComponent, { static: true })
loanProductInterestRefundStep: LoanProductInterestRefundStepComponent;
@ViewChild(LoanProductCapitalizedIncomeStepComponent, { static: true })
loanProductCapitalizedIncomeStep: LoanProductCapitalizedIncomeStepComponent;
@ViewChild(LoanProductDeferredIncomeRecognitionStepComponent, { static: true })
loanProductCapitalizedIncomeStep: LoanProductDeferredIncomeRecognitionStepComponent;
@ViewChild(LoanProductTermsStepComponent, { static: true }) loanProductTermsStep: LoanProductTermsStepComponent;
@ViewChild(LoanProductSettingsStepComponent, { static: true })
loanProductSettingsStep: LoanProductSettingsStepComponent;
@@ -85,7 +85,7 @@ export class EditLoanProductComponent implements OnInit {
advancedCreditAllocations: AdvancedCreditAllocation[] = [];
supportedInterestRefundTypes: StringEnumOptionData[] = [];
capitalizedIncome: CapitalizedIncome | null = null;
deferredIncomeRecognition: DeferredIncomeRecognition | null = null;
loanIncomeCapitalizationForm: UntypedFormGroup | null = null;
/**
@@ -123,18 +123,33 @@ export class EditLoanProductComponent implements OnInit {
this.paymentAllocation = this.loanProductAndTemplate.paymentAllocation;
this.creditAllocation = this.loanProductAndTemplate.creditAllocation;
this.supportedInterestRefundTypes = this.loanProductAndTemplate.supportedInterestRefundTypes;
if (this.deferredIncomeRecognition == null) {
this.deferredIncomeRecognition = {};
}
if (this.loanProductAndTemplate.enableIncomeCapitalization) {
this.capitalizedIncome = {
this.deferredIncomeRecognition.capitalizedIncome = {
enableIncomeCapitalization: true,
capitalizedIncomeCalculationType: this.loanProductAndTemplate.capitalizedIncomeCalculationType.id,
capitalizedIncomeStrategy: this.loanProductAndTemplate.capitalizedIncomeStrategy.id,
capitalizedIncomeType: this.loanProductAndTemplate.capitalizedIncomeType.id
};
} else {
this.capitalizedIncome = {
this.deferredIncomeRecognition.capitalizedIncome = {
enableIncomeCapitalization: false
};
}
if (this.loanProductAndTemplate.enableBuyDownFee) {
this.deferredIncomeRecognition.buyDownFee = {
enableBuyDownFee: true,
buyDownFeeCalculationType: this.loanProductAndTemplate.buyDownFeeCalculationType.id,
buyDownFeeStrategy: this.loanProductAndTemplate.buyDownFeeStrategy.id,
buyDownFeeIncomeType: this.loanProductAndTemplate.buyDownFeeIncomeType.id
};
} else {
this.deferredIncomeRecognition.buyDownFee = {
enableBuyDownFee: false
};
}
}
}
@@ -195,9 +210,9 @@ export class EditLoanProductComponent implements OnInit {
this.wasPaymentAllocationChanged = value;
}
setCapitalizedIncome(capitalizedIncome: CapitalizedIncome): void {
setDeferredIncomeRecognition(deferredIncomeRecognition: DeferredIncomeRecognition): void {
if (this.isAdvancedPaymentStrategy) {
this.capitalizedIncome = capitalizedIncome;
this.deferredIncomeRecognition = deferredIncomeRecognition;
}
}
@@ -259,12 +274,27 @@ export class EditLoanProductComponent implements OnInit {
loanProduct['paymentAllocation'] = this.paymentAllocation;
loanProduct['creditAllocation'] = this.creditAllocation;
loanProduct['supportedInterestRefundTypes'] = this.supportedInterestRefundTypes;
if (this.capitalizedIncome != null) {
loanProduct['enableIncomeCapitalization'] = this.capitalizedIncome.enableIncomeCapitalization;
if (this.capitalizedIncome.enableIncomeCapitalization) {
loanProduct['capitalizedIncomeCalculationType'] = this.capitalizedIncome.capitalizedIncomeCalculationType;
loanProduct['capitalizedIncomeStrategy'] = this.capitalizedIncome.capitalizedIncomeStrategy;
loanProduct['capitalizedIncomeType'] = this.capitalizedIncome.capitalizedIncomeType;
if (this.deferredIncomeRecognition != null) {
if (this.deferredIncomeRecognition.capitalizedIncome != null) {
loanProduct['enableIncomeCapitalization'] =
this.deferredIncomeRecognition.capitalizedIncome.enableIncomeCapitalization;
if (this.deferredIncomeRecognition.capitalizedIncome.enableIncomeCapitalization) {
loanProduct['capitalizedIncomeCalculationType'] =
this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeCalculationType;
loanProduct['capitalizedIncomeStrategy'] =
this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeStrategy;
loanProduct['capitalizedIncomeType'] =
this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeType;
}
}
if (this.deferredIncomeRecognition.buyDownFee != null) {
loanProduct['enableBuyDownFee'] = this.deferredIncomeRecognition.buyDownFee.enableBuyDownFee;
if (this.deferredIncomeRecognition.buyDownFee.enableBuyDownFee) {
loanProduct['buyDownFeeCalculationType'] =
this.deferredIncomeRecognition.buyDownFee.buyDownFeeCalculationType;
loanProduct['buyDownFeeStrategy'] = this.deferredIncomeRecognition.buyDownFee.buyDownFeeStrategy;
loanProduct['buyDownFeeIncomeType'] = this.deferredIncomeRecognition.buyDownFee.buyDownFeeIncomeType;
}
}
}
}
@@ -181,7 +181,7 @@
</mifosx-gl-account-selector>
<mifosx-gl-account-selector
*ngIf="capitalizedIncome?.enableIncomeCapitalization"
*ngIf="deferredIncomeRecognition?.capitalizedIncome?.enableIncomeCapitalization"
class="flex-48"
[inputFormControl]="loanProductAccountingForm.controls.incomeFromCapitalizationAccountId"
[glAccountList]="incomeAccountData"
@@ -244,7 +244,7 @@
</mifosx-gl-account-selector>
<mifosx-gl-account-selector
*ngIf="capitalizedIncome?.enableIncomeCapitalization"
*ngIf="deferredIncomeRecognition?.capitalizedIncome?.enableIncomeCapitalization"
class="flex-48"
[inputFormControl]="loanProductAccountingForm.controls.deferredIncomeLiabilityAccountId"
[glAccountList]="liabilityAccountData"
@@ -16,7 +16,7 @@ import { TranslateService } from '@ngx-translate/core';
import { FormfieldBase } from 'app/shared/form-dialog/formfield/model/formfield-base';
import { SelectBase } from 'app/shared/form-dialog/formfield/model/select-base';
import { ChargeOffReasonToExpenseAccountMapping } from 'app/shared/models/general.model';
import { CapitalizedIncome } from '../loan-product-payment-strategy-step/payment-allocation-model';
import { DeferredIncomeRecognition } from '../loan-product-payment-strategy-step/payment-allocation-model';
import { MatRadioGroup, MatRadioButton } from '@angular/material/radio';
import { MatDivider } from '@angular/material/divider';
import { MatCheckbox } from '@angular/material/checkbox';
@@ -71,7 +71,7 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
@Input() loanProductsTemplate: any;
@Input() accountingRuleData: any;
@Input() loanProductFormValid: boolean;
@Input() capitalizedIncome: CapitalizedIncome;
@Input() deferredIncomeRecognition: DeferredIncomeRecognition;
loanProductAccountingForm: UntypedFormGroup;
@@ -115,7 +115,7 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
}
ngOnChanges(changes: SimpleChanges): void {
this.setCapitalizedIncomeControls();
this.setDeferredIncomeRecognitionControls();
}
ngOnInit() {
@@ -136,7 +136,7 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
});
const accountingMappings = this.loanProductsTemplate.accountingMappings;
this.setCapitalizedIncomeControls();
this.setDeferredIncomeRecognitionControls();
switch (this.loanProductsTemplate.accountingRule.id) {
case 3:
case 4:
@@ -148,11 +148,13 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
this.loanProductAccountingForm.patchValue({
enableAccrualActivityPosting: this.loanProductsTemplate.enableAccrualActivityPosting
});
if (this.capitalizedIncome && this.capitalizedIncome.enableIncomeCapitalization) {
this.loanProductAccountingForm.patchValue({
deferredIncomeLiabilityAccountId: accountingMappings.deferredIncomeLiabilityAccount.id,
incomeFromCapitalizationAccountId: accountingMappings.incomeFromCapitalizationAccount.id
});
if (this.deferredIncomeRecognition) {
if (this.deferredIncomeRecognition.capitalizedIncome.enableIncomeCapitalization) {
this.loanProductAccountingForm.patchValue({
deferredIncomeLiabilityAccountId: accountingMappings.deferredIncomeLiabilityAccount.id,
incomeFromCapitalizationAccountId: accountingMappings.incomeFromCapitalizationAccount.id
});
}
}
/* falls through */
case 2:
@@ -589,20 +591,22 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
return this.loanProductAccountingForm.value;
}
setCapitalizedIncomeControls() {
setDeferredIncomeRecognitionControls() {
if (this.isAccountingAccrualBased) {
if (this.capitalizedIncome && this.capitalizedIncome.enableIncomeCapitalization) {
this.loanProductAccountingForm.addControl(
'deferredIncomeLiabilityAccountId',
new UntypedFormControl('', Validators.required)
);
this.loanProductAccountingForm.addControl(
'incomeFromCapitalizationAccountId',
new UntypedFormControl('', Validators.required)
);
} else {
this.loanProductAccountingForm.removeControl('deferredIncomeLiabilityAccountId');
this.loanProductAccountingForm.removeControl('incomeFromCapitalizationAccountId');
if (this.deferredIncomeRecognition) {
if (this.deferredIncomeRecognition.capitalizedIncome.enableIncomeCapitalization) {
this.loanProductAccountingForm.addControl(
'deferredIncomeLiabilityAccountId',
new UntypedFormControl('', Validators.required)
);
this.loanProductAccountingForm.addControl(
'incomeFromCapitalizationAccountId',
new UntypedFormControl('', Validators.required)
);
} else {
this.loanProductAccountingForm.removeControl('deferredIncomeLiabilityAccountId');
this.loanProductAccountingForm.removeControl('incomeFromCapitalizationAccountId');
}
}
}
}
@@ -1,158 +0,0 @@
import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';
import {
UntypedFormBuilder,
UntypedFormControl,
UntypedFormGroup,
Validators,
ReactiveFormsModule
} from '@angular/forms';
import { CapitalizedIncome } from '../loan-product-payment-strategy-step/payment-allocation-model';
import { StringEnumOptionData } from 'app/shared/models/option-data.model';
import { MatCheckbox } from '@angular/material/checkbox';
import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
@Component({
selector: 'mifosx-loan-product-capitalized-income-step',
templateUrl: './loan-product-capitalized-income-step.component.html',
styleUrls: ['./loan-product-capitalized-income-step.component.scss'],
imports: [
...STANDALONE_SHARED_IMPORTS,
MatCheckbox
]
})
export class LoanProductCapitalizedIncomeStepComponent implements OnChanges {
@Input() capitalizedIncome: CapitalizedIncome;
@Input() capitalizedIncomeCalculationTypeOptions: StringEnumOptionData[];
@Input() capitalizedIncomeStrategyOptions: StringEnumOptionData[];
@Input() capitalizedIncomeTypeOptions: StringEnumOptionData[];
loanIncomeCapitalizationForm: UntypedFormGroup;
enableIncomeCapitalization: boolean;
@Output() setCapitalizedIncome = new EventEmitter<CapitalizedIncome>();
@Output() setViewChildForm = new EventEmitter<UntypedFormGroup>();
constructor(private formBuilder: UntypedFormBuilder) {
this.enableIncomeCapitalization =
this.capitalizedIncome != null ? this.capitalizedIncome.enableIncomeCapitalization : false;
this.createCapitalizedIncomeForm();
this.setConditionalControls();
}
createCapitalizedIncomeForm() {
if (this.enableIncomeCapitalization) {
this.loanIncomeCapitalizationForm = this.formBuilder.group({
enableIncomeCapitalization: [this.enableIncomeCapitalization],
capitalizedIncomeCalculationType: [
this.capitalizedIncome.capitalizedIncomeCalculationType,
Validators.required
],
capitalizedIncomeStrategy: [
this.capitalizedIncome.capitalizedIncomeStrategy,
Validators.required
],
capitalizedIncomeType: [
this.capitalizedIncome.capitalizedIncomeType,
Validators.required
]
});
} else {
this.loanIncomeCapitalizationForm = this.formBuilder.group({
enableIncomeCapitalization: [this.enableIncomeCapitalization]
});
}
this.setViewChildForm.emit(this.loanIncomeCapitalizationForm);
}
ngOnChanges(changes: SimpleChanges): void {
this.enableIncomeCapitalization = this.capitalizedIncome
? this.capitalizedIncome.enableIncomeCapitalization
: false;
if (this.enableIncomeCapitalization) {
this.loanIncomeCapitalizationForm.patchValue({
enableIncomeCapitalization: this.enableIncomeCapitalization,
capitalizedIncomeCalculationType: this.capitalizedIncome.capitalizedIncomeCalculationType,
capitalizedIncomeStrategy: this.capitalizedIncome.capitalizedIncomeStrategy,
capitalizedIncomeType: this.capitalizedIncome.capitalizedIncomeType
});
}
this.setViewChildForm.emit(this.loanIncomeCapitalizationForm);
}
setConditionalControls() {
this.loanIncomeCapitalizationForm.get('enableIncomeCapitalization').valueChanges.subscribe((enabled: boolean) => {
this.enableIncomeCapitalization = enabled;
if (this.enableIncomeCapitalization) {
const capitalizedIncomeCalculationType =
!this.capitalizedIncome.capitalizedIncomeCalculationType ||
this.capitalizedIncome.capitalizedIncomeCalculationType == ''
? this.capitalizedIncomeCalculationTypeOptions[0].id
: this.capitalizedIncome.capitalizedIncomeCalculationType;
this.loanIncomeCapitalizationForm.addControl(
'capitalizedIncomeCalculationType',
new UntypedFormControl(capitalizedIncomeCalculationType, Validators.required)
);
const capitalizedIncomeStrategy =
!this.capitalizedIncome.capitalizedIncomeStrategy || this.capitalizedIncome.capitalizedIncomeStrategy == ''
? this.capitalizedIncomeStrategyOptions[0].id
: this.capitalizedIncome.capitalizedIncomeStrategy;
this.loanIncomeCapitalizationForm.addControl(
'capitalizedIncomeStrategy',
new UntypedFormControl(capitalizedIncomeStrategy, Validators.required)
);
const capitalizedIncomeType =
!this.capitalizedIncome.capitalizedIncomeType || this.capitalizedIncome.capitalizedIncomeType == ''
? this.capitalizedIncomeTypeOptions[0].id
: this.capitalizedIncome.capitalizedIncomeType;
this.loanIncomeCapitalizationForm.addControl(
'capitalizedIncomeType',
new UntypedFormControl(capitalizedIncomeType, Validators.required)
);
this.setCapitalizedIncome.emit({
enableIncomeCapitalization: true,
capitalizedIncomeCalculationType: capitalizedIncomeCalculationType,
capitalizedIncomeStrategy: capitalizedIncomeStrategy,
capitalizedIncomeType: capitalizedIncomeType
});
this.loanIncomeCapitalizationForm
.get('capitalizedIncomeCalculationType')
.valueChanges.subscribe((newValue: string) => {
this.setCapitalizedIncome.emit({
enableIncomeCapitalization: true,
capitalizedIncomeCalculationType: newValue,
capitalizedIncomeStrategy: this.loanIncomeCapitalizationForm.value.capitalizedIncomeStrategy,
capitalizedIncomeType: this.loanIncomeCapitalizationForm.value.capitalizedIncomeType
});
});
this.loanIncomeCapitalizationForm
.get('capitalizedIncomeStrategy')
.valueChanges.subscribe((newValue: string) => {
this.setCapitalizedIncome.emit({
enableIncomeCapitalization: true,
capitalizedIncomeCalculationType:
this.loanIncomeCapitalizationForm.value.capitalizedIncomeCalculationType,
capitalizedIncomeStrategy: newValue,
capitalizedIncomeType: this.loanIncomeCapitalizationForm.value.capitalizedIncomeType
});
});
this.loanIncomeCapitalizationForm.get('capitalizedIncomeType').valueChanges.subscribe((newValue: string) => {
this.setCapitalizedIncome.emit({
enableIncomeCapitalization: true,
capitalizedIncomeCalculationType: this.loanIncomeCapitalizationForm.value.capitalizedIncomeCalculationType,
capitalizedIncomeStrategy: this.loanIncomeCapitalizationForm.value.capitalizedIncomeStrategy,
capitalizedIncomeType: newValue
});
});
} else {
this.loanIncomeCapitalizationForm.removeControl('capitalizedIncomeCalculationType');
this.loanIncomeCapitalizationForm.removeControl('capitalizedIncomeStrategy');
this.loanIncomeCapitalizationForm.removeControl('capitalizedIncomeType');
this.setCapitalizedIncome.emit({ enableIncomeCapitalization: false });
}
this.setViewChildForm.emit(this.loanIncomeCapitalizationForm);
});
}
}
@@ -1,4 +1,4 @@
<form [formGroup]="loanIncomeCapitalizationForm">
<form [formGroup]="loanDeferredIncomeRecognitionForm">
<div class="layout-row-wrap gap-2percent layout-column-lt-md">
<mat-checkbox class="flex-98" labelPosition="before" formControlName="enableIncomeCapitalization">
{{ 'labels.inputs.Enable income capitalization' | translate }}
@@ -38,4 +38,37 @@
</mat-select>
</mat-form-field>
</div>
<div class="layout-row-wrap gap-2percent layout-column-lt-md">
<mat-checkbox class="flex-98" labelPosition="before" formControlName="enableBuyDownFee">
{{ 'labels.inputs.Enable Buy down fee' | translate }}
</mat-checkbox>
<mat-form-field class="flex-48" *ngIf="enableBuyDownFee">
<mat-label>{{ 'labels.inputs.Buy down fee calculation type' | translate }}</mat-label>
<mat-select formControlName="buyDownFeeCalculationType" required>
<mat-option
*ngFor="let buyDownFeeCalculationType of buyDownFeeCalculationTypeOptions"
[value]="buyDownFeeCalculationType.id"
>
{{ buyDownFeeCalculationType.value | translateKey: 'catalogs' }}
</mat-option>
</mat-select>
</mat-form-field>
<mat-form-field class="flex-48" *ngIf="enableBuyDownFee">
<mat-label>{{ 'labels.inputs.Buy down fee strategy' | translate }}</mat-label>
<mat-select formControlName="buyDownFeeStrategy" required>
<mat-option *ngFor="let buyDownFeeStrategy of buyDownFeeStrategyOptions" [value]="buyDownFeeStrategy.id">
{{ buyDownFeeStrategy.value | translateKey: 'catalogs' }}
</mat-option>
</mat-select>
</mat-form-field>
<mat-form-field class="flex-48" *ngIf="enableBuyDownFee">
<mat-label>{{ 'labels.inputs.Buy down fee income type' | translate }}</mat-label>
<mat-select formControlName="buyDownFeeIncomeType" required>
<mat-option *ngFor="let buyDownFeeIncomeType of buyDownFeeIncomeTypeOptions" [value]="buyDownFeeIncomeType.id">
{{ buyDownFeeIncomeType.value | translateKey: 'catalogs' }}
</mat-option>
</mat-select>
</mat-form-field>
</div>
</form>
@@ -0,0 +1,257 @@
import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';
import {
UntypedFormBuilder,
UntypedFormControl,
UntypedFormGroup,
Validators,
ReactiveFormsModule
} from '@angular/forms';
import {
DeferredIncomeRecognition,
CapitalizedIncome,
BuyDownFee
} from '../loan-product-payment-strategy-step/payment-allocation-model';
import { StringEnumOptionData } from 'app/shared/models/option-data.model';
import { MatCheckbox } from '@angular/material/checkbox';
import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
@Component({
selector: 'mifosx-loan-product-capitalized-income-step',
templateUrl: './loan-product-deferred-income-recognition-step.component.html',
styleUrls: ['./loan-product-deferred-income-recognition-step.component.scss'],
imports: [
...STANDALONE_SHARED_IMPORTS,
MatCheckbox
]
})
export class LoanProductDeferredIncomeRecognitionStepComponent implements OnChanges {
@Input() deferredIncomeRecognition: DeferredIncomeRecognition;
@Input() capitalizedIncomeCalculationTypeOptions: StringEnumOptionData[];
@Input() capitalizedIncomeStrategyOptions: StringEnumOptionData[];
@Input() capitalizedIncomeTypeOptions: StringEnumOptionData[];
@Input() buyDownFeeCalculationTypeOptions: StringEnumOptionData[];
@Input() buyDownFeeStrategyOptions: StringEnumOptionData[];
@Input() buyDownFeeIncomeTypeOptions: StringEnumOptionData[];
loanDeferredIncomeRecognitionForm: UntypedFormGroup;
enableIncomeCapitalization: boolean;
enableBuyDownFee: boolean;
@Output() setDeferredIncomeRecognition = new EventEmitter<DeferredIncomeRecognition>();
@Output() setViewChildForm = new EventEmitter<UntypedFormGroup>();
constructor(private formBuilder: UntypedFormBuilder) {
this.enableIncomeCapitalization =
this.deferredIncomeRecognition != null
? this.deferredIncomeRecognition.capitalizedIncome.enableIncomeCapitalization
: false;
this.enableBuyDownFee =
this.deferredIncomeRecognition != null ? this.deferredIncomeRecognition.buyDownFee.enableBuyDownFee : false;
this.createCapitalizedIncomeForm();
this.setConditionalControls();
}
createCapitalizedIncomeForm() {
this.loanDeferredIncomeRecognitionForm = this.formBuilder.group({
enableIncomeCapitalization: [this.enableIncomeCapitalization],
enableBuyDownFee: [this.enableBuyDownFee]
});
if (this.enableIncomeCapitalization) {
this.loanDeferredIncomeRecognitionForm.addControl('capitalizedIncomeCalculationType', [
this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeCalculationType,
Validators.required
]);
this.loanDeferredIncomeRecognitionForm.addControl('capitalizedIncomeStrategy', [
this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeStrategy,
Validators.required
]);
this.loanDeferredIncomeRecognitionForm.addControl('capitalizedIncomeType', [
this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeType,
Validators.required
]);
}
if (this.enableBuyDownFee) {
this.loanDeferredIncomeRecognitionForm.addControl('buyDownFeeCalculationType', [
this.deferredIncomeRecognition.buyDownFee.buyDownFeeCalculationType,
Validators.required
]);
this.loanDeferredIncomeRecognitionForm.addControl('buyDownFeeStrategy', [
this.deferredIncomeRecognition.buyDownFee.buyDownFeeStrategy,
Validators.required
]);
this.loanDeferredIncomeRecognitionForm.addControl('buyDownFeeIncomeType', [
this.deferredIncomeRecognition.buyDownFee.buyDownFeeIncomeType,
Validators.required
]);
}
this.setViewChildForm.emit(this.loanDeferredIncomeRecognitionForm);
}
ngOnChanges(changes: SimpleChanges): void {
this.enableIncomeCapitalization = this.deferredIncomeRecognition.capitalizedIncome
? this.deferredIncomeRecognition.capitalizedIncome.enableIncomeCapitalization
: false;
this.enableBuyDownFee = this.deferredIncomeRecognition.buyDownFee
? this.deferredIncomeRecognition.buyDownFee.enableBuyDownFee
: false;
if (this.enableIncomeCapitalization) {
this.loanDeferredIncomeRecognitionForm.patchValue({
enableIncomeCapitalization: this.enableIncomeCapitalization,
capitalizedIncomeCalculationType:
this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeCalculationType,
capitalizedIncomeStrategy: this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeStrategy,
capitalizedIncomeType: this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeType
});
}
if (this.enableBuyDownFee) {
this.loanDeferredIncomeRecognitionForm.patchValue({
enableBuyDownFee: this.enableBuyDownFee,
buyDownFeeCalculationType: this.deferredIncomeRecognition.buyDownFee.buyDownFeeCalculationType,
buyDownFeeStrategy: this.deferredIncomeRecognition.buyDownFee.buyDownFeeStrategy,
buyDownFeeIncomeType: this.deferredIncomeRecognition.buyDownFee.buyDownFeeIncomeType
});
}
this.setViewChildForm.emit(this.loanDeferredIncomeRecognitionForm);
}
setConditionalControls() {
this.loanDeferredIncomeRecognitionForm
.get('enableIncomeCapitalization')
.valueChanges.subscribe((enabled: boolean) => {
this.enableIncomeCapitalization = enabled;
if (this.enableIncomeCapitalization) {
const capitalizedIncomeCalculationType =
!(
this.deferredIncomeRecognition.capitalizedIncome &&
this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeCalculationType
) || this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeCalculationType == ''
? this.capitalizedIncomeCalculationTypeOptions[0].id
: this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeCalculationType;
this.loanDeferredIncomeRecognitionForm.addControl(
'capitalizedIncomeCalculationType',
new UntypedFormControl(capitalizedIncomeCalculationType, Validators.required)
);
const capitalizedIncomeStrategy =
!this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeStrategy ||
this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeStrategy == ''
? this.capitalizedIncomeStrategyOptions[0].id
: this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeStrategy;
this.loanDeferredIncomeRecognitionForm.addControl(
'capitalizedIncomeStrategy',
new UntypedFormControl(capitalizedIncomeStrategy, Validators.required)
);
const capitalizedIncomeType =
!this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeType ||
this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeType == ''
? this.capitalizedIncomeTypeOptions[0].id
: this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeType;
this.loanDeferredIncomeRecognitionForm.addControl(
'capitalizedIncomeType',
new UntypedFormControl(capitalizedIncomeType, Validators.required)
);
this.loanDeferredIncomeRecognitionForm
.get('capitalizedIncomeCalculationType')
.valueChanges.subscribe((newValue: string) => {
this.emitValuesChange();
});
this.loanDeferredIncomeRecognitionForm
.get('capitalizedIncomeStrategy')
.valueChanges.subscribe((newValue: string) => {
this.emitValuesChange();
});
this.loanDeferredIncomeRecognitionForm
.get('capitalizedIncomeType')
.valueChanges.subscribe((newValue: string) => {
this.emitValuesChange();
});
} else {
this.loanDeferredIncomeRecognitionForm.removeControl('capitalizedIncomeCalculationType');
this.loanDeferredIncomeRecognitionForm.removeControl('capitalizedIncomeStrategy');
this.loanDeferredIncomeRecognitionForm.removeControl('capitalizedIncomeType');
}
this.emitValuesChange();
this.setViewChildForm.emit(this.loanDeferredIncomeRecognitionForm);
});
this.loanDeferredIncomeRecognitionForm.get('enableBuyDownFee').valueChanges.subscribe((enabled: boolean) => {
this.enableBuyDownFee = enabled;
if (this.enableBuyDownFee) {
const buyDownFeeCalculationType =
!this.deferredIncomeRecognition.buyDownFee.buyDownFeeCalculationType ||
this.deferredIncomeRecognition.buyDownFee.buyDownFeeCalculationType == ''
? this.buyDownFeeCalculationTypeOptions[0].id
: this.deferredIncomeRecognition.buyDownFee.buyDownFeeCalculationType;
this.loanDeferredIncomeRecognitionForm.addControl(
'buyDownFeeCalculationType',
new UntypedFormControl(buyDownFeeCalculationType, Validators.required)
);
const buyDownFeeStrategy =
!this.deferredIncomeRecognition.buyDownFee.buyDownFeeStrategy ||
this.deferredIncomeRecognition.buyDownFee.buyDownFeeStrategy == ''
? this.buyDownFeeStrategyOptions[0].id
: this.deferredIncomeRecognition.buyDownFee.buyDownFeeStrategy;
this.loanDeferredIncomeRecognitionForm.addControl(
'buyDownFeeStrategy',
new UntypedFormControl(buyDownFeeStrategy, Validators.required)
);
const buyDownFeeIncomeType =
!this.deferredIncomeRecognition.buyDownFee.buyDownFeeIncomeType ||
this.deferredIncomeRecognition.buyDownFee.buyDownFeeIncomeType == ''
? this.buyDownFeeIncomeTypeOptions[0].id
: this.deferredIncomeRecognition.buyDownFee.buyDownFeeIncomeType;
this.loanDeferredIncomeRecognitionForm.addControl(
'buyDownFeeIncomeType',
new UntypedFormControl(buyDownFeeIncomeType, Validators.required)
);
this.loanDeferredIncomeRecognitionForm
.get('buyDownFeeCalculationType')
.valueChanges.subscribe((newValue: string) => {
this.emitValuesChange();
});
this.loanDeferredIncomeRecognitionForm.get('buyDownFeeStrategy').valueChanges.subscribe((newValue: string) => {
this.emitValuesChange();
});
this.loanDeferredIncomeRecognitionForm
.get('buyDownFeeIncomeType')
.valueChanges.subscribe((newValue: string) => {
this.emitValuesChange();
});
} else {
this.loanDeferredIncomeRecognitionForm.removeControl('buyDownFeeCalculationType');
this.loanDeferredIncomeRecognitionForm.removeControl('buyDownFeeStrategy');
this.loanDeferredIncomeRecognitionForm.removeControl('buyDownFeeIncomeType');
}
this.emitValuesChange();
this.setViewChildForm.emit(this.loanDeferredIncomeRecognitionForm);
});
}
emitValuesChange(): void {
const capitalizedIncome: CapitalizedIncome = this.enableIncomeCapitalization
? {
enableIncomeCapitalization: true,
capitalizedIncomeCalculationType:
this.loanDeferredIncomeRecognitionForm.value.capitalizedIncomeCalculationType,
capitalizedIncomeStrategy: this.loanDeferredIncomeRecognitionForm.value.capitalizedIncomeStrategy,
capitalizedIncomeType: this.loanDeferredIncomeRecognitionForm.value.capitalizedIncomeType
}
: { enableIncomeCapitalization: false };
const buyDownFee: BuyDownFee = this.enableBuyDownFee
? {
enableBuyDownFee: true,
buyDownFeeCalculationType: this.loanDeferredIncomeRecognitionForm.value.buyDownFeeCalculationType,
buyDownFeeStrategy: this.loanDeferredIncomeRecognitionForm.value.buyDownFeeStrategy,
buyDownFeeIncomeType: this.loanDeferredIncomeRecognitionForm.value.buyDownFeeIncomeType
}
: { enableBuyDownFee: false };
this.setDeferredIncomeRecognition.emit({
capitalizedIncome: capitalizedIncome,
buyDownFee: buyDownFee
});
}
}
@@ -49,6 +49,18 @@ export interface CapitalizedIncome {
capitalizedIncomeType?: string;
}
export interface BuyDownFee {
enableBuyDownFee: boolean;
buyDownFeeCalculationType?: string;
buyDownFeeStrategy?: string;
buyDownFeeIncomeType?: string;
}
export interface DeferredIncomeRecognition {
capitalizedIncome?: CapitalizedIncome;
buyDownFee?: BuyDownFee;
}
export class PaymentAllocationTransactionTypes {
public static DEFAULT_TRANSACTION: PaymentAllocationTransactionType = { id: 1, value: 'Default', code: 'DEFAULT' };
}
@@ -71,6 +71,11 @@ export interface LoanProduct {
capitalizedIncomeStrategy?: OptionData;
capitalizedIncomeType?: OptionData;
enableBuyDownFee?: boolean;
buyDownFeeCalculationType?: OptionData;
buyDownFeeStrategy?: OptionData;
buyDownFeeIncomeType?: OptionData;
canDefineInstallmentAmount: boolean;
graceOnArrearsAgeing?: number;
overdueDaysForNPA?: number;
+2 -2
View File
@@ -121,7 +121,7 @@ import { LoanProductPaymentStrategyStepComponent } from './loan-products/loan-pr
import { ViewAdvancePaymenyAllocationComponent } from './loan-products/view-loan-product/shared/view-advance-paymeny-allocation/view-advance-paymeny-allocation.component';
import { AdvancePaymentAllocationTabComponent } from './loan-products/loan-product-stepper/loan-product-payment-strategy-step/advance-payment-allocation-tab/advance-payment-allocation-tab.component';
import { LoanProductSummaryComponent } from './loan-products/common/loan-product-summary/loan-product-summary.component';
import { LoanProductCapitalizedIncomeStepComponent } from './loan-products/loan-product-stepper/loan-product-capitalized-income-step/loan-product-capitalized-income-step.component';
import { LoanProductDeferredIncomeRecognitionStepComponent } from './loan-products/loan-product-stepper/loan-product-capitalized-income-step/loan-product-deferred-income-recognition-step.component';
/**
* Products Module
@@ -249,7 +249,7 @@ import { LoanProductCapitalizedIncomeStepComponent } from './loan-products/loan-
ViewAdvancePaymenyAllocationComponent,
AdvancePaymentAllocationTabComponent,
LoanProductSummaryComponent,
LoanProductCapitalizedIncomeStepComponent
LoanProductDeferredIncomeRecognitionStepComponent
]
})
export class ProductsModule {}
+7 -1
View File
@@ -2471,7 +2471,13 @@
"Enable income capitalization": "Povolit kapitalizaci příjmu",
"Income capitalization calculation type": "Typ výpočtu kapitalizace příjmu",
"Income capitalization strategy": "Strategie kapitalizace příjmu",
"Income capitalization type": "Typ kapitalizace příjmu"
"Income capitalization type": "Typ kapitalizace příjmu",
"DEFERRED INCOME RECOGNITION": "Vykazování odložených výnosů",
"Enable Buy down fee": "Povolit poplatek za odkup",
"Buy down fee calculation type": "Typ výpočtu poplatku za odkup",
"Buy down fee strategy": "Strategie poplatku za odkup",
"Buy down fee income type": "Typ příjmu z poplatku za odkup",
"Buy down fees": "Poplatky za odkup"
},
"links": {
"Community": "Společenství",
+7 -1
View File
@@ -2471,7 +2471,13 @@
"Enable income capitalization": "Aktivieren Sie die Einkommenskapitalisierung",
"Income capitalization calculation type": "Berechnungsart der Einkommenskapitalisierung",
"Income capitalization strategy": "Strategie zur Ertragskapitalisierung",
"Income capitalization type": "Art der Ertragskapitalisierung"
"Income capitalization type": "Art der Ertragskapitalisierung",
"DEFERRED INCOME RECOGNITION": "Erfassung abgegrenzter Erträge",
"Enable Buy down fee": "Buy-Down-Gebühr aktivieren",
"Buy down fee calculation type": "Berechnungsart der Buy-Down-Gebühr",
"Buy down fee strategy": "Strategie für Buy-Down-Gebühr",
"Buy down fee income type": "Einnahmeart der Buy-Down-Gebühr",
"Buy down fees": "Buy-Down-Gebühren"
},
"links": {
"Community": "Gemeinschaft",
+7 -1
View File
@@ -2478,7 +2478,13 @@
"Enable income capitalization": "Enable income capitalization",
"Income capitalization calculation type": "Income capitalization calculation type",
"Income capitalization strategy": "Income capitalization strategy",
"Income capitalization type": "Income capitalization type"
"Income capitalization type": "Income capitalization type",
"DEFERRED INCOME RECOGNITION": "Deferred income recognition",
"Enable Buy down fee": "Enable Buy down fee",
"Buy down fee calculation type": "Buy down fee calculation type",
"Buy down fee strategy": "Buy down fee strategy",
"Buy down fee income type": "Buy down fee income type",
"Buy down fees": "Buy down fees"
},
"links": {
"Community": "Community",
+7 -1
View File
@@ -2471,7 +2471,13 @@
"Enable income capitalization": "Habilitar capitalización de ingresos",
"Income capitalization calculation type": "Tipo de cálculo de capitalización de ingresos",
"Income capitalization strategy": "Estrategia de capitalización de ingresos",
"Income capitalization type": "Tipo de capitalización de ingresos"
"Income capitalization type": "Tipo de capitalización de ingresos",
"DEFERRED INCOME RECOGNITION": "Reconocimiento de ingresos diferidos",
"Enable Buy down fee": "Habilitar comisión de compra anticipada",
"Buy down fee calculation type": "Tipo de cálculo de comisión de compra anticipada",
"Buy down fee strategy": "Estrategia de comisión de compra anticipada",
"Buy down fee income type": "Tipo de ingreso de comisión de compra anticipada",
"Buy down fees": "Tarifas de compra anticipada"
},
"links": {
"Community": "Comunidad",
+7 -1
View File
@@ -2471,7 +2471,13 @@
"Enable income capitalization": "Habilitar capitalización de ingresos",
"Income capitalization calculation type": "Tipo de cálculo de capitalización de ingresos",
"Income capitalization strategy": "Estrategia de capitalización de ingresos",
"Income capitalization type": "Tipo de capitalización de ingresos"
"Income capitalization type": "Tipo de capitalización de ingresos",
"DEFERRED INCOME RECOGNITION": "Reconocimiento de ingresos diferidos",
"Enable Buy down fee": "Habilitar comisión de compra anticipada",
"Buy down fee calculation type": "Tipo de cálculo de comisión de compra anticipada",
"Buy down fee strategy": "Estrategia de comisión de compra anticipada",
"Buy down fee income type": "Tipo de ingreso de comisión de compra anticipada",
"Buy down fees": "Tarifas de compra anticipada"
},
"links": {
"Community": "Comunidad",
+7 -1
View File
@@ -2471,7 +2471,13 @@
"Enable income capitalization": "Activer la capitalisation des revenus",
"Income capitalization calculation type": "Type de calcul de capitalisation des revenus",
"Income capitalization strategy": "Stratégie de capitalisation des revenus",
"Income capitalization type": "Type de capitalisation des revenus"
"Income capitalization type": "Type de capitalisation des revenus",
"DEFERRED INCOME RECOGNITION": "Comptabilisation des produits différés",
"Enable Buy down fee": "Activer les frais de rachat",
"Buy down fee calculation type": "Type de calcul des frais de rachat",
"Buy down fee strategy": "Stratégie des frais de rachat",
"Buy down fee income type": "Type de revenu des frais de rachat",
"Buy down fees": "Frais d'achat"
},
"links": {
"Community": "Communauté",
+7 -1
View File
@@ -2471,7 +2471,13 @@
"Enable income capitalization": "Abilita la capitalizzazione del reddito",
"Income capitalization calculation type": "Tipo di calcolo della capitalizzazione del reddito",
"Income capitalization strategy": "Strategia di capitalizzazione del reddito",
"Income capitalization type": "Tipo di capitalizzazione del reddito"
"Income capitalization type": "Tipo di capitalizzazione del reddito",
"DEFERRED INCOME RECOGNITION": "Rilevazione dei risconti passivi",
"Enable Buy down fee": "Abilita commissione di buy down",
"Buy down fee calculation type": "Tipo di calcolo della commissione di buy down",
"Buy down fee strategy": "Strategia per la commissione di buy down",
"Buy down fee income type": "Tipo di ricavo da commissione di buy down",
"Buy down fees": "Commissioni di acquisto"
},
"links": {
"Community": "Comunità",
+7 -1
View File
@@ -2472,7 +2472,13 @@
"Enable income capitalization": "소득 자본화 활성화",
"Income capitalization calculation type": "소득 자본화 계산 유형",
"Income capitalization strategy": "소득 자본화 전략",
"Income capitalization type": "소득 자본화 유형"
"Income capitalization type": "소득 자본화 유형",
"DEFERRED INCOME RECOGNITION": "이연수익 인식",
"Enable Buy down fee": "매수 수수료 활성화",
"Buy down fee calculation type": "매수 수수료 계산 유형",
"Buy down fee strategy": "매수 수수료 전략",
"Buy down fee income type": "매수 수수료 수익 유형",
"Buy down fees": "매수 수수료"
},
"links": {
"Community": "지역 사회",
+7 -1
View File
@@ -2471,7 +2471,13 @@
"Enable income capitalization": "Įgalinti pajamų kapitalizaciją",
"Income capitalization calculation type": "Pajamų kapitalizavimo skaičiavimo tipas",
"Income capitalization strategy": "Pajamų kapitalizavimo strategija",
"Income capitalization type": "Pajamų kapitalizacijos tipas"
"Income capitalization type": "Pajamų kapitalizacijos tipas",
"DEFERRED INCOME RECOGNITION": "Atidėtųjų pajamų pripažinimas",
"Enable Buy down fee": "Įjungti supirkimo mokestį",
"Buy down fee calculation type": "Supirkimo mokesčio skaičiavimo tipas",
"Buy down fee strategy": "Supirkimo mokesčio strategija",
"Buy down fee income type": "Supirkimo mokesčio pajamų tipas",
"Buy down fees": "Išpirkimo mokesčiai"
},
"links": {
"Community": "bendruomenė",
+7 -1
View File
@@ -2471,7 +2471,13 @@
"Enable income capitalization": "Iespējot ienākumu kapitalizāciju",
"Income capitalization calculation type": "Ienākumu kapitalizācijas aprēķina veids",
"Income capitalization strategy": "Ienākumu kapitalizācijas stratēģija",
"Income capitalization type": "Ienākumu kapitalizācijas veids"
"Income capitalization type": "Ienākumu kapitalizācijas veids",
"DEFERRED INCOME RECOGNITION": "Atliktā ienākuma atzīšana",
"Enable Buy down fee": "Iespējot atpirkšanas maksu",
"Buy down fee calculation type": "Atpirkšanas maksas aprēķina veids",
"Buy down fee strategy": "Atpirkšanas maksas stratēģija",
"Buy down fee income type": "Atpirkšanas maksas ienākumu veids",
"Buy down fees": "Iepirkuma maksas"
},
"links": {
"Community": "kopiena",
+7 -1
View File
@@ -2471,7 +2471,13 @@
"Enable income capitalization": "आय पूंजीकरण सक्षम गर्नुहोस्",
"Income capitalization calculation type": "आय पूंजीकरण गणना प्रकार",
"Income capitalization strategy": "आय पूंजीकरण रणनीति",
"Income capitalization type": "आय पूँजीकरण प्रकार"
"Income capitalization type": "आय पूँजीकरण प्रकार",
"DEFERRED INCOME RECOGNITION": "स्थगित आय पहिचान",
"Enable Buy down fee": "बाइ डाउन शुल्क सक्षम गर्नुहोस्",
"Buy down fee calculation type": "बाइ डाउन शुल्क गणना प्रकार",
"Buy down fee strategy": "बाइ डाउन शुल्क रणनीति",
"Buy down fee income type": "बाइ डाउन शुल्क आय प्रकार",
"Buy down fees": "खरिद शुल्क"
},
"links": {
"Community": "समुदाय",
+7 -1
View File
@@ -2471,7 +2471,13 @@
"Enable income capitalization": "Habilitar capitalização de renda",
"Income capitalization calculation type": "Tipo de cálculo de capitalização de renda",
"Income capitalization strategy": "Estratégia de capitalização de renda",
"Income capitalization type": "Tipo de capitalização de renda"
"Income capitalization type": "Tipo de capitalização de renda",
"DEFERRED INCOME RECOGNITION": "Reconhecimento de receita diferida",
"Enable Buy down fee": "Habilitar taxa de aquisição",
"Buy down fee calculation type": "Tipo de cálculo de taxa de aquisição",
"Buy down fee strategy": "Estratégia de taxa de aquisição",
"Buy down fee income type": "Tipo de receita de taxa de aquisição",
"Buy down fees": "Taxas de compra antecipada"
},
"links": {
"Community": "Comunidade",
+7 -1
View File
@@ -2471,7 +2471,13 @@
"Enable income capitalization": "Washa mtaji wa mapato",
"Income capitalization calculation type": "Aina ya kukokotoa mtaji wa mapato",
"Income capitalization strategy": "Mkakati wa mtaji wa mapato",
"Income capitalization type": "Aina ya mtaji wa mapato"
"Income capitalization type": "Aina ya mtaji wa mapato",
"DEFERRED INCOME RECOGNITION": "Utambuzi wa mapato ulioahirishwa",
"Enable Buy down fee": "Washa ada ya Kununua chini",
"Buy down fee calculation type": "Nunua aina ya hesabu ya ada ya chini",
"Buy down fee strategy": "Nunua mkakati wa ada ya chini",
"Buy down fee income type": "Nunua aina ya mapato ya chini",
"Buy down fees": "Nunua ada za chini"
},
"links": {
"Community": "Jumuiya",