@company-manager/docs

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]
    end

Occurrence 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 view

Availability 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:#ffebee

Instructor 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]
    end

Calendar 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)]
    end

Time 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 option

Schedule 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