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