# Programs Module

## Purpose
Programs are the **tenant entities** in this multi-tenant LMS. Each program represents an independent educational organization (e.g., a UCMAS learning center) with its own settings, users, content, and subscription.

## Business Context
Programs are created by system administrators (super-admin) or through self-registration. Each program:
- Has its own branding (logo, favicon, colors)
- Has administrators who manage the program
- Has teachers who create content and teach students
- Has students who learn and take assessments
- Has a subscription plan that defines feature limits

## Key Model — Program (`app/Models/Program.php`)
- Uses `HasPlanSubscriptions` trait (laravelcm/laravel-subscriptions package)
- Uses `HasTranslations` (Spatie) — `name` and `description` are translatable
- Uses `HasFeatureAccess` for feature entitlement checks

### Fields
- `name` (json, translatable), `slug` (string, unique), `description` (json)
- `image` (string), `is_active` (boolean, default: false)
- `approved_at` (timestamp)
- `is_default` (boolean) — marks the system default program

### Scopes
- Automatic unique slug generation on creation (`Str::slug()`)

### Lifecycle
- **Created:** Auto-subscribes to initial `ProgramPlan`, dispatches `program.created`
- **Deleted:** Dispatches `program.deleted`
- **Approved:** Called via `approve()` method — sets `is_active=true`, `approved_at=now()`, dispatches `program.approved` and `program.enabled`
- **Disapproved:** Called via `disapprove()` method — sets `is_active=false`, dispatches `program.suspended` and `program.disabled`

## Filament Resources

### Admin Panel
- `ProgramResource` — CRUD for programs (super-admins/managers)
- Relation Managers: `Country`, `Marathon`, `Program`, `Team` relation managers

### Program Panel
- `ProgramResource` — Edit view for program admins to update program details
- `ProgramLevelResource` — Manage program-specific levels
- Various content resources (Course, Lesson, etc.)

## Key Workflows

### Program Registration
1. Visitor registers a new program via email or phone
2. `RegisterProgramEmail`/`RegisterProgramPhone` Filament page handles registration
3. New program created with `is_active=false` (pending approval)
4. Program automatically subscribed to initial `ProgramPlan`
5. System admin approves program via Admin panel
6. Program becomes active and accessible

### Program Suspension
1. Admin marks program as inactive
2. `disapprove()` method fires
3. Sets `is_active=false`, dispatches notifications
4. Users in program can no longer access the panel

## Related Workflows
- **[Program Registration & Approval Workflow](../WORKFLOWS.md#1-program-registration--approval-workflow)** — End-to-end program creation, approval, and activation
