*/ use HasApiTokens, HasFactory, Notifiable; /** * The attributes that are mass assignable. * * @var list */ protected $fillable = [ 'email', 'name', 'password', 'username', 'preferred_locale', 'first_name', 'last_name', 'address', 'phone', 'role', 'tenant_id', 'pending_purchase', ]; /** * 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', 'pending_purchase' => 'boolean', ]; } /** * Retrieve the user by the given credentials. */ public function retrieveByCredentials(array $credentials) { if ($this->getProvider()->hasTable($this->getTable())) { return $this->newModelQuery() ->where(function ($query) use ($credentials) { // Handle 'login' field for email or username if (isset($credentials['login'])) { $login = $credentials['login']; $query->where('email', $login) ->orWhere('username', $login); } else { foreach ($this->getAuthIdentifiers() as $key => $value) { $query->where($key, $value); } } }) ->first(); } return null; } public function sendEmailVerificationNotification(): void { $this->notify(new VerifyEmailNotification); } protected function fullName(): Attribute { return Attribute::make( get: fn () => trim(($this->first_name ?? '').' '.($this->last_name ?? '')) ?: $this->name, ); } public function getFilamentName(): string { if ($this->first_name && $this->last_name) { return trim($this->first_name.' '.$this->last_name); } return $this->username ?? $this->email ?? 'Unnamed User'; } public function tenant(): BelongsTo { return $this->belongsTo(Tenant::class); } public function canAccessPanel(Panel $panel): bool { if (! $this->email_verified_at && $this->role !== 'super_admin') { return false; } return match ($panel->getId()) { 'superadmin' => $this->role === 'super_admin', 'admin' => $this->role === 'tenant_admin', default => false, }; } public function canAccessTenant(Model $tenant): bool { if ($this->role === 'super_admin') { return true; } $ownedTenant = $this->tenant; if (! $ownedTenant) { return false; } return (int) $tenant->getKey() === (int) $ownedTenant->getKey(); } public function getTenants(Panel $panel): array|Collection { if ($this->role === 'super_admin') { return Tenant::query()->orderBy('name')->get(); } $tenant = $this->tenant; return $tenant ? collect([$tenant]) : collect(); } public function eventMemberships(): HasMany { return $this->hasMany(EventMember::class); } public function dataExports(): HasMany { return $this->hasMany(DataExport::class); } }