PluginProbe ʕ •ᴥ•ʔ
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress / 4.17.1
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress v4.17.1
4.17.1 4.17.0 4.16.19 4.16.18 4.16.17 4.16.16 trunk 1.0 1.0.1 1.0.2 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.5a 1.1.6 1.1.7 1.2 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.3 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.4 1.4.1 1.4.2 1.5 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.7 1.7.1 1.7.2 1.8 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.1.9 2.2.10 2.2.11 2.2.12 2.2.13 2.2.14 2.2.15 2.2.16 2.2.2 2.2.5 2.2.6 2.2.7 2.2.8 2.2.9 3.0 3.1 3.1.1 3.1.10 3.1.11 3.1.12 3.1.13 3.1.14 3.1.15 3.1.16 3.1.17 3.1.18 3.1.19 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.2.0 3.2.1 3.2.10 3.2.11 3.2.12 3.2.13 3.2.14 3.2.15 3.2.16 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9 4.0.0 4.0.1 4.0.2 4.0.3 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.10.0 4.10.1 4.10.2 4.10.3 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.13.3 4.13.4 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.15.0 4.15.1 4.15.10 4.15.11 4.15.12 4.15.13 4.15.14 4.15.15 4.15.16 4.15.17 4.15.18 4.15.19 4.15.2 4.15.20 4.15.20.1 4.15.21 4.15.22 4.15.23 4.15.24 4.15.25 4.15.3 4.15.4 4.15.5 4.15.6 4.15.7 4.15.8 4.15.9 4.16.0 4.16.1 4.16.10 4.16.11 4.16.12 4.16.13 4.16.14 4.16.15 4.16.2 4.16.3 4.16.4 4.16.5 4.16.6 4.16.7 4.16.8 4.16.9 4.2.0 4.3.0 4.3.1 4.3.2 4.4.0 4.4.1 4.5.0 4.5.1 4.5.2 4.5.3 4.5.4 4.5.5 4.6.0 4.7.0 4.8.0 4.9.0
wp-user-avatar / src / Admin / SettingsPages / Membership / DashboardPage / AbstractReport.php
wp-user-avatar / src / Admin / SettingsPages / Membership / DashboardPage Last commit date
AbstractReport.php 3 years ago Orders.php 3 years ago PaymentMethods.php 3 years ago Refunds.php 4 years ago ReportFilterData.php 4 years ago ReportInterval.php 4 years ago Revenue.php 4 years ago SettingsPage.php 1 year ago Taxes.php 4 years ago TopPlans.php 4 years ago index.php 4 years ago
AbstractReport.php
206 lines
1 <?php
2
3 namespace ProfilePress\Core\Admin\SettingsPages\Membership\DashboardPage;
4
5 use ProfilePress\Core\Base;
6 use ProfilePress\Core\Membership\Services\Calculator;
7 use ProfilePressVendor\Carbon\Carbon;
8 use ProfilePressVendor\Carbon\CarbonImmutable;
9 use ProfilePressVendor\Carbon\CarbonInterval;
10
11 abstract class AbstractReport
12 {
13 protected $db_table;
14
15 protected $start_date;
16 protected $end_date;
17 protected $plan_id;
18
19 protected $start_date_carbon;
20 protected $end_date_carbon;
21
22 protected $interval;
23
24 /**
25 * @param ReportFilterData $filterData
26 */
27 public function __construct($filterData)
28 {
29 $this->db_table = Base::orders_db_table();
30
31 $this->start_date = $filterData->start_date;
32 $this->end_date = $filterData->end_date;
33 $this->plan_id = $filterData->plan_id;
34
35 $this->start_date_carbon = CarbonImmutable::createFromFormat('Y-m-d', $this->start_date, wp_timezone())->startOfDay();
36 $this->end_date_carbon = CarbonImmutable::createFromFormat('Y-m-d', $this->end_date, wp_timezone())->endOfDay();
37
38 $diff = $this->start_date_carbon->diff($this->end_date_carbon);
39
40 $this->interval = ReportInterval::HOURLY;
41
42 // not using ->d here cos sometimes it can be 0
43 // but days always have a value showing the difference between intervals in days
44 if ($diff->days >= 1) {
45 $this->interval = ReportInterval::DAILY;
46 }
47
48 if ($diff->m >= 2) {
49 $this->interval = ReportInterval::MONTHLY;
50 }
51
52 if ($diff->y >= 3) {
53 $this->interval = ReportInterval::YEARLY;
54 }
55 }
56
57 public function wpdb()
58 {
59 global $wpdb;
60
61 return $wpdb;
62 }
63
64 /**
65 * @param bool $groupBy
66 * @param Carbon $start_date
67 * @param Carbon $end_date
68 *
69 * @return string|void
70 */
71 public function get_where_clause($groupBy = false, $start_date = '', $end_date = '')
72 {
73 $start_date = ! empty($start_date) ? $start_date : $this->start_date_carbon;
74 $end_date = ! empty($end_date) ? $end_date : $this->end_date_carbon;
75
76 $sql = "date_created >= %s AND date_created <= %s";
77
78 $variables = [
79 $start_date->utc()->toDateTimeString(),
80 $end_date->utc()->toDateTimeString()
81 ];
82
83 if ( ! empty($this->plan_id)) {
84 $sql .= " AND plan_id = %d";
85 $variables[] = $this->plan_id;
86 }
87
88 if ($groupBy) {
89 $sql .= " GROUP BY order_time ORDER BY order_time ASC";
90 }
91
92 return $this->wpdb()->prepare($sql, $variables);
93 }
94
95 public function get_date_column()
96 {
97 $timezone_offset = (new \DateTime('now', wp_timezone()))->format('P');
98
99 switch ($this->interval) {
100 case ReportInterval::DAILY:
101 $date_format = "DATE(CONVERT_TZ(date_created,'+00:00','$timezone_offset'))";
102 break;
103 case ReportInterval::MONTHLY:
104 $date_format = "DATE_FORMAT(CONVERT_TZ(date_created,'+00:00','$timezone_offset'), '%Y-%m')";
105 break;
106 case ReportInterval::YEARLY:
107 $date_format = "YEAR(CONVERT_TZ(date_created,'+00:00','$timezone_offset'))";
108 break;
109 default:
110 $date_format = "DATE_FORMAT(CONVERT_TZ(date_created,'+00:00','$timezone_offset'), '%k')";
111 break;
112 }
113
114 return "$date_format AS order_time";
115 }
116
117 public function get_interval_data($bucket, $datetime)
118 {
119 switch ($this->interval) {
120 case $this->interval == ReportInterval::DAILY:
121 $data = wp_list_filter($bucket, ['order_time' => CarbonImmutable::parse($datetime, wp_timezone())->toDateString()]);
122 break;
123 case $this->interval == ReportInterval::MONTHLY:
124 $data = wp_list_filter($bucket, ['order_time' => CarbonImmutable::parse($datetime, wp_timezone())->rawFormat('Y-m')]);
125 break;
126 default:
127 $data = wp_list_filter($bucket, ['order_time' => CarbonImmutable::parse($datetime, wp_timezone())->hour]);
128 }
129
130 return $data;
131 }
132
133 public function get_labels()
134 {
135 static $labels = null;
136
137 if (is_null($labels)) {
138
139 $start_date_carbon = $this->start_date_carbon;
140 $end_date_carbon = $this->end_date_carbon;
141
142 switch ($this->interval) {
143 case ReportInterval::DAILY:
144 $carbonInterval = CarbonInterval::day();
145 $dateFormat = 'M j';
146 break;
147 case ReportInterval::MONTHLY:
148 $carbonInterval = CarbonInterval::month();
149 $dateFormat = 'M Y';
150 break;
151 case ReportInterval::YEARLY:
152 $carbonInterval = CarbonInterval::year();
153 $dateFormat = 'Y';
154 break;
155 default:
156 $carbonInterval = CarbonInterval::hours();
157 $dateFormat = 'g A';
158 break;
159 }
160
161 $labels = [];
162
163 while ($start_date_carbon->lessThan($end_date_carbon)) {
164 $labels[$start_date_carbon->toDateTimeString()] = $start_date_carbon->format($dateFormat);
165 $start_date_carbon = $start_date_carbon->add($carbonInterval);
166 }
167 }
168
169 // ensures labels are sorted from earliest to latest
170 uasort($labels, function ($a, $b) {
171 return (strtotime($a) <=> strtotime($b));
172 });
173
174 return $labels;
175 }
176
177 public function get_trend()
178 {
179 $interval = $this->start_date_carbon->diff($this->end_date_carbon);
180
181 $prevStart = $this->start_date_carbon->sub($interval);
182
183 $prevEnd = $this->start_date_carbon;
184
185 $previous_total = $this->get_total($prevStart, $prevEnd);
186
187 if (Calculator::init($previous_total)->isNegativeOrZero()) return 0;
188
189 return Calculator::init($this->get_total())
190 ->minus($previous_total)
191 ->dividedBy($previous_total)
192 ->multipliedBy('100')
193 ->toScale(1)
194 ->val();
195 }
196
197 public function val()
198 {
199 return [
200 'dataset' => $this->get_data(),
201 'label' => array_values($this->get_labels()),
202 'total' => $this->get_total(),
203 'trend' => $this->get_trend()
204 ];
205 }
206 }