Merged in feat/SW-874-show-correct-rooms (pull request #883)

Feat/SW-874 show correct rooms

Approved-by: Niclas Edenvin
This commit is contained in:
Pontus Dreij
2024-11-13 19:45:24 +00:00
3 changed files with 118 additions and 12 deletions

View File

@@ -56,7 +56,7 @@ export default function FlexibilityOption({
priceName: name,
public: publicPrice,
member: memberPrice,
features,
features: petRoomPackage ? features : [],
}
handleSelectRate(rate)
}

View File

@@ -2,10 +2,9 @@
import { useCallback, useState } from "react"
import { RoomsAvailability } from "@/server/routers/hotels/output"
import RoomFilter from "../RoomFilter"
import RoomSelection from "../RoomSelection"
import { filterDuplicateRoomTypesByLowestPrice } from "./utils"
import styles from "./rooms.module.css"
@@ -14,6 +13,10 @@ import {
type RoomPackageCodes,
} from "@/types/components/hotelReservation/selectRate/roomFilter"
import type { RoomSelectionProps } from "@/types/components/hotelReservation/selectRate/roomSelection"
import type {
RoomConfiguration,
RoomsAvailability,
} from "@/server/routers/hotels/output"
export default function Rooms({
roomsAvailability,
@@ -21,10 +24,12 @@ export default function Rooms({
user,
packages,
}: Omit<RoomSelectionProps, "selectedPackages">) {
const defaultRooms = roomsAvailability.roomConfigurations
const visibleRooms: RoomConfiguration[] =
filterDuplicateRoomTypesByLowestPrice(roomsAvailability.roomConfigurations)
const [rooms, setRooms] = useState<RoomsAvailability>({
...roomsAvailability,
roomConfigurations: defaultRooms,
roomConfigurations: visibleRooms,
})
const [selectedPackages, setSelectedPackages] = useState<RoomPackageCodes[]>(
[]
@@ -41,20 +46,19 @@ export default function Rooms({
if (filteredPackages.length === 0) {
setRooms({
...roomsAvailability,
roomConfigurations: defaultRooms,
roomConfigurations: visibleRooms,
})
return
}
const filteredRooms = roomsAvailability.roomConfigurations.filter(
(room) =>
filteredPackages.every((filteredPackage) =>
room.features.some((feature) => feature.code === filteredPackage)
)
const filteredRooms = visibleRooms.filter((room) =>
filteredPackages.every((filteredPackage) =>
room.features.some((feature) => feature.code === filteredPackage)
)
)
setRooms({ ...roomsAvailability, roomConfigurations: filteredRooms })
},
[roomsAvailability, defaultRooms]
[roomsAvailability, visibleRooms]
)
return (

View File

@@ -0,0 +1,102 @@
import { RoomConfiguration } from "@/server/routers/hotels/output"
/**
* Get the lowest priced room for each room type that appears more than once.
*/
export function filterDuplicateRoomTypesByLowestPrice(
roomConfigurations: RoomConfiguration[]
) {
const roomTypeCount = roomConfigurations.reduce(
(acc, room) => {
acc[room.roomType] = (acc[room.roomType] || 0) + 1
return acc
},
{} as Record<string, number>
)
const duplicateRoomTypes = new Set(
Object.keys(roomTypeCount).filter((roomType) => roomTypeCount[roomType] > 1)
)
const roomMap = new Map()
roomConfigurations.forEach((room) => {
const { roomType, products } = room
if (!duplicateRoomTypes.has(roomType)) {
roomMap.set(roomType, room)
return
}
products.forEach((product) => {
const { productType } = product
const publicProduct = productType.public
const memberProduct = productType.member || {
requestedPrice: null,
localPrice: null,
}
const {
requestedPrice: publicRequestedPrice,
localPrice: publicLocalPrice,
} = publicProduct
const {
requestedPrice: memberRequestedPrice,
localPrice: memberLocalPrice,
} = memberProduct
const previousLowest = roomMap.get(roomType)
const currentRequestedPrice = Math.min(
Number(publicRequestedPrice.pricePerNight) ?? Infinity,
Number(memberRequestedPrice?.pricePerNight) ?? Infinity
)
const currentLocalPrice = Math.min(
Number(publicLocalPrice.pricePerNight) ?? Infinity,
Number(memberLocalPrice?.pricePerNight) ?? Infinity
)
if (
!previousLowest ||
currentRequestedPrice <
Math.min(
Number(
previousLowest.products[0].productType.public.requestedPrice
.pricePerNight
) ?? Infinity,
Number(
previousLowest.products[0].productType.member?.requestedPrice
?.pricePerNight
) ?? Infinity
) ||
(currentRequestedPrice ===
Math.min(
Number(
previousLowest.products[0].productType.public.requestedPrice
.pricePerNight
) ?? Infinity,
Number(
previousLowest.products[0].productType.member?.requestedPrice
?.pricePerNight
) ?? Infinity
) &&
currentLocalPrice <
Math.min(
Number(
previousLowest.products[0].productType.public.localPrice
.pricePerNight
) ?? Infinity,
Number(
previousLowest.products[0].productType.member?.localPrice
?.pricePerNight
) ?? Infinity
))
) {
roomMap.set(roomType, room)
}
})
})
return Array.from(roomMap.values())
}