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
This commit is contained in:
Matilda Landström
2025-04-24 15:08:40 +00:00
parent d097547ec7
commit 6d7fbe0894
5 changed files with 49 additions and 31 deletions

View File

@@ -23,7 +23,8 @@ export default function Tracking({
const rooms = bookingRooms.filter((room): room is Room => !!room) const rooms = bookingRooms.filter((room): room is Room => !!room)
const { hotelsTrackingData, pageTrackingData, paymentInfo } = getTracking( const { hotelsTrackingData, pageTrackingData, paymentInfo, ancillaries } =
getTracking(
lang, lang,
bookingConfirmation.booking, bookingConfirmation.booking,
bookingConfirmation.hotel, bookingConfirmation.hotel,
@@ -35,6 +36,7 @@ export default function Tracking({
pageData={pageTrackingData} pageData={pageTrackingData}
hotelInfo={hotelsTrackingData} hotelInfo={hotelsTrackingData}
paymentInfo={paymentInfo} paymentInfo={paymentInfo}
ancillaries={ancillaries}
/> />
) )
} }

View File

@@ -6,8 +6,10 @@ import { getSpecialRoomType } from "@/utils/specialRoomType"
import { invertedBedTypeMap } from "../../utils" import { invertedBedTypeMap } from "../../utils"
import { RoomPackageCodeEnum } from "@/types/components/hotelReservation/selectRate/roomFilter"
import { import {
TrackingChannelEnum, TrackingChannelEnum,
type TrackingSDKAncillaries,
type TrackingSDKHotelInfo, type TrackingSDKHotelInfo,
type TrackingSDKPageData, type TrackingSDKPageData,
type TrackingSDKPaymentInfo, type TrackingSDKPaymentInfo,
@@ -32,28 +34,30 @@ function getRate(cancellationRule: RateDefinition["cancellationRule"] | null) {
} }
} }
function findBreakfastPackage( function findAncillaryPackages(
packages: BookingConfirmation["booking"]["packages"] packages: BookingConfirmation["booking"]["packages"]
) { ): BookingConfirmation["booking"]["packages"] {
return packages.find( return packages.filter(
(pkg) => pkg.code === BreakfastPackageEnum.REGULAR_BREAKFAST (pkg) =>
pkg.code === RoomPackageCodeEnum.PET_ROOM ||
pkg.code === BreakfastPackageEnum.REGULAR_BREAKFAST
) )
} }
function mapBreakfastPackage( function mapAncillaryPackage(
breakfastPackage: BookingConfirmation["booking"]["packages"][number], ancillaryPackage: BookingConfirmation["booking"]["packages"][number],
adults: number,
operaId: string operaId: string
) { ) {
return { return {
hotelid: operaId, hotelid: operaId,
productCategory: "", // TODO: Add category productCategory: "", // TODO: Add category
productId: breakfastPackage.code!, // Is not found unless code exists productId: ancillaryPackage.code,
productName: "BreakfastAdult", productName: ancillaryPackage.description,
productPoints: 0, productPoints: ancillaryPackage.points,
productPrice: +breakfastPackage.unitPrice, productPrice: ancillaryPackage.unitPrice,
productType: "food", productType: ancillaryPackage.type ?? "",
productUnits: adults, productUnits: ancillaryPackage.unit,
productDeliveryTime: "",
} }
} }
@@ -83,20 +87,17 @@ export function getTracking(
booking.rateDefinition.cancellationRule === booking.rateDefinition.cancellationRule ===
CancellationRuleEnum.CancellableBefore6PM 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 = { const hotelsTrackingData: TrackingSDKHotelInfo = {
ageOfChildren: rooms.map((r) => r.childrenAges?.join(",") ?? "-").join("|"), ageOfChildren: rooms.map((r) => r.childrenAges?.join(",") ?? "-").join("|"),
analyticsRateCode: rooms analyticsRateCode: rooms
.map((r) => getRate(r.rateDefinition.cancellationRule)) .map((r) => getRate(r.rateDefinition.cancellationRule))
.join("|"), .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"), arrivalDate: format(arrivalDate, "yyyy-MM-dd"),
bedType: rooms bedType: rooms
.map((r) => r.bedDescription) .map((r) => r.bedDescription)
@@ -182,5 +183,6 @@ export function getTracking(
hotelsTrackingData, hotelsTrackingData,
pageTrackingData, pageTrackingData,
paymentInfo, paymentInfo,
ancillaries,
} }
} }

View File

@@ -35,6 +35,7 @@ export const useTrackHardNavigation = ({
pageData, pageData,
hotelInfo, hotelInfo,
paymentInfo, paymentInfo,
ancillaries,
}: TrackingSDKProps) => { }: TrackingSDKProps) => {
const { const {
data: userTrackingData, data: userTrackingData,
@@ -68,6 +69,7 @@ export const useTrackHardNavigation = ({
hotelInfo, hotelInfo,
userData, userData,
pageData, pageData,
ancillaries,
}) })
} }
@@ -87,6 +89,7 @@ export const useTrackHardNavigation = ({
sessionId, sessionId,
paymentInfo, paymentInfo,
isPending, isPending,
ancillaries,
]) ])
} }
@@ -94,6 +97,7 @@ export const useTrackSoftNavigation = ({
pageData, pageData,
hotelInfo, hotelInfo,
paymentInfo, paymentInfo,
ancillaries,
}: TrackingSDKProps) => { }: TrackingSDKProps) => {
const { const {
data: userTrackingData, data: userTrackingData,
@@ -156,6 +160,7 @@ export const useTrackSoftNavigation = ({
userInfo: userData, userInfo: userData,
hotelInfo: hotelInfo, hotelInfo: hotelInfo,
paymentInfo, paymentInfo,
ancillaries,
}) })
} }
previousPathname.current = pathName // Update for next render previousPathname.current = pathName // Update for next render
@@ -175,6 +180,7 @@ export const useTrackSoftNavigation = ({
sessionId, sessionId,
paymentInfo, paymentInfo,
userTrackingData, userTrackingData,
ancillaries,
]) ])
} }
@@ -185,6 +191,7 @@ const trackPerformance = async ({
hotelInfo, hotelInfo,
userData, userData,
pageData, pageData,
ancillaries,
}: { }: {
pathName: string pathName: string
sessionId: string | null sessionId: string | null
@@ -192,6 +199,7 @@ const trackPerformance = async ({
hotelInfo: TrackingSDKProps["hotelInfo"] hotelInfo: TrackingSDKProps["hotelInfo"]
userData: TrackingSDKUserData userData: TrackingSDKUserData
pageData: TrackingSDKProps["pageData"] pageData: TrackingSDKProps["pageData"]
ancillaries: TrackingSDKProps["ancillaries"]
}) => { }) => {
let pageLoadTime: number | undefined = undefined let pageLoadTime: number | undefined = undefined
let lcpTime: number | undefined = undefined let lcpTime: number | undefined = undefined
@@ -223,6 +231,7 @@ const trackPerformance = async ({
userInfo: userData, userInfo: userData,
hotelInfo, hotelInfo,
paymentInfo, paymentInfo,
ancillaries,
}) })
} }

View File

@@ -6,6 +6,7 @@ import {
} from "@/components/TrackingSDK/hooks" } from "@/components/TrackingSDK/hooks"
import type { import type {
TrackingSDKAncillaries,
TrackingSDKHotelInfo, TrackingSDKHotelInfo,
TrackingSDKPageData, TrackingSDKPageData,
TrackingSDKPaymentInfo, TrackingSDKPaymentInfo,
@@ -15,13 +16,15 @@ export default function TrackingSDK({
pageData, pageData,
hotelInfo, hotelInfo,
paymentInfo, paymentInfo,
ancillaries,
}: { }: {
pageData: TrackingSDKPageData pageData: TrackingSDKPageData
hotelInfo?: TrackingSDKHotelInfo hotelInfo?: TrackingSDKHotelInfo
paymentInfo?: TrackingSDKPaymentInfo paymentInfo?: TrackingSDKPaymentInfo
ancillaries?: TrackingSDKAncillaries
}) { }) {
useTrackHardNavigation({ pageData, hotelInfo, paymentInfo }) useTrackHardNavigation({ pageData, hotelInfo, paymentInfo, ancillaries })
useTrackSoftNavigation({ pageData, hotelInfo, paymentInfo }) useTrackSoftNavigation({ pageData, hotelInfo, paymentInfo, ancillaries })
return null return null
} }

View File

@@ -52,9 +52,10 @@ export type TrackingSDKUserData =
} }
| { loginStatus: "Error" } | { loginStatus: "Error" }
export type TrackingSDKAncillaries = Ancillary[]
export type TrackingSDKHotelInfo = { export type TrackingSDKHotelInfo = {
ageOfChildren?: string // "10", "2,5,10" ageOfChildren?: string // "10", "2,5,10"
ancillaries?: Ancillary[]
analyticsRateCode?: RateEnum | string analyticsRateCode?: RateEnum | string
arrivalDate?: string arrivalDate?: string
availableResults?: number // Number of hotels to choose from after a city search availableResults?: number // Number of hotels to choose from after a city search
@@ -126,6 +127,7 @@ export type TrackingSDKProps = {
pageData: TrackingSDKPageData pageData: TrackingSDKPageData
hotelInfo?: TrackingSDKHotelInfo hotelInfo?: TrackingSDKHotelInfo
paymentInfo?: TrackingSDKPaymentInfo paymentInfo?: TrackingSDKPaymentInfo
ancillaries?: TrackingSDKAncillaries
} }
export type TrackingSDKData = TrackingSDKPageData & { export type TrackingSDKData = TrackingSDKPageData & {