where('waktu_makan_id', $waktuMakanId) ->whereDate('created_at', today()) ->first(); if ($existingNotification) { return false; // Sudah ada notifikasi hari ini } return UserNotification::create([ 'user_id' => $userId, 'waktu_makan_id' => $waktuMakanId, 'title' => "Waktu Makan {$waktuMakan->nama}", 'message' => $waktuMakan->alert_text ?? "Waktunya makan {$waktuMakan->nama}!", 'type' => 'reminder', 'data' => [ 'waktu_makan' => $waktuMakan->nama, 'waktu' => $waktuMakan->keterangan ] ]); } /** * Kirim notifikasi simulasi selesai */ public static function sendSimulationCompletedNotification($userId, $data = []) { return UserNotification::create([ 'user_id' => $userId, 'title' => 'Simulasi AHP Selesai', 'message' => 'Hasil simulasi AHP Anda sudah siap. Lihat rekomendasi makanan terbaik!', 'type' => 'success', 'data' => $data ]); } /** * Kirim notifikasi umum */ public static function sendGeneralNotification($userId, $title, $message, $type = 'info', $data = []) { return UserNotification::create([ 'user_id' => $userId, 'title' => $title, 'message' => $message, 'type' => $type, 'data' => $data ]); } /** * Cek dan kirim notifikasi waktu makan otomatis */ public static function checkAndSendMealTimeNotifications() { $currentTime = now()->format('H:i:s'); $users = User::whereHas('alertSetting', function($query) { $query->where('is_enabled', true); })->get(); foreach ($users as $user) { $alertSetting = $user->alertSetting; if (!$alertSetting || !$alertSetting->is_enabled) { continue; } $enabledWaktuMakan = $alertSetting->enabledWaktuMakan; foreach ($enabledWaktuMakan as $waktuMakan) { $waktuMakanTime = $waktuMakan->keterangan; $timeDiff = abs(strtotime($currentTime) - strtotime($waktuMakanTime)); // Kirim notifikasi jika waktu makan dalam rentang 5 menit if ($timeDiff <= 300) { // 5 menit = 300 detik self::sendMealTimeNotification($user->id, $waktuMakan->id); } } } } /** * Tandai notifikasi sebagai dibaca */ public static function markAsRead($notificationId, $userId) { $notification = UserNotification::where('id', $notificationId) ->where('user_id', $userId) ->first(); if ($notification) { $notification->markAsRead(); return true; } return false; } /** * Tandai semua notifikasi sebagai dibaca */ public static function markAllAsRead($userId) { return UserNotification::where('user_id', $userId) ->where('is_read', false) ->update([ 'is_read' => true, 'read_at' => now() ]); } /** * Hapus notifikasi lama (lebih dari 30 hari) */ public static function cleanOldNotifications() { return UserNotification::where('created_at', '<', now()->subDays(30))->delete(); } }