# Business Domain — Meetings (+ Committees & Demos)

> Scheduling and the monthly committee/demo events.

_Verified against `app/Models/{Meeting,Committee,Demo}.php`, routes, and services on 2026-07-23._

---

## Meeting
`Meeting` (`app/Models/Meeting.php`) — polymorphic `meetingable` (Investor or Startup) with a `type` discriminator.

- **Microsoft Bookings owns** schedule/status; **admin owns** `attendance_status` and `meeting_notes`.
- Times use a business-timezone (Riyadh wall-clock) cast.
- Supporting tables: `MeetingBookingLog`, `MeetingOtpCode` (self-booking OTP), `MeetingBooking`.
- **Self-service booking:** OTP verify → availability from Bookings → `Meeting` created; Bookings webhook syncs status/times. Rejection actions can auto-cancel meetings.

## Committee (monthly investment committee)
`Committee` (`app/Models/Committee.php`) — `SoftDeletes`; **one per month** (`meeting_month_key` unique); status active/expired; belongs to `Admin` (creator).

- belongsToMany Investors (`committee_investors`) and Startups (via `committee_slots`, with slot order/timing).
- hasMany `CommitteeSlot`, `CommitteeAttendance` (investor), `CommitteeStartupAttendance`, `CommitteeEvaluation` (Pass/Fail per member × startup; `member_id` → `investors.id`).
- Related: `CommitteeInvestorStartupNote`, `CommitteeAttendanceLog`.
- **Workflow:** admin schedules → selects investors + startups (drag-ordered slots) → investors confirm via OTP portal → members record Pass/Fail → daily cron expires past committees.

## Demo (monthly demo day / Teams webinar)
`Demo` (`app/Models/Demo.php`) — `SoftDeletes`; **one per month**; status active/expired/cancelled.

- Audience = attached **Groups** (`demo_groups`, primary) ∪ ad-hoc **Investors** (`demo_investors`); effective audience is the union.
- belongsToMany Startups via `demo_slots`; hasMany `DemoSlot`, `DemoAttendance` (self + admin tracks, carries webinar registration), `DemoStartupAttendance`, `DemoInvestorStartupNote`.
- hasOne **`DemoWebinar`** — the Microsoft **Teams** webinar mirror (Graph IDs + publish lifecycle draft→published). Distinct from `Meeting` (Bookings).
- **Workflow:** create → build Teams webinar → register investors → stream pitch decks in portal → sync webinar attendance → cancel/expire lifecycle.
