{"version":3,"file":"default-src_modules_manage-booking_services_index_ts.81eeea4cf927d17a.js","mappings":"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","names":["MmbOrderModule","static","this","__ngFactoryType__","_angular_core__WEBPACK_IMPORTED_MODULE_3__","$C","G2t","MmbOrderService","imports","OrderApiModule","RedirectServiceModule","setLoading","createAction","props","setError","clearError","setStage","clearStatusState","all","union","setSeatForFlight","SeatMapActions","clearCategoryUpdating","OrderActions","resetCategoriesUpdating","setSelectionsForFragment","ServicesActions","departureIsAfterJuneFirst2023","nextBound","TzDate","departure","dateTime","isAfter","isDisruptedBound","bound","disruptedBound","isBoundWithCheckInOpenAndNotAllAreCheckedIn","order","boundHasCheckInOpen","checkinEligibilities","some","eligibility","id","isAllowedToUse","eligibilities","checkIn","boundHasAllCustomersCheckedIn","boundEligibility","find","version","FinnairCheckInVersion","NEXTGEN","Object","values","flightTravelerEligibility","every","travelerEligibilities","isCheckedIn","isBoundHavingCheckInEligibility","reason","filterFlightsFromItinerary","itinerary","filter","isFlight","filterFlightsFromAllBounds","booking","bounds","flatMap","getItinerariesWithMixedCabinClasses","cabinClass","FinnairCabinClass","BUSINESS","flight","travelRequirementsRequired","isApisRequired","isPresent","travelRequirement","apisObject","key","obj","$","_remove","newObj","item","required","status","FinnairCompletionStatus","INCOMPLETE","numbersWithOptionCode","number","codes","phoneNumber","code","phonePrefix","countryPrefix","countryCode","undefined","getTrackingDescription","changeableBoundIds","selectedBoundsId","length","BoundSelectionType","ALL","SOME","indexOf","OUTBOUND","INBOUND","core","RedirectService","_selectStatusState","createSelector","selectManageBookingState","state","_getLoading","loading","_getError","error","_getStage","stage","_isServicesDirty","servicesDirty","getLoading","select","getError","getStage","isServicesDirty","ChangeActions","createActionGroup","source","events","group","keys","reduce","actions","checkInOrMmb","_route","paths","url","split","urlWithoutQueryString","RootPaths","CHECK_IN_ROOT","language","queryParams","urlQueryString","search","inject","Location","replaceState","Router","navigateByUrl","MANAGE_BOOKING_ROOT","MANAGE_BOOKING_STEPS","CHECK_IN","path","skipLocationChange","MmbStage","CHECK_IN_FLOW","LOGIN","VIEW","PASSENGERS","TRAVEL_PREPARATION","REVIEW","CHECKOUT","CONFIRMATION","CAR_RENTAL","MmbError","BOOKING_NOT_FOUND","BOOKING_CANCELLED","GROUP_BOOKING","GROUP_BOOKING_NOT_FOUND","GROUP_BOOKING_LOGGING_WITH_INFANT","GROUP_BOOKING_NOT_TICKETED","SEVERAL_RECORDS_FOR_TRAVEL_DOCUMENT","UNEXPECTED_ERROR","BoundStatus","REBOOKED","CANCELLED","ORIGINAL","NEW","DEFAULT","NONE","CheckInStep","APIS","SEATMAP","KYT","RULES","constructor","formPostService","redirectToCheckIn","openAsBlank","eligiblity","Error","post","redirect","params","param","name","value","method","i0","i1","_angular_core__WEBPACK_IMPORTED_MODULE_1__","jDH","factory","ɵfac","changeIneligibilityTranslations","Map","FinnairChangeIneligibilityReason","AMADEUS_REASON","AMADEUS_TICKET_PROBLEM","AMADEUS_UNISSUED_SERVICE_PRESENT","AMADEUS_COMPLEX_ITINERARY_NOT_ALLOWED","AMADEUS_FLIGHT_GENERAL_STATUS","AMADEUS_DISCREPANCY_IN_ORDER","AMADEUS_OFFER_CONDITION_RULE","AMADEUS_FLIGHT_DISRUPTED","FLIGHT_DISRUPTED_BY_TIME_CHANGE","FLIGHT_DISRUPTED_BY_CANCEL","AWARD_BOOKING","TOUROPERATOR_TICKETS","BOUND_ALREADY_CHECKED_IN","BOUND_ALREADY_FLOWN_OR_USED","ID_TICKETS","NOT_ELIGIBLE_SSR","AMADEUS_GROUPS_NOT_SUPPORTED","PETC_FROM_TO_AGP","NotificationsService","store$","languageService","gtmService","activatedRoute","configService","getNotification","translationKey","show","theme","NotificationTheme","INFO","layout","NotificationLayout","BLOCK","getNotificationsForBound","boundStatus","router","callbackFnIfPassengerDoesNotHaveEmail","shouldShowCheckInNotificationWhenOpen","isBoundHavingCheckinIneligibility","FinnairCheckInEligibilityReason","combineLatest","pipe","orderData","lang","first","map","locations","passengers","origin","getCityName","locationCode","destination","arrival","itinerariesWithMixedCabinClasses","waitlistedItineraries","FinnairItineraryItemFlightStatus","WAITLISTED","isBookingHasDisruption","bookingHasDisruption","isFirstBound","findIndex","b","isShowApisRequiredBound","isBoundAPISRequired","iconName","SvgLibraryIcon","WARNING","replace","getLocationData","ALERT_BLOCK","ALERT","isBoundFlown","cfg","enableSelfReaccFlow","linkTarget","DISRUPTION_ROOT","clickFn","event","stopPropagation","email","dispatch","setSelectedBoundId","selectedBoundId","AIRCRAFT_TILTED","TRAVEL_DOCUMENTS","hasInnerHTML","isUpgradeFlow","TIME_ZONE","n","getNotificationsForTrip","fromCheckin","snapshot","queryParamMap","get","isAllowedToUseCheckIn","LEGACY","trackElement","OPEN_TRAVEL_PREPARATIONS_NOTIFICATION","GaContext","MANAGE_BOOKING","ElementTypes","LINK","ElementActions","CLICK","getTopNotificationsForTrip","of","getModificationNotAllowedNotificationsForTrip","change","Boolean","Set","getChangeNotAllowedReasonsByBound","has","startWith","i2","i3","i4","i5","_angular_core__WEBPACK_IMPORTED_MODULE_20__","ORDER_STATUS_CODES_FOR_RETRY","STATUS_CODES_FOR_RETRY","NUMBER_OF_RETRIES","LOCATION_HEADER","logErrorToSentry","err","errorKey","isTourOperator","sentryLogger","mapErrorForSentry","windowRef","http","orderService","emergencyContactService","apisService","checkInService","subscriptions","Subscription","CATCH_ERROR","catchError","getDapiErrorKey","startsWith","throwError","locationFromResponse","response","headers","ngOnDestroy","unsubscribe","loadOrder","familyName","bookingRef","requestInitiator","firstName","getOrderByPnrAndLastName$Response","orderUrl","body","toUpperCase","lastName","locale","localeValue","retryGet$","switchMap","orderLocation","getOrderByUrl","loadOrderTourOperator","tourOperatorCode","getOrderByTourOperatorAndLastName$Response","RequestInitiator","MMB","completeCheckIn","orderId","hash","fetchOrderAfterRequest","acceptCheckIn$Response","reassignExitRowSeats","reassignExitSeats$Response","postAd","sendBoardingPass","cancelCheckIn","cancelCheckIn$Response","setServices","serviceRequests","setServices$Response","updateEmergencyContactDetails","serviceRequest","updateEmergencyContactDetails$Response","updateApis","updateAdvancePassengerInformation$Response","updateRegulatoryDetails","updateApis$Response","updateContactDetails","updatePassengerDetails$Response","initializeCheckIn","request","add","subscribe","request$","res","retryWithBackoff","DEFAULT_RETRY_BACKOFF_TIME","location","getOrderByIdAndHash","fetchOrder$Response","includeServiceCatalog","isNull","HttpParams","set","o$","retry","count","delay","HttpStatusCode","PreconditionRequired","fromEvent","nativeWindow","document","take","_angular_core__WEBPACK_IMPORTED_MODULE_18__","OffersService","offersChangesService","findAirCalendarChange","findAirCalendarChange$Response","offersUrl","share","r","fesm2022_core","createFeatureSelector","MANAGE_BOOKING_FEATURE_KEY","CheckInActions","checkInUnion","REMOVE_TIMEZONE","ManageBookingService","mmbOrderService","dataCloudService","commonBookingAncillaryService","seatMapSubscriptions","forEach","subs","loadOrderSubscription","loadOrderSimpleSubscription","setServicesSubscription","trackEligibleForDisruptionRebooking","disruptionRebooking","BUTTON","otherInformation","analyticsToken","trackEligibleForAcknowledge","acknowledge","trackInvoluntaryCancelEligibility","involuntaryCancel","CustomServiceType","JOURNEY","trackVoluntaryCancelEligibility","voluntaryCancel","retrieveOrderFromForm","PNR","trackRetrieval","resetStage","cancelStream$","NEVER","CartActions","StateActions","trimmedFirstName","trim","loadOrder$","recLoc","loadOrderSubscriber$","finShare","takeUntil","next","data","isGroupBooking","trackFrequentFlyers","trackAPIS","trackDataCloud","updateStore","getOrderWithIdAndHash","DapiErrorCode","ORDER_GROUP_FETCH_WITH_INFANT","ORDER_CANCELLED","ORDER_GROUP_ERROR","GROUP_ORDER_NOT_TICKETED","ORDER_NOT_FOUND","UNABLE_TO_DISPLAY_ORDER","ORDER_UNEXPECTED_ERROR","ORDER_TIMEOUT_ERROR","category","observe","complete","noop","order$","orderPartIds","tap","nextOrder","resolveUpdateRequest","reassignExitRowSeatsRequest","updateRequest$","errorMsg","keepSeatsData","stream$","setServiceCatalog","triggerFetchSeatMap","orderHash","currencyCode","forceFetch","flightId","seatMapForFlightStatus","SeatMapStatus","OK_NO_AVAILABILITY","PENDING","includes","OK","departureDateTime","getOrderSeatMapForFlight","seatMap","seatMapForFlight","getThirdPartyDeepLinks","arriving","leaving","thirdPartyAncillaries","thirdParty","getThirdPartyLink","dropOff","calculateDropOff","partner","ThirdPartyAncillariesProvider","CAR_TRAWLER_RENTAL","CAR_TRAWLER_TRANSFER","paxCount","currency","supportedCarTrawlerCurrencies","prices","included","total","totalAmount","getCarTrawlerLang","langValue","isOneWay","arrivalFlightNumber","at","flightNumber","newPickup","getCarTrawlerDateTime","newDropoff","buildCarTrawlerDeepLinkInfo","clientId","addHours","defaultStay","toISOString","pickup","dropoff","transfer","context","cmsKey","toString","partnerIcon","responseType","bookingType","FORM","SUBMIT","maxCardsForPax","Math","max","pax","frequentFlyerCards","passenger","mmbPaxDetails","emailAddress","phoneNumbers","memberProgram","companyCode","memberNumber","cardNumber","i6","i7","_angular_core__WEBPACK_IMPORTED_MODULE_25__"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/modules/manage-booking-common/mmb-order.module.ts","./src/modules/manage-booking/store/actions/state.actions.ts","./src/modules/manage-booking/utils/booking.utils.ts","./src/modules/common-booking/modules/redirect-service/redirect-service.module.ts","./src/modules/manage-booking/store/selectors/state.selector.ts","./src/modules/manage-booking/store/actions/change.actions.ts","./src/modules/manage-booking/services/check-in-or-mmb.guard.ts","./src/modules/manage-booking/enums.ts","./src/modules/common-booking/modules/redirect-service/services/redirect.service.ts","./src/modules/manage-booking/services/notifications.service.ts","./src/modules/manage-booking-common/services/mmb-order.service.ts","./src/modules/manage-booking/services/offers.service.ts","./src/modules/manage-booking/store/selectors/feature.selector.ts","./src/modules/manage-booking/store/actions/check-in.actions.ts","./src/modules/manage-booking/services/manage-booking.service.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\n\nimport { RedirectServiceModule } from '@fcom/common-booking/modules/redirect-service';\nimport { OrderApiModule } from '@fcom/dapi/api/order-api.module';\n\nimport { MmbOrderService } from './services';\n\n@NgModule({\n imports: [OrderApiModule, RedirectServiceModule],\n exports: [],\n declarations: [],\n providers: [MmbOrderService],\n})\nexport class MmbOrderModule {}\n","import { RouterNavigatedAction } from '@ngrx/router-store';\nimport { createAction, union, props } from '@ngrx/store';\n\nimport { SeatMapActions, ServicesActions, OrderActions } from '@fcom/common-booking/store';\n\nimport { MmbError, MmbStage } from '../../enums';\n\nexport const setLoading = createAction('[MMB State] setLoading', props<{ loading: boolean }>());\nexport const setError = createAction('[MMB State] setError', props<{ error: MmbError }>());\nexport const clearError = createAction('[MMB State] clearError');\nexport const setStage = createAction('[MMB State] setStage', props<{ stage: MmbStage; fromCheckIn?: boolean }>());\nexport const clearStatusState = createAction('[MMB Booking] clearStatusState');\n\nconst all = union({\n setLoading,\n setError,\n clearError,\n setStage,\n clearStatusState,\n setSeatForFlight: SeatMapActions.setSeatForFlight,\n clearCategoryUpdating: OrderActions.clearCategoryUpdating,\n resetCategoriesUpdating: OrderActions.resetCategoriesUpdating,\n setSelectionsForFragment: ServicesActions.setSelectionsForFragment,\n});\n\nexport type StateActionsUnion = typeof all | RouterNavigatedAction;\n","import { isPresent, TzDate } from '@fcom/core/utils';\nimport {\n FinnairBoundItem,\n FinnairCabinClass,\n FinnairCheckInEligibility,\n FinnairCheckInEligibilityReason,\n FinnairCheckInVersion,\n FinnairCompletionStatus,\n FinnairItineraryItem,\n FinnairItineraryItemFlight,\n FinnairOrder,\n FinnairPhoneNumberItem,\n FinnairTravelRequirementsEligibility,\n} from '@fcom/dapi/api/models';\nimport { IdAndHash } from '@fcom/dapi';\nimport { CountryCode } from '@fcom/core';\nimport { isFlight } from '@fcom/common-booking/utils/common-booking.utils';\n\nimport { BoundSelectionType } from '../enums';\n\nexport const departureIsAfterJuneFirst2023 = (nextBound: FinnairBoundItem): boolean =>\n new TzDate(nextBound.departure.dateTime).isAfter(new TzDate('2023-06-01T00:00:00+03:00'));\n\nexport const bookingIncludesBags = (bounds: FinnairBoundItem[]): boolean => {\n return (bounds || []).reduce((acc, cur) => acc + cur.freeBaggageAllowance.total, 0) > 0;\n};\n\n/**\n * Determine if there has been a disruption in bound\n * @param bound Information about the bound\n */\nexport const isDisruptedBound = (bound: FinnairBoundItem): boolean => {\n return !!bound.disruptedBound && !!bound.disruptedBound.disruptedBound;\n};\n\n/**\n * Determine if check in is already open for the bound\n * @param bound Information about the bound\n */\nexport const boundHasCheckInOpen = (\n bound: FinnairBoundItem,\n checkinEligibilities: FinnairCheckInEligibility[]\n): boolean => {\n return checkinEligibilities.some((eligibility) => eligibility.id === bound.id && eligibility.isAllowedToUse);\n};\n\nconst boundHasAllCustomersCheckedIn = (\n bound: FinnairBoundItem,\n checkinEligibilities: FinnairCheckInEligibility[]\n): boolean => {\n const boundEligibility = checkinEligibilities.find(({ id }) => id === bound.id);\n return (\n boundEligibility?.isAllowedToUse &&\n boundEligibility?.version === FinnairCheckInVersion.NEXTGEN &&\n Object.values(boundEligibility?.flightTravelerEligibility ?? {}).every((travelerEligibilities) =>\n travelerEligibilities.every((eligibility) => eligibility.isCheckedIn && eligibility.isAllowedToUse)\n )\n );\n};\n\n/**\n * Returns true if the given bound is open for checkin and all are not checked in\n * @param order Information about the whole booking\n * @param bound Bound to handle\n */\nexport const isBoundWithCheckInOpenAndNotAllAreCheckedIn = (order: FinnairOrder, bound: FinnairBoundItem): boolean => {\n return (\n boundHasCheckInOpen(bound, order.eligibilities.checkIn) &&\n !boundHasAllCustomersCheckedIn(bound, order.eligibilities.checkIn)\n );\n};\n\n/**\n * Return first bound that has not checkin open with given reason\n * @param order Information about the whole booking\n * @param bound Bound information\n * @param reason Eligibility reason we want to get\n */\nexport const isBoundHavingCheckInEligibility = (\n order: FinnairOrder,\n bound: FinnairBoundItem,\n reason: FinnairCheckInEligibilityReason\n): boolean => {\n return !!order.eligibilities.checkIn.find(\n (eligibility) => eligibility.id === bound.id && !eligibility.isAllowedToUse && eligibility.reason === reason\n );\n};\n\nexport const hasChangeEligibleBounds = (booking: FinnairOrder): boolean => {\n return booking.eligibilities?.change?.some((eligibility) => eligibility.isAllowedToUse);\n};\n\n/**\n * Removes layovers from itinerary array\n * @param itinerary array of all itineraries\n */\nexport const filterFlightsFromItinerary = (itinerary: FinnairItineraryItem[]): FinnairItineraryItemFlight[] =>\n itinerary.filter(isFlight);\n\nexport const filterFlightsFromAllBounds = (booking?: FinnairOrder): FinnairItineraryItemFlight[] =>\n booking?.bounds?.flatMap((bound) => bound.itinerary.filter(isFlight)) ?? [];\n\n/**\n * Return itineraries where is a different cabin class than the bound has.\n * For example there might be a bound from OUL to BKK where OUL - HEL does not have business class available\n * @param bound Information of a single bound in a booking\n */\nexport const getItinerariesWithMixedCabinClasses = (bound: FinnairBoundItem): FinnairItineraryItemFlight[] => {\n if (bound.cabinClass !== FinnairCabinClass.BUSINESS) {\n return [];\n }\n return bound.itinerary.filter(isFlight).filter((flight) => flight.cabinClass !== FinnairCabinClass.BUSINESS);\n};\n\nexport const travelRequirementsRequired = (order: FinnairOrder, isApisRequired = false): boolean => {\n const apisObject = (key, obj) => {\n const { [key]: _remove, ...newObj } = obj;\n return newObj;\n };\n\n if (!isPresent(order.eligibilities.travelRequirement)) {\n return false;\n }\n\n return Object.values(\n isApisRequired\n ? apisObject('emergencyContactDetails', order.eligibilities.travelRequirement)\n : order.eligibilities.travelRequirement\n ).some(\n (item: FinnairTravelRequirementsEligibility) => item.required && item.status === FinnairCompletionStatus.INCOMPLETE\n );\n};\n\n/**\n * Extract Id and Hash from FinnairOrder\n * @param order\n */\nexport const getIdAndHash = (order: FinnairOrder): IdAndHash => {\n return {\n id: order.id,\n hash: order.hash,\n };\n};\n\nexport const numbersWithOptionCode = (number: FinnairPhoneNumberItem, codes: CountryCode[]): string | undefined => {\n const phoneNumber: CountryCode | undefined = codes.find(\n (code) => code.phonePrefix === number.countryPrefix || code.countryCode === number.countryCode\n );\n return phoneNumber ? `${phoneNumber.countryCode}|${phoneNumber.phonePrefix}` : undefined;\n};\n\nexport const getTrackingDescription = (changeableBoundIds: string[], selectedBoundsId: string[]): string => {\n if (selectedBoundsId.length === changeableBoundIds.length) {\n return BoundSelectionType.ALL;\n }\n if (selectedBoundsId.length > 1) {\n return BoundSelectionType.SOME;\n }\n return changeableBoundIds.indexOf(selectedBoundsId[0]) === 0\n ? BoundSelectionType.OUTBOUND\n : BoundSelectionType.INBOUND;\n};\n","import { NgModule } from '@angular/core';\n\nimport { RedirectService } from './services';\n\n@NgModule({\n imports: [],\n exports: [],\n declarations: [],\n providers: [RedirectService],\n})\nexport class RedirectServiceModule {}\n","import { createSelector, select } from '@ngrx/store';\n\nimport { StateSelector } from '@fcom/core/selectors/selector-utils';\n\nimport { ManageBookingFeatureState, ManageBookingState, StatusState } from '../../interfaces/store.interface';\nimport { MmbError, MmbStage } from '../../enums';\nimport { selectManageBookingState } from './feature.selector';\n\nconst _selectStatusState = createSelector(selectManageBookingState, (state: ManageBookingState) => state.state);\n\nconst _getLoading = createSelector(_selectStatusState, (state: StatusState) => state.loading);\nconst _getError = createSelector(_selectStatusState, (state: StatusState) => state.error);\nconst _getStage = createSelector(_selectStatusState, (state: StatusState) => state.stage);\nconst _isServicesDirty = createSelector(_selectStatusState, (state: StatusState) => state.servicesDirty);\n\nexport const getLoading = (): StateSelector => select(_getLoading);\nexport const getError = (): StateSelector => select(_getError);\nexport const getStage = (): StateSelector => select(_getStage);\nexport const isServicesDirty = (): StateSelector => select(_isServicesDirty);\n","import { createActionGroup, props, union } from '@ngrx/store';\n\nimport { FinnairBoundItem } from '@fcom/dapi/api/models/finnair-bound-item';\nimport { FinnairAirCalendarChangeListResponse } from '@fcom/dapi/api/models';\n\nexport const ChangeActions = createActionGroup({\n source: 'ChangeActions',\n events: {\n 'Toggle Outbound': props<{ bound: FinnairBoundItem }>(),\n 'Toggle Inbound': props<{ bound: FinnairBoundItem }>(),\n 'Set Outbound': props<{ bound: FinnairBoundItem }>(),\n 'Set Inbound': props<{ bound: FinnairBoundItem }>(),\n 'Set Dates': props<{ dates: string[] }>(),\n 'Set Change List': props<{ list: FinnairAirCalendarChangeListResponse }>(),\n },\n});\n\nconst group = union(Object.keys(ChangeActions).reduce((actions, key) => (actions[key] = ChangeActions[key]), {}));\n\nexport type SelectActionsUnion = typeof group;\n","import { ActivatedRouteSnapshot, CanActivateFn, Router, RouterStateSnapshot } from '@angular/router';\nimport { inject } from '@angular/core';\nimport { Location } from '@angular/common';\n\nimport { RootPaths } from '@fcom/core';\nimport { urlQueryString, urlWithoutQueryString } from '@fcom/core/utils/app-url-utils';\nimport { MANAGE_BOOKING_STEPS } from '@fcom/common-booking/manage-booking-config';\n\n/**\n * In order to resolve two different component under the same path, we use a can activate function with a internal navigation to render option 1 or 2\n */\nexport const checkInOrMmb: CanActivateFn = (_route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n const paths = state.url.split('/');\n if (paths[2] && urlWithoutQueryString(paths[2]) === RootPaths.CHECK_IN_ROOT) {\n const language = paths[1];\n const queryParams = urlQueryString(state.url);\n const search = queryParams ? `?${queryParams}` : '';\n inject(Location).replaceState(`/${language}/${RootPaths.CHECK_IN_ROOT}${search}`);\n inject(Router).navigateByUrl(\n `/${language}/${RootPaths.MANAGE_BOOKING_ROOT}/${MANAGE_BOOKING_STEPS.CHECK_IN.path}${search}`,\n { skipLocationChange: true }\n );\n return true;\n }\n return true;\n};\n","export enum MmbStage {\n CHECK_IN = 'check-in',\n CHECK_IN_FLOW = 'check-in-flow',\n LOGIN = 'login',\n VIEW = 'view',\n PASSENGERS = 'passengers',\n TRAVEL_PREPARATION = 'travelPreparations',\n REVIEW = 'review',\n CHECKOUT = 'checkout',\n CONFIRMATION = 'confirmation',\n CAR_RENTAL = 'carRental',\n}\n\nexport enum MmbError {\n BOOKING_NOT_FOUND = 'bookingNotFound',\n BOOKING_CANCELLED = 'bookingCancelled',\n GROUP_BOOKING = 'groupBooking',\n GROUP_BOOKING_NOT_FOUND = 'groupBookingNotFound',\n GROUP_BOOKING_LOGGING_WITH_INFANT = 'groupBookingLoggingWithInfant',\n GROUP_BOOKING_NOT_TICKETED = 'groupBookingNotTicketed',\n SEVERAL_RECORDS_FOR_TRAVEL_DOCUMENT = 'severalRecordsForTravelDocument',\n UNEXPECTED_ERROR = 'unexpectedError',\n}\n\nexport enum BoundStatus {\n REBOOKED = 'rebooked',\n CANCELLED = 'cancelled',\n ORIGINAL = 'original',\n NEW = 'new',\n DEFAULT = 'default',\n}\n\nexport enum BoundSelectionType {\n ALL = 'all-bounds',\n SOME = 'some-bounds',\n INBOUND = 'inbound',\n OUTBOUND = 'outbound',\n NONE = 'no-bounds',\n}\n\nexport enum CheckInStep {\n PASSENGERS = 'passengers',\n APIS = 'apis',\n SEATMAP = 'seatmap',\n KYT = 'know-your-trip',\n RULES = 'rules',\n CONFIRMATION = 'confirmation',\n}\n","import { Injectable } from '@angular/core';\n\nimport { FormPostService } from '@fcom/core';\nimport { FinnairBoundItem, FinnairDisruptedBoundItem, FinnairOrder } from '@fcom/dapi/api/models';\n\n@Injectable()\nexport class RedirectService {\n constructor(private formPostService: FormPostService) {}\n\n redirectToCheckIn(\n order: FinnairOrder,\n bound?: FinnairBoundItem | FinnairDisruptedBoundItem,\n openAsBlank = false\n ): void {\n const eligiblity = order.eligibilities.checkIn.find(\n (eligibility) => (bound && eligibility.id === bound.id) || (!bound && eligibility.isAllowedToUse)\n );\n if (!eligiblity) {\n throw new Error('Unable to find check-in redirection form from backend');\n }\n\n this.formPostService.post(\n eligiblity.redirect.url,\n eligiblity.redirect.params.reduce((params, param) => {\n params[param.name] = param.value;\n return params;\n }, {}),\n eligiblity.redirect.method,\n openAsBlank ? '_blank' : '_self'\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { SvgLibraryIcon } from '@finnairoyj/fcom-ui-styles/enums';\nimport { Store } from '@ngrx/store';\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { first, map, startWith } from 'rxjs/operators';\n\nimport { ElementActions, ElementTypes, GaContext } from '@fcom/common';\nimport { orderData } from '@fcom/common-booking';\nimport { setSelectedBoundId } from '@fcom/common-booking/store/actions/disruption.actions';\nimport {\n bookingHasDisruption,\n isBoundAPISRequired,\n isBoundFlown,\n isFlight,\n} from '@fcom/common-booking/utils/common-booking.utils';\nimport { GtmService } from '@fcom/common/gtm';\nimport { AppState, ConfigService, RootPaths } from '@fcom/core';\nimport {\n FinnairBoundItem,\n FinnairChangeIneligibilityReason,\n FinnairCheckInEligibilityReason,\n FinnairCheckInVersion,\n FinnairItineraryItemFlightStatus,\n FinnairOrder,\n} from '@fcom/dapi/api/models';\nimport { getCityName } from '@fcom/common/utils/booking.utils';\nimport { NotificationLayout, NotificationTheme } from '@fcom/ui-components';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { stopPropagation } from '@fcom/core/utils';\n\nimport { OPEN_TRAVEL_PREPARATIONS_NOTIFICATION } from '../constants';\nimport { BoundStatus } from '../enums';\nimport { NotificationInfo, Notifications } from '../interfaces';\nimport {\n getItinerariesWithMixedCabinClasses,\n isBoundHavingCheckInEligibility,\n isBoundWithCheckInOpenAndNotAllAreCheckedIn,\n isDisruptedBound,\n travelRequirementsRequired,\n} from '../utils';\n\nconst changeIneligibilityTranslations: Map = new Map([\n [FinnairChangeIneligibilityReason.AMADEUS_REASON, 'changeNotAllowed.amadeusReason'],\n [FinnairChangeIneligibilityReason.AMADEUS_TICKET_PROBLEM, 'changeNotAllowed.amadeusTicketProblem'],\n [FinnairChangeIneligibilityReason.AMADEUS_UNISSUED_SERVICE_PRESENT, 'changeNotAllowed.amadeusUnissuedServicePresent'],\n [\n FinnairChangeIneligibilityReason.AMADEUS_COMPLEX_ITINERARY_NOT_ALLOWED,\n 'changeNotAllowed.amadeusComplexItineraryNotAllowed',\n ],\n [FinnairChangeIneligibilityReason.AMADEUS_FLIGHT_GENERAL_STATUS, 'changeNotAllowed.amadeusFlightGeneralStatus'],\n [FinnairChangeIneligibilityReason.AMADEUS_DISCREPANCY_IN_ORDER, 'changeNotAllowed.amadeusDiscrepancyInOrder'],\n [FinnairChangeIneligibilityReason.AMADEUS_OFFER_CONDITION_RULE, 'changeNotAllowed.amadeusOfferConditionRule'],\n [FinnairChangeIneligibilityReason.AMADEUS_FLIGHT_DISRUPTED, 'changeNotAllowed.amadeusFlightDisrupted'],\n [FinnairChangeIneligibilityReason.FLIGHT_DISRUPTED_BY_TIME_CHANGE, 'changeNotAllowed.amadeusFlightTimeChanged'],\n [FinnairChangeIneligibilityReason.FLIGHT_DISRUPTED_BY_CANCEL, 'changeNotAllowed.amadeusFlightCancelled'],\n [FinnairChangeIneligibilityReason.AWARD_BOOKING, 'changeNotAllowed.awardBooking'],\n [FinnairChangeIneligibilityReason.TOUROPERATOR_TICKETS, 'changeNotAllowed.tourOperatorBooking'],\n [FinnairChangeIneligibilityReason.BOUND_ALREADY_CHECKED_IN, 'changeNotAllowed.boundAlreadyCheckedIn'],\n [FinnairChangeIneligibilityReason.BOUND_ALREADY_FLOWN_OR_USED, 'changeNotAllowed.boundAlreadyFlownOrUsed'],\n [FinnairChangeIneligibilityReason.ID_TICKETS, 'changeNotAllowed.idTickets'],\n [FinnairChangeIneligibilityReason.NOT_ELIGIBLE_SSR, 'changeNotAllowed.notEligibleSSR'],\n [FinnairChangeIneligibilityReason.AMADEUS_GROUPS_NOT_SUPPORTED, 'changeNotAllowed.amadeusGroupNotSupported'],\n [FinnairChangeIneligibilityReason.PETC_FROM_TO_AGP, 'changeNotAllowed.petcFromToAGP'],\n]);\n\n@Injectable()\nexport class NotificationsService {\n constructor(\n private store$: Store,\n private languageService: LanguageService,\n private gtmService: GtmService,\n private activatedRoute: ActivatedRoute,\n private configService: ConfigService\n ) {}\n getNotificationsForBound(\n order: FinnairOrder,\n bound: FinnairBoundItem,\n boundStatus: BoundStatus,\n router: Router,\n callbackFnIfPassengerDoesNotHaveEmail?: () => void\n ): Observable {\n const shouldShowCheckInNotificationWhenOpen: boolean = isBoundWithCheckInOpenAndNotAllAreCheckedIn(order, bound);\n const isBoundHavingCheckinIneligibility = isBoundHavingCheckInEligibility(\n order,\n bound,\n FinnairCheckInEligibilityReason.NOT_ELIGIBLE_SSR\n );\n\n return combineLatest([this.store$.pipe(orderData()), this.languageService.lang]).pipe(\n first(),\n map(([order, lang]) => {\n const locations = order?.locations;\n const passengers = order?.passengers;\n const origin = getCityName(bound.departure.locationCode, locations);\n const destination = getCityName(bound.arrival.locationCode, locations);\n const itinerariesWithMixedCabinClasses = getItinerariesWithMixedCabinClasses(bound);\n const waitlistedItineraries = bound.itinerary\n .filter(isFlight)\n .filter((itinerary) => itinerary.status === FinnairItineraryItemFlightStatus.WAITLISTED);\n const isBookingHasDisruption = bookingHasDisruption(order);\n const isFirstBound = order.bounds.findIndex((b) => b.id === bound.id) === 0;\n const isShowApisRequiredBound =\n !shouldShowCheckInNotificationWhenOpen &&\n isBoundAPISRequired(order, bound) &&\n !isBookingHasDisruption &&\n !isFirstBound;\n return [\n {\n iconName: SvgLibraryIcon.CHECK_IN,\n translationKey: 'checkInAtAirport',\n show: !!isBoundHavingCheckinIneligibility,\n theme: NotificationTheme.WARNING,\n replace: isBoundHavingCheckinIneligibility && this.getLocationData(bound, locations),\n },\n {\n iconName: SvgLibraryIcon.CHECK_IN,\n translationKey: 'checkInOpen',\n show: shouldShowCheckInNotificationWhenOpen,\n theme: NotificationTheme.INFO,\n replace: shouldShowCheckInNotificationWhenOpen && this.getLocationData(bound, locations),\n },\n {\n iconName: SvgLibraryIcon.ALERT_BLOCK,\n translationKey: 'boundDisrupted',\n theme: NotificationTheme.ALERT,\n show: isDisruptedBound(bound) && !isBoundFlown(bound) && !this.configService.cfg.enableSelfReaccFlow,\n linkTarget: `/${lang}/${RootPaths.DISRUPTION_ROOT}`,\n clickFn: (event) => {\n stopPropagation(event);\n if (!passengers[0]?.email && callbackFnIfPassengerDoesNotHaveEmail) {\n callbackFnIfPassengerDoesNotHaveEmail();\n } else {\n this.store$.dispatch(setSelectedBoundId({ selectedBoundId: bound.id }));\n router.navigateByUrl(`/${lang}/${RootPaths.DISRUPTION_ROOT}`);\n }\n },\n },\n {\n translationKey: 'originalFlight',\n show: boundStatus === BoundStatus.ORIGINAL,\n theme: NotificationTheme.ALERT,\n replace: { origin, destination },\n },\n {\n translationKey: 'newFlight',\n show: boundStatus === BoundStatus.NEW,\n theme: NotificationTheme.ALERT,\n replace: { origin, destination },\n },\n {\n iconName: SvgLibraryIcon.AIRCRAFT_TILTED,\n translationKey: 'flownFlight',\n show: isBoundFlown(bound),\n theme: NotificationTheme.INFO,\n },\n {\n iconName: SvgLibraryIcon.TRAVEL_DOCUMENTS,\n translationKey: 'upcomingBoundAPIS',\n show: isShowApisRequiredBound,\n theme: NotificationTheme.INFO,\n hasInnerHTML: true,\n },\n ...waitlistedItineraries.map((itinerary) => ({\n translationKey: itinerary.isUpgradeFlow ? 'waitlistedFlight' : 'waitlistedFlightNoUpgrade',\n show: true,\n theme: NotificationTheme.INFO,\n iconName: SvgLibraryIcon.TIME_ZONE,\n replace: {\n origin: getCityName(itinerary.departure.locationCode, locations),\n destination: getCityName(itinerary.arrival.locationCode, locations),\n },\n })),\n ...itinerariesWithMixedCabinClasses.map((itinerary) => ({\n translationKey: 'mixedCabinClass',\n show: true,\n theme: NotificationTheme.INFO,\n replace: {\n origin: getCityName(itinerary.departure.locationCode, locations),\n destination: getCityName(itinerary.arrival.locationCode, locations),\n },\n })),\n ].filter((n) => n.show);\n })\n );\n }\n\n /**\n * Returns notifications for trip card (to be shown on top of the image)\n *\n */\n getNotificationsForTrip(\n router: Router,\n callbackFnIfPassengerDoesNotHaveEmail?: () => void\n ): Observable {\n return combineLatest([this.store$.pipe(orderData()), this.languageService.lang]).pipe(\n first(),\n map(([order, language]) => {\n const fromCheckin = this.activatedRoute.snapshot.queryParamMap.get('fromCheckIn');\n const passengers = order?.passengers;\n const isApisRequired = travelRequirementsRequired(order) && !bookingHasDisruption(order);\n return [\n {\n iconName: SvgLibraryIcon.ALERT_BLOCK,\n translationKey: 'boundDisrupted',\n theme: NotificationTheme.ALERT,\n show:\n this.configService.cfg.enableSelfReaccFlow &&\n order.bounds.some(\n (bound) => isDisruptedBound(bound) && !isBoundFlown(bound.disruptedBound.disruptedBound)\n ),\n linkTarget: `/${language}/${RootPaths.DISRUPTION_ROOT}`,\n clickFn: (event) => {\n stopPropagation(event);\n if (!passengers[0]?.email && callbackFnIfPassengerDoesNotHaveEmail) {\n callbackFnIfPassengerDoesNotHaveEmail();\n } else {\n router.navigateByUrl(`/${language}/${RootPaths.DISRUPTION_ROOT}`);\n }\n },\n },\n {\n iconName: SvgLibraryIcon.CHECK_IN,\n translationKey: 'checkInNotOpenYet',\n show:\n order?.eligibilities?.checkIn?.some(\n (eligibility) =>\n eligibility.isAllowedToUseCheckIn === false && eligibility.version === FinnairCheckInVersion.LEGACY\n ) &&\n fromCheckin &&\n fromCheckin === 'true',\n theme: NotificationTheme.INFO,\n },\n {\n iconName: SvgLibraryIcon.TRAVEL_DOCUMENTS,\n translationKey: 'provideApisBeforeCheckIn',\n show: isApisRequired,\n theme: NotificationTheme.WARNING,\n linkTarget: `/${language}/manage/view/travel-preparations`,\n clickFn: (event) => {\n stopPropagation(event);\n router.navigateByUrl(`/${language}/manage/view/travel-preparations`);\n this.gtmService.trackElement(\n OPEN_TRAVEL_PREPARATIONS_NOTIFICATION,\n GaContext.MANAGE_BOOKING,\n ElementTypes.LINK,\n undefined,\n ElementActions.CLICK\n );\n },\n },\n ].filter((n) => n.show);\n })\n );\n }\n\n /**\n * Returns notifications for trip card (to be shown on top of the trip card)\n *\n * Should return ticket change policy notification when we have the specs for logic and translations\n */\n getTopNotificationsForTrip(): Observable {\n return of([]);\n }\n\n /**\n * Returns notifications with reasons for flight changes not being allowed for whole trip\n *\n */\n getModificationNotAllowedNotificationsForTrip(): Observable {\n return this.store$.pipe(\n orderData(),\n map((booking) => {\n // we only want to return notifications if changes are disallowed for the whole trip, i.e. all bounds and the bookings is not disrupted\n\n if (\n bookingHasDisruption(booking) ||\n booking.eligibilities.change.map((eligibility) => eligibility.isAllowedToUse).some(Boolean)\n ) {\n return [];\n }\n\n const uniqueDisallowedReasons: FinnairChangeIneligibilityReason[] = [\n ...new Set(\n booking.eligibilities.change\n .filter((eligibility) => !eligibility.isAllowedToUse)\n .map((eligibility) => eligibility.reason)\n ),\n ];\n\n return uniqueDisallowedReasons.map((reason) => {\n return this.getNotification(changeIneligibilityTranslations.get(reason) ?? 'changeNotAllowed');\n });\n })\n );\n }\n\n getChangeNotAllowedReasonsByBound(): Observable<{ [flightId: string]: string }> {\n return this.store$.pipe(\n orderData(),\n map(({ eligibilities }) =>\n eligibilities.change\n .filter(({ isAllowedToUse }) => !isAllowedToUse)\n .reduce((all, { id, reason }) => {\n all[id] = changeIneligibilityTranslations.has(reason)\n ? `MMB.notifications.${changeIneligibilityTranslations.get(reason)}.text`\n : 'MMB.view.changeFlightsModal.disabledNotification';\n return all;\n }, {})\n ),\n startWith({})\n );\n }\n\n private getLocationData(bound: FinnairBoundItem, locations: FinnairOrder['locations']) {\n return {\n origin: getCityName(bound.departure.locationCode, locations),\n destination: getCityName(bound.arrival.locationCode, locations),\n };\n }\n\n private getNotification = (translationKey: string): NotificationInfo => {\n return {\n translationKey,\n show: true,\n theme: NotificationTheme.INFO,\n layout: NotificationLayout.BLOCK,\n };\n };\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { HttpClient, HttpErrorResponse, HttpParams, HttpStatusCode } from '@angular/common/http';\n\nimport { fromEvent, Observable, ObservableInput, of, OperatorFunction, Subscription, throwError } from 'rxjs';\nimport { catchError, map, retry, switchMap, take } from 'rxjs/operators';\n\nimport { LanguageService } from '@fcom/ui-translate';\nimport { ConfigService, SentryLogger } from '@fcom/core/services';\nimport { DEFAULT_RETRY_BACKOFF_TIME, retryWithBackoff, STATUS_CODES_FOR_RETRY } from '@fcom/rx';\nimport { mapErrorForSentry, unsubscribe, WindowRef } from '@fcom/core';\nimport {\n CheckInAcceptCancelRequest,\n CheckInBoardingPassByEmailRequest,\n CheckInBoardingPassByEmailResponse,\n CheckInInitializeRequest,\n CheckInReassignExitSeatsRequest,\n FinnairAdvancePassengerInformationRequest,\n FinnairAdvancePassengerInformationRequestV2,\n FinnairEmergencyContactUpdateRequest,\n FinnairOrder,\n FinnairPassengerRequest,\n FinnairServiceRequestItem,\n RequestInitiator,\n TourOperatorCode,\n} from '@fcom/dapi/api/models';\nimport { isNull } from '@fcom/core/utils';\nimport { DapiHttpResponse } from '@fcom/dapi/api/dapi-http-response';\nimport {\n AdvancePassengerInformationService,\n CheckinService,\n EmergencyContactService,\n OrderService,\n} from '@fcom/dapi/api/services';\nimport { getDapiErrorKey } from '@fcom/common-booking/utils/common-booking.utils';\n\nconst ORDER_STATUS_CODES_FOR_RETRY = [503, ...STATUS_CODES_FOR_RETRY];\n\n@Injectable()\nexport class MmbOrderService implements OnDestroy {\n static NUMBER_OF_RETRIES = 1;\n static readonly LOCATION_HEADER = 'Location';\n\n private subscriptions = new Subscription();\n\n private readonly CATCH_ERROR: (\n isTourOperator?: boolean,\n trackingCallback?: (errorKey: string) => void\n ) => OperatorFunction = (isTourOperator = false) =>\n catchError((err: unknown) => {\n if (!getDapiErrorKey(err).startsWith('ORDER_')) {\n this.logErrorToSentry(err, getDapiErrorKey(err), isTourOperator);\n }\n\n return throwError(() => {\n return err;\n });\n });\n\n logErrorToSentry(err: unknown, errorKey: string, isTourOperator = false): void {\n this.sentryLogger.error(`Error fetching order ${isTourOperator ? 'for tour operator ' : ''}${errorKey}`, {\n error: mapErrorForSentry(err),\n });\n }\n\n constructor(\n private windowRef: WindowRef,\n private http: HttpClient,\n private orderService: OrderService,\n private emergencyContactService: EmergencyContactService,\n private apisService: AdvancePassengerInformationService,\n private languageService: LanguageService,\n private configService: ConfigService,\n private checkInService: CheckinService,\n private sentryLogger: SentryLogger\n ) {}\n\n ngOnDestroy(): void {\n this.subscriptions = unsubscribe(this.subscriptions);\n }\n\n private locationFromResponse = (response: DapiHttpResponse) =>\n response.headers.get(MmbOrderService.LOCATION_HEADER);\n\n /**\n * load Order by PNR and surname\n *\n * @param familyName surname for the PNR\n * @param bookingRef bookingRef for the PNR to fetch\n * @param requestInitiator requestInitiator to define where we started the call\n * @param firstName to be used for group bookings\n */\n loadOrder(\n familyName: string,\n bookingRef: string,\n requestInitiator: RequestInitiator,\n firstName?: string\n ): Observable {\n return this.orderService\n .getOrderByPnrAndLastName$Response(this.configService.cfg.orderUrl, {\n body: {\n id: bookingRef.toUpperCase(),\n lastName: familyName,\n locale: this.languageService.localeValue,\n requestInitiator,\n ...(firstName ? { firstName } : {}),\n },\n })\n .pipe(\n this.retryGet$(),\n this.CATCH_ERROR(),\n switchMap((orderLocation: string) => this.getOrderByUrl(orderLocation))\n );\n }\n\n /**\n * load Order by booking reference, surname and tour operator code\n *\n * @param familyName surname for the PNR\n * @param bookingRef bookingRef for the PNR to fetch\n * @param tourOperatorCode tourOperatorCode for the PNR to fetch\n */\n loadOrderTourOperator(\n familyName: string,\n bookingRef: string,\n tourOperatorCode: TourOperatorCode\n ): Observable {\n return this.orderService\n .getOrderByTourOperatorAndLastName$Response(this.configService.cfg.orderUrl, {\n body: {\n id: bookingRef.toUpperCase(),\n lastName: familyName,\n locale: this.languageService.localeValue,\n requestInitiator: RequestInitiator.MMB,\n tourOperatorCode,\n },\n })\n .pipe(\n this.retryGet$(),\n this.CATCH_ERROR(true),\n switchMap((orderLocation: string) => this.getOrderByUrl(orderLocation))\n );\n }\n\n completeCheckIn(orderId: string, hash: string, body: CheckInAcceptCancelRequest): Observable {\n return this.fetchOrderAfterRequest(\n this.checkInService.acceptCheckIn$Response(this.configService.cfg.orderUrl, {\n orderId,\n hash,\n body,\n })\n );\n }\n\n reassignExitRowSeats(orderId: string, hash: string, body: CheckInReassignExitSeatsRequest): Observable {\n return this.fetchOrderAfterRequest(\n this.checkInService.reassignExitSeats$Response(this.configService.cfg.orderUrl, {\n orderId,\n hash,\n body,\n })\n );\n }\n\n postAd(orderId: string, hash: string, body: CheckInReassignExitSeatsRequest): Observable {\n return this.fetchOrderAfterRequest(\n this.checkInService.reassignExitSeats$Response(this.configService.cfg.orderUrl, {\n orderId,\n hash,\n body,\n })\n );\n }\n\n sendBoardingPass(\n orderId: string,\n hash: string,\n body: CheckInBoardingPassByEmailRequest\n ): Observable {\n return this.checkInService.sendBoardingPass(this.configService.cfg.orderUrl, {\n orderId,\n hash,\n body,\n });\n }\n\n cancelCheckIn(orderId: string, hash: string, body: CheckInAcceptCancelRequest): Observable {\n return this.fetchOrderAfterRequest(\n this.checkInService.cancelCheckIn$Response(this.configService.cfg.orderUrl, {\n orderId,\n hash,\n body,\n })\n );\n }\n\n setServices(orderId: string, hash: string, serviceRequests: FinnairServiceRequestItem[]): Observable {\n return this.fetchOrderAfterRequest(\n this.orderService.setServices$Response(this.configService.cfg.orderUrl, {\n orderId: orderId,\n hash: hash,\n locale: this.languageService.localeValue,\n body: serviceRequests,\n })\n );\n }\n\n updateEmergencyContactDetails(\n orderId: string,\n hash: string,\n serviceRequest: FinnairEmergencyContactUpdateRequest\n ): Observable {\n return this.fetchOrderAfterRequest(\n this.emergencyContactService.updateEmergencyContactDetails$Response(this.configService.cfg.orderUrl, {\n orderId: orderId,\n hash: hash,\n locale: this.languageService.localeValue,\n body: serviceRequest,\n })\n );\n }\n\n updateApis(\n orderId: string,\n hash: string,\n serviceRequest: FinnairAdvancePassengerInformationRequest[]\n ): Observable {\n return this.fetchOrderAfterRequest(\n this.apisService.updateAdvancePassengerInformation$Response(this.configService.cfg.orderUrl, {\n orderId: orderId,\n hash: hash,\n locale: this.languageService.localeValue,\n body: serviceRequest,\n })\n );\n }\n\n updateRegulatoryDetails(\n orderId: string,\n hash: string,\n serviceRequest: FinnairAdvancePassengerInformationRequestV2[]\n ): Observable {\n return this.fetchOrderAfterRequest(\n this.apisService.updateApis$Response(this.configService.cfg.orderUrl, {\n orderId: orderId,\n hash: hash,\n locale: this.languageService.localeValue,\n body: serviceRequest,\n })\n );\n }\n\n updateContactDetails(\n orderId: string,\n hash: string,\n serviceRequest: FinnairPassengerRequest\n ): Observable {\n return this.fetchOrderAfterRequest(\n this.orderService.updatePassengerDetails$Response(this.configService.cfg.orderUrl, {\n orderId,\n hash,\n locale: this.languageService.localeValue,\n body: serviceRequest,\n })\n );\n }\n\n initializeCheckIn(orderId: string, hash: string, request: CheckInInitializeRequest): void {\n this.subscriptions.add(\n this.checkInService\n .initializeCheckIn(this.configService.cfg.orderUrl, {\n orderId: orderId,\n hash: hash,\n body: request,\n })\n .subscribe({\n error: (err: unknown) =>\n this.sentryLogger.error('Check-in initialize call failed with ' + getDapiErrorKey(err), {\n error: mapErrorForSentry(err),\n }),\n })\n );\n }\n\n private fetchOrderAfterRequest(request$: Observable>): Observable {\n return request$.pipe(\n map((res) => this.locationFromResponse(res)),\n retryWithBackoff(MmbOrderService.NUMBER_OF_RETRIES, DEFAULT_RETRY_BACKOFF_TIME, [503, ...STATUS_CODES_FOR_RETRY]),\n switchMap((location: string) => this.getOrderByUrl(location))\n );\n }\n\n getOrderByIdAndHash(orderId: string, hash: string): Observable {\n return this.orderService\n .fetchOrder$Response(this.configService.cfg.orderUrl, {\n orderId: orderId,\n hash: hash,\n locale: this.languageService.localeValue,\n includeServiceCatalog: true,\n })\n .pipe(\n retryWithBackoff(MmbOrderService.NUMBER_OF_RETRIES, DEFAULT_RETRY_BACKOFF_TIME, [\n 503,\n ...STATUS_CODES_FOR_RETRY,\n ]),\n catchError((err: unknown) => {\n this.logErrorToSentry(err, getDapiErrorKey(err));\n return throwError(() => err);\n }),\n map((response: DapiHttpResponse) => response.body as FinnairOrder)\n );\n }\n\n getOrderByUrl(orderUrl: string | null): Observable {\n if (isNull(orderUrl)) {\n return of(null);\n }\n\n const params = new HttpParams().set('includeServiceCatalog', true);\n\n return this.http.get(orderUrl, { params }).pipe(\n retryWithBackoff(MmbOrderService.NUMBER_OF_RETRIES, DEFAULT_RETRY_BACKOFF_TIME, [503, ...STATUS_CODES_FOR_RETRY]),\n catchError((err: unknown) => {\n this.logErrorToSentry(err, getDapiErrorKey(err));\n return throwError(() => err);\n })\n );\n }\n\n private retryGet$() {\n return (o$: Observable>) =>\n o$.pipe(\n retry({\n count: 1,\n delay: (error: HttpErrorResponse): ObservableInput => {\n if (error.status !== HttpStatusCode.PreconditionRequired) {\n return throwError(() => error);\n }\n return fromEvent(this.windowRef.nativeWindow.document, 'akamai-challenge-noreload').pipe(take(1));\n },\n }),\n map((res) => this.locationFromResponse(res)),\n retryWithBackoff(MmbOrderService.NUMBER_OF_RETRIES, DEFAULT_RETRY_BACKOFF_TIME, ORDER_STATUS_CODES_FOR_RETRY)\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpResponse } from '@angular/common/http';\n\nimport { Observable, throwError } from 'rxjs';\nimport { catchError, map, share } from 'rxjs/operators';\n\nimport { ConfigService, SentryLogger } from '@fcom/core/services';\nimport { FinnairAirCalendarChangeListResponse, FinnairCalendarChangeRequest } from '@fcom/dapi/api/models';\nimport { retryWithBackoff } from '@fcom/rx';\nimport { LanguageService } from '@fcom/ui-translate';\nimport { mapErrorForSentry } from '@fcom/core';\nimport { OffersChangesService } from '@fcom/dapi/api/services';\n\n@Injectable()\nexport class OffersService {\n static NUMBER_OF_RETRIES = 1;\n\n constructor(\n private configService: ConfigService,\n private offersChangesService: OffersChangesService,\n private sentryLogger: SentryLogger,\n private languageService: LanguageService\n ) {}\n\n findAirCalendarChange(\n orderId: string,\n hash: string,\n body: FinnairCalendarChangeRequest\n ): Observable {\n const locale = this.languageService.localeValue;\n return this.offersChangesService\n .findAirCalendarChange$Response(this.configService.cfg.offersUrl, { orderId, hash, locale, body })\n .pipe(\n retryWithBackoff(OffersService.NUMBER_OF_RETRIES),\n catchError((err: unknown) => {\n this.sentryLogger.error('Error finding air calendar change offers', {\n error: mapErrorForSentry(err),\n });\n return throwError(() => err);\n }),\n share(),\n map((r: HttpResponse) => r.body as FinnairAirCalendarChangeListResponse)\n );\n }\n}\n","import { createFeatureSelector } from '@ngrx/store';\n\nimport { ManageBookingState } from '../../interfaces';\nimport { MANAGE_BOOKING_FEATURE_KEY } from '../../constants';\n\nexport const selectManageBookingState = createFeatureSelector(MANAGE_BOOKING_FEATURE_KEY);\n","import { createActionGroup, props, union } from '@ngrx/store';\n\nexport const CheckInActions = createActionGroup({\n source: 'CheckInActions',\n events: {\n 'Set Passengers': props<{ passengers: string[] }>(),\n 'Set BoundId': props<{ boundId: string }>(),\n 'Set ClearPendingSeatsOnEntry': props<{ clearPendingSeatsOnEntry: boolean }>(),\n 'Set ModifyCheckIn': props<{ isModifyCheckIn: boolean }>(),\n },\n});\n\nconst checkInUnion = union(\n Object.keys(CheckInActions).reduce((actions, key) => (actions[key] = CheckInActions[key]), {})\n);\n\nexport type CheckInActionsUnion = typeof checkInUnion;\n","import { HttpErrorResponse, HttpParams } from '@angular/common/http';\nimport { Injectable, OnDestroy } from '@angular/core';\n\nimport { Store } from '@ngrx/store';\nimport { NEVER, Observable, PartialObserver, Subscription } from 'rxjs';\nimport { catchError, share, take, takeUntil, tap } from 'rxjs/operators';\n\nimport { noop, unsubscribe } from '@fcom/core/utils';\nimport { DapiErrorCode, DapiHttpErrorResponse } from '@fcom/dapi';\nimport { SeatMapStatus } from '@fcom/common/interfaces/seat-map.interface';\nimport {\n Category,\n CheckInReassignExitSeatsRequest,\n FinnairAdvancePassengerInformationRequest,\n FinnairAdvancePassengerInformationRequestV2,\n FinnairEmergencyContactUpdateRequest,\n FinnairItineraryItemFlight,\n FinnairOrder,\n FinnairPassengerItem,\n FinnairPassengerRequest,\n FinnairServiceRequestItem,\n FinnairTravelEndpoint,\n RequestInitiator,\n SeatmapSvgAndControlData,\n} from '@fcom/dapi/api/models';\nimport { AppState, mapErrorForSentry, SentryLogger, TzDate } from '@fcom/core';\nimport { MmbOrderService } from '@fcom/manage-booking-common';\nimport { DataCloudService } from '@fcom/common/datacloud';\nimport { GtmService } from '@fcom/common/gtm';\nimport {\n ElementActions,\n ElementTypes,\n GaContext,\n getCarTrawlerDateTime,\n getCarTrawlerLang,\n supportedCarTrawlerCurrencies,\n ThirdPartyAncillariesProvider,\n} from '@fcom/common';\nimport {\n OrderActions,\n orderData,\n PassengerNameRecord,\n SeatMapActions,\n seatMapForFlightStatus,\n ServicesActions,\n} from '@fcom/common-booking';\nimport { CommonBookingAncillaryService } from '@fcom/common-booking/modules/ancillaries/services';\nimport { getDapiErrorKey, isFlight } from '@fcom/common-booking/utils/common-booking.utils';\nimport { CustomServiceType } from '@fcom/dapi/interfaces/services.interface';\nimport { LanguageService } from '@fcom/ui-translate';\n\nimport { ThirdPartyAncillariesAttributes, ThirdPartyDeepLink } from '../interfaces';\nimport { MmbError, MmbStage } from '../enums';\nimport { finShare, snapshot } from '../../rx';\nimport { CartActions } from '../../booking/store/actions';\nimport { travelRequirementsRequired } from '../utils/booking.utils';\nimport { StateActions } from '../store/actions';\nimport { isServicesDirty } from '../store/selectors/state.selector';\n\nconst REMOVE_TIMEZONE = /(Z|\\+|-)(\\d|:){0,5}$/;\n\n@Injectable()\nexport class ManageBookingService implements OnDestroy {\n private seatMapSubscriptions: Record = {};\n private loadOrderSubscription: Subscription;\n private loadOrderSimpleSubscription: Subscription;\n private setServicesSubscription: Subscription;\n\n constructor(\n private mmbOrderService: MmbOrderService,\n private store$: Store,\n private gtmService: GtmService,\n private dataCloudService: DataCloudService,\n private sentryLogger: SentryLogger,\n private commonBookingAncillaryService: CommonBookingAncillaryService,\n private languageService: LanguageService\n ) {}\n\n ngOnDestroy(): void {\n Object.values(this.seatMapSubscriptions).forEach((subs) => unsubscribe(subs));\n unsubscribe(this.loadOrderSubscription);\n unsubscribe(this.loadOrderSimpleSubscription);\n unsubscribe(this.setServicesSubscription);\n }\n\n private trackEligibleForDisruptionRebooking(order: FinnairOrder): void {\n order.eligibilities?.disruptionRebooking\n ?.filter(({ isAllowedToUse }) => isAllowedToUse)\n .forEach(() => {\n this.gtmService.trackElement(\n 'view-pnr_selfReacc',\n GaContext.MANAGE_BOOKING,\n ElementTypes.BUTTON,\n undefined,\n ElementActions.VIEW,\n `recLoc-${order.otherInformation.analyticsToken}`\n );\n });\n }\n\n private trackEligibleForAcknowledge(order: FinnairOrder): void {\n order.eligibilities?.acknowledge\n ?.filter(({ isAllowedToUse }) => isAllowedToUse)\n .forEach(() => {\n this.gtmService.trackElement(\n 'view-pnr_acknowledge',\n GaContext.MANAGE_BOOKING,\n ElementTypes.BUTTON,\n undefined,\n ElementActions.VIEW,\n `recLoc-${order.otherInformation.analyticsToken}`\n );\n });\n }\n\n private trackInvoluntaryCancelEligibility(order: FinnairOrder): void {\n order.eligibilities?.involuntaryCancel\n ?.filter(({ isAllowedToUse, id }) => isAllowedToUse && id === CustomServiceType.JOURNEY)\n .forEach(() => {\n this.gtmService.trackElement(\n 'view-pnr_involuntaryCancel',\n GaContext.MANAGE_BOOKING,\n ElementTypes.BUTTON,\n undefined,\n ElementActions.VIEW,\n `recLoc-${order.otherInformation.analyticsToken}`\n );\n });\n }\n\n private trackVoluntaryCancelEligibility(order: FinnairOrder): void {\n order.eligibilities?.voluntaryCancel\n ?.filter(({ isAllowedToUse, id }) => isAllowedToUse && id === CustomServiceType.JOURNEY)\n .forEach(() => {\n this.gtmService.trackElement(\n 'view-pnr_voluntaryCancel',\n GaContext.MANAGE_BOOKING,\n ElementTypes.BUTTON,\n undefined,\n ElementActions.VIEW,\n `recLoc-${order.otherInformation.analyticsToken}`\n );\n });\n }\n\n /**\n * This should be only used when initially doing post get order in MMB or CHECK_IN form\n * @param PNR form data\n * @param requestInitiator who initiated the call\n * @param trackRetrieval should we track call or not\n * @param resetStage should we set stage to VIEW or not\n * @param cancelStream$ hook to cancel the request\n * @param checkIn was the call from check-in\n */\n retrieveOrderFromForm(\n PNR: PassengerNameRecord,\n requestInitiator: RequestInitiator,\n trackRetrieval: boolean,\n resetStage = true,\n cancelStream$: Observable = NEVER,\n checkIn = false\n ): Observable {\n this.store$.dispatch(SeatMapActions.reset());\n this.store$.dispatch(CartActions.reset());\n this.store$.dispatch(OrderActions.setPNR({ PNR }));\n this.store$.dispatch(StateActions.setLoading({ loading: true }));\n this.store$.dispatch(StateActions.clearError());\n const titleRegexPattern = /\\b(Mr|Mrs|Ms)\\b$/i;\n const trimmedFirstName = PNR.firstName ? PNR.firstName.trim().replace(titleRegexPattern, '')?.trim() : undefined;\n const loadOrder$ = PNR.tourOperatorCode\n ? this.mmbOrderService.loadOrderTourOperator(PNR.lastName, PNR.recLoc, PNR.tourOperatorCode)\n : this.mmbOrderService.loadOrder(PNR.lastName?.trim(), PNR.recLoc, requestInitiator, trimmedFirstName);\n\n unsubscribe(this.loadOrderSubscription);\n\n const loadOrderSubscriber$ = loadOrder$.pipe(finShare(), takeUntil(cancelStream$));\n\n this.loadOrderSubscription = loadOrderSubscriber$.subscribe({\n next: (data: FinnairOrder) => {\n if (trackRetrieval) {\n this.trackElement(data, 'success', data.otherInformation.isGroupBooking ? 'group-booking' : '');\n this.trackFrequentFlyers(data);\n if (travelRequirementsRequired(data, true)) {\n this.trackAPIS(data);\n }\n\n this.trackEligibleForAcknowledge(data);\n this.trackEligibleForDisruptionRebooking(data);\n this.trackInvoluntaryCancelEligibility(data);\n this.trackVoluntaryCancelEligibility(data);\n\n this.trackDataCloud(data.passengers[0]);\n }\n\n this.store$.dispatch(OrderActions.resetCategoriesUpdating());\n\n if (!checkIn) {\n this.store$.dispatch(StateActions.setLoading({ loading: false }));\n\n this.updateStore(data);\n if (resetStage) {\n this.store$.dispatch(StateActions.setStage({ stage: MmbStage.VIEW }));\n }\n }\n },\n error: (err: unknown) => {\n if (trackRetrieval) {\n this.trackElement(\n undefined,\n 'error',\n PNR.firstName && PNR.lastName ? 'group-booking' : '',\n getDapiErrorKey(err)\n );\n }\n this.store$.dispatch(StateActions.setLoading({ loading: false }));\n this.store$.dispatch(OrderActions.clearPNR());\n this.store$.dispatch(\n StateActions.setError({ error: this.getError(PNR, (err as DapiHttpErrorResponse)?.error?.key) })\n );\n },\n });\n\n return loadOrderSubscriber$;\n }\n\n getOrderWithIdAndHash(orderId: string, hash: string, resetStage = true): void {\n unsubscribe(this.loadOrderSimpleSubscription);\n\n this.store$.dispatch(SeatMapActions.reset());\n this.store$.dispatch(CartActions.reset());\n this.store$.dispatch(StateActions.setLoading({ loading: true }));\n this.store$.dispatch(StateActions.clearError());\n\n this.loadOrderSimpleSubscription = this.mmbOrderService.getOrderByIdAndHash(orderId, hash).subscribe({\n next: (data: FinnairOrder) => {\n this.store$.dispatch(OrderActions.resetCategoriesUpdating());\n this.store$.dispatch(StateActions.setLoading({ loading: false }));\n this.updateStore(data);\n if (resetStage) {\n this.store$.dispatch(StateActions.setStage({ stage: MmbStage.VIEW }));\n }\n },\n error: (err: unknown) => {\n this.store$.dispatch(StateActions.setLoading({ loading: false }));\n this.store$.dispatch(\n StateActions.setError({\n error: this.getError({ recLoc: orderId }, (err as DapiHttpErrorResponse)?.error?.key),\n })\n );\n },\n });\n }\n\n private getError(PNR: PassengerNameRecord, errorKey: string | undefined): MmbError {\n switch (errorKey) {\n case DapiErrorCode.ORDER_GROUP_FETCH_WITH_INFANT: {\n return MmbError.GROUP_BOOKING_LOGGING_WITH_INFANT;\n }\n case DapiErrorCode.ORDER_CANCELLED: {\n return MmbError.BOOKING_CANCELLED;\n }\n case DapiErrorCode.ORDER_GROUP_ERROR: {\n return PNR.firstName ? MmbError.GROUP_BOOKING_NOT_FOUND : MmbError.GROUP_BOOKING;\n }\n case DapiErrorCode.GROUP_ORDER_NOT_TICKETED: {\n return MmbError.GROUP_BOOKING_NOT_TICKETED;\n }\n case DapiErrorCode.ORDER_NOT_FOUND: {\n return MmbError.BOOKING_NOT_FOUND;\n }\n case DapiErrorCode.UNABLE_TO_DISPLAY_ORDER: {\n return MmbError.UNEXPECTED_ERROR;\n }\n case DapiErrorCode.ORDER_UNEXPECTED_ERROR: {\n return MmbError.UNEXPECTED_ERROR;\n }\n case DapiErrorCode.ORDER_TIMEOUT_ERROR: {\n return MmbError.UNEXPECTED_ERROR;\n }\n case DapiErrorCode.SEVERAL_RECORDS_FOR_TRAVEL_DOCUMENT: {\n return MmbError.SEVERAL_RECORDS_FOR_TRAVEL_DOCUMENT;\n }\n default: {\n return MmbError.UNEXPECTED_ERROR;\n }\n }\n }\n\n setServices(\n serviceRequests: FinnairServiceRequestItem[],\n category: Category,\n observe: PartialObserver = { complete: noop }\n ): boolean {\n if (snapshot(this.store$.pipe(isServicesDirty()))) {\n const order$ = this.store$.pipe(orderData());\n const order = snapshot(order$);\n const { id, hash } = order;\n this.store$.dispatch(OrderActions.setCategoryUpdating({ orderPartIds: category }));\n unsubscribe(this.setServicesSubscription);\n this.setServicesSubscription = this.mmbOrderService\n .setServices(id, hash, serviceRequests)\n .pipe(tap(observe))\n .pipe(\n catchError((error: unknown): Observable => {\n this.sentryLogger.error('Failed to add services for order', { error: mapErrorForSentry(error), category });\n this.store$.dispatch(ServicesActions.resetCategory({ category }));\n const orderLocation = (error as HttpErrorResponse).headers?.get('Location');\n if (orderLocation) {\n return this.mmbOrderService.getOrderByUrl(orderLocation);\n }\n return order$;\n })\n )\n .subscribe({\n next: (nextOrder) => {\n this.store$.dispatch(OrderActions.setOrderData({ order: nextOrder }));\n this.store$.dispatch(OrderActions.clearCategoryUpdating({ orderPartIds: category }));\n },\n error: (error: unknown) => {\n this.sentryLogger.error('Failed to add services for order', { error: mapErrorForSentry(error), category });\n this.store$.dispatch(OrderActions.setOrderData({ order }));\n this.store$.dispatch(OrderActions.clearCategoryUpdating({ orderPartIds: category }));\n },\n });\n return true;\n } else {\n return false;\n }\n }\n\n updateEmergencyContactDetails(serviceRequest: FinnairEmergencyContactUpdateRequest): Observable {\n const { id, hash } = snapshot(this.store$.pipe(orderData()));\n return this.resolveUpdateRequest(\n this.mmbOrderService.updateEmergencyContactDetails(id, hash, serviceRequest),\n 'Failed to update emergency contact details'\n );\n }\n\n updateApis(serviceRequest: FinnairAdvancePassengerInformationRequest[]): Observable {\n const { id, hash } = snapshot(this.store$.pipe(orderData()));\n return this.resolveUpdateRequest(\n this.mmbOrderService.updateApis(id, hash, serviceRequest),\n 'Failed to update apis information'\n );\n }\n\n reassignExitRowSeats(reassignExitRowSeatsRequest: CheckInReassignExitSeatsRequest): Observable {\n const { id, hash } = snapshot(this.store$.pipe(orderData()));\n return this.resolveUpdateRequest(\n this.mmbOrderService.reassignExitRowSeats(id, hash, reassignExitRowSeatsRequest),\n 'Failed to reassign passenger exit row seats'\n );\n }\n\n updateContactDetails(serviceRequest: FinnairPassengerRequest): Observable {\n const { id, hash } = snapshot(this.store$.pipe(orderData()));\n return this.resolveUpdateRequest(\n this.mmbOrderService.updateContactDetails(id, hash, serviceRequest),\n 'Failed to update passenger contact details'\n );\n }\n\n updateRegulatoryDetails(serviceRequest: FinnairAdvancePassengerInformationRequestV2[]): Observable {\n const { id, hash } = snapshot(this.store$.pipe(orderData()));\n return this.resolveUpdateRequest(\n this.mmbOrderService.updateRegulatoryDetails(id, hash, serviceRequest),\n 'Failed to update regulatory details',\n true\n );\n }\n\n private resolveUpdateRequest(\n updateRequest$: Observable,\n errorMsg: string,\n keepSeatsData = false\n ): Observable {\n const stream$ = updateRequest$.pipe(take(1), share());\n stream$\n .pipe(\n catchError((error: unknown): Observable => {\n this.sentryLogger.error(errorMsg, { error: mapErrorForSentry(error) });\n const orderLocation = (error as HttpErrorResponse).headers?.get('Location');\n if (orderLocation) {\n return this.mmbOrderService.getOrderByUrl(orderLocation);\n }\n return this.store$.pipe(orderData());\n })\n )\n .subscribe((data) => {\n this.updateStore(data, keepSeatsData);\n });\n\n return stream$;\n }\n\n private updateStore(order: FinnairOrder, keepSeatsData = false): void {\n this.store$.dispatch(OrderActions.setOrderData({ order, keepSeatsData }));\n\n this.commonBookingAncillaryService.setServiceCatalog(order);\n }\n\n triggerFetchSeatMap(\n flight: FinnairItineraryItemFlight,\n orderId: string,\n orderHash: string,\n currencyCode: string,\n forceFetch = false\n ): void {\n const flightId = flight.id;\n const status = snapshot(this.store$.pipe(seatMapForFlightStatus(flightId)));\n\n const doNotFetchStatuses = [SeatMapStatus.OK_NO_AVAILABILITY, SeatMapStatus.PENDING];\n\n if (\n (!doNotFetchStatuses.includes(status) &&\n (status !== SeatMapStatus.OK || snapshot(this.store$.pipe(isServicesDirty())))) ||\n forceFetch\n ) {\n unsubscribe(this.seatMapSubscriptions[flightId]);\n const departureDateTime = flight.departure.dateTime;\n this.store$.dispatch(SeatMapActions.startLoading({ flightId }));\n this.seatMapSubscriptions[flightId] = this.commonBookingAncillaryService\n .getOrderSeatMapForFlight(flightId, departureDateTime, orderId, orderHash, currencyCode)\n .subscribe({\n next: (seatMap: SeatmapSvgAndControlData) => {\n this.store$.dispatch(SeatMapActions.setSeatMap({ seatMapForFlight: { seatMap, flightId } }));\n unsubscribe(this.seatMapSubscriptions[flightId]);\n },\n // eslint-disable-next-line rxjs/no-implicit-any-catch\n error: (error: Error) => {\n this.sentryLogger.error('Error fetching seat map in mmb', {\n error: mapErrorForSentry(error),\n });\n this.store$.dispatch(SeatMapActions.error({ flightId }));\n unsubscribe(this.seatMapSubscriptions[flightId]);\n },\n complete: () => unsubscribe(this.seatMapSubscriptions[flightId]),\n });\n }\n }\n\n public getThirdPartyDeepLinks(\n order: FinnairOrder,\n arriving: FinnairTravelEndpoint,\n leaving: FinnairTravelEndpoint,\n thirdPartyAncillaries: ThirdPartyAncillariesAttributes[]\n ): ThirdPartyDeepLink[] {\n return thirdPartyAncillaries.map((thirdParty) => this.getThirdPartyLink(order, arriving, leaving, thirdParty));\n }\n\n private getThirdPartyLink(\n order: FinnairOrder,\n arriving: FinnairTravelEndpoint,\n leaving: FinnairTravelEndpoint,\n thirdParty: ThirdPartyAncillariesAttributes\n ): ThirdPartyDeepLink {\n const dropOff = this.calculateDropOff(arriving, leaving, thirdParty);\n if (\n thirdParty.partner === ThirdPartyAncillariesProvider.CAR_TRAWLER_RENTAL ||\n thirdParty.partner === ThirdPartyAncillariesProvider.CAR_TRAWLER_TRANSFER\n ) {\n const paxCount = order.passengers.length;\n const currency = supportedCarTrawlerCurrencies(order.prices?.included?.total?.total?.totalAmount?.currencyCode);\n const locale = getCarTrawlerLang(thirdParty.partner, this.languageService.langValue);\n const isOneWay = order.bounds.length === 1;\n const arrivalFlightNumber = order.bounds[0].itinerary.filter(isFlight).at(-1)?.flightNumber;\n\n const newPickup = {\n ...arriving,\n dateTime: getCarTrawlerDateTime(arriving.dateTime, 1),\n };\n const newDropoff = {\n ...dropOff,\n dateTime: getCarTrawlerDateTime(dropOff.dateTime, isOneWay ? 1 : -2),\n };\n\n return this.buildCarTrawlerDeepLinkInfo(\n thirdParty.clientId,\n locale,\n thirdParty,\n newPickup,\n newDropoff,\n currency,\n paxCount,\n isOneWay,\n arrivalFlightNumber,\n thirdParty.partner === ThirdPartyAncillariesProvider.CAR_TRAWLER_TRANSFER\n );\n }\n }\n\n private calculateDropOff(\n arriving: FinnairTravelEndpoint,\n leaving: FinnairTravelEndpoint,\n thirdParty: ThirdPartyAncillariesAttributes\n ): FinnairTravelEndpoint {\n return (\n leaving ?? {\n ...arriving,\n dateTime: new TzDate(arriving.dateTime.replace(REMOVE_TIMEZONE, 'Z'))\n .addHours(24 * thirdParty.defaultStay)\n .toISOString(),\n }\n );\n }\n\n private buildCarTrawlerDeepLinkInfo(\n clientId: string,\n locale: string,\n thirdParty: ThirdPartyAncillariesAttributes,\n pickup: FinnairTravelEndpoint,\n dropoff: FinnairTravelEndpoint,\n currency: string,\n passengers: number,\n isOneWay: boolean,\n flightNumber: string,\n transfer = false,\n context = 'manage-booking'\n ): ThirdPartyDeepLink {\n let params = new HttpParams()\n .set('clientId', clientId)\n .set('passengers', passengers)\n .set('context', context)\n .set('pickupIATACode', pickup.locationCode)\n .set('pickupDateTime', pickup.dateTime)\n .set('flightNumber', flightNumber);\n\n if (!transfer) {\n params = params.set('returnDateTime', dropoff.dateTime);\n params = params.set('dropoffIATACode', dropoff.locationCode);\n } else if (isOneWay) {\n params = params.set('oneWay', true);\n } else {\n params = params.set('returnDateTime', dropoff.dateTime);\n }\n\n params = params.set('currency', currency);\n\n const urlPrefix = transfer ? 'transfers' : 'cars';\n\n const thirdPartyInfo: ThirdPartyDeepLink = {\n partner: transfer\n ? ThirdPartyAncillariesProvider.CAR_TRAWLER_TRANSFER\n : ThirdPartyAncillariesProvider.CAR_TRAWLER_RENTAL,\n cmsKey: thirdParty.cmsKey,\n url: `https://${urlPrefix}.finnair.com/${locale}/book?${params.toString()}`,\n partnerIcon: thirdParty.partnerIcon,\n };\n\n return thirdPartyInfo;\n }\n\n private trackElement(\n order: FinnairOrder | undefined,\n responseType: string,\n bookingType?: string,\n errorKey?: string\n ): void {\n const error = errorKey ? `-${errorKey}` : '';\n const booking = bookingType ? `-${bookingType}` : '';\n this.gtmService.trackElement(\n `retrieve-booking${booking}-${responseType}${error}`,\n GaContext.MANAGE_BOOKING,\n ElementTypes.FORM,\n undefined,\n ElementActions.SUBMIT,\n order && `recLoc-${order.otherInformation.analyticsToken}`\n );\n }\n\n private trackAPIS(order: FinnairOrder): void {\n this.gtmService.trackElement(\n 'apis-update_required',\n GaContext.MANAGE_BOOKING,\n ElementTypes.FORM,\n undefined,\n ElementActions.SUBMIT,\n `recLoc-${order.otherInformation.analyticsToken}`\n );\n }\n\n private trackFrequentFlyers(data: FinnairOrder) {\n const maxCardsForPax = Math.max(...(data.passengers ?? []).map((pax) => pax.frequentFlyerCards?.length ?? 0));\n const cards = maxCardsForPax > 0 ? (maxCardsForPax > 1 ? 'many' : 'one') : 'none';\n this.gtmService.trackElement(\n `retrieve-booking_frequent-flyer-cards-${cards}`,\n GaContext.MANAGE_BOOKING,\n ElementTypes.FORM,\n `card-count-${maxCardsForPax}`,\n ElementActions.SUBMIT\n );\n }\n\n private trackDataCloud(passenger: FinnairPassengerItem): void {\n this.dataCloudService.mmbPaxDetails({\n firstName: passenger.firstName,\n lastName: passenger.lastName,\n emailAddress: passenger.email,\n countryCode: passenger.phoneNumbers?.[0]?.countryPrefix,\n phoneNumber: passenger.phoneNumbers?.[0]?.number,\n memberProgram: passenger.frequentFlyerCards?.[0]?.companyCode,\n memberNumber: passenger.frequentFlyerCards?.[0]?.cardNumber,\n });\n }\n}\n"],"x_google_ignoreList":[]}