PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.22.2
GiveWP – Donation Plugin and Fundraising Platform v3.22.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 / TotalIncome.php
give / src / API / Endpoints / Reports Last commit date
AverageDonation.php 4 years ago DonationsVsIncome.php 4 years ago Endpoint.php 1 year ago FormPerformance.php 4 years ago Income.php 4 years ago IncomeBreakdown.php 4 years ago PaymentMethods.php 4 years ago PaymentStatuses.php 4 years ago RecentDonations.php 4 years ago TopDonors.php 4 years ago TotalDonors.php 4 years ago TotalIncome.php 4 years ago TotalRefunds.php 4 years ago
TotalIncome.php
195 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
14 protected $payments;
15
16 public function __construct()
17 {
18 $this->endpoint = 'total-income';
19 }
20
21 public function getReport($request)
22 {
23 $start = date_create($request->get_param('start'));
24 $end = date_create($request->get_param('end'));
25 $diff = date_diff($start, $end);
26
27 $data = [];
28
29 switch (true) {
30 case ($diff->days > 12):
31 $interval = round($diff->days / 12);
32 $data = $this->get_data($start, $end, 'P' . $interval . 'D');
33 break;
34 case ($diff->days > 5):
35 $data = $this->get_data($start, $end, 'P1D');
36 break;
37 case ($diff->days > 4):
38 $data = $this->get_data($start, $end, 'PT12H');
39 break;
40 case ($diff->days > 2):
41 $data = $this->get_data($start, $end, 'PT3H');
42 break;
43 case ($diff->days >= 0):
44 $data = $this->get_data($start, $end, 'PT1H');
45 break;
46 }
47
48 return $data;
49 }
50
51 public function get_data($start, $end, $intervalStr)
52 {
53 $tooltips = [];
54 $income = [];
55
56 $interval = new \DateInterval($intervalStr);
57
58 $periodStart = clone $start;
59 $periodEnd = clone $start;
60
61 // Subtract interval to set up period start
62 date_sub($periodStart, $interval);
63
64 while ($periodStart < $end) {
65 $incomeForPeriod = $this->get_income(
66 $periodStart->format('Y-m-d H:i:s'),
67 $periodEnd->format('Y-m-d H:i:s')
68 );
69 $time = $periodEnd->format('Y-m-d H:i:s');
70
71 switch ($intervalStr) {
72 case 'P1D':
73 $time = $periodStart->format('Y-m-d');
74 $periodLabel = $periodStart->format('l');
75 break;
76 case 'PT12H':
77 case 'PT3H':
78 case 'PT1H':
79 $periodLabel = $periodStart->format('D ga') . ' - ' . $periodEnd->format('D ga');
80 break;
81 default:
82 $periodLabel = $periodStart->format('M j, Y') . ' - ' . $periodEnd->format('M j, Y');
83 }
84
85 $income[] = [
86 'x' => $time,
87 'y' => $incomeForPeriod,
88 ];
89
90 $tooltips[] = [
91 'title' => give_currency_filter(
92 give_format_amount($incomeForPeriod),
93 [
94 'currency_code' => $this->currency,
95 'decode_currency' => true,
96 'sanitize' => false,
97 ]
98 ),
99 'body' => __('Total Revenue', 'give'),
100 'footer' => $periodLabel,
101 ];
102
103 // Add interval to set up next period
104 date_add($periodStart, $interval);
105 date_add($periodEnd, $interval);
106 }
107
108 if ($intervalStr === 'P1D') {
109 $income = array_slice($income, 1);
110 $tooltips = array_slice($tooltips, 1);
111 }
112
113 $totalIncomeForPeriod = $this->get_income($start->format('Y-m-d H:i:s'), $end->format('Y-m-d H:i:s'));
114 $trend = $this->get_trend($start, $end, $income);
115
116 $diff = date_diff($start, $end);
117 $info = $diff->days > 1 ? __('VS previous', 'give') . ' ' . $diff->days . ' ' . __('days', 'give') : __(
118 'VS previous day',
119 'give'
120 );
121
122 // Create data object to be returned, with 'highlights' object containing total and average figures to display
123 $data = [
124 'datasets' => [
125 [
126 'data' => $income,
127 'tooltips' => $tooltips,
128 'trend' => $trend,
129 'info' => $info,
130 'highlight' => give_currency_filter(
131 give_format_amount($totalIncomeForPeriod),
132 [
133 'currency_code' => $this->currency,
134 'decode_currency' => true,
135 'sanitize' => false,
136 ]
137 ),
138 ],
139 ],
140 ];
141
142 return $data;
143 }
144
145 public function get_trend($start, $end, $income)
146 {
147 $interval = $start->diff($end);
148
149 $prevStart = clone $start;
150 $prevStart = date_sub($prevStart, $interval);
151
152 $prevEnd = clone $start;
153
154 $prevIncome = $this->get_income($prevStart->format('Y-m-d'), $prevEnd->format('Y-m-d'));
155 $currentIncome = $this->get_income($start->format('Y-m-d'), $end->format('Y-m-d'));
156
157 // Set default trend to 0
158 $trend = 0;
159
160 // Check that prev value and current value are > 0 (can't divide by 0)
161 if ($prevIncome > 0 && $currentIncome > 0) {
162 // Check if it is a percent decrease, or increase
163 if ($prevIncome > $currentIncome) {
164 // Calculate a percent decrease
165 $trend = ((($prevIncome - $currentIncome) / $prevIncome) * 100) * -1;
166 } elseif ($currentIncome > $prevIncome) {
167 // Calculate a percent increase
168 $trend = (($currentIncome - $prevIncome) / $prevIncome) * 100;
169 }
170 }
171
172 return $trend;
173 }
174
175 public function get_income($startStr, $endStr)
176 {
177 $paymentObjects = $this->getPayments($startStr, $endStr);
178
179 $income = 0;
180
181 foreach ($paymentObjects as $paymentObject) {
182 if ($paymentObject->currency === $this->currency) {
183 if ($paymentObject->date >= $startStr && $paymentObject->date < $endStr) {
184 if ($paymentObject->status === 'publish' || $paymentObject->status === 'give_subscription') {
185 $income += $paymentObject->total;
186 }
187 }
188 }
189 }
190
191 return $income;
192 }
193
194 }
195