'One Time', self::MONTHLY => 'Monthly', self::QUARTERLY => 'Quarterly', self::SEMI_ANNUALLY => 'Semi Annually', self::ANNUALLY => 'Annually', self::BIENNIALLY => 'Biennially', self::TRIENNIALLY => 'Triennially', }; } public function vietnameseLabel(): string { return match ($this) { self::ONE_TIME => 'Một lần', self::MONTHLY => 'Hàng tháng', self::QUARTERLY => '3 tháng', self::SEMI_ANNUALLY => '6 tháng', self::ANNUALLY => 'Hàng năm', self::BIENNIALLY => '2 năm', self::TRIENNIALLY => '3 năm', }; } public static function vietnameseLabelFor(?string $code): string { return self::tryFrom((string) $code)?->vietnameseLabel() ?? BillingCycleCatalog::labelForCode($code) ?? ($code ?: 'N/A'); } public static function vietnameseLabelForMonths(int $months): string { $cycle = collect(self::cases())->first(fn (self $case) => $case->months() === $months && $months > 0); return $cycle?->vietnameseLabel() ?? BillingCycleCatalog::labelForMonths($months); } public function months(): int { return match ($this) { self::ONE_TIME => 0, self::MONTHLY => 1, self::QUARTERLY => 3, self::SEMI_ANNUALLY => 6, self::ANNUALLY => 12, self::BIENNIALLY => 24, self::TRIENNIALLY => 36, }; } /** * Resolve from the legacy admin integer billing code: * 2 → monthly, 3 → quarterly, 4 → semi_annually, 5 → annually */ public static function fromLegacyCode(int $code): self { return match ($code) { 2 => self::MONTHLY, 3 => self::QUARTERLY, 4 => self::SEMI_ANNUALLY, 5 => self::ANNUALLY, 6 => self::BIENNIALLY, 7 => self::TRIENNIALLY, default => self::MONTHLY, }; } }