$tasks * @property-read int|null $tasks_count * * @method static \Database\Factories\ScheduleFactory factory($count = null, $state = []) * @method static \Illuminate\Database\Eloquent\Builder|Schedule newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|Schedule newQuery() * @method static \Illuminate\Database\Eloquent\Builder|Schedule query() * @method static \Illuminate\Database\Eloquent\Builder|Schedule whereCreatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Schedule whereCronDayOfMonth($value) * @method static \Illuminate\Database\Eloquent\Builder|Schedule whereCronDayOfWeek($value) * @method static \Illuminate\Database\Eloquent\Builder|Schedule whereCronHour($value) * @method static \Illuminate\Database\Eloquent\Builder|Schedule whereCronMinute($value) * @method static \Illuminate\Database\Eloquent\Builder|Schedule whereCronMonth($value) * @method static \Illuminate\Database\Eloquent\Builder|Schedule whereId($value) * @method static \Illuminate\Database\Eloquent\Builder|Schedule whereIsActive($value) * @method static \Illuminate\Database\Eloquent\Builder|Schedule whereIsProcessing($value) * @method static \Illuminate\Database\Eloquent\Builder|Schedule whereLastRunAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Schedule whereName($value) * @method static \Illuminate\Database\Eloquent\Builder|Schedule whereNextRunAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Schedule whereOnlyWhenOnline($value) * @method static \Illuminate\Database\Eloquent\Builder|Schedule whereServerId($value) * @method static \Illuminate\Database\Eloquent\Builder|Schedule whereUpdatedAt($value) */ class Schedule extends Model implements Validatable { use HasFactory; use HasValidation; /** * The resource name for this model when it is transformed into an * API representation using fractal. */ public const RESOURCE_NAME = 'server_schedule'; /** * Always return the tasks associated with this schedule. */ protected $with = ['tasks']; /** * Mass assignable attributes on this model. */ protected $fillable = [ 'server_id', 'name', 'cron_day_of_week', 'cron_month', 'cron_day_of_month', 'cron_hour', 'cron_minute', 'is_active', 'is_processing', 'only_when_online', 'last_run_at', 'next_run_at', ]; protected $attributes = [ 'name' => null, 'cron_day_of_week' => '*', 'cron_month' => '*', 'cron_day_of_month' => '*', 'cron_hour' => '*', 'cron_minute' => '*', 'is_active' => true, 'is_processing' => false, 'only_when_online' => false, ]; /** @var array */ public static array $validationRules = [ 'server_id' => ['required', 'exists:servers,id'], 'name' => ['required', 'string', 'max:255'], 'cron_day_of_week' => ['required', 'string'], 'cron_month' => ['required', 'string'], 'cron_day_of_month' => ['required', 'string'], 'cron_hour' => ['required', 'string'], 'cron_minute' => ['required', 'string'], 'is_active' => ['boolean'], 'is_processing' => ['boolean'], 'only_when_online' => ['boolean'], 'last_run_at' => ['nullable', 'date'], 'next_run_at' => ['nullable', 'date'], ]; protected function casts(): array { return [ 'id' => 'integer', 'server_id' => 'integer', 'is_active' => 'boolean', 'is_processing' => 'boolean', 'only_when_online' => 'boolean', 'last_run_at' => 'datetime', 'next_run_at' => 'datetime', ]; } protected function status(): Attribute { return Attribute::make( get: fn () => !$this->is_active ? ScheduleStatus::Inactive : ($this->is_processing ? ScheduleStatus::Processing : ScheduleStatus::Active), ); } /** * Returns the schedule's execution crontab entry as a string. * * @throws Exception */ public function getNextRunDate(): string { return Utilities::getScheduleNextRunDate($this->cron_minute, $this->cron_hour, $this->cron_day_of_month, $this->cron_month, $this->cron_day_of_week)->toDateTimeString(); } /** * Return tasks belonging to a schedule. */ public function tasks(): HasMany { return $this->hasMany(Task::class); } /** * Return the server model that a schedule belongs to. */ public function server(): BelongsTo { return $this->belongsTo(Server::class); } public function firstTask(): ?Task { /** @var ?Task $task */ $task = $this->tasks()->orderBy('sequence_id')->first(); return $task; } }