import { dt } from "@/lib/dt" import { sumPackages } from "@/components/HotelReservation/utils" import { PriceTypeEnum } from "@/types/components/hotelReservation/myStay/myStay" import type { Price } from "@/types/components/hotelReservation/price" import { CurrencyEnum } from "@/types/enums/currency" import type { Room } from "@/stores/my-stay/myStayRoomDetailsStore" export function mapToPrice(room: Room) { switch (room.priceType) { case PriceTypeEnum.cheque: return { corporateCheque: { additionalPricePerStay: room.roomPrice.perStay.local.price, currency: room.roomPrice.perStay.local.currency, numberOfCheques: room.cheques, }, } case PriceTypeEnum.money: return { regular: { currency: room.currencyCode, pricePerNight: room.roomPrice.perNight, pricePerStay: room.roomPrice.perStay, }, } case PriceTypeEnum.points: const nights = dt(room.checkOutDate) .startOf("day") .diff(dt(room.checkInDate).startOf("day"), "days") return { redemption: { additionalPricePerStay: room.roomPrice.perStay.local.price, currency: room.roomPrice.perStay.local.currency, pointsPerNight: room.roomPoints / nights, pointsPerStay: room.roomPoints, }, } case PriceTypeEnum.voucher: return { voucher: { numberOfVouchers: room.vouchers, }, } default: throw new Error(`Unknown payment method!`) } } export function calculateTotalPrice(rooms: Room[], currency: CurrencyEnum) { return rooms.reduce( (total, room) => { const pkgsSum = sumPackages(room.packages) let breakfastPrice = 0 if (room.breakfast && !room.rateDefinition.breakfastIncluded) { breakfastPrice = room.breakfast.localPrice.totalPrice } switch (room.priceType) { case PriceTypeEnum.cheque: { total.local.currency = CurrencyEnum.CC total.local.price = total.local.price + room.cheques } break case PriceTypeEnum.money: { total.local.price = total.local.price + room.roomPrice.perStay.local.price + pkgsSum.price + breakfastPrice if (!total.local.currency) { total.local.currency = room.currencyCode } } break case PriceTypeEnum.points: { total.local.currency = CurrencyEnum.POINTS total.local.price = total.local.price + room.roomPoints } break case PriceTypeEnum.voucher: total.local.currency = CurrencyEnum.Voucher total.local.price = total.local.price + room.vouchers break } switch (room.priceType) { case PriceTypeEnum.cheque: case PriceTypeEnum.points: case PriceTypeEnum.voucher: { if (room.roomPrice.perStay.local.price || pkgsSum) { total.local.additionalPrice = room.roomPrice.perStay.local.price + pkgsSum.price + breakfastPrice } if (!total.local.additionalPriceCurrency) { if (room.roomPrice.perStay.local.currency) { total.local.additionalPriceCurrency = room.roomPrice.perStay.local.currency } else { total.local.additionalPriceCurrency = currency } } } break } return total }, { local: { currency, price: 0, }, requested: undefined, } ) }