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,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 (
<TrackingSDK
pageData={pageTrackingData}
hotelInfo={hotelsTrackingData}
paymentInfo={paymentInfo}
ancillaries={ancillaries}
/>
)
}

View File

@@ -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,
}
}

View File

@@ -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,
})
}

View File

@@ -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
}

View File

@@ -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 & {