import { dt } from "@/lib/dt" import { sumPackages } from "../../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 "@/types/stores/my-stay" 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.local.price, pricePerStay: room.roomPrice.perStay.local.price, regularPricePerStay: room.roomPrice.perStay.local.regularPrice || room.roomPrice.perStay.local.price, }, } 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.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.totalPoints } 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: { if (room.totalPrice) { total.local.additionalPrice = (total.local.additionalPrice || 0) + room.totalPrice } if (!total.local.additionalPriceCurrency) { total.local.additionalPriceCurrency = currency } } break case PriceTypeEnum.voucher: { if (room.packages) { const pkgsSum = sumPackages(room.packages) total.local.additionalPrice = (total.local.additionalPrice || 0) + pkgsSum.price if (pkgsSum.currency) { total.local.additionalPriceCurrency = pkgsSum.currency } else { total.local.additionalPriceCurrency = currency } } } break } return total }, { local: { currency, price: 0, }, requested: undefined, } ) }