*/ use HasFactory, Notifiable; /** * The attributes that are mass assignable. * * @var list */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for serialization. * * @var list */ protected $hidden = [ 'password', 'remember_token', ]; /** * Get the attributes that should be cast. * * @return array */ protected function casts(): array { return [ 'email_verified_at' => 'datetime', 'password' => 'hashed', ]; } public function canAccessPanel(Panel $panel): bool { return true; } public function tenants(): BelongsToMany { return $this->belongsToMany(Tenant::class) ->withPivot('role') ->withTimestamps(); } public function tenantPreferences(): HasMany { return $this->hasMany(UserTenantPreference::class); } private function tenantPivotTableExists(): bool { static $exists; return $exists ??= Schema::hasTable('tenant_user'); } private function tenantPreferencesTableExists(): bool { static $exists; return $exists ??= Schema::hasTable('user_tenant_preferences'); } public function tenantRole(Tenant $tenant): ?TenantRole { if (! $this->tenantPivotTableExists()) { return null; } $role = $this->tenants() ->whereKey($tenant->getKey()) ->value('role'); if (! is_string($role)) { return null; } return TenantRole::tryFrom($role); } public function canSyncTenant(Tenant $tenant): bool { $role = $this->tenantRole($tenant); return $role?->canSync() ?? false; } public function canAccessTenant(Model $tenant): bool { if (! $tenant instanceof Tenant) { return false; } if (! $this->tenantPivotTableExists()) { return false; } return $this->tenants() ->whereKey($tenant->getKey()) ->exists(); } public function getTenants(Panel $panel): array|Collection { if (! $this->tenantPivotTableExists()) { return collect(); } return $this->tenants() ->where('status', 'active') ->orderBy('name') ->get(); } public function getDefaultTenant(Panel $panel): ?Model { if (! $this->tenantPivotTableExists()) { return null; } $tenantId = null; if ($this->tenantPreferencesTableExists()) { $tenantId = $this->tenantPreferences() ->whereNotNull('last_used_at') ->orderByDesc('last_used_at') ->value('tenant_id'); } if ($tenantId !== null) { $tenant = $this->tenants() ->where('status', 'active') ->whereKey($tenantId) ->first(); if ($tenant !== null) { return $tenant; } } return $this->tenants() ->where('status', 'active') ->orderBy('name') ->first(); } }