feat (SW-2864): Move booking router to trpc package * Add env to trpc package * Add eslint to trpc package * Apply lint rules * Use direct imports from trpc package * Add lint-staged config to trpc * Move lang enum to common * Restructure trpc package folder structure * WIP first step * update internal imports in trpc * Fix most errors in scandic-web Just 100 left... * Move Props type out of trpc * Fix CategorizedFilters types * Move more schemas in hotel router * Fix deps * fix getNonContentstackUrls * Fix import error * Fix entry error handling * Fix generateMetadata metrics * Fix alertType enum * Fix duplicated types * lint:fix * Merge branch 'master' into feat/sw-2863-move-contentstack-router-to-trpc-package * Fix broken imports * Move booking router to trpc package * Merge branch 'master' into feat/sw-2864-move-hotels-router-to-trpc-package Approved-by: Linus Flood
128 lines
3.9 KiB
TypeScript
128 lines
3.9 KiB
TypeScript
import { BreakfastPackageEnum } from "@scandic-hotels/trpc/enums/breakfast"
|
|
import { ChildBedMapEnum } from "@scandic-hotels/trpc/enums/childBedMapEnum"
|
|
import { PackageTypeEnum } from "@scandic-hotels/trpc/enums/packages"
|
|
import {
|
|
breakfastPackageSchema,
|
|
packageSchema,
|
|
} from "@scandic-hotels/trpc/routers/hotels/schemas/packages"
|
|
|
|
import type { Package } from "@scandic-hotels/trpc/types/packages"
|
|
|
|
import type { BreakfastPackage } from "@/types/components/hotelReservation/breakfast"
|
|
import type { Room } from "@/types/stores/booking-confirmation"
|
|
|
|
export function mapToPrice(rooms: (Room | null)[], nights: number) {
|
|
return rooms
|
|
.filter((room): room is Room => !!room)
|
|
.map((room) => {
|
|
let price
|
|
if (room.cheques) {
|
|
price = {
|
|
corporateCheque: {
|
|
additionalPricePerStay: room.roomPrice ? room.roomPrice : undefined,
|
|
currency: room.roomPrice ? room.currencyCode : undefined,
|
|
numberOfCheques: room.cheques,
|
|
},
|
|
}
|
|
} else if (room.roomPoints) {
|
|
price = {
|
|
redemption: {
|
|
additionalPricePerStay: room.roomPrice ? room.roomPrice : undefined,
|
|
currency: room.roomPrice ? room.currencyCode : undefined,
|
|
pointsPerNight: room.roomPoints / nights,
|
|
pointsPerStay: room.roomPoints,
|
|
},
|
|
}
|
|
} else if (room.vouchers) {
|
|
price = {
|
|
voucher: {
|
|
numberOfVouchers: room.vouchers,
|
|
},
|
|
}
|
|
} else {
|
|
price = {
|
|
regular: {
|
|
currency: room.currencyCode,
|
|
pricePerNight: room.roomPrice / nights,
|
|
pricePerStay: room.roomPrice,
|
|
},
|
|
}
|
|
}
|
|
|
|
let breakfast:
|
|
| false
|
|
| undefined
|
|
| Omit<BreakfastPackage, "requestedPrice">
|
|
if (room.breakfast) {
|
|
const breakfastPackage = breakfastPackageSchema.safeParse({
|
|
code: room.breakfast?.code,
|
|
description: room.breakfast?.description,
|
|
localPrice: {
|
|
currency: room.breakfast?.currency,
|
|
price: room.breakfast?.unitPrice,
|
|
totalPrice: room.breakfast?.totalPrice,
|
|
},
|
|
packageType:
|
|
room.breakfast?.code === BreakfastPackageEnum.REGULAR_BREAKFAST
|
|
? PackageTypeEnum.BreakfastAdult
|
|
: "",
|
|
requestedPrice: {
|
|
currency: room.breakfast?.currency,
|
|
price: room.breakfast?.unitPrice,
|
|
totalPrice: room.breakfast?.totalPrice,
|
|
},
|
|
})
|
|
if (breakfastPackage.success) {
|
|
breakfast = breakfastPackage.data
|
|
}
|
|
}
|
|
|
|
if (!room.breakfastIncluded && !breakfast) {
|
|
breakfast = false
|
|
}
|
|
|
|
const packages = room.roomFeatures
|
|
?.map((featPkg) => {
|
|
const pkg = packageSchema.safeParse({
|
|
code: featPkg.code,
|
|
description: featPkg.description,
|
|
inventories: [],
|
|
localPrice: {
|
|
currency: featPkg.currency,
|
|
price: featPkg.unitPrice,
|
|
totalPrice: featPkg.totalPrice,
|
|
},
|
|
requestedPrice: {
|
|
currency: featPkg.currency,
|
|
price: featPkg.unitPrice,
|
|
totalPrice: featPkg.totalPrice,
|
|
},
|
|
})
|
|
if (pkg.success) {
|
|
return pkg.data
|
|
}
|
|
return null
|
|
})
|
|
.filter((pkg): pkg is Package => !!pkg)
|
|
|
|
return {
|
|
...room,
|
|
adults: room.adults,
|
|
bedType: {
|
|
description: room.bedDescription,
|
|
roomTypeCode: room.roomTypeCode || "",
|
|
type: room.bedType,
|
|
},
|
|
breakfast,
|
|
breakfastIncluded: room.rateDefinition.breakfastIncluded,
|
|
childrenInRoom: room.childrenAges?.map((age) => ({
|
|
age,
|
|
bed: ChildBedMapEnum.UNKNOWN,
|
|
})),
|
|
packages,
|
|
price,
|
|
roomType: room.name,
|
|
}
|
|
})
|
|
}
|