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 / TotalIncome.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
TotalIncome.php
189 lines
1 <?php
2
3 /**
4 * Income over time endpoint
5 *
6 * @package Give
7 */
8
9 namespace Give\API\Endpoints\Reports;
10
11 class TotalIncome extends Endpoint {
12
13 protected $payments;
14
15 public function __construct() {
16 $this->endpoint = 'total-income';
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 $income = [];
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 $incomeForPeriod = $this->get_income( $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 $income[] = [
81 'x' => $time,
82 'y' => $incomeForPeriod,
83 ];
84
85 $tooltips[] = [
86 'title' => give_currency_filter(
87 give_format_amount( $incomeForPeriod ),
88 [
89 'currency_code' => $this->currency,
90 'decode_currency' => true,
91 'sanitize' => false,
92 ]
93 ),
94 'body' => __( 'Total Revenue', 'give' ),
95 'footer' => $periodLabel,
96 ];
97
98 // Add interval to set up next period
99 date_add( $periodStart, $interval );
100 date_add( $periodEnd, $interval );
101 }
102
103 if ( $intervalStr === 'P1D' ) {
104 $income = array_slice( $income, 1 );
105 $tooltips = array_slice( $tooltips, 1 );
106 }
107
108 $totalIncomeForPeriod = $this->get_income( $start->format( 'Y-m-d H:i:s' ), $end->format( 'Y-m-d H:i:s' ) );
109 $trend = $this->get_trend( $start, $end, $income );
110
111 $diff = date_diff( $start, $end );
112 $info = $diff->days > 1 ? __( 'VS previous', 'give' ) . ' ' . $diff->days . ' ' . __( 'days', 'give' ) : __( 'VS previous day', 'give' );
113
114 // Create data objec to be returned, with 'highlights' object containing total and average figures to display
115 $data = [
116 'datasets' => [
117 [
118 'data' => $income,
119 'tooltips' => $tooltips,
120 'trend' => $trend,
121 'info' => $info,
122 'highlight' => give_currency_filter(
123 give_format_amount( $totalIncomeForPeriod ),
124 [
125 'currency_code' => $this->currency,
126 'decode_currency' => true,
127 'sanitize' => false,
128 ]
129 ),
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 $prevIncome = $this->get_income( $prevStart->format( 'Y-m-d' ), $prevEnd->format( 'Y-m-d' ) );
148 $currentIncome = $this->get_income( $start->format( 'Y-m-d' ), $end->format( 'Y-m-d' ) );
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 ( $prevIncome > 0 && $currentIncome > 0 ) {
155
156 // Check if it is a percent decreate, or increase
157 if ( $prevIncome > $currentIncome ) {
158 // Calculate a percent decrease
159 $trend = ( ( ( $prevIncome - $currentIncome ) / $prevIncome ) * 100 ) * -1;
160 } elseif ( $currentIncome > $prevIncome ) {
161 // Calculate a percent increase
162 $trend = ( ( $currentIncome - $prevIncome ) / $prevIncome ) * 100;
163 }
164 }
165
166 return $trend;
167 }
168
169 public function get_income( $startStr, $endStr ) {
170
171 $paymentObjects = $this->getPayments( $startStr, $endStr );
172
173 $income = 0;
174
175 foreach ( $paymentObjects as $paymentObject ) {
176 if ( $paymentObject->currency === $this->currency ) {
177 if ( $paymentObject->date >= $startStr && $paymentObject->date < $endStr ) {
178 if ( $paymentObject->status === 'publish' || $paymentObject->status === 'give_subscription' ) {
179 $income += $paymentObject->total;
180 }
181 }
182 }
183 }
184
185 return $income;
186 }
187
188 }
189