19 declare(strict_types=1);
33 bool $has_flexible_schedule,
35 ?
int $default_schedule_value,
39 $job_instance =
new class (
40 $has_flexible_schedule,
41 $default_schedule_type,
42 $default_schedule_value,
48 private readonly
bool $has_flexible_schedule,
50 private readonly ?
int $default_schedule_value,
54 $this->schedule_type = $schedule_type;
55 $this->schedule_value = $schedule_value;
58 public function getId():
string 68 public function getDescription():
string 73 public function hasAutoActivation():
bool 78 public function hasFlexibleSchedule():
bool 80 return $this->has_flexible_schedule;
85 return $this->default_schedule_type;
88 public function getDefaultScheduleValue(): ?
int 90 return $this->default_schedule_value;
103 return $job_instance;
112 'Manual Run is Always Due' => [
115 JobScheduleType::DAILY,
117 JobScheduleType::DAILY,
122 JobScheduleType::DAILY,
126 'Job Without Any Run is Always Due' => [
129 JobScheduleType::DAILY,
131 JobScheduleType::DAILY,
136 JobScheduleType::DAILY,
140 'Daily Schedule / Did not run Today' => [
143 JobScheduleType::DAILY,
145 JobScheduleType::DAILY,
152 return self::$now->modify(
'-1 day');
154 JobScheduleType::DAILY,
158 'Daily Schedule / Did run Today' => [
161 JobScheduleType::DAILY,
163 JobScheduleType::DAILY,
172 JobScheduleType::DAILY,
176 'Weekly Schedule / Did not run this Week' => [
179 JobScheduleType::WEEKLY,
181 JobScheduleType::WEEKLY,
188 return self::$now->modify(
'-1 week');
190 JobScheduleType::WEEKLY,
194 'Weekly Schedule / Did run this Week' => [
197 JobScheduleType::WEEKLY,
199 JobScheduleType::WEEKLY,
206 return self::$now->modify(
'monday this week');
208 JobScheduleType::WEEKLY,
212 'Monthly Schedule / Did not run this Month' => [
215 JobScheduleType::MONTHLY,
217 JobScheduleType::MONTHLY,
224 return self::$now->modify(
'last day of last month');
226 JobScheduleType::MONTHLY,
230 'Monthly Schedule / Did run this Month' => [
233 JobScheduleType::MONTHLY,
235 JobScheduleType::MONTHLY,
242 return self::$now->modify(
'first day of this month');
244 JobScheduleType::MONTHLY,
248 'Yearly Schedule / Did not run this Year' => [
260 return self::$now->modify(
'-1 year');
266 'Yearly Schedule / Did run this Year' => [
278 return self::$now->modify(
'first day of January this year');
284 'Quarterly Schedule / Did not run this Quarter' => [
287 JobScheduleType::QUARTERLY,
289 JobScheduleType::QUARTERLY,
296 $offset = (((
int) self::$now->format(
'n')) - 1) % 3;
297 self::$this_quarter_start = self::$now->modify(
"first day of -$offset month midnight");
299 return self::$this_quarter_start->modify(
'-1 seconds');
301 JobScheduleType::QUARTERLY,
305 'Quarterly Schedule / Did run this Quarter' => [
308 JobScheduleType::QUARTERLY,
310 JobScheduleType::QUARTERLY,
317 $offset = (((
int) self::$now->format(
'n')) - 1) % 3;
318 self::$this_quarter_start = self::$now->modify(
"first day of -$offset month midnight");
320 return self::$this_quarter_start->modify(
'+30 seconds');
322 JobScheduleType::QUARTERLY,
326 'Minutely Schedule / Did not run this Minute' => [
329 JobScheduleType::IN_MINUTES,
331 JobScheduleType::IN_MINUTES,
338 return self::$now->modify(
'-1 minute');
340 JobScheduleType::IN_MINUTES,
344 'Minutely Schedule / Did run this Minute' => [
347 JobScheduleType::IN_MINUTES,
349 JobScheduleType::IN_MINUTES,
356 return self::$now->modify(
'-30 seconds');
358 JobScheduleType::IN_MINUTES,
362 'Hourly Schedule / Did not run this Hour' => [
365 JobScheduleType::IN_HOURS,
367 JobScheduleType::IN_HOURS,
374 return self::$now->modify(
'-7 hours');
376 JobScheduleType::IN_HOURS,
380 'Hourly Schedule / Did run this Hour' => [
383 JobScheduleType::IN_HOURS,
385 JobScheduleType::IN_HOURS,
392 return self::$now->modify(
'-7 hours +30 seconds');
394 JobScheduleType::IN_HOURS,
398 'Every 5 Days Schedule / Did not run for 5 Days' => [
401 JobScheduleType::IN_DAYS,
403 JobScheduleType::IN_DAYS,
410 return self::$now->modify(
'-5 days');
412 JobScheduleType::IN_DAYS,
416 'Every 5 Days Schedule / Did run withing the last 5 Days' => [
419 JobScheduleType::IN_DAYS,
421 JobScheduleType::IN_DAYS,
428 return self::$now->modify(
'-4 days');
430 JobScheduleType::IN_DAYS,
440 #[DataProvider('jobProvider')] 444 ?callable $last_run_datetime_callable,
446 ?
int $schedule_value,
449 $last_run_datetime = $last_run_datetime_callable ? $last_run_datetime_callable() :
null;
452 $job_instance->
isDue($last_run_datetime, $schedule_type, $schedule_value, $is_manual_run),
453 'Last run: ' . ($last_run_datetime ? $last_run_datetime->format(DATE_ATOM) :
'never')
459 yield
'Different Week' => [
462 JobScheduleType::WEEKLY,
464 JobScheduleType::WEEKLY,
472 return self::$now->modify(
'-1 week');
477 yield
'Same Week and Year, but different Month: December (now) and January (Last run)' => [
480 JobScheduleType::WEEKLY,
482 JobScheduleType::WEEKLY,
497 yield
'Same Week and Year and same Month: January' => [
500 JobScheduleType::WEEKLY,
502 JobScheduleType::WEEKLY,
510 return self::$now->modify(
517 yield
'Same Week (52nd), but Year Difference > 1' => [
520 JobScheduleType::WEEKLY,
522 JobScheduleType::WEEKLY,
530 return self::$now->modify(
'tuesday this week')->modify(
537 yield
'Same Week (52nd) in different Years, but Turn of the Year' => [
540 JobScheduleType::WEEKLY,
542 JobScheduleType::WEEKLY,
550 return self::$now->modify(
557 yield
'Same Week (52nd) in different Years, but not Turn of the Year' => [
560 JobScheduleType::WEEKLY,
562 JobScheduleType::WEEKLY,
581 #[DataProvider('weeklyScheduleProvider')] 584 callable $last_run_datetime_provider,
587 $last_run_datetime = $last_run_datetime_provider();
591 $job_instance->
isDue(
597 'Last run: ' . $last_run_datetime->format(DATE_ATOM)
getScheduleType()
Get current schedule type (if flexible)
testSchedule(CronJob $job_instance, bool $is_manual_run, ?callable $last_run_datetime_callable, JobScheduleType $schedule_type, ?int $schedule_value, bool $should_be_due)
isDue(?\DateTimeImmutable $last_run, ?JobScheduleType $schedule_type, ?int $schedule_value, bool $is_manually_executed=false)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
static DateTimeImmutable $this_quarter_start
getScheduleValue()
Get current schedule value (if flexible)
static DateTimeImmutable $now
testWeeklySchedules(CronJob $job_instance, callable $last_run_datetime_provider, bool $should_be_due)
static weeklyScheduleProvider()
__construct(Container $dic, ilPlugin $plugin)
static getJob(bool $has_flexible_schedule, JobScheduleType $default_schedule_type, ?int $default_schedule_value, JobScheduleType $schedule_type, ?int $schedule_value)