Untitled

 avatar
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