Reservation Types
Booking and reservation type definitions
Type definitions for the Reservation module.
Service
interface Service {
id: string;
businessId: string;
name: string;
slug: string;
description?: string;
duration: number; // minutes
price: number; // cents
bufferBefore?: number; // minutes
bufferAfter?: number; // minutes
maxParticipants?: number;
status: ResourceStatus;
images: string[];
metadata?: Record<string, unknown>;
createdAt: number;
updatedAt: number;
}
Provider
interface Provider {
id: string;
businessId: string;
name: string;
slug: string;
email?: string;
phone?: string;
bio?: string;
image?: string;
services: string[]; // Service IDs
status: ResourceStatus;
createdAt: number;
updatedAt: number;
}
Reservation
interface Reservation {
id: string;
businessId: string;
status: ReservationStatus;
service: Service;
provider: Provider;
customer: Customer;
startTime: number;
endTime: number;
duration: number;
price: number;
discount?: number;
total: number;
promoCode?: string;
notes?: string;
payment?: Payment;
cancellationReason?: string;
cancelledAt?: number;
createdAt: number;
updatedAt: number;
}
type ReservationStatus =
| 'PENDING'
| 'CONFIRMED'
| 'CANCELLED'
| 'COMPLETED'
| 'NOSHOW';
Time Slot
interface TimeSlot {
date: string; // YYYY-MM-DD
startTime: number; // Unix timestamp
endTime: number; // Unix timestamp
available: boolean;
providerId?: string;
serviceId?: string;
}
Working Time
interface WorkingTime {
providerId: string;
date: string;
slots: TimeSlot[];
}
Schedule
interface Schedule {
providerId: string;
dayOfWeek: DayOfWeek;
startTime: string; // HH:mm
endTime: string; // HH:mm
breakStart?: string;
breakEnd?: string;
}
type DayOfWeek =
| 'MONDAY'
| 'TUESDAY'
| 'WEDNESDAY'
| 'THURSDAY'
| 'FRIDAY'
| 'SATURDAY'
| 'SUNDAY';
Bulk Schedule Params
interface BulkScheduleParams {
businessId: string;
serviceId: string;
providerId: string;
schedule: {
startDate: string; // YYYY-MM-DD
endDate: string; // YYYY-MM-DD
days: DayOfWeek[];
startTime: string; // HH:mm
endTime: string; // HH:mm
slotDuration: number; // minutes
};
}
Quote
interface ReservationQuote {
slots: QuoteSlot[];
subtotal: number;
discount: number;
tax: number;
total: number;
promoCode?: PromoCodeInfo;
}
interface QuoteSlot {
serviceId: string;
serviceName: string;
providerId?: string;
providerName?: string;
startTime: number;
endTime: number;
price: number;
available: boolean;
}
Checkout Response
interface ReservationCheckoutResponse {
reservation: Reservation;
requiresAction: boolean;
clientSecret?: string;
redirectUrl?: string;
}
Cart (Client-Side)
interface ReservationCartItem {
slotId: string;
serviceId: string;
serviceName: string;
providerId?: string;
providerName?: string;
startTime: number;
endTime: number;
price: number;
}
interface ReservationCart {
items: ReservationCartItem[];
total: number;
}
Calendar Event
interface CalendarEvent {
id: string;
type: 'RESERVATION' | 'BLOCKED' | 'BREAK';
title: string;
startTime: number;
endTime: number;
providerId: string;
serviceId?: string;
reservationId?: string;
customer?: {
name: string;
email: string;
phone?: string;
};
}
Availability Query
interface AvailabilityQuery {
businessId: string;
serviceId: string;
providerId?: string; // null = any provider
startDate: string; // YYYY-MM-DD
endDate: string; // YYYY-MM-DD
timezone?: string;
}
interface AvailabilityResponse {
dates: {
[date: string]: TimeSlot[];
};
providers: Provider[];
}
Reminder
interface ReservationReminder {
reservationId: string;
type: 'EMAIL' | 'SMS' | 'PUSH';
scheduledFor: number;
sentAt?: number;
status: 'PENDING' | 'SENT' | 'FAILED';
}
Filter & Sort Options
interface ReservationFilters {
status?: ReservationStatus;
providerId?: string;
serviceId?: string;
customerId?: string;
from?: number;
to?: number;
}
interface ReservationSort {
field: 'startTime' | 'createdAt';
order: 'asc' | 'desc';
}