Files
approagency/app/Console/Commands/SendDueReminders.php
T
2025-12-13 16:09:17 +03:30

105 lines
3.3 KiB
PHP

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\Reminder;
use App\Jobs\SendPushJob;
use App\Jobs\SendPushToPackageJob;
use Carbon\Carbon;
class SendDueReminders extends Command
{
/**
* The name and signature of the console command.
*/
protected $signature = 'reminders:send-due';
/**
* The console command description.
*/
protected $description = 'Send push notifications for due reminders';
/**
* Execute the console command.
*/
public function handle(): int
{
$now = now();
$currentTime = $now->toTimeString(); // HH:MM:SS
$this->info("Current time: {$now}");
$this->info("Current time string: {$currentTime}");
$reminders = Reminder::with(['user', 'packageName'])
->where(function ($query) use ($now, $currentTime) {
// Compare only the TIME portion
$query->whereRaw('TIME(time) <= ?', [$currentTime])
->where(function ($sub) use ($now) {
// Non-repeatable: send once
$sub->where('repeatable', false)
->whereNull('last_repeat')
// OR repeatable: not sent today
->orWhere('repeatable', true)
->where(function ($inner) use ($now) {
$inner->whereNull('last_repeat')
->orWhereDate('last_repeat', '<', $now->toDateString());
});
});
})
->get();
// Debug: Show what reminders were found
$this->info("Found {$reminders->count()} reminders");
foreach ($reminders as $reminder) {
$this->info("Reminder ID {$reminder->id}: time={$reminder->time}, last_repeat={$reminder->last_repeat}");
}
if ($reminders->isEmpty()) {
$this->info('No reminders due at this time.');
return Command::SUCCESS;
}
foreach ($reminders as $reminder) {
$packageName = $reminder->packageName;
// Check if reminder has a specific user
if ($reminder->user_id) {
$user = $reminder->user;
$relation = $user->packageNames()->where('package_names.id', $packageName->id)->first();
$fcmToken = $relation?->pivot?->fcm_token;
if ($fcmToken) {
SendPushJob::dispatch(
user: $user,
title: $reminder->title,
packageName: $packageName,
description: $reminder->description ?? '',
data: $reminder->data ?? []
);
}
}
// Otherwise, send to all users that have this package
else {
// Just dispatch the job once for all users with this package
SendPushToPackageJob::dispatch(
$packageName,
$reminder->title,
$reminder->description ?? '',
$reminder->data ?? []
);
}
$scheduledTime = Carbon::parse($reminder->time);
$scheduledTime->setDate($now->year, $now->month, $now->day);
$reminder->last_repeat = $scheduledTime;
$reminder->save();
$this->info("Queued push notification for reminder {$reminder->id}.");
}
return Command::SUCCESS;
}
}