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 / 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
163 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 $tooltips = [];
50 $refunds = [];
51
52 $interval = new DateInterval( $intervalStr );
53
54 $periodStart = clone $start;
55 $periodEnd = clone $start;
56
57 // Subtract interval to set up period start
58 date_sub( $periodStart, $interval );
59
60 while ( $periodStart < $end ) {
61
62 $refundsForPeriod = $this->get_refunds( $periodStart->format( 'Y-m-d H:i:s' ), $periodEnd->format( 'Y-m-d H:i:s' ) );
63
64 switch ( $intervalStr ) {
65 case 'PT12H':
66 $periodLabel = $periodStart->format( 'D ga' ) . ' - ' . $periodEnd->format( 'D ga' );
67 break;
68 case 'PT3H':
69 $periodLabel = $periodStart->format( 'D ga' ) . ' - ' . $periodEnd->format( 'D ga' );
70 break;
71 case 'PT1H':
72 $periodLabel = $periodStart->format( 'D ga' ) . ' - ' . $periodEnd->format( 'D ga' );
73 break;
74 default:
75 $periodLabel = $periodStart->format( 'M j, Y' ) . ' - ' . $periodEnd->format( 'M j, Y' );
76 }
77
78 $refunds[] = [
79 'x' => $periodEnd->format( 'Y-m-d H:i:s' ),
80 'y' => $refundsForPeriod,
81 ];
82
83 $tooltips[] = [
84 'title' => $refundsForPeriod . ' ' . __( 'Refunds', 'give' ),
85 'body' => __( 'Total Refunds', 'give' ),
86 'footer' => $periodLabel,
87 ];
88
89 // Add interval to set up next period
90 date_add( $periodStart, $interval );
91 date_add( $periodEnd, $interval );
92 }
93
94 $totalRefundsForPeriod = $this->get_refunds( $start->format( 'Y-m-d H:i:s' ), $end->format( 'Y-m-d H:i:s' ) );
95 $trend = $this->get_trend( $start, $end, $refunds );
96
97 $diff = date_diff( $start, $end );
98 $info = $diff->days > 1 ? __( 'VS previous' ) . ' ' . $diff->days . ' ' . __( 'days', 'give' ) : __( 'VS previous day' );
99
100 // Create data objec to be returned, with 'highlights' object containing total and average figures to display
101 $data = [
102 'datasets' => [
103 [
104 'data' => $refunds,
105 'tooltips' => $tooltips,
106 'trend' => $trend,
107 'info' => $info,
108 'highlight' => $totalRefundsForPeriod,
109 ],
110 ],
111 ];
112
113 return $data;
114
115 }
116
117 public function get_trend( $start, $end, $income ) {
118
119 $interval = $start->diff( $end );
120
121 $prevStart = clone $start;
122 $prevStart = date_sub( $prevStart, $interval );
123
124 $prevEnd = clone $start;
125
126 $prevRefunds = $this->get_refunds( $prevStart->format( 'Y-m-d H:i:s' ), $prevEnd->format( 'Y-m-d H:i:s' ) );
127 $currentRefunds = $this->get_refunds( $start->format( 'Y-m-d H:i:s' ), $end->format( 'Y-m-d H:i:s' ) );
128
129 // Set default trend to 0
130 $trend = 0;
131
132 // Check that prev value and current value are > 0 (can't divide by 0)
133 if ( $prevRefunds > 0 && $currentRefunds > 0 ) {
134
135 // Check if it is a percent decreate, or increase
136 if ( $prevRefunds > $currentRefunds ) {
137 // Calculate a percent decrease
138 $trend = ( ( ( $prevRefunds - $currentRefunds ) / $prevRefunds ) * 100 ) * -1;
139 } elseif ( $currentRefunds > $prevRefunds ) {
140 // Calculate a percent increase
141 $trend = ( ( $currentRefunds - $prevRefunds ) / $prevRefunds ) * 100;
142 }
143 }
144
145 return $trend;
146 }
147
148 public function get_refunds( $startStr, $endStr ) {
149
150 $paymentObjects = $this->get_payments( $startStr, $endStr );
151
152 $refunds = 0;
153 foreach ( $paymentObjects as $paymentObject ) {
154 if ( $paymentObject->status == 'refunded' && $paymentObject->date > $startStr && $paymentObject->date < $endStr ) {
155 $refunds += 1;
156 }
157 }
158
159 return $refunds;
160 }
161
162 }
163