PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.24.2
GiveWP – Donation Plugin and Fundraising Platform v2.24.2
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 / API / Endpoints / Reports / AverageDonation.php
give / src / API / Endpoints / Reports Last commit date
AverageDonation.php 4 years ago DonationsVsIncome.php 4 years ago Endpoint.php 4 years ago FormPerformance.php 4 years ago Income.php 4 years ago IncomeBreakdown.php 4 years ago PaymentMethods.php 4 years ago PaymentStatuses.php 4 years ago RecentDonations.php 4 years ago TopDonors.php 4 years ago TotalDonors.php 4 years ago TotalIncome.php 4 years ago TotalRefunds.php 4 years ago
AverageDonation.php
223 lines
1 <?php
2
3 /**
4 * Income over time endpoint
5 *
6 * @package Give
7 */
8
9 namespace Give\API\Endpoints\Reports;
10
11 use WP_REST_Request;
12
13 class AverageDonation extends Endpoint
14 {
15
16 protected $payments;
17
18 public function __construct()
19 {
20 $this->endpoint = 'average-donation';
21 }
22
23 /**
24 * Handle rest request.
25 *
26 * @since 2.6.0
27 *
28 * @param WP_REST_Request $request
29 *
30 * @return array
31 */
32 public function getReport($request)
33 {
34 $start = date_create($request->get_param('start'));
35 $end = date_create($request->get_param('end'));
36 $diff = date_diff($start, $end);
37
38 $data = [];
39
40 switch (true) {
41 case ($diff->days > 12):
42 $interval = round($diff->days / 12);
43 $data = $this->get_data($start, $end, 'P' . $interval . 'D');
44 break;
45 case ($diff->days > 5):
46 $data = $this->get_data($start, $end, 'P1D');
47 break;
48 case ($diff->days > 4):
49 $data = $this->get_data($start, $end, 'PT12H');
50 break;
51 case ($diff->days > 2):
52 $data = $this->get_data($start, $end, 'PT3H');
53 break;
54 case ($diff->days >= 0):
55 $data = $this->get_data($start, $end, 'PT1H');
56 break;
57 }
58
59 return $data;
60 }
61
62 public function get_data($start, $end, $intervalStr)
63 {
64 $tooltips = [];
65 $income = [];
66
67 $interval = new \DateInterval($intervalStr);
68
69 $periodStart = clone $start;
70 $periodEnd = clone $start;
71
72 // Subtract interval to set up period start
73 date_sub($periodStart, $interval);
74
75 while ($periodStart < $end) {
76 $avgIncomeForPeriod = $this->get_average_income(
77 $periodStart->format('Y-m-d H:i:s'),
78 $periodEnd->format('Y-m-d H:i:s')
79 );
80 $time = $periodEnd->format('Y-m-d H:i:s');
81
82 switch ($intervalStr) {
83 case 'P1D':
84 $periodLabel = $periodStart->format('l');
85 break;
86 case 'PT12H':
87 case 'PT3H':
88 case 'PT1H':
89 $periodLabel = $periodStart->format('D ga') . ' - ' . $periodEnd->format('D ga');
90 break;
91 default:
92 $periodLabel = $periodStart->format('M j, Y') . ' - ' . $periodEnd->format('M j, Y');
93 }
94
95 $income[] = [
96 'x' => $time,
97 'y' => $avgIncomeForPeriod,
98 ];
99
100 $tooltips[] = [
101 'title' => give_currency_filter(
102 give_format_amount($avgIncomeForPeriod),
103 [
104 'currency_code' => $this->currency,
105 'decode_currency' => true,
106 'sanitize' => false,
107 ]
108 ),
109 'body' => __('Avg Revenue', 'give'),
110 'footer' => $periodLabel,
111 ];
112
113 // Add interval to set up next period
114 date_add($periodStart, $interval);
115 date_add($periodEnd, $interval);
116 }
117
118 if ($intervalStr === 'P1D') {
119 $income = array_slice($income, 1);
120 $tooltips = array_slice($tooltips, 1);
121 }
122
123 $totalAvgIncomeForPeriod = $this->get_average_income(
124 $start->format('Y-m-d H:i:s'),
125 $end->format('Y-m-d H:i:s')
126 );
127 $trend = $this->get_trend($start, $end, $income);
128
129 $diff = date_diff($start, $end);
130 $info = $diff->days > 1 ? __('VS previous', 'give') . ' ' . $diff->days . ' ' . __('days', 'give') : __(
131 'VS previous day',
132 'give'
133 );
134
135 // Create data object to be returned, with 'highlights' object containing total and average figures to display
136 $data = [
137 'datasets' => [
138 [
139 'data' => $income,
140 'tooltips' => $tooltips,
141 'trend' => $trend,
142 'info' => $info,
143 'highlight' => give_currency_filter(
144 give_format_amount($totalAvgIncomeForPeriod),
145 [
146 'currency_code' => $this->currency,
147 'decode_currency' => true,
148 'sanitize' => false,
149 ]
150 ),
151 ],
152 ],
153 ];
154
155 return $data;
156 }
157
158 public function get_trend($start, $end, $income)
159 {
160 $interval = $start->diff($end);
161
162 $prevStart = clone $start;
163 $prevStart = date_sub($prevStart, $interval);
164
165 $prevEnd = clone $start;
166
167 $prevAverage = $this->get_average_income($prevStart->format('Y-m-d H:i:s'), $prevEnd->format('Y-m-d H:i:s'));
168 $currentAverage = $this->get_average_income($start->format('Y-m-d H:i:s'), $end->format('Y-m-d H:i:s'));
169
170 // Set default trend to 0
171 $trend = 0;
172
173 // Check that prev value and current value are > 0 (can't divide by 0)
174 if ($prevAverage > 0 && $currentAverage > 0) {
175 // Check if it is a percent decreate, or increase
176 if ($prevAverage > $currentAverage) {
177 // Calculate a percent decrease
178 $trend = ((($prevAverage - $currentAverage) / $prevAverage) * 100) * -1;
179 } elseif ($currentAverage > $prevAverage) {
180 // Calculate a percent increase
181 $trend = (($currentAverage - $prevAverage) / $prevAverage) * 100;
182 }
183 }
184
185 return $trend;
186 }
187
188 /**
189 * Calculate average income for a period
190 *
191 * Based on provided start and end strings, return the calculated income,
192 * rounded to the appropriate decimal place for the currently queried currency
193 *
194 * @since 2.6.0
195 **@param string $endStr Period end string
196 *
197 * @param string $startStr Period start string
198 *
199 * @return float Average income float (rounded to the decimal place of currently queried currency)
200 */
201 public function get_average_income($startStr, $endStr)
202 {
203 $paymentObjects = $this->getPayments($startStr, $endStr);
204
205 $earnings = 0;
206 $paymentCount = 0;
207
208 foreach ($paymentObjects as $paymentObject) {
209 if ($paymentObject->date >= $startStr && $paymentObject->date < $endStr) {
210 if ($paymentObject->status == 'publish' || $paymentObject->status == 'give_subscription') {
211 $earnings += $paymentObject->total;
212 $paymentCount += 1;
213 }
214 }
215 }
216
217 $averageIncome = $paymentCount > 0 ? $earnings / $paymentCount : 0;
218
219 // Return rounded average (avoid displaying figures with many decimal places)
220 return round($averageIncome, give_get_price_decimals($this->currency));
221 }
222 }
223