sources), new HeadNurseReport($this->sources), ]; foreach (ReportTemplate::all() as $template) { $definitions[] = new TemplateReportDefinition($template, $this->sources); } return $definitions; } /** @return ReportDefinition[] */ public function availableFor(User $user): array { return array_values(array_filter( $this->all(), fn (ReportDefinition $definition) => $this->isVisible($definition, $user) )); } public function find(string $code, User $user): ?ReportDefinition { foreach ($this->availableFor($user) as $definition) { if ($definition->code() === $code) { return $definition; } } return null; } private function isVisible(ReportDefinition $definition, User $user): bool { $permissions = $definition->requiredPermissions(); if (empty($permissions)) { return $user->currentRoleCan('report.view') || $user->currentRoleCan('nurse.report.view'); } foreach ($permissions as $permission) { if ($user->currentRoleCan($permission)) { return true; } } return false; } }