[self::PAYMENT_INITIALIZING, self::EXPIRED], self::PENDING_PAYMENT => [self::PROCESSING, self::PAYMENT_FAILED, self::PAYMENT_INITIALIZING, self::EXPIRED, self::MANUAL_REVIEW], self::PAYMENT_INITIALIZING => [self::DRAFT, self::PENDING_PAYMENT, self::MANUAL_REVIEW], self::PROCESSING => [self::COMPLETED, self::MANUAL_REVIEW], self::PAYMENT_FAILED => [self::PAYMENT_INITIALIZING, self::EXPIRED], self::COMPLETED => [], self::EXPIRED => [], self::MANUAL_REVIEW => [], ]; public static function all(): array { return array_keys(self::TRANSITIONS); } public static function canTransition(string $from, string $to): bool { return in_array($to, self::TRANSITIONS[$from] ?? [], true); } public static function isExpired(?int $expiresAt, ?int $now = null): bool { return $expiresAt !== null && $expiresAt <= ($now ?? time()); } }