*/ use HasFactory; protected function casts(): array { return [ 'show_author' => 'boolean', 'show_story_points' => 'boolean', ]; } protected static function booted(): void { static::deleting(function (self $project): void { $project->permissionAssignments()->delete(); }); } protected function key(): Attribute { return Attribute::make( set: fn (string $value): string => Str::upper(trim($value)), ); } public function permissionAssignments(): MorphMany { return $this->morphMany(PermissionAssignment::class, 'scope'); } public function boardColumns(): HasMany { return $this->hasMany(BoardColumn::class) ->orderBy('position'); } public function ticketFieldDefinitions(): HasMany { return $this->hasMany(TicketFieldDefinition::class) ->orderBy('position'); } public function ticketPriorities(): HasMany { return $this->hasMany(TicketPriority::class) ->orderBy('position'); } public function ticketLinkTypes(): HasMany { return $this->hasMany(TicketLinkType::class) ->orderBy('position'); } public function ticketStatuses(): HasMany { return $this->hasMany(TicketStatus::class) ->orderBy('board_column_id') ->orderBy('position'); } public function ticketTypes(): HasMany { return $this->hasMany(TicketType::class) ->orderBy('position'); } public function repositoryConnections(): HasMany { return $this->hasMany(RepositoryConnection::class) ->orderBy('provider') ->orderBy('repository_full_name'); } public function tickets(): HasMany { return $this->hasMany(Ticket::class) ->orderByDesc('sequence_number'); } }