142 lines
4.1 KiB
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();
|
|
}
|
|
}
|