}> */ public static function all(): array { return [ [ 'task_type' => OnboardingTaskType::VerifyPermissions, 'title' => 'Verify permissions', 'step' => 4, 'prerequisites' => [], ], [ 'task_type' => OnboardingTaskType::ConsentStatus, 'title' => 'Check consent status', 'step' => 4, 'prerequisites' => [OnboardingTaskType::VerifyPermissions], ], [ 'task_type' => OnboardingTaskType::ConnectionDiagnostics, 'title' => 'Run connection diagnostics', 'step' => 4, 'prerequisites' => [OnboardingTaskType::VerifyPermissions], ], [ 'task_type' => OnboardingTaskType::InitialSync, 'title' => 'Initial sync', 'step' => 5, 'prerequisites' => [OnboardingTaskType::VerifyPermissions], ], ]; } /** * @return array{task_type: string, title: string, step: int, prerequisites: array}|null */ public static function find(string $taskType): ?array { foreach (self::all() as $task) { if ($task['task_type'] === $taskType) { return $task; } } return null; } /** * @param array $latestEvidenceStatusByTaskType */ public static function prerequisitesMet(string $taskType, array $latestEvidenceStatusByTaskType): bool { return count(self::unmetPrerequisites($taskType, $latestEvidenceStatusByTaskType)) === 0; } /** * @param array $latestEvidenceStatusByTaskType * @return array */ public static function unmetPrerequisites(string $taskType, array $latestEvidenceStatusByTaskType): array { $task = self::find($taskType); if (! $task) { return []; } $unmet = []; foreach ($task['prerequisites'] as $requiredTaskType) { $status = $latestEvidenceStatusByTaskType[$requiredTaskType] ?? 'unknown'; if ($status !== 'ok') { $unmet[] = $requiredTaskType; } } return $unmet; } }