PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.7.2
GiveWP – Donation Plugin and Fundraising Platform v2.7.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 6 years ago DonationsVsIncome.php 6 years ago Endpoint.php 6 years ago FormPerformance.php 6 years ago Income.php 6 years ago IncomeBreakdown.php 6 years ago PaymentMethods.php 6 years ago PaymentStatuses.php 6 years ago RecentDonations.php 6 years ago TopDonors.php 6 years ago TotalDonors.php 6 years ago TotalIncome.php 6 years ago TotalRefunds.php 6 years ago
AverageDonation.php
184 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 get_report( $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 > 7 ):
44 $data = $this->get_data( $start, $end, 'PT12H' );
45 break;
46 case ( $diff->days > 2 ):
47 $data = $this->get_data( $start, $end, 'PT3H' );
48 break;
49 case ( $diff->days >= 0 ):
50 $data = $this->get_data( $start, $end, 'PT1H' );
51 break;
52 }
53
54 return $data;
55 }
56
57 public function get_data( $start, $end, $intervalStr ) {
58
59 $income = [];
60 $tooltips = [];
61
62 $interval = new \DateInterval( $intervalStr );
63
64 $periodStart = clone $start;
65 $periodEnd = clone $start;
66
67 // Subtract interval to set up period start
68 date_sub( $periodStart, $interval );
69
70 while ( $periodStart < $end ) {
71
72 $averageForPeriod = $this->get_average_donation( $periodStart->format( 'Y-m-d H:i:s' ), $periodEnd->format( 'Y-m-d H:i:s' ) );
73
74 if ( $intervalStr == 'PT1H' ) {
75 $periodLabel = $periodStart->format( 'D ga' ) . ' - ' . $periodEnd->format( 'D ga' );
76 } else {
77 $periodLabel = $periodStart->format( 'M j, Y' ) . ' - ' . $periodEnd->format( 'M j, Y' );
78 }
79
80 $income[] = [
81 'x' => $periodEnd->format( 'Y-m-d H:i:s' ),
82 'y' => $averageForPeriod,
83 ];
84
85 $tooltips[] = [
86 'title' => give_currency_filter(
87 give_format_amount( $averageForPeriod ),
88 [
89 'currency_code' => $this->currency,
90 'decode_currency' => true,
91 ]
92 ),
93 'body' => __( 'Avg Donation', 'give' ),
94 'footer' => $periodLabel,
95 ];
96
97 // Add interval to set up next period
98 date_add( $periodStart, $interval );
99 date_add( $periodEnd, $interval );
100 }
101
102 $averageIncomeForPeriod = $this->get_average_donation( $start->format( 'Y-m-d H:i:s' ), $end->format( 'Y-m-d H:i:s' ) );
103 $trend = $this->get_trend( $start, $end, $income );
104
105 $diff = date_diff( $start, $end );
106 $info = $diff->days > 1 ? __( 'VS previous', 'give' ) . ' ' . $diff->days . ' ' . __( 'days', 'give' ) : __( 'VS previous day', 'give' );
107
108 // Create data objec to be returned, with 'highlights' object containing total and average figures to display
109 $data = [
110 'datasets' => [
111 [
112 'data' => $income,
113 'tooltips' => $tooltips,
114 'trend' => $trend,
115 'info' => $info,
116 'highlight' => give_currency_filter(
117 give_format_amount( $averageIncomeForPeriod ),
118 [
119 'currency_code' => $this->currency,
120 'decode_currency' => true,
121 ]
122 ),
123 ],
124 ],
125 ];
126
127 return $data;
128
129 }
130
131 public function get_trend( $start, $end, $income ) {
132
133 $interval = $start->diff( $end );
134
135 $prevStart = clone $start;
136 $prevStart = date_sub( $prevStart, $interval );
137
138 $prevEnd = clone $start;
139
140 $prevAverage = $this->get_average_donation( $prevStart->format( 'Y-m-d H:i:s' ), $prevEnd->format( 'Y-m-d H:i:s' ) );
141 $currentAverage = $this->get_average_donation( $start->format( 'Y-m-d H:i:s' ), $end->format( 'Y-m-d H:i:s' ) );
142
143 // Set default trend to 0
144 $trend = 0;
145
146 // Check that prev value and current value are > 0 (can't divide by 0)
147 if ( $prevAverage > 0 && $currentAverage > 0 ) {
148
149 // Check if it is a percent decreate, or increase
150 if ( $prevAverage > $currentAverage ) {
151 // Calculate a percent decrease
152 $trend = ( ( ( $prevAverage - $currentAverage ) / $prevAverage ) * 100 ) * -1;
153 } elseif ( $currentAverage > $prevAverage ) {
154 // Calculate a percent increase
155 $trend = ( ( $currentAverage - $prevAverage ) / $prevAverage ) * 100;
156 }
157 }
158
159 return $trend;
160 }
161
162 public function get_average_donation( $startStr, $endStr ) {
163
164 $paymentObjects = $this->get_payments( $startStr, $endStr );
165
166 $earnings = 0;
167 $paymentCount = 0;
168
169 foreach ( $paymentObjects as $paymentObject ) {
170 if ( $paymentObject->date > $startStr && $paymentObject->date < $endStr ) {
171 if ( $paymentObject->status == 'publish' || $paymentObject->status == 'give_subscription' ) {
172 $earnings += $paymentObject->total;
173 $paymentCount += 1;
174 }
175 }
176 }
177
178 $average = $paymentCount > 0 ? $earnings / $paymentCount : 0;
179
180 // Return rounded average (avoid displaying figures with many decimal places)
181 return round( $average, 2 );
182 }
183 }
184