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