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 / TotalDonors.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
TotalDonors.php
214 lines
1 <?php
2
3 /**
4 * Total donors endpoint
5 *
6 * @package Give
7 */
8
9 namespace Give\API\Endpoints\Reports;
10
11 class TotalDonors extends Endpoint {
12
13 protected $payments;
14
15 public function __construct() {
16 $this->endpoint = 'total-donors';
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 $dataset = [];
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 $tooltips = [];
71 $donors = [];
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 $donorsForPeriod = $this->get_donors( $periodStart->format( 'Y-m-d H:i:s' ), $periodEnd->format( 'Y-m-d H:i:s' ) );
84
85 switch ( $intervalStr ) {
86 case 'PT12H':
87 $periodLabel = $periodStart->format( 'D ga' ) . ' - ' . $periodEnd->format( 'D ga' );
88 break;
89 case 'PT3H':
90 $periodLabel = $periodStart->format( 'D ga' ) . ' - ' . $periodEnd->format( 'D ga' );
91 break;
92 case 'PT1H':
93 $periodLabel = $periodStart->format( 'D ga' ) . ' - ' . $periodEnd->format( 'D ga' );
94 break;
95 default:
96 $periodLabel = $periodStart->format( 'M j, Y' ) . ' - ' . $periodEnd->format( 'M j, Y' );
97 }
98
99 $donors[] = [
100 'x' => $periodEnd->format( 'Y-m-d H:i:s' ),
101 'y' => $donorsForPeriod,
102 ];
103
104 $tooltips[] = [
105 'title' => $donorsForPeriod . ' ' . __( 'Donors', 'give' ),
106 'body' => __( 'Total Donors', '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 $totalDonorsForPeriod = $this->get_donors( $start->format( 'Y-m-d H:i:s' ), $end->format( 'Y-m-d H:i:s' ) );
116 $trend = $this->get_trend( $start, $end, $donors );
117
118 $diff = date_diff( $start, $end );
119 $info = $diff->days > 1 ? __( 'VS previous' ) . ' ' . $diff->days . ' ' . __( 'days', 'give' ) : __( 'VS previous day' );
120
121 // Create data objec to be returned, with 'highlights' object containing total and average figures to display
122 $data = [
123 'datasets' => [
124 [
125 'data' => $donors,
126 'tooltips' => $tooltips,
127 'trend' => $trend,
128 'info' => $info,
129 'highlight' => $totalDonorsForPeriod,
130 ],
131 ],
132 ];
133
134 return $data;
135
136 }
137
138 public function get_trend( $start, $end, $income ) {
139
140 $interval = $start->diff( $end );
141
142 $prevStart = clone $start;
143 $prevStart = date_sub( $prevStart, $interval );
144
145 $prevEnd = clone $start;
146
147 $prevDonors = $this->get_prev_donors( $prevStart->format( 'Y-m-d H:i:s' ), $prevEnd->format( 'Y-m-d H:i:s' ) );
148 $currentDonors = $this->get_donors( $start->format( 'Y-m-d H:i:s' ), $end->format( 'Y-m-d H:i:s' ) );
149
150 // Set default trend to 0
151 $trend = 0;
152
153 // Check that prev value and current value are > 0 (can't divide by 0)
154 if ( $prevDonors > 0 && $currentDonors > 0 ) {
155
156 // Check if it is a percent decreate, or increase
157 if ( $prevDonors > $currentDonors ) {
158 // Calculate a percent decrease
159 $trend = round( ( ( ( $prevDonors - $currentDonors ) / $prevDonors ) * 100 ), 1 ) * -1;
160 } elseif ( $currentDonors > $prevDonors ) {
161 // Calculate a percent increase
162 $trend = round( ( ( ( $currentDonors - $prevDonors ) / $prevDonors ) * 100 ), 1 );
163 }
164 }
165
166 return $trend;
167 }
168
169 public function get_donors( $startStr, $endStr ) {
170
171 $donors = [];
172
173 foreach ( $this->payments as $payment ) {
174 if ( $payment->date > $startStr && $payment->date < $endStr ) {
175 if ( $payment->status == 'publish' || $payment->status == 'give_subscription' ) {
176 $donors[] = $payment->donor_id;
177 }
178 }
179 }
180
181 $unique = array_unique( $donors );
182 $donorCount = count( $unique );
183
184 return $donorCount;
185 }
186
187 public function get_prev_donors( $startStr, $endStr ) {
188
189 $args = [
190 'number' => -1,
191 'paged' => 1,
192 'orderby' => 'date',
193 'order' => 'DESC',
194 'start_date' => $startStr,
195 'end_date' => $endStr,
196 ];
197
198 $prevPayments = new \Give_Payments_Query( $args );
199 $prevPayments = $prevPayments->get_payments();
200
201 $donors = [];
202 foreach ( $prevPayments as $payment ) {
203 if ( $payment->date > $startStr && $payment->date < $endStr ) {
204 $donors[] = $payment->donor_id;
205 }
206 }
207
208 $unique = array_unique( $donors );
209 $donorCount = count( $unique );
210
211 return $donorCount;
212 }
213 }
214