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 / TotalRefunds.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
TotalRefunds.php
172 lines
1 <?php
2
3 /**
4 * Refunds over time endpoint
5 *
6 * @package Give
7 */
8
9 namespace Give\API\Endpoints\Reports;
10
11 use DateInterval;
12
13 class TotalRefunds extends Endpoint {
14
15 protected $payments;
16
17 public function __construct() {
18 $this->endpoint = 'total-refunds';
19 }
20
21 public function getReport( $request ) {
22 $start = date_create( $request->get_param( 'start' ) );
23 $end = date_create( $request->get_param( 'end' ) );
24 $diff = date_diff( $start, $end );
25
26 $data = [];
27
28 switch ( true ) {
29 case ( $diff->days > 12 ):
30 $interval = round( $diff->days / 12 );
31 $data = $this->get_data( $start, $end, 'P' . $interval . 'D' );
32 break;
33 case ( $diff->days > 5 ):
34 $data = $this->get_data( $start, $end, 'P1D' );
35 break;
36 case ( $diff->days > 4 ):
37 $data = $this->get_data( $start, $end, 'PT12H' );
38 break;
39 case ( $diff->days > 2 ):
40 $data = $this->get_data( $start, $end, 'PT3H' );
41 break;
42 case ( $diff->days >= 0 ):
43 $data = $this->get_data( $start, $end, 'PT1H' );
44 break;
45 }
46
47 return $data;
48 }
49
50 public function get_data( $start, $end, $intervalStr ) {
51
52 $tooltips = [];
53 $refunds = [];
54
55 $interval = new \DateInterval( $intervalStr );
56
57 $periodStart = clone $start;
58 $periodEnd = clone $start;
59
60 // Subtract interval to set up period start
61 date_sub( $periodStart, $interval );
62
63 while ( $periodStart < $end ) {
64
65 $refundsForPeriod = $this->get_refunds( $periodStart->format( 'Y-m-d H:i:s' ), $periodEnd->format( 'Y-m-d H:i:s' ) );
66 $time = $periodEnd->format( 'Y-m-d H:i:s' );
67
68 switch ( $intervalStr ) {
69 case 'P1D':
70 $time = $periodStart->format( 'Y-m-d' );
71 $periodLabel = $periodStart->format( 'l' );
72 break;
73 case 'PT12H':
74 case 'PT3H':
75 case 'PT1H':
76 $periodLabel = $periodStart->format( 'D ga' ) . ' - ' . $periodEnd->format( 'D ga' );
77 break;
78 default:
79 $periodLabel = $periodStart->format( 'M j, Y' ) . ' - ' . $periodEnd->format( 'M j, Y' );
80 }
81
82 $refunds[] = [
83 'x' => $time,
84 'y' => $refundsForPeriod,
85 ];
86
87 $tooltips[] = [
88 'title' => sprintf( _n( '%d Donor', '%d Donors', $refundsForPeriod, 'give' ), $refundsForPeriod ),
89 'body' => __( 'Total Refunds', '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 if ( $intervalStr === 'P1D' ) {
99 $refunds = array_slice( $refunds, 1 );
100 $tooltips = array_slice( $tooltips, 1 );
101 }
102
103 $totalRefundsForPeriod = $this->get_refunds( $start->format( 'Y-m-d H:i:s' ), $end->format( 'Y-m-d H:i:s' ) );
104 $trend = $this->get_trend( $start, $end, $refunds );
105
106 $diff = date_diff( $start, $end );
107 $info = $diff->days > 1 ? __( 'VS previous', 'give' ) . ' ' . $diff->days . ' ' . __( 'days', 'give' ) : __( 'VS previous day', 'give' );
108
109 // Create data objec to be returned, with 'highlights' object containing total and average figures to display
110 $data = [
111 'datasets' => [
112 [
113 'data' => $refunds,
114 'tooltips' => $tooltips,
115 'trend' => $trend,
116 'info' => $info,
117 'highlight' => $totalRefundsForPeriod,
118 ],
119 ],
120 ];
121
122 return $data;
123
124 }
125
126 public function get_trend( $start, $end, $refunds ) {
127
128 $interval = $start->diff( $end );
129
130 $prevStart = clone $start;
131 $prevStart = date_sub( $prevStart, $interval );
132
133 $prevEnd = clone $start;
134
135 $prevRefunds = $this->get_refunds( $prevStart->format( 'Y-m-d H:i:s' ), $prevEnd->format( 'Y-m-d H:i:s' ) );
136 $currentRefunds = $this->get_refunds( $start->format( 'Y-m-d H:i:s' ), $end->format( 'Y-m-d H:i:s' ) );
137
138 // Set default trend to 0
139 $trend = 0;
140
141 // Check that prev value and current value are > 0 (can't divide by 0)
142 if ( $prevRefunds > 0 && $currentRefunds > 0 ) {
143
144 // Check if it is a percent decreate, or increase
145 if ( $prevRefunds > $currentRefunds ) {
146 // Calculate a percent decrease
147 $trend = ( ( ( $prevRefunds - $currentRefunds ) / $prevRefunds ) * 100 ) * -1;
148 } elseif ( $currentRefunds > $prevRefunds ) {
149 // Calculate a percent increase
150 $trend = ( ( $currentRefunds - $prevRefunds ) / $prevRefunds ) * 100;
151 }
152 }
153
154 return $trend;
155 }
156
157 public function get_refunds( $startStr, $endStr ) {
158
159 $paymentObjects = $this->getPayments( $startStr, $endStr );
160
161 $refunds = 0;
162 foreach ( $paymentObjects as $paymentObject ) {
163 if ( $paymentObject->status == 'refunded' && $paymentObject->date >= $startStr && $paymentObject->date < $endStr ) {
164 $refunds += 1;
165 }
166 }
167
168 return $refunds;
169 }
170
171 }
172