Passed
Pull Request — master (#444)
by Brian
10:32
created

GetPaid_Reports_Abstract_Report::get_periods()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 10
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 14
rs 9.9332
1
<?php
2
/**
3
 * Contains the abstract report class.
4
 *
5
 *
6
 */
7
8
defined( 'ABSPATH' ) || exit;
9
10
/**
11
 * GetPaid_Reports_Abstract_Report Class.
12
 */
13
abstract class GetPaid_Reports_Abstract_Report {
14
15
	/**
16
	 * @var array
17
	 */
18
	public $stats;
19
20
	/**
21
	 * Class constructor.
22
	 *
23
	 */
24
	public function __construct() {
25
		$this->prepare_stats();
26
	}
27
28
	/**
29
	 * Retrieves the current range.
30
	 *
31
	 */
32
	public function get_range() {
33
		$valid_ranges = $this->get_periods();
34
35
		if ( isset( $_GET['date_range'] ) && array_key_exists( $_GET['date_range'], $valid_ranges ) ) {
36
			return sanitize_key( $_GET['date_range'] );
37
		}
38
39
		return '7_days';
40
	}
41
42
	/**
43
	 * Returns an array of date ranges.
44
	 *
45
	 * @return array
46
	 */
47
	public function get_periods() {
48
49
		$periods = array(
50
            'today'     => __( 'Today', 'invoicing' ),
51
            'yesterday' => __( 'Yesterday', 'invoicing' ),
52
            '7_days'    => __( 'Last 7 days', 'invoicing' ),
53
			'30_days'   => __( 'Last 30 days', 'invoicing' ),
54
			'60_days'   => __( 'Last 60 days', 'invoicing' ),
55
			'90_days'   => __( 'Last 90 days', 'invoicing' ),
56
			'180_days'  => __( 'Last 180 days', 'invoicing' ),
57
			'360_days'  => __( 'Last 360 days', 'invoicing' ),
58
		);
59
60
		return apply_filters( 'getpaid_earning_periods', $periods );
61
	}
62
63
	/**
64
	 * Retrieves the current range's sql.
65
	 *
66
	 */
67
	public function get_range_sql( $range ) {
68
69
		$date     = 'CAST(meta.completed_date AS DATE)';
70
        $datetime = 'meta.completed_date';
71
72
        // Prepare durations.
73
        $today                = current_time( 'Y-m-d' );
74
		$yesterday            = date( 'Y-m-d', strtotime( '-1 day', current_time( 'timestamp' ) ) );
75
		$seven_days_ago       = date( 'Y-m-d', strtotime( '-7 days', current_time( 'timestamp' ) ) );
76
		$thirty_days_ago      = date( 'Y-m-d', strtotime( '-30 days', current_time( 'timestamp' ) ) );
77
		$ninety_days_ago      = date( 'Y-m-d', strtotime( '-90 days', current_time( 'timestamp' ) ) );
78
		$sixty_days_ago       = date( 'Y-m-d', strtotime( '-60 days', current_time( 'timestamp' ) ) );
79
		$one_eighty_days_ago  = date( 'Y-m-d', strtotime( '-180 days', current_time( 'timestamp' ) ) );
80
		$three_sixty_days_ago = date( 'Y-m-d', strtotime( '-360 days', current_time( 'timestamp' ) ) );
81
82
        $ranges = array(
83
84
            'today'        => array(
85
                "DATE_FORMAT($datetime, '%l%p')",
86
                "$date='$today'"
87
            ),
88
89
            'yesterday'    => array(
90
                "DATE_FORMAT($datetime, '%l%p')",
91
                "$date='$yesterday'"
92
            ),
93
94
            '7_days'       => array(
95
                "DATE($datetime)",
96
                "$date BETWEEN '$seven_days_ago' AND '$today'"
97
			),
98
99
			'30_days'       => array(
100
                "DATE($datetime)",
101
                "$date BETWEEN '$thirty_days_ago' AND '$today'"
102
			),
103
104
			'60_days'       => array(
105
                "DATE($datetime)",
106
                "$date BETWEEN '$sixty_days_ago' AND '$today'"
107
			),
108
109
			'90_days'       => array(
110
                "WEEK($datetime)",
111
                "$date BETWEEN '$ninety_days_ago' AND '$today'"
112
			),
113
114
			'180_days'       => array(
115
                "WEEK($datetime)",
116
                "$date BETWEEN '$one_eighty_days_ago' AND '$today'"
117
			),
118
119
			'360_days'       => array(
120
                "WEEK($datetime)",
121
                "$date BETWEEN '$three_sixty_days_ago' AND '$today'"
122
            ),
123
124
        );
125
126
		$sql = isset( $ranges[ $range ] ) ? $ranges[ $range ] : $ranges[ '7_days' ];
127
		return apply_filters( 'getpaid_earning_graphs_get_range_sql', $sql, $range );
128
129
	}
130
131
	/**
132
	 * Retrieves the hours in a day
133
	 *
134
	 */
135
	public function get_hours_in_a_day() {
136
137
		return array(
138
			'12AM' => __( '12 AM', 'invoicing'),
139
			'1AM'  => __( '1 AM', 'invoicing'),
140
			'2AM'  => __( '2 AM', 'invoicing'),
141
			'3AM'  => __( '3 AM', 'invoicing'),
142
			'4AM'  => __( '4 AM', 'invoicing'),
143
			'5AM'  => __( '5 AM', 'invoicing'),
144
			'6AM'  => __( '6 AM', 'invoicing'),
145
			'7AM'  => __( '7 AM', 'invoicing'),
146
			'8AM'  => __( '8 AM', 'invoicing'),
147
			'9AM'  => __( '9 AM', 'invoicing'),
148
			'10AM' => __( '10 AM', 'invoicing'),
149
			'11AM' => __( '11 AM', 'invoicing'),
150
			'12pm' => __( '12 PM', 'invoicing'),
151
			'1PM'  => __( '1 PM', 'invoicing'),
152
			'2PM'  => __( '2 PM', 'invoicing'),
153
			'3PM'  => __( '3 PM', 'invoicing'),
154
			'4PM'  => __( '4 PM', 'invoicing'),
155
			'5PM'  => __( '5 PM', 'invoicing'),
156
			'6PM'  => __( '6 PM', 'invoicing'),
157
			'7PM'  => __( '7 PM', 'invoicing'),
158
			'8PM'  => __( '8 PM', 'invoicing'),
159
			'9PM'  => __( '9 PM', 'invoicing'),
160
			'10PM' => __( '10 PM', 'invoicing'),
161
			'11PM' => __( '11 PM', 'invoicing'),
162
		);
163
164
	}
165
166
	/**
167
	 * Retrieves the days in a period
168
	 *
169
	 */
170
	public function get_days_in_period( $days ) {
171
172
		$return = array();
173
		$format = 'Y-m-d';
174
175
		if ( $days < 8 ) {
176
			$format = 'D';
177
		}
178
179
		if ( $days < 32 ) {
180
			$format = 'M j';
181
		}
182
183
		while ( $days > 0 ) {
184
185
			$key            = date( 'Y-m-d', strtotime( "-$days days", current_time( 'timestamp' ) ) );
186
			$label          = date_i18n( $format, strtotime( "-$days days", current_time( 'timestamp' ) ) );
187
			$return[ $key ] = $label;
188
			$days--;
189
190
		}
191
192
		return $return;
193
	}
194
195
	/**
196
	 * Retrieves the weeks in a period
197
	 *
198
	 */
199
	public function get_weeks_in_period( $days ) {
200
201
		$return = array();
202
203
		while ( $days > 0 ) {
204
205
			$key            = date( 'W', strtotime( "-$days days", current_time( 'timestamp' ) ) );
206
			$label          = date_i18n( 'Y-m-d', strtotime( "-$days days", current_time( 'timestamp' ) ) );
207
			$return[ $key ] = $label;
208
			$days--;
209
210
		}
211
212
		return $return;
213
	}
214
215
	/**
216
	 * Displays the report card.
217
	 *
218
	 */
219
	public function display() {
220
		?>
221
222
			<div class="row">
223
				<div class="col-12">
224
					<div class="card" style="max-width:100%">
225
						<div class="card-body">
226
							<?php $this->display_stats(); ?>
227
						</div>
228
					</div>
229
				</div>
230
			</div>
231
232
		<?php
233
234
	}
235
236
	/**
237
	 * Prepares the report stats.
238
	 *
239
	 * Extend this in child classes.
240
	 */
241
	abstract public function prepare_stats();
242
243
	/**
244
	 * Displays the actual report.
245
	 *
246
	 * Extend this in child classes.
247
	 */
248
	abstract public function display_stats();
249
250
}
251