send( 'follow_up', $payload, 'Attendance Follow Up', 'emails/follow_up', 'info' ); } public function sendFinalWarning(array $payload): array { return $this->send( 'final_warning', $payload, 'Final Warning: Attendance Issue', 'emails/final_warning', 'warning' ); } public function sendDismissal(array $payload): array { return $this->send( 'dismissal', $payload, 'Notice of Dismissal', 'emails/dismissal', 'error' ); } private function send( string $type, array $payload, string $defaultSubject, string $_viewName, string $logLevel ): array { $studentName = trim((string) ($payload['student']['firstname'] ?? '').' '.(string) ($payload['student']['lastname'] ?? '')); $parentEmail = (string) ($payload['parent']['email'] ?? ''); $parentName = (string) ($payload['parent']['name'] ?? ''); $teacherName = trim((string) ($payload['teacher']['firstname'] ?? '').' '.(string) ($payload['teacher']['lastname'] ?? '')); $className = (string) ($payload['class']['class_section_name'] ?? ''); $semester = (string) ($payload['semester'] ?? ''); $schoolYear = (string) ($payload['school_year'] ?? ''); $dateYmd = (string) ($payload['date'] ?? ''); $dateFmt = $dateYmd !== '' ? date('m-d-Y', strtotime($dateYmd)) : ''; if ($parentEmail === '') { Log::warning("Attendance {$type}: missing parent email", [ 'student_id' => $payload['student_id'] ?? null, ]); return ['ok' => false, 'message' => 'Missing parent email.']; } $subject = (string) ($payload['subject'] ?? $this->buildSubject($defaultSubject, $studentName, $dateFmt)); $html = trim((string) ($payload['html'] ?? '')); if ($html === '') { $period = trim($semester.' '.$schoolYear); $html = '

'.e($subject).'

' .'

Student: '.e($studentName).'

' .'

Parent: '.e($parentName).'

' .'

Teacher: '.e($teacherName).'

' .'

Class: '.e($className).'

' .($period !== '' ? '

Term: '.e($period).'

' : '') .'

Date: '.e($dateFmt).'

'; } $ok = false; try { $ok = $this->emailService->send($parentEmail, $subject, $html, 'attendance'); } catch (\Throwable $e) { Log::error('Attendance email send failed: '.$e->getMessage()); } $summary = $this->buildInAppSummary($type, $studentName, $dateFmt); $parentUserId = (int) ($payload['parent']['user_id'] ?? 0); if ($parentUserId > 0) { $this->notifier->notifyUser( $parentUserId, $subject, $summary, ['in_app'], 'attendance', 'parent' ); } if (! empty($payload['tracking_id'])) { AttendanceTracking::markAsNotified((int) $payload['tracking_id']); } Log::log($logLevel, "Attendance {$type} email ".($ok ? 'sent' : 'failed'), [ 'student_id' => $payload['student_id'] ?? null, 'recipient' => $parentEmail, ]); return ['ok' => $ok]; } private function buildSubject(string $base, string $studentName, string $dateFmt): string { $name = $studentName !== '' ? " — {$studentName}" : ''; $date = $dateFmt !== '' ? " ({$dateFmt})" : ''; return $base.$name.$date; } private function buildInAppSummary(string $type, string $studentName, string $dateFmt): string { $who = $studentName !== '' ? $studentName : 'a student'; $when = $dateFmt !== '' ? " on {$dateFmt}" : ''; return match ($type) { 'dismissal' => "Dismissal notice sent for {$who}{$when}.", 'final_warning' => "Final warning sent for {$who}{$when}.", default => "Follow-up notice sent for {$who}{$when}.", }; } }