'integer', 'name' => 'string', 'description' => 'string', 'important' => 'integer', 'source' => 'string', 'default_priority_id' => 'integer', ]; /** * @var array */ protected $dates = [ 'deleted_at', 'created_at', 'updated_at', ]; protected const PERMISSIONS = ['update', 'update_members', 'destroy']; protected static function boot(): void { parent::boot(); static::addGlobalScope(new ProjectAccessScope); static::deleting(static function (Project $project) { CronTaskWorkers::whereHas( 'task', static fn(EloquentBuilder $query) => $query ->where('project_id', '=', $project->id) )->delete(); $project->tasks()->delete(); }); } public function tasks(): HasMany { return $this->hasMany(Task::class, 'project_id'); } public function phases(): HasMany { return $this->hasMany(ProjectPhase::class); } public function users(): BelongsToMany { return $this->belongsToMany(User::class, 'projects_users') ->withPivot('role_id') ->using(ProjectUserPivot::class) ->withoutGlobalScopes(); } public function group(): BelongsTo { return $this->belongsTo(ProjectGroup::class, 'group'); } public function defaultPriority(): HasOne { return $this->hasOne(Priority::class, 'id', 'default_priority_id'); } public function statuses(): BelongsToMany { return $this->belongsToMany(Status::class, 'projects_statuses', 'project_id', 'status_id')->withPivot('color'); } public function getNameAttribute(): string { return empty($this->attributes['source']) || $this->attributes['source'] === 'internal' ? $this->attributes['name'] : ucfirst($this->attributes['source']) . ": {$this->attributes['name']}"; } public function properties(): MorphMany { return $this->morphMany(Property::class, 'entity'); } public function workers(): HasManyThrough { return $this->hasManyThrough(CronTaskWorkers::class, Task::class); } public function tasksRelations(): Attribute { $tasksIdsQuery = $this->tasks()->select('id'); return Attribute::make(get: fn() => DB::table('tasks_relations') ->whereIn('parent_id', $tasksIdsQuery) ->orWhereIn('child_id', $tasksIdsQuery) ->get(['parent_id', 'child_id']))->shouldCache(); } protected function screenshotsState(): Attribute { return Attribute::make( get: static function ($value): ScreenshotsState { $projectState = ScreenshotsState::withGlobalOverrides($value); return match ($projectState) { null => ScreenshotsState::REQUIRED, ScreenshotsState::ANY => ScreenshotsState::OPTIONAL, default => $projectState, }; }, set: static fn ($value) => (string)ScreenshotsState::getNormalizedValue($value), )->shouldCache(); } }