Merged in feat/sw-697-pet-room-fee-on-card (pull request #827)

feat(SW-697): Update package structure on price from API

Approved-by: Linus Flood
Approved-by: Niclas Edenvin
This commit is contained in:
Pontus Dreij
2024-11-04 15:42:06 +00:00
14 changed files with 211 additions and 57 deletions

View File

@@ -488,7 +488,7 @@ export type HotelsAvailability = z.infer<typeof hotelsAvailabilitySchema>
export type HotelsAvailabilityPrices =
HotelsAvailability["data"][number]["attributes"]["bestPricePerNight"]
const priceSchema = z.object({
export const priceSchema = z.object({
pricePerNight: z.string(),
pricePerStay: z.string(),
currency: z.string(),
@@ -774,17 +774,27 @@ export const apiLocationsSchema = z.object({
),
})
const breakfastPackagePriceSchema = z
.object({
currency: z.nativeEnum(CurrencyEnum),
price: z.string(),
totalPrice: z.string(),
})
.default({
currency: CurrencyEnum.SEK,
price: "0",
totalPrice: "0",
}) // TODO: Remove optional and default when the API change has been deployed
export const breakfastPackageSchema = z.object({
code: z.string(),
currency: z.nativeEnum(CurrencyEnum),
description: z.string(),
originalPrice: z.number().default(0),
packagePrice: z.number(),
localPrice: breakfastPackagePriceSchema,
requestedPrice: breakfastPackagePriceSchema,
packageType: z.enum([
PackageTypeEnum.BreakfastAdult,
PackageTypeEnum.BreakfastChildren,
]),
totalPrice: z.number(),
})
export const breakfastPackagesSchema = z

View File

@@ -913,11 +913,16 @@ export const hotelQueryRouter = router({
const { hotelId, startDate, endDate, adults, children, packageCodes } =
input
const { lang } = ctx
const apiLang = toApiLang(lang)
const searchParams = new URLSearchParams({
startDate,
endDate,
adults: adults.toString(),
children: children.toString(),
language: apiLang,
})
packageCodes.forEach((code) => {
@@ -993,11 +998,17 @@ export const hotelQueryRouter = router({
breakfast: safeProtectedServiceProcedure
.input(getBreakfastPackageInputSchema)
.query(async function ({ ctx, input }) {
const { lang } = ctx
const apiLang = toApiLang(lang)
const params = {
Adults: input.adults,
EndDate: dt(input.toDate).format("YYYY-MM-DD"),
StartDate: dt(input.fromDate).format("YYYY-MM-DD"),
language: apiLang,
}
const metricsData = { ...params, hotelId: input.hotelId }
breakfastPackagesCounter.add(1, metricsData)
console.info(
@@ -1084,10 +1095,13 @@ export const hotelQueryRouter = router({
const freeBreakfastPackage = breakfastPackages.data.find(
(pkg) => pkg.code === BreakfastPackageEnum.FREE_MEMBER_BREAKFAST
)
if (freeBreakfastPackage) {
if (originalBreakfastPackage) {
freeBreakfastPackage.originalPrice =
originalBreakfastPackage.packagePrice
if (freeBreakfastPackage && freeBreakfastPackage.localPrice) {
if (
originalBreakfastPackage &&
originalBreakfastPackage.localPrice
) {
freeBreakfastPackage.localPrice.price =
originalBreakfastPackage.localPrice.price
}
return [freeBreakfastPackage]
}

View File

@@ -1,6 +1,7 @@
import { z } from "zod"
import { RoomPackageCodeEnum } from "@/types/components/hotelReservation/selectRate/roomFilter"
import { CurrencyEnum } from "@/types/enums/currency"
export const getRoomPackagesInputSchema = z.object({
hotelId: z.string(),
@@ -11,33 +12,40 @@ export const getRoomPackagesInputSchema = z.object({
packageCodes: z.array(z.string()).optional().default([]),
})
const packagesSchema = z.array(
z.object({
code: z.enum([
RoomPackageCodeEnum.PET_ROOM,
RoomPackageCodeEnum.ALLERGY_ROOM,
RoomPackageCodeEnum.ACCESSIBILITY_ROOM,
]),
itemCode: z.string(),
description: z.string(),
currency: z.string(),
calculatedPrice: z.number(),
inventories: z.array(
z.object({
date: z.string(),
total: z.number(),
available: z.number(),
})
),
export const packagePriceSchema = z
.object({
currency: z.nativeEnum(CurrencyEnum),
price: z.string(),
totalPrice: z.string(),
})
)
.optional()
.default({
currency: CurrencyEnum.SEK,
price: "0",
totalPrice: "0",
}) // TODO: Remove optional and default when the API change has been deployed
export const packagesSchema = z.object({
code: z.nativeEnum(RoomPackageCodeEnum),
itemCode: z.string(),
description: z.string(),
localPrice: packagePriceSchema,
requestedPrice: packagePriceSchema,
inventories: z.array(
z.object({
date: z.string(),
total: z.number(),
available: z.number(),
})
),
})
export const getRoomPackagesSchema = z
.object({
data: z.object({
attributes: z.object({
hotelId: z.number(),
packages: packagesSchema,
packages: z.array(packagesSchema),
}),
relationships: z
.object({