PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.12.3
GiveWP – Donation Plugin and Fundraising Platform v2.12.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 / ValueObjects / Money.php
give / src / ValueObjects Last commit date
Address.php 5 years ago CardInfo.php 5 years ago DonorInfo.php 5 years ago Money.php 5 years ago ValueObjects.php 6 years ago
Money.php
123 lines
1 <?php
2
3 namespace Give\ValueObjects;
4
5 /**
6 * Class Money
7 * @package Give\ValueObjects
8 *
9 * @since 2.9.0
10 * @since 2.11.0 Refactored to make the minor amount the base.
11 */
12 class Money {
13 /**
14 * The amount in smallest unit of currency.
15 * @var int
16 */
17 protected $minorAmount;
18
19 /**
20 * @var array
21 */
22 protected $currencyData;
23
24 /**
25 * Money constructor.
26 * @param int $minorAmount
27 * @param array $currencyData
28 */
29 public function __construct( $minorAmount, $currencyData ) {
30 $this->minorAmount = $minorAmount;
31 $this->currencyData = $currencyData;
32 }
33
34 /**
35 * Get amount in smallest unit of currency.
36 *
37 * @sicne 2.9.0
38 * @since 2.11.0 Round minor amount to account for floating point precision.
39 *
40 * @return int
41 */
42 public function getMinorAmount() {
43 return $this->minorAmount;
44 }
45
46 /**
47 * Get amount in smallest unit of currency.
48 *
49 * @sicne 2.9.0
50 *
51 * @return string
52 */
53 public function getAmount() {
54 if ( $this->currencyData['setting']['number_decimals'] ) {
55 return $this->minorAmount / ( 10 ** $this->currencyData['setting']['number_decimals'] );
56 }
57 return $this->minorAmount;
58 }
59
60 // Static Methods and Factories
61
62 /**
63 * @since 2.9.0
64 * @since 2.11.0 Converts the amount to a minor amount when creating an instance.
65 *
66 * @param int|string $amount Amount value without currency formatting
67 * @param string $currency
68 *
69 * @return Money
70 */
71 public static function of( $amount, $currency ) {
72
73 $currencyData = self::getCurrencyData( $currency );
74
75 /**
76 * When working with float values, be careful when casting to an integer.
77 * Due to "floating point precision", the output may not match the expected value.
78 *
79 * @link https://www.php.net/manual/en/language.types.float.php
80 * This can lead to confusing results:
81 * for example, floor((0.1+0.7)*10) will usually return 7 instead of the expected 8,
82 * since the internal representation will be something like 7.9999999999999991118....
83 */
84 $amount = absint(
85 round( $amount * ( 10 ** $currencyData['setting']['number_decimals'] ) )
86 );
87
88 return new static( $amount, $currencyData );
89 }
90
91 /**
92 * @since 2.9.0
93 *
94 * @param int|string $minorAmount
95 * @param string $currency
96 *
97 * @return Money
98 */
99 public static function ofMinor( $minorAmount, $currency ) {
100 return new static( $minorAmount, self::getCurrencyData( $currency ) );
101 }
102
103 /**
104 * Retrieves the currency data for a given currency with some optimizations to avoid loading all the currencies more
105 * than once.
106 *
107 * @since 2.9.0
108 *
109 * @param $currency
110 *
111 * @return array
112 */
113 private static function getCurrencyData( $currency ) {
114 static $currenciesData = null;
115
116 if ( $currenciesData === null ) {
117 $currenciesData = give_get_currencies( 'all' );
118 }
119
120 return $currenciesData[ $currency ];
121 }
122 }
123