*/ public static function options(): array { return [ self::PAID => self::label(self::PAID), self::UNPAID => self::label(self::UNPAID), self::PENDING => self::label(self::PENDING), self::FAILED => self::label(self::FAILED), self::NOT_REQUIRED => self::label(self::NOT_REQUIRED), self::REFUNDED => self::label(self::REFUNDED), self::PARTIALLY_REFUNDED => self::label(self::PARTIALLY_REFUNDED), ]; } /** * @return string[] */ public static function all(): array { return array_keys(self::options()); } public static function valid(string $status): bool { return in_array($status, self::all(), true); } public static function canCompleteBooking(string $status): bool { return in_array($status, [ self::PAID, self::REFUNDED, self::PARTIALLY_REFUNDED, self::NOT_REQUIRED, ], true); } public static function canSatisfyCompletionAfterTransition(string $current, string $target): bool { if ($target === '') return self::canCompleteBooking($current); if (in_array($target, [self::PAID, self::NOT_REQUIRED], true)) return true; if (!in_array($target, [self::REFUNDED, self::PARTIALLY_REFUNDED], true)) return false; return in_array($current, [ self::PAID, self::REFUNDED, self::PARTIALLY_REFUNDED, ], true); } public static function normalize(string $status, string $default = self::UNPAID): string { $status = sanitize_key($status); if ($status === 'payment_pending') return self::PENDING; if ($status === 'payment_failed') return self::FAILED; if ($status === 'payment_not_required') return self::NOT_REQUIRED; if ($status === 'partially-refunded') return self::PARTIALLY_REFUNDED; if ($status === 'not-required') return self::NOT_REQUIRED; return self::valid($status) ? $status : $default; } public static function fromLegacy(string $status): string { $status = (int) $status; if ($status === 1) return self::PAID; if ($status === 2) return self::PENDING; if ($status === -2) return self::FAILED; if ($status === 3) return self::NOT_REQUIRED; if ($status === -1) return self::REFUNDED; if ($status === -3) return self::PARTIALLY_REFUNDED; return self::UNPAID; } }