PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.6.1
GiveWP – Donation Plugin and Fundraising Platform v2.6.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 / TotalRefunds.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
TotalRefunds.php
186 lines
1 <?php
2
3 /**
4 * Income 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 get_report( $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 > 7 ):
34 $data = $this->get_data( $start, $end, 'PT12H' );
35 break;
36 case ( $diff->days > 2 ):
37 $data = $this->get_data( $start, $end, 'PT3H' );
38 break;
39 case ( $diff->days >= 0 ):
40 $data = $this->get_data( $start, $end, 'PT1H' );
41 break;
42 }
43
44 return $data;
45 }
46
47 public function get_data( $start, $end, $intervalStr ) {
48
49 $this->payments = $this->get_payments( $start->format( 'Y-m-d' ), $end->format( 'Y-m-d' ) );
50
51 $tooltips = array();
52 $refunds = array();
53
54 $interval = new DateInterval( $intervalStr );
55
56 $periodStart = clone $start;
57 $periodEnd = clone $start;
58
59 // Subtract interval to set up period start
60 date_sub( $periodStart, $interval );
61
62 while ( $periodStart < $end ) {
63
64 $refundsForPeriod = $this->get_refunds( $periodStart->format( 'Y-m-d H:i:s' ), $periodEnd->format( 'Y-m-d H:i:s' ) );
65
66 switch ( $intervalStr ) {
67 case 'PT12H':
68 $periodLabel = $periodStart->format( 'D ga' ) . ' - ' . $periodEnd->format( 'D ga' );
69 break;
70 case 'PT3H':
71 $periodLabel = $periodStart->format( 'D ga' ) . ' - ' . $periodEnd->format( 'D ga' );
72 break;
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 $refunds[] = array(
81 'x' => $periodEnd->format( 'Y-m-d H:i:s' ),
82 'y' => $refundsForPeriod,
83 );
84
85 $tooltips[] = array(
86 'title' => $refundsForPeriod . ' ' . __( 'Refunds', 'give' ),
87 'body' => __( 'Total Refunds', 'give' ),
88 'footer' => $periodLabel,
89 );
90
91 // Add interval to set up next period
92 date_add( $periodStart, $interval );
93 date_add( $periodEnd, $interval );
94 }
95
96 $totalRefundsForPeriod = $this->get_refunds( $start->format( 'Y-m-d H:i:s' ), $end->format( 'Y-m-d H:i:s' ) );
97 $trend = $this->get_trend( $start, $end, $refunds );
98
99 $diff = date_diff( $start, $end );
100 $info = $diff->days > 1 ? __( 'VS previous' ) . ' ' . $diff->days . ' ' . __( 'days', 'give' ) : __( 'VS previous day' );
101
102 // Create data objec to be returned, with 'highlights' object containing total and average figures to display
103 $data = array(
104 'datasets' => array(
105 array(
106 'data' => $refunds,
107 'tooltips' => $tooltips,
108 'trend' => $trend,
109 'info' => $info,
110 'highlight' => $totalRefundsForPeriod,
111 ),
112 ),
113 );
114
115 return $data;
116
117 }
118
119 public function get_trend( $start, $end, $income ) {
120
121 $interval = $start->diff( $end );
122
123 $prevStart = clone $start;
124 $prevStart = date_sub( $prevStart, $interval );
125
126 $prevEnd = clone $start;
127
128 $prevRefunds = $this->get_prev_refunds( $prevStart->format( 'Y-m-d H:i:s' ), $prevEnd->format( 'Y-m-d H:i:s' ) );
129 $currentRefunds = $this->get_refunds( $start->format( 'Y-m-d H:i:s' ), $end->format( 'Y-m-d H:i:s' ) );
130
131 // Set default trend to 0
132 $trend = 0;
133
134 // Check that prev value and current value are > 0 (can't divide by 0)
135 if ( $prevRefunds > 0 && $currentRefunds > 0 ) {
136
137 // Check if it is a percent decreate, or increase
138 if ( $prevRefunds > $currentRefunds ) {
139 // Calculate a percent decrease
140 $trend = round( ( ( ( $prevRefunds - $currentRefunds ) / $prevRefunds ) * 100 ), 1 ) * -1;
141 } elseif ( $currentRefunds > $prevRefunds ) {
142 // Calculate a percent increase
143 $trend = round( ( ( ( $currentRefunds - $prevRefunds ) / $prevRefunds ) * 100 ), 1 );
144 }
145 }
146
147 return $trend;
148 }
149
150 public function get_refunds( $startStr, $endStr ) {
151
152 $refunds = 0;
153 foreach ( $this->payments as $payment ) {
154 if ( $payment->status == 'refunded' && $payment->date > $startStr && $payment->date < $endStr ) {
155 $refunds += 1;
156 }
157 }
158
159 return $refunds;
160 }
161
162 public function get_prev_refunds( $startStr, $endStr ) {
163
164 $args = array(
165 'number' => -1,
166 'paged' => 1,
167 'orderby' => 'date',
168 'order' => 'DESC',
169 'start_date' => $startStr,
170 'end_date' => $endStr,
171 );
172
173 $prevPayments = new \Give_Payments_Query( $args );
174 $prevPayments = $prevPayments->get_payments();
175
176 $refunds = 0;
177 foreach ( $prevPayments as $payment ) {
178 if ( $payment->status == 'refunded' && $payment->date > $startStr && $payment->date < $endStr ) {
179 $refunds += 1;
180 }
181 }
182
183 return $refunds;
184 }
185 }
186