'boolean', ]; /** * Get the permissions assigned to this role */ public function permissions(): BelongsToMany { return $this->belongsToMany(Permission::class, 'role_permissions') ->withTimestamps(); } /** * Get users assigned to this role */ public function users(): BelongsToMany { return $this->belongsToMany(User::class, 'user_roles') ->withPivot(['branch_code', 'is_active', 'assigned_at', 'expires_at']) ->withTimestamps(); } /** * Check if role has a specific permission */ public function hasPermission(string $permission): bool { return $this->permissions()->where('name', $permission)->exists(); } /** * Assign permission to role */ public function givePermission(Permission|string $permission): self { if (is_string($permission)) { $permission = Permission::where('name', $permission)->first(); } if ($permission && !$this->hasPermission($permission->name)) { $this->permissions()->attach($permission->id); } return $this; } /** * Remove permission from role */ public function revokePermission(Permission|string $permission): self { if (is_string($permission)) { $permission = Permission::where('name', $permission)->first(); } if ($permission) { $this->permissions()->detach($permission->id); } return $this; } /** * Sync permissions for role */ public function syncPermissions(array $permissions): self { $permissionIds = collect($permissions)->map(function ($permission) { if (is_string($permission)) { return Permission::where('name', $permission)->first()?->id; } return $permission instanceof Permission ? $permission->id : $permission; })->filter()->toArray(); $this->permissions()->sync($permissionIds); return $this; } }