PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.16.3
GiveWP – Donation Plugin and Fundraising Platform v4.16.3
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 8 months ago Scripts 2 years ago CurrencyFacade.php 9 months ago Facade.php 4 years ago Str.php 3 years ago
CurrencyFacade.php
143 lines
1 <?php
2
3 namespace Give\Framework\Support\Facades;
4
5 use Give\Framework\Support\Currencies\GiveCurrencies;
6 use Give\Log\Log;
7 use Money\Converter;
8 use Money\Currencies;
9 use Money\Currencies\AggregateCurrencies;
10 use Money\Currencies\BitcoinCurrencies;
11 use Money\Currencies\ISOCurrencies;
12 use Money\Currency;
13 use Money\Exchange\FixedExchange;
14 use Money\Formatter\DecimalMoneyFormatter;
15 use Money\Formatter\IntlMoneyFormatter;
16 use Money\Money;
17 use Money\Parser\DecimalMoneyParser;
18 use NumberFormatter;
19
20
21 class CurrencyFacade
22 {
23 /**
24 * Immutably converts the given amount into the system currency.
25 *
26 * @since 2.27.3 updated to use aggregated currency list.
27 *
28 * @since 2.20.0
29 *
30 * @param Money $amount
31 * @param int|float $exchangeRate
32 */
33 public function convertToBaseCurrency(Money $amount, $exchangeRate = 1): Money
34 {
35 $baseCurrency = $this->getBaseCurrency();
36
37 if ($amount->getCurrency()->equals($baseCurrency)) {
38 return $amount;
39 }
40
41 $converter = new Converter(
42 $this->getCurrenciesList(), new FixedExchange([
43 $amount->getCurrency()->getCode() => [
44 give_get_option('currency', 'USD') => $exchangeRate,
45 ],
46 ])
47 );
48
49 return $converter->convert($amount, $baseCurrency);
50 }
51
52 /**
53 * Creates a new Money instance from a decimal amount
54 *
55 * @since 2.27.3 updated to use aggregated currency list.
56 *
57 * @since 2.20.0
58 *
59 * @param string|float|int $amount
60 */
61 public function parseFromDecimal($amount, string $currency): Money
62 {
63 return (new DecimalMoneyParser($this->getCurrenciesList()))->parse((string)$amount, new Currency($currency));
64 }
65
66 /**
67 * Returns the amount in a decimal format, not including any currency symbols:
68 * - $1,500.25 -> 1500.25
69 *
70 * @since 2.20.0
71 */
72 public function formatToDecimal(Money $amount): string
73 {
74 return (new DecimalMoneyFormatter($this->getCurrenciesList()))->format($amount);
75 }
76
77 /**
78 * Formats the amount to a currency format, including currency symbols, in the given locale.
79 *
80 * @since 2.27.3 updated to use aggregated currency list.
81 *
82 * @since 2.24.2 fallback on give formatting system if intl extension is not available
83 * @since 2.20.0
84 *
85 * @param Money $amount
86 * @param string|null $locale
87 *
88 * @return string
89 */
90 public function formatToLocale(Money $amount, $locale = null): string
91 {
92 $useAutoFormatting = give_get_option('auto_format_currency');
93 if (!class_exists(NumberFormatter::class) || !$useAutoFormatting) {
94 if ($useAutoFormatting) {
95 Log::warning(
96 '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.'
97 );
98 }
99
100 return give_currency_filter(
101 $this->formatToDecimal($amount),
102 ['currency' => $amount->getCurrency()->getCode()]
103 );
104 }
105
106 if ($locale === null) {
107 $locale = get_locale();
108 }
109
110 $numberFormatter = new NumberFormatter($locale, NumberFormatter::CURRENCY);
111 $moneyFormatter = new IntlMoneyFormatter($numberFormatter, $this->getCurrenciesList());
112
113 return $moneyFormatter->format($amount);
114 }
115
116 /**
117 * Retrieves the system's base currency
118 *
119 * @since 2.20.0
120 *
121 * @return Currency
122 */
123 public function getBaseCurrency(): Currency
124 {
125 return new Currency(give_get_option('currency', 'USD'));
126 }
127
128 /**
129 * Retrieves a list for all supported currencies.
130 *
131 * @since 4.10.0 Updated to use GiveCurrencies as the primary source of currencies
132 * @since 2.27.3
133 */
134 private function getCurrenciesList(): Currencies
135 {
136 return new AggregateCurrencies([
137 new GiveCurrencies(),
138 new ISOCurrencies(),
139 new BitcoinCurrencies(),
140 ]);
141 }
142 }
143