PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.9.7
GiveWP – Donation Plugin and Fundraising Platform v2.9.7
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 5 years ago DonationsVsIncome.php 5 years ago Endpoint.php 5 years ago FormPerformance.php 5 years ago Income.php 5 years ago IncomeBreakdown.php 5 years ago PaymentMethods.php 5 years ago PaymentStatuses.php 5 years ago RecentDonations.php 5 years ago TopDonors.php 5 years ago TotalDonors.php 5 years ago TotalIncome.php 5 years ago TotalRefunds.php 5 years ago
TotalDonors.php
175 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 getReport( $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 > 5 ):
32 $data = $this->get_data( $start, $end, 'P1D' );
33 break;
34 case ( $diff->days > 4 ):
35 $data = $this->get_data( $start, $end, 'PT12H' );
36 break;
37 case ( $diff->days > 2 ):
38 $data = $this->get_data( $start, $end, 'PT3H' );
39 break;
40 case ( $diff->days >= 0 ):
41 $data = $this->get_data( $start, $end, 'PT1H' );
42 break;
43 }
44
45 return $data;
46 }
47
48 public function get_data( $start, $end, $intervalStr ) {
49
50 $tooltips = [];
51 $donors = [];
52
53 $interval = new \DateInterval( $intervalStr );
54
55 $periodStart = clone $start;
56 $periodEnd = clone $start;
57
58 // Subtract interval to set up period start
59 date_sub( $periodStart, $interval );
60
61 while ( $periodStart < $end ) {
62
63 $donorsForPeriod = $this->get_donors( $periodStart->format( 'Y-m-d H:i:s' ), $periodEnd->format( 'Y-m-d H:i:s' ) );
64 $time = $periodEnd->format( 'Y-m-d H:i:s' );
65
66 switch ( $intervalStr ) {
67 case 'P1D':
68 $time = $periodStart->format( 'Y-m-d' );
69 $periodLabel = $periodStart->format( 'l' );
70 break;
71 case 'PT12H':
72 case 'PT3H':
73 case 'PT1H':
74 $periodLabel = $periodStart->format( 'D ga' ) . ' - ' . $periodEnd->format( 'D ga' );
75 break;
76 default:
77 $periodLabel = $periodStart->format( 'M j, Y' ) . ' - ' . $periodEnd->format( 'M j, Y' );
78 }
79
80 $donors[] = [
81 'x' => $time,
82 'y' => $donorsForPeriod,
83 ];
84
85 $tooltips[] = [
86 'title' => sprintf( _n( '%d Donor', '%d Donors', $donorsForPeriod, 'give' ), $donorsForPeriod ),
87 'body' => __( 'Total Donors', 'give' ),
88 'footer' => $periodLabel,
89 ];
90
91 // Add interval to set up next period
92 date_add( $periodStart, $interval );
93 date_add( $periodEnd, $interval );
94 }
95
96 if ( $intervalStr === 'P1D' ) {
97 $donors = array_slice( $donors, 1 );
98 $tooltips = array_slice( $tooltips, 1 );
99 }
100
101 $totalDonorsForPeriod = $this->get_donors( $start->format( 'Y-m-d H:i:s' ), $end->format( 'Y-m-d H:i:s' ) );
102 $trend = $this->get_trend( $start, $end, $donors );
103
104 $diff = date_diff( $start, $end );
105 $info = $diff->days > 1 ? __( 'VS previous', 'give' ) . ' ' . $diff->days . ' ' . __( 'days', 'give' ) : __( 'VS previous day', 'give' );
106
107 // Create data objec to be returned, with 'highlights' object containing total and average figures to display
108 $data = [
109 'datasets' => [
110 [
111 'data' => $donors,
112 'tooltips' => $tooltips,
113 'trend' => $trend,
114 'info' => $info,
115 'highlight' => $totalDonorsForPeriod,
116 ],
117 ],
118 ];
119
120 return $data;
121
122 }
123
124 public function get_trend( $start, $end, $income ) {
125
126 $interval = $start->diff( $end );
127
128 $prevStart = clone $start;
129 $prevStart = date_sub( $prevStart, $interval );
130
131 $prevEnd = clone $start;
132
133 $prevDonors = $this->get_donors( $prevStart->format( 'Y-m-d H:i:s' ), $prevEnd->format( 'Y-m-d H:i:s' ) );
134 $currentDonors = $this->get_donors( $start->format( 'Y-m-d H:i:s' ), $end->format( 'Y-m-d H:i:s' ) );
135
136 // Set default trend to 0
137 $trend = 0;
138
139 // Check that prev value and current value are > 0 (can't divide by 0)
140 if ( $prevDonors > 0 && $currentDonors > 0 ) {
141
142 // Check if it is a percent decreate, or increase
143 if ( $prevDonors > $currentDonors ) {
144 // Calculate a percent decrease
145 $trend = ( ( ( $prevDonors - $currentDonors ) / $prevDonors ) * 100 ) * -1;
146 } elseif ( $currentDonors > $prevDonors ) {
147 // Calculate a percent increase
148 $trend = ( ( $currentDonors - $prevDonors ) / $prevDonors ) * 100;
149 }
150 }
151
152 return $trend;
153 }
154
155 public function get_donors( $startStr, $endStr ) {
156
157 $paymentObjects = $this->getPayments( $startStr, $endStr );
158
159 $donors = [];
160
161 foreach ( $paymentObjects as $paymentObject ) {
162 if ( $paymentObject->date >= $startStr && $paymentObject->date < $endStr ) {
163 if ( $paymentObject->status == 'publish' || $paymentObject->status == 'give_subscription' ) {
164 $donors[] = $paymentObject->donor_id;
165 }
166 }
167 }
168
169 $unique = array_unique( $donors );
170 $donorCount = count( $unique );
171
172 return $donorCount;
173 }
174 }
175