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