# Epic 8: Email Notification System ## Epic Goal Implement a comprehensive email notification system with professional templates, bilingual support, and reliable delivery for all platform communications. ## Epic Description ### Business Context Email is the primary communication channel. Clients receive mandatory notifications (no opt-out) for account creation, booking updates, reminders, and timeline updates. Admin receives notifications for new bookings and system events. ### Technical Context - **Sender:** no-reply@libra.ps - **Sender Name:** Libra Law Firm / مكتب ليبرا للمحاماة - **SMTP:** Configured via .env - **Delivery:** All mandatory (no opt-out for clients) - **Templates:** Professional with branding ### Success Criteria - [ ] Professional email templates with branding - [ ] Bilingual emails (based on recipient preference) - [ ] All 9+ notification types implemented - [ ] Calendar file attachments - [ ] Queued delivery for performance - [ ] Plain text fallback - [ ] Consistent branding across all emails --- ## Stories ### Story 8.1: Email Infrastructure Setup **Description:** Configure email sending infrastructure and base template. **Acceptance Criteria:** - [ ] SMTP configuration via .env: - MAIL_MAILER - MAIL_HOST - MAIL_PORT - MAIL_USERNAME - MAIL_PASSWORD - MAIL_ENCRYPTION - MAIL_FROM_ADDRESS (no-reply@libra.ps) - MAIL_FROM_NAME - [ ] Base email template with: - Libra logo header - Navy blue (#0A1F44) and gold (#D4AF37) colors - Professional typography - Footer with firm contact info - Mobile-responsive layout - [ ] Plain text fallback generation - [ ] Queue configuration for async sending - [ ] Email logging for debugging **Technical Notes:** - Use Laravel Mail with Mailable classes - Create base Mailable with shared layout - Configure queue connection --- ### Story 8.2: Welcome Email (Account Created) **Description:** Email sent when admin creates a new client account. **Acceptance Criteria:** - [ ] Triggered on user creation - [ ] **Content:** - Personalized greeting (name/company) - "Your account has been created" - Login credentials (email, password) - Login URL link - Brief platform introduction - Contact info for questions - [ ] Language based on user's preferred_language - [ ] Call-to-action button: "Login Now" - [ ] Security note about changing password (N/A - admin only) **Technical Notes:** - Mailable: WelcomeEmail - Trigger: User created event - Queue for performance --- ### Story 8.3: Booking Submitted Confirmation **Description:** Email to client confirming their booking request was submitted. **Acceptance Criteria:** - [ ] Triggered on booking submission - [ ] **Content:** - "Your consultation request has been submitted" - Requested date and time - Problem summary preview - "Pending Review" status note - Expected response timeframe (general) - [ ] Language based on client preference - [ ] No action required message **Technical Notes:** - Mailable: BookingSubmittedEmail - Trigger: Consultation created with status 'pending' --- ### Story 8.4: Booking Approved Email **Description:** Email to client when admin approves their booking. **Acceptance Criteria:** - [ ] Triggered on booking approval - [ ] **Content:** - "Your consultation has been approved" - Confirmed date and time - Duration (45 minutes) - Consultation type (free/paid) - If paid: amount and payment instructions - Calendar file (.ics) attached - "Add to Calendar" button/link - Location/contact information - [ ] Language based on client preference - [ ] Professional confirmation tone **Technical Notes:** - Mailable: BookingApprovedEmail - Attach .ics file from Epic 3 - Trigger: Consultation status changed to 'approved' --- ### Story 8.5: Booking Rejected Email **Description:** Email to client when admin rejects their booking. **Acceptance Criteria:** - [ ] Triggered on booking rejection - [ ] **Content:** - "Your consultation request could not be approved" - Original requested date and time - Rejection reason (if provided by admin) - Invitation to request new consultation - Contact info for questions - [ ] Empathetic, professional tone - [ ] Language based on client preference **Technical Notes:** - Mailable: BookingRejectedEmail - Optional reason field from admin - Trigger: Consultation status changed to 'rejected' --- ### Story 8.6: Consultation Reminder (24 Hours) **Description:** Reminder email sent 24 hours before scheduled consultation. **Acceptance Criteria:** - [ ] Scheduled job runs daily - [ ] Find consultations 24 hours away - [ ] **Content:** - "Reminder: Your consultation is tomorrow" - Date and time - Consultation type - Payment reminder (if paid and not received) - Calendar file link - Any preparation notes - [ ] Skip cancelled/no-show consultations - [ ] Language based on client preference **Technical Notes:** - Scheduled command: php artisan reminders:send-24h - Run via Laravel scheduler - Mailable: ConsultationReminder24Email --- ### Story 8.7: Consultation Reminder (2 Hours) **Description:** Reminder email sent 2 hours before scheduled consultation. **Acceptance Criteria:** - [ ] Scheduled job runs hourly - [ ] Find consultations 2 hours away - [ ] **Content:** - "Your consultation is in 2 hours" - Date and time - Final payment reminder (if applicable) - Contact info for last-minute issues - [ ] Skip cancelled/no-show consultations - [ ] Language based on client preference **Technical Notes:** - Scheduled command: php artisan reminders:send-2h - More frequent checks for accuracy - Mailable: ConsultationReminder2hEmail --- ### Story 8.8: Timeline Update Notification **Description:** Email to client when admin adds update to their timeline. **Acceptance Criteria:** - [ ] Triggered on timeline update creation - [ ] **Content:** - "Update on your case: [Case Name]" - Case reference number - Update content (full or summary) - Date of update - "View Timeline" button/link - [ ] Language based on client preference - [ ] Professional, informative tone **Technical Notes:** - Mailable: TimelineUpdateEmail - Trigger: TimelineUpdate created event - Link to client dashboard timeline view --- ### Story 8.9: Admin Notification - New Booking **Description:** Email to admin when client submits new booking request. **Acceptance Criteria:** - [ ] Triggered on booking submission - [ ] Sent to admin email - [ ] **Content:** - "New Consultation Request" - Client name (individual or company) - Requested date and time - Problem summary (full) - Client contact info - "Review Request" button/link - [ ] Admin language preference (or default) - [ ] Priority indicator in subject line **Technical Notes:** - Mailable: NewBookingAdminEmail - Send to configured admin email - Include direct link to booking management --- ### Story 8.10: Admin Notification - System Events **Description:** Critical system notifications to admin. **Acceptance Criteria:** - [ ] Email failures notification - [ ] Scheduled job failures notification - [ ] Critical errors summary - [ ] **Content:** - Event type and description - Timestamp - Relevant details - Recommended action (if any) - [ ] Sent immediately (not queued) - [ ] Clear subject line indicating urgency **Technical Notes:** - Use Laravel exception handler - Monitor queues and scheduler - Consider separate notification channel --- ## Dependencies | Epic | Dependency | |------|------------| | Epic 1 | Base application, user preferences | | Epic 2 | User creation (welcome email) | | Epic 3 | Booking events, calendar files | | Epic 4 | Timeline updates | ## Risks & Mitigations | Risk | Impact | Mitigation | |------|--------|------------| | Email delivery failures | High | Queue retry, logging, admin alerts | | SMTP configuration issues | High | Test email feature, validation | | Spam filtering | Medium | Proper SPF/DKIM, professional content | | Timezone issues in reminders | Medium | Store and display in consistent timezone | ## Definition of Done - [ ] All stories completed with acceptance criteria met - [ ] All 9+ email types implemented - [ ] Emails render correctly (HTML and plain text) - [ ] Bilingual emails working - [ ] Branding consistent across all emails - [ ] Queue processing reliable - [ ] Reminder jobs scheduled and tested - [ ] Calendar attachments working - [ ] Admin notifications delivered - [ ] Code formatted with Pint