'integer', 'project_phase_id' => 'integer', 'task_name' => 'string', 'description' => 'string', 'assigned_by' => 'integer', 'url' => 'string', 'priority_id' => 'integer', 'status_id' => 'integer', 'important' => 'integer', 'relative_position' => 'float', 'estimate' => 'integer', 'start_date' => 'date', 'due_date' => 'date', ]; /** * @var array */ protected $dates = [ 'created_at', 'updated_at', 'deleted_at', ]; protected const PERMISSIONS = ['update', 'destroy']; protected static function boot(): void { parent::boot(); static::addGlobalScope(new TaskAccessScope); static::deleting(static function (Task $task) { $task->timeIntervals()->delete(); $task->parents()->detach(); $task->children()->detach(); CronTaskWorkers::whereTaskId($task->id)->delete(); }); static::updated(static function (Task $task) { if ($task->getOriginal('project_id') !== $task->project_id) { $task->parents()->detach(); $task->children()->detach(); } }); static::created(static function (Task $task) { dispatch(static function () use ($task) { foreach ($task->users as $user) { $task->project->users()->firstOrCreate( ['id' => $user->id], ['role_id' => \App\Enums\Role::USER] ); } }); }); static::updated(static function (Task $task) { dispatch(static function () use ($task) { foreach ($task->users as $user) { $task->project->users()->firstOrCreate( ['id' => $user->id], ['role_id' => \App\Enums\Role::USER] ); } }); }); } public function timeIntervals(): HasMany { return $this->hasMany(TimeInterval::class, 'task_id'); } public function users(): BelongsToMany { return $this->belongsToMany(User::class, 'tasks_users', 'task_id', 'user_id')->withoutGlobalScopes(); } public function comments(): HasMany { return $this->hasMany(TaskComment::class, 'task_id'); } public function project(): BelongsTo { return $this->belongsTo(Project::class, 'project_id')->withoutGlobalScopes(); } public function assigned(): BelongsTo { return $this->belongsTo(User::class, 'assigned_by'); } public function priority(): BelongsTo { return $this->belongsTo(Priority::class, 'priority_id'); } public function status(): BelongsTo { return $this->belongsTo(Status::class, 'status_id'); } public function getDescription(): string { return tap(new Parsedown())->text($this->description); } public function changes(): HasMany { return $this->hasMany(TaskHistory::class, 'task_id'); } public function properties(): MorphMany { return $this->morphMany(Property::class, 'entity'); } public function workers(): HasMany { return $this->hasMany(CronTaskWorkers::class, 'task_id', 'id'); } public function phase(): BelongsTo { return $this->belongsTo(ProjectPhase::class, 'project_phase_id'); } // related to attachments public function getProjectId(): int { return $this->project_id; } // Below methods are related to Cattr gantt functionality and LaravelAdjacencyList package public function getPivotTableName(): string { return 'tasks_relations'; } public function enableCycleDetection(): bool { return true; } public function includeCycleStart(): bool { return true; } }