Untitled
unknown
plain_text
a year ago
78 kB
17
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