This repository was archived by the owner on Jun 30, 2023. It is now read-only.
forked from laravel/cashier-mollie
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCashier.php
232 lines (202 loc) · 5.05 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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
<?php
namespace Laravel\Cashier;
use Exception;
use Jenssegers\Mongodb\Eloquent\Model;
use Laravel\Cashier\Order\Order;
use Laravel\Cashier\Order\OrderItem;
use Money\Currencies\ISOCurrencies;
use Money\Formatter\IntlMoneyFormatter;
use Money\Money;
class Cashier
{
/**
* The current currency.
*
* @var string
*/
protected static $currency = 'eur';
/**
* The current currency symbol.
*
* @var string
*/
protected static $currencySymbol = '€';
/**
* The current currency symbol.
*
* @var string
*/
protected static $currencyLocale = 'de_DE';
/**
* The custom currency formatter.
*
* @var callable
*/
protected static $formatCurrencyUsing;
/**
* Indicates if Cashier migrations will be run.
*
* @var bool
*/
public static $runsMigrations = true;
/**
* Indicates if Cashier routes will be registered.
*
* @var bool
*/
public static $registersRoutes = true;
/**
* Process scheduled OrderItems
*
* @return \Illuminate\Support\Collection
*/
public static function run()
{
$items = OrderItem::shouldProcess()->get();
$orders = $items->chunkByOwnerAndCurrency()->map(function ($chunk) {
return Order::createFromItems($chunk)->processPayment();
});
return $orders;
}
/**
* Set the default currency for this merchant.
*
* @param string $currency
* @param string|null $symbol
* @return void
* @throws \Exception
*/
public static function useCurrency($currency, $symbol = null)
{
static::$currency = $currency;
static::useCurrencySymbol($symbol ?: static::guessCurrencySymbol($currency));
}
/**
* Set the currency symbol to be used when formatting currency.
*
* @param string $symbol
* @return void
*/
public static function useCurrencySymbol($symbol)
{
static::$currencySymbol = $symbol;
}
/**
* Set the currency locale to be used when formatting currency.
*
* @param string $locale
* @return void
*/
public static function useCurrencyLocale($locale)
{
static::$currencyLocale = $locale;
}
/**
* Guess the currency symbol for the given currency.
*
* @param string $currency
* @return string
* @throws \Exception
*/
protected static function guessCurrencySymbol($currency)
{
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()
{
return static::$currency;
}
/**
* Get the currency symbol currently in use.
*
* @return string
*/
public static function usesCurrencySymbol()
{
return static::$currencySymbol;
}
/**
* Get the currency locale currently in use.
*
* @return string
*/
public static function usesCurrencyLocale()
{
return static::$currencyLocale;
}
/**
* Set the custom currency formatter.
*
* @param callable $callback
* @return void
*/
public static function formatCurrencyUsing(callable $callback)
{
static::$formatCurrencyUsing = $callback;
}
/**
* Format the given amount into a displayable currency.
*
* @param \Money\Money $money
* @return string
*/
public static function formatAmount(Money $money)
{
if (static::$formatCurrencyUsing) {
return call_user_func(static::$formatCurrencyUsing, $money);
}
$numberFormatter = new \NumberFormatter(static::$currencyLocale, \NumberFormatter::CURRENCY);
$moneyFormatter = new IntlMoneyFormatter($numberFormatter, new ISOCurrencies);
return $moneyFormatter->format($money);
}
/**
* @param \Illuminate\Database\Eloquent\Model $owner
* @return null|string
*/
public static function getLocale(Model $owner)
{
if(method_exists($owner, 'getLocale')) {
$locale = $owner->getLocale();
if(!empty($locale)) {
return $locale;
}
}
return config('cashier.locale');
}
/**
* Configure Cashier to not register its migrations.
*
* @return static
*/
public static function ignoreMigrations()
{
static::$runsMigrations = false;
return new static;
}
/**
* Configure Cashier to not register its routes.
*
* @return static
*/
public static function ignoreRoutes()
{
static::$registersRoutes = false;
return new static;
}
}