87 lines
2.5 KiB
PHP
87 lines
2.5 KiB
PHP
<?php
|
|
|
|
namespace App\Enums\Product;
|
|
|
|
use App\Support\BillingCycleCatalog;
|
|
|
|
enum ProductBillingCycle: string
|
|
{
|
|
case ONE_TIME = 'onetime';
|
|
case MONTHLY = 'monthly';
|
|
case QUARTERLY = 'quarterly';
|
|
case SEMI_ANNUALLY = 'semi_annually';
|
|
case ANNUALLY = 'annually';
|
|
case BIENNIALLY = 'biennially';
|
|
case TRIENNIALLY = 'triennially';
|
|
|
|
public function label(): string
|
|
{
|
|
return match ($this) {
|
|
self::ONE_TIME => '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,
|
|
};
|
|
}
|
|
}
|