Merged in feat/SW-1356-reward-night-booking-2- (pull request #1559)

feat: SW-1356 Reward night bookingflow

* feat: SW-1356 Reward night bookingflow

* feat: SW-1356 Removed extra param booking call

* feat: SW-1356 Optimized as review comments

* feat: SW-1356 Schema validation updates

* feat: SW-1356 Fix after rebase

* feat: SW-1356 Optimised price.redemptions check

* feat: SW-1356 Updated Props naming


Approved-by: Arvid Norlin
This commit is contained in:
Hrishikesh Vaipurkar
2025-03-24 08:54:02 +00:00
parent b972679c6e
commit c5e294c7ea
57 changed files with 1113 additions and 657 deletions

View File

@@ -9,8 +9,6 @@ export const productTypeSchema = z
.object({
public: productTypePriceSchema.optional(),
member: productTypePriceSchema.optional(),
redemption: productTypePointsSchema.optional(),
redemptionA: productTypePointsSchema.optional(),
redemptionB: productTypePointsSchema.optional(),
redemptions: z.array(productTypePointsSchema).optional(),
})
.optional()

View File

@@ -10,22 +10,31 @@ export const priceSchema = z.object({
regularPricePerStay: z.coerce.number().optional(),
})
export const pointsSchema = z.object({
currency: z.nativeEnum(CurrencyEnum).optional(),
pricePerNight: z.coerce.number().optional(),
pricePerStay: z.coerce.number().optional(),
pointsPerNight: z.number(),
pointsPerStay: z.number(),
})
export const pointsSchema = z
.object({
currency: z.nativeEnum(CurrencyEnum).optional(),
pricePerStay: z.coerce.number().optional(),
pointsPerStay: z.coerce.number(),
additionalPricePerStay: z.coerce.number().optional(),
additionalPriceCurrency: z.nativeEnum(CurrencyEnum).optional(),
})
.transform((data) => ({
...data,
additionalPriceCurrency: data.currency,
currency: CurrencyEnum.POINTS,
pricePerStay: data.pointsPerStay,
price: data.pointsPerStay,
additionalPrice: data.additionalPricePerStay,
}))
const partialPriceSchema = z.object({
rateCode: z.string(),
rateType: z.string().optional(),
requestedPrice: priceSchema.optional(),
})
export const productTypePriceSchema = partialPriceSchema.extend({
localPrice: priceSchema,
requestedPrice: priceSchema.optional(),
})
export const productTypePointsSchema = partialPriceSchema.extend({

View File

@@ -29,21 +29,25 @@ export const roomConfigurationSchema = z
})
.transform((data) => {
if (data.products.length) {
/**
* Just guaranteeing that if all products all miss
* both public and member rateCode that status is
* set to `NotAvailable`
*/
const allProductsMissBothRateCodes = data.products.every(
(product) => !product.public?.rateCode && !product.member?.rateCode
)
if (allProductsMissBothRateCodes) {
return {
...data,
status: AvailabilityEnum.NotAvailable,
if (data.products[0].redemptions) {
// No need of rate check in reward night scenario
return { ...data }
} else {
/**
* Just guaranteeing that if all products all miss
* both public and member rateCode that status is
* set to `NotAvailable`
*/
const allProductsMissBothRateCodes = data.products.every(
(product) => !product.public?.rateCode && !product.member?.rateCode
)
if (allProductsMissBothRateCodes) {
return {
...data,
status: AvailabilityEnum.NotAvailable,
}
}
}
}
return data
})

View File

@@ -1,6 +1,9 @@
import { z } from "zod"
import { productTypePriceSchema } from "../productTypePrice"
import {
productTypePointsSchema,
productTypePriceSchema,
} from "../productTypePrice"
export const productSchema = z
.object({
@@ -9,6 +12,7 @@ export const productSchema = z
productType: z.object({
member: productTypePriceSchema.optional(),
public: productTypePriceSchema.optional(),
redemptions: z.array(productTypePointsSchema).optional(),
}),
// Used to set the rate that we use to chose titles etc.
rate: z.enum(["change", "flex", "save"]).default("save"),