From d67affd6778577e03c33497abf594c8fcd9ff32c Mon Sep 17 00:00:00 2001 From: Christel Westerberg Date: Mon, 18 Nov 2024 10:54:35 +0100 Subject: [PATCH] fix: update booking service schemas --- .../(standard)/[step]/page.tsx | 8 ++--- .../BookingConfirmation/Details/index.tsx | 2 +- .../EnterDetails/Payment/index.tsx | 6 ++++ server/routers/booking/input.ts | 36 ++++++++++++++----- server/routers/booking/output.ts | 24 +++++++++++-- .../hotelReservation/selectRate/section.ts | 2 +- 6 files changed, 61 insertions(+), 17 deletions(-) diff --git a/app/[lang]/(live)/(public)/hotelreservation/(standard)/[step]/page.tsx b/app/[lang]/(live)/(public)/hotelreservation/(standard)/[step]/page.tsx index 70aef0ada..ae04c61a6 100644 --- a/app/[lang]/(live)/(public)/hotelreservation/(standard)/[step]/page.tsx +++ b/app/[lang]/(live)/(public)/hotelreservation/(standard)/[step]/page.tsx @@ -107,10 +107,10 @@ export default async function StepPage({ id: "Select payment method", }) - const roomPrice = - user && roomAvailability.memberRate - ? roomAvailability.memberRate?.localPrice.pricePerStay - : roomAvailability.publicRate!.localPrice.pricePerStay + const roomPrice = { + memberPrice: roomAvailability.memberRate?.localPrice.pricePerStay, + publicPrice: roomAvailability.publicRate!.localPrice.pricePerStay, + } return (
diff --git a/components/HotelReservation/BookingConfirmation/Details/index.tsx b/components/HotelReservation/BookingConfirmation/Details/index.tsx index 956ad8e45..5d23e55a8 100644 --- a/components/HotelReservation/BookingConfirmation/Details/index.tsx +++ b/components/HotelReservation/BookingConfirmation/Details/index.tsx @@ -49,7 +49,7 @@ export default async function Details({
  • {intl.formatMessage({ id: "Cancellation policy" })} - N/A + {booking.rateDefinition.cancellationText}
  • {intl.formatMessage({ id: "Rebooking" })} diff --git a/components/HotelReservation/EnterDetails/Payment/index.tsx b/components/HotelReservation/EnterDetails/Payment/index.tsx index 303fc2d5c..84caf0967 100644 --- a/components/HotelReservation/EnterDetails/Payment/index.tsx +++ b/components/HotelReservation/EnterDetails/Payment/index.tsx @@ -77,6 +77,9 @@ export default function Payment({ breakfast, bedType, membershipNo, + join, + dateOfBirth, + zipCode, } = userData const { toDate, fromDate, rooms: rooms, hotel } = roomData @@ -181,6 +184,9 @@ export default function Payment({ phoneNumber, countryCode, membershipNumber: membershipNo, + becomeMember: join, + dateOfBirth, + postalCode: zipCode, }, packages: { breakfast: breakfast !== BreakfastPackageEnum.NO_BREAKFAST, diff --git a/server/routers/booking/input.ts b/server/routers/booking/input.ts index 4c7d802ef..f838d201f 100644 --- a/server/routers/booking/input.ts +++ b/server/routers/booking/input.ts @@ -2,6 +2,15 @@ import { z } from "zod" import { ChildBedTypeEnum } from "@/constants/booking" +const signupSchema = z.discriminatedUnion("becomeMember", [ + z.object({ + dateOfBirth: z.string(), + postalCode: z.string(), + becomeMember: z.literal(true), + }), + z.object({ becomeMember: z.literal(false) }), +]) + const roomsSchema = z.array( z.object({ adults: z.number().int().nonnegative(), @@ -15,14 +24,17 @@ const roomsSchema = z.array( .default([]), rateCode: z.string(), roomTypeCode: z.coerce.string(), - guest: z.object({ - firstName: z.string(), - lastName: z.string(), - email: z.string().email(), - phoneNumber: z.string(), - countryCode: z.string(), - membershipNumber: z.string().optional(), - }), + guest: z.intersection( + z.object({ + firstName: z.string(), + lastName: z.string(), + email: z.string().email(), + phoneNumber: z.string(), + countryCode: z.string(), + membershipNumber: z.string().optional(), + }), + signupSchema + ), smsConfirmationRequested: z.boolean(), packages: z.object({ breakfast: z.boolean(), @@ -30,7 +42,13 @@ const roomsSchema = z.array( petFriendly: z.boolean(), accessibility: z.boolean(), }), - roomPrice: z.number().or(z.string().transform((val) => Number(val))), + roomPrice: z.object({ + publicPrice: z.number().or(z.string().transform((val) => Number(val))), + memberPrice: z + .number() + .or(z.string().transform((val) => Number(val))) + .optional(), + }), }) ) diff --git a/server/routers/booking/output.ts b/server/routers/booking/output.ts index 5fd34ac00..83a185e1e 100644 --- a/server/routers/booking/output.ts +++ b/server/routers/booking/output.ts @@ -15,7 +15,18 @@ export const createBookingSchema = z cancellationNumber: z.string().nullable(), reservationStatus: z.string(), paymentUrl: z.string().nullable(), - metadata: z.any(), // TODO: define metadata schema (not sure what it does) + metadata: z + .object({ + errorCode: z.number().optional(), + errorMessage: z.string().optional(), + priceChangedMetadata: z + .object({ + roomPrice: z.number().optional(), + totalPrice: z.number().optional(), + }) + .optional(), + }) + .nullable(), }), type: z.string(), id: z.string(), @@ -77,7 +88,16 @@ export const bookingConfirmationSchema = z guest: guestSchema, hotelId: z.string(), packages: z.array(packageSchema), - rateCode: z.string(), + rateDefinition: z.object({ + rateCode: z.string(), + title: z.string().nullable(), + breakfastIncluded: z.boolean(), + isMemberRate: z.boolean(), + generalTerms: z.array(z.string()).optional(), + cancellationRule: z.string().optional(), + cancellationText: z.string().optional(), + mustBeGuaranteed: z.boolean(), + }), reservationStatus: z.string(), roomPrice: z.number().int(), roomTypeCode: z.string(), diff --git a/types/components/hotelReservation/selectRate/section.ts b/types/components/hotelReservation/selectRate/section.ts index 578819fb1..05d86ff6c 100644 --- a/types/components/hotelReservation/selectRate/section.ts +++ b/types/components/hotelReservation/selectRate/section.ts @@ -28,7 +28,7 @@ export interface BreakfastSelectionProps extends SectionProps { export interface DetailsProps extends SectionProps {} export interface PaymentProps { - roomPrice: number + roomPrice: { publicPrice: number; memberPrice: number | undefined } otherPaymentOptions: string[] savedCreditCards: CreditCard[] | null mustBeGuaranteed: boolean