19 declare(strict_types=1);
30 bool $has_flexible_schedule,
32 ?
int $default_schedule_value,
36 $job_instance =
new class (
37 $has_flexible_schedule,
38 $default_schedule_type,
39 $default_schedule_value,
45 private readonly
bool $has_flexible_schedule,
47 private readonly ?
int $default_schedule_value,
51 $this->schedule_type = $schedule_type;
52 $this->schedule_value = $schedule_value;
55 public function getId():
string 65 public function getDescription():
string 70 public function hasAutoActivation():
bool 75 public function hasFlexibleSchedule():
bool 77 return $this->has_flexible_schedule;
82 return $this->default_schedule_type;
85 public function getDefaultScheduleValue(): ?
int 87 return $this->default_schedule_value;
100 return $job_instance;
109 'Manual Run is Always Due' => [
112 CronJobScheduleType::SCHEDULE_TYPE_DAILY,
114 CronJobScheduleType::SCHEDULE_TYPE_DAILY,
119 CronJobScheduleType::SCHEDULE_TYPE_DAILY,
123 'Job Without Any Run is Always Due' => [
126 CronJobScheduleType::SCHEDULE_TYPE_DAILY,
128 CronJobScheduleType::SCHEDULE_TYPE_DAILY,
133 CronJobScheduleType::SCHEDULE_TYPE_DAILY,
137 'Daily Schedule / Did not run Today' => [
140 CronJobScheduleType::SCHEDULE_TYPE_DAILY,
142 CronJobScheduleType::SCHEDULE_TYPE_DAILY,
149 return self::$now->modify(
'-1 day');
151 CronJobScheduleType::SCHEDULE_TYPE_DAILY,
155 'Daily Schedule / Did run Today' => [
158 CronJobScheduleType::SCHEDULE_TYPE_DAILY,
160 CronJobScheduleType::SCHEDULE_TYPE_DAILY,
169 CronJobScheduleType::SCHEDULE_TYPE_DAILY,
173 'Weekly Schedule / Did not run this Week' => [
176 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
178 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
185 return self::$now->modify(
'-1 week');
187 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
191 'Weekly Schedule / Did run this Week' => [
194 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
196 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
203 return self::$now->modify(
'monday this week');
205 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
209 'Monthly Schedule / Did not run this Month' => [
212 CronJobScheduleType::SCHEDULE_TYPE_MONTHLY,
214 CronJobScheduleType::SCHEDULE_TYPE_MONTHLY,
221 return self::$now->modify(
'last day of last month');
223 CronJobScheduleType::SCHEDULE_TYPE_MONTHLY,
227 'Monthly Schedule / Did run this Month' => [
230 CronJobScheduleType::SCHEDULE_TYPE_MONTHLY,
232 CronJobScheduleType::SCHEDULE_TYPE_MONTHLY,
239 return self::$now->modify(
'first day of this month');
241 CronJobScheduleType::SCHEDULE_TYPE_MONTHLY,
245 'Yearly Schedule / Did not run this Year' => [
257 return self::$now->modify(
'-1 year');
263 'Yearly Schedule / Did run this Year' => [
275 return self::$now->modify(
'first day of January this year');
281 'Quarterly Schedule / Did not run this Quarter' => [
284 CronJobScheduleType::SCHEDULE_TYPE_QUARTERLY,
286 CronJobScheduleType::SCHEDULE_TYPE_QUARTERLY,
293 $offset = (((
int) self::$now->format(
'n')) - 1) % 3;
294 self::$this_quarter_start = self::$now->modify(
"first day of -$offset month midnight");
296 return self::$this_quarter_start->modify(
'-1 seconds');
298 CronJobScheduleType::SCHEDULE_TYPE_QUARTERLY,
302 'Quarterly Schedule / Did run this Quarter' => [
305 CronJobScheduleType::SCHEDULE_TYPE_QUARTERLY,
307 CronJobScheduleType::SCHEDULE_TYPE_QUARTERLY,
314 $offset = (((
int) self::$now->format(
'n')) - 1) % 3;
315 self::$this_quarter_start = self::$now->modify(
"first day of -$offset month midnight");
317 return self::$this_quarter_start->modify(
'+30 seconds');
319 CronJobScheduleType::SCHEDULE_TYPE_QUARTERLY,
323 'Minutely Schedule / Did not run this Minute' => [
326 CronJobScheduleType::SCHEDULE_TYPE_IN_MINUTES,
328 CronJobScheduleType::SCHEDULE_TYPE_IN_MINUTES,
335 return self::$now->modify(
'-1 minute');
337 CronJobScheduleType::SCHEDULE_TYPE_IN_MINUTES,
341 'Minutely Schedule / Did run this Minute' => [
344 CronJobScheduleType::SCHEDULE_TYPE_IN_MINUTES,
346 CronJobScheduleType::SCHEDULE_TYPE_IN_MINUTES,
353 return self::$now->modify(
'-30 seconds');
355 CronJobScheduleType::SCHEDULE_TYPE_IN_MINUTES,
359 'Hourly Schedule / Did not run this Hour' => [
362 CronJobScheduleType::SCHEDULE_TYPE_IN_HOURS,
364 CronJobScheduleType::SCHEDULE_TYPE_IN_HOURS,
371 return self::$now->modify(
'-7 hours');
373 CronJobScheduleType::SCHEDULE_TYPE_IN_HOURS,
377 'Hourly Schedule / Did run this Hour' => [
380 CronJobScheduleType::SCHEDULE_TYPE_IN_HOURS,
382 CronJobScheduleType::SCHEDULE_TYPE_IN_HOURS,
389 return self::$now->modify(
'-7 hours +30 seconds');
391 CronJobScheduleType::SCHEDULE_TYPE_IN_HOURS,
395 'Every 5 Days Schedule / Did not run for 5 Days' => [
398 CronJobScheduleType::SCHEDULE_TYPE_IN_DAYS,
400 CronJobScheduleType::SCHEDULE_TYPE_IN_DAYS,
407 return self::$now->modify(
'-5 days');
409 CronJobScheduleType::SCHEDULE_TYPE_IN_DAYS,
413 'Every 5 Days Schedule / Did run withing the last 5 Days' => [
416 CronJobScheduleType::SCHEDULE_TYPE_IN_DAYS,
418 CronJobScheduleType::SCHEDULE_TYPE_IN_DAYS,
425 return self::$now->modify(
'-4 days');
427 CronJobScheduleType::SCHEDULE_TYPE_IN_DAYS,
441 ?callable $last_run_datetime_callable,
443 ?
int $schedule_value,
446 $last_run_datetime = $last_run_datetime_callable ? $last_run_datetime_callable() : null;
449 $job_instance->
isDue($last_run_datetime, $schedule_type, $schedule_value, $is_manual_run),
450 'Last run: ' . ($last_run_datetime ? $last_run_datetime->format(DATE_ATOM) :
'never')
456 yield
'Different Week' => [
459 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
461 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
469 return self::$now->modify(
'-1 week');
474 yield
'Same Week and Year, but different Month: December (now) and January (Last run)' => [
477 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
479 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
494 yield
'Same Week and Year and same Month: January' => [
497 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
499 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
507 return self::$now->modify(
514 yield
'Same Week (52nd), but Year Difference > 1' => [
517 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
519 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
527 return self::$now->modify(
'tuesday this week')->modify(
534 yield
'Same Week (52nd) in different Years, but Turn of the Year' => [
537 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
539 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
547 return self::$now->modify(
554 yield
'Same Week (52nd) in different Years, but not Turn of the Year' => [
557 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
559 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
581 callable $last_run_datetime_provider,
584 $last_run_datetime = $last_run_datetime_provider();
588 $job_instance->
isDue(
594 'Last run: ' . $last_run_datetime->format(DATE_ATOM)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
isDue(?DateTimeImmutable $last_run, ?CronJobScheduleType $schedule_type, ?int $schedule_value, bool $is_manually_executed=false)
testWeeklySchedules(ilCronJob $job_instance, callable $last_run_datetime_provider, bool $should_be_due)
weeklyScheduleProvider
static DateTimeImmutable $this_quarter_start
static getJob(bool $has_flexible_schedule, CronJobScheduleType $default_schedule_type, ?int $default_schedule_value, CronJobScheduleType $schedule_type, ?int $schedule_value)
testSchedule(ilCronJob $job_instance, bool $is_manual_run, ?callable $last_run_datetime_callable, CronJobScheduleType $schedule_type, ?int $schedule_value, bool $should_be_due)
jobProvider
static DateTimeImmutable $now
static weeklyScheduleProvider()
__construct(Container $dic, ilPlugin $plugin)
getScheduleValue()
Get current schedule value (if flexible)
getScheduleType()
Get current schedule type (if flexible)