59 lines
1.6 KiB
TypeScript
59 lines
1.6 KiB
TypeScript
import { z } from 'zod';
|
|
|
|
export const BookingStatusEnum = z.enum([
|
|
'pending',
|
|
'confirmed',
|
|
'checked_in',
|
|
'checked_out',
|
|
'cancelled',
|
|
'no_show',
|
|
]);
|
|
|
|
export const CreateRoomSchema = z.object({
|
|
accountId: z.string().uuid(),
|
|
roomNumber: z.string().min(1),
|
|
name: z.string().optional(),
|
|
roomType: z.string().default('standard'),
|
|
capacity: z.number().int().min(1).default(2),
|
|
floor: z.number().int().optional(),
|
|
pricePerNight: z.number().min(0),
|
|
description: z.string().optional(),
|
|
});
|
|
|
|
export const CreateBookingSchema = z
|
|
.object({
|
|
accountId: z.string().uuid(),
|
|
roomId: z.string().uuid(),
|
|
guestId: z.string().uuid().optional(),
|
|
checkIn: z.string(),
|
|
checkOut: z.string(),
|
|
adults: z.number().int().min(1).default(1),
|
|
children: z.number().int().min(0).default(0),
|
|
status: BookingStatusEnum.default('confirmed'),
|
|
totalPrice: z.number().min(0).optional(),
|
|
notes: z.string().optional(),
|
|
})
|
|
.refine((d) => d.checkOut > d.checkIn, {
|
|
message: 'Abreisedatum muss nach dem Anreisedatum liegen',
|
|
path: ['checkOut'],
|
|
});
|
|
export type CreateBookingInput = z.infer<typeof CreateBookingSchema>;
|
|
|
|
export const UpdateBookingStatusSchema = z.object({
|
|
bookingId: z.string().uuid(),
|
|
status: BookingStatusEnum,
|
|
version: z.number().int().optional(),
|
|
});
|
|
|
|
export const CreateGuestSchema = z.object({
|
|
accountId: z.string().uuid(),
|
|
firstName: z.string().min(1),
|
|
lastName: z.string().min(1),
|
|
email: z.string().email().optional().or(z.literal('')),
|
|
phone: z.string().optional(),
|
|
street: z.string().optional(),
|
|
postalCode: z.string().optional(),
|
|
city: z.string().optional(),
|
|
country: z.string().default('DE'),
|
|
});
|