*/ use HasFactory; protected $guarded = []; /** * @return array */ protected function casts(): array { return [ 'archived_at' => 'datetime', 'closed_at' => 'datetime', ]; } /** * @return BelongsTo */ public function closedByPlatformUser(): BelongsTo { return $this->belongsTo(PlatformUser::class, 'closed_by_platform_user_id'); } /** * @return HasMany */ public function memberships(): HasMany { return $this->hasMany(WorkspaceMembership::class); } /** * @return BelongsToMany */ public function users(): BelongsToMany { return $this->belongsToMany(User::class, 'workspace_memberships') ->using(WorkspaceMembership::class) ->withPivot(['id', 'role']) ->withTimestamps(); } /** * @return HasMany */ public function tenants(): HasMany { return $this->managedEnvironments(); } /** * @return HasMany */ public function managedEnvironments(): HasMany { return $this->hasMany(ManagedEnvironment::class); } /** * @return HasMany */ public function settings(): HasMany { return $this->hasMany(WorkspaceSetting::class); } /** * @return HasOne */ public function subscription(): HasOne { return $this->hasOne(WorkspaceSubscription::class); } /** * @return HasMany */ public function supportAccessGrants(): HasMany { return $this->hasMany(SupportAccessGrant::class); } /** * @return HasMany */ public function tenantSettings(): HasMany { return $this->hasMany(TenantSetting::class); } public function isClosed(): bool { return $this->closed_at !== null; } public function isArchived(): bool { return $this->archived_at !== null; } public function isSelectableAsContext(): bool { return ! $this->isArchived() && ! $this->isClosed(); } public function closureReason(): ?string { $reason = trim((string) $this->closed_reason); return $reason === '' ? null : $reason; } }