# Epic 3: Booking & Consultation System

## Epic Goal

Implement a complete consultation booking system with calendar-based availability, admin approval workflow, consultation type assignment (free/paid), and automated reminders.

## Epic Description

### Business Context

Clients book consultations through a calendar interface. Each consultation is 45 minutes with a 15-minute buffer. The admin reviews requests, determines if free or paid, and approves/rejects. Clients are limited to 1 consultation per day. Payment is handled offline.

### Technical Context

- **Duration:** 45 minutes consultation + 15 minutes buffer = 1 hour slot
- **Limit:** Maximum 1 consultation per client per day
- **Types:** Free or Paid (determined by admin)
- **Payment:** Offline only (no gateway)
- **Calendar:** Real-time availability display

### Success Criteria

- [ ] Calendar displays available time slots
- [ ] Clients can submit booking requests
- [ ] 1 consultation per day per client enforced
- [ ] Admin can approve/reject bookings
- [ ] Admin assigns free/paid status
- [ ] Email notifications at each stage
- [ ] Consultation reminders (24hr, 2hr)
- [ ] Calendar file (.ics) generation
- [ ] Admin can mark as completed/no-show/cancelled
- [ ] Guests can submit booking requests from public page
- [ ] Admin can approve guest requests and create accounts

---

## Stories

### Story 3.1: Working Hours Configuration

**Description:** Allow admin to configure available working hours for each day of the week.

**Acceptance Criteria:**
- [ ] Set available days (enable/disable each day)
- [ ] Set start and end time for each day
- [ ] Support different hours for different days
- [ ] 15-minute buffer automatically applied between appointments
- [ ] Changes take effect immediately
- [ ] Existing approved bookings not affected by changes
- [ ] Visual preview of weekly schedule
- [ ] 12-hour time format (AM/PM)

**Technical Notes:**
- Store in working_hours table
- Fields: day_of_week, start_time, end_time, is_active
- Consider timezone handling

---

### Story 3.2: Time Slot Blocking

**Description:** Allow admin to block specific dates/times for personal events or holidays.

**Acceptance Criteria:**
- [ ] Block entire days
- [ ] Block specific time ranges within a day
- [ ] Add reason/note for blocked time
- [ ] View list of all blocked times
- [ ] Edit/delete blocked times
- [ ] Blocked times show as unavailable in calendar
- [ ] Prevent booking on blocked times
- [ ] Future blocked times don't affect existing bookings

**Technical Notes:**
- Store in blocked_times table
- Fields: block_date, start_time, end_time, reason
- Query both working_hours and blocked_times for availability

---

### Story 3.3: Availability Calendar Display

**Description:** Display real-time calendar with available time slots for booking.

**Acceptance Criteria:**
- [ ] Calendar view showing available dates
- [ ] Time slots based on working hours configuration
- [ ] Unavailable slots clearly indicated:
  - Already booked (by other clients)
  - Outside working hours
  - Blocked by admin
- [ ] 1-hour slots (45min + 15min buffer)
- [ ] Visual distinction between available/unavailable
- [ ] Responsive design (mobile-friendly)
- [ ] Language-appropriate date formatting
- [ ] Prevent double-booking

**Technical Notes:**
- Consider FullCalendar.js or similar
- Real-time availability check on slot selection
- Account for 15-minute buffer between appointments

---

### Story 3.4: Booking Request Submission

**Description:** Allow logged-in clients to submit consultation booking requests.

**Acceptance Criteria:**
- [ ] Client must be logged in
- [ ] Select date from calendar
- [ ] Select available time slot
- [ ] Provide detailed problem summary (required, textarea)
- [ ] System validates: no more than 1 booking per day for this client
- [ ] Confirmation before submission
- [ ] Booking enters "pending" status
- [ ] Admin receives email notification
- [ ] Client sees "Pending Review" status
- [ ] Client receives submission confirmation email

**Technical Notes:**
- Store in consultations table
- Status: 'pending' initially
- Validate against existing bookings for same client/day

---

### Story 3.5: Admin Booking Review & Approval

**Description:** Admin workflow to review, categorize, and approve/reject booking requests.

**Acceptance Criteria:**
- [ ] View list of pending booking requests
- [ ] See client details and problem summary
- [ ] Determine consultation type:
  - Free consultation
  - Paid consultation (with amount)
- [ ] Set payment amount and instructions (if paid)
- [ ] Approve booking:
  - Status changes to 'approved'
  - Client notified via email
  - Calendar file (.ics) attached
  - Payment instructions included (if paid)
- [ ] Reject booking:
  - Optional rejection reason
  - Client notified via email
- [ ] Quick action buttons for approve/reject
- [ ] Filter by date range, client

**Technical Notes:**
- Update consultation status and type
- Trigger appropriate email notifications
- Generate .ics file on approval

---

### Story 3.6: Calendar File Generation (.ics)

**Description:** Generate downloadable calendar files for approved consultations.

**Acceptance Criteria:**
- [ ] Generate valid .ics file on booking approval
- [ ] Include:
  - Event title: "Consultation with Libra Law Firm"
  - Date and time
  - Duration: 45 minutes
  - Location (if applicable)
  - Description with booking reference
- [ ] Attach to approval email
- [ ] Available for download from client dashboard
- [ ] Compatible with major calendar apps (Google, Apple, Outlook)
- [ ] Bilingual event details based on client preference

**Technical Notes:**
- Use maennchen/zipstream-php or spatie/icalendar-generator
- Follow iCalendar specification (RFC 5545)

---

### Story 3.7: Consultation Management

**Description:** Admin tools to manage consultations through their lifecycle.

**Acceptance Criteria:**
- [ ] View all consultations with filters:
  - Status (pending/approved/completed/cancelled/no-show)
  - Type (free/paid)
  - Date range
  - Payment status
  - Client name
- [ ] Mark consultation as completed
- [ ] Mark consultation as no-show
- [ ] Cancel booking on behalf of client
- [ ] Reschedule appointment:
  - Select new date/time
  - Notify client via email
- [ ] Mark payment as received (for paid)
- [ ] Add admin notes (internal only)
- [ ] View consultation history per client

**Technical Notes:**
- Status enum: pending, approved, completed, cancelled, no_show
- Payment status: pending, received, not_applicable
- Admin notes stored separately from client-visible data

---

### Story 3.8: Consultation Reminders

**Description:** Automated reminder emails before scheduled consultations.

**Acceptance Criteria:**
- [ ] Send reminder 24 hours before consultation
- [ ] Send reminder 2 hours before consultation
- [ ] Reminder includes:
  - Consultation date and time
  - Type (free/paid)
  - Payment reminder (if paid and not received)
  - Any instructions
- [ ] Reminders in client's preferred language
- [ ] No reminder for cancelled consultations
- [ ] Scheduled job for sending reminders

**Technical Notes:**
- Use Laravel scheduler for reminder jobs
- Check consultation status before sending
- Depends on Epic 8 for email infrastructure

---

### Story 3.9: Guest Booking Request

**Description:** Allow website visitors to submit consultation booking requests without an account.

**Acceptance Criteria:**
- [ ] Public `/booking` page accessible without login
- [ ] Guest can select date/time from availability calendar
- [ ] Guest provides full contact details (name, national ID, email, phone)
- [ ] Support for individual and company account types
- [ ] Duplicate check: block if email OR national_id already exists (prompt to login)
- [ ] 1-per-day limit by email for guest requests
- [ ] Confirmation step before submission
- [ ] Guest receives confirmation email
- [ ] Admin receives notification email
- [ ] Guest requests appear in admin queue with "Guest" badge
- [ ] Admin can: Approve + Create Account, Reject, Create Account Only
- [ ] On approval: user account created, welcome email sent, booking approved
- [ ] On rejection: rejection email sent, guest data discarded
- [ ] All actions logged in audit trail

**Technical Notes:**
- Store in guest_booking_requests table (separate from consultations)
- Admin workflow extends Story 3.5 approval process
- On approval, creates user and converts to consultation
- Rejected requests are fully deleted (data not retained)

---

## Dependencies

| Epic | Dependency |
|------|------------|
| Epic 1 | Authentication, database schema, bilingual support |
| Epic 2 | User accounts must exist to book |
| Epic 8 | Email notifications (approval, reminders) |

## Risks & Mitigations

| Risk | Impact | Mitigation |
|------|--------|------------|
| Double-booking race condition | High | Database-level locking, unique constraints |
| Timezone confusion | Medium | Store UTC, display in local time |
| Reminder job failures | Medium | Queue monitoring, retry logic |
| Calendar file compatibility | Low | Test with major calendar apps |

## Definition of Done

- [ ] All stories completed with acceptance criteria met
- [ ] Tests for booking flow end-to-end
- [ ] Tests for 1-per-day constraint
- [ ] Tests for availability calculation
- [ ] Calendar file validated with multiple apps
- [ ] Email notifications working
- [ ] Reminder jobs scheduled and tested
- [ ] Bilingual support verified
- [ ] Code formatted with Pint
