From 6d7fbe08940b7728fe9d312ccb3e97ed6b083ddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matilda=20Landstr=C3=B6m?= Date: Thu, 24 Apr 2025 15:08:40 +0000 Subject: [PATCH] Merged in feat/SW-2440-ancillaries-tracking (pull request #1846) Feat(SW-2440): Ancillaries tracking * fix(SW-2440): move ancillaries tracking to separate object Approved-by: Christian Andolf --- .../BookingConfirmation/Tracking/index.tsx | 14 +++--- .../BookingConfirmation/Tracking/tracking.ts | 46 ++++++++++--------- .../components/TrackingSDK/hooks.ts | 9 ++++ .../components/TrackingSDK/index.tsx | 7 ++- apps/scandic-web/types/components/tracking.ts | 4 +- 5 files changed, 49 insertions(+), 31 deletions(-) diff --git a/apps/scandic-web/components/HotelReservation/BookingConfirmation/Tracking/index.tsx b/apps/scandic-web/components/HotelReservation/BookingConfirmation/Tracking/index.tsx index e1acdcca1..da10c4dd5 100644 --- a/apps/scandic-web/components/HotelReservation/BookingConfirmation/Tracking/index.tsx +++ b/apps/scandic-web/components/HotelReservation/BookingConfirmation/Tracking/index.tsx @@ -23,18 +23,20 @@ export default function Tracking({ const rooms = bookingRooms.filter((room): room is Room => !!room) - const { hotelsTrackingData, pageTrackingData, paymentInfo } = getTracking( - lang, - bookingConfirmation.booking, - bookingConfirmation.hotel, - rooms - ) + const { hotelsTrackingData, pageTrackingData, paymentInfo, ancillaries } = + getTracking( + lang, + bookingConfirmation.booking, + bookingConfirmation.hotel, + rooms + ) return ( ) } diff --git a/apps/scandic-web/components/HotelReservation/BookingConfirmation/Tracking/tracking.ts b/apps/scandic-web/components/HotelReservation/BookingConfirmation/Tracking/tracking.ts index 3ea9ec214..4333eee13 100644 --- a/apps/scandic-web/components/HotelReservation/BookingConfirmation/Tracking/tracking.ts +++ b/apps/scandic-web/components/HotelReservation/BookingConfirmation/Tracking/tracking.ts @@ -6,8 +6,10 @@ import { getSpecialRoomType } from "@/utils/specialRoomType" import { invertedBedTypeMap } from "../../utils" +import { RoomPackageCodeEnum } from "@/types/components/hotelReservation/selectRate/roomFilter" import { TrackingChannelEnum, + type TrackingSDKAncillaries, type TrackingSDKHotelInfo, type TrackingSDKPageData, type TrackingSDKPaymentInfo, @@ -32,28 +34,30 @@ function getRate(cancellationRule: RateDefinition["cancellationRule"] | null) { } } -function findBreakfastPackage( +function findAncillaryPackages( packages: BookingConfirmation["booking"]["packages"] -) { - return packages.find( - (pkg) => pkg.code === BreakfastPackageEnum.REGULAR_BREAKFAST +): BookingConfirmation["booking"]["packages"] { + return packages.filter( + (pkg) => + pkg.code === RoomPackageCodeEnum.PET_ROOM || + pkg.code === BreakfastPackageEnum.REGULAR_BREAKFAST ) } -function mapBreakfastPackage( - breakfastPackage: BookingConfirmation["booking"]["packages"][number], - adults: number, +function mapAncillaryPackage( + ancillaryPackage: BookingConfirmation["booking"]["packages"][number], operaId: string ) { return { hotelid: operaId, productCategory: "", // TODO: Add category - productId: breakfastPackage.code!, // Is not found unless code exists - productName: "BreakfastAdult", - productPoints: 0, - productPrice: +breakfastPackage.unitPrice, - productType: "food", - productUnits: adults, + productId: ancillaryPackage.code, + productName: ancillaryPackage.description, + productPoints: ancillaryPackage.points, + productPrice: ancillaryPackage.unitPrice, + productType: ancillaryPackage.type ?? "", + productUnits: ancillaryPackage.unit, + productDeliveryTime: "", } } @@ -83,20 +87,17 @@ export function getTracking( booking.rateDefinition.cancellationRule === CancellationRuleEnum.CancellableBefore6PM + const ancillaries: TrackingSDKAncillaries = rooms + .filter((r) => findAncillaryPackages(r.packages)) + .flatMap((r) => { + return r.packages.map((pkg) => mapAncillaryPackage(pkg, hotel.operaId)) + }) + const hotelsTrackingData: TrackingSDKHotelInfo = { ageOfChildren: rooms.map((r) => r.childrenAges?.join(",") ?? "-").join("|"), analyticsRateCode: rooms .map((r) => getRate(r.rateDefinition.cancellationRule)) .join("|"), - ancillaries: rooms - .filter((r) => findBreakfastPackage(r.packages)) - .map((r) => { - return mapBreakfastPackage( - findBreakfastPackage(r.packages)!, - r.adults, - hotel.operaId - ) - }), arrivalDate: format(arrivalDate, "yyyy-MM-dd"), bedType: rooms .map((r) => r.bedDescription) @@ -182,5 +183,6 @@ export function getTracking( hotelsTrackingData, pageTrackingData, paymentInfo, + ancillaries, } } diff --git a/apps/scandic-web/components/TrackingSDK/hooks.ts b/apps/scandic-web/components/TrackingSDK/hooks.ts index 69d9835b9..9739c1e72 100644 --- a/apps/scandic-web/components/TrackingSDK/hooks.ts +++ b/apps/scandic-web/components/TrackingSDK/hooks.ts @@ -35,6 +35,7 @@ export const useTrackHardNavigation = ({ pageData, hotelInfo, paymentInfo, + ancillaries, }: TrackingSDKProps) => { const { data: userTrackingData, @@ -68,6 +69,7 @@ export const useTrackHardNavigation = ({ hotelInfo, userData, pageData, + ancillaries, }) } @@ -87,6 +89,7 @@ export const useTrackHardNavigation = ({ sessionId, paymentInfo, isPending, + ancillaries, ]) } @@ -94,6 +97,7 @@ export const useTrackSoftNavigation = ({ pageData, hotelInfo, paymentInfo, + ancillaries, }: TrackingSDKProps) => { const { data: userTrackingData, @@ -156,6 +160,7 @@ export const useTrackSoftNavigation = ({ userInfo: userData, hotelInfo: hotelInfo, paymentInfo, + ancillaries, }) } previousPathname.current = pathName // Update for next render @@ -175,6 +180,7 @@ export const useTrackSoftNavigation = ({ sessionId, paymentInfo, userTrackingData, + ancillaries, ]) } @@ -185,6 +191,7 @@ const trackPerformance = async ({ hotelInfo, userData, pageData, + ancillaries, }: { pathName: string sessionId: string | null @@ -192,6 +199,7 @@ const trackPerformance = async ({ hotelInfo: TrackingSDKProps["hotelInfo"] userData: TrackingSDKUserData pageData: TrackingSDKProps["pageData"] + ancillaries: TrackingSDKProps["ancillaries"] }) => { let pageLoadTime: number | undefined = undefined let lcpTime: number | undefined = undefined @@ -223,6 +231,7 @@ const trackPerformance = async ({ userInfo: userData, hotelInfo, paymentInfo, + ancillaries, }) } diff --git a/apps/scandic-web/components/TrackingSDK/index.tsx b/apps/scandic-web/components/TrackingSDK/index.tsx index 6c908e82b..2374a9af8 100644 --- a/apps/scandic-web/components/TrackingSDK/index.tsx +++ b/apps/scandic-web/components/TrackingSDK/index.tsx @@ -6,6 +6,7 @@ import { } from "@/components/TrackingSDK/hooks" import type { + TrackingSDKAncillaries, TrackingSDKHotelInfo, TrackingSDKPageData, TrackingSDKPaymentInfo, @@ -15,13 +16,15 @@ export default function TrackingSDK({ pageData, hotelInfo, paymentInfo, + ancillaries, }: { pageData: TrackingSDKPageData hotelInfo?: TrackingSDKHotelInfo paymentInfo?: TrackingSDKPaymentInfo + ancillaries?: TrackingSDKAncillaries }) { - useTrackHardNavigation({ pageData, hotelInfo, paymentInfo }) - useTrackSoftNavigation({ pageData, hotelInfo, paymentInfo }) + useTrackHardNavigation({ pageData, hotelInfo, paymentInfo, ancillaries }) + useTrackSoftNavigation({ pageData, hotelInfo, paymentInfo, ancillaries }) return null } diff --git a/apps/scandic-web/types/components/tracking.ts b/apps/scandic-web/types/components/tracking.ts index d0317d353..47eea8b05 100644 --- a/apps/scandic-web/types/components/tracking.ts +++ b/apps/scandic-web/types/components/tracking.ts @@ -52,9 +52,10 @@ export type TrackingSDKUserData = } | { loginStatus: "Error" } +export type TrackingSDKAncillaries = Ancillary[] + export type TrackingSDKHotelInfo = { ageOfChildren?: string // "10", "2,5,10" - ancillaries?: Ancillary[] analyticsRateCode?: RateEnum | string arrivalDate?: string availableResults?: number // Number of hotels to choose from after a city search @@ -126,6 +127,7 @@ export type TrackingSDKProps = { pageData: TrackingSDKPageData hotelInfo?: TrackingSDKHotelInfo paymentInfo?: TrackingSDKPaymentInfo + ancillaries?: TrackingSDKAncillaries } export type TrackingSDKData = TrackingSDKPageData & {