Merged in fix/SW-1631-rate-terms-modal (pull request #1699)

fix(SW-1631): add rate terms modal

* fix(SW-1631): add rate terms modal


Approved-by: Simon.Emanuelsson
This commit is contained in:
Arvid Norlin
2025-04-02 09:36:53 +00:00
parent be04600863
commit 961e8aea91
26 changed files with 690 additions and 59 deletions

View File

@@ -60,6 +60,24 @@ export default function Campaign({
)
}
const rateTermDetails = product.rateDefinitionMember
? [
{
title: product.rateDefinition.title,
terms: product.rateDefinition.generalTerms,
},
{
title: product.rateDefinitionMember.title,
terms: product.rateDefinition.generalTerms,
},
]
: [
{
title: product.rateDefinition.title,
terms: product.rateDefinition.generalTerms,
},
]
const isSelected = isSelectedPriceProduct(
product,
selectedRate,
@@ -149,6 +167,7 @@ export default function Campaign({
}
: undefined
}
rateTermDetails={rateTermDetails}
value={product.public.rateCode}
/>
)

View File

@@ -43,6 +43,23 @@ export default function Code({
} else {
bannerText = `${bookingCode}${intl.formatMessage({ id: "Breakfast excluded" })}`
}
const rateTermDetails = product.rateDefinitionMember
? [
{
title: product.rateDefinition.title,
terms: product.rateDefinition.generalTerms,
},
{
title: product.rateDefinitionMember.title,
terms: product.rateDefinition.generalTerms,
},
]
: [
{
title: product.rateDefinition.title,
terms: product.rateDefinition.generalTerms,
},
]
if ("corporateCheque" in product) {
const { localPrice, rateCode } = product.corporateCheque
@@ -71,6 +88,7 @@ export default function Code({
unit: localPrice.currency ?? "",
}}
rateTitle={rateTitles[product.rate].title}
rateTermDetails={rateTermDetails}
value={rateCode}
/>
)
@@ -93,6 +111,7 @@ export default function Code({
unit: intl.formatMessage({ id: "Voucher" }).toUpperCase(),
}}
rateTitle={rateTitles[product.rate].title}
rateTermDetails={rateTermDetails}
value={rateCode}
/>
)
@@ -151,6 +170,7 @@ export default function Code({
unit: `${localPrice.currency}/${night}`,
}}
rateTitle={rateTitles[product.rate].title}
rateTermDetails={rateTermDetails}
value={rateCode}
/>
)

View File

@@ -76,6 +76,13 @@ export default function Redemptions({
? `${rewardNight}${breakfastIncluded}`
: `${rewardNight}${breakfastExcluded}`
const rateTermDetails = [
{
title: rateTitles[firstRedemption.rate].title,
terms: firstRedemption.rateDefinition.generalTerms,
},
]
return (
<PointsRateCard
key={firstRedemption.rate}
@@ -84,6 +91,7 @@ export default function Redemptions({
paymentTerm={rateTitles[firstRedemption.rate].paymentTerm}
rates={rates}
rateTitle={rateTitles[firstRedemption.rate].title}
rateTermDetails={rateTermDetails}
selectedRate={selectedRateCode}
isNotEnoughPoints={notEnoughPoints}
notEnoughPointsText={intl.formatMessage({ id: "Not enough points" })}

View File

@@ -145,6 +145,24 @@ export default function Regular({
roomTypeCode
)
const rateTermDetails = product.rateDefinitionMember
? [
{
title: product.rateDefinition.title,
terms: product.rateDefinition.generalTerms,
},
{
title: product.rateDefinitionMember.title,
terms: product.rateDefinition.generalTerms,
},
]
: [
{
title: product.rateDefinition.title,
terms: product.rateDefinition.generalTerms,
},
]
return (
<RegularRateCard
{...rates}
@@ -157,6 +175,7 @@ export default function Regular({
paymentTerm={rateTitles[product.rate].paymentTerm}
rateTitle={rateTitles[product.rate].title}
value={rateCode}
rateTermDetails={rateTermDetails}
/>
)
})

View File

@@ -57,7 +57,6 @@ export default function Rates({
petRoomPackageSelected && petRoomPackage ? petRoomPackage : undefined,
roomTypeCode,
}
const showAllRates = selectedFilter === BookingCodeFilterEnum.All
const hasBookingCodeRates = !!(campaign.length || code.length)
const hasRegularRates = !!regular.length

View File

@@ -338,12 +338,15 @@ export const roomsAvailabilitySchema = z
...product,
public: null,
})
if (rateDetailsMember) {
breakfastIncludedMember.push(
rateDetailsMember.breakfastIncluded
)
}
if (rateDetails && rateCode) {
if (rateDetailsMember) {
breakfastIncludedMember.push(
rateDetailsMember.breakfastIncluded
)
rateDetails.rateDefinitionMember =
rateDetailsMember.rateDefinition
}
const rateDefinition = findRateDefintion(rateCode)
if (rateDefinition) {
switch (rateDefinition.rateType) {

View File

@@ -18,7 +18,7 @@ const baseProductSchema = z.object({
breakfastIncluded: z.boolean().default(false),
// Used to set the rate that we use to chose titles etc.
rate: z.enum(["change", "flex", "save"]).default("save"),
rateDefinition: rateDefinitionSchema.nullish().transform((val) =>
rateDefinition: rateDefinitionSchema.optional().transform((val) =>
val
? val
: {
@@ -36,6 +36,7 @@ const baseProductSchema = z.object({
title: "",
}
),
rateDefinitionMember: rateDefinitionSchema.optional(),
})
function mapBaseProduct(baseProduct: typeof baseProductSchema._type) {
@@ -44,6 +45,7 @@ function mapBaseProduct(baseProduct: typeof baseProductSchema._type) {
breakfastIncluded: baseProduct.breakfastIncluded,
rate: baseProduct.rate,
rateDefinition: baseProduct.rateDefinition,
rateDefinitionMember: baseProduct.rateDefinitionMember,
}
}
@@ -98,12 +100,14 @@ export const redemptionsProduct = z
breakfastIncluded,
rate,
rateDefinition,
rateDefinitionMember,
...redemption
}) => ({
bookingCode,
breakfastIncluded,
rate,
rateDefinition,
rateDefinitionMember,
redemption,
})
)

View File

@@ -1,6 +1,7 @@
import { nullableStringValidator } from "@/utils/zod/stringValidator"
import { z } from "zod"
import { nullableStringValidator } from "@/utils/zod/stringValidator"
export const rateDefinitionSchema = z.object({
breakfastIncluded: z.boolean(),
cancellationRule: z.string(),

View File

@@ -8,11 +8,9 @@ export interface RatesProps {
roomConfiguration: RoomConfiguration
}
export interface SharedRateCardProps extends Pick<
RoomConfiguration,
"roomTypeCode"
> {
export interface SharedRateCardProps
extends Pick<RoomConfiguration, "roomTypeCode"> {
handleSelectRate: (product: Product) => void
nights: number
petRoomPackage: NonNullable<Packages>[number] | undefined
}
}