PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.6.0
GiveWP – Donation Plugin and Fundraising Platform v2.6.0
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
192 lines
1 <?php
2
3 /**
4 * Income over time endpoint
5 *
6 * @package Give
7 */
8
9 namespace Give\API\Endpoints\Reports;
10
11 class AverageDonation extends Endpoint {
12
13 protected $payments;
14
15 public function __construct() {
16 $this->endpoint = 'average-donation';
17 }
18
19 public function get_report( $request ) {
20
21 // Check if a cached version exists
22 $cached_report = $this->get_cached_report( $request );
23 if ( $cached_report !== null ) {
24 // Bail and return the cached version
25 return new \WP_REST_Response(
26 [
27 'data' => $cached_report,
28 ]
29 );
30 }
31
32 $start = date_create( $request['start'] );
33 $end = date_create( $request['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 // Cache the report data
55 $result = $this->cache_report( $request, $data );
56 $status = $this->get_give_status();
57
58 return new \WP_REST_Response(
59 [
60 'data' => $data,
61 'status' => $status,
62 ]
63 );
64 }
65
66 public function get_data( $start, $end, $intervalStr ) {
67
68 $this->payments = $this->get_payments( $start->format( 'Y-m-d' ), $end->format( 'Y-m-d' ) );
69
70 $income = [];
71 $tooltips = [];
72
73 $interval = new \DateInterval( $intervalStr );
74
75 $periodStart = clone $start;
76 $periodEnd = clone $start;
77
78 // Subtract interval to set up period start
79 date_sub( $periodStart, $interval );
80
81 while ( $periodStart < $end ) {
82
83 $averageForPeriod = $this->get_average_donation( $periodStart->format( 'Y-m-d H:i:s' ), $periodEnd->format( 'Y-m-d H:i:s' ) );
84
85 if ( $intervalStr == 'PT1H' ) {
86 $periodLabel = $periodStart->format( 'D ga' ) . ' - ' . $periodEnd->format( 'D ga' );
87 } else {
88 $periodLabel = $periodStart->format( 'M j, Y' ) . ' - ' . $periodEnd->format( 'M j, Y' );
89 }
90
91 $income[] = [
92 'x' => $periodEnd->format( 'Y-m-d H:i:s' ),
93 'y' => $averageForPeriod,
94 ];
95
96 $tooltips[] = [
97 'title' => give_currency_filter( give_format_amount( $averageForPeriod ), [ 'decode_currency' => true ] ),
98 'body' => __( 'Avg Donation', 'give' ),
99 'footer' => $periodLabel,
100 ];
101
102 // Add interval to set up next period
103 date_add( $periodStart, $interval );
104 date_add( $periodEnd, $interval );
105 }
106
107 $averageIncomeForPeriod = $this->get_average_donation( $start->format( 'Y-m-d H:i:s' ), $end->format( 'Y-m-d H:i:s' ) );
108 $trend = $this->get_trend( $start, $end, $income );
109
110 $diff = date_diff( $start, $end );
111 $info = $diff->days > 1 ? __( 'VS previous', 'give' ) . ' ' . $diff->days . ' ' . __( 'days', 'give' ) : __( 'VS previous day', 'give' );
112
113 // Create data objec to be returned, with 'highlights' object containing total and average figures to display
114 $data = [
115 'datasets' => [
116 [
117 'data' => $income,
118 'tooltips' => $tooltips,
119 'trend' => $trend,
120 'info' => $info,
121 'highlight' => give_currency_filter( give_format_amount( $averageIncomeForPeriod ), [ 'decode_currency' => true ] ),
122 ],
123 ],
124 ];
125
126 return $data;
127
128 }
129
130 public function get_trend( $start, $end, $income ) {
131
132 $interval = $start->diff( $end );
133
134 $prevStart = clone $start;
135 $prevStart = date_sub( $prevStart, $interval );
136
137 $prevEnd = clone $start;
138
139 $prevAverage = $this->get_prev_average_donation( $prevStart->format( 'Y-m-d H:i:s' ), $prevEnd->format( 'Y-m-d H:i:s' ) );
140 $currentAverage = $this->get_average_donation( $start->format( 'Y-m-d H:i:s' ), $end->format( 'Y-m-d H:i:s' ) );
141
142 // Set default trend to 0
143 $trend = 0;
144
145 // Check that prev value and current value are > 0 (can't divide by 0)
146 if ( $prevAverage > 0 && $currentAverage > 0 ) {
147
148 // Check if it is a percent decreate, or increase
149 if ( $prevAverage > $currentAverage ) {
150 // Calculate a percent decrease
151 $trend = round( ( ( ( $prevAverage - $currentAverage ) / $prevAverage ) * 100 ), 1 ) * -1;
152 } elseif ( $currentAverage > $prevAverage ) {
153 // Calculate a percent increase
154 $trend = round( ( ( ( $currentAverage - $prevAverage ) / $prevAverage ) * 100 ), 1 );
155 }
156 }
157
158 return $trend;
159 }
160
161 public function get_average_donation( $startStr, $endStr ) {
162
163 $earnings = 0;
164 $paymentCount = 0;
165
166 foreach ( $this->payments as $payment ) {
167 if ( $payment->date > $startStr && $payment->date < $endStr ) {
168 if ( $payment->status == 'publish' || $payment->status == 'give_subscription' ) {
169 $earnings += $payment->total;
170 $paymentCount += 1;
171 }
172 }
173 }
174
175 $average = $paymentCount > 0 ? $earnings / $paymentCount : 0;
176
177 return $average;
178 }
179
180 public function get_prev_average_donation( $startStr, $endStr ) {
181
182 $stats = new \Give_Payment_Stats();
183
184 $earnings = $stats->get_earnings( 0, $startStr, $endStr );
185 $sales = $stats->get_sales( 0, $startStr, $endStr );
186
187 $average = $sales > 0 ? $earnings / $sales : 0;
188
189 return $average;
190 }
191 }
192