PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.30.0
GiveWP – Donation Plugin and Fundraising Platform v2.30.0
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 / ValueObjects / Money.php
give / src / Framework / Support / ValueObjects Last commit date
Enum.php 4 years ago EnumInteractsWithQueryBuilder.php 3 years ago Money.php 3 years ago
Money.php
160 lines
1 <?php
2
3 namespace Give\Framework\Support\ValueObjects;
4
5 use Give\Framework\Exceptions\Primitives\InvalidArgumentException;
6 use Give\Framework\Support\Currency;
7 use Money\Currency as VendorCurrency;
8 use Money\Money as VendorMoney;
9
10 /**
11 * A decorator class for the vendor Money class which adds additional formatting and other convenience methods. Try and
12 * keep the vendor Money logic in the Currency facade.
13 *
14 * @since 2.20.0
15 *
16 * @method bool equals(Money $money )
17 * @method Money subtract(Money $money)
18 * @method Money add(Money $money)
19 *
20 * @mixin VendorMoney
21 */
22 class Money
23 {
24 /**
25 * @var VendorMoney
26 */
27 private $amount;
28
29 /**
30 * @since 2.20.0
31 *
32 * @param string|int $amount
33 * @param string|VendorCurrency $currency
34 */
35 public function __construct($amount, $currency)
36 {
37 if (!$currency instanceof VendorCurrency) {
38 $currency = new VendorCurrency($currency);
39 }
40
41 $this->amount = new VendorMoney($amount, $currency);
42 }
43
44 /**
45 * Returns the amount in the smallest unit of the currency.
46 *
47 * @since 2.20.0
48 *
49 * @return string
50 */
51 public function formatToMinorAmount()
52 {
53 return $this->amount->getAmount();
54 }
55
56 /**
57 * Returns a new instance converted to the system base currency
58 *
59 * @since 2.20.0
60 *
61 * @param $exchangeRate
62 *
63 * @return Money
64 */
65 public function inBaseCurrency($exchangeRate = 1)
66 {
67 return self::fromMoney(Currency::convertToBaseCurrency($this->amount, $exchangeRate));
68 }
69
70 /**
71 * Returns the amount in a decimal format, not including any currency symbols:
72 * - $1,500.25 -> 1500.25
73 *
74 * @since 2.20.0
75 *
76 * @return string
77 */
78 public function formatToDecimal()
79 {
80 return Currency::formatToDecimal($this->amount);
81 }
82
83 /**
84 * Formats the amount to a currency format, including currency symbols, in the given locale.
85 *
86 * @since 2.20.0
87 *
88 * @param string|null $locale
89 *
90 * @return string
91 */
92 public function formatToLocale($locale = null)
93 {
94 return Currency::formatToLocale($this->amount, $locale);
95 }
96
97 /**
98 * Passes all unknown method calls to the underlying vendor Money instance.
99 * Any instance of this class in arguments will be converted to the underlying vendor Money instance.
100 * If the returned value is an instance of the vendor Money class, it will be converted to an instance of this class.
101 *
102 * @since 2.20.0
103 *
104 * @param $name
105 * @param $arguments
106 *
107 * @return mixed
108 */
109 public function __call($name, $arguments)
110 {
111 if (!method_exists($this->amount, $name)) {
112 throw new InvalidArgumentException("Invalid method: $name");
113 }
114
115 if (!empty($arguments)) {
116 $arguments = array_map(static function ($argument) {
117 if ($argument instanceof Money) {
118 return $argument->amount;
119 }
120
121 return $argument;
122 }, $arguments);
123 }
124
125 $value = $this->amount->$name(...$arguments);
126
127 if ($value instanceof VendorMoney) {
128 return self::fromMoney($value);
129 }
130
131 return $value;
132 }
133
134 /**
135 * Returns a new, immutable instance from a vendor Money instance
136 *
137 * @since 2.20.0
138 *
139 * @param VendorMoney $money
140 *
141 * @return Money
142 */
143 public static function fromMoney(VendorMoney $money)
144 {
145 return new self($money->getAmount(), $money->getCurrency());
146 }
147
148 /**
149 * Creates a new Money instance from a decimal amount
150 *
151 * @since 2.20.0
152 *
153 * @param string|float|int $amount
154 */
155 public static function fromDecimal($amount, string $currency): Money
156 {
157 return self::fromMoney(Currency::parseFromDecimal($amount, $currency));
158 }
159 }
160