-
Notifications
You must be signed in to change notification settings - Fork 26
/
Copy pathCashier.php
134 lines (121 loc) · 2.95 KB
/
Cashier.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?php
namespace yii2mod\cashier;
use yii\base\Exception;
use yii\helpers\StringHelper;
/**
* Class Cashier
*
* @package yii2mod\cashier
*/
class Cashier
{
/**
* The current currency.
*
* @var string
*/
protected static $currency = 'usd';
/**
* The current currency symbol.
*
* @var string
*/
protected static $currencySymbol = '$';
/**
* The custom currency formatter.
*
* @var callable
*/
protected static $formatCurrencyUsing;
/**
* Set the currency to be used when billing users.
*
* @param string $currency
* @param string|null $symbol
*
* @throws Exception
*/
public static function useCurrency(string $currency, ?string $symbol = null): void
{
static::$currency = $currency;
static::useCurrencySymbol($symbol ?: static::guessCurrencySymbol($currency));
}
/**
* Guess the currency symbol for the given currency.
*
* @param string $currency
*
* @return string
*
* @throws Exception
*/
protected static function guessCurrencySymbol(string $currency): string
{
switch (strtolower($currency)) {
case 'usd':
case 'aud':
case 'cad':
return '$';
case 'eur':
return '€';
case 'gbp':
return '£';
default:
throw new Exception('Unable to guess symbol for currency. Please explicitly specify it.');
}
}
/**
* Get the currency currently in use.
*
* @return string
*/
public static function usesCurrency(): string
{
return static::$currency;
}
/**
* Set the currency symbol to be used when formatting currency.
*
* @param string $symbol
*/
public static function useCurrencySymbol(string $symbol): void
{
static::$currencySymbol = $symbol;
}
/**
* Get the currency symbol currently in use.
*
* @return string
*/
public static function usesCurrencySymbol(): string
{
return static::$currencySymbol;
}
/**
* Set the custom currency formatter.
*
* @param callable $callback
*/
public static function formatCurrencyUsing(callable $callback): void
{
static::$formatCurrencyUsing = $callback;
}
/**
* Format the given amount into a displayable currency.
*
* @param int $amount
*
* @return string
*/
public static function formatAmount(int $amount): string
{
if (static::$formatCurrencyUsing) {
return call_user_func(static::$formatCurrencyUsing, $amount);
}
$amount = number_format($amount / 100, 2);
if (StringHelper::startsWith($amount, '-')) {
return '-' . static::usesCurrencySymbol() . ltrim($amount, '-');
}
return static::usesCurrencySymbol() . $amount;
}
}