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