From 8a360025f80fc00739dfe11834690be87420bc00 Mon Sep 17 00:00:00 2001 From: Muskan Khedia <36980003+muskankhedia@users.noreply.github.com> Date: Sat, 18 Jul 2020 15:46:07 +0530 Subject: [PATCH] feat: add edit loan accounts (#1131) Fixes: #220 --- .../loans-account-and-template.resolver.ts | 29 ++ .../create-loans-account.component.html | 3 +- .../edit-loans-account.component.html | 67 +++++ .../edit-loans-account.component.scss | 0 .../edit-loans-account.component.spec.ts | 25 ++ .../edit-loans-account.component.ts | 146 +++++++++ .../loans-account-details-step.component.ts | 5 + .../loans-account-preview-step.component.html | 78 ++--- .../loans-account-terms-step.component.html | 26 +- .../loans-account-terms-step.component.ts | 21 +- src/app/loans/loans-routing.module.ts | 276 +++++++++--------- .../loans/loans-view/loans-view.component.ts | 5 +- src/app/loans/loans.module.ts | 2 + src/app/loans/loans.service.ts | 11 + 14 files changed, 515 insertions(+), 179 deletions(-) create mode 100644 src/app/loans/common-resolvers/loans-account-and-template.resolver.ts create mode 100644 src/app/loans/edit-loans-account/edit-loans-account.component.html create mode 100644 src/app/loans/edit-loans-account/edit-loans-account.component.scss create mode 100644 src/app/loans/edit-loans-account/edit-loans-account.component.spec.ts create mode 100644 src/app/loans/edit-loans-account/edit-loans-account.component.ts diff --git a/src/app/loans/common-resolvers/loans-account-and-template.resolver.ts b/src/app/loans/common-resolvers/loans-account-and-template.resolver.ts new file mode 100644 index 000000000..2aacbd4b6 --- /dev/null +++ b/src/app/loans/common-resolvers/loans-account-and-template.resolver.ts @@ -0,0 +1,29 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot } from '@angular/router'; + +/** rxjs Imports */ +import { Observable } from 'rxjs'; + +/** Custom Services */ +import { LoansService } from '../loans.service'; + +/** + * Loan accounts template data resolver. + */ +@Injectable() +export class LoansAccountAndTemplateResolver implements Resolve { + /** + * @param {ProductsService} productsService Products service. + */ + constructor(private loansService: LoansService) { } + + /** + * Returns the loan account template data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const loanId = route.parent.paramMap.get('loanId'); + return this.loansService.getLoansAccountAndTemplateResource(loanId); + } +} diff --git a/src/app/loans/create-loans-account/create-loans-account.component.html b/src/app/loans/create-loans-account/create-loans-account.component.html index c13b1caf0..9ddaeab16 100644 --- a/src/app/loans/create-loans-account/create-loans-account.component.html +++ b/src/app/loans/create-loans-account/create-loans-account.component.html @@ -35,7 +35,8 @@ TERMS - + diff --git a/src/app/loans/edit-loans-account/edit-loans-account.component.html b/src/app/loans/edit-loans-account/edit-loans-account.component.html new file mode 100644 index 000000000..4d5e994d8 --- /dev/null +++ b/src/app/loans/edit-loans-account/edit-loans-account.component.html @@ -0,0 +1,67 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + DETAILS + + + + + + + + + TERMS + + + + + + + + + CHARGES + + + + + + + + + PREVIEW + + + + + + + + +
\ No newline at end of file diff --git a/src/app/loans/edit-loans-account/edit-loans-account.component.scss b/src/app/loans/edit-loans-account/edit-loans-account.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/loans/edit-loans-account/edit-loans-account.component.spec.ts b/src/app/loans/edit-loans-account/edit-loans-account.component.spec.ts new file mode 100644 index 000000000..a7d321e85 --- /dev/null +++ b/src/app/loans/edit-loans-account/edit-loans-account.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditLoansAccountComponent } from './edit-loans-account.component'; + +describe('EditLoansAccountComponent', () => { + let component: EditLoansAccountComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EditLoansAccountComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditLoansAccountComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/loans/edit-loans-account/edit-loans-account.component.ts b/src/app/loans/edit-loans-account/edit-loans-account.component.ts new file mode 100644 index 000000000..965b859dd --- /dev/null +++ b/src/app/loans/edit-loans-account/edit-loans-account.component.ts @@ -0,0 +1,146 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { DatePipe } from '@angular/common'; +import { LoansService } from '../loans.service'; +import { LoansAccountDetailsStepComponent } from '../loans-account-stepper/loans-account-details-step/loans-account-details-step.component'; +import { LoansAccountTermsStepComponent } from '../loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component'; +import { LoansAccountChargesStepComponent } from '../loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component'; + +@Component({ + selector: 'mifosx-edit-loans-account', + templateUrl: './edit-loans-account.component.html', + styleUrls: ['./edit-loans-account.component.scss'] +}) +export class EditLoansAccountComponent implements OnInit { + + @ViewChild(LoansAccountDetailsStepComponent) loansAccountDetailsStep: LoansAccountDetailsStepComponent; + @ViewChild(LoansAccountTermsStepComponent) loansAccountTermsStep: LoansAccountTermsStepComponent; + @ViewChild(LoansAccountChargesStepComponent) loansAccountChargesStep: LoansAccountChargesStepComponent; + + loansAccountAndTemplate: any; + /** Loans Account Product Template */ + loansAccountProductTemplate: any; + /** Collateral Options */ + collateralOptions: any; + /** Loan Id */ + loanId: any; + + /** + * Sets loans account edit form. + * @param {route} ActivatedRoute Activated Route. + * @param {router} Router Router. + * @param {datePipe} DatePipe Date Pipe + * @param {loansService} LoansService Loans Service + */ + constructor(private route: ActivatedRoute, + private router: Router, + private datePipe: DatePipe, + private loansService: LoansService + ) { + this.route.data.subscribe((data: { loansAccountAndTemplate: any }) => { + this.loansAccountAndTemplate = data.loansAccountAndTemplate; + }); + this.loanId = this.route.parent.snapshot.params['loanId']; + } + + ngOnInit() { + } + + /** + * Sets loans account product template and collateral template + * @param {any} $event API response + */ + setTemplate($event: any) { + this.loansAccountProductTemplate = $event; + this.loansService.getLoansCollateralTemplateResource(this.loansAccountProductTemplate.loanProductId).subscribe((response: any) => { + this.collateralOptions = response.loanCollateralOptions; + }); + } + + /** Get Loans Account Details Form Data */ + get loansAccountDetailsForm() { + return this.loansAccountDetailsStep.loansAccountDetailsForm; + } + + /** Get Loans Account Terms Form Data */ + get loansAccountTermsForm() { + return this.loansAccountTermsStep.loansAccountTermsForm; + } + + /** Checks wheter all the forms in different steps are valid and not pristine */ + get loansAccountFormValidAndNotPristine() { + return ( + this.loansAccountDetailsForm.valid && + this.loansAccountTermsForm.valid && + ( + !this.loansAccountDetailsForm.pristine || + !this.loansAccountTermsForm.pristine || + !this.loansAccountChargesStep.pristine + ) + ); + } + + /** Retrieves Data of all forms except Currency to submit the data */ + get loansAccount() { + return { + ...this.loansAccountDetailsStep.loansAccountDetails, + ...this.loansAccountTermsStep.loansAccountTerms, + ...this.loansAccountChargesStep.loansAccountCharges, + }; + } + + /** + * Submits Data to create loan account + */ + submit() { + const locale = 'en'; + const dateFormat = 'dd MMMM yyyy'; + const loanType = 'individual'; + const loansAccountData = { + ...this.loansAccount, + clientId: this.loansAccountAndTemplate.clientId, + charges: this.loansAccount.charges.map((charge: any) => ({ + chargeId: charge.id, + amount: charge.amount, + dueDate: charge.dueDate && this.datePipe.transform(charge.dueDate, dateFormat), + })), + collateral: this.loansAccount.collateral.map((collateralEle: any) => ({ + type: collateralEle.type, + value: collateralEle.value, + description: collateralEle.description + })), + interestChargedFromDate: this.datePipe.transform(this.loansAccount.interestChargedFromDate, dateFormat), + repaymentsStartingFromDate: this.datePipe.transform(this.loansAccount.repaymentsStartingFromDate, dateFormat), + submittedOnDate: this.datePipe.transform(this.loansAccount.submittedOnDate, dateFormat), + expectedDisbursementDate: this.datePipe.transform(this.loansAccount.expectedDisbursementDate, dateFormat), + dateFormat, + locale, + loanType + }; + + if (loansAccountData.syncRepaymentsWithMeeting) { + loansAccountData.calendarId = this.loansAccountProductTemplate.calendarOptions[0].id; + delete loansAccountData.syncRepaymentsWithMeeting; + } + + if (loansAccountData.recalculationRestFrequencyDate) { + loansAccountData.recalculationRestFrequencyDate = this.datePipe.transform(this.loansAccount.recalculationRestFrequencyDate, dateFormat); + } + + if (loansAccountData.recalculationCompoundingFrequencyDate) { + loansAccountData.recalculationCompoundingFrequencyDate = this.datePipe.transform(this.loansAccount.recalculationCompoundingFrequencyDate, dateFormat); + } + + if (loansAccountData.interestCalculationPeriodType === 0) { + loansAccountData.allowPartialPeriodInterestCalcualtion = false; + } + if (!(loansAccountData.isFloatingInterestRate === false)) { + delete loansAccountData.isFloatingInterestRate; + } + + this.loansService.updateLoansAccount(this.loanId, loansAccountData).subscribe((response: any) => { + this.router.navigate(['../'], { relativeTo: this.route }); + }); + } + +} diff --git a/src/app/loans/loans-account-stepper/loans-account-details-step/loans-account-details-step.component.ts b/src/app/loans/loans-account-stepper/loans-account-details-step/loans-account-details-step.component.ts index 4bf9d8846..c7f0e5d5b 100644 --- a/src/app/loans/loans-account-stepper/loans-account-details-step/loans-account-details-step.component.ts +++ b/src/app/loans/loans-account-stepper/loans-account-details-step/loans-account-details-step.component.ts @@ -59,6 +59,11 @@ export class LoansAccountDetailsStepComponent implements OnInit { this.loansAccountDetailsForm.patchValue({ 'productId': this.loansAccountTemplate.loanProductId, 'submittedOnDate': this.loansAccountTemplate.timeline.submittedOnDate && new Date(this.loansAccountTemplate.timeline.submittedOnDate), + 'loanOfficerId': this.loansAccountTemplate.loanOfficerId, + 'loanPurposeId': this.loansAccountTemplate.loanPurposeId, + 'fundId': this.loansAccountTemplate.fundId, + 'expectedDisbursementDate': this.loansAccountTemplate.timeline.expectedDisbursementDate && new Date(this.loansAccountTemplate.timeline.expectedDisbursementDate), + 'externalId': this.loansAccountTemplate.externalId }); } } diff --git a/src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.html b/src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.html index 7118bfb85..824011211 100644 --- a/src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.html +++ b/src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.html @@ -9,19 +9,19 @@ {{ loansAccount.productId | find:loansAccountTemplate.productOptions:'id':'name' }} -
- Loan officer: : +
+ Loan officer: {{ loansAccount.loanOfficerId | find:loansAccountProductTemplate.loanOfficerOptions:'id':'name'}} + fxFlex="60%">{{ loansAccount.loanOfficerId | find:loansAccountProductTemplate.loanOfficerOptions:'id':'displayName'}}
-
+
Loan purpose: {{ loansAccount.loanPurposeId | find:loansAccountProductTemplate.loanPurposeOptions:'id':'name'}}
-
+
Fund: {{ loansAccount.fundId | find:loansAccountProductTemplate.fundOptions:'id':'name'}}
@@ -36,8 +36,8 @@ {{ loansAccount.expectedDisbursementDate | date }}
-
- External id +
+ External id: {{ loansAccount.externalId }}
@@ -57,74 +57,74 @@
- Number of repayments + Number of repayments: {{ loansAccount.numberOfRepayments }}
- Repaid every + Repaid every: {{loansAccount.repaymentEvery}} {{loansAccount.repaymentFrequencyType | find: loansAccountProductTemplate.termFrequencyTypeOptions:'id':'name'}} {{loansAccount.repaymentFrequencyNthDayType | find: loansAccountProductTemplate.repaymentFrequencyNthDayTypeOptions:'id': 'name'}} {{loansAccount.repaymentFrequencyDayOfWeekType | find: loansAccountProductTemplate.repaymentFrequencyDaysOfWeekTypeOptions:'id': 'name'}}
-
- First repayment on +
+ First repayment on: {{ loansAccount.repaymentsStartingFromDate | date }}
-
- Interest charged from +
+ Interest charged from: {{ loansAccount.interestChargedFromDate | date }}
-
- Nominal interest rate +
+ Nominal interest rate: {{loansAccount.interestRatePerPeriod}}  {{loansAccountProductTemplate.interestRateFrequencyType.value}}
-
- Interest method +
+ Interest method: {{loansAccount.interestType}}
-
- Is Equal Amortization +
+ Is Equal Amortization: {{loansAccount.isEqualAmortization}}
Amortization {{ loansAccount.amortizationType | find:loansAccountTemplate.amortizationTypeOptions:'id':'name' }} + fxFlex="60%">{{ loansAccount.amortizationType | find:loansAccountProductTemplate.amortizationTypeOptions:'id':'value' }}
- Interest calculation period + Interest calculation period: {{ loansAccount.interestCalculationPeriodType | find:loansAccountTemplate.interestCalculationPeriodTypeOptions:'id':'name' }} + fxFlex="60%">{{ loansAccount.interestCalculationPeriodType | find:loansAccountProductTemplate.interestCalculationPeriodTypeOptions:'id':'value' }}
-
- Calculate interest for exact days in partial period +
+ Calculate interest for exact days in partial period: {{ loansAccount.allowPartialPeriodInterestCalcualtion }}
-
- Arrears tolerance +
+ Arrears tolerance: {{loansAccount.inArrearsTolerance}} {{loansAccountProductTemplate.currency.displaySymbol}}
-
- Interest free period +
+ Interest free period: {{ loansAccount.graceOnInterestCharged }}
- Repayment strategy + Repayment strategy: {{ loansAccount.transactionProcessingStrategyId | find:loansAccountTemplate.transactionProcessingStrategyOptions:'id':'name' }}
@@ -133,33 +133,33 @@ -
- On principal payment +
+ On principal payment: {{ loansAccount.graceOnPrincipalPayment }}
-
- On interest payment +
+ On interest payment: {{ loansAccount.graceOnInterestPayment }}
-
- On Arrears Aging +
+ On Arrears Aging: {{ loansAccount.graceOnArrearsAgeing }}
-
+
Is Topup Loan? {{ loansAccount.isTopup }}
- Recalculate Interest + Recalculate Interest: {{ loansAccountProductTemplate?.isInterestRecalculationEnabled? 'Yes' : 'No' }}
-
- Days in month +
+ Days in month: {{ loansAccountProductTemplate?.daysInMonthType.value }}
diff --git a/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.html b/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.html index eb7533088..88c4b7a51 100644 --- a/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.html +++ b/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.html @@ -48,6 +48,8 @@ +

Repaid Every

+ Repaid every Amortization - {{ amortizationType.value }} + + Amortization Type is required +

Interest Calculations

@@ -196,15 +201,18 @@ Repayment strategy - - {{ transactionProcessingStrategy.value }} + {{ transactionProcessingStrategy.name }} + + Repayment Strategy is required +

Moratorium

@@ -245,6 +253,18 @@ + + Frequency Date for recalculation + + + + + Frequency Data for recalculation is required + + + diff --git a/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.ts b/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.ts index 75337e5d4..b9cc8fb9e 100644 --- a/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.ts +++ b/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.ts @@ -1,6 +1,6 @@ /** Angular Imports */ import { Component, OnInit, Input, OnChanges } from '@angular/core'; -import { FormGroup, FormBuilder, Validators } from '@angular/forms'; +import { FormGroup, FormBuilder, Validators, FormControl } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; /** @@ -15,6 +15,8 @@ export class LoansAccountTermsStepComponent implements OnInit, OnChanges { /** Loans Account Product Template */ @Input() loansAccountProductTemplate: any; + /** Loans Account Template */ + @Input() loansAccountTemplate: any; /** Minimum date allowed. */ minDate = new Date(2000, 0, 1); @@ -82,7 +84,15 @@ export class LoansAccountTermsStepComponent implements OnInit, OnChanges { } } - ngOnInit() { } + ngOnInit() { + if (this.loansAccountTemplate) { + if (this.loansAccountTemplate.loanProductId) { + this.loansAccountTermsForm.patchValue({ + 'repaymentsStartingFromDate': this.loansAccountTemplate.expectedFirstRepaymentOnDate && new Date(this.loansAccountTemplate.expectedFirstRepaymentOnDate) + }); + } + } + } /** Create Loans Account Terms Form */ createloansAccountTermsForm() { @@ -102,19 +112,20 @@ export class LoansAccountTermsStepComponent implements OnInit, OnChanges { // 'interestRateDifferential': [''], 'isFloatingInterestRate': [''], 'isEqualAmortization': [''], - 'amortizationType': [''], + 'amortizationType': ['', Validators.required], 'interestCalculationPeriodType': [''], 'allowPartialPeriodInterestCalcualtion': [''], 'inArrearsTolerance': [''], 'graceOnInterestCharged': [''], - 'transactionProcessingStrategyId': [''], + 'transactionProcessingStrategyId': ['', Validators.required], 'graceOnPrincipalPayment': [''], 'graceOnInterestPayment': [''], 'graceOnArrearsAgeing': [''], 'loanIdToClose': [''], 'fixedEmiAmount': [''], 'isTopup': [''], - 'maxOutstandingLoanBalance': [''] + 'maxOutstandingLoanBalance': [''], + 'recalculationCompoundingFrequencyDate': [''] }); } diff --git a/src/app/loans/loans-routing.module.ts b/src/app/loans/loans-routing.module.ts index fd8652d8d..1d2a3644d 100644 --- a/src/app/loans/loans-routing.module.ts +++ b/src/app/loans/loans-routing.module.ts @@ -24,6 +24,7 @@ import { LoanCollateralTabComponent } from './loans-view/loan-collateral-tab/loa import { CreateLoansAccountComponent } from './create-loans-account/create-loans-account.component'; import { LoanDocumentsTabComponent } from './loans-view/loan-documents-tab/loan-documents-tab.component'; import { StandingInstructionsTabComponent } from 'app/loans/loans-view/standing-instructions-tab/standing-instructions-tab.component'; +import { EditLoansAccountComponent } from './edit-loans-account/edit-loans-account.component'; /** Custom Resolvers */ import { LoanChargeTemplateResolver } from './common-resolvers/loan-charge-template.resolver'; @@ -36,6 +37,7 @@ import { LoanDatatableResolver } from './common-resolvers/loan-datatable.resolve import { LoanActionButtonResolver } from './common-resolvers/loan-action-button.resolver'; import { LoansAccountTemplateResolver } from './common-resolvers/loans-account-template.resolver'; import { LoanDocumentsResolver } from './common-resolvers/loan-documents.resolver'; +import { LoansAccountAndTemplateResolver } from './common-resolvers/loans-account-and-template.resolver'; /** Loans Route. */ const routes: Routes = [ @@ -54,143 +56,156 @@ const routes: Routes = [ { path: ':loanId', data: { title: extract('Loan View'), routeParamBreadcrumb: 'loanId' }, - component: LoansViewComponent, - resolve: { - loanDetailsData: LoanDetailsResolver, - loanDatatables: LoanDatatablesResolver, - }, // Component For Loan View Comes Here children: [ { - path: 'general', - component: GeneralTabComponent, - data: { title: extract('General'), breadcrumb: 'General', routeParamBreadcrumb: false }, + path: '', + component: LoansViewComponent, resolve: { - loanDetailsData: LoanDetailsGeneralResolver - } - }, - { - path: 'accountdetail', - component: AccountDetailsComponent, - data: { title: extract('Account Detail'), breadcrumb: 'Account Detail', routeParamBreadcrumb: false }, - resolve: { - loanDetailsData: LoanDetailsGeneralResolver - } - }, - { - path: 'original-schedule', - component: OriginalScheduleTabComponent, - data: { title: extract('Original Schedule'), breadcrumb: 'Original Schedule', routeParamBreadcrumb: false }, - resolve: { - loanDetailsAssociationData: LoanDetailsChargesResolver - } - }, - { - path: 'repayment-schedule', - component: RepaymentScheduleTabComponent, - data: { title: extract('Repayment Schedule'), breadcrumb: 'Repayment Schedule', routeParamBreadcrumb: false }, - resolve: { - loanDetailsAssociationData: LoanDetailsChargesResolver - } - }, - { - path: 'transactions', - component: TransactionsTabComponent, - data: { title: extract('Transactions'), breadcrumb: 'Transactions', routeParamBreadcrumb: false }, - resolve: { - loanDetailsAssociationData: LoanDetailsChargesResolver - } - }, - { - path: 'loan-collateral', - component: LoanCollateralTabComponent, - data: { title: extract('Loan Collateral Details'), breadcrumb: 'Loan Collateral Details', routeParamBreadcrumb: false }, - resolve: { - loanDetailsAssociationData: LoanDetailsChargesResolver - } - }, - { - path: 'loan-tranche-details', - component: LoanTrancheDetailsComponent, - data: { title: extract('Loan Tranche Details'), breadcrumb: 'Loan Tranche Details', routeParamBreadcrumb: false }, - resolve: { - loanDetailsAssociationData: LoanDetailsChargesResolver - } - }, - { - path: 'overdue-charges', - component: OverdueChargesTabComponent, - data: { title: extract('Overdue Charges'), breadcrumb: 'Overdue Charges', routeParamBreadcrumb: false }, - resolve: { - loanDetailsData: LoanDetailsGeneralResolver - } - }, - { - path: 'floating-interest-rates', - component: FloatingInterestRatesComponent, - data: { title: extract('Floating Interest Rates'), breadcrumb: 'Floating Interest Rates', routeParamBreadcrumb: false }, - resolve: { - loanDetailsAssociationData: LoanDetailsChargesResolver - } - }, - { - path: 'charges', - component: ChargesTabComponent, - data: { title: extract('Charges'), breadcrumb: 'Charges', routeParamBreadcrumb: false }, - resolve: { - loanDetailsAssociationData: LoanDetailsChargesResolver - } - }, - { - path: 'loan-documents', - component: LoanDocumentsTabComponent, - data: { title: extract('Loan Documents'), breadcrumb: 'Loan Documents', routeParamBreadcrumb: false }, - resolve: { - loanDocuments: LoanDocumentsResolver, - loanDetailsData: LoanDetailsGeneralResolver + loanDetailsData: LoanDetailsResolver, + loanDatatables: LoanDatatablesResolver, }, + children: [ + { + path: 'general', + component: GeneralTabComponent, + data: { title: extract('General'), breadcrumb: 'General', routeParamBreadcrumb: false }, + resolve: { + loanDetailsData: LoanDetailsGeneralResolver + } + }, + { + path: 'accountdetail', + component: AccountDetailsComponent, + data: { title: extract('Account Detail'), breadcrumb: 'Account Detail', routeParamBreadcrumb: false }, + resolve: { + loanDetailsData: LoanDetailsGeneralResolver + } + }, + { + path: 'original-schedule', + component: OriginalScheduleTabComponent, + data: { title: extract('Original Schedule'), breadcrumb: 'Original Schedule', routeParamBreadcrumb: false }, + resolve: { + loanDetailsAssociationData: LoanDetailsChargesResolver + } + }, + { + path: 'repayment-schedule', + component: RepaymentScheduleTabComponent, + data: { title: extract('Repayment Schedule'), breadcrumb: 'Repayment Schedule', routeParamBreadcrumb: false }, + resolve: { + loanDetailsAssociationData: LoanDetailsChargesResolver + } + }, + { + path: 'transactions', + component: TransactionsTabComponent, + data: { title: extract('Transactions'), breadcrumb: 'Transactions', routeParamBreadcrumb: false }, + resolve: { + loanDetailsAssociationData: LoanDetailsChargesResolver + } + }, + { + path: 'loan-collateral', + component: LoanCollateralTabComponent, + data: { title: extract('Loan Collateral Details'), breadcrumb: 'Loan Collateral Details', routeParamBreadcrumb: false }, + resolve: { + loanDetailsAssociationData: LoanDetailsChargesResolver + } + }, + { + path: 'loan-tranche-details', + component: LoanTrancheDetailsComponent, + data: { title: extract('Loan Tranche Details'), breadcrumb: 'Loan Tranche Details', routeParamBreadcrumb: false }, + resolve: { + loanDetailsAssociationData: LoanDetailsChargesResolver + } + }, + { + path: 'overdue-charges', + component: OverdueChargesTabComponent, + data: { title: extract('Overdue Charges'), breadcrumb: 'Overdue Charges', routeParamBreadcrumb: false }, + resolve: { + loanDetailsData: LoanDetailsGeneralResolver + } + }, + { + path: 'floating-interest-rates', + component: FloatingInterestRatesComponent, + data: { title: extract('Floating Interest Rates'), breadcrumb: 'Floating Interest Rates', routeParamBreadcrumb: false }, + resolve: { + loanDetailsAssociationData: LoanDetailsChargesResolver + } + }, + { + path: 'charges', + component: ChargesTabComponent, + data: { title: extract('Charges'), breadcrumb: 'Charges', routeParamBreadcrumb: false }, + resolve: { + loanDetailsAssociationData: LoanDetailsChargesResolver + } + }, + { + path: 'loan-documents', + component: LoanDocumentsTabComponent, + data: { title: extract('Loan Documents'), breadcrumb: 'Loan Documents', routeParamBreadcrumb: false }, + resolve: { + loanDocuments: LoanDocumentsResolver, + loanDetailsData: LoanDetailsGeneralResolver + }, + }, + { + path: 'notes', + component: NotesTabComponent, + data: { title: extract('Notes'), breadcrumb: 'Notes', routeParamBreadcrumb: false }, + resolve: { + loanNotes: LoanNotesResolver + }, + }, + { + path: 'standing-instruction', + component: StandingInstructionsTabComponent, + data: { title: extract('Standing Instructions'), breadcrumb: 'Standing Instructions', routeParamBreadcrumb: false }, + resolve: { + loanDetailsData: LoanDetailsGeneralResolver + }, + }, + { + path: 'datatables', + children: [{ + path: ':datatableName', + component: DatatableTabComponent, + data: { title: extract('Data Table View'), routeParamBreadcrumb: 'datatableName' }, + resolve: { + loanDatatable: LoanDatatableResolver + } + }] + }, + { + path: 'add-loan-charge', + component: AddLoanChargeComponent, + data: { title: extract('Add Loan Charge'), breadcrumb: 'Add Loan Charge', routeParamBreadcrumb: false }, + resolve: { + loanChargeTemplate: LoanChargeTemplateResolver + } + }, + { + path: 'actions/:action', + component: LoanAccountActionsComponent, + data: { title: extract('Loan Account Actions'), routeParamBreadcrumb: 'action' }, + resolve: { + actionButtonData: LoanActionButtonResolver + } + }, + ] }, { - path: 'notes', - component: NotesTabComponent, - data: { title: extract('Notes'), breadcrumb: 'Notes', routeParamBreadcrumb: false }, + path: 'edit-loans-account', + data: { title: extract('Edit Loans Account'), breadcrumb: 'Edit Loans Account', routeParamBreadcrumb: 'Edit' }, + component: EditLoansAccountComponent, resolve: { - loanNotes: LoanNotesResolver - }, - }, - { - path: 'standing-instruction', - component: StandingInstructionsTabComponent, - data: { title: extract('Standing Instructions'), breadcrumb: 'Standing Instructions', routeParamBreadcrumb: false }, - resolve: { - loanDetailsData: LoanDetailsGeneralResolver - }, - }, - { - path: 'datatables', - children: [{ - path: ':datatableName', - component: DatatableTabComponent, - data: { title: extract('Data Table View'), routeParamBreadcrumb: 'datatableName' }, - resolve: { - loanDatatable: LoanDatatableResolver - } - }] - }, - { - path: 'add-loan-charge', - component: AddLoanChargeComponent, - data: { title: extract('Add Loan Charge'), breadcrumb: 'Add Loan Charge', routeParamBreadcrumb: false }, - resolve: { - loanChargeTemplate: LoanChargeTemplateResolver - } - }, - { - path: ':action', - component: LoanAccountActionsComponent, - data: { title: extract('Loan Account Actions'), routeParamBreadcrumb: 'action' }, - resolve: { - actionButtonData: LoanActionButtonResolver + loansAccountAndTemplate: LoansAccountAndTemplateResolver } }, ] @@ -211,7 +226,8 @@ const routes: Routes = [ LoanDatatableResolver, LoanActionButtonResolver, LoansAccountTemplateResolver, - LoanDocumentsResolver + LoanDocumentsResolver, + LoansAccountAndTemplateResolver ] }) diff --git a/src/app/loans/loans-view/loans-view.component.ts b/src/app/loans/loans-view/loans-view.component.ts index 444cbd063..ae30c6cb2 100644 --- a/src/app/loans/loans-view/loans-view.component.ts +++ b/src/app/loans/loans-view/loans-view.component.ts @@ -130,11 +130,14 @@ export class LoansViewComponent implements OnInit { case 'Delete': this.deleteLoanAccount(); break; + case 'Modify Application': + this.router.navigate(['edit-loans-account'], { relativeTo: this.route}); + break; default: button = button.replace(/\s/g, '-').toLowerCase(); button = button.replace(/\(/g, ''); button = button.replace(/\)/g, ''); - this.router.navigate([button], { relativeTo: this.route }); + this.router.navigate(['actions', button], { relativeTo: this.route }); break; } } diff --git a/src/app/loans/loans.module.ts b/src/app/loans/loans.module.ts index ac46470f9..13f1606f6 100644 --- a/src/app/loans/loans.module.ts +++ b/src/app/loans/loans.module.ts @@ -58,6 +58,7 @@ import { LoansAccountAddCollateralDialogComponent } from './custom-dialog/loans- import { LoansConfirmationDialogBoxComponent } from './custom-dialog/loans-confirmation-dialog-box/loans-confirmation-dialog-box.component'; import { LoanAccountLoadDocumentsDialogComponent } from './custom-dialog/loan-account-load-documents-dialog/loan-account-load-documents-dialog.component'; import { StandingInstructionsTabComponent } from './loans-view/standing-instructions-tab/standing-instructions-tab.component'; +import { EditLoansAccountComponent } from './edit-loans-account/edit-loans-account.component'; /** * Loans Module @@ -114,6 +115,7 @@ import { StandingInstructionsTabComponent } from './loans-view/standing-instruct LoanDocumentsTabComponent, LoanAccountLoadDocumentsDialogComponent, StandingInstructionsTabComponent, + EditLoansAccountComponent, ], entryComponents: [ LoansAccountAddCollateralDialogComponent, diff --git a/src/app/loans/loans.service.ts b/src/app/loans/loans.service.ts index 9f503e3a7..914a31ca1 100644 --- a/src/app/loans/loans.service.ts +++ b/src/app/loans/loans.service.ts @@ -266,6 +266,13 @@ export class LoansService { return this.http.get('/loans/template', { params: httpParams }); } + getLoansAccountAndTemplateResource(loanId: any): Observable { + const httpParams = new HttpParams().set('associations', 'charges,collateral,meeting,multiDisburseDetails') + .set('staffInSelectedOfficeOnly', 'true') + .set('template', 'true'); + return this.http.get(`/loans/${loanId}`, { params: httpParams }); + } + /** * Get Loans Collateral Template * @param {any} productId Product ID @@ -320,4 +327,8 @@ export class LoansService { return this.http.get(`/standinginstructions`, { params: httpParams }); } + updateLoansAccount(loanId: any, loanData: any): Observable { + return this.http.put(`/loans/${loanId}`, loanData); + } + }