PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.12.3
GiveWP – Donation Plugin and Fundraising Platform v3.12.3
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 / TotalRefunds.php
give / src / API / Endpoints / Reports Last commit date
AverageDonation.php 4 years ago DonationsVsIncome.php 4 years ago Endpoint.php 4 years 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
TotalRefunds.php
176 lines
1 <?php
2
3 /**
4 * Refunds over time endpoint
5 *
6 * @package Give
7 */
8
9 namespace Give\API\Endpoints\Reports;
10
11 class TotalRefunds extends Endpoint
12 {
13
14 protected $payments;
15
16 public function __construct()
17 {
18 $this->endpoint = 'total-refunds';
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 $refunds = [];
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 $refundsForPeriod = $this->get_refunds(
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 $refunds[] = [
86 'x' => $time,
87 'y' => $refundsForPeriod,
88 ];
89
90 $tooltips[] = [
91 'title' => sprintf(_n('%d Donor', '%d Donors', $refundsForPeriod, 'give'), $refundsForPeriod),
92 'body' => __('Total Refunds', 'give'),
93 'footer' => $periodLabel,
94 ];
95
96 // Add interval to set up next period
97 date_add($periodStart, $interval);
98 date_add($periodEnd, $interval);
99 }
100
101 if ($intervalStr === 'P1D') {
102 $refunds = array_slice($refunds, 1);
103 $tooltips = array_slice($tooltips, 1);
104 }
105
106 $totalRefundsForPeriod = $this->get_refunds($start->format('Y-m-d H:i:s'), $end->format('Y-m-d H:i:s'));
107 $trend = $this->get_trend($start, $end, $refunds);
108
109 $diff = date_diff($start, $end);
110 $info = $diff->days > 1 ? __('VS previous', 'give') . ' ' . $diff->days . ' ' . __('days', 'give') : __(
111 'VS previous day',
112 'give'
113 );
114
115 // Create data object to be returned, with 'highlights' object containing total and average figures to display
116 $data = [
117 'datasets' => [
118 [
119 'data' => $refunds,
120 'tooltips' => $tooltips,
121 'trend' => $trend,
122 'info' => $info,
123 'highlight' => $totalRefundsForPeriod,
124 ],
125 ],
126 ];
127
128 return $data;
129 }
130
131 public function get_trend($start, $end, $refunds)
132 {
133 $interval = $start->diff($end);
134
135 $prevStart = clone $start;
136 $prevStart = date_sub($prevStart, $interval);
137
138 $prevEnd = clone $start;
139
140 $prevRefunds = $this->get_refunds($prevStart->format('Y-m-d H:i:s'), $prevEnd->format('Y-m-d H:i:s'));
141 $currentRefunds = $this->get_refunds($start->format('Y-m-d H:i:s'), $end->format('Y-m-d H:i:s'));
142
143 // Set default trend to 0
144 $trend = 0;
145
146 // Check that prev value and current value are > 0 (can't divide by 0)
147 if ($prevRefunds > 0 && $currentRefunds > 0) {
148 // Check if it is a percent decrease, or increase
149 if ($prevRefunds > $currentRefunds) {
150 // Calculate a percent decrease
151 $trend = ((($prevRefunds - $currentRefunds) / $prevRefunds) * 100) * -1;
152 } elseif ($currentRefunds > $prevRefunds) {
153 // Calculate a percent increase
154 $trend = (($currentRefunds - $prevRefunds) / $prevRefunds) * 100;
155 }
156 }
157
158 return $trend;
159 }
160
161 public function get_refunds($startStr, $endStr)
162 {
163 $paymentObjects = $this->getPayments($startStr, $endStr);
164
165 $refunds = 0;
166 foreach ($paymentObjects as $paymentObject) {
167 if ($paymentObject->status == 'refunded' && $paymentObject->date >= $startStr && $paymentObject->date < $endStr) {
168 $refunds += 1;
169 }
170 }
171
172 return $refunds;
173 }
174
175 }
176