calendarService->generateIcs($interview); $icsFilename = $this->calendarService->generateFilename($interview); // 1. Send candidate invitation with RSVP required & 15m alert if (! empty($interview->candidate_email)) { try { Mail::to($interview->candidate_email) ->queue(new CandidateInterviewInvitationMail($interview, $icsContent, $icsFilename)); } catch (\Throwable $e) { Log::error('Failed to queue interview invitation email for candidate: '.$e->getMessage(), [ 'interview_id' => $interview->id, 'candidate_email' => $interview->candidate_email, ]); } } // 2. Send interviewer assignment notification to all assigned panelists $assignedUsers = $interview->assignedUsers(); foreach ($assignedUsers as $interviewer) { if (! empty($interviewer->email)) { try { Mail::to($interviewer->email) ->queue(new InterviewerAssessmentNotificationMail($interview, $interviewer, $icsContent, $icsFilename)); } catch (\Throwable $e) { Log::error('Failed to queue interview notification for panelist: '.$e->getMessage(), [ 'interview_id' => $interview->id, 'interviewer_id' => $interviewer->id, 'interviewer_email' => $interviewer->email, ]); } } } } }