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