PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.4.0
GiveWP – Donation Plugin and Fundraising Platform v4.4.0
4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / Framework / Support / Facades / CurrencyFacade.php
give / src / Framework / Support / Facades Last commit date
ActionScheduler 1 year ago DateTime 1 year ago Scripts 2 years ago CurrencyFacade.php 3 years ago Facade.php 4 years ago Str.php 3 years ago
CurrencyFacade.php
140 lines
1 <?php
2
3 namespace Give\Framework\Support\Facades;
4
5 use Give\Log\Log;
6 use Money\Converter;
7 use Money\Currencies;
8 use Money\Currencies\AggregateCurrencies;
9 use Money\Currencies\BitcoinCurrencies;
10 use Money\Currencies\ISOCurrencies;
11 use Money\Currency;
12 use Money\Exchange\FixedExchange;
13 use Money\Formatter\DecimalMoneyFormatter;
14 use Money\Formatter\IntlMoneyFormatter;
15 use Money\Money;
16 use Money\Parser\DecimalMoneyParser;
17 use NumberFormatter;
18
19
20 class CurrencyFacade
21 {
22 /**
23 * Immutably converts the given amount into the system currency.
24 *
25 * @since 2.27.3 updated to use aggregated currency list.
26 *
27 * @since 2.20.0
28 *
29 * @param Money $amount
30 * @param int|float $exchangeRate
31 */
32 public function convertToBaseCurrency(Money $amount, $exchangeRate = 1): Money
33 {
34 $baseCurrency = $this->getBaseCurrency();
35
36 if ($amount->getCurrency()->equals($baseCurrency)) {
37 return $amount;
38 }
39
40 $converter = new Converter(
41 $this->getCurrenciesList(), new FixedExchange([
42 $amount->getCurrency()->getCode() => [
43 give_get_option('currency', 'USD') => $exchangeRate,
44 ],
45 ])
46 );
47
48 return $converter->convert($amount, $baseCurrency);
49 }
50
51 /**
52 * Creates a new Money instance from a decimal amount
53 *
54 * @since 2.27.3 updated to use aggregated currency list.
55 *
56 * @since 2.20.0
57 *
58 * @param string|float|int $amount
59 */
60 public function parseFromDecimal($amount, string $currency): Money
61 {
62 return (new DecimalMoneyParser($this->getCurrenciesList()))->parse((string)$amount, new Currency($currency));
63 }
64
65 /**
66 * Returns the amount in a decimal format, not including any currency symbols:
67 * - $1,500.25 -> 1500.25
68 *
69 * @since 2.20.0
70 */
71 public function formatToDecimal(Money $amount): string
72 {
73 return (new DecimalMoneyFormatter($this->getCurrenciesList()))->format($amount);
74 }
75
76 /**
77 * Formats the amount to a currency format, including currency symbols, in the given locale.
78 *
79 * @since 2.27.3 updated to use aggregated currency list.
80 *
81 * @since 2.24.2 fallback on give formatting system if intl extension is not available
82 * @since 2.20.0
83 *
84 * @param Money $amount
85 * @param string|null $locale
86 *
87 * @return string
88 */
89 public function formatToLocale(Money $amount, $locale = null): string
90 {
91 $useAutoFormatting = give_get_option('auto_format_currency');
92 if (!class_exists(NumberFormatter::class) || !$useAutoFormatting) {
93 if ($useAutoFormatting) {
94 Log::warning(
95 'Auto-formatting is enabled at Donations > Settings > General > Currency but the INTL extension for PHP is not available. Please install the INTL extension to enable auto-formatting, or disable the Auto-formatting setting to prevent this error message. Most web hosts can help with installing and activating INTL. GiveWP is falling back to formatting based on the legacy settings.'
96 );
97 }
98
99 return give_currency_filter(
100 $this->formatToDecimal($amount),
101 ['currency' => $amount->getCurrency()->getCode()]
102 );
103 }
104
105 if ($locale === null) {
106 $locale = get_locale();
107 }
108
109 $numberFormatter = new NumberFormatter($locale, NumberFormatter::CURRENCY);
110 $moneyFormatter = new IntlMoneyFormatter($numberFormatter, $this->getCurrenciesList());
111
112 return $moneyFormatter->format($amount);
113 }
114
115 /**
116 * Retrieves the system's base currency
117 *
118 * @since 2.20.0
119 *
120 * @return Currency
121 */
122 public function getBaseCurrency(): Currency
123 {
124 return new Currency(give_get_option('currency', 'USD'));
125 }
126
127 /**
128 * Retrieves a list for all supported currencies.
129 *
130 * @since 2.27.3
131 */
132 private function getCurrenciesList(): Currencies
133 {
134 return new AggregateCurrencies([
135 new ISOCurrencies(),
136 new BitcoinCurrencies(),
137 ]);
138 }
139 }
140