PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.7.1
GiveWP – Donation Plugin and Fundraising Platform v2.7.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 / TotalIncome.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
TotalIncome.php
181 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 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 $income = [];
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 $incomeForPeriod = $this->get_income( $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 $income[] = [
77 'x' => $periodEnd->format( 'Y-m-d H:i:s' ),
78 'y' => $incomeForPeriod,
79 ];
80
81 $tooltips[] = [
82 'title' => give_currency_filter(
83 give_format_amount( $incomeForPeriod ),
84 [
85 'currency_code' => $this->currency,
86 'decode_currency' => true,
87 ]
88 ),
89 'body' => __( 'Total Income', 'give' ),
90 'footer' => $periodLabel,
91 ];
92
93 // Add interval to set up next period
94 date_add( $periodStart, $interval );
95 date_add( $periodEnd, $interval );
96 }
97
98 $totalIncomeForPeriod = $this->get_earnings( $start->format( 'Y-m-d' ), $end->format( 'Y-m-d' ) );
99 $trend = $this->get_trend( $start, $end, $income );
100
101 $diff = date_diff( $start, $end );
102 $info = $diff->days > 1 ? __( 'VS previous', 'give' ) . ' ' . $diff->days . ' ' . __( 'days', 'give' ) : __( 'VS previous day', 'give' );
103
104 // Create data objec to be returned, with 'highlights' object containing total and average figures to display
105 $data = [
106 'datasets' => [
107 [
108 'data' => $income,
109 'tooltips' => $tooltips,
110 'trend' => $trend,
111 'info' => $info,
112 'highlight' => give_currency_filter(
113 give_format_amount( $totalIncomeForPeriod ),
114 [
115 'currency_code' => $this->currency,
116 'decode_currency' => true,
117 ]
118 ),
119 ],
120 ],
121 ];
122
123 return $data;
124
125 }
126
127 public function get_trend( $start, $end, $income ) {
128
129 $interval = $start->diff( $end );
130
131 $prevStart = clone $start;
132 $prevStart = date_sub( $prevStart, $interval );
133
134 $prevEnd = clone $start;
135
136 $prevIncome = $this->get_earnings( $prevStart->format( 'Y-m-d' ), $prevEnd->format( 'Y-m-d' ) );
137 $currentIncome = $this->get_earnings( $start->format( 'Y-m-d' ), $end->format( 'Y-m-d' ) );
138
139 // Set default trend to 0
140 $trend = 0;
141
142 // Check that prev value and current value are > 0 (can't divide by 0)
143 if ( $prevIncome > 0 && $currentIncome > 0 ) {
144
145 // Check if it is a percent decreate, or increase
146 if ( $prevIncome > $currentIncome ) {
147 // Calculate a percent decrease
148 $trend = ( ( ( $prevIncome - $currentIncome ) / $prevIncome ) * 100 ) * -1;
149 } elseif ( $currentIncome > $prevIncome ) {
150 // Calculate a percent increase
151 $trend = ( ( $currentIncome - $prevIncome ) / $prevIncome ) * 100;
152 }
153 }
154
155 return $trend;
156 }
157
158 public function get_income( $startStr, $endStr ) {
159
160 $paymentObjects = $this->get_payments( $startStr, $endStr );
161
162 $income = 0;
163
164 foreach ( $paymentObjects as $paymentObject ) {
165 if ( $paymentObject->currency === $this->currency ) {
166 if ( $paymentObject->date > $startStr && $paymentObject->date < $endStr ) {
167 if ( $paymentObject->status === 'publish' || $paymentObject->status === 'give_subscription' ) {
168 $income += $paymentObject->total;
169 }
170 }
171 }
172 }
173
174 return $income;
175 }
176
177 public function get_earnings( $startStr, $endStr ) {
178 return $this->get_income( $startStr, $endStr );
179 }
180 }
181