import { dt } from "@/lib/dt" 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 "@/types/stores/my-stay" export function mapToPrice(room: Room) { switch (room.priceType) { case PriceTypeEnum.cheque: return { corporateCheque: { additionalPricePerStay: room.totalPrice, currency: room.roomPrice.perStay.local.currency, numberOfCheques: room.cheques, }, } case PriceTypeEnum.money: return { regular: { currency: room.currencyCode, pricePerNight: room.roomPrice.perNight.local.price, pricePerStay: room.totalPrice, }, } case PriceTypeEnum.points: const nights = dt(room.checkOutDate) .startOf("day") .diff(dt(room.checkInDate).startOf("day"), "days") return { redemption: { additionalPricePerStay: room.totalPrice, currency: room.currencyCode, 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) => { 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.totalPrice 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.totalPrice) { total.local.additionalPrice = (total.local.additionalPrice || 0) + room.totalPrice } if (!total.local.additionalPriceCurrency) { if (room.currencyCode) { total.local.additionalPriceCurrency = room.currencyCode } else { total.local.additionalPriceCurrency = currency } } } break } return total }, { local: { currency, price: 0, }, requested: undefined, } ) }