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';
}