8.0 KiB
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
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
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