Skip to content

Commit 6fbdd94

Browse files
committed
WEB-204: Loan product config - buy down fees
1 parent d657048 commit 6fbdd94

29 files changed

+601
-245
lines changed

src/app/loans/loans-view/account-details/account-details.component.html

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,28 @@ <h3>{{ 'labels.heading.Loan Details' | translate }}</h3>
101101
<span class="flex-50"> {{ loanDetails.capitalizedIncomeType?.value | translateKey: 'catalogs' }} </span>
102102
</div>
103103

104+
<div class="flex-fill layout-row">
105+
<span class="flex-50"> {{ 'labels.inputs.Enable Buy down fee' | translate }}</span>
106+
<span class="flex-50"> {{ loanDetails.enableBuyDownFee | yesNo }} </span>
107+
</div>
108+
109+
<div class="flex-fill layout-row" *ngIf="loanDetails.enableBuyDownFee">
110+
<span class="flex-50"> {{ 'labels.inputs.Buy down fee calculation type' | translate }}</span>
111+
<span class="flex-50">
112+
{{ loanDetails.buyDownFeeCalculationType?.value | translateKey: 'catalogs' }}
113+
</span>
114+
</div>
115+
116+
<div class="flex-fill layout-row" *ngIf="loanDetails.enableBuyDownFee">
117+
<span class="flex-50"> {{ 'labels.inputs.Buy down fee strategy' | translate }}</span>
118+
<span class="flex-50"> {{ loanDetails.buyDownFeeStrategy?.value | translateKey: 'catalogs' }} </span>
119+
</div>
120+
121+
<div class="flex-fill layout-row" *ngIf="loanDetails.enableBuyDownFee">
122+
<span class="flex-50"> {{ 'labels.inputs.Buy down fee income type' | translate }}</span>
123+
<span class="flex-50"> {{ loanDetails.buyDownFeeIncomeType?.value | translateKey: 'catalogs' }} </span>
124+
</div>
125+
104126
<div class="flex-fill layout-row">
105127
<span class="flex-50"> {{ 'labels.inputs.Grace: On Principal Payment' | translate }}</span>
106128
<span class="flex-50"> {{ loanDetails.graceOnPrincipalPayment }} </span>

src/app/products/loan-products/common/loan-product-summary/loan-product-summary.component.html

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -875,10 +875,31 @@ <h3 class="mat-h3 flex-100">{{ 'labels.inputs.Income capitalization' | translate
875875
<span class="flex-47">{{ 'labels.inputs.Income type' | translate }}:</span>
876876
<span class="flex-53">{{ loanProduct.capitalizedIncomeType?.value | translateKey: 'catalogs' }}</span>
877877
</div>
878+
</div>
879+
880+
<div class="flex-100 layout-row-wrap responsive-column" *ngIf="isAdvancedPaymentAllocation">
881+
<h3 class="mat-h3 flex-100">{{ 'labels.inputs.Buy down fees' | translate }}</h3>
882+
883+
<mat-divider [inset]="true"></mat-divider>
884+
885+
<div class="flex-100 layout-row">
886+
<span class="flex-47">{{ 'labels.inputs.Enable Buy down fee' | translate }}:</span>
887+
<span class="flex-53">{{ loanProduct.enableBuyDownFee | yesNo }}</span>
888+
</div>
889+
890+
<div class="flex-100 layout-row" *ngIf="loanProduct.enableBuyDownFee">
891+
<span class="flex-47">{{ 'labels.inputs.Buy down fee calculation type' | translate }}:</span>
892+
<span class="flex-53">{{ loanProduct.buyDownFeeCalculationType?.value | translateKey: 'catalogs' }}</span>
893+
</div>
894+
895+
<div class="flex-100 layout-row" *ngIf="loanProduct.enableBuyDownFee">
896+
<span class="flex-47">{{ 'labels.inputs.Buy down fee strategy' | translate }}:</span>
897+
<span class="flex-53">{{ loanProduct.buyDownFeeStrategy?.value | translateKey: 'catalogs' }}</span>
898+
</div>
878899

879-
<div fxFlexFill *ngIf="loanProduct.enableIncomeCapitalization">
880-
<span fxFlex="47%">{{ 'labels.inputs.Income type' | translate }}:</span>
881-
<span fxFlex="53%">{{ loanProduct.capitalizedIncomeType?.value | translateKey: 'catalogs' }}</span>
900+
<div class="flex-100 layout-row" *ngIf="loanProduct.enableBuyDownFee">
901+
<span class="flex-47">{{ 'labels.inputs.Buy down fee income type' | translate }}:</span>
902+
<span class="flex-53">{{ loanProduct.buyDownFeeIncomeType?.value | translateKey: 'catalogs' }}</span>
882903
</div>
883904
</div>
884905

src/app/products/loan-products/common/loan-product-summary/loan-product-summary.component.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,23 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
353353
);
354354
this.loanProduct.capitalizedIncomeType = optionValue;
355355
}
356+
if (this.isAdvancedPaymentAllocation && this.loanProduct.enableBuyDownFee) {
357+
optionValue = this.optionDataLookUp(
358+
this.loanProduct.buyDownFeeCalculationType,
359+
this.loanProductsTemplate.buyDownFeeCalculationTypeOptions
360+
);
361+
this.loanProduct.buyDownFeeCalculationType = optionValue;
362+
optionValue = this.optionDataLookUp(
363+
this.loanProduct.buyDownFeeStrategy,
364+
this.loanProductsTemplate.buyDownFeeStrategyOptions
365+
);
366+
this.loanProduct.buyDownFeeStrategy = optionValue;
367+
optionValue = this.optionDataLookUp(
368+
this.loanProduct.buyDownFeeIncomeType,
369+
this.loanProductsTemplate.buyDownFeeIncomeTypeOptions
370+
);
371+
this.loanProduct.buyDownFeeIncomeType = optionValue;
372+
}
356373
optionValue = this.optionDataLookUp(
357374
this.loanProduct.interestRateFrequencyType,
358375
this.loanProductsTemplate.interestRateFrequencyTypeOptions

src/app/products/loan-products/create-loan-product/create-loan-product.component.html

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@
5454
(supportedInterestRefundTypes)="setSupportedInterestRefundTypes($event)"
5555
>
5656
</mifosx-loan-product-interest-refund-step>
57+
58+
<mifosx-stepper-buttons></mifosx-stepper-buttons>
5759
</mat-step>
5860

5961
<mat-step *ngIf="isAdvancedPaymentStrategy">
@@ -91,15 +93,18 @@
9193
</mifosx-loan-product-charges-step>
9294
</mat-step>
9395

94-
<mat-step *ngIf="isAdvancedPaymentStrategy" [stepControl]="loanIncomeCapitalizationForm" completed>
95-
<ng-template matStepLabel>{{ 'labels.inputs.INCOME CAPITALIZATION' | translate }}</ng-template>
96+
<mat-step *ngIf="isAdvancedPaymentStrategy" [stepControl]="loanDeferredIncomeRecognitionForm" completed>
97+
<ng-template matStepLabel>{{ 'labels.inputs.DEFERRED INCOME RECOGNITION' | translate }}</ng-template>
9698

9799
<mifosx-loan-product-capitalized-income-step
98-
[capitalizedIncome]="capitalizedIncome"
100+
[deferredIncomeRecognition]="deferredIncomeRecognition"
99101
[capitalizedIncomeCalculationTypeOptions]="loanProductsTemplate.capitalizedIncomeCalculationTypeOptions"
100102
[capitalizedIncomeStrategyOptions]="loanProductsTemplate.capitalizedIncomeStrategyOptions"
101103
[capitalizedIncomeTypeOptions]="loanProductsTemplate.capitalizedIncomeTypeOptions"
102-
(setCapitalizedIncome)="setCapitalizedIncome($event)"
104+
[buyDownFeeCalculationTypeOptions]="loanProductsTemplate.buyDownFeeCalculationTypeOptions"
105+
[buyDownFeeStrategyOptions]="loanProductsTemplate.buyDownFeeStrategyOptions"
106+
[buyDownFeeIncomeTypeOptions]="loanProductsTemplate.buyDownFeeIncomeTypeOptions"
107+
(setDeferredIncomeRecognition)="setDeferredIncomeRecognition($event)"
103108
(setViewChildForm)="setViewChildForm($event)"
104109
>
105110
</mifosx-loan-product-capitalized-income-step>
@@ -114,7 +119,7 @@
114119
[loanProductsTemplate]="loanProductsTemplate"
115120
[accountingRuleData]="accountingRuleData"
116121
[loanProductFormValid]="loanProductFormValid"
117-
[capitalizedIncome]="capitalizedIncome"
122+
[deferredIncomeRecognition]="deferredIncomeRecognition"
118123
>
119124
</mifosx-loan-product-accounting-step>
120125
</mat-step>

src/app/products/loan-products/create-loan-product/create-loan-product.component.ts

Lines changed: 46 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ import { LoanProducts } from '../loan-products';
1717
import {
1818
AdvancedPaymentAllocation,
1919
AdvancedPaymentStrategy,
20-
CapitalizedIncome,
20+
DeferredIncomeRecognition,
2121
PaymentAllocation
2222
} from '../loan-product-stepper/loan-product-payment-strategy-step/payment-allocation-model';
2323
import { Accounting } from 'app/core/utils/accounting';
2424
import { StringEnumOptionData } from '../../../shared/models/option-data.model';
25-
import { LoanProductCapitalizedIncomeStepComponent } from '../loan-product-stepper/loan-product-capitalized-income-step/loan-product-capitalized-income-step.component';
25+
import { LoanProductDeferredIncomeRecognitionStepComponent } from '../loan-product-stepper/loan-product-capitalized-income-step/loan-product-deferred-income-recognition-step.component';
2626
import { UntypedFormGroup } from '@angular/forms';
2727
import { MatStepper, MatStepperIcon, MatStep, MatStepLabel } from '@angular/material/stepper';
2828
import { FaIconComponent } from '@fortawesome/angular-fontawesome';
@@ -50,7 +50,7 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
5050
StepperButtonsComponent,
5151
LoanProductTermsStepComponent,
5252
LoanProductChargesStepComponent,
53-
LoanProductCapitalizedIncomeStepComponent,
53+
LoanProductDeferredIncomeRecognitionStepComponent,
5454
LoanProductAccountingStepComponent,
5555
LoanProductPreviewStepComponent
5656
]
@@ -61,8 +61,8 @@ export class CreateLoanProductComponent implements OnInit {
6161
loanProductCurrencyStep: LoanProductCurrencyStepComponent;
6262
@ViewChild(LoanProductInterestRefundStepComponent, { static: true })
6363
loanProductInterestRefundStep: LoanProductInterestRefundStepComponent;
64-
@ViewChild(LoanProductCapitalizedIncomeStepComponent, { static: true })
65-
loanProductCapitalizedIncomeStep: LoanProductCapitalizedIncomeStepComponent;
64+
@ViewChild(LoanProductDeferredIncomeRecognitionStepComponent, { static: true })
65+
loanProductDeferredIncomeRecognitionStep: LoanProductDeferredIncomeRecognitionStepComponent;
6666
@ViewChild(LoanProductTermsStepComponent, { static: true }) loanProductTermsStep: LoanProductTermsStepComponent;
6767
@ViewChild(LoanProductSettingsStepComponent, { static: true })
6868
loanProductSettingsStep: LoanProductSettingsStepComponent;
@@ -81,8 +81,8 @@ export class CreateLoanProductComponent implements OnInit {
8181
advancedPaymentAllocations: AdvancedPaymentAllocation[] = [];
8282
advancedCreditAllocations: AdvancedPaymentAllocation[] = [];
8383

84-
capitalizedIncome: CapitalizedIncome | null = null;
85-
loanIncomeCapitalizationForm: UntypedFormGroup;
84+
deferredIncomeRecognition: DeferredIncomeRecognition | null = null;
85+
loanDeferredIncomeRecognitionForm: UntypedFormGroup;
8686

8787
/**
8888
* @param {ActivatedRoute} route Activated Route.
@@ -139,18 +139,33 @@ export class CreateLoanProductComponent implements OnInit {
139139
advancePaymentStrategy(value: string) {
140140
this.isAdvancedPaymentStrategy = LoanProducts.isAdvancedPaymentAllocationStrategy(value);
141141
if (this.isAdvancedPaymentStrategy) {
142+
if (this.deferredIncomeRecognition == null) {
143+
this.deferredIncomeRecognition = {};
144+
}
142145
if (this.loanProductsTemplate.enableIncomeCapitalization) {
143-
this.capitalizedIncome = {
146+
this.deferredIncomeRecognition.capitalizedIncome = {
144147
enableIncomeCapitalization: true,
145148
capitalizedIncomeCalculationType: this.loanProductsTemplate.capitalizedIncomeCalculationTypeOptions[0],
146149
capitalizedIncomeStrategy: this.loanProductsTemplate.capitalizedIncomeStrategyOptions[0],
147150
capitalizedIncomeType: this.loanProductsTemplate.capitalizedIncomeTypeOptions[0]
148151
};
149152
} else {
150-
this.capitalizedIncome = {
153+
this.deferredIncomeRecognition.capitalizedIncome = {
151154
enableIncomeCapitalization: false
152155
};
153156
}
157+
if (this.loanProductsTemplate.enableBuyDownFee) {
158+
this.deferredIncomeRecognition.buyDownFee = {
159+
enableBuyDownFee: true,
160+
buyDownFeeCalculationType: this.loanProductsTemplate.buyDownFeeCalculationTypeOptions[0],
161+
buyDownFeeStrategy: this.loanProductsTemplate.buyDownFeeStrategyOptions[0],
162+
buyDownFeeIncomeType: this.loanProductsTemplate.buyDownFeeIncomeTypeOptions[0]
163+
};
164+
} else {
165+
this.deferredIncomeRecognition.buyDownFee = {
166+
enableBuyDownFee: false
167+
};
168+
}
154169
}
155170
}
156171

@@ -172,14 +187,14 @@ export class CreateLoanProductComponent implements OnInit {
172187
this.supportedInterestRefundTypes = supportedInterestRefundTypes;
173188
}
174189

175-
setCapitalizedIncome(capitalizedIncome: CapitalizedIncome): void {
190+
setDeferredIncomeRecognition(deferredIncomeRecognition: DeferredIncomeRecognition): void {
176191
if (this.isAdvancedPaymentStrategy) {
177-
this.capitalizedIncome = capitalizedIncome;
192+
this.deferredIncomeRecognition = deferredIncomeRecognition;
178193
}
179194
}
180195

181196
setViewChildForm(viewChildForm: UntypedFormGroup): void {
182-
this.loanIncomeCapitalizationForm = viewChildForm;
197+
this.loanDeferredIncomeRecognitionForm = viewChildForm;
183198
}
184199

185200
get loanProductSettingsForm() {
@@ -197,7 +212,7 @@ export class CreateLoanProductComponent implements OnInit {
197212
this.loanProductCurrencyForm.valid &&
198213
this.loanProductTermsForm.valid &&
199214
this.loanProductSettingsForm.valid &&
200-
this.loanIncomeCapitalizationForm.valid &&
215+
this.loanDeferredIncomeRecognitionForm.valid &&
201216
this.loanProductAccountingForm.valid
202217
);
203218
} else {
@@ -224,12 +239,24 @@ export class CreateLoanProductComponent implements OnInit {
224239
loanProduct['paymentAllocation'] = this.paymentAllocation;
225240
loanProduct['creditAllocation'] = this.creditAllocation;
226241
loanProduct['supportedInterestRefundTypes'] = this.supportedInterestRefundTypes;
227-
if (this.capitalizedIncome != null) {
228-
loanProduct['enableIncomeCapitalization'] = this.capitalizedIncome.enableIncomeCapitalization;
229-
if (this.capitalizedIncome.enableIncomeCapitalization) {
230-
loanProduct['capitalizedIncomeCalculationType'] = this.capitalizedIncome.capitalizedIncomeCalculationType;
231-
loanProduct['capitalizedIncomeStrategy'] = this.capitalizedIncome.capitalizedIncomeStrategy;
232-
loanProduct['capitalizedIncomeType'] = this.capitalizedIncome.capitalizedIncomeType;
242+
if (this.deferredIncomeRecognition.capitalizedIncome != null) {
243+
loanProduct['enableIncomeCapitalization'] =
244+
this.deferredIncomeRecognition.capitalizedIncome.enableIncomeCapitalization;
245+
if (this.deferredIncomeRecognition.capitalizedIncome.enableIncomeCapitalization) {
246+
loanProduct['capitalizedIncomeCalculationType'] =
247+
this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeCalculationType;
248+
loanProduct['capitalizedIncomeStrategy'] =
249+
this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeStrategy;
250+
loanProduct['capitalizedIncomeType'] = this.deferredIncomeRecognition.capitalizedIncome.capitalizedIncomeType;
251+
}
252+
}
253+
if (this.deferredIncomeRecognition.buyDownFee != null) {
254+
loanProduct['enableBuyDownFee'] = this.deferredIncomeRecognition.buyDownFee.enableBuyDownFee;
255+
if (this.deferredIncomeRecognition.buyDownFee.enableBuyDownFee) {
256+
loanProduct['buyDownFeeCalculationType'] =
257+
this.deferredIncomeRecognition.buyDownFee.buyDownFeeCalculationType;
258+
loanProduct['buyDownFeeStrategy'] = this.deferredIncomeRecognition.buyDownFee.buyDownFeeStrategy;
259+
loanProduct['buyDownFeeIncomeType'] = this.deferredIncomeRecognition.buyDownFee.buyDownFeeIncomeType;
233260
}
234261
}
235262
}

src/app/products/loan-products/edit-loan-product/edit-loan-product.component.html

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,14 +94,17 @@
9494
</mat-step>
9595

9696
<mat-step *ngIf="isAdvancedPaymentStrategy" [stepControl]="loanIncomeCapitalizationForm" completed>
97-
<ng-template matStepLabel>{{ 'labels.inputs.INCOME CAPITALIZATION' | translate }}</ng-template>
97+
<ng-template matStepLabel>{{ 'labels.inputs.DEFERRED INCOME RECOGNITION' | translate }}</ng-template>
9898

9999
<mifosx-loan-product-capitalized-income-step
100-
[capitalizedIncome]="capitalizedIncome"
100+
[deferredIncomeRecognition]="deferredIncomeRecognition"
101101
[capitalizedIncomeCalculationTypeOptions]="loanProductAndTemplate.capitalizedIncomeCalculationTypeOptions"
102102
[capitalizedIncomeStrategyOptions]="loanProductAndTemplate.capitalizedIncomeStrategyOptions"
103103
[capitalizedIncomeTypeOptions]="loanProductAndTemplate.capitalizedIncomeTypeOptions"
104-
(setCapitalizedIncome)="setCapitalizedIncome($event)"
104+
[buyDownFeeCalculationTypeOptions]="loanProductAndTemplate.buyDownFeeCalculationTypeOptions"
105+
[buyDownFeeStrategyOptions]="loanProductAndTemplate.buyDownFeeStrategyOptions"
106+
[buyDownFeeIncomeTypeOptions]="loanProductAndTemplate.buyDownFeeIncomeTypeOptions"
107+
(setDeferredIncomeRecognition)="setDeferredIncomeRecognition($event)"
105108
(setViewChildForm)="setViewChildForm($event)"
106109
>
107110
</mifosx-loan-product-capitalized-income-step>
@@ -116,7 +119,7 @@
116119
[loanProductsTemplate]="loanProductAndTemplate"
117120
[accountingRuleData]="accountingRuleData"
118121
[loanProductFormValid]="loanProductFormValidAndNotPristine"
119-
[capitalizedIncome]="capitalizedIncome"
122+
[deferredIncomeRecognition]="deferredIncomeRecognition"
120123
>
121124
</mifosx-loan-product-accounting-step>
122125
</mat-step>

0 commit comments

Comments
 (0)