diff --git a/app/Jobs/Ninja/TaskScheduler.php b/app/Jobs/Ninja/TaskScheduler.php index 6b09f057a0a0..106281c58d70 100644 --- a/app/Jobs/Ninja/TaskScheduler.php +++ b/app/Jobs/Ninja/TaskScheduler.php @@ -111,31 +111,10 @@ class TaskScheduler implements ShouldQueue } - $amount_of_days_until_next_run = $this->getAmountOfDays($scheduler->repeat_every); - $scheduler->scheduled_run = Carbon::now()->addDays($amount_of_days_until_next_run); + $scheduler->scheduled_run = $scheduler->nextScheduledDate(); $scheduler->save(); } - private function getAmountOfDays(string $repeat_every): int - { - switch ($repeat_every) { - case Scheduler::DAILY: - return 1; - break; - case Scheduler::MONTHLY: - return 30; - break; - case Scheduler::WEEKLY: - return 7; - break; - case Scheduler::QUARTERLY: - return 90; - break; - case Scheduler::ANNUALLY: - return 365; - break; - } - } private function fetchJobs() { diff --git a/app/Models/Scheduler.php b/app/Models/Scheduler.php index ce1939b109ba..7014f37ad41d 100644 --- a/app/Models/Scheduler.php +++ b/app/Models/Scheduler.php @@ -14,6 +14,7 @@ namespace App\Models; use App\Services\TaskScheduler\TaskSchedulerService; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Carbon; /** * @property boolean paused @@ -61,4 +62,29 @@ class Scheduler extends Model { return $this->hasOne(ScheduledJob::class, 'scheduler_id', 'id'); } + + public function nextScheduledDate() :?Carbon + { + + /* + As we are firing at UTC+0 if our offset is negative it is technically firing the day before so we always need + to add ON a day - a day = 86400 seconds + */ + $offset = 86400; + + switch ($this->repeat_every) { + case self::DAILY: + return Carbon::parse($this->scheduled_run)->startOfDay()->addDay()->addSeconds($offset); + case self::WEEKLY: + return Carbon::parse($this->scheduled_run)->startOfDay()->addWeek()->addSeconds($offset); + case self::MONTHLY: + return Carbon::parse($this->scheduled_run)->startOfDay()->addMonth()->addSeconds($offset); + case self::QUARTERLY: + return Carbon::parse($this->scheduled_run)->startOfDay()->addMonths(3)->addSeconds($offset); + case self::ANNUALLY: + return Carbon::parse($this->scheduled_run)->startOfDay()->addYear()->addSeconds($offset); + default: + return null; + } + } }