*/ use HasFactory, Notifiable, HasApiTokens; /** * The attributes that are mass assignable. * * @var list */ protected $fillable = [ 'name', 'email', 'password', 'rf_lpudoctor_id', 'rf_department_id', 'current_role_id' ]; /** * 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 department(): BelongsTo { return $this->belongsTo(Department::class, 'rf_department_id'); } public function userRoles(): HasMany { return $this->hasMany(UserRole::class, 'rf_user_id', 'id'); } public function roles(): HasManyThrough { return $this->hasManyThrough( Role::class, UserRole::class, 'rf_user_id', 'role_id', 'id', 'rf_role_id' ); } public function currentRole() { $defaultRoleId = $this->roles()->where('is_default', true)->first()->role_id; $sessionKey = 'user_' . $this->id . '_current_role'; $roleId = $this->current_role_id ?? $defaultRoleId; $role = Role::where('role_id', $roleId)->first(); return $role; } // Методы для проверки ролей public function isAdmin() { return $this->currentRole()->slug === 'admin'; } public function isDoctor() { return $this->currentRole()->slug === 'doctor'; } public function isHeadOfDepartment() { return $this->currentRole()->slug === 'head_of_department'; } // Получение доступных отделений public function availableDepartments() { $departments = Department::all(); if ($this->isAdmin()) { return $departments; } return $this->department ? [$this->department] : []; } // Получение доступных действий public function permissions() { $permissions = [ 'view_dashboard' => true, 'view_metrics' => true, 'view_reports' => true, ]; if ($this->isAdmin() || $this->isDoctor() || $this->isHeadOfDepartment()) { $permissions['create_metrics'] = true; $permissions['edit_metrics'] = true; $permissions['delete_metrics'] = true; $permissions['manage_users'] = $this->isAdmin(); } return $permissions; } }