Untitled
unknown
plain_text
a year ago
78 kB
5
Indexable
import { Component, DoCheck, ElementRef, OnInit, ViewChild, } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { ContactPerson, ErrorResponse, HeaderComponent, LeaseDetails, LeaseService, LeaseTab, LeaseTabId, LoaderService, MainTabs, MenuBarAction, PopoverConfig, PopoverType, PopoversComponent, RequestObjectTab, RequestObjectTabField, camelCaseToText, clone, numberRegex, numberWithOnlyTwoDecimals, // transformForSelect, } from '@shared'; import { Observable, Subject, Subscription, catchError, first, map, mergeMap, of, takeUntil, throwError, } from 'rxjs'; import { LeaseStateService } from '../../state/lease/lease.state.service'; import { LeaseDetailsService } from './services/lease-details/lease-details.service'; import '@aab/sc-aab-icon'; import '@aab/sc-aab-toastmessage'; import '@aab/sc-aab-modal'; import { LESSOR_ID, WarningTexMessaages } from './lease.constant'; import { NewContractsStateService, RequestedAssetsStateService } from '@state'; import { StorageService } from '@core'; import { AutoCreditService, BusinesspartnerService, CacheService, CommonService, ContactService, LeaseRequestService, } from '@shared/services'; import { ValidateRequiredFieldsService } from './services/validate-required-fields/validate-required-fields.service'; import { SendToCreditDeptService } from '@shared/services'; import { DownloadCreditCommissionPdfService } from 'src/app/shared/services/downloadCreditCommission/download-credit-commission-pdf.service'; import { NodeStateManagementService } from './services/node-state-management/node-state-management.service'; import { ApprovalModalConfig } from 'src/app/shared/interfaces/approval/approval-config'; import { EnvironmentService } from 'src/app/core/service/environment/environment.service'; import { AutoCreditDecisionPopoverComponent, AutoCreditPopoverConfig, AutoCreditPopoverType, } from './components/auto-credit/auto-credit-decision-popover/auto-credit-decision-popover.component'; import { BusinessLeaseService } from './services/business-lease/business-lease.service'; import * as autoCreditConstants from './components/auto-credit/auto-credit-decision-popover/constants/auto-credit-const'; import { pr_calendar, pr_tools_calculator, sy_tools_print, } from '@aab/sc-aab-icon-set'; import { g400, g670 } from '@aab/sc-styles-colors'; import '@aab/sc-aab-icon'; import * as pdfMake from 'pdfmake/build/pdfMake'; import '@aab/sc-aab-card'; import '@aab/sc-aab-accordion'; import { ChangeRequestAnalysisService } from './services/credit-department/change-request-analysis.service'; import { k2ActivityNames } from 'src/app/shared/constants/k2-Activity/k2-activity.constant'; import { SendToSalesSupportService } from './services/send-to-sales-support/send-to-sales-support.service'; import { NotificationService } from 'src/app/shared/services/notification/notification.service'; import { SendToCreditService } from './services/send-to-credit/send-to-credit.service'; import { ExecuteActionBarButtonsService } from './services/execute-action-bar-buttons/execute-action-bar-buttons.service'; import { DocumentApprovalService } from './services/document-approval/document-approval.service'; import { CommonErrorPopupService } from 'src/app/shared/services/common-error-popup/common-error-popup.service'; import { LeaseTabsService } from './services/lease-tabs/lease-tabs.service'; import { EndTaskService } from 'src/app/shared/services/end-task/end-task.service'; import { SignOffService } from 'src/app/shared/services/sign-off/sign-off.service'; import { HttpErrorResponse } from '@angular/common/http'; import { BroadCastService } from 'src/app/shared/services/broadcast/broadcast.service'; import { NC_ASSET_MESSAGES } from './assets/modules/new-contracts/components/asset/constants/error-messages'; import { RA_ASSET_MESSAGES } from './assets/modules/requested-assets/components/requested-asset/constants/error-messages'; import { TariffFormField } from './tariff/interfaces/form-field'; @Component({ selector: 'app-lease', templateUrl: './lease.component.html', styleUrls: ['./lease.component.scss'], }) export class LeaseComponent implements OnInit, DoCheck { leaseRequestId$: Observable<boolean>; camelCaseToText: typeof camelCaseToText = camelCaseToText; menuBarAction: typeof MenuBarAction = MenuBarAction; @ViewChild('notification') notification: ElementRef; notificationMessage: string; @ViewChild('popoversComponent', { static: true }) popoversComponent: PopoversComponent; popoverConfig: PopoverConfig; popoverType: typeof PopoverType = PopoverType; // Auto credit popover configuration @ViewChild('AutoCreditDecisionPopoverComponent', { static: true }) autoCreditPopoverComponent: AutoCreditDecisionPopoverComponent; autocreditPopoverType: typeof AutoCreditPopoverType = AutoCreditPopoverType; autoCreditPopoverConfig: AutoCreditPopoverConfig; printIconOnPopOver: boolean = true; leaseTabs: LeaseTab[]; popoverActionType: MenuBarAction; errorMessage: string = ''; minValue: number = 250000; maxValue: number = 1000000; isModalOpen: boolean = false; userName: string; subscriptions: Subscription[] = []; flowData: any; keViewRequestFlow: boolean; role: string; // Auto credit validations autoCreditBasicValidation: boolean; isApproved: boolean = false; totalLiablityAmount: any; maximumTotalLiablityAmount = 250000; missingRequiredRAFormFields: { [key in RequestObjectTab]: RequestObjectTabField[]; }; print = sy_tools_print; RATabs = Object.values(RequestObjectTab); assetDescription: string; isInValidFields: any; isError: any; prefinanceData: string; approvalConfig: ApprovalModalConfig; isTypeOfApprovalAnalysis: boolean; requestObjectModalitiesList: any; chkForNewAsset: boolean; chkForAssetValueType: boolean; typeOfRequest: any; requestObjectAssetList: any; chkForAssetLocation: boolean; // Auto credit popover table variables // header icon configs calendar = pr_calendar; calculator = pr_tools_calculator; color = g670; autoCreditResponse: any; autoCreditRelation: any; autoCreditRelationFields = autoCreditConstants.autoCreditConstfields; DBADERealtion: any; DBADERealtionFields = autoCreditConstants.DBrelationFields; autoCreditRequestObjKeys = autoCreditConstants.autoCreditRequestObjKeys; autoCreditRequestObjValues: any; isAutoCreditModal: boolean; autoCreditRequestObjects: any; finalDecisionBadgeStatusMessage: any; finalDecisionBadgeStyleType: any; autoCreditBuisnessRuleFlag: boolean = false; autoCreditRequesTObjectBadgeStatusMessage: any; autoCreditRequesTObjectBadegeStyleType: any; isCancelCreditApprovalModalOpen: boolean = false; readOnlyMode: boolean; errMsgType: string; maintainanceAmt: any; durationValue: number; useFulLife: number; orderNo: any; warningMsg = WarningTexMessaages; employeeName: any; ultimateCompanyConfig: any; requestedAssetQuantity: number; newContractsQuantity: number; // Print Approval Letter iconColor = g400; iconPrint = sy_tools_print; iconPrintLabel = 'Print this window'; @ViewChild('browserFileInput') browserFileInput: ElementRef; pdfFile: Blob; source$: any; /** * Purpose: Added for Exit button * reusing the function from header comp * signOff() */ @ViewChild('headerComp') headerCompent: HeaderComponent; private readonly destroy$: Subject<void> = new Subject<void>(); activeParentTab: MainTabs; constructor( private leaseStateService: LeaseStateService, private requestedAssetsStateService: RequestedAssetsStateService, private leaseDetailsService: LeaseDetailsService, private leaseService: LeaseService, private route: ActivatedRoute, private router: Router, private loaderService: LoaderService, private storageService: StorageService, private validateRequiredFieldsService: ValidateRequiredFieldsService, private sendToCreditDept: SendToCreditDeptService, private downloadCreditCommissionPdfService: DownloadCreditCommissionPdfService, private autoCreditService: AutoCreditService, private nodeStateManagementService: NodeStateManagementService, private businessLeaseService: BusinessLeaseService, private cacheService: CacheService, private businessPartnerService: BusinesspartnerService, private commonService: CommonService, private changeRequestAnalysisService: ChangeRequestAnalysisService, private envService: EnvironmentService, private sendToSalesSupportService: SendToSalesSupportService, private sendToCreditService: SendToCreditService, private notificationService: NotificationService, private excuteActionBarButtonsService: ExecuteActionBarButtonsService, private documentApprovalService: DocumentApprovalService, private commonErrorPopupService: CommonErrorPopupService, private newContractStateService: NewContractsStateService, private contactService: ContactService, private leaseRequestService: LeaseRequestService, private leaseTabsService: LeaseTabsService, private endTaskService: EndTaskService, private SignOffService: SignOffService, private broadcastService: BroadCastService ) { this.leaseRequestId$ = this.route.params?.pipe( mergeMap(params => of(params['leaseRequestId'])), mergeMap((leaseRequestId: number) => this.leaseService.getOpenLeaseRequestDetails(leaseRequestId) ), map((leaseDetails: LeaseDetails) => { this.leaseStateService.leaseDetails = leaseDetails; this.leaseStateService.leaseDetailsPayload = clone(leaseDetails); return leaseDetails.id; }), mergeMap((leaseRequestId: number) => this.getDetails(leaseRequestId)) ); } get leaseDetailsPayload(): LeaseDetails { return this.leaseStateService.leaseDetailsPayload; } ngOnInit(): void { this.leaseTabs = Object.values(LeaseTab) as LeaseTab[]; this.flowData = this.leaseStateService; // setup Initial RequestObject. this.requestedAssetsStateService.setInitialRequestObjectPayload(); this.nodeStateManagementService.setCurrentNodeAndState( this.leaseDetailsPayload?.generic?.currentNodeName ); // set K2Activity name for autologin this.leaseStateService.k2ActivityName = this.leaseDetailsPayload?.generic?.k2ActivityName || ''; this.leaseStateService.isHandleCreditOnHoldRejected = this.leaseDetailsPayload?.generic?.generalDecisionType; //need to change according to actual response this.isRequestReadonly(); this.leaseDetailsService.setActionBarConfig(this.leaseDetailsPayload?.id); const typeofProcessValue = this.leaseDetailsPayload?.leaseRequest?.trackType; this.leaseDetailsService.enableDisableCreditCommissionRequestButton( typeofProcessValue ); //SetContact Person this.setContactPerson( this.leaseDetailsPayload[LeaseTab.BusinessPartner]?.clientRelationNumber ); //setEmployee Name this.setEmployeeName(); this.leaseStateService.chkForUltimateCompanyValue = this.leaseDetailsPayload[ LeaseTab.BusinessPartner ]?.ultimateParentCompanyRelationNo; this.closeErrorModal(); this.businessLeaseService.openBLApplicationInNewTab(); } ngDoCheck() { this.leaseDetailsService.triggerSave .pipe(first()) .subscribe((value: boolean) => { if (value) { this.handleSaveEvent(false); this.leaseDetailsService.triggerSave.next(false); } }); } closeErrorModal() { this.commonErrorPopupService.closeModalSubject?.subscribe((res: any) => { if (res) { if ( res?.errorType === 'BackToAM' && this.leaseStateService.isK2Request ) { window.open(this.envService.environment.BASE_K2_URL, '_self'); } } }); } isRequestReadonly() { if (this.storageService.getSidePanel()) { if (this.leaseDetailsPayload?.readOnly) { this.isModalOpen = true; this.userName = this.leaseDetailsPayload?.userName; this.leaseStateService.readOnly?.next(true); } else { this.leaseStateService.readOnly?.next(false); } } } public closeModal() { this.isModalOpen = false; } get actionBarConfig$() { return this.leaseStateService.actionBarConfig$; } getDetails(leaseRequestId: number): Observable<boolean> { const statutoryName = this.leaseDetailsPayload?.businessPartner?.clientStatutoryName; this.leaseDetailsService.setActionBarConfig(leaseRequestId); this.leaseDetailsService.setActionBarConfig(leaseRequestId, statutoryName); //Not commented by us previously it was there may be later for some implemention it is required // this.leaseDetailsService // .getLeaseDetails(leaseRequestId) // .subscribe(response => { // this.setNodeManagement(response.node); // this.setActionBarConfig(leaseRequestId); // }); return of(true); } setActionBarConfig$(leaseRequestId: number) { this.leaseStateService.actionBarConfig$?.next( this.leaseDetailsService.setActionBarConfig(leaseRequestId) ); } handleExitButton() { //code commented to check later. //this.excuteActionBarButtonsService.handleExitButton(); //this.headerCompent.signOff(); this.SignOffService.getSignOffFromApplication() .pipe( catchError(err => { this.handleError(err); return of(err); }) ) .subscribe({ next: res => { if (res) { window.open(this.envService.environment.BASE_K2_URL, '_self'); this.storageService.clean(); this.router.navigateByUrl('/logout'); this.broadcastService.sendSuccessMsg(true); } }, error: error => { console.log(error); }, }); } handleEndTask() { const leaseReqId = this.leaseDetailsPayload?.id; this.endTaskService.exitByleaseRequestId(leaseReqId).subscribe({ next: res => { if (res) { window.open(this.envService.environment.BASE_K2_URL, '_self'); } }, }); } handleCloseRequestButton() { this.excuteActionBarButtonsService.handleCloseRequestButton(); } handleRemoveDecisionButton() { this.isCancelCreditApprovalModalOpen = false; const response = this.excuteActionBarButtonsService.handleRemoveDecisionButton(); if (response && response.isError) { this.isCancelCreditApprovalModalOpen = false; } } handleSave() { this.readOnlyMode = this.leaseStateService?.leaseDetails?.readOnly; if (this.readOnlyMode) { this.errMsgType = 'saveFail'; this.openSaveErrorPopover(this.errMsgType); } else { if (!this.readOnlyMode) { this.handleSaveEvent(true); } } } handleSaleToSupport() { this.readOnlyMode = this.leaseStateService?.leaseDetails?.readOnly; if (this.readOnlyMode) { this.router.navigate(['/main/overview-request'], { queryParams: { toSalesSuportErr: true }, }); } else { this.handleSalesSupportButton(); } } actionBarClickEvent($event: string) { switch ($event) { case MenuBarAction.Save: { this.handleSave(); break; } case MenuBarAction.AutoCredit: { this.handleAutoCreditEvent(); break; } case MenuBarAction.SendToCreditDepartment: { this.handleCreditDeptEvent(); break; } case MenuBarAction.ChangeRequestCompleted: { this.changeRequestAnalysisService.handleChangeRequestCompleted( this.leaseDetailsPayload.id ); break; } case MenuBarAction.DocumentFirstApprovalSendDocumentApproval: { this.cachecCallforRAandNC(); if (this.activeParentTab === MainTabs.Lease) { this.cacheCallForEmails().subscribe(() => { this.documentApprovalService.docApprovalAndSendDecisionValidations( MenuBarAction.DocumentFirstApprovalSendDocumentApproval ); }); } else { this.documentApprovalService.docApprovalAndSendDecisionValidations( MenuBarAction.DocumentFirstApprovalSendDocumentApproval ); } break; } case MenuBarAction.DocumentSecondApprovalSendDocumentApproval: { this.cachecCallforRAandNC(); if (this.activeParentTab === MainTabs.Lease) { this.cacheCallForEmails().subscribe(() => { this.documentApprovalService.docApprovalAndSendDecisionValidations( MenuBarAction.DocumentSecondApprovalSendDocumentApproval ); }); } else { this.documentApprovalService.docApprovalAndSendDecisionValidations( MenuBarAction.DocumentSecondApprovalSendDocumentApproval ); } break; } case MenuBarAction.HandleInvoice: { this.cachecCallforRAandNC(); if (this.activeParentTab === MainTabs.Lease) { this.cacheCallForEmails().subscribe(() => { this.documentApprovalService.docApprovalAndSendDecisionValidations( MenuBarAction.HandleInvoice ); }); } else { this.documentApprovalService.docApprovalAndSendDecisionValidations( MenuBarAction.HandleInvoice ); } break; } case MenuBarAction.HandleCreditDecisionSendDocumentApproval: { this.cachecCallforRAandNC(); if (this.activeParentTab === MainTabs.Lease) { this.cacheCallForEmails().subscribe(() => { this.documentApprovalService.docApprovalAndSendDecisionValidations( MenuBarAction.HandleCreditDecisionSendDocumentApproval ); }); } else { this.documentApprovalService.docApprovalAndSendDecisionValidations( MenuBarAction.HandleCreditDecisionSendDocumentApproval ); } break; } case MenuBarAction.Sendemail: { this.cachecCallforRAandNC(); if (this.activeParentTab === MainTabs.Lease) { this.cacheCallForEmails().subscribe(() => { this.handleSaveEvent(); this.documentApprovalService.sendEmailValidations(); }); } else { this.documentApprovalService.sendEmailValidations(); } break; } case MenuBarAction.SelectAndSendEmail: { this.documentApprovalService.checkNumberOfEmail().subscribe(res => { if (res?.isError) return; else { this.cacheCallForEmails().subscribe(() => { this.popoverConfig = { title: 'Select and send email', type: PopoverType.EmailListPopup, showFooter: true, action: MenuBarAction.SelectAndSendEmail, }; this.popoversComponent.openModal(); }); } }); break; } case MenuBarAction.HandleInvoiceWithContracting: { this.documentApprovalService.sendDocApprovalAndHandleInvoice( this.leaseDetailsPayload.id, true ); break; } case MenuBarAction.SelectTemplate: { this.router.navigate(['/main/add-request']); break; } case MenuBarAction.Overview: { this.router.navigate(['/main/overview-request']); break; } case MenuBarAction.CreditCommissionRequest: { this.handleCreditAnalysis(); break; } // case MenuBarAction.SendDocApproval:{ // this.documentApprovalService.sendDocApprovalValidations(); // break; // } case MenuBarAction.ToBusinessLease: { this.handleBLEvent(); break; } case MenuBarAction.Edit: { //first save the request this.handleSaveEvent(true); this.businessLeaseService.editLeaseRequest(); break; } case MenuBarAction.BackToSales: { this.excuteBLAction( MenuBarAction.BackToSales, 'Enter reason of sendback' ); break; } case MenuBarAction.ValidationFinished: { this.excuteBLAction(MenuBarAction.ValidationFinished, 'Enter comment'); break; } case MenuBarAction.ConfirmBusinessLeaseApproval: { this.excuteBLAction( MenuBarAction.ConfirmBusinessLeaseApproval, 'Enter approval comment' ); break; } case MenuBarAction.SendConfimationReject: { this.excuteBLAction( MenuBarAction.SendConfimationReject, 'Enter approval comment' ); break; } case MenuBarAction.Send1stApprovalApprove: { this.excuteBLAction( MenuBarAction.Send1stApprovalApprove, 'Enter first approval comment' ); break; } case MenuBarAction.Send1stApprovalReject: { this.excuteBLAction( MenuBarAction.Send1stApprovalReject, 'Enter first approval comment' ); break; } case MenuBarAction.Send2ndApprovalApprove: { this.excuteBLAction( MenuBarAction.Send2ndApprovalApprove, 'Enter second approval comment' ); break; } case MenuBarAction.Send2ndApprovalReject: { this.excuteBLAction( MenuBarAction.Send2ndApprovalReject, 'Enter second approval comment' ); break; } case MenuBarAction.Summary: { this.businessLeaseService.executeSummaryAction(); break; } case MenuBarAction.CheckActionDisability: { this.leaseDetailsService.setBLActionDisability(); break; } case MenuBarAction.ToSalesSupport: this.handleSaleToSupport(); break; case MenuBarAction.ToControlling: this.handleToControllingButton(); break; case MenuBarAction.Exit: this.handleExitButton(); break; case MenuBarAction.CloseRequest: this.handleCloseRequestButton(); //need to change according to actual response break; case MenuBarAction.RemoveDecision: this.isCancelCreditApprovalModalOpen = true; break; case MenuBarAction.FirstApproval: this.handleCreditApprovalsButton(MenuBarAction.FirstApproval); break; case MenuBarAction.SecondApproval: this.handleCreditApprovalsButton(MenuBarAction.SecondApproval); break; case MenuBarAction.ThirdApproval: this.handleCreditApprovalsButton(MenuBarAction.ThirdApproval); break; case MenuBarAction.Approval: this.handleCreditApprovalsButton(MenuBarAction.Approval); break; case MenuBarAction.Analysis: this.isTypeOfApprovalAnalysis = true; this.handleCreditApprovalsButton(MenuBarAction.Analysis); break; case MenuBarAction.BackToAM: this.handleBackToAMButton(); break; case MenuBarAction.InitiateGenerateOfferOrCollateralDocumentation: this.generateOfferButtonHandleCreditDecContracting(); break; case MenuBarAction.BackToCB: this.handleBackToCb(); break; case MenuBarAction.EndTask: this.handleEndTask(); break; default: break; } } sendSelectedEmail(event: any) { console.log(event); const selectedEmail = event.selectedEmail; if (selectedEmail && selectedEmail.length > 0) { this.documentApprovalService.selectAndSendEmail( this.leaseDetailsPayload.id, selectedEmail[0] ); } } cacheCallForEmails() { return this.leaseTabsService .saveCacheRequestByLeaseTabId(this.leaseTabsService.activeTab, true) .pipe( mergeMap((res: any) => { return this.leaseTabsService.activeTab === LeaseTabId.email ? this.leaseTabsService.saveCacheRequestByLeaseTabId( LeaseTabId.emailDocuments, true ) : of(res); }) ); } generateOfferButtonHandleCreditDecContracting() { this.popoverConfig = { title: 'Contracting Workflow', type: PopoverType.GenerateOfferPopup, showFooter: true, modalSize: 'large', action: MenuBarAction.InitiateGenerateOfferOrCollateralDocumentation, }; this.popoversComponent.openModal(); } handleBackToCb() { this.popoverConfig = { title: 'Enter reason for sending back', type: PopoverType.BackToCB, showFooter: true, modalSize: 'large', action: MenuBarAction.BackToCB, }; this.popoversComponent.openModal(); } excuteBLAction(menubarAction: MenuBarAction, title?: string) { this.popoverConfig = { title: title || 'Enter comment', type: PopoverType.BedrijfsleasePopup, isBedrijfsleaseTask: true, showFooter: true, modalSize: 'large', action: menubarAction, }; this.popoversComponent.openModal(); } // After getting comment make cache call and continue getBedrijfsleaseComment(event: any) { this.popoversComponent.closeModal(); if (event.comment) { this.businessLeaseService.exceuteBLEvents(event); } } cachecCallforRAandNC() { const currentURL = this.router.url; if (currentURL.includes('requested-assets')) { this.activeParentTab = MainTabs.RequestedAsset; this.leaseStateService.activeParentTab$.next(MainTabs.RequestedAsset); } else if (currentURL.includes('new-contracts/')) { this.activeParentTab = MainTabs.NewContract; this.leaseStateService.activeParentTab$.next(MainTabs.NewContract); } else { this.activeParentTab = MainTabs.Lease; this.leaseStateService.activeParentTab$.next(MainTabs.Lease); } } handleBackToAMButton() { this.cachecCallforRAandNC(); this.excuteActionBarButtonsService.handleSendBackToAccountManagerButton(); } handleSalesSupportButton() { this.cachecCallforRAandNC(); const response = this.sendToSalesSupportService.handleSalesSupportButton(); if (response && response.isError) { if (response.type === 'required-field') { if (response.popoverConfig) this.popoverConfig = response.popoverConfig; this.openSaveErrorPopover(this.popoverConfig); } } } isModalOpenCreditApproval: boolean = false; handleCreditApprovalsButton(action: MenuBarAction) { let title = ''; switch (action) { case MenuBarAction.Analysis: title = 'Analyse'; break; case MenuBarAction.FirstApproval: title = 'First Approval Decision'; break; case MenuBarAction.SecondApproval: title = 'Second Approval Decision'; break; case MenuBarAction.ThirdApproval: title = 'Third Approval Decision'; break; case MenuBarAction.Approval: title = 'Third Approval Decision'; break; default: break; } this.approvalConfig = { title: title, type: action, modalSize: 'large', id: '1234', }; this.isModalOpenCreditApproval = true; } public closeCreditApprovalModal(event: any) { this.isModalOpenCreditApproval = false; if (event === 'redirectToK2') { this.cacheService .releaseLeaseRequest(this.leaseDetailsPayload?.id) .pipe(takeUntil(this.destroy$)) .subscribe(); this.router.navigate(['/main']); // redirect to k2 window.open(this.envService.environment.BASE_K2_URL, '_self'); } } showToastMessage(message: string) { this.notification.nativeElement.show(); this.notificationMessage = message; } handleToControllingButton() { this.cachecCallforRAandNC(); const response = this.excuteActionBarButtonsService.handleToControllingButton(); if (response && response.isError) { if (response.type === 'required-field') { if (response.popoverConfig) this.popoverConfig = response.popoverConfig; this.openSaveErrorPopover(this.popoverConfig); } } } handleCreditAnalysis() { this.loaderService.show(); this.leaseService .getCreditCommissionAnalysis(this.leaseDetailsPayload.id) .subscribe({ next: res => { this.loaderService.hide(); if (res) { this.loaderService.hide(); if (!res) { // added this console due to lint issue , Whovere implemented pls resolve this lint issue from your side console.log(res); } else { this.loaderService.hide(); this.downloadCreditCommissionPdfService.generateCreditCommissionLetter( res, this.leaseDetailsPayload, this.contactPerson$, this.employeeName ); } } }, error: (error: ErrorResponse) => { this.loaderService.hide(); this.errorMessage = error.errors[0].message; }, }); } setEmployeeName() { const rawData: any = { userId: this.leaseDetailsPayload[LeaseTab.LeaseRequest]?.asamId, userName: '', }; const params = new URLSearchParams(rawData).toString(); this.leaseRequestService.getEmployeeDetails(`?${params}`).subscribe(res => { this.employeeName = res; }); } handleSaveEvent(showLoader?: boolean) { // TODO: Commenting this code since need to discuss its implementation // to check if requested assets/ Nc tab is open and save cache data for current opened tab. const currentURL = this.router.url; if (currentURL.includes('requested-assets/')) { this.leaseStateService.activeParentTab$.next(MainTabs.RequestedAsset); } else if (currentURL.includes('new-contracts/')) { this.leaseStateService.activeParentTab$.next(MainTabs.NewContract); } else { this.leaseStateService.activeParentTab$.next(MainTabs.Lease); } if (showLoader) this.loaderService.show(); const { isInValidLeaseTabs, isInValidRATabs, isInValidNCTabs } = this.validateRequiredFieldsService.isLeaseAndAssetTabsInvalid(); let source$: Observable<any>; //if active tab is RA or NC do not call lease save cache api if ( currentURL.includes('requested-assets') || currentURL.includes('new-contracts') ) { source$ = of({}); } else { source$ = this.leaseDetailsService.saveCacheForActiveTab(showLoader); } source$ .pipe( mergeMap(() => { if (!isInValidLeaseTabs && !isInValidRATabs && !isInValidNCTabs) { return this.refactorSaveEvent(); } else { return of(undefined); } }) ) .subscribe({ next: (res: any) => { if (showLoader) this.loaderService.hide(); if (!res) { this.openSaveErrorPopover(); this.leaseStateService.isSaveBtnClicked = true; } if (res) { if ( res === 'arrangement-fee error' || res === 'arrangement-fee-decimal error' || res === 'supplierBccNo error' ) { this.openSaveErrorPopover(res); } else { this.setErrorMessages(res); this.notificationMessage = res?.message; this.loaderService.show(); this.loaderService.setLoadingText(''); if (this.notificationMessage) this.notificationService.showNotificationMessage( this.notificationMessage ); setTimeout(() => { this.loaderService.hide(); }, 1000); } } }, error: (error: ErrorResponse) => { this.loaderService.hide(); this.notificationMessage = error[0]?.message; this.notificationService.showNotificationMessage( this.notificationMessage ); this.errorMessage = error[0]?.message; this.openSaveErrorPopover(); this.leaseStateService.isSaveBtnClicked = true; }, }); } setErrorMessages(res) { const raState = this.requestedAssetsStateService; const supplierBankValue = raState?.selectedRequestedAsset?.supplier?.supplierBank; const reasonforLease = raState?.selectedRequestedAsset?.asset?.reasonForLeaseType; const description = raState?.selectedRequestedAsset?.asset?.description; this.requestedAssetQuantity = raState?.selectedRequestedAsset?.asset?.objectQuantity; this.newContractsQuantity = this.newContractStateService?.newContractsPayload?.ncAsset?.objectQuantity; this.maintainanceAmt = raState?.selectedRequestedAsset?.lease?.maintenanceAmount; this.useFulLife = this.newContractStateService?.newContractsPayload?.ncAsset?.usefullLife; this.durationValue = this.requestedAssetsStateService.durationValue; this.orderNo = this.newContractStateService?.newContractsPayload?.ncVendor?.orderNo; switch (res) { case 'supplier error': { this.notificationMessage = `Save failed: The number of characters of the field for property supplierBank for request object ${description} is too large. Maximum length is 60. Length of the value entered is ${supplierBankValue?.length} (${supplierBankValue})`; this.notificationService.showNotificationMessage( this.notificationMessage ); break; } case 'asset-error': { this.notificationMessage = `Save failed: The number of characters of the field for property reasonForLeaseType for request object ${description} is too large. Maximum length is 240. Length of the value entered is ${reasonforLease.length} (${reasonforLease})`; break; } case 'prefinance error': { this.prefinanceWaring(); this.notificationService.showNotificationMessage( this.notificationMessage ); break; } case 'lease-request error': { this.notificationMessage = 'leaseRequestError'; this.errorMessage = ' '; this.openSaveErrorPopover(this.notificationMessage); break; } case 'useful-life error': { this.setNotification('useFulLifeError'); break; } case 'asset-lease error': { this.setNotification('assetLeaseError'); break; } case 'ncVendor-error': { this.setNotification('orderNoError'); break; } case 'requestedAssetQuantity error': { this.setNotification('quantityError'); break; } case 'newContractsQuantity error': { this.setNotification('newContractsQuantityError'); break; } case 'RevisionLease error': { this.setNotification('revisionLeaseError'); break; } case 'AFAcode error': { this.setNotification('afacodeError'); break; } case 'Quote type': { this.setNotification('quoteType'); } } } setNotification(message: string) { this.notificationMessage = message; this.errorMessage = ' '; this.openSaveErrorPopover(this.notificationMessage); } refactorSaveEvent() { const abnAmroExposure = this.leaseDetailsPayload?.leaseRequest?.abnAmroExposure; const minimumValue = -100000000000; const maxValue = 100000000000; const supplierBankValue = this.requestedAssetsStateService?.selectedRequestedAsset?.supplier ?.supplierBank; const supplierBccNumber = this.requestedAssetsStateService?.selectedRequestedAsset?.supplier ?.supplierChamberCommerceNumber; const reasonforLease = this.requestedAssetsStateService?.selectedRequestedAsset?.asset ?.reasonForLeaseType; const arrangementFee = this.leaseDetailsPayload?.[LeaseTab.Tariff]?.arrangementFee; const lessorId = this.leaseDetailsPayload?.[LeaseTab.LeaseRequest]?.lessorId; if (!this.validateRequiredFieldsService.validatePrefinanceData()) { return of('prefinance error'); } if (supplierBankValue !== undefined && supplierBankValue.length > 60) { return of('supplier error'); } if (supplierBccNumber !== undefined && supplierBccNumber.length > 8) { return of('supplierBccNo error'); } if (reasonforLease !== undefined && reasonforLease.length > 240) { return of('asset-error'); } if ( arrangementFee && (lessorId === LESSOR_ID.Lessor_520 || lessorId === LESSOR_ID.Lessor_620) && (arrangementFee <= minimumValue || arrangementFee >= maxValue) ) { return of('arrangement-fee error'); } else if ( (lessorId === LESSOR_ID.Lessor_520 || lessorId === LESSOR_ID.Lessor_620) && !new RegExp(numberWithOnlyTwoDecimals).test(arrangementFee.toString()) ) { return of('arrangement-fee-decimal error'); } if ( this.maintainanceAmt <= minimumValue || this.maintainanceAmt >= maxValue ) { return of('asset-lease error'); } if ( this.leaseStateService?.leaseDetailsPayload?.calledOffObject && this.leaseStateService?.leaseDetailsPayload?.calledOffObject.length && this.leaseStateService?.leaseDetailsPayload?.leaseRequest ?.revisionType === '02' ) { return of('RevisionLease error'); } if (abnAmroExposure <= minimumValue || abnAmroExposure >= maxValue) { return of('lease-request error'); } else { this.leaseDetailsPayload[LeaseTab.Tariff][ TariffFormField.ArrangementFee ] = 0; return this.saveEventValidations(); } } saveEventValidations() { const regex = new RegExp(numberRegex); const AFAcode = this.newContractStateService?.newContractsAsset?.afaCode; if (this.useFulLife > this.durationValue) { return of('useful-life error'); } if ( this.leaseDetailsPayload?.leaseRequest?.processAutomationType === '04' && this.leaseDetailsPayload?.tariff?.quoteType === '04' ) { return of('Quote type'); } if ( this.requestedAssetQuantity && !regex.test(this.requestedAssetQuantity.toString()) ) { return of('requestedAssetQuantity error'); } if ( this.newContractsQuantity && !regex.test(this.newContractsQuantity.toString()) ) { return of('newContractsQuantity error'); } if (AFAcode?.length > 10) { return of('AFAcode error'); } return this.leaseService.getStoreLeaseDetails(this.leaseDetailsPayload.id); } sendToCreditDepartment() { this.leaseDetailsService .saveCacheForActiveTab() .pipe( mergeMap(() => { return this.sendToCreditDept.getSendToCreditDept( this.leaseDetailsPayload.id ); }) ) .subscribe({ next: res => { this.loaderService.hide(); this.notificationMessage = ''; this.notification.nativeElement.show(); this.notificationMessage = res.message; this.leaseDetailsService.validateProbableCommencingDate(); if (this.storageService.isNewLeaseRequest) { this.router.navigateByUrl('/main/add-request'); } else if (this.storageService.isOverviewRequest) { this.router.navigateByUrl('/main/overview-request'); } else if (this.leaseStateService.isK2Request) { // redirect to k2. window.open(this.envService.environment.BASE_K2_URL, '_self'); } }, error: () => { this.notificationMessage = ''; this.notification.nativeElement.show(); this.notificationMessage = 'newIndication (assetUsed) of requestobject must be filled in before sending to creditdepartment'; }, }); } prefinanceWaring() { this.notification.nativeElement.show(); this.notificationMessage = `Save failed: Prefinance is only allowed if the total financing amount (currently:${this.validateRequiredFieldsService.selectedAssetWithError?.modalities?.capital} ) is more than at least ${this.minValue} ), the auto credit boundary`; } getRADesrciption() { const selectedAssetWithError = this.validateRequiredFieldsService.selectedAssetWithError; if (selectedAssetWithError) { this.assetDescription = selectedAssetWithError[RequestObjectTab.Asset]?.description || ''; } } handleCreditDeptEvent() { this.readOnlyMode = this.leaseStateService?.leaseDetails?.readOnly; if (this.readOnlyMode) { this.errMsgType = 'creditDept'; this.openSaveErrorPopover(this.errMsgType); } else { this.cachecCallforRAandNC(); const response = this.sendToCreditService.handleCreditDeptEvent(); if (response && response.isError) { if (response.type === 'required-field') { if (response.popoverConfig) this.popoverConfig = response.popoverConfig; this.openSaveErrorPopover(this.popoverConfig); } } } } openErrorPopover() { this.popoverActionType = MenuBarAction.SendToCreditDepartment; this.popoverConfig = { title: 'Missing Required Fields', subtitle: `Not all the required attributes are filled for the request object ${this.assetDescription}`, type: PopoverType.ErrorPopup, }; this.popoversComponent.openModal(); } handleAutoCreditEvent() { this.readOnlyMode = this.leaseStateService?.leaseDetails?.readOnly; if (this.readOnlyMode) { this.errMsgType = 'autoCredit'; this.openSaveErrorPopover(this.errMsgType); } else { this.cachecCallforRAandNC(); const role = this.storageService.getSelectedRoles()[0].role; const processAutomationType = this.leaseDetailsPayload.leaseRequest?.processAutomationType; if ( this.leaseStateService.k2ActivityName != k2ActivityNames.RequestCompletion && role != 'CommercieleBinnendienst' ) { if (role === 'AccountManager' && processAutomationType === '04') { this.autoCreditFailedBL(); } } else if ( this.leaseDetailsPayload?.leaseRequest?.revisionType !== '02' && (this.leaseDetailsPayload?.requestObject === null || this.leaseDetailsPayload?.requestObject === undefined || this.leaseDetailsPayload?.requestObject.length === 0) ) { this.popOverFailedAutoCredit(); } else { this.getAutoCreditChecks(); } } } autoCreditFailedBL() { this.popoverActionType = MenuBarAction.AutoCredit; this.popoverConfig = { title: 'Auto Approval Failed', subtitle: "Can't start Auto credit\n Please go to BL for the Bedrijfslease leaserequests", type: PopoverType.AutoCreditErrorPopup, modalSize: 'small', }; this.popoversComponent.openModal(); } getAutoCreditChecks() { this.isInValidFields = this.validateRequiredFieldsService.isLeaseTabsInValid(); if (this.leaseDetailsPayload?.leaseRequest?.revisionType !== '02') { this.isError = this.validateRequiredFieldsService.isRATabsInValid(); } else { this.isError = false; } this.autoCreditBasicValidation = this.isInValidFields || this.isError; if (this.isApproved) { this.popoverActionType = MenuBarAction.AutoCredit; this.popoverConfig = { title: 'Auto Approval Failed', subtitle: WarningTexMessaages.RequestAlreadyApproved, type: PopoverType.AutoCreditErrorPopup, modalSize: 'small', }; this.popoversComponent.openModal(); } if (this.autoCreditBasicValidation) { this.autoCreditBuisnessRuleFlag = true; this.preCheckAutoCredit(); } if (!this.autoCreditBasicValidation) { this.getKvkNumberForBusinessValidation(); } } popOverFailedAutoCredit() { this.popoverActionType = MenuBarAction.AutoCredit; this.popoverConfig = { title: 'Auto Approval Failed', subtitle: 'AutoCredit cannot be calculated. No requested objects in the lease request', type: PopoverType.AutoCreditErrorPopup, modalSize: 'small', }; this.popoversComponent.openModal(); } sendToAutoCreditEvent() { const leaseReqId = this.leaseDetailsPayload?.id; if (this.autoCreditBuisnessRuleFlag != true) { this.loaderService.show(); this.loaderService.setLoadingText('Accessing Scorecard'); this.handleSaveEvent(); this.loaderService.show(); this.loaderService.setLoadingText('Accessing Scorecard'); setTimeout(() => { this.autoCreditService.autoCreditButton(leaseReqId).subscribe({ next: res => { this.autoCreditResponse = res; this.autoCreditRelation = autoCreditConstants.AutoCreditRelation( this.autoCreditResponse?.inputBusinessPartner ); this.DBADERealtion = autoCreditConstants.DBRelation( this.autoCreditResponse?.returnBusinessPartner, this.autoCreditResponse?.inputBusinessPartner ); this.autoCreditRequestObjValues = autoCreditConstants.autoCreditRequestObjFields( this.autoCreditResponse ); this.autoCreditRequestObjects = this.requestedAssetsStateService?.requestObjectPayload; this.setAutoCreditFinalResultMessage(); this.loaderService.hide(); this.openAutoCreditResultPopOver(); }, error: (error: any) => { this.loaderService.hide(); this.popoverActionType = MenuBarAction.AutoCredit; this.popoverConfig = { title: 'Auto Approval Failed', subtitle: error[0].message, type: PopoverType.ErrorPopup, modalSize: 'small', }; this.popoversComponent.openModal(); }, }); }, 3000); } } preCheckAutoCredit() { if (this.isInValidFields || this.isError) { const popoverConfig = { title: 'Auto Approval Failed', type: PopoverType.ErrorPopup, }; this.openSaveErrorPopover(popoverConfig); } else if ( (this.leaseDetailsPayload?.requestObject === undefined || this.leaseDetailsPayload?.requestObject.length === 0) && this.leaseDetailsPayload.leaseRequest?.revisionType === '02' ) { this.popOverFailedAutoCredit(); } this.sendToAutoCreditEvent(); } getKvkNumberForBusinessValidation() { const clientRelationNumber = this.leaseDetailsPayload?.businessPartner?.clientRelationNumber; let kvkNum; const reqBody = { adrbox: '', adrstreet: '', relationNumber: clientRelationNumber, adrzipcode: '', bpkvknumber: '', bpname: '', adrhouse: '', adrcity: '', bpdunsnumber: '', adruid: '', }; this.commonService.searchBusinessRelation(reqBody).subscribe(res => { kvkNum = res[0]?.bpKvknumber ?? null; this.AutoCreditBusinessRuleValidation(kvkNum); }); } AutoCreditBusinessRuleValidation(kvkNumber?: string) { this.totalLiablityAmount = this.businessPartnerService.totalLiablityAmount; const RoundedtotalLiablityAmount = Math.floor(this.totalLiablityAmount); const processAutomationType = this.leaseDetailsPayload.leaseRequest?.processAutomationType; const lessorId = this.leaseDetailsPayload?.leaseRequest?.lessorId; this.autoCreditBuisnessRuleFlag = false; if (processAutomationType === '05') { this.popoverActionType = MenuBarAction.AutoCredit; this.popoverConfig = { title: 'Auto Approval Failed', subtitle: WarningTexMessaages.AutoCreditErrorMessageForNPL, type: PopoverType.AutoCreditErrorPopup, modalSize: 'small', }; this.autoCreditBuisnessRuleFlag = true; this.popoversComponent.openModal(); } if (processAutomationType === '04') { this.popoverActionType = MenuBarAction.AutoCredit; this.popoverConfig = { title: `Can't start auto credit`, subtitle: WarningTexMessaages.AutoCreditErrorMessageForBL, type: PopoverType.AutoCreditErrorPopup, modalSize: 'small', }; this.autoCreditBuisnessRuleFlag = true; this.popoversComponent.openModal(); } if (RoundedtotalLiablityAmount > this.maximumTotalLiablityAmount) { this.popoverActionType = MenuBarAction.AutoCredit; this.popoverConfig = { title: `Auto Approval Failed`, subtitle: `AutoCredit cannot be calculated. The liability of the request (${this.totalLiablityAmount}) cannot be higher than the autocredit boundary (${this.maximumTotalLiablityAmount})`, type: PopoverType.AutoCreditErrorPopup, modalSize: 'small', }; this.autoCreditBuisnessRuleFlag = true; this.popoversComponent.openModal(); } if (lessorId === 320) { const requestedAssets = this.requestedAssetsStateService.requestObjectPayload; for (const obj of requestedAssets) { if (obj.modalities?.periodicityType !== '012') { const errorMessage = `Autocredit cannot be calculated. request object ${obj.asset?.description} has no monthly periodocity type.`; this.popoverActionType = MenuBarAction.AutoCredit; this.popoverConfig = { title: `Auto Approval Failed`, subtitle: errorMessage, type: PopoverType.AutoCreditErrorPopup, modalSize: 'small', }; this.autoCreditBuisnessRuleFlag = true; this.popoversComponent.openModal(); } } } if (kvkNumber === '' || kvkNumber === undefined || kvkNumber === null) { this.popoverActionType = MenuBarAction.AutoCredit; this.popoverConfig = { title: `Auto Approval Failed`, subtitle: 'There is a problem with Dun and Bradstreet. Please try again or contact the service desk.', type: PopoverType.AutoCreditErrorPopup, modalSize: 'small', }; this.autoCreditBuisnessRuleFlag = true; this.popoversComponent.openModal(); } if ( this.leaseDetailsPayload.leaseRequest?.revisionType !== '02' && this.leaseDetailsPayload.requestObject?.length === 0 ) { this.popoverActionType = MenuBarAction.AutoCredit; this.popoverConfig = { title: `Auto Approval Failed`, subtitle: 'AutoCredit cannot be calculated.No requested objects are found in the lease request.', type: PopoverType.AutoCreditErrorPopup, modalSize: 'small', }; this.autoCreditBuisnessRuleFlag = true; this.popoversComponent.openModal(); } this.sendToAutoCreditEvent(); } /* The below function is written because to resolve the dependecny of Kvk number from Based on prior Lease request and template flow for the Auto credit business rule validation. */ getKvkNumber(clientRelationNumber: any) { let kvkNum; const reqBody = { adrbox: '', adrstreet: '', relationNumber: clientRelationNumber, adrzipcode: '', bpkvknumber: '', bpname: '', adrhouse: '', adrcity: '', bpdunsnumber: '', adruid: '', }; this.commonService.searchBusinessRelation(reqBody).subscribe(res => { kvkNum = res[0]?.bpKvknumber ?? ''; return kvkNum; }); } filterKvk(businessRelation: any) { businessRelation.forEach((relations: any) => { return relations?.bpKvknumber; }); } // Auto credit button click closeAutoCreditModal() { this.isAutoCreditModal = false; } openAutoCreditResultPopOver() { this.isAutoCreditModal = true; } // This will be trigreed on Accepting the decision acceptAutoCredit() { const leaseReqId = this.leaseStateService.leaseDetailsPayload?.id; const finalDecision = this.autoCreditResponse?.finalDecision; this.loaderService.show(); this.autoCreditService .acceptAutoCredit(leaseReqId, finalDecision) .subscribe({ next: res => { const message = res.message; this.loaderService.hide(); if (res) { if (finalDecision !== 'D') { this.uploadAutoCreditScorePdf(); this.closeAutoCreditModal(); window.open(this.envService.environment.BASE_K2_URL, '_self'); } else { this.leaseStateService.k2ActivityName = k2ActivityNames.RequestCompletion; const role = this.storageService.getSelectedRoles()[0].role; if (role === 'CommercieleBinnendienst') { this.uploadAutoCreditScorePdf(); this.router.navigate(['/main/overview-request'], { queryParams: { finalDecision, message }, }); } } } }, }); } openAutoCreditErrorPopover() { this.popoverActionType = MenuBarAction.AutoCredit; this.popoverConfig = { title: 'Missing required Fields', subtitle: `Not all the required attributes are filled for the request object ${this.assetDescription}`, type: PopoverType.ErrorPopup, }; this.popoversComponent.openModal(); } setAutoCreditFinalResultMessage() { const finalDecision = this.autoCreditResponse?.finalDecision; switch (finalDecision) { case 'D': this.finalDecisionBadgeStatusMessage = 'Denied'; this.finalDecisionBadgeStyleType = 'negative'; break; case 'A': this.finalDecisionBadgeStatusMessage = 'Approved'; this.finalDecisionBadgeStyleType = 'positive'; break; case 'G': this.finalDecisionBadgeStatusMessage = 'Gray'; this.finalDecisionBadgeStyleType = 'inactive'; break; case 'S': this.finalDecisionBadgeStatusMessage = 'Score'; this.finalDecisionBadgeStyleType = 'info'; break; } } getStatusMessageForAutoCreditRequestObject(decision: string) { switch (decision) { case 'Rejected': return 'Denied'; case 'Accepted': return 'Approved'; case 'Manual': return 'Gray'; case 'Score': return 'Score'; default: return ''; } } getStatusStyleForAutoCreditRequestObject(decision: string) { switch (decision) { case 'Rejected': return 'negative'; case 'Accepted': return 'positive'; case 'Manual': return 'inactive'; case 'Score': return 'info'; default: return ''; } } // Pdf of auto credit decision uploadAutoCreditScorePdf() { const executionDate = this.autoCreditResponse?.executionDate; const leaseReqId = this.autoCreditResponse?.inputBusinessPartner?.leaseReqId; const statutoryName = this.autoCreditResponse?.inputBusinessPartner?.clientStatutoryName; const mainDescription = this.autoCreditResponse?.description; const finalDecision = this.autoCreditResponse?.finalDecision; const dnbScore = this.autoCreditResponse?.dnbScore; const crgScore = this.autoCreditResponse?.fineCRG; const inputRelation = this.autoCreditResponse?.inputBusinessPartner; const returnRelation = this.autoCreditResponse?.returnBusinessPartner; let footerDescription; let finalDecisionMessage = ''; let finalDecisionColor = ''; if (finalDecision != 'A') { footerDescription = { text: mainDescription + '(DNB Score:' + dnbScore + ') (Fine CRG:' + crgScore + ')', color: 'red', }; } else { footerDescription = { text: '', }; } if (finalDecision === 'A') { finalDecisionMessage = 'Approved'; finalDecisionColor = '#99FF99'; } else if (finalDecision === 'D') { finalDecisionMessage = 'Denied'; finalDecisionColor = '#FF3333'; } else if (finalDecision === 'G') { finalDecisionMessage = 'Gray'; finalDecisionColor = '#999999'; } const uploadContent: any = { content: [ { text: 'Auto credit outcome (' + executionDate + ')\n', style: 'header', }, { text: '\n', }, { columns: [ { width: 450, table: { width: '*', headerRows: 1, body: [ ['LeaseRequest ' + leaseReqId + 'for ' + statutoryName], [mainDescription], ], }, }, { width: '*', text: finalDecisionMessage, style: 'finalDecision', color: finalDecisionColor, }, ], }, { text: '\n', }, { columns: [ { width: '50%', text: '\nAutoCredit Relation', style: 'header', }, { width: '50%', text: '\nD&B (ADE)Relation', style: 'header', }, ], }, { columns: [ { width: '*', stack: [ { text: 'Relation #' + inputRelation?.clientRelationNumber }, { text: inputRelation?.clientStatutoryName }, { text: `${inputRelation?.clientStreet} ${inputRelation?.clientHouseNumber} ${inputRelation?.clientHouseExtensionNo}`, }, { text: `${inputRelation?.clientPostalCode} ${inputRelation?.clientResidence}`, }, { text: 'CoC: ' + inputRelation?.clientChamberCommerce }, ], }, { width: '*', stack: [ { text: 'Relation #' + returnRelation?.clientRelationNumber }, { text: returnRelation?.clientStatutoryName }, { text: `${returnRelation?.clientStreet} ${returnRelation?.clientHouseNumber} ${inputRelation?.clientHouseExtensionNo}`, }, { text: `${returnRelation?.clientPostalCode} ${inputRelation?.clientResidence}`, }, { text: returnRelation?.clientChamberCommerce }, ], }, ], }, { text: '\n', }, ], }; // Loop through each decision response if (this.autoCreditResponse?.autoCreditDecision) { this.autoCreditResponse.autoCreditDecision?.decisionResponse.forEach( (response: any, index: number) => { const policyData = response.individualDecision.policy; const tableBody: any = []; const requestObjfinalDecisionValue = response.finalDecision.policy[0].results.result[0].value; let requestObjfinalDecisionColor = ''; let requestObjfinalDecisionMessage = ''; if (requestObjfinalDecisionValue === 'Manual') { requestObjfinalDecisionColor = '#999999'; // Gray for Manual requestObjfinalDecisionMessage = 'Gray'; } else if (requestObjfinalDecisionValue === 'Accepted') { requestObjfinalDecisionColor = '#99FF99'; // Green for Approved requestObjfinalDecisionMessage = ' Approved'; } else if (requestObjfinalDecisionValue === 'Rejected') { requestObjfinalDecisionColor = '#FF3333'; // Red for Rejected requestObjfinalDecisionMessage = 'Denied'; } const requestObj = this.autoCreditRequestObjects[index]; const assetDescription = requestObj?.asset?.description; const assetQty = requestObj.asset?.objectQuantity; const capital = requestObj?.modalities?.capital; // Add a table to the content for each decision response uploadContent.content.push({ columns: [ { width: 450, text: `${assetQty} X ${assetDescription} ${capital}`, // Display decision response index style: 'header', }, { width: '*', text: requestObjfinalDecisionMessage, style: 'finalDecision', color: requestObjfinalDecisionColor, }, ], }); // Process each policy data policyData.forEach((policy: any) => { if (policy?.results.result) { const descriptions = policy?.results?.result[0]?.descriptions; let cultureDescription: { value?: string } | undefined; if (descriptions && descriptions.description) { cultureDescription = descriptions.description.find( (desc: any) => desc?.culture === 'en-GB' ); } const value = policy?.results?.result[0]?.value; let bgColor = ''; let policyResultMessage = ''; // Add the final decision value with appropriate background color // Determine background color based on the value if (value === 'Manual') { bgColor = '#CCCCCC'; // Gray for Manual policyResultMessage = 'Gray'; } else if (value === 'Accepted') { bgColor = '#90d1ac'; // Green for Approved policyResultMessage = 'Approved'; } else if (value === 'Rejected') { bgColor = '#FF0000'; // Red for Rejected policyResultMessage = 'Denied'; } // Add row to the table body tableBody.push([ { text: `${policy.major}.${policy.minor} ${policy.name}\n ${ cultureDescription ? cultureDescription?.value : '' }`, }, { text: policyResultMessage, fillColor: bgColor }, ]); } // Add description row }); // Add the table to the content uploadContent.content.push({ table: { headerRows: 1, widths: ['80%', '20%'], body: tableBody, // Table data }, layout: { defaultBorder: true, }, }); } ); } uploadContent.content.push({ columns: [ { width: 450, stack: [{ text: '\nTotal outcome', bold: true }, footerDescription], }, { width: '*', text: finalDecisionMessage, style: 'finalDecision', color: finalDecisionColor, }, ], }); // Define styles for the header and final decision uploadContent.styles = { header: { fontSize: 16, bold: true, margin: [0, 10, 0, 5], // Margin bottom }, finalDecision: { bold: true, margin: [0, 5, 0, 0], // Margin top alignment: 'left', fontSize: 16, }, }; const pdfDocGenerator = pdfMake.createPdf(uploadContent); pdfDocGenerator.getBlob(blob => { this.pdfFile = blob; this.autoCreditService.uploadAutoCreditPdf( this.pdfFile, leaseReqId, inputRelation.clientRelationNumber, 'Approval Letter' ); }); } handleBLEvent() { this.cachecCallforRAandNC(); const validationConfig = this.businessLeaseService.checkBLValidations(); if (validationConfig?.isError) { if (validationConfig?.type === 'popup') { const popoverConfig = { title: 'Leaserequest is not valid', type: PopoverType.ErrorPopup, }; this.openSaveErrorPopover(popoverConfig); } return; } this.businessLeaseService.toBusinessLease(); } get missingRequiredFormFileds() { return this.validateRequiredFieldsService.missingRequiredFormFileds; } openSaveErrorPopover(msg?: string | PopoverConfig) { this.popoverActionType = MenuBarAction.Save; if (msg === 'saveFail' && this.readOnlyMode) { this.popoverConfig = { title: `Save failed`, type: PopoverType.ErrorPopup, modalSize: 'medium', }; } else if (msg === 'creditDept') { this.creditError(); } else if (msg === 'leaseRequestError') { this.leaseRequestError(); } else if (msg === 'useFulLifeError') { this.useFulLifeError(); } else if (msg === 'quantityError') { this.quantityError(); } else if (msg === 'newContractsQuantityError') { this.NCquantityError(); } else if (msg === 'revisionLeaseError') { this.revisionLeaseError(); } else if (msg === 'afacodeError') { this.AFAcodeError(); } else if (msg === 'orderNoError') { this.orderNumberError(); } else if (msg === 'assetLeaseError') { this.assetLeaseError(); } else if (msg === 'quoteType') { this.quoteType(); } else if (msg === 'autoCredit') { this.popoverConfig = { title: `Auto Credit Failed`, type: PopoverType.ErrorPopup, modalSize: 'medium', }; } else if ( msg && typeof msg != 'string' && (this.leaseStateService.k2ActivityName === k2ActivityNames.ThirdApproval || this.leaseStateService.k2ActivityName === k2ActivityNames.Approval) ) { this.popoverActionType = MenuBarAction.ThirdApproval; this.popoverConfig = msg; } else if (msg === 'supplierBccNo error') { this.supplierBccNoError(); } else if (msg === 'arrangement-fee error') { this.arrangementFeeEror(); } else if (msg === 'arrangement-fee-decimal error') { this.arrangementFeeDecimalEror(); } else { if (!this.readOnlyMode) { if (msg && this.isPopoverConfig(msg)) { this.popoverConfig = msg; } else { this.popoverConfig = { title: 'Save - Missing required fields', type: PopoverType.ErrorPopup, }; } } } this.popoversComponent.openModal(); } isPopoverConfig(item: any): item is PopoverConfig { return item; } leaseRequestError() { const value = this.leaseDetailsPayload?.leaseRequest?.abnAmroExposure; const leaseId = this.leaseDetailsPayload?.id; this.popoverConfig = { title: `Save Failed`, type: PopoverType.ErrorPopup, modalSize: 'medium', message: `The number of digits for abnAmroExposure for lease request ` + leaseId + ` is too large. (` + value + `) The value should be less than 100,000,000,000 and greater than -100,000,000,000`, }; } creditError() { this.popoverConfig = { title: `K2 workflow creation failed.`, type: PopoverType.ErrorPopup, modalSize: 'medium', }; } orderNumberError() { const contractNo = this.newContractStateService.contractNumber.type; const contract = contractNo.split('/'); this.popoverConfig = { title: `Save Failed`, type: PopoverType.ErrorPopup, modalSize: 'medium', message: `The number of characters of the field for property orderNo for contract ` + contract[0] + ` is too large. Maximum length is 16. Length of the value entered is ` + this.orderNo.length + `(` + this.orderNo + `)`, }; } assetLeaseError() { const requestObjectName = this.requestedAssetsStateService?.selectedRequestedAsset?.asset ?.description; this.popoverConfig = { title: `Save Failed`, type: PopoverType.ErrorPopup, modalSize: 'medium', message: `The number of digits for maintenanceAmount for request Object ` + requestObjectName + ` is too large. (` + this.maintainanceAmt + `) The value should be less than 100,000,000,000 and greater than -100,000,000,000`, }; } arrangementFeeEror() { const arrangementFee = this.leaseDetailsPayload?.[LeaseTab.Tariff]?.arrangementFee; this.popoverConfig = { title: `Save Failed`, type: PopoverType.ErrorPopup, modalSize: 'medium', message: `The number of digits for arrangementFee for lease request ${this.leaseDetailsPayload?.id} is too large. ( ${arrangementFee})` + 'The value should be less than 100,000,000,000 and greater than -100,000,000,000', }; } supplierBccNoError() { const requestObjectName = this.requestedAssetsStateService?.selectedRequestedAsset?.asset ?.description; const supplierBccNoValue = this.requestedAssetsStateService?.selectedRequestedAsset?.[ RequestObjectTab.Supplier ]?.supplierChamberCommerceNumber; const subStringSupplierBccNoValue = supplierBccNoValue.substring(2); this.popoverConfig = { title: `Save Failed`, type: PopoverType.ErrorPopup, modalSize: 'medium', message: `The number of digits for supplierChamberCommerceFile for request object ` + requestObjectName + ` is too large. (` + subStringSupplierBccNoValue + `) The value should be less than 1,000,000 and greater than -1,000,000`, }; } arrangementFeeDecimalEror() { const arrangementFee = this.leaseDetailsPayload?.[LeaseTab.Tariff]?.arrangementFee; this.popoverConfig = { title: `Save Failed`, type: PopoverType.ErrorPopup, modalSize: 'medium', message: `here are too many decimals for arrangementFee for lease request ${this.leaseDetailsPayload?.id}, there are 2 decimals allowed. (${arrangementFee})`, }; } useFulLifeError() { const minLImitUseFulLife = (this.useFulLife * 40) / 100; const maxLimitUseFulLife = (this.useFulLife * 90) / 100; this.popoverConfig = { title: `Save Failed`, type: PopoverType.ErrorPopup, modalSize: 'medium', message: NC_ASSET_MESSAGES.MAX_USEFUL_LIFE1 + this.durationValue + NC_ASSET_MESSAGES.MAX_USEFUL_LIFE2 + minLImitUseFulLife + NC_ASSET_MESSAGES.MAX_USEFUL_LIFE3 + maxLimitUseFulLife + NC_ASSET_MESSAGES.MAX_USEFUL_LIFE4, }; } AFAcodeError() { const contractNo = this.newContractStateService.contractNumber.type; const contract = contractNo.split('/'); const afacode = this.newContractStateService?.newContractsAsset?.afaCode; this.popoverConfig = { title: `Save Failed`, type: PopoverType.ErrorPopup, modalSize: 'medium', message: NC_ASSET_MESSAGES.MAX_LENGTH_AFA_CODE1 + contract[0] + NC_ASSET_MESSAGES.MAX_LENGTH_AFA_CODE2 + afacode.length + NC_ASSET_MESSAGES.MAX_LENGTH_AFA_CODE3 + afacode + NC_ASSET_MESSAGES.MAX_LENGTH_AFA_CODE4, }; } quoteType() { this.popoverConfig = { title: `Save Failed`, type: PopoverType.ErrorPopup, modalSize: 'medium', message: 'Bedrijfslease requests may not contain a specialcondition of type FIXATIE.', }; } quantityError() { const requestObjectName = this.requestedAssetsStateService?.selectedRequestedAsset?.asset ?.description; this.popoverConfig = { title: `Save Failed`, type: PopoverType.ErrorPopup, modalSize: 'medium', message: RA_ASSET_MESSAGES.QUANTITY_NO_DECIMAL_ERROR1 + requestObjectName + RA_ASSET_MESSAGES.QUANTITY_NO_DECIMAL_ERROR2 + this.requestedAssetQuantity + RA_ASSET_MESSAGES.QUANTITY_NO_DECIMAL_ERROR3, }; } NCquantityError() { const contractNo = this.newContractStateService.contractNumber.type; const contract = contractNo.split('/'); this.popoverConfig = { title: `Save Failed`, type: PopoverType.ErrorPopup, modalSize: 'medium', message: NC_ASSET_MESSAGES.QUANTITY_NO_DECIMAL_ERROR1 + contract[0] + NC_ASSET_MESSAGES.QUANTITY_NO_DECIMAL_ERROR2 + this.newContractsQuantity + NC_ASSET_MESSAGES.QUANTITY_NO_DECIMAL_ERROR3, }; } revisionLeaseError() { const leaseId = this.leaseDetailsPayload.id; const calledOffObject = this.leaseStateService?.leaseDetailsPayload?.calledOffObject; this.popoverConfig = { title: `Save Failed`, subtitle: `Validation failed for lease request ${leaseId} , the following properties are invalid`, type: PopoverType.ErrorPopup, modalSize: 'medium', message: `revisionType:Revision Type cannot be set to 'Revision' because there are ${calledOffObject?.length} called off objects attached to this request`, }; } selectedPopoverValue(value?: { event: { row: any } }): void { console.log(value); // TODO: We need to set popover values this.notificationMessage = ''; this.errorMessage = ''; this.popoversComponent.closeModal(); if (this.isTypeOfApprovalAnalysis && value) { this.ultimateCompanyConfig = value; } } searchCompanyName(event: any) { this.popoverConfig = event; this.popoversComponent.openModal(); } showErrorMessage(event?: any) { event ? this.openSaveErrorPopover(event) : this.openSaveErrorPopover(); } // Print Approval Letter. printAutoCreditDecision() { this.printIconOnPopOver = false; window.addEventListener('beforeprint', () => { document.title = 'autocredit_Print Option_' + this.leaseDetailsPayload?.id; }); window.addEventListener('afterprint', () => { document.title = 'UpfrontUi'; }); window.print(); this.printIconOnPopOver = true; } autoCreditUploadFile(event: any) { const file = event.target?.files[0]; const rawData = { file: file, leaseId: this.leaseDetailsPayload?.id, contentTypeName: 'Approval Letter', clientRelationNumber: this.leaseDetailsPayload?.businessPartner?.clientRelationNumber, }; this.loaderService.show(); this.leaseService.autoCreditUploadFile(rawData).subscribe({ next: () => { this.loaderService.hide(); }, error: () => { this.loaderService.hide(); }, complete: () => { this.loaderService.hide(); }, }); } printPdf() { window.print(); } contactPerson$: ContactPerson; setContactPerson(cm) { const relationNumber = cm | 0; this.contactService .contactPerson(relationNumber.toString()) .subscribe(res => { this.contactPerson$ = res; }); } private handleError(error: HttpErrorResponse) { return throwError(() => new Error('An error occurred:' + error)); } showApprovalLetters(event: any) { this.popoverConfig = { type: PopoverType.ApprovalLetters, title: 'Approval Letters', modalSize: 'large', }; this.popoversComponent.openModal(); } }
Editor is loading...
Leave a Comment