MIF_E31222307/app/Services/NotificationService.php

142 lines
4.1 KiB
PHP

<?php
namespace App\Services;
use App\Models\User;
use App\Models\UserNotification;
use App\Models\WaktuMakan;
use Carbon\Carbon;
class NotificationService
{
/**
* Kirim notifikasi waktu makan
*/
public static function sendMealTimeNotification($userId, $waktuMakanId)
{
$user = User::find($userId);
$waktuMakan = WaktuMakan::find($waktuMakanId);
if (!$user || !$waktuMakan) {
return false;
}
// Cek apakah sudah ada notifikasi untuk waktu makan ini hari ini
$existingNotification = UserNotification::where('user_id', $userId)
->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();
}
}