import { z } from "zod" import { nullableStringEmailValidator, nullableStringValidator, } from "@scandic-hotels/common/utils/zod/stringValidator" import { calculateRefId } from "../../../utils/refId" const guestSchema = z.object({ email: nullableStringEmailValidator, firstName: nullableStringValidator, lastName: nullableStringValidator, membershipNumber: nullableStringValidator, phoneNumber: nullableStringValidator, countryCode: nullableStringValidator, }) export const createBookingSchema = z .object({ data: z.object({ attributes: z.object({ reservationStatus: z.string(), guest: guestSchema.optional(), paymentUrl: z.string().nullable().optional(), paymentMethod: z.string().nullable().optional(), rooms: z .array( z.object({ confirmationNumber: z.string(), cancellationNumber: z.string().nullable(), priceChangedMetadata: z .object({ roomPrice: z.number(), totalPrice: z.number(), }) .nullable() .optional(), }) ) .default([]), errors: z .array( z.object({ confirmationNumber: z.string().nullable().optional(), errorCode: z.string(), description: z.string().nullable().optional(), meta: z .record(z.string(), z.union([z.string(), z.number()])) .nullable() .optional(), }) ) .default([]), }), type: z.string(), id: z.string(), links: z.object({ self: z.object({ href: z.string().url(), meta: z.object({ method: z.string(), }), }), }), }), }) .transform((d) => ({ id: d.data.id, links: d.data.links, type: d.data.type, reservationStatus: d.data.attributes.reservationStatus, paymentUrl: d.data.attributes.paymentUrl, paymentMethod: d.data.attributes.paymentMethod, rooms: d.data.attributes.rooms.map((room) => { const lastName = d.data.attributes.guest?.lastName ?? "" return { ...room, refId: calculateRefId(room.confirmationNumber, lastName), } }), errors: d.data.attributes.errors, guest: d.data.attributes.guest, }))