> */ private static array $allowedTransitions = [ RegistrationStatus::DRAFT->value => [ RegistrationStatus::SUBMITTED->value, RegistrationStatus::PENDING_PAYMENT->value, // accepter directement pour paiement (sans passer par Soumis) RegistrationStatus::CANCELLED->value, ], RegistrationStatus::SUBMITTED->value => [ RegistrationStatus::PENDING_PAYMENT->value, RegistrationStatus::REJECTED->value, RegistrationStatus::CANCELLED->value, ], RegistrationStatus::PENDING_PAYMENT->value => [ RegistrationStatus::PAID->value, RegistrationStatus::CANCELLED->value, RegistrationStatus::CORRECTION->value, ], RegistrationStatus::CORRECTION->value => [ RegistrationStatus::PENDING_PAYMENT->value, ], RegistrationStatus::PAID->value => [ RegistrationStatus::REFUNDED->value, ], // États terminaux : aucune transition autorisée RegistrationStatus::REJECTED->value => [], RegistrationStatus::CANCELLED->value => [], RegistrationStatus::REFUNDED->value => [], ]; /** * Obtenir les transitions autorisées depuis un statut * * @param RegistrationStatus|string $fromStatus * @return array Liste des statuts vers lesquels on peut transitionner */ public static function allowedTransitions(RegistrationStatus|string $fromStatus): array { $statusValue = $fromStatus instanceof RegistrationStatus ? $fromStatus->value : $fromStatus; return self::$allowedTransitions[$statusValue] ?? []; } /** * Vérifier si une transition est autorisée * * @param RegistrationStatus|string $fromStatus * @param RegistrationStatus|string $toStatus * @return bool */ public static function canTransition(RegistrationStatus|string $fromStatus, RegistrationStatus|string $toStatus): bool { $fromValue = $fromStatus instanceof RegistrationStatus ? $fromStatus->value : $fromStatus; $toValue = $toStatus instanceof RegistrationStatus ? $toStatus->value : $toStatus; // Si même statut, transition autorisée (no-op) if ($fromValue === $toValue) { return true; } $allowed = self::allowedTransitions($fromValue); return in_array($toValue, $allowed, true); } /** * Obtenir un message d'erreur descriptif pour une transition invalide * * @param RegistrationStatus|string $fromStatus * @param RegistrationStatus|string $toStatus * @return string */ public static function getErrorMessage(RegistrationStatus|string $fromStatus, RegistrationStatus|string $toStatus): string { $fromValue = $fromStatus instanceof RegistrationStatus ? $fromStatus->value : $fromStatus; $toValue = $toStatus instanceof RegistrationStatus ? $toStatus->value : $toStatus; $allowed = self::allowedTransitions($fromValue); if (empty($allowed)) { return "Le statut '{$fromValue}' est un état final. Aucune transition n'est autorisée."; } $allowedList = implode(', ', array_map(fn($s) => "'{$s}'", $allowed)); return "La transition de '{$fromValue}' vers '{$toValue}' n'est pas autorisée. Transitions autorisées depuis '{$fromValue}' : {$allowedList}."; } }