59 lines
1.7 KiB
TypeScript
59 lines
1.7 KiB
TypeScript
import { RoomPackageCodeEnum } from "@/types/components/hotelReservation/selectRate/roomFilter"
|
|
import type {
|
|
Rate,
|
|
RateCode,
|
|
} from "@/types/components/hotelReservation/selectRate/selectRate"
|
|
import type { RateSummaryParams } from "./rate-selection"
|
|
|
|
interface CalculateRoomSummaryParams extends RateSummaryParams {
|
|
selectedRate: RateCode
|
|
roomIndex: number
|
|
}
|
|
|
|
export function calculateRoomSummary({
|
|
selectedRate,
|
|
roomIndex,
|
|
getFilteredRooms,
|
|
availablePackages,
|
|
roomCategories,
|
|
selectedPackagesByRoom,
|
|
}: CalculateRoomSummaryParams): Rate | null {
|
|
const filteredRooms = getFilteredRooms(roomIndex)
|
|
const selectedPackages = selectedPackagesByRoom[roomIndex] || []
|
|
|
|
const room = filteredRooms.find(
|
|
(room) => room.roomTypeCode === selectedRate.roomTypeCode
|
|
)
|
|
if (!room) return null
|
|
|
|
const product = room.products.find(
|
|
(product) =>
|
|
product.productType.public.rateCode === selectedRate.publicRateCode
|
|
)
|
|
if (!product) return null
|
|
|
|
const petRoomPackage = selectedPackages.includes(RoomPackageCodeEnum.PET_ROOM)
|
|
? availablePackages.find((pkg) => pkg.code === RoomPackageCodeEnum.PET_ROOM)
|
|
: undefined
|
|
|
|
const features = filteredRooms.find((room) =>
|
|
room.features.some(
|
|
(feature) => feature.code === RoomPackageCodeEnum.PET_ROOM
|
|
)
|
|
)?.features
|
|
|
|
const roomType = roomCategories.find((roomCategory) =>
|
|
roomCategory.roomTypes.some((type) => type.code === room.roomTypeCode)
|
|
)
|
|
|
|
return {
|
|
features: petRoomPackage && features ? features : [],
|
|
priceName: selectedRate.name,
|
|
priceTerm: selectedRate.paymentTerm,
|
|
public: product.productType.public,
|
|
member: product.productType.member,
|
|
roomType: roomType?.name ?? room.roomType,
|
|
roomTypeCode: room.roomTypeCode,
|
|
}
|
|
}
|