# Story 8.7: Consultation Reminder (2 Hours) ## Epic Reference **Epic 8:** Email Notification System ## User Story As a **client**, I want **to receive a reminder 2 hours before my consultation**, So that **I'm prepared and ready**. ## Acceptance Criteria ### Trigger - [ ] Scheduled job runs every 15 minutes - [ ] Find consultations 2 hours away - [ ] Only for approved consultations - [ ] Skip cancelled/no-show ### Content - [ ] "Your consultation is in 2 hours" - [ ] Date and time - [ ] Final payment reminder (if applicable) - [ ] Contact info for last-minute issues ### Language - [ ] Email in client's preferred language ## Technical Notes ```php // Command: php artisan reminders:send-2h // Schedule: everyFifteenMinutes class Send2HourReminders extends Command { public function handle(): int { $targetTime = now()->addHours(2); $windowStart = $targetTime->copy()->subMinutes(7); $windowEnd = $targetTime->copy()->addMinutes(7); Consultation::where('status', 'approved') ->whereNull('reminder_2h_sent_at') ->whereDate('scheduled_date', today()) ->get() ->filter(function ($c) use ($windowStart, $windowEnd) { $time = Carbon::parse($c->scheduled_date->format('Y-m-d') . ' ' . $c->scheduled_time); return $time->between($windowStart, $windowEnd); }) ->each(function ($consultation) { $consultation->user->notify(new ConsultationReminder2h($consultation)); $consultation->update(['reminder_2h_sent_at' => now()]); }); return Command::SUCCESS; } } ``` ## Definition of Done - [ ] Command runs successfully - [ ] Correct timing (2 hours before) - [ ] Payment reminder if unpaid - [ ] No duplicate reminders - [ ] Bilingual templates - [ ] Tests pass ## Estimation **Complexity:** Medium | **Effort:** 2-3 hours