Availability Management
Time slot management, capacity tracking, and calendar diagrams
Availability Management
This page covers event scheduling, time slot management, and capacity tracking.
Availability Model
flowchart TD
subgraph "Event Configuration"
EVENT[Event] --> CAPACITY[Max Capacity]
EVENT --> DURATION[Duration]
EVENT --> BUFFER[Buffer Time]
EVENT --> RECURRENCE[Recurrence Pattern]
end
subgraph "Occurrence Generation"
RECURRENCE --> GENERATE[Generate Occurrences]
GENERATE --> SLOTS[Time Slots]
SLOTS --> AVAILABLE[Available Spots]
end
subgraph "Booking Impact"
BOOKING[New Booking] --> DECREMENT[Decrement Available]
CANCEL[Cancellation] --> INCREMENT[Increment Available]
end
AVAILABLE --> CHECK{Spots > 0?}
CHECK -->|Yes| OPEN[Open for Booking]
CHECK -->|No| FULL[Show Full/Waitlist]Recurrence Pattern Types
flowchart TD
PATTERN[Recurrence Pattern] --> TYPE{Type}
TYPE --> DAILY[Daily]
TYPE --> WEEKLY[Weekly]
TYPE --> MONTHLY[Monthly]
TYPE --> CUSTOM[Custom]
subgraph "Weekly Options"
WEEKLY --> DAYS[Select Days]
DAYS --> MON[Monday]
DAYS --> TUE[Tuesday]
DAYS --> WED[Wednesday]
DAYS --> THU[Thursday]
DAYS --> FRI[Friday]
DAYS --> SAT[Saturday]
DAYS --> SUN[Sunday]
end
subgraph "Monthly Options"
MONTHLY --> MTYPE{Monthly Type}
MTYPE --> DOM[Day of Month]
MTYPE --> DOW[Day of Week]
DOM --> D1[1st, 15th, etc.]
DOW --> D2[First Monday, etc.]
end
subgraph "Limits"
PATTERN --> END{End Condition}
END --> DATE[Until Date]
END --> COUNT[After N Occurrences]
END --> NEVER[No End]
endOccurrence Generation
sequenceDiagram
participant Admin
participant UI as Event UI
participant API as TRPC Router
participant Service as Event Service
participant DB as Database
Admin->>UI: Create recurring event
UI->>API: createEvent(eventData, recurrence)
API->>Service: createEventWithRecurrence(data)
Service->>Service: Parse recurrence rule
Service->>Service: Calculate occurrences
loop For each occurrence
Service->>DB: Create EventOccurrence
Note over Service: startTime, endTime, availableSpots
end
Service->>DB: Save event with recurrence rule
DB-->>Service: Event created
Service-->>API: Event + occurrences
API-->>UI: Show calendar viewAvailability Check Flow
flowchart TD
REQUEST[Check Availability] --> GET[Get Occurrence]
GET --> CALC[Calculate Available]
CALC --> CAPACITY[Event Capacity]
CALC --> BOOKED[Confirmed Bookings]
CALC --> HELD[Held/Pending]
CAPACITY --> FORMULA[Available = Capacity - Booked - Held]
BOOKED --> FORMULA
HELD --> FORMULA
FORMULA --> RESULT{Available > 0?}
RESULT -->|Yes| AVAILABLE[Spots Available]
RESULT -->|No| CHECK_WL{Waitlist Enabled?}
CHECK_WL -->|Yes| WAITLIST[Show Waitlist Option]
CHECK_WL -->|No| FULL[Show Full]
AVAILABLE --> DISPLAY[Display Available Count]
style AVAILABLE fill:#e8f5e9
style FULL fill:#ffebeeInstructor Availability
flowchart TD
INSTRUCTOR[Instructor] --> SCHEDULE[Working Schedule]
SCHEDULE --> REGULAR[Regular Hours]
SCHEDULE --> EXCEPTIONS[Exceptions]
REGULAR --> DAYS[Available Days]
REGULAR --> HOURS[Working Hours]
EXCEPTIONS --> VACATION[Vacation/Leave]
EXCEPTIONS --> SPECIAL[Special Availability]
subgraph "Conflict Detection"
EVENT[Schedule Event] --> CHECK[Check Instructor Availability]
CHECK --> CONFLICTS{Conflicts?}
CONFLICTS -->|Yes| ALERT[Show Conflict Alert]
CONFLICTS -->|No| ALLOW[Allow Scheduling]
endCalendar View Data
flowchart TD
REQUEST[Calendar Request] --> PARAMS[Parameters]
PARAMS --> DATE_RANGE[Date Range]
PARAMS --> FILTERS[Filters]
DATE_RANGE --> START[Start Date]
DATE_RANGE --> END[End Date]
FILTERS --> CATEGORY[Category]
FILTERS --> INSTRUCTOR[Instructor]
FILTERS --> LOCATION[Location]
subgraph "Data Aggregation"
START --> QUERY[Query Occurrences]
END --> QUERY
CATEGORY --> QUERY
INSTRUCTOR --> QUERY
LOCATION --> QUERY
QUERY --> OCCURRENCES[Event Occurrences]
OCCURRENCES --> ENRICH[Enrich with Booking Data]
ENRICH --> FORMAT[Format for Calendar]
end
FORMAT --> RESPONSE[Calendar Data]Capacity Management Scenarios
flowchart TD
subgraph "Overbooking Prevention"
BOOK[Booking Request] --> LOCK[Lock Occurrence]
LOCK --> CHECK[Check Availability]
CHECK --> AVAILABLE{Available?}
AVAILABLE -->|Yes| CONFIRM[Create Booking]
AVAILABLE -->|No| REJECT[Reject/Waitlist]
CONFIRM --> UNLOCK[Unlock Occurrence]
REJECT --> UNLOCK
end
subgraph "Capacity Change"
CHANGE[Change Capacity] --> COMPARE{New < Current?}
COMPARE -->|Yes| OVERBOOKED[Check for Overbooking]
COMPARE -->|No| APPLY[Apply Change]
OVERBOOKED --> RESOLVE{Resolve?}
RESOLVE --> NOTIFY[Notify Affected]
RESOLVE --> CANCEL[Cancel Excess]
RESOLVE --> KEEP[Keep (Allow Overbook)]
endTime Slot ERD
erDiagram
EVENT ||--o{ EVENT_OCCURRENCE : scheduled_as
EVENT_OCCURRENCE ||--o{ EVENT_BOOKING : has
INSTRUCTOR ||--o{ INSTRUCTOR_AVAILABILITY : has
LOCATION ||--o{ LOCATION_AVAILABILITY : has
EVENT_OCCURRENCE {
string id PK
string eventId FK
timestamp startTime
timestamp endTime
int capacity
int availableSpots
enum status
string locationId FK
string instructorId FK
}
INSTRUCTOR_AVAILABILITY {
string id PK
string instructorId FK
enum dayOfWeek
time startTime
time endTime
boolean isAvailable
}
LOCATION_AVAILABILITY {
string id PK
string locationId FK
timestamp startTime
timestamp endTime
boolean isBlocked
string reason
}Real-Time Availability Updates
sequenceDiagram
participant User1 as User 1
participant User2 as User 2
participant UI as UI (WebSocket)
participant Server as Server
participant DB as Database
Note over User1,User2: Both viewing same event
User1->>Server: Book last spot
Server->>DB: Create booking
DB-->>Server: Success
Server->>Server: Update availability
Server->>UI: Broadcast: spots = 0
UI->>User1: "Booking confirmed"
UI->>User2: "Event now full"
Note over User2: Cannot book, sees waitlist optionSchedule Conflict Detection
flowchart TD
NEW_EVENT[New Event/Occurrence] --> CHECK_ALL[Check Conflicts]
CHECK_ALL --> INSTRUCTOR_CONFLICT[Instructor Conflicts]
CHECK_ALL --> LOCATION_CONFLICT[Location Conflicts]
CHECK_ALL --> ATTENDEE_CONFLICT[Attendee Conflicts]
INSTRUCTOR_CONFLICT --> I_RESULT{Conflict?}
I_RESULT -->|Yes| I_ALERT[Instructor Double-Booked]
I_RESULT -->|No| CONTINUE1[Continue]
LOCATION_CONFLICT --> L_RESULT{Conflict?}
L_RESULT -->|Yes| L_ALERT[Location Double-Booked]
L_RESULT -->|No| CONTINUE2[Continue]
CONTINUE1 --> FINAL
CONTINUE2 --> FINAL
I_ALERT --> RESOLVE
L_ALERT --> RESOLVE
FINAL{All Clear?} -->|Yes| CREATE[Create Event]
RESOLVE[Resolve Conflict] --> CHECK_ALL
style CREATE fill:#e8f5e9